@pierre/diffs 1.4.1 → 1.4.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/CodeView.d.ts +4 -4
- package/dist/components/CodeView.d.ts.map +1 -1
- package/dist/components/CodeView.js +8 -6
- package/dist/components/CodeView.js.map +1 -1
- package/dist/components/File.d.ts +4 -15
- package/dist/components/File.d.ts.map +1 -1
- package/dist/components/File.js +4 -0
- package/dist/components/File.js.map +1 -1
- package/dist/components/FileDiff.d.ts +10 -37
- package/dist/components/FileDiff.d.ts.map +1 -1
- package/dist/components/FileDiff.js +19 -12
- package/dist/components/FileDiff.js.map +1 -1
- package/dist/components/FileStream.d.ts +1 -0
- package/dist/components/FileStream.d.ts.map +1 -1
- package/dist/components/UnresolvedFile.d.ts +1 -1
- package/dist/components/UnresolvedFile.d.ts.map +1 -1
- package/dist/components/UnresolvedFile.js +2 -1
- package/dist/components/UnresolvedFile.js.map +1 -1
- package/dist/components/VirtualizedFile.d.ts +2 -8
- package/dist/components/VirtualizedFile.d.ts.map +1 -1
- package/dist/components/VirtualizedFile.js +19 -18
- package/dist/components/VirtualizedFile.js.map +1 -1
- package/dist/components/VirtualizedFileDiff.d.ts +2 -8
- package/dist/components/VirtualizedFileDiff.d.ts.map +1 -1
- package/dist/components/VirtualizedFileDiff.js +19 -15
- package/dist/components/VirtualizedFileDiff.js.map +1 -1
- package/dist/components/Virtualizer.d.ts +1 -5
- package/dist/components/Virtualizer.d.ts.map +1 -1
- package/dist/components/Virtualizer.js.map +1 -1
- package/dist/components/VirtulizerDevelopment.d.ts +0 -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 -1
- package/dist/components/web-components.js.map +1 -1
- package/dist/constants.d.ts +0 -1
- package/dist/constants.d.ts.map +1 -1
- package/dist/editor/EditStateManager.d.ts +0 -1
- package/dist/editor/EditStateManager.d.ts.map +1 -1
- package/dist/editor/EditStateManager.js.map +1 -1
- package/dist/editor/cloneRetainedDiffSessionSnapshot.d.ts +0 -1
- package/dist/editor/cloneRetainedDiffSessionSnapshot.d.ts.map +1 -1
- package/dist/editor/command.d.ts +2 -1
- package/dist/editor/command.d.ts.map +1 -1
- package/dist/editor/editPrediction.d.ts +3 -2
- package/dist/editor/editPrediction.d.ts.map +1 -1
- package/dist/editor/editPrediction.js +11 -11
- package/dist/editor/editPrediction.js.map +1 -1
- package/dist/editor/editStack.d.ts +0 -1
- package/dist/editor/editStack.d.ts.map +1 -1
- package/dist/editor/editStack.js.map +1 -1
- package/dist/editor/editor.d.ts +1 -5
- package/dist/editor/editor.d.ts.map +1 -1
- package/dist/editor/editor.js +23 -20
- package/dist/editor/editor.js.map +1 -1
- package/dist/editor/editor2.js.map +1 -1
- package/dist/editor/languages.d.ts +0 -1
- package/dist/editor/languages.d.ts.map +1 -1
- package/dist/editor/languages.js +1 -1
- package/dist/editor/languages.js.map +1 -1
- package/dist/editor/lineAnnotations.d.ts +0 -1
- package/dist/editor/lineAnnotations.d.ts.map +1 -1
- package/dist/editor/lineAnnotations.js +2 -1
- package/dist/editor/lineAnnotations.js.map +1 -1
- package/dist/editor/marker.d.ts +0 -1
- package/dist/editor/marker.d.ts.map +1 -1
- package/dist/editor/marker.js +5 -3
- package/dist/editor/marker.js.map +1 -1
- package/dist/editor/matchBrackets.d.ts +0 -1
- package/dist/editor/matchBrackets.d.ts.map +1 -1
- package/dist/editor/pieceTable.d.ts +0 -1
- package/dist/editor/pieceTable.d.ts.map +1 -1
- package/dist/editor/pieceTable.js.map +1 -1
- package/dist/editor/platform.d.ts +1 -5
- package/dist/editor/platform.d.ts.map +1 -1
- package/dist/editor/platform.js.map +1 -1
- package/dist/editor/popover.d.ts +12 -12
- package/dist/editor/popover.d.ts.map +1 -1
- package/dist/editor/popover.js.map +1 -1
- package/dist/editor/searchPanel.d.ts +0 -1
- package/dist/editor/searchPanel.d.ts.map +1 -1
- package/dist/editor/searchPanel.js +16 -12
- package/dist/editor/searchPanel.js.map +1 -1
- package/dist/editor/selection.d.ts +0 -1
- package/dist/editor/selection.d.ts.map +1 -1
- package/dist/editor/selection.js.map +1 -1
- package/dist/editor/selectionAction.d.ts +0 -1
- package/dist/editor/selectionAction.d.ts.map +1 -1
- package/dist/editor/selectionAction.js.map +1 -1
- package/dist/editor/sprite.d.ts.map +1 -1
- package/dist/editor/textDocument.d.ts +0 -1
- package/dist/editor/textDocument.d.ts.map +1 -1
- package/dist/editor/textDocument.js.map +1 -1
- package/dist/editor/textDocumentChangeTransaction.d.ts +0 -1
- package/dist/editor/textDocumentChangeTransaction.d.ts.map +1 -1
- package/dist/editor/textMeasure.d.ts.map +1 -1
- package/dist/editor/textMeasure.js +27 -3
- package/dist/editor/textMeasure.js.map +1 -1
- package/dist/editor/tokenizer.d.ts +1 -11
- package/dist/editor/tokenizer.d.ts.map +1 -1
- package/dist/editor/tokenizer.js +8 -4
- package/dist/editor/tokenizer.js.map +1 -1
- package/dist/editor/types.d.ts +0 -1
- package/dist/editor/types.d.ts.map +1 -1
- package/dist/editor/utils.d.ts.map +1 -1
- package/dist/editor/utils.js +11 -7
- package/dist/editor/utils.js.map +1 -1
- package/dist/highlighter/languages/areLanguagesAttached.d.ts +0 -1
- package/dist/highlighter/languages/areLanguagesAttached.d.ts.map +1 -1
- package/dist/highlighter/languages/attachResolvedLanguages.d.ts +1 -0
- package/dist/highlighter/languages/attachResolvedLanguages.d.ts.map +1 -1
- package/dist/highlighter/languages/attachResolvedLanguages.js +8 -1
- package/dist/highlighter/languages/attachResolvedLanguages.js.map +1 -1
- package/dist/highlighter/languages/cleanUpResolvedLanguages.d.ts.map +1 -1
- package/dist/highlighter/languages/constants.d.ts +1 -1
- package/dist/highlighter/languages/constants.d.ts.map +1 -1
- package/dist/highlighter/languages/getResolvedLanguages.d.ts +1 -0
- package/dist/highlighter/languages/getResolvedLanguages.d.ts.map +1 -1
- package/dist/highlighter/languages/getResolvedOrResolveLanguage.d.ts +1 -0
- package/dist/highlighter/languages/getResolvedOrResolveLanguage.d.ts.map +1 -1
- package/dist/highlighter/languages/hasResolvedLanguages.d.ts +0 -1
- package/dist/highlighter/languages/hasResolvedLanguages.d.ts.map +1 -1
- package/dist/highlighter/languages/registerCustomLanguage.d.ts +3 -2
- package/dist/highlighter/languages/registerCustomLanguage.d.ts.map +1 -1
- package/dist/highlighter/languages/registerCustomLanguage.js +3 -1
- package/dist/highlighter/languages/registerCustomLanguage.js.map +1 -1
- package/dist/highlighter/languages/resolveLanguage.d.ts +1 -0
- package/dist/highlighter/languages/resolveLanguage.d.ts.map +1 -1
- package/dist/highlighter/languages/resolveLanguages.d.ts +1 -0
- package/dist/highlighter/languages/resolveLanguages.d.ts.map +1 -1
- package/dist/highlighter/shared_highlighter.d.ts +1 -6
- package/dist/highlighter/shared_highlighter.d.ts.map +1 -1
- package/dist/highlighter/themes/areThemesAttached.d.ts +0 -1
- package/dist/highlighter/themes/areThemesAttached.d.ts.map +1 -1
- package/dist/highlighter/themes/attachResolvedThemes.d.ts +0 -1
- package/dist/highlighter/themes/attachResolvedThemes.d.ts.map +1 -1
- package/dist/highlighter/themes/cleanUpResolvedThemes.d.ts.map +1 -1
- package/dist/highlighter/themes/constants.d.ts.map +1 -1
- package/dist/highlighter/themes/getResolvedOrResolveTheme.d.ts +0 -1
- package/dist/highlighter/themes/getResolvedOrResolveTheme.d.ts.map +1 -1
- package/dist/highlighter/themes/getResolvedThemes.d.ts +0 -1
- package/dist/highlighter/themes/getResolvedThemes.d.ts.map +1 -1
- package/dist/highlighter/themes/hasResolvedThemes.d.ts +0 -1
- package/dist/highlighter/themes/hasResolvedThemes.d.ts.map +1 -1
- package/dist/highlighter/themes/registerCustomCSSVariableTheme.d.ts.map +1 -1
- package/dist/highlighter/themes/registerCustomTheme.d.ts +0 -1
- package/dist/highlighter/themes/registerCustomTheme.d.ts.map +1 -1
- package/dist/highlighter/themes/resolveTheme.d.ts +0 -1
- package/dist/highlighter/themes/resolveTheme.d.ts.map +1 -1
- package/dist/highlighter/themes/resolveThemes.d.ts +0 -1
- package/dist/highlighter/themes/resolveThemes.d.ts.map +1 -1
- package/dist/highlighter/themes/themeResolution.d.ts +0 -1
- package/dist/highlighter/themes/themeResolution.d.ts.map +1 -1
- package/dist/highlighter/themes/themeResolver.d.ts +0 -1
- package/dist/highlighter/themes/themeResolver.d.ts.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/managers/InteractionManager.d.ts +2 -26
- package/dist/managers/InteractionManager.d.ts.map +1 -1
- package/dist/managers/InteractionManager.js +1 -3
- package/dist/managers/InteractionManager.js.map +1 -1
- package/dist/managers/ResizeManager.d.ts +1 -4
- package/dist/managers/ResizeManager.d.ts.map +1 -1
- package/dist/managers/ScrollSyncManager.d.ts.map +1 -1
- package/dist/managers/UniversalRenderingManager.d.ts.map +1 -1
- package/dist/node_modules/.pnpm/@types_hast@3.0.4/node_modules/@types/hast/index.d.ts +0 -1
- package/dist/node_modules/.pnpm/@types_hast@3.0.4/node_modules/@types/hast/index.d.ts.map +1 -1
- package/dist/node_modules/.pnpm/@types_unist@3.0.3/node_modules/@types/unist/index.d.ts.map +1 -1
- package/dist/react/CodeView.d.ts +9 -1
- package/dist/react/CodeView.d.ts.map +1 -1
- package/dist/react/CodeView.js +39 -33
- package/dist/react/CodeView.js.map +1 -1
- package/dist/react/EditContext.d.ts +2 -5
- package/dist/react/EditContext.d.ts.map +1 -1
- package/dist/react/File.d.ts +1 -23
- package/dist/react/File.d.ts.map +1 -1
- package/dist/react/File.js +13 -12
- package/dist/react/File.js.map +1 -1
- package/dist/react/FileDiff.d.ts +1 -23
- package/dist/react/FileDiff.d.ts.map +1 -1
- package/dist/react/FileDiff.js +13 -12
- package/dist/react/FileDiff.js.map +1 -1
- package/dist/react/MultiFileDiff.d.ts +1 -24
- package/dist/react/MultiFileDiff.d.ts.map +1 -1
- package/dist/react/MultiFileDiff.js +13 -12
- package/dist/react/MultiFileDiff.js.map +1 -1
- package/dist/react/PatchDiff.d.ts +1 -23
- package/dist/react/PatchDiff.d.ts.map +1 -1
- package/dist/react/PatchDiff.js +13 -12
- package/dist/react/PatchDiff.js.map +1 -1
- package/dist/react/UnresolvedFile.d.ts +1 -18
- package/dist/react/UnresolvedFile.d.ts.map +1 -1
- package/dist/react/UnresolvedFile.js +15 -14
- package/dist/react/UnresolvedFile.js.map +1 -1
- package/dist/react/Virtualizer.d.ts +1 -9
- package/dist/react/Virtualizer.d.ts.map +1 -1
- package/dist/react/Virtualizer.js.map +1 -1
- package/dist/react/WorkerPoolContext.d.ts +2 -6
- package/dist/react/WorkerPoolContext.d.ts.map +1 -1
- package/dist/react/constants.d.ts +0 -1
- package/dist/react/constants.d.ts.map +1 -1
- package/dist/react/jsx.d.ts +1 -0
- package/dist/react/jsx.d.ts.map +1 -1
- package/dist/react/types.d.ts +1 -1
- package/dist/react/types.d.ts.map +1 -1
- package/dist/react/utils/assignRef.d.ts +6 -0
- package/dist/react/utils/assignRef.d.ts.map +1 -0
- package/dist/react/utils/assignRef.js +9 -0
- package/dist/react/utils/assignRef.js.map +1 -0
- package/dist/react/utils/renderDiffChildren.d.ts +1 -16
- package/dist/react/utils/renderDiffChildren.d.ts.map +1 -1
- package/dist/react/utils/renderDiffChildren.js.map +1 -1
- package/dist/react/utils/renderFileChildren.d.ts +1 -13
- package/dist/react/utils/renderFileChildren.d.ts.map +1 -1
- package/dist/react/utils/renderFileChildren.js.map +1 -1
- package/dist/react/utils/templateRender.d.ts +0 -1
- package/dist/react/utils/templateRender.d.ts.map +1 -1
- package/dist/react/utils/useFileDiffInstance.d.ts +2 -18
- package/dist/react/utils/useFileDiffInstance.d.ts.map +1 -1
- package/dist/react/utils/useFileDiffInstance.js +31 -17
- package/dist/react/utils/useFileDiffInstance.js.map +1 -1
- package/dist/react/utils/useFileInstance.d.ts +2 -16
- package/dist/react/utils/useFileInstance.d.ts.map +1 -1
- package/dist/react/utils/useFileInstance.js +8 -4
- package/dist/react/utils/useFileInstance.js.map +1 -1
- package/dist/react/utils/useStableCallback.d.ts.map +1 -1
- package/dist/react/utils/useUnresolvedFileInstance.d.ts +1 -12
- package/dist/react/utils/useUnresolvedFileInstance.d.ts.map +1 -1
- package/dist/renderers/DiffHunksRenderer.d.ts +4 -9
- package/dist/renderers/DiffHunksRenderer.d.ts.map +1 -1
- package/dist/renderers/DiffHunksRenderer.js +28 -21
- package/dist/renderers/DiffHunksRenderer.js.map +1 -1
- package/dist/renderers/FileRenderer.d.ts +1 -0
- package/dist/renderers/FileRenderer.d.ts.map +1 -1
- package/dist/renderers/FileRenderer.js.map +1 -1
- package/dist/renderers/UnresolvedFileHunksRenderer.d.ts +3 -9
- package/dist/renderers/UnresolvedFileHunksRenderer.d.ts.map +1 -1
- 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.map +1 -1
- package/dist/shiki-stream/tokenizer.d.ts +0 -1
- package/dist/shiki-stream/tokenizer.d.ts.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/ssr/FileDiffReact.d.ts +1 -8
- package/dist/ssr/FileDiffReact.d.ts.map +1 -1
- package/dist/ssr/FileDiffReact.js +8 -3
- package/dist/ssr/FileDiffReact.js.map +1 -1
- package/dist/ssr/preloadDiffs.d.ts +6 -34
- package/dist/ssr/preloadDiffs.d.ts.map +1 -1
- package/dist/ssr/preloadFile.d.ts +1 -6
- package/dist/ssr/preloadFile.d.ts.map +1 -1
- package/dist/ssr/preloadPatchFile.d.ts +1 -5
- package/dist/ssr/preloadPatchFile.d.ts.map +1 -1
- package/dist/ssr/renderHTML.d.ts +0 -1
- package/dist/ssr/renderHTML.d.ts.map +1 -1
- package/dist/string-import.d.ts.map +1 -1
- package/dist/style.js.map +1 -1
- package/dist/types.d.ts +0 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/annotationHelpers.d.ts +0 -1
- package/dist/utils/annotationHelpers.d.ts.map +1 -1
- package/dist/utils/appendItems.d.ts.map +1 -1
- package/dist/utils/applyLineTextWithNewline.d.ts.map +1 -1
- package/dist/utils/areDiffLineAnnotationsEqual.d.ts +0 -1
- package/dist/utils/areDiffLineAnnotationsEqual.d.ts.map +1 -1
- package/dist/utils/areDiffRenderOptionsEqual.d.ts +0 -1
- package/dist/utils/areDiffRenderOptionsEqual.d.ts.map +1 -1
- package/dist/utils/areDiffTargetsEqual.d.ts +0 -1
- package/dist/utils/areDiffTargetsEqual.d.ts.map +1 -1
- package/dist/utils/areFileRenderOptionsEqual.d.ts +0 -1
- package/dist/utils/areFileRenderOptionsEqual.d.ts.map +1 -1
- package/dist/utils/areFileTargetsEqual.d.ts +0 -1
- package/dist/utils/areFileTargetsEqual.d.ts.map +1 -1
- package/dist/utils/areFilesEqual.d.ts +0 -1
- package/dist/utils/areFilesEqual.d.ts.map +1 -1
- package/dist/utils/areHunkDataEqual.d.ts +0 -1
- package/dist/utils/areHunkDataEqual.d.ts.map +1 -1
- package/dist/utils/areLineAnnotationsEqual.d.ts +0 -1
- package/dist/utils/areLineAnnotationsEqual.d.ts.map +1 -1
- package/dist/utils/areManagedSnapshotsEqual.d.ts +0 -1
- package/dist/utils/areManagedSnapshotsEqual.d.ts.map +1 -1
- package/dist/utils/areMergeConflictActionsEqual.d.ts +0 -1
- package/dist/utils/areMergeConflictActionsEqual.d.ts.map +1 -1
- package/dist/utils/areObjectsEqual.d.ts.map +1 -1
- package/dist/utils/areOptionsEqual.d.ts +1 -0
- package/dist/utils/areOptionsEqual.d.ts.map +1 -1
- package/dist/utils/arePrePropertiesEqual.d.ts +0 -1
- package/dist/utils/arePrePropertiesEqual.d.ts.map +1 -1
- package/dist/utils/areRenderRangesEqual.d.ts +0 -1
- package/dist/utils/areRenderRangesEqual.d.ts.map +1 -1
- package/dist/utils/areSelectionPointsEqual.d.ts +0 -1
- package/dist/utils/areSelectionPointsEqual.d.ts.map +1 -1
- package/dist/utils/areSelectionsEqual.d.ts +0 -1
- package/dist/utils/areSelectionsEqual.d.ts.map +1 -1
- package/dist/utils/areThemesEqual.d.ts +0 -1
- package/dist/utils/areThemesEqual.d.ts.map +1 -1
- package/dist/utils/areVirtualWindowSpecsEqual.d.ts +0 -1
- package/dist/utils/areVirtualWindowSpecsEqual.d.ts.map +1 -1
- package/dist/utils/areWorkerStatsEqual.d.ts +1 -0
- package/dist/utils/areWorkerStatsEqual.d.ts.map +1 -1
- package/dist/utils/awaitWithTimeout.d.ts.map +1 -1
- package/dist/utils/cleanLastNewline.d.ts.map +1 -1
- package/dist/utils/cloneFileDiffMetadata.d.ts +0 -1
- package/dist/utils/cloneFileDiffMetadata.d.ts.map +1 -1
- package/dist/utils/composeCacheKey.d.ts.map +1 -1
- package/dist/utils/computeEstimatedDiffHeights.d.ts +1 -11
- package/dist/utils/computeEstimatedDiffHeights.d.ts.map +1 -1
- package/dist/utils/computeFileOffsets.d.ts.map +1 -1
- package/dist/utils/computeFileOffsets.js +9 -8
- package/dist/utils/computeFileOffsets.js.map +1 -1
- package/dist/utils/computeVirtualFileMetrics.d.ts +0 -1
- package/dist/utils/computeVirtualFileMetrics.d.ts.map +1 -1
- package/dist/utils/createAnnotationElement.d.ts +0 -1
- package/dist/utils/createAnnotationElement.d.ts.map +1 -1
- package/dist/utils/createAnnotationWrapperNode.d.ts.map +1 -1
- package/dist/utils/createCodeViewHeaderFooterHostElement.d.ts.map +1 -1
- package/dist/utils/createContentColumn.d.ts +0 -1
- package/dist/utils/createContentColumn.d.ts.map +1 -1
- package/dist/utils/createEmptyRowBuffer.d.ts +0 -1
- package/dist/utils/createEmptyRowBuffer.d.ts.map +1 -1
- package/dist/utils/createFileHeaderElement.d.ts +1 -6
- package/dist/utils/createFileHeaderElement.d.ts.map +1 -1
- package/dist/utils/createGutterUtilityContentNode.d.ts.map +1 -1
- package/dist/utils/createGutterUtilityElement.d.ts +0 -1
- package/dist/utils/createGutterUtilityElement.d.ts.map +1 -1
- package/dist/utils/createNoNewlineElement.d.ts +0 -1
- package/dist/utils/createNoNewlineElement.d.ts.map +1 -1
- package/dist/utils/createPreElement.d.ts +1 -11
- package/dist/utils/createPreElement.d.ts.map +1 -1
- package/dist/utils/createRowNodes.d.ts.map +1 -1
- package/dist/utils/createSeparator.d.ts +1 -10
- package/dist/utils/createSeparator.d.ts.map +1 -1
- package/dist/utils/createSeparator.js +12 -10
- package/dist/utils/createSeparator.js.map +1 -1
- package/dist/utils/createSpanNodeFromToken.d.ts +0 -1
- package/dist/utils/createSpanNodeFromToken.d.ts.map +1 -1
- package/dist/utils/createSpanNodeFromToken.js +2 -1
- package/dist/utils/createSpanNodeFromToken.js.map +1 -1
- package/dist/utils/createStyleElement.d.ts +0 -1
- package/dist/utils/createStyleElement.d.ts.map +1 -1
- package/dist/utils/createTransformerWithState.d.ts +0 -1
- package/dist/utils/createTransformerWithState.d.ts.map +1 -1
- package/dist/utils/createUnsafeCSSStyleNode.d.ts.map +1 -1
- package/dist/utils/createWindowFromScrollPosition.d.ts +1 -9
- package/dist/utils/createWindowFromScrollPosition.d.ts.map +1 -1
- package/dist/utils/cssWrappers.d.ts +0 -1
- package/dist/utils/cssWrappers.d.ts.map +1 -1
- package/dist/utils/cssWrappers.js +5 -3
- package/dist/utils/cssWrappers.js.map +1 -1
- package/dist/utils/detachString.d.ts.map +1 -1
- package/dist/utils/diffAcceptRejectHunk.d.ts +0 -1
- package/dist/utils/diffAcceptRejectHunk.d.ts.map +1 -1
- package/dist/utils/editSessionAnnotations.d.ts +0 -1
- package/dist/utils/editSessionAnnotations.d.ts.map +1 -1
- package/dist/utils/editSessionHunks.d.ts +0 -1
- package/dist/utils/editSessionHunks.d.ts.map +1 -1
- package/dist/utils/formatCSSVariablePrefix.d.ts.map +1 -1
- package/dist/utils/getDiffFileInput.d.ts +1 -5
- package/dist/utils/getDiffFileInput.d.ts.map +1 -1
- package/dist/utils/getDiffHunksRendererOptions.d.ts +0 -1
- package/dist/utils/getDiffHunksRendererOptions.d.ts.map +1 -1
- package/dist/utils/getFileRendererOptions.d.ts +0 -1
- package/dist/utils/getFileRendererOptions.d.ts.map +1 -1
- package/dist/utils/getFiletypeFromFileName.d.ts +0 -1
- package/dist/utils/getFiletypeFromFileName.d.ts.map +1 -1
- package/dist/utils/getFiletypeFromFileName.js.map +1 -1
- package/dist/utils/getHighlighterOptions.d.ts +1 -5
- package/dist/utils/getHighlighterOptions.d.ts.map +1 -1
- package/dist/utils/getHighlighterOptions.js +1 -1
- package/dist/utils/getHighlighterOptions.js.map +1 -1
- package/dist/utils/getHighlighterThemeStyles.d.ts +1 -6
- package/dist/utils/getHighlighterThemeStyles.d.ts.map +1 -1
- package/dist/utils/getHunkSeparatorSlotName.d.ts +0 -1
- package/dist/utils/getHunkSeparatorSlotName.d.ts.map +1 -1
- package/dist/utils/getHunkSideBoundaries.d.ts.map +1 -1
- package/dist/utils/getIconForType.d.ts +0 -1
- package/dist/utils/getIconForType.d.ts.map +1 -1
- package/dist/utils/getLineAnnotationName.d.ts +0 -1
- package/dist/utils/getLineAnnotationName.d.ts.map +1 -1
- package/dist/utils/getLineEndingType.d.ts.map +1 -1
- package/dist/utils/getLineNodes.d.ts +0 -1
- package/dist/utils/getLineNodes.d.ts.map +1 -1
- package/dist/utils/getMergeConflictActionSlotName.d.ts +1 -5
- package/dist/utils/getMergeConflictActionSlotName.d.ts.map +1 -1
- package/dist/utils/getMergeConflictLineTypes.d.ts +0 -1
- package/dist/utils/getMergeConflictLineTypes.d.ts.map +1 -1
- package/dist/utils/getOrCreateCodeNode.d.ts +1 -7
- package/dist/utils/getOrCreateCodeNode.d.ts.map +1 -1
- package/dist/utils/getSingularPatch.d.ts +0 -1
- package/dist/utils/getSingularPatch.d.ts.map +1 -1
- package/dist/utils/getThemes.d.ts +0 -1
- package/dist/utils/getThemes.d.ts.map +1 -1
- package/dist/utils/getTotalLineCountFromHunks.d.ts +0 -1
- package/dist/utils/getTotalLineCountFromHunks.d.ts.map +1 -1
- package/dist/utils/guardWebKitScrollDuringRebuild.d.ts.map +1 -1
- package/dist/utils/hast_utils.d.ts +2 -12
- package/dist/utils/hast_utils.d.ts.map +1 -1
- package/dist/utils/hostTheme.d.ts +1 -5
- package/dist/utils/hostTheme.d.ts.map +1 -1
- package/dist/utils/hydratePartialDiff.d.ts +0 -1
- package/dist/utils/hydratePartialDiff.d.ts.map +1 -1
- package/dist/utils/includesFileAnnotations.d.ts +0 -1
- package/dist/utils/includesFileAnnotations.d.ts.map +1 -1
- package/dist/utils/isDefaultRenderRange.d.ts +0 -1
- package/dist/utils/isDefaultRenderRange.d.ts.map +1 -1
- package/dist/utils/isDiffPlainText.d.ts +0 -1
- package/dist/utils/isDiffPlainText.d.ts.map +1 -1
- package/dist/utils/isFilePlainText.d.ts +0 -1
- package/dist/utils/isFilePlainText.d.ts.map +1 -1
- package/dist/utils/isGutterUtilityPath.d.ts.map +1 -1
- package/dist/utils/isStyleNode.d.ts.map +1 -1
- package/dist/utils/isWorkerContext.d.ts.map +1 -1
- package/dist/utils/iterateOverDiff.d.ts +1 -10
- package/dist/utils/iterateOverDiff.d.ts.map +1 -1
- package/dist/utils/iterateOverDiff.js +5 -3
- package/dist/utils/iterateOverDiff.js.map +1 -1
- package/dist/utils/lineAnnotationIdentity.d.ts +0 -1
- package/dist/utils/lineAnnotationIdentity.d.ts.map +1 -1
- package/dist/utils/normalizeDiffResolution.d.ts +0 -1
- package/dist/utils/normalizeDiffResolution.d.ts.map +1 -1
- package/dist/utils/parseDiffDecorations.d.ts +2 -13
- package/dist/utils/parseDiffDecorations.d.ts.map +1 -1
- package/dist/utils/parseDiffFromFile.d.ts +0 -1
- package/dist/utils/parseDiffFromFile.d.ts.map +1 -1
- package/dist/utils/parseDiffFromFile.js +2 -1
- package/dist/utils/parseDiffFromFile.js.map +1 -1
- package/dist/utils/parseLineType.d.ts +0 -1
- package/dist/utils/parseLineType.d.ts.map +1 -1
- package/dist/utils/parseMergeConflictDiffFromFile.d.ts +0 -1
- package/dist/utils/parseMergeConflictDiffFromFile.d.ts.map +1 -1
- package/dist/utils/parsePatchFiles.d.ts +0 -1
- package/dist/utils/parsePatchFiles.d.ts.map +1 -1
- package/dist/utils/parsePatchFiles.js +8 -5
- package/dist/utils/parsePatchFiles.js.map +1 -1
- package/dist/utils/platform.d.ts.map +1 -1
- package/dist/utils/prefersReducedMotion.d.ts.map +1 -1
- package/dist/utils/prerenderHTMLIfNecessary.d.ts.map +1 -1
- package/dist/utils/processLine.d.ts +0 -1
- package/dist/utils/processLine.d.ts.map +1 -1
- package/dist/utils/realignChangeContent.d.ts +0 -1
- package/dist/utils/realignChangeContent.d.ts.map +1 -1
- package/dist/utils/renderDiffWithHighlighter.d.ts +1 -8
- package/dist/utils/renderDiffWithHighlighter.d.ts.map +1 -1
- package/dist/utils/renderFileWithHighlighter.d.ts +1 -11
- package/dist/utils/renderFileWithHighlighter.d.ts.map +1 -1
- package/dist/utils/resolveConflict.d.ts +0 -1
- package/dist/utils/resolveConflict.d.ts.map +1 -1
- package/dist/utils/resolveRegion.d.ts +0 -1
- package/dist/utils/resolveRegion.d.ts.map +1 -1
- package/dist/utils/roundToDevicePixel.d.ts.map +1 -1
- package/dist/utils/scrollbarGutter.d.ts.map +1 -1
- package/dist/utils/scrollbarGutter.js +2 -1
- package/dist/utils/scrollbarGutter.js.map +1 -1
- package/dist/utils/setLanguageOverride.d.ts +0 -1
- package/dist/utils/setLanguageOverride.d.ts.map +1 -1
- package/dist/utils/setWrapperNodeProps.d.ts +1 -11
- package/dist/utils/setWrapperNodeProps.d.ts.map +1 -1
- package/dist/utils/setWrapperNodeProps.js +1 -3
- package/dist/utils/setWrapperNodeProps.js.map +1 -1
- package/dist/utils/shouldUseTokenTransformer.d.ts +0 -1
- package/dist/utils/shouldUseTokenTransformer.d.ts.map +1 -1
- package/dist/utils/splitFileContents.d.ts.map +1 -1
- package/dist/utils/trimPatchContext.d.ts.map +1 -1
- package/dist/utils/updateDiffHunks.d.ts +0 -1
- package/dist/utils/updateDiffHunks.d.ts.map +1 -1
- package/dist/utils/virtualDiffLayout.d.ts +10 -55
- package/dist/utils/virtualDiffLayout.d.ts.map +1 -1
- package/dist/utils/wrapTokenFragments.d.ts +0 -1
- package/dist/utils/wrapTokenFragments.d.ts.map +1 -1
- package/dist/worker/WorkerPoolManager.d.ts +2 -17
- package/dist/worker/WorkerPoolManager.d.ts.map +1 -1
- package/dist/worker/WorkerPoolManager.js +48 -43
- package/dist/worker/WorkerPoolManager.js.map +1 -1
- package/dist/worker/getOrCreateWorkerPoolSingleton.d.ts +1 -5
- package/dist/worker/getOrCreateWorkerPoolSingleton.d.ts.map +1 -1
- package/dist/worker/types.d.ts +0 -1
- package/dist/worker/types.d.ts.map +1 -1
- package/dist/worker/worker-portable.d.ts +1 -1
- package/dist/worker/worker-portable.js +121 -355
- package/dist/worker/worker-portable.js.map +1 -1
- package/dist/worker/worker.d.ts +1 -1
- package/dist/worker/worker.js +22 -12
- package/dist/worker/worker.js.map +1 -1
- package/package.json +4 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"editor2.js","names":[],"sources":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"editor2.js","names":[],"sources":["../../src/editor/editor.css?inline"],"sourcesContent":["::selection {\n background-color: transparent;\n}\n\n/* Read-only deletion text sits outside the editor's selection overlay, so the\n global transparent ::selection above hides its selection by default. Reveal\n the native selection (so users can see what they select and copy) only while\n the user is actively selecting within deleted text: the editor sets\n data-deleted-text-selection on the diff while a pointer gesture starts there.\n Gating it this way means a normal selection of editable code that merely\n sweeps across an interleaved deleted line (unified view) does not highlight\n that line. Covers the whole deletions column in split view and individual\n deleted lines in unified view. */\n[data-deleted-text-selection] [data-deletions] ::selection,\n[data-deleted-text-selection] [data-line-type='change-deletion'] ::selection {\n background-color: var(--diffs-editor-selection-bg);\n}\n\n@keyframes blinking {\n 0% {\n opacity: 1;\n }\n 50% {\n opacity: 0;\n }\n 100% {\n opacity: 1;\n }\n}\n\n:host, /* for scroll anchor */\n[data-code], /* for editor overlay */\n[data-content] /* for wrap line measurement */,\n[data-diff-type='split'][data-overflow='wrap'] {\n position: relative;\n}\n[data-code] {\n container-type: inline-size;\n}\n[data-content] {\n cursor: text;\n background-color: transparent;\n caret-color: var(--diffs-bg-caret);\n outline: none;\n}\n[data-line] {\n cursor: text;\n /* Transparent so the line's in-flow background can't hide the selection\n overlay (z-index -10); the line color moves to the ::after layer below it. */\n background-color: transparent;\n}\n/* Line background layer below the selection overlay (z-index -10) so the\n translucent selection composites over it. ::before is the +/- indicator. */\n[data-line]::after {\n content: '';\n position: absolute;\n inset: 0;\n z-index: -20;\n background-color: var(--diffs-line-bg);\n pointer-events: none;\n}\n/* The line-state pipeline resolves the active background. Keep the theme's\n border as an additional cue, including for border-only themes. */\n[data-line][data-editor-active-line]::after {\n box-shadow: inset 0 0 0 1px var(--diffs-editor-line-highlight-border);\n}\n\n[data-editor-overlay] {\n display: contents;\n}\n[data-caret],\n[data-edit-prediction],\n[data-selection-range],\n[data-match-range],\n[data-bracket-match-range],\n[data-edit-prediction-deletion-range],\n[data-edit-prediction-insertion-range],\n[data-edit-prediction-replacement-range],\n[data-marker-range],\n[data-remote-caret],\n[data-caret-highlight-range] {\n position: absolute;\n top: 0;\n left: 0;\n height: 1lh;\n line-height: var(--diffs-line-height);\n pointer-events: none;\n}\n[data-edit-prediction] {\n z-index: 1;\n height: auto;\n overflow: visible;\n width: max-content;\n user-select: none;\n color: var(\n --diffs-editor-edit-prediction-fg,\n color-mix(in lab, var(--diffs-fg) 45%, transparent)\n );\n}\n[data-edit-prediction-line] {\n box-sizing: border-box;\n display: block;\n min-height: 1lh;\n width: max-content;\n white-space: pre;\n}\n[data-edit-prediction][data-replacement] [data-edit-prediction-line],\n[data-edit-prediction-insertion-range],\n[data-edit-prediction-replacement-range] {\n background-color: var(--diffs-edit-prediction-bg, var(--diffs-bg));\n}\n[data-edit-prediction-suffix] {\n color: var(--diffs-fg);\n}\n[data-edit-prediction][data-wrap] [data-edit-prediction-line] {\n max-width: 100%;\n overflow-wrap: anywhere;\n white-space: pre-wrap;\n}\n[data-edit-prediction-line][data-empty]::after {\n content: '↵';\n}\n[data-edit-prediction-spacer] {\n margin-block-end: var(--diffs-edit-prediction-spacer-height);\n}\n/* The deletions column of a split diff shows no ghost text, so its reserved\n rows are padding: the row tint and the buffer hatch extend over them instead\n of leaving a blank strip. Buffers size themselves with a border-box\n min-height that would absorb the padding, hence content-box. */\n[data-code][data-deletions] [data-edit-prediction-spacer] {\n margin-block-end: 0;\n padding-block-end: var(--diffs-edit-prediction-spacer-height);\n box-sizing: content-box;\n}\n[data-edit-prediction-deletion-range] {\n --diffs-edit-prediction-deletion-color: var(\n --diffs-editor-edit-prediction-deletion-fg,\n color-mix(in lab, var(--diffs-deletion-base) 70%, transparent)\n );\n\n z-index: 1;\n background: linear-gradient(\n to bottom,\n transparent calc(50% - 0.5px),\n var(--diffs-edit-prediction-deletion-color) calc(50% - 0.5px),\n var(--diffs-edit-prediction-deletion-color) calc(50% + 0.5px),\n transparent calc(50% + 0.5px)\n );\n}\n[data-edit-prediction-insertion-range] {\n z-index: 0;\n}\n[data-edit-prediction-replacement-range] {\n z-index: 1;\n}\n[data-caret] {\n z-index: 2;\n width: 2px;\n background-color: var(\n --diffs-bg-caret-override,\n var(\n --diffs-editor-cursor-fg,\n light-dark(\n color-mix(in lab, var(--diffs-fg) 50%, var(--diffs-bg)),\n color-mix(in lab, var(--diffs-fg) 75%, var(--diffs-bg))\n )\n )\n );\n visibility: hidden;\n}\n/* Reduce motion only if user has set a preference */\n@media (prefers-reduced-motion: no-preference) {\n [data-caret] {\n animation: blinking 1.2s infinite;\n animation-delay: 0.8s;\n }\n}\n[data-selection-range] {\n z-index: -10;\n background-color: var(--diffs-editor-selection-bg);\n}\n[data-caret-highlight-range] {\n z-index: -10;\n background-color: var(\n --diffs-caret-highlight-bg,\n var(--diffs-editor-selection-bg)\n );\n}\n/* Masks the selection's square corner to fake rounding, so it must match the bg\n behind the selection: the line's diff color (passed in via\n --diffs-selection-corner-bg) or the editor base for context lines. */\n[data-selection-corner] {\n width: 100%;\n height: 100%;\n background-color: var(--diffs-selection-corner-bg, var(--diffs-bg));\n}\n[data-match-range] {\n z-index: -10;\n background-color: var(\n --diffs-editor-match-bg,\n var(--diffs-editor-selection-bg)\n );\n}\n[data-match-range]:not([data-focus]) {\n background-color: var(\n --diffs-editor-match-highlight-bg,\n light-dark(#ff963288, #ff963266)\n );\n}\n[data-bracket-match-range] {\n z-index: -9;\n box-sizing: border-box;\n border-bottom: 1px solid\n var(\n --diffs-editor-bracket-match-border,\n color-mix(in lab, var(--diffs-fg) 60%, transparent)\n );\n background-color: var(\n --diffs-editor-bracket-match-bg,\n color-mix(in lab, var(--diffs-fg) 5%, transparent)\n );\n}\n\n[data-rtl] {\n border-top-left-radius: 3px;\n}\n[data-rtr] {\n border-top-right-radius: 3px;\n}\n[data-rbl] {\n border-bottom-left-radius: 3px;\n}\n[data-rbr] {\n border-bottom-right-radius: 3px;\n}\n\n/* Markers\n *\n * Marker range applies a wavy underline. Severity attributes are used by both\n * `[data-marker-range]` and `[data-marker-popover]` alike.\n */\n\n[data-marker-range] {\n z-index: 1;\n background-color: var(--diffs-marker-bg);\n mask-image: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI2IiBoZWlnaHQ9IjMiPjxwYXRoIGQ9Im0wIDIuNSBsMiAtMS41IGwxIDAgbDIgMS41IGwxIDAiIHN0cm9rZT0iI2ZmZiIgZmlsbD0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIi8+PC9zdmc+');\n mask-position: left bottom;\n mask-repeat: repeat-x;\n mask-size: 6px 3px;\n}\n\n[data-marker-error] {\n --diffs-marker-contrast: light-dark(#fff, #000);\n --diffs-marker-bg: var(--diffs-editor-error-fg, var(--diffs-deletion-base));\n}\n[data-marker-warning] {\n --diffs-marker-contrast: #000;\n --diffs-marker-bg: var(\n --diffs-editor-warning-fg,\n light-dark(var(--diffs-warning-light), var(--diffs-warning-dark))\n );\n}\n[data-marker-info] {\n --diffs-marker-contrast: #000;\n --diffs-marker-bg: var(--diffs-editor-info-fg, var(--diffs-modified-base));\n}\n[data-marker-hint] {\n --diffs-marker-contrast: light-dark(#fff, #000);\n --diffs-marker-bg: var(--diffs-editor-hint-fg, var(--diffs-fg-number));\n}\n\n@media (width >= 480px) {\n [data-content] {\n caret-color: transparent;\n }\n [data-content]:focus ~ [data-editor-overlay] [data-caret] {\n visibility: visible;\n }\n}\n\n/* Editor widgets\n *\n * Positioned popovers used across edit mode. Used by markers, search panel,\n * and selection action.\n */\n\n[data-editor-widget] {\n --diffs-widget-fg: var(--diffs-fg);\n --diffs-widget-bg: color-mix(in lab, var(--diffs-fg) 4%, var(--diffs-bg));\n --diffs-widget-border: color-mix(in lab, var(--diffs-fg) 20%, transparent);\n --diffs-widget-shadow:\n inset 0 0 0 1px var(--diffs-bg), 0 4px 8px rgb(0 0 0 / 0.075),\n 0 6px 18px rgb(0 0 0 / 0.075);\n position: absolute;\n top: 0;\n left: 0;\n z-index: 100;\n width: fit-content;\n max-width: calc(100% - 24px);\n font: 14px/20px var(--diffs-header-font-fallback);\n border: 1px solid var(--diffs-widget-border);\n border-radius: 9px;\n background-color: var(--diffs-widget-bg);\n background-clip: padding-box;\n box-shadow: var(--diffs-widget-shadow);\n}\n\n/* Shared geometry for the overlay popovers (marker hover popover and\n selection-action popover). Both are positioned in overlay coordinate space via\n --popover-x/--popover-y (set in JS). The left edge is clamped so the popover\n never slides under the line-number gutter (--gutter-width, also set in JS) or\n outside the visible scroll viewport, and the width is capped to match. Builds\n on [data-editor-widget]. */\n[data-marker-popover],\n[data-selection-action-popover] {\n --popover-gap: var(--diffs-popover-gap, var(--diffs-gap-fallback, 8px));\n --popover-viewport-left: 0px;\n --popover-viewport-right: 100cqw;\n /* Sentinels disable the vertical clamp until JS sets the real scrollport. */\n --popover-viewport-top: -99999px;\n --popover-viewport-bottom: 99999px;\n --popover-min-left: calc(\n var(--popover-viewport-left) + var(--gutter-width, 0px) + var(--popover-gap)\n );\n --popover-available-width: max(\n 0px,\n calc(\n var(--popover-viewport-right) - var(--popover-min-left) -\n var(--popover-gap)\n )\n );\n max-width: min(640px, var(--popover-available-width));\n translate: clamp(\n var(--popover-min-left),\n var(--popover-x, var(--popover-min-left)),\n calc(var(--popover-viewport-right) - var(--popover-gap) - 100%)\n )\n /* Clamp into the scrollport so a popover with no fitting side stays in view. */\n clamp(\n var(--popover-viewport-top),\n calc(var(--popover-y, 0px) + var(--popover-y-shift, 0px)),\n calc(var(--popover-viewport-bottom) - var(--popover-gap) - 100%)\n );\n}\n\n[data-marker-popover] {\n --diffs-widget-bg: var(--diffs-marker-bg);\n --diffs-widget-shadow:\n 0 4px 8px rgb(0 0 0 / 0.15), 0 6px 18px rgb(0 0 0 / 0.15);\n\n padding: 8px 12px;\n min-width: min(180px, var(--popover-available-width));\n overflow-wrap: anywhere;\n color: var(--diffs-marker-contrast);\n white-space: normal;\n border: 0;\n pointer-events: auto;\n\n @supports (color: contrast-color(red)) {\n color: contrast-color(var(--diffs-marker-bg, var(--diffs-bg)));\n }\n\n [data-marker-message] {\n white-space: normal;\n overflow-wrap: anywhere;\n\n code {\n display: inline;\n background-color: transparent;\n white-space: normal;\n color: inherit;\n }\n }\n}\n\n/* Selection Action Widget: a floating popover hosting the consumer's\n selection-action element. It reuses the shared [data-editor-widget] chrome and\n sits in the overlay layer (which is pointer-events: none), so it re-enables\n pointer events for its own actions. */\n[data-selection-action-popover] {\n display: flex;\n flex-wrap: wrap;\n gap: 4px;\n align-items: center;\n width: max-content;\n padding: 4px;\n pointer-events: auto;\n}\n\n/* Search Panel Widget */\n[data-search-panel] {\n position: sticky;\n top: 16px;\n right: 16px;\n z-index: 100;\n display: flex;\n justify-content: right;\n flex-direction: column;\n width: 100%;\n /* Zero height ensures panel appears stickied immediately */\n height: 0;\n container: search-panel / inline-size;\n\n [data-editor-widget] {\n position: relative;\n z-index: 100;\n display: flex;\n flex-shrink: 0;\n align-items: stretch;\n gap: 8px;\n padding: 4px;\n max-width: 100%;\n min-width: 260px;\n margin-inline: auto 16px;\n }\n\n svg {\n display: block;\n fill: currentColor;\n width: 12px;\n height: 12px;\n }\n}\n\n[data-search-grid] {\n display: grid;\n grid-template-columns: auto auto auto;\n grid-template-areas:\n 'find matches nav'\n 'replace actions .';\n align-items: center;\n gap: 4px 6px;\n width: 100%;\n}\n[data-input-box][data-find] {\n grid-area: find;\n}\n[data-search-nav] {\n grid-area: nav;\n}\n[data-input-box][data-replace] {\n grid-area: replace;\n}\n[data-replace-actions] {\n grid-area: actions;\n}\n[data-search-grid][data-mode='find'] {\n grid-template-areas: 'find matches nav';\n}\n[data-search-grid][data-mode='find'] [data-replace-cell] {\n display: none;\n}\n\n@container search-panel (width < 400px) {\n [data-search-panel] [data-editor-widget] {\n padding: 10px;\n }\n [data-search-grid][data-mode='replace'] {\n grid-template-columns: auto 1fr auto;\n grid-template-areas:\n 'find find find'\n 'replace replace replace'\n 'nav matches actions';\n }\n [data-search-grid][data-mode='find'] {\n grid-template-columns: auto 1fr auto;\n grid-template-areas:\n 'find find find'\n 'nav matches matches';\n }\n [data-replace-actions] {\n justify-self: end;\n }\n [data-search-grid] [data-input-box] {\n width: auto;\n }\n}\n\n[data-input-box] {\n position: relative;\n display: flex;\n align-items: center;\n width: 200px;\n\n input {\n flex-grow: 1;\n width: 100%;\n min-width: 0;\n font-size: 13px;\n line-height: 24px;\n padding-inline: 6px;\n color: var(--diffs-fg);\n background-color: var(--diffs-bg);\n border: 1px solid color-mix(in lab, var(--diffs-fg) 12%, var(--diffs-bg));\n border-radius: 6px;\n outline: none;\n\n &::selection {\n background-color: color-mix(in lab, var(--diffs-fg) 8%, var(--diffs-bg));\n }\n\n &:focus-visible {\n outline: 1px solid var(--diffs-modified-base);\n }\n }\n\n &[data-find] input {\n /* Space for overlaid search icon toggles */\n padding-inline-end: 72px;\n }\n\n [data-search-icon] {\n --diffs-search-icon-size: 20px;\n }\n}\n\n[data-search-toggles] {\n position: absolute;\n top: 50%;\n right: 4px;\n transform: translateY(-50%);\n display: flex;\n align-items: center;\n gap: 1px;\n}\n\n[data-matches] {\n grid-area: matches;\n flex-shrink: 0;\n min-width: 50px;\n font-size: 12px;\n font-weight: 500;\n line-height: 20px;\n white-space: nowrap;\n color: color-mix(in lab, var(--diffs-fg) 50%, var(--diffs-bg));\n\n &[data-no-matches] {\n color: color-mix(in lab, var(--diffs-fg) 35%, var(--diffs-bg));\n }\n}\n\n[data-replace-actions],\n[data-search-nav] {\n display: flex;\n align-items: center;\n}\n\n/* Every clickable control is a real <button> tagged with data-search-icon;\n strip the UA chrome here so this single rule is the source of their\n appearance. */\n[data-search-icon] {\n display: flex;\n align-items: center;\n justify-content: center;\n appearance: none;\n flex-shrink: 0;\n width: var(--diffs-search-icon-size, 24px);\n height: var(--diffs-search-icon-size, 24px);\n margin: 0;\n padding: 0;\n color: color-mix(in lab, var(--diffs-fg) 65%, var(--diffs-bg));\n border: 0;\n border-radius: var(--diffs-search-icon-radius, 4px);\n background: none;\n cursor: pointer;\n transition:\n background-color 0.1s ease-in-out,\n color 0.1s ease-in-out;\n\n &:disabled {\n opacity: 0.25;\n cursor: default;\n }\n &:not(:disabled):hover {\n color: var(--diffs-fg);\n }\n &:focus-visible {\n outline: 1px solid var(--diffs-modified-base);\n }\n &[aria-pressed='true'] {\n color: var(--diffs-modified-base);\n }\n}\n\n[data-search-close] {\n --diffs-search-icon-size: 20px;\n --diffs-search-icon-radius: 50%;\n position: absolute;\n top: 0;\n right: 0;\n transform: translate(50%, -50%);\n color: var(--diffs-widget-bg);\n background-color: color-mix(\n in lab,\n var(--diffs-widget-fg) 50%,\n var(--diffs-bg)\n );\n\n &:not(:disabled):hover {\n opacity: 1;\n color: var(--diffs-widget-bg);\n background-color: var(--diffs-widget-fg);\n }\n}\n"],"mappings":";AAAA,IAAA,iBAAe"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"languages.d.ts","names":[],"sources":["../../src/editor/languages.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"languages.d.ts","names":[],"sources":["../../src/editor/languages.ts"],"mappings":";;;UAMiB;EACf;EACA,yBAAyB,cAAc;;KAG7B,oBAAoB,SAAS,eAAe;UAE9C;EACR;EACA,wBAAwB,cAAc;;;iBAwCxB,qBACd,oBACA,YAAY,oBACX;;iBAuBa,wBACd,cAAc,cACd,qBAAqB,mBACrB,gBACC;UA+Fc;EACf,OAAO;EACP,sBAAsB,gBAElB,eACA,aACA,WAAW;;;iBA+HD,yBACd,cAAc,cACd,qBAAqB,oBACpB,MAAM,mCACP,qBACC"}
|
package/dist/editor/languages.js
CHANGED
|
@@ -178,7 +178,7 @@ function findBlockComment(textDocument, open, close, from, to) {
|
|
|
178
178
|
contentStart: from,
|
|
179
179
|
contentEnd: to
|
|
180
180
|
};
|
|
181
|
-
const shortText = to - from <=
|
|
181
|
+
const shortText = to - from <= 100 ? textDocument.getTextSlice(from, to) : void 0;
|
|
182
182
|
const startText = shortText ?? textDocument.getTextSlice(from, from + BLOCK_COMMENT_SEARCH_MARGIN);
|
|
183
183
|
const endText = shortText ?? textDocument.getTextSlice(to - BLOCK_COMMENT_SEARCH_MARGIN, to);
|
|
184
184
|
const startSpace = startText.length - startText.trimStart().length;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"languages.js","names":[],"sources":["../../src/editor/languages.ts"],"sourcesContent":["import type { TextDocument } from './textDocument';\nimport type { EditorSelection, TextEdit } from './types';\n\nconst DEFAULT_LINE_COMMENT = '//';\nconst DEFAULT_BLOCK_COMMENT = ['/*', '*/'] as const;\n\nexport interface LanguageConfig {\n lineComment?: string | null;\n blockComment?: readonly [open: string, close: string];\n}\n\nexport type LanguageConfigMap = Readonly<Record<string, LanguageConfig>>;\n\ninterface ResolvedLanguageConfig {\n lineComment: string | null;\n blockComment: readonly [open: string, close: string];\n}\n\n// Language comment configurations\n// Languages matching DEFAULT_LINE_COMMENT and DEFAULT_BLOCK_COMMENT are omitted.\nconst LANGUAGE_COMMENT_CONFIGS: LanguageConfigMap = {\n sql: { lineComment: '--' },\n ruby: { lineComment: '#', blockComment: ['=begin', '=end'] },\n rst: { lineComment: '..' },\n coffeescript: { lineComment: '#', blockComment: ['###', '###'] },\n cmd: { lineComment: '@REM' },\n julia: { lineComment: '#', blockComment: ['#=', '=#'] },\n yaml: { lineComment: '#' },\n yml: { lineComment: '#' },\n markdown: { lineComment: null, blockComment: ['<!--', '-->'] },\n zsh: { lineComment: '#' },\n makefile: { lineComment: '#' },\n handlebars: { lineComment: null, blockComment: ['{{!--', '--}}'] },\n ini: { lineComment: ';', blockComment: [';', ' '] },\n powershell: { lineComment: '#', blockComment: ['<#', '#>'] },\n vb: { lineComment: \"'\" },\n xml: { lineComment: null, blockComment: ['<!--', '-->'] },\n lua: { lineComment: '--', blockComment: ['--[[', ']]'] },\n html: { lineComment: null, blockComment: ['<!--', '-->'] },\n diff: { lineComment: '#', blockComment: ['#', ' '] },\n r: { lineComment: '#' },\n fsharp: { blockComment: ['(*', '*)'] },\n pug: { lineComment: '//-' },\n perl: { lineComment: '#' },\n tex: { lineComment: '%' },\n clojure: { lineComment: ';;' },\n css: { lineComment: null },\n python: { lineComment: '#', blockComment: ['\"\"\"', '\"\"\"'] },\n dotenv: { lineComment: '#' },\n dockerfile: { lineComment: '#' },\n razor: { lineComment: null, blockComment: ['<!--', '-->'] },\n prompt: { lineComment: null, blockComment: ['<!--', '-->'] },\n};\n\n/** Resolves language-specific comment tokens over the editor defaults. */\nexport function resolveCommentConfig(\n languageId: string,\n overrides?: LanguageConfigMap\n): ResolvedLanguageConfig {\n const config = {\n ...LANGUAGE_COMMENT_CONFIGS[languageId],\n ...overrides?.[languageId],\n };\n return {\n lineComment:\n config.lineComment === undefined\n ? DEFAULT_LINE_COMMENT\n : config.lineComment,\n blockComment: config.blockComment ?? DEFAULT_BLOCK_COMMENT,\n };\n}\n\ninterface LineCommentInfo {\n line: number;\n comment: number;\n empty: boolean;\n indent: number;\n single: boolean;\n}\n\n/** Builds one aligned batch of line-comment edits for all selected lines. */\nexport function resolveLineCommentEdits(\n textDocument: TextDocument,\n selections: readonly EditorSelection[],\n token: string\n): TextEdit[] {\n const lines: LineCommentInfo[] = [];\n const seenLines = new Set<number>();\n\n for (const selection of selections) {\n let endLine = selection.end.line;\n if (selection.start.line < endLine && selection.end.character === 0) {\n endLine--;\n }\n\n const startIndex = lines.length;\n let minIndent = Infinity;\n for (let line = selection.start.line; line <= endLine; line++) {\n if (seenLines.has(line)) {\n continue;\n }\n seenLines.add(line);\n const text = textDocument.getLineText(line);\n const indent = text.length - text.trimStart().length;\n const empty = indent === text.length;\n if (!empty) {\n minIndent = Math.min(minIndent, indent);\n }\n lines.push({\n line,\n comment:\n text.slice(indent, indent + token.length) === token ? indent : -1,\n empty,\n indent,\n single: false,\n });\n }\n\n if (minIndent !== Infinity) {\n for (let index = startIndex; index < lines.length; index++) {\n if (!lines[index].empty) {\n lines[index].indent = minIndent;\n }\n }\n }\n if (lines.length === startIndex + 1) {\n lines[startIndex].single = true;\n }\n }\n\n const shouldComment = lines.some(\n (line) => line.comment < 0 && (!line.empty || line.single)\n );\n const edits: TextEdit[] = [];\n if (shouldComment) {\n for (const line of lines) {\n if (line.empty && !line.single) {\n continue;\n }\n const position = { line: line.line, character: line.indent };\n edits.push({\n range: { start: position, end: position },\n newText: token + ' ',\n });\n }\n return edits;\n }\n\n for (const line of lines) {\n if (line.comment < 0) {\n continue;\n }\n const text = textDocument.getLineText(line.line);\n const start = line.comment;\n const end =\n start + token.length + (text[start + token.length] === ' ' ? 1 : 0);\n edits.push({\n range: {\n start: { line: line.line, character: start },\n end: { line: line.line, character: end },\n },\n newText: '',\n });\n }\n return edits;\n}\n\ninterface OffsetEdit {\n start: number;\n end: number;\n text: string;\n}\n\ninterface BlockCommentMatch {\n open: OffsetEdit;\n close: OffsetEdit;\n contentStart: number;\n contentEnd: number;\n}\n\nexport interface BlockCommentEditResult {\n edits: TextEdit[];\n nextSelectionOffsets: Array<\n readonly [\n start: number,\n end: number,\n direction: EditorSelection['direction'],\n ]\n >;\n}\n\nconst BLOCK_COMMENT_SEARCH_MARGIN = 50;\n\nfunction findBlockComment(\n textDocument: TextDocument,\n open: string,\n close: string,\n from: number,\n to: number\n): BlockCommentMatch | undefined {\n const beforeStart = Math.max(0, from - BLOCK_COMMENT_SEARCH_MARGIN);\n const textBefore = textDocument.getTextSlice(beforeStart, from);\n const textAfter = textDocument.getTextSlice(\n to,\n to + BLOCK_COMMENT_SEARCH_MARGIN\n );\n const spaceBefore = textBefore.length - textBefore.trimEnd().length;\n const spaceAfter = textAfter.length - textAfter.trimStart().length;\n const beforeOffset = textBefore.length - spaceBefore;\n if (\n textBefore.slice(beforeOffset - open.length, beforeOffset) === open &&\n textAfter.slice(spaceAfter, spaceAfter + close.length) === close\n ) {\n return {\n open: {\n start: from - spaceBefore - open.length,\n end: from - spaceBefore + (spaceBefore > 0 ? 1 : 0),\n text: '',\n },\n close: {\n start: to + spaceAfter - (spaceAfter > 0 ? 1 : 0),\n end: to + spaceAfter + close.length,\n text: '',\n },\n contentStart: from,\n contentEnd: to,\n };\n }\n\n const length = to - from;\n const shortText =\n length <= BLOCK_COMMENT_SEARCH_MARGIN * 2\n ? textDocument.getTextSlice(from, to)\n : undefined;\n const startText =\n shortText ??\n textDocument.getTextSlice(from, from + BLOCK_COMMENT_SEARCH_MARGIN);\n const endText =\n shortText ??\n textDocument.getTextSlice(to - BLOCK_COMMENT_SEARCH_MARGIN, to);\n const startSpace = startText.length - startText.trimStart().length;\n const endSpace = endText.length - endText.trimEnd().length;\n const closeStart = to - endSpace - close.length;\n if (\n startText.slice(startSpace, startSpace + open.length) !== open ||\n textDocument.getTextSlice(closeStart, closeStart + close.length) !== close\n ) {\n return undefined;\n }\n\n const openStart = from + startSpace;\n const openEnd =\n openStart +\n open.length +\n (/\\s/.test(startText[open.length + startSpace] ?? '') ? 1 : 0);\n const closeDeleteStart =\n closeStart -\n (/\\s/.test(textDocument.getTextSlice(closeStart - 1, closeStart)) ? 1 : 0);\n return {\n open: { start: openStart, end: openEnd, text: '' },\n close: {\n start: closeDeleteStart,\n end: closeStart + close.length,\n text: '',\n },\n contentStart: openEnd,\n contentEnd: closeDeleteStart,\n };\n}\n\nfunction mapOffset(\n offset: number,\n edits: readonly OffsetEdit[],\n cumulativeDeltas: readonly number[],\n association: -1 | 1\n): number {\n let low = 0;\n let high = edits.length;\n while (low < high) {\n const middle = (low + high) >>> 1;\n if (edits[middle].end < offset) {\n low = middle + 1;\n } else {\n high = middle;\n }\n }\n\n let delta = cumulativeDeltas[low];\n for (let index = low; index < edits.length; index++) {\n const edit = edits[index];\n if (offset < edit.start) {\n break;\n }\n if (edit.start === edit.end && offset === edit.start) {\n if (association < 0) {\n break;\n }\n delta += edit.text.length;\n continue;\n }\n if (offset > edit.end) {\n delta += edit.text.length - (edit.end - edit.start);\n continue;\n }\n if (offset === edit.end) {\n return edit.start + delta + edit.text.length;\n }\n return edit.start + delta + (association > 0 ? edit.text.length : 0);\n }\n return offset + delta;\n}\n\n/** Builds block-comment edits and content-preserving post-edit selections. */\nexport function resolveBlockCommentEdits(\n textDocument: TextDocument,\n selections: readonly EditorSelection[],\n [open, close]: readonly [string, string],\n linewise = false\n): BlockCommentEditResult | undefined {\n const ranges = selections.map((selection) => {\n let { start, end } = selection;\n if (linewise) {\n let endLine = end.line;\n if (start.line < endLine && end.character === 0) {\n endLine--;\n }\n const firstLine = textDocument.getLineText(start.line);\n const indent = firstLine.length - firstLine.trimStart().length;\n start = { line: start.line, character: indent };\n end = {\n line: endLine,\n character: textDocument.getLineLength(endLine),\n };\n }\n return {\n from: textDocument.offsetAt(start),\n to: textDocument.offsetAt(end),\n direction: selection.direction,\n comment: undefined as BlockCommentMatch | undefined,\n };\n });\n if (linewise && ranges.length > 1) {\n ranges.sort((a, b) => {\n const startOrder = a.from - b.from;\n return startOrder !== 0 ? startOrder : a.to - b.to;\n });\n let lastRangeIndex = 0;\n for (let index = 1; index < ranges.length; index++) {\n const previous = ranges[lastRangeIndex];\n const current = ranges[index];\n if (current.from <= previous.to) {\n previous.to = Math.max(previous.to, current.to);\n } else {\n ranges[++lastRangeIndex] = current;\n }\n }\n ranges.length = lastRangeIndex + 1;\n }\n for (const range of ranges) {\n range.comment = findBlockComment(\n textDocument,\n open,\n close,\n range.from,\n range.to\n );\n }\n\n const shouldUncomment = ranges.every((range) => range.comment !== undefined);\n const offsetEdits: OffsetEdit[] = [];\n for (const range of ranges) {\n const comment = range.comment;\n if (shouldUncomment && comment !== undefined) {\n offsetEdits.push(comment.open, comment.close);\n continue;\n }\n if (comment !== undefined) {\n continue;\n }\n if (range.from === range.to) {\n offsetEdits.push({\n start: range.from,\n end: range.to,\n text: open + ' ' + close,\n });\n continue;\n }\n offsetEdits.push(\n { start: range.from, end: range.from, text: open + ' ' },\n { start: range.to, end: range.to, text: ' ' + close }\n );\n }\n\n if (offsetEdits.length === 0) {\n return undefined;\n }\n offsetEdits.sort((a, b) => {\n const startOrder = a.start - b.start;\n return startOrder !== 0 ? startOrder : a.end - b.end;\n });\n const edits = offsetEdits.map((edit) => ({\n range: {\n start: textDocument.positionAt(edit.start),\n end: textDocument.positionAt(edit.end),\n },\n newText: edit.text,\n }));\n if (linewise) {\n return { edits, nextSelectionOffsets: [] };\n }\n\n const logicalRanges: Array<{\n start: number;\n end: number;\n startAssociation: -1 | 1;\n endAssociation: -1 | 1;\n collapsedInset?: number;\n }> = ranges.map((range) => {\n const comment = range.comment;\n if (shouldUncomment && comment !== undefined) {\n return {\n start: comment.contentStart,\n end: comment.contentEnd,\n startAssociation: 1,\n endAssociation: -1,\n };\n }\n if (comment !== undefined) {\n return {\n start: range.from,\n end: range.to,\n startAssociation: 1,\n endAssociation: 1,\n };\n }\n if (range.from === range.to) {\n return {\n start: range.from,\n end: range.to,\n startAssociation: -1,\n endAssociation: -1,\n collapsedInset: open.length + 1,\n };\n }\n return {\n start: range.from,\n end: range.to,\n startAssociation: 1,\n endAssociation: -1,\n };\n });\n const cumulativeDeltas = new Array<number>(offsetEdits.length + 1);\n cumulativeDeltas[0] = 0;\n for (let index = 0; index < offsetEdits.length; index++) {\n const edit = offsetEdits[index];\n cumulativeDeltas[index + 1] =\n cumulativeDeltas[index] + edit.text.length - (edit.end - edit.start);\n }\n const nextSelectionOffsets = logicalRanges.map((range, index) => {\n const start =\n mapOffset(\n range.start,\n offsetEdits,\n cumulativeDeltas,\n range.startAssociation\n ) + (range.collapsedInset ?? 0);\n const end =\n range.collapsedInset === undefined\n ? mapOffset(\n range.end,\n offsetEdits,\n cumulativeDeltas,\n range.endAssociation\n )\n : start;\n return [start, end, ranges[index].direction] as const;\n });\n\n return {\n edits,\n nextSelectionOffsets,\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"languages.js","names":[],"sources":["../../src/editor/languages.ts"],"sourcesContent":["import type { TextDocument } from './textDocument';\nimport type { EditorSelection, TextEdit } from './types';\n\nconst DEFAULT_LINE_COMMENT = '//';\nconst DEFAULT_BLOCK_COMMENT = ['/*', '*/'] as const;\n\nexport interface LanguageConfig {\n lineComment?: string | null;\n blockComment?: readonly [open: string, close: string];\n}\n\nexport type LanguageConfigMap = Readonly<Record<string, LanguageConfig>>;\n\ninterface ResolvedLanguageConfig {\n lineComment: string | null;\n blockComment: readonly [open: string, close: string];\n}\n\n// Language comment configurations\n// Languages matching DEFAULT_LINE_COMMENT and DEFAULT_BLOCK_COMMENT are omitted.\nconst LANGUAGE_COMMENT_CONFIGS: LanguageConfigMap = {\n sql: { lineComment: '--' },\n ruby: { lineComment: '#', blockComment: ['=begin', '=end'] },\n rst: { lineComment: '..' },\n coffeescript: { lineComment: '#', blockComment: ['###', '###'] },\n cmd: { lineComment: '@REM' },\n julia: { lineComment: '#', blockComment: ['#=', '=#'] },\n yaml: { lineComment: '#' },\n yml: { lineComment: '#' },\n markdown: { lineComment: null, blockComment: ['<!--', '-->'] },\n zsh: { lineComment: '#' },\n makefile: { lineComment: '#' },\n handlebars: { lineComment: null, blockComment: ['{{!--', '--}}'] },\n ini: { lineComment: ';', blockComment: [';', ' '] },\n powershell: { lineComment: '#', blockComment: ['<#', '#>'] },\n vb: { lineComment: \"'\" },\n xml: { lineComment: null, blockComment: ['<!--', '-->'] },\n lua: { lineComment: '--', blockComment: ['--[[', ']]'] },\n html: { lineComment: null, blockComment: ['<!--', '-->'] },\n diff: { lineComment: '#', blockComment: ['#', ' '] },\n r: { lineComment: '#' },\n fsharp: { blockComment: ['(*', '*)'] },\n pug: { lineComment: '//-' },\n perl: { lineComment: '#' },\n tex: { lineComment: '%' },\n clojure: { lineComment: ';;' },\n css: { lineComment: null },\n python: { lineComment: '#', blockComment: ['\"\"\"', '\"\"\"'] },\n dotenv: { lineComment: '#' },\n dockerfile: { lineComment: '#' },\n razor: { lineComment: null, blockComment: ['<!--', '-->'] },\n prompt: { lineComment: null, blockComment: ['<!--', '-->'] },\n};\n\n/** Resolves language-specific comment tokens over the editor defaults. */\nexport function resolveCommentConfig(\n languageId: string,\n overrides?: LanguageConfigMap\n): ResolvedLanguageConfig {\n const config = {\n ...LANGUAGE_COMMENT_CONFIGS[languageId],\n ...overrides?.[languageId],\n };\n return {\n lineComment:\n config.lineComment === undefined\n ? DEFAULT_LINE_COMMENT\n : config.lineComment,\n blockComment: config.blockComment ?? DEFAULT_BLOCK_COMMENT,\n };\n}\n\ninterface LineCommentInfo {\n line: number;\n comment: number;\n empty: boolean;\n indent: number;\n single: boolean;\n}\n\n/** Builds one aligned batch of line-comment edits for all selected lines. */\nexport function resolveLineCommentEdits(\n textDocument: TextDocument,\n selections: readonly EditorSelection[],\n token: string\n): TextEdit[] {\n const lines: LineCommentInfo[] = [];\n const seenLines = new Set<number>();\n\n for (const selection of selections) {\n let endLine = selection.end.line;\n if (selection.start.line < endLine && selection.end.character === 0) {\n endLine--;\n }\n\n const startIndex = lines.length;\n let minIndent = Infinity;\n for (let line = selection.start.line; line <= endLine; line++) {\n if (seenLines.has(line)) {\n continue;\n }\n seenLines.add(line);\n const text = textDocument.getLineText(line);\n const indent = text.length - text.trimStart().length;\n const empty = indent === text.length;\n if (!empty) {\n minIndent = Math.min(minIndent, indent);\n }\n lines.push({\n line,\n comment:\n text.slice(indent, indent + token.length) === token ? indent : -1,\n empty,\n indent,\n single: false,\n });\n }\n\n if (minIndent !== Infinity) {\n for (let index = startIndex; index < lines.length; index++) {\n if (!lines[index].empty) {\n lines[index].indent = minIndent;\n }\n }\n }\n if (lines.length === startIndex + 1) {\n lines[startIndex].single = true;\n }\n }\n\n const shouldComment = lines.some(\n (line) => line.comment < 0 && (!line.empty || line.single)\n );\n const edits: TextEdit[] = [];\n if (shouldComment) {\n for (const line of lines) {\n if (line.empty && !line.single) {\n continue;\n }\n const position = { line: line.line, character: line.indent };\n edits.push({\n range: { start: position, end: position },\n newText: token + ' ',\n });\n }\n return edits;\n }\n\n for (const line of lines) {\n if (line.comment < 0) {\n continue;\n }\n const text = textDocument.getLineText(line.line);\n const start = line.comment;\n const end =\n start + token.length + (text[start + token.length] === ' ' ? 1 : 0);\n edits.push({\n range: {\n start: { line: line.line, character: start },\n end: { line: line.line, character: end },\n },\n newText: '',\n });\n }\n return edits;\n}\n\ninterface OffsetEdit {\n start: number;\n end: number;\n text: string;\n}\n\ninterface BlockCommentMatch {\n open: OffsetEdit;\n close: OffsetEdit;\n contentStart: number;\n contentEnd: number;\n}\n\nexport interface BlockCommentEditResult {\n edits: TextEdit[];\n nextSelectionOffsets: Array<\n readonly [\n start: number,\n end: number,\n direction: EditorSelection['direction'],\n ]\n >;\n}\n\nconst BLOCK_COMMENT_SEARCH_MARGIN = 50;\n\nfunction findBlockComment(\n textDocument: TextDocument,\n open: string,\n close: string,\n from: number,\n to: number\n): BlockCommentMatch | undefined {\n const beforeStart = Math.max(0, from - BLOCK_COMMENT_SEARCH_MARGIN);\n const textBefore = textDocument.getTextSlice(beforeStart, from);\n const textAfter = textDocument.getTextSlice(\n to,\n to + BLOCK_COMMENT_SEARCH_MARGIN\n );\n const spaceBefore = textBefore.length - textBefore.trimEnd().length;\n const spaceAfter = textAfter.length - textAfter.trimStart().length;\n const beforeOffset = textBefore.length - spaceBefore;\n if (\n textBefore.slice(beforeOffset - open.length, beforeOffset) === open &&\n textAfter.slice(spaceAfter, spaceAfter + close.length) === close\n ) {\n return {\n open: {\n start: from - spaceBefore - open.length,\n end: from - spaceBefore + (spaceBefore > 0 ? 1 : 0),\n text: '',\n },\n close: {\n start: to + spaceAfter - (spaceAfter > 0 ? 1 : 0),\n end: to + spaceAfter + close.length,\n text: '',\n },\n contentStart: from,\n contentEnd: to,\n };\n }\n\n const length = to - from;\n const shortText =\n length <= BLOCK_COMMENT_SEARCH_MARGIN * 2\n ? textDocument.getTextSlice(from, to)\n : undefined;\n const startText =\n shortText ??\n textDocument.getTextSlice(from, from + BLOCK_COMMENT_SEARCH_MARGIN);\n const endText =\n shortText ??\n textDocument.getTextSlice(to - BLOCK_COMMENT_SEARCH_MARGIN, to);\n const startSpace = startText.length - startText.trimStart().length;\n const endSpace = endText.length - endText.trimEnd().length;\n const closeStart = to - endSpace - close.length;\n if (\n startText.slice(startSpace, startSpace + open.length) !== open ||\n textDocument.getTextSlice(closeStart, closeStart + close.length) !== close\n ) {\n return undefined;\n }\n\n const openStart = from + startSpace;\n const openEnd =\n openStart +\n open.length +\n (/\\s/.test(startText[open.length + startSpace] ?? '') ? 1 : 0);\n const closeDeleteStart =\n closeStart -\n (/\\s/.test(textDocument.getTextSlice(closeStart - 1, closeStart)) ? 1 : 0);\n return {\n open: { start: openStart, end: openEnd, text: '' },\n close: {\n start: closeDeleteStart,\n end: closeStart + close.length,\n text: '',\n },\n contentStart: openEnd,\n contentEnd: closeDeleteStart,\n };\n}\n\nfunction mapOffset(\n offset: number,\n edits: readonly OffsetEdit[],\n cumulativeDeltas: readonly number[],\n association: -1 | 1\n): number {\n let low = 0;\n let high = edits.length;\n while (low < high) {\n const middle = (low + high) >>> 1;\n if (edits[middle].end < offset) {\n low = middle + 1;\n } else {\n high = middle;\n }\n }\n\n let delta = cumulativeDeltas[low];\n for (let index = low; index < edits.length; index++) {\n const edit = edits[index];\n if (offset < edit.start) {\n break;\n }\n if (edit.start === edit.end && offset === edit.start) {\n if (association < 0) {\n break;\n }\n delta += edit.text.length;\n continue;\n }\n if (offset > edit.end) {\n delta += edit.text.length - (edit.end - edit.start);\n continue;\n }\n if (offset === edit.end) {\n return edit.start + delta + edit.text.length;\n }\n return edit.start + delta + (association > 0 ? edit.text.length : 0);\n }\n return offset + delta;\n}\n\n/** Builds block-comment edits and content-preserving post-edit selections. */\nexport function resolveBlockCommentEdits(\n textDocument: TextDocument,\n selections: readonly EditorSelection[],\n [open, close]: readonly [string, string],\n linewise = false\n): BlockCommentEditResult | undefined {\n const ranges = selections.map((selection) => {\n let { start, end } = selection;\n if (linewise) {\n let endLine = end.line;\n if (start.line < endLine && end.character === 0) {\n endLine--;\n }\n const firstLine = textDocument.getLineText(start.line);\n const indent = firstLine.length - firstLine.trimStart().length;\n start = { line: start.line, character: indent };\n end = {\n line: endLine,\n character: textDocument.getLineLength(endLine),\n };\n }\n return {\n from: textDocument.offsetAt(start),\n to: textDocument.offsetAt(end),\n direction: selection.direction,\n comment: undefined as BlockCommentMatch | undefined,\n };\n });\n if (linewise && ranges.length > 1) {\n ranges.sort((a, b) => {\n const startOrder = a.from - b.from;\n return startOrder !== 0 ? startOrder : a.to - b.to;\n });\n let lastRangeIndex = 0;\n for (let index = 1; index < ranges.length; index++) {\n const previous = ranges[lastRangeIndex];\n const current = ranges[index];\n if (current.from <= previous.to) {\n previous.to = Math.max(previous.to, current.to);\n } else {\n ranges[++lastRangeIndex] = current;\n }\n }\n ranges.length = lastRangeIndex + 1;\n }\n for (const range of ranges) {\n range.comment = findBlockComment(\n textDocument,\n open,\n close,\n range.from,\n range.to\n );\n }\n\n const shouldUncomment = ranges.every((range) => range.comment !== undefined);\n const offsetEdits: OffsetEdit[] = [];\n for (const range of ranges) {\n const comment = range.comment;\n if (shouldUncomment && comment !== undefined) {\n offsetEdits.push(comment.open, comment.close);\n continue;\n }\n if (comment !== undefined) {\n continue;\n }\n if (range.from === range.to) {\n offsetEdits.push({\n start: range.from,\n end: range.to,\n text: open + ' ' + close,\n });\n continue;\n }\n offsetEdits.push(\n { start: range.from, end: range.from, text: open + ' ' },\n { start: range.to, end: range.to, text: ' ' + close }\n );\n }\n\n if (offsetEdits.length === 0) {\n return undefined;\n }\n offsetEdits.sort((a, b) => {\n const startOrder = a.start - b.start;\n return startOrder !== 0 ? startOrder : a.end - b.end;\n });\n const edits = offsetEdits.map((edit) => ({\n range: {\n start: textDocument.positionAt(edit.start),\n end: textDocument.positionAt(edit.end),\n },\n newText: edit.text,\n }));\n if (linewise) {\n return { edits, nextSelectionOffsets: [] };\n }\n\n const logicalRanges: Array<{\n start: number;\n end: number;\n startAssociation: -1 | 1;\n endAssociation: -1 | 1;\n collapsedInset?: number;\n }> = ranges.map((range) => {\n const comment = range.comment;\n if (shouldUncomment && comment !== undefined) {\n return {\n start: comment.contentStart,\n end: comment.contentEnd,\n startAssociation: 1,\n endAssociation: -1,\n };\n }\n if (comment !== undefined) {\n return {\n start: range.from,\n end: range.to,\n startAssociation: 1,\n endAssociation: 1,\n };\n }\n if (range.from === range.to) {\n return {\n start: range.from,\n end: range.to,\n startAssociation: -1,\n endAssociation: -1,\n collapsedInset: open.length + 1,\n };\n }\n return {\n start: range.from,\n end: range.to,\n startAssociation: 1,\n endAssociation: -1,\n };\n });\n const cumulativeDeltas = new Array<number>(offsetEdits.length + 1);\n cumulativeDeltas[0] = 0;\n for (let index = 0; index < offsetEdits.length; index++) {\n const edit = offsetEdits[index];\n cumulativeDeltas[index + 1] =\n cumulativeDeltas[index] + edit.text.length - (edit.end - edit.start);\n }\n const nextSelectionOffsets = logicalRanges.map((range, index) => {\n const start =\n mapOffset(\n range.start,\n offsetEdits,\n cumulativeDeltas,\n range.startAssociation\n ) + (range.collapsedInset ?? 0);\n const end =\n range.collapsedInset === undefined\n ? mapOffset(\n range.end,\n offsetEdits,\n cumulativeDeltas,\n range.endAssociation\n )\n : start;\n return [start, end, ranges[index].direction] as const;\n });\n\n return {\n edits,\n nextSelectionOffsets,\n };\n}\n"],"mappings":"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"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { TextDocumentChange } from "./textDocument.js";
|
|
2
2
|
import { LineAnnotationPosition } from "../utils/lineAnnotationIdentity.js";
|
|
3
|
-
|
|
4
3
|
//#region src/editor/lineAnnotations.d.ts
|
|
5
4
|
declare function applyDocumentChangeToLineAnnotations<TLineAnnotation extends LineAnnotationPosition>(change: TextDocumentChange, lineAnnotations: TLineAnnotation[]): TLineAnnotation[] | undefined;
|
|
6
5
|
declare function renderLineAnnotations<TLineAnnotation extends LineAnnotationPosition>(lineAnnotations: TLineAnnotation[], contentEl: HTMLElement, gutterEl?: HTMLElement, getName?: (annotation: TLineAnnotation) => string): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lineAnnotations.d.ts","names":[],"sources":["../../src/editor/lineAnnotations.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"lineAnnotations.d.ts","names":[],"sources":["../../src/editor/lineAnnotations.ts"],"mappings":";;;iBAwBgB,qCACd,wBAAwB,wBAExB,QAAQ,oBACR,iBAAiB,oBAChB;iBAmNa,sBACd,wBAAwB,wBAExB,iBAAiB,mBACjB,WAAW,aACX,WAAW,aACX,WACE,YAAY"}
|
|
@@ -157,8 +157,9 @@ function createLineAnnotationElements(lineAnnotations, contentEl, gutterEl) {
|
|
|
157
157
|
if (lineNumber !== void 0) {
|
|
158
158
|
const annotations = lineAnnotations.get(lineNumber);
|
|
159
159
|
if (annotations !== void 0) {
|
|
160
|
+
const lineIndex = lineNumber - 1;
|
|
160
161
|
const annotationElement = h("div", {
|
|
161
|
-
dataset: { lineAnnotation: "0," +
|
|
162
|
+
dataset: { lineAnnotation: "0," + lineIndex },
|
|
162
163
|
children: [h("div", {
|
|
163
164
|
dataset: "annotationContent",
|
|
164
165
|
children: annotations.map((name) => h("slot", { name }))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lineAnnotations.js","names":[],"sources":["../../src/editor/lineAnnotations.ts"],"sourcesContent":["import { getLineAnnotationName } from '../utils/getLineAnnotationName';\nimport {\n getLineAnnotationSource,\n type LineAnnotationPosition,\n recordLineAnnotationSource,\n} from '../utils/lineAnnotationIdentity';\nimport type { TextDocumentChange } from './textDocument';\nimport { getLineNumberAttr, h } from './utils';\n\ninterface LineAnnotationChange {\n readonly startLine: number;\n readonly startCharacter: number;\n readonly endLine: number;\n readonly deletesEndLine: boolean;\n readonly insertedLineBreaks: number;\n readonly lineDelta: number;\n}\n\nfunction getDefaultLineAnnotationName(\n annotation: LineAnnotationPosition\n): string {\n return getLineAnnotationName(annotation);\n}\n\nexport function applyDocumentChangeToLineAnnotations<\n TLineAnnotation extends LineAnnotationPosition,\n>(\n change: TextDocumentChange,\n lineAnnotations: TLineAnnotation[]\n): TLineAnnotation[] | undefined {\n const annotationChanges = getLineAnnotationChanges(change);\n if (annotationChanges.length === 0) {\n return undefined;\n }\n\n const nextLineAnnotations: TLineAnnotation[] = [];\n let changed = false;\n for (const annotation of lineAnnotations) {\n if (\n ('side' in annotation && annotation.side === 'deletions') ||\n annotation.lineNumber <= 0\n ) {\n // Annotations that should not be repositioned\n nextLineAnnotations.push(annotation);\n continue;\n }\n\n let line: number | undefined = annotation.lineNumber - 1;\n let lineCount = change.previousLineCount;\n let annotationChanged = false;\n for (const lineChange of annotationChanges) {\n const nextLineCount = Math.max(1, lineCount + lineChange.lineDelta);\n const nextLine = mapLineThroughLineChange(\n line,\n lineChange,\n nextLineCount\n );\n if (nextLine === undefined) {\n annotationChanged = true;\n line = undefined;\n break;\n }\n if (\n nextLine !== line ||\n lineChangeTouchesAnnotationLine(line, lineChange)\n ) {\n annotationChanged = true;\n }\n line = nextLine;\n lineCount = nextLineCount;\n }\n\n if (line === undefined) {\n changed = true;\n continue;\n }\n\n const lineNumber = line + 1;\n if (annotationChanged) {\n if (lineNumber === annotation.lineNumber) {\n nextLineAnnotations.push(annotation);\n } else {\n const moved = { ...annotation, lineNumber };\n recordLineAnnotationSource(moved, getLineAnnotationSource(annotation));\n nextLineAnnotations.push(moved);\n }\n changed = true;\n continue;\n }\n\n nextLineAnnotations.push(annotation);\n }\n\n return changed ? nextLineAnnotations : undefined;\n}\n\nfunction getLineAnnotationChanges(\n change: TextDocumentChange\n): readonly LineAnnotationChange[] {\n if (change.changedLineChanges !== undefined) {\n return change.changedLineChanges.flatMap(\n ([\n startLine,\n changedEndLine,\n lineDelta,\n startCharacter = 0,\n _endCharacter = 0,\n endedAtDocumentEnd = false,\n ]) => {\n if (lineDelta === 0) {\n return [];\n }\n const insertedLineBreaks = Math.max(0, changedEndLine - startLine);\n const removedLineCount = Math.max(0, insertedLineBreaks - lineDelta);\n return [\n {\n startLine,\n startCharacter,\n endLine: startLine + removedLineCount,\n deletesEndLine: lineDelta < 0 && endedAtDocumentEnd,\n insertedLineBreaks,\n lineDelta,\n },\n ];\n }\n );\n }\n\n if (change.lineDelta === 0) {\n return change.changedLineRanges.flatMap(([startLine, endLine]) => {\n const insertedLineBreaks = endLine - startLine;\n if (insertedLineBreaks <= 0) {\n return [];\n }\n return [\n {\n startLine,\n startCharacter: 0,\n endLine: startLine,\n deletesEndLine: false,\n insertedLineBreaks,\n lineDelta: insertedLineBreaks,\n },\n ];\n });\n }\n const removedLineCount = Math.max(0, -change.lineDelta);\n const deletedToDocumentEnd =\n change.endedAtDocumentEnd &&\n change.startLine + removedLineCount === change.previousLineCount - 1;\n return [\n {\n startLine: change.startLine,\n startCharacter: change.startCharacter,\n endLine: change.startLine + removedLineCount,\n deletesEndLine: deletedToDocumentEnd,\n insertedLineBreaks: Math.max(0, change.lineDelta),\n lineDelta: change.lineDelta,\n },\n ];\n}\n\nfunction mapLineThroughLineChange(\n line: number,\n lineChange: LineAnnotationChange,\n nextLineCount: number\n): number | undefined {\n if (line < lineChange.startLine) {\n return line;\n }\n\n if (\n line > lineChange.endLine ||\n (lineChange.endLine > lineChange.startLine &&\n line === lineChange.endLine &&\n !lineChange.deletesEndLine)\n ) {\n return line + lineChange.lineDelta;\n }\n\n if (lineChange.startLine === lineChange.endLine) {\n if (lineChange.startCharacter === 0) {\n return line + lineChange.insertedLineBreaks;\n }\n return line;\n }\n\n if (lineChangeDeletesAnnotationLine(line, lineChange)) {\n return undefined;\n }\n\n const replacementLineOffset = Math.min(\n Math.max(0, line - lineChange.startLine),\n lineChange.insertedLineBreaks\n );\n return clampLine(lineChange.startLine + replacementLineOffset, nextLineCount);\n}\n\nfunction lineChangeDeletesAnnotationLine(\n line: number,\n lineChange: LineAnnotationChange\n): boolean {\n if (\n lineChange.lineDelta >= 0 ||\n line < lineChange.startLine ||\n line > lineChange.endLine\n ) {\n return false;\n }\n if (line === lineChange.startLine && lineChange.startCharacter > 0) {\n return false;\n }\n if (line === lineChange.endLine && !lineChange.deletesEndLine) {\n return false;\n }\n return true;\n}\n\nfunction lineChangeTouchesAnnotationLine(\n line: number,\n lineChange: LineAnnotationChange\n): boolean {\n if (\n lineChange.lineDelta === 0 ||\n line < lineChange.startLine ||\n line > lineChange.endLine\n ) {\n return false;\n }\n return !(\n lineChange.endLine > lineChange.startLine &&\n line === lineChange.endLine &&\n !lineChange.deletesEndLine\n );\n}\n\nfunction clampLine(line: number, lineCount: number): number {\n return Math.max(0, Math.min(line, Math.max(0, lineCount - 1)));\n}\n\nexport function renderLineAnnotations<\n TLineAnnotation extends LineAnnotationPosition,\n>(\n lineAnnotations: TLineAnnotation[],\n contentEl: HTMLElement,\n gutterEl?: HTMLElement,\n getName: (\n annotation: TLineAnnotation\n ) => string = getDefaultLineAnnotationName\n): void {\n const additionAnnotations = new Map<number, string[]>();\n const deletionAnnotations = new Map<number, string[]>();\n for (const annotation of lineAnnotations) {\n const lineNumber = annotation.lineNumber;\n if (!additionAnnotations.has(lineNumber)) {\n additionAnnotations.set(lineNumber, []);\n }\n if (!deletionAnnotations.has(lineNumber)) {\n deletionAnnotations.set(lineNumber, []);\n }\n const map =\n 'side' in annotation && annotation.side === 'deletions'\n ? deletionAnnotations\n : additionAnnotations;\n map.get(lineNumber)!.push(getName(annotation));\n }\n\n const leftCodeElement = contentEl.parentElement?.previousElementSibling;\n let leftGutterElement: HTMLElement | undefined;\n let leftContentElement: HTMLElement | undefined;\n if (\n leftCodeElement != null &&\n leftCodeElement instanceof HTMLElement &&\n leftCodeElement.dataset.deletions !== undefined\n ) {\n for (const child of leftCodeElement.children) {\n const el = child as HTMLElement;\n const { gutter, content } = el.dataset;\n if (gutter !== undefined) {\n leftGutterElement = el;\n } else if (content !== undefined) {\n leftContentElement = el;\n }\n }\n }\n\n cleanLineAnnotationElements(contentEl, gutterEl);\n if (leftContentElement !== undefined) {\n cleanLineAnnotationElements(leftContentElement, leftGutterElement);\n }\n\n const additionsAnnotationElements = createLineAnnotationElements(\n additionAnnotations,\n contentEl,\n gutterEl\n );\n if (leftContentElement === undefined) {\n return;\n }\n\n const deletionsAnnotationElements = createLineAnnotationElements(\n deletionAnnotations,\n leftContentElement,\n leftGutterElement\n );\n\n requestAnimationFrame(() => {\n syncPairedLineAnnotationHeights(\n additionAnnotations,\n deletionAnnotations,\n additionsAnnotationElements,\n deletionsAnnotationElements\n );\n });\n}\n\nfunction cleanLineAnnotationElements(\n contentEl: HTMLElement,\n gutterEl?: HTMLElement\n): void {\n const staleElements: HTMLElement[] = [];\n for (let i = 1; i < contentEl.childElementCount; i++) {\n const el = contentEl.children[i] as HTMLElement;\n if (el.dataset.lineAnnotation !== undefined) {\n staleElements.push(el);\n if (gutterEl !== undefined) {\n staleElements.push(gutterEl.children[i] as HTMLElement);\n }\n }\n }\n for (const el of staleElements) {\n el.remove();\n }\n}\n\nfunction createLineAnnotationElements(\n lineAnnotations: Map<number, string[]>,\n contentEl: HTMLElement,\n gutterEl?: HTMLElement\n): Map<number, HTMLElement> {\n const annotationElements = new Map<number, HTMLElement>();\n for (const el of contentEl.children) {\n const lineNumber = getLineNumberAttr(el as HTMLElement);\n if (lineNumber !== undefined) {\n const annotations = lineAnnotations.get(lineNumber);\n if (annotations !== undefined) {\n const lineIndex = lineNumber - 1;\n const annotationElement = h('div', {\n dataset: {\n lineAnnotation: '0,' + lineIndex,\n },\n children: [\n h('div', {\n dataset: 'annotationContent',\n children: annotations.map((name) => h('slot', { name })),\n }),\n ],\n });\n el.after(annotationElement);\n annotationElements.set(lineNumber, annotationElement);\n }\n }\n }\n\n if (gutterEl !== undefined) {\n for (const el of gutterEl.children) {\n const lineNumber = getLineNumberAttr(el as HTMLElement, 'columnNumber');\n if (lineNumber !== undefined && lineAnnotations.has(lineNumber)) {\n const bufferEl = h('div', {\n dataset: {\n gutterBuffer: 'annotation',\n bufferSize: '1',\n },\n style: {\n gridRow: 'span 1',\n },\n });\n el.after(bufferEl);\n }\n }\n }\n\n return annotationElements;\n}\n\nfunction syncPairedLineAnnotationHeights(\n additionAnnotations: Map<number, string[]>,\n deletionAnnotations: Map<number, string[]>,\n additionAnnotationElements: Map<number, HTMLElement>,\n deletionAnnotationElements: Map<number, HTMLElement>\n): void {\n const offsetHeights = new Map<number, number>();\n for (const [lineNumber, annotations] of additionAnnotations.entries()) {\n const annotationElement = deletionAnnotationElements.get(lineNumber);\n if (annotations.length === 0 && annotationElement !== undefined) {\n const height = measureAnnotationContentHeight(annotationElement);\n if (height > 0) {\n offsetHeights.set(lineNumber, height);\n }\n }\n }\n for (const [lineNumber, annotations] of deletionAnnotations.entries()) {\n const annotationElement = additionAnnotationElements.get(lineNumber);\n if (annotations.length === 0 && annotationElement !== undefined) {\n const height = measureAnnotationContentHeight(annotationElement);\n if (height > 0) {\n offsetHeights.set(lineNumber, height);\n }\n }\n }\n applyLineAnnotationMinHeights(\n additionAnnotations,\n additionAnnotationElements,\n offsetHeights\n );\n applyLineAnnotationMinHeights(\n deletionAnnotations,\n deletionAnnotationElements,\n offsetHeights\n );\n}\n\nfunction measureAnnotationContentHeight(lineAnnotationEl: HTMLElement): number {\n const content = lineAnnotationEl.firstElementChild;\n if (!(content instanceof HTMLElement)) {\n return 0;\n }\n return content.getBoundingClientRect().height;\n}\n\nfunction applyLineAnnotationMinHeights(\n lineAnnotations: Map<number, string[]>,\n annotationElements: Map<number, HTMLElement>,\n offsetHeights: Map<number, number>\n): void {\n for (const [lineNumber, annotationElement] of annotationElements.entries()) {\n const annotations = lineAnnotations.get(lineNumber);\n const offsetHeight = offsetHeights.get(lineNumber);\n if (annotations?.length === 0 && offsetHeight !== undefined) {\n annotationElement.style.setProperty(\n '--diffs-annotation-min-height',\n `${offsetHeight}px`\n );\n }\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"lineAnnotations.js","names":[],"sources":["../../src/editor/lineAnnotations.ts"],"sourcesContent":["import { getLineAnnotationName } from '../utils/getLineAnnotationName';\nimport {\n getLineAnnotationSource,\n type LineAnnotationPosition,\n recordLineAnnotationSource,\n} from '../utils/lineAnnotationIdentity';\nimport type { TextDocumentChange } from './textDocument';\nimport { getLineNumberAttr, h } from './utils';\n\ninterface LineAnnotationChange {\n readonly startLine: number;\n readonly startCharacter: number;\n readonly endLine: number;\n readonly deletesEndLine: boolean;\n readonly insertedLineBreaks: number;\n readonly lineDelta: number;\n}\n\nfunction getDefaultLineAnnotationName(\n annotation: LineAnnotationPosition\n): string {\n return getLineAnnotationName(annotation);\n}\n\nexport function applyDocumentChangeToLineAnnotations<\n TLineAnnotation extends LineAnnotationPosition,\n>(\n change: TextDocumentChange,\n lineAnnotations: TLineAnnotation[]\n): TLineAnnotation[] | undefined {\n const annotationChanges = getLineAnnotationChanges(change);\n if (annotationChanges.length === 0) {\n return undefined;\n }\n\n const nextLineAnnotations: TLineAnnotation[] = [];\n let changed = false;\n for (const annotation of lineAnnotations) {\n if (\n ('side' in annotation && annotation.side === 'deletions') ||\n annotation.lineNumber <= 0\n ) {\n // Annotations that should not be repositioned\n nextLineAnnotations.push(annotation);\n continue;\n }\n\n let line: number | undefined = annotation.lineNumber - 1;\n let lineCount = change.previousLineCount;\n let annotationChanged = false;\n for (const lineChange of annotationChanges) {\n const nextLineCount = Math.max(1, lineCount + lineChange.lineDelta);\n const nextLine = mapLineThroughLineChange(\n line,\n lineChange,\n nextLineCount\n );\n if (nextLine === undefined) {\n annotationChanged = true;\n line = undefined;\n break;\n }\n if (\n nextLine !== line ||\n lineChangeTouchesAnnotationLine(line, lineChange)\n ) {\n annotationChanged = true;\n }\n line = nextLine;\n lineCount = nextLineCount;\n }\n\n if (line === undefined) {\n changed = true;\n continue;\n }\n\n const lineNumber = line + 1;\n if (annotationChanged) {\n if (lineNumber === annotation.lineNumber) {\n nextLineAnnotations.push(annotation);\n } else {\n const moved = { ...annotation, lineNumber };\n recordLineAnnotationSource(moved, getLineAnnotationSource(annotation));\n nextLineAnnotations.push(moved);\n }\n changed = true;\n continue;\n }\n\n nextLineAnnotations.push(annotation);\n }\n\n return changed ? nextLineAnnotations : undefined;\n}\n\nfunction getLineAnnotationChanges(\n change: TextDocumentChange\n): readonly LineAnnotationChange[] {\n if (change.changedLineChanges !== undefined) {\n return change.changedLineChanges.flatMap(\n ([\n startLine,\n changedEndLine,\n lineDelta,\n startCharacter = 0,\n _endCharacter = 0,\n endedAtDocumentEnd = false,\n ]) => {\n if (lineDelta === 0) {\n return [];\n }\n const insertedLineBreaks = Math.max(0, changedEndLine - startLine);\n const removedLineCount = Math.max(0, insertedLineBreaks - lineDelta);\n return [\n {\n startLine,\n startCharacter,\n endLine: startLine + removedLineCount,\n deletesEndLine: lineDelta < 0 && endedAtDocumentEnd,\n insertedLineBreaks,\n lineDelta,\n },\n ];\n }\n );\n }\n\n if (change.lineDelta === 0) {\n return change.changedLineRanges.flatMap(([startLine, endLine]) => {\n const insertedLineBreaks = endLine - startLine;\n if (insertedLineBreaks <= 0) {\n return [];\n }\n return [\n {\n startLine,\n startCharacter: 0,\n endLine: startLine,\n deletesEndLine: false,\n insertedLineBreaks,\n lineDelta: insertedLineBreaks,\n },\n ];\n });\n }\n const removedLineCount = Math.max(0, -change.lineDelta);\n const deletedToDocumentEnd =\n change.endedAtDocumentEnd &&\n change.startLine + removedLineCount === change.previousLineCount - 1;\n return [\n {\n startLine: change.startLine,\n startCharacter: change.startCharacter,\n endLine: change.startLine + removedLineCount,\n deletesEndLine: deletedToDocumentEnd,\n insertedLineBreaks: Math.max(0, change.lineDelta),\n lineDelta: change.lineDelta,\n },\n ];\n}\n\nfunction mapLineThroughLineChange(\n line: number,\n lineChange: LineAnnotationChange,\n nextLineCount: number\n): number | undefined {\n if (line < lineChange.startLine) {\n return line;\n }\n\n if (\n line > lineChange.endLine ||\n (lineChange.endLine > lineChange.startLine &&\n line === lineChange.endLine &&\n !lineChange.deletesEndLine)\n ) {\n return line + lineChange.lineDelta;\n }\n\n if (lineChange.startLine === lineChange.endLine) {\n if (lineChange.startCharacter === 0) {\n return line + lineChange.insertedLineBreaks;\n }\n return line;\n }\n\n if (lineChangeDeletesAnnotationLine(line, lineChange)) {\n return undefined;\n }\n\n const replacementLineOffset = Math.min(\n Math.max(0, line - lineChange.startLine),\n lineChange.insertedLineBreaks\n );\n return clampLine(lineChange.startLine + replacementLineOffset, nextLineCount);\n}\n\nfunction lineChangeDeletesAnnotationLine(\n line: number,\n lineChange: LineAnnotationChange\n): boolean {\n if (\n lineChange.lineDelta >= 0 ||\n line < lineChange.startLine ||\n line > lineChange.endLine\n ) {\n return false;\n }\n if (line === lineChange.startLine && lineChange.startCharacter > 0) {\n return false;\n }\n if (line === lineChange.endLine && !lineChange.deletesEndLine) {\n return false;\n }\n return true;\n}\n\nfunction lineChangeTouchesAnnotationLine(\n line: number,\n lineChange: LineAnnotationChange\n): boolean {\n if (\n lineChange.lineDelta === 0 ||\n line < lineChange.startLine ||\n line > lineChange.endLine\n ) {\n return false;\n }\n return !(\n lineChange.endLine > lineChange.startLine &&\n line === lineChange.endLine &&\n !lineChange.deletesEndLine\n );\n}\n\nfunction clampLine(line: number, lineCount: number): number {\n return Math.max(0, Math.min(line, Math.max(0, lineCount - 1)));\n}\n\nexport function renderLineAnnotations<\n TLineAnnotation extends LineAnnotationPosition,\n>(\n lineAnnotations: TLineAnnotation[],\n contentEl: HTMLElement,\n gutterEl?: HTMLElement,\n getName: (\n annotation: TLineAnnotation\n ) => string = getDefaultLineAnnotationName\n): void {\n const additionAnnotations = new Map<number, string[]>();\n const deletionAnnotations = new Map<number, string[]>();\n for (const annotation of lineAnnotations) {\n const lineNumber = annotation.lineNumber;\n if (!additionAnnotations.has(lineNumber)) {\n additionAnnotations.set(lineNumber, []);\n }\n if (!deletionAnnotations.has(lineNumber)) {\n deletionAnnotations.set(lineNumber, []);\n }\n const map =\n 'side' in annotation && annotation.side === 'deletions'\n ? deletionAnnotations\n : additionAnnotations;\n map.get(lineNumber)!.push(getName(annotation));\n }\n\n const leftCodeElement = contentEl.parentElement?.previousElementSibling;\n let leftGutterElement: HTMLElement | undefined;\n let leftContentElement: HTMLElement | undefined;\n if (\n leftCodeElement != null &&\n leftCodeElement instanceof HTMLElement &&\n leftCodeElement.dataset.deletions !== undefined\n ) {\n for (const child of leftCodeElement.children) {\n const el = child as HTMLElement;\n const { gutter, content } = el.dataset;\n if (gutter !== undefined) {\n leftGutterElement = el;\n } else if (content !== undefined) {\n leftContentElement = el;\n }\n }\n }\n\n cleanLineAnnotationElements(contentEl, gutterEl);\n if (leftContentElement !== undefined) {\n cleanLineAnnotationElements(leftContentElement, leftGutterElement);\n }\n\n const additionsAnnotationElements = createLineAnnotationElements(\n additionAnnotations,\n contentEl,\n gutterEl\n );\n if (leftContentElement === undefined) {\n return;\n }\n\n const deletionsAnnotationElements = createLineAnnotationElements(\n deletionAnnotations,\n leftContentElement,\n leftGutterElement\n );\n\n requestAnimationFrame(() => {\n syncPairedLineAnnotationHeights(\n additionAnnotations,\n deletionAnnotations,\n additionsAnnotationElements,\n deletionsAnnotationElements\n );\n });\n}\n\nfunction cleanLineAnnotationElements(\n contentEl: HTMLElement,\n gutterEl?: HTMLElement\n): void {\n const staleElements: HTMLElement[] = [];\n for (let i = 1; i < contentEl.childElementCount; i++) {\n const el = contentEl.children[i] as HTMLElement;\n if (el.dataset.lineAnnotation !== undefined) {\n staleElements.push(el);\n if (gutterEl !== undefined) {\n staleElements.push(gutterEl.children[i] as HTMLElement);\n }\n }\n }\n for (const el of staleElements) {\n el.remove();\n }\n}\n\nfunction createLineAnnotationElements(\n lineAnnotations: Map<number, string[]>,\n contentEl: HTMLElement,\n gutterEl?: HTMLElement\n): Map<number, HTMLElement> {\n const annotationElements = new Map<number, HTMLElement>();\n for (const el of contentEl.children) {\n const lineNumber = getLineNumberAttr(el as HTMLElement);\n if (lineNumber !== undefined) {\n const annotations = lineAnnotations.get(lineNumber);\n if (annotations !== undefined) {\n const lineIndex = lineNumber - 1;\n const annotationElement = h('div', {\n dataset: {\n lineAnnotation: '0,' + lineIndex,\n },\n children: [\n h('div', {\n dataset: 'annotationContent',\n children: annotations.map((name) => h('slot', { name })),\n }),\n ],\n });\n el.after(annotationElement);\n annotationElements.set(lineNumber, annotationElement);\n }\n }\n }\n\n if (gutterEl !== undefined) {\n for (const el of gutterEl.children) {\n const lineNumber = getLineNumberAttr(el as HTMLElement, 'columnNumber');\n if (lineNumber !== undefined && lineAnnotations.has(lineNumber)) {\n const bufferEl = h('div', {\n dataset: {\n gutterBuffer: 'annotation',\n bufferSize: '1',\n },\n style: {\n gridRow: 'span 1',\n },\n });\n el.after(bufferEl);\n }\n }\n }\n\n return annotationElements;\n}\n\nfunction syncPairedLineAnnotationHeights(\n additionAnnotations: Map<number, string[]>,\n deletionAnnotations: Map<number, string[]>,\n additionAnnotationElements: Map<number, HTMLElement>,\n deletionAnnotationElements: Map<number, HTMLElement>\n): void {\n const offsetHeights = new Map<number, number>();\n for (const [lineNumber, annotations] of additionAnnotations.entries()) {\n const annotationElement = deletionAnnotationElements.get(lineNumber);\n if (annotations.length === 0 && annotationElement !== undefined) {\n const height = measureAnnotationContentHeight(annotationElement);\n if (height > 0) {\n offsetHeights.set(lineNumber, height);\n }\n }\n }\n for (const [lineNumber, annotations] of deletionAnnotations.entries()) {\n const annotationElement = additionAnnotationElements.get(lineNumber);\n if (annotations.length === 0 && annotationElement !== undefined) {\n const height = measureAnnotationContentHeight(annotationElement);\n if (height > 0) {\n offsetHeights.set(lineNumber, height);\n }\n }\n }\n applyLineAnnotationMinHeights(\n additionAnnotations,\n additionAnnotationElements,\n offsetHeights\n );\n applyLineAnnotationMinHeights(\n deletionAnnotations,\n deletionAnnotationElements,\n offsetHeights\n );\n}\n\nfunction measureAnnotationContentHeight(lineAnnotationEl: HTMLElement): number {\n const content = lineAnnotationEl.firstElementChild;\n if (!(content instanceof HTMLElement)) {\n return 0;\n }\n return content.getBoundingClientRect().height;\n}\n\nfunction applyLineAnnotationMinHeights(\n lineAnnotations: Map<number, string[]>,\n annotationElements: Map<number, HTMLElement>,\n offsetHeights: Map<number, number>\n): void {\n for (const [lineNumber, annotationElement] of annotationElements.entries()) {\n const annotations = lineAnnotations.get(lineNumber);\n const offsetHeight = offsetHeights.get(lineNumber);\n if (annotations?.length === 0 && offsetHeight !== undefined) {\n annotationElement.style.setProperty(\n '--diffs-annotation-min-height',\n `${offsetHeight}px`\n );\n }\n }\n}\n"],"mappings":"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"}
|
package/dist/editor/marker.d.ts
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { Range } from "./types.js";
|
|
2
2
|
import { TextDocument } from "./textDocument.js";
|
|
3
3
|
import { PopoverManager } from "./popover.js";
|
|
4
|
-
|
|
5
4
|
//#region src/editor/marker.d.ts
|
|
6
5
|
type MarkerSeverity = 'error' | 'warning' | 'info' | 'hint';
|
|
7
6
|
interface Marker extends Range {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"marker.d.ts","names":[],"sources":["../../src/editor/marker.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"marker.d.ts","names":[],"sources":["../../src/editor/marker.ts"],"mappings":";;;;KAeY;UAEK,eAAe;EAC9B,UAAU;EACV;IAAoB;MAAiB;EACrC;EACA,WAAW;;UAGI;EACf,gBAAgB;EAChB;EACA,yBAAyB;EACzB;EACA,WAAW,cAAc;EACzB,WAAW;EACX;;cAGW;;EAcX,YAAY,QAAQ;MAIhB,oBAAoB;EAIxB;EAIA;EAkBA,WAAW,SAAS,UAAU,cAAc;EAU5C,YAAY,WAAW;EAgCvB;EAMA;;iBAyQc,yBAAyB,UAAU"}
|
package/dist/editor/marker.js
CHANGED
|
@@ -192,9 +192,11 @@ var MarkerRenderer = class {
|
|
|
192
192
|
if (popover !== void 0) {
|
|
193
193
|
setMarkerPopoverSeverity(popover, severity);
|
|
194
194
|
const content = popover.firstElementChild;
|
|
195
|
-
if (content?.dataset.markerMessage !== void 0)
|
|
196
|
-
|
|
197
|
-
|
|
195
|
+
if (content?.dataset.markerMessage !== void 0) {
|
|
196
|
+
if (typeof message === "string") content.textContent = message;
|
|
197
|
+
else if (message instanceof HTMLElement) content.replaceChildren(message);
|
|
198
|
+
else content.innerHTML = message.html;
|
|
199
|
+
}
|
|
198
200
|
this.#positionMarkerPopover(popover, line, character);
|
|
199
201
|
this.#hoveredMarkerIndex = hoveredMarkerIndex;
|
|
200
202
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"marker.js","names":["#options","#markers","#hoveredMarkerIndex","#markerPopoverElement","#positionMarkerPopover","#lineCount","#markerEventDisposes","#findHoveredMarkerIndex","#scheduleMarkerPopover","#cancelMarkerPopoverShow","#scheduleMarkerPopoverHide","#cancelMarkerPopoverHide","#dismissMarkerPopover","#markerPopoverShowTimeout","#pendingMarkerPopoverIndex","#markerPopoverHideTimeout","#renderMarkerPopover","#isMarkerPopoverHovered","#setMarkerPopoverPosition","#markerPopoverEventDisposes"],"sources":["../../src/editor/marker.ts"],"sourcesContent":["import {\n POPOVER_BOUNDARY_LINES,\n type PopoverManager,\n type PopoverPlacementBounds,\n setPopoverPositionStyles,\n} from './popover';\nimport { selectionIntersects } from './selection';\nimport type { TextDocument } from './textDocument';\nimport type { Position, Range } from './types';\nimport { addEventListener, getLineNumberAttr, h } from './utils';\n\nconst MARKER_POPOVER_SHOW_DELAY_MS = 300;\nconst MARKER_POPOVER_HIDE_DELAY_MS = 100;\nconst MARKER_POPOVER_PLACEMENT_KEY = 'marker-popover';\n\nexport type MarkerSeverity = 'error' | 'warning' | 'info' | 'hint';\n\nexport interface Marker extends Range {\n severity: MarkerSeverity;\n message: string | { html: string } | HTMLElement;\n source?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface MarkerRenderOptions {\n popoverManager: PopoverManager;\n getLineHeight: () => number;\n getOverlayElement: () => HTMLElement | undefined;\n getGutterWidth: () => number;\n getCharX: (line: number, character: number) => [number, number];\n getLineY: (line: number) => number;\n isMouseDown: () => boolean;\n}\n\nexport class MarkerRenderer {\n #options: MarkerRenderOptions;\n #markers: Marker[] = [];\n // Document line count, used only by the no-viewport document-edge fallback.\n #lineCount = 0;\n #markerPopoverElement?: HTMLElement;\n #markerPopoverEventDisposes?: (() => void)[];\n #markerEventDisposes?: (() => void)[];\n #markerPopoverShowTimeout?: ReturnType<typeof setTimeout>;\n #markerPopoverHideTimeout?: ReturnType<typeof setTimeout>;\n #pendingMarkerPopoverIndex?: number;\n #hoveredMarkerIndex?: number;\n #isMarkerPopoverHovered = false;\n\n constructor(editor: MarkerRenderOptions) {\n this.#options = editor;\n }\n\n get markers(): readonly Marker[] {\n return this.#markers;\n }\n\n isPopoverVisible(): boolean {\n return this.#hoveredMarkerIndex !== undefined;\n }\n\n updatePopoverPosition(): void {\n const hoveredMarkerIndex = this.#hoveredMarkerIndex;\n const popover = this.#markerPopoverElement;\n if (hoveredMarkerIndex === undefined || popover === undefined) {\n return;\n }\n const marker = this.#markers[hoveredMarkerIndex];\n if (marker === undefined) {\n this.removePopover();\n return;\n }\n this.#positionMarkerPopover(\n popover,\n marker.start.line,\n marker.start.character\n );\n }\n\n setMarkers(markers: Marker[], textDocument: TextDocument): void {\n this.#lineCount = textDocument.lineCount;\n this.#markers = markers.map((marker) => ({\n ...marker,\n start: textDocument.normalizePosition(marker.start),\n end: textDocument.normalizePosition(marker.end),\n }));\n this.removePopover();\n }\n\n listenHover(contentEl: HTMLElement): void {\n this.#markerEventDisposes?.forEach((dispose) => dispose());\n this.#markerEventDisposes = undefined;\n if (this.#markers.length === 0) {\n return;\n }\n\n this.#markerEventDisposes = [\n addEventListener(contentEl, 'mouseover', (e) => {\n if (this.#options.isMouseDown()) {\n return;\n }\n const target = e.composedPath()[0] as HTMLElement | undefined;\n if (target === undefined) {\n return;\n }\n\n const hoverMarkerIndex = this.#findHoveredMarkerIndex(target);\n if (hoverMarkerIndex !== undefined) {\n this.#scheduleMarkerPopover(hoverMarkerIndex);\n } else {\n this.#cancelMarkerPopoverShow();\n this.#scheduleMarkerPopoverHide();\n }\n }),\n addEventListener(contentEl, 'mouseleave', () => {\n this.#cancelMarkerPopoverShow();\n this.#scheduleMarkerPopoverHide();\n }),\n ];\n }\n\n removePopover(): void {\n this.#cancelMarkerPopoverShow();\n this.#cancelMarkerPopoverHide();\n this.#dismissMarkerPopover();\n }\n\n cleanup(): void {\n this.#markerEventDisposes?.forEach((dispose) => dispose());\n this.#markerEventDisposes = undefined;\n this.removePopover();\n this.#markers = [];\n }\n\n #findHoveredMarkerIndex(target: HTMLElement): number | undefined {\n const lineElement = target.closest('[data-line]');\n if (lineElement == null) {\n return;\n }\n\n const lineNumber = getLineNumberAttr(lineElement as HTMLElement);\n if (lineNumber === undefined) {\n return;\n }\n\n let character: number | undefined;\n if (target.tagName === 'SPAN') {\n const char = target.dataset.char;\n if (char === undefined) {\n return;\n }\n character = parseInt(char, 10);\n if (Number.isNaN(character)) {\n return;\n }\n } else if (target.tagName === 'BR') {\n character = 0;\n } else {\n return;\n }\n\n const position: Position = { line: lineNumber - 1, character };\n for (let i = this.#markers.length - 1; i >= 0; i--) {\n if (\n selectionIntersects(\n { start: position, end: position },\n this.#markers[i]\n )\n ) {\n return i;\n }\n }\n return undefined;\n }\n\n #cancelMarkerPopoverShow(): void {\n if (this.#markerPopoverShowTimeout !== undefined) {\n clearTimeout(this.#markerPopoverShowTimeout);\n this.#markerPopoverShowTimeout = undefined;\n }\n this.#pendingMarkerPopoverIndex = undefined;\n }\n\n #cancelMarkerPopoverHide(): void {\n if (this.#markerPopoverHideTimeout !== undefined) {\n clearTimeout(this.#markerPopoverHideTimeout);\n this.#markerPopoverHideTimeout = undefined;\n }\n }\n\n #scheduleMarkerPopover(markerIndex: number): void {\n if (\n markerIndex === this.#hoveredMarkerIndex ||\n markerIndex === this.#pendingMarkerPopoverIndex\n ) {\n this.#cancelMarkerPopoverHide();\n return;\n }\n\n this.#cancelMarkerPopoverShow();\n this.#cancelMarkerPopoverHide();\n if (this.#markerPopoverElement !== undefined) {\n this.#renderMarkerPopover(markerIndex);\n return;\n }\n\n this.#pendingMarkerPopoverIndex = markerIndex;\n this.#markerPopoverShowTimeout = setTimeout(() => {\n this.#markerPopoverShowTimeout = undefined;\n this.#pendingMarkerPopoverIndex = undefined;\n this.#renderMarkerPopover(markerIndex);\n }, MARKER_POPOVER_SHOW_DELAY_MS);\n }\n\n #scheduleMarkerPopoverHide(): void {\n if (this.#isMarkerPopoverHovered) {\n return;\n }\n\n this.#cancelMarkerPopoverHide();\n this.#markerPopoverHideTimeout = setTimeout(() => {\n this.#markerPopoverHideTimeout = undefined;\n if (!this.#isMarkerPopoverHovered) {\n this.removePopover();\n }\n }, MARKER_POPOVER_HIDE_DELAY_MS);\n }\n\n // Positions the popover in overlay coordinate space (see [data-marker-popover]\n // in editor.css). When `placeAbove` is true, `y` is the top edge of the\n // marker's row and the popover is shifted up by its own height.\n #setMarkerPopoverPosition(\n popover: HTMLElement,\n x: number,\n y: number,\n placeAbove: boolean,\n viewport = this.#options.popoverManager.getPlacementBounds()\n ): void {\n setPopoverPositionStyles(popover, {\n gutterWidth: this.#options.getGutterWidth(),\n placeAbove,\n viewport,\n x,\n y,\n });\n }\n\n // Positions the popover for a marker at `(line, character)`: prefers below\n // (the default), flipping above when below would be clipped by the visible\n // scrollport. Must run after the popover's content is final, since it reads\n // the popover's rendered height to decide whether either side fits.\n #positionMarkerPopover(\n popover: HTMLElement,\n line: number,\n character: number\n ): void {\n const { getCharX, getLineY, getLineHeight, popoverManager } = this.#options;\n const [left, wrapLine] = getCharX(line, character);\n const lineHeight = getLineHeight();\n const rowTop = getLineY(line) + wrapLine * lineHeight;\n const popoverHeight = popover.offsetHeight;\n\n const preferred: PopoverPlacementBounds = {\n top: rowTop + lineHeight,\n bottom: rowTop + lineHeight + popoverHeight,\n };\n const fallback: PopoverPlacementBounds = {\n top: rowTop - popoverHeight,\n bottom: rowTop,\n };\n const atDocumentEdge = line >= this.#lineCount - POPOVER_BOUNDARY_LINES;\n const viewport = popoverManager.getPlacementBounds();\n const placeAbove =\n popoverManager.choosePlacement({\n preferred,\n fallback,\n viewport,\n popoverHeight,\n atDocumentEdge,\n placementKey: MARKER_POPOVER_PLACEMENT_KEY,\n }) === 'fallback';\n\n this.#setMarkerPopoverPosition(\n popover,\n left,\n placeAbove ? rowTop : rowTop + lineHeight,\n placeAbove,\n viewport\n );\n }\n\n #dismissMarkerPopover(): void {\n this.#markerPopoverEventDisposes?.forEach((dispose) => dispose());\n this.#markerPopoverEventDisposes = undefined;\n this.#markerPopoverElement?.remove();\n this.#markerPopoverElement = undefined;\n this.#hoveredMarkerIndex = undefined;\n this.#isMarkerPopoverHovered = false;\n this.#options.popoverManager.resetPlacement(MARKER_POPOVER_PLACEMENT_KEY);\n }\n\n #renderMarkerPopover(hoveredMarkerIndex: number): void {\n if (hoveredMarkerIndex === this.#hoveredMarkerIndex) {\n return;\n }\n\n const overlayElement = this.#options.getOverlayElement();\n if (hoveredMarkerIndex >= this.#markers.length || overlayElement == null) {\n return;\n }\n\n const { start, message, severity } = this.#markers[hoveredMarkerIndex];\n const { line, character } = start;\n const popover = this.#markerPopoverElement;\n this.#options.popoverManager.resetPlacement(MARKER_POPOVER_PLACEMENT_KEY);\n\n if (popover !== undefined) {\n setMarkerPopoverSeverity(popover, severity);\n const content = popover.firstElementChild as HTMLElement | null;\n if (content?.dataset.markerMessage !== undefined) {\n if (typeof message === 'string') {\n content.textContent = message;\n } else if (message instanceof HTMLElement) {\n content.replaceChildren(message);\n } else {\n content.innerHTML = message.html;\n }\n }\n // Position after updating content: a different message size changes\n // the offsetHeight #positionMarkerPopover reads to decide placement.\n this.#positionMarkerPopover(popover, line, character);\n this.#hoveredMarkerIndex = hoveredMarkerIndex;\n return;\n }\n\n this.#markerPopoverElement = h(\n 'div',\n {\n dataset: {\n editorWidget: '',\n markerPopover: '',\n [markerSeverityDatasetKey(severity)]: '',\n },\n children: [\n h('div', {\n dataset: 'markerMessage',\n ...(typeof message === 'string'\n ? { textContent: message }\n : message instanceof HTMLElement\n ? { children: [message] }\n : { innerHTML: message.html }),\n }),\n ],\n },\n overlayElement\n );\n this.#positionMarkerPopover(this.#markerPopoverElement, line, character);\n this.#hoveredMarkerIndex = hoveredMarkerIndex;\n this.#markerPopoverEventDisposes = [\n addEventListener(this.#markerPopoverElement, 'mouseenter', () => {\n this.#isMarkerPopoverHovered = true;\n this.#cancelMarkerPopoverHide();\n }),\n addEventListener(this.#markerPopoverElement, 'mouseleave', () => {\n this.#isMarkerPopoverHovered = false;\n this.#scheduleMarkerPopoverHide();\n }),\n ];\n }\n}\n\nconst MARKER_SEVERITIES: readonly MarkerSeverity[] = [\n 'error',\n 'warning',\n 'info',\n 'hint',\n];\n\n// Marks the popover with data-marker-<severity> (the same boolean attribute the\n// squiggle range element uses) so the CSS severity palette can target both with\n// a single selector. The popover element is reused across hovers, so any\n// previously applied severity attribute is cleared first.\nfunction setMarkerPopoverSeverity(\n popover: HTMLElement,\n severity: MarkerSeverity\n): void {\n for (const candidate of MARKER_SEVERITIES) {\n delete popover.dataset[markerSeverityDatasetKey(candidate)];\n }\n popover.dataset[markerSeverityDatasetKey(severity)] = '';\n}\n\nexport function markerSeverityDatasetKey(severity: MarkerSeverity): string {\n switch (severity) {\n case 'error':\n return 'markerError';\n case 'warning':\n return 'markerWarning';\n case 'info':\n return 'markerInfo';\n case 'hint':\n return 'markerHint';\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"marker.js","names":[],"sources":["../../src/editor/marker.ts"],"sourcesContent":["import {\n POPOVER_BOUNDARY_LINES,\n type PopoverManager,\n type PopoverPlacementBounds,\n setPopoverPositionStyles,\n} from './popover';\nimport { selectionIntersects } from './selection';\nimport type { TextDocument } from './textDocument';\nimport type { Position, Range } from './types';\nimport { addEventListener, getLineNumberAttr, h } from './utils';\n\nconst MARKER_POPOVER_SHOW_DELAY_MS = 300;\nconst MARKER_POPOVER_HIDE_DELAY_MS = 100;\nconst MARKER_POPOVER_PLACEMENT_KEY = 'marker-popover';\n\nexport type MarkerSeverity = 'error' | 'warning' | 'info' | 'hint';\n\nexport interface Marker extends Range {\n severity: MarkerSeverity;\n message: string | { html: string } | HTMLElement;\n source?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface MarkerRenderOptions {\n popoverManager: PopoverManager;\n getLineHeight: () => number;\n getOverlayElement: () => HTMLElement | undefined;\n getGutterWidth: () => number;\n getCharX: (line: number, character: number) => [number, number];\n getLineY: (line: number) => number;\n isMouseDown: () => boolean;\n}\n\nexport class MarkerRenderer {\n #options: MarkerRenderOptions;\n #markers: Marker[] = [];\n // Document line count, used only by the no-viewport document-edge fallback.\n #lineCount = 0;\n #markerPopoverElement?: HTMLElement;\n #markerPopoverEventDisposes?: (() => void)[];\n #markerEventDisposes?: (() => void)[];\n #markerPopoverShowTimeout?: ReturnType<typeof setTimeout>;\n #markerPopoverHideTimeout?: ReturnType<typeof setTimeout>;\n #pendingMarkerPopoverIndex?: number;\n #hoveredMarkerIndex?: number;\n #isMarkerPopoverHovered = false;\n\n constructor(editor: MarkerRenderOptions) {\n this.#options = editor;\n }\n\n get markers(): readonly Marker[] {\n return this.#markers;\n }\n\n isPopoverVisible(): boolean {\n return this.#hoveredMarkerIndex !== undefined;\n }\n\n updatePopoverPosition(): void {\n const hoveredMarkerIndex = this.#hoveredMarkerIndex;\n const popover = this.#markerPopoverElement;\n if (hoveredMarkerIndex === undefined || popover === undefined) {\n return;\n }\n const marker = this.#markers[hoveredMarkerIndex];\n if (marker === undefined) {\n this.removePopover();\n return;\n }\n this.#positionMarkerPopover(\n popover,\n marker.start.line,\n marker.start.character\n );\n }\n\n setMarkers(markers: Marker[], textDocument: TextDocument): void {\n this.#lineCount = textDocument.lineCount;\n this.#markers = markers.map((marker) => ({\n ...marker,\n start: textDocument.normalizePosition(marker.start),\n end: textDocument.normalizePosition(marker.end),\n }));\n this.removePopover();\n }\n\n listenHover(contentEl: HTMLElement): void {\n this.#markerEventDisposes?.forEach((dispose) => dispose());\n this.#markerEventDisposes = undefined;\n if (this.#markers.length === 0) {\n return;\n }\n\n this.#markerEventDisposes = [\n addEventListener(contentEl, 'mouseover', (e) => {\n if (this.#options.isMouseDown()) {\n return;\n }\n const target = e.composedPath()[0] as HTMLElement | undefined;\n if (target === undefined) {\n return;\n }\n\n const hoverMarkerIndex = this.#findHoveredMarkerIndex(target);\n if (hoverMarkerIndex !== undefined) {\n this.#scheduleMarkerPopover(hoverMarkerIndex);\n } else {\n this.#cancelMarkerPopoverShow();\n this.#scheduleMarkerPopoverHide();\n }\n }),\n addEventListener(contentEl, 'mouseleave', () => {\n this.#cancelMarkerPopoverShow();\n this.#scheduleMarkerPopoverHide();\n }),\n ];\n }\n\n removePopover(): void {\n this.#cancelMarkerPopoverShow();\n this.#cancelMarkerPopoverHide();\n this.#dismissMarkerPopover();\n }\n\n cleanup(): void {\n this.#markerEventDisposes?.forEach((dispose) => dispose());\n this.#markerEventDisposes = undefined;\n this.removePopover();\n this.#markers = [];\n }\n\n #findHoveredMarkerIndex(target: HTMLElement): number | undefined {\n const lineElement = target.closest('[data-line]');\n if (lineElement == null) {\n return;\n }\n\n const lineNumber = getLineNumberAttr(lineElement as HTMLElement);\n if (lineNumber === undefined) {\n return;\n }\n\n let character: number | undefined;\n if (target.tagName === 'SPAN') {\n const char = target.dataset.char;\n if (char === undefined) {\n return;\n }\n character = parseInt(char, 10);\n if (Number.isNaN(character)) {\n return;\n }\n } else if (target.tagName === 'BR') {\n character = 0;\n } else {\n return;\n }\n\n const position: Position = { line: lineNumber - 1, character };\n for (let i = this.#markers.length - 1; i >= 0; i--) {\n if (\n selectionIntersects(\n { start: position, end: position },\n this.#markers[i]\n )\n ) {\n return i;\n }\n }\n return undefined;\n }\n\n #cancelMarkerPopoverShow(): void {\n if (this.#markerPopoverShowTimeout !== undefined) {\n clearTimeout(this.#markerPopoverShowTimeout);\n this.#markerPopoverShowTimeout = undefined;\n }\n this.#pendingMarkerPopoverIndex = undefined;\n }\n\n #cancelMarkerPopoverHide(): void {\n if (this.#markerPopoverHideTimeout !== undefined) {\n clearTimeout(this.#markerPopoverHideTimeout);\n this.#markerPopoverHideTimeout = undefined;\n }\n }\n\n #scheduleMarkerPopover(markerIndex: number): void {\n if (\n markerIndex === this.#hoveredMarkerIndex ||\n markerIndex === this.#pendingMarkerPopoverIndex\n ) {\n this.#cancelMarkerPopoverHide();\n return;\n }\n\n this.#cancelMarkerPopoverShow();\n this.#cancelMarkerPopoverHide();\n if (this.#markerPopoverElement !== undefined) {\n this.#renderMarkerPopover(markerIndex);\n return;\n }\n\n this.#pendingMarkerPopoverIndex = markerIndex;\n this.#markerPopoverShowTimeout = setTimeout(() => {\n this.#markerPopoverShowTimeout = undefined;\n this.#pendingMarkerPopoverIndex = undefined;\n this.#renderMarkerPopover(markerIndex);\n }, MARKER_POPOVER_SHOW_DELAY_MS);\n }\n\n #scheduleMarkerPopoverHide(): void {\n if (this.#isMarkerPopoverHovered) {\n return;\n }\n\n this.#cancelMarkerPopoverHide();\n this.#markerPopoverHideTimeout = setTimeout(() => {\n this.#markerPopoverHideTimeout = undefined;\n if (!this.#isMarkerPopoverHovered) {\n this.removePopover();\n }\n }, MARKER_POPOVER_HIDE_DELAY_MS);\n }\n\n // Positions the popover in overlay coordinate space (see [data-marker-popover]\n // in editor.css). When `placeAbove` is true, `y` is the top edge of the\n // marker's row and the popover is shifted up by its own height.\n #setMarkerPopoverPosition(\n popover: HTMLElement,\n x: number,\n y: number,\n placeAbove: boolean,\n viewport = this.#options.popoverManager.getPlacementBounds()\n ): void {\n setPopoverPositionStyles(popover, {\n gutterWidth: this.#options.getGutterWidth(),\n placeAbove,\n viewport,\n x,\n y,\n });\n }\n\n // Positions the popover for a marker at `(line, character)`: prefers below\n // (the default), flipping above when below would be clipped by the visible\n // scrollport. Must run after the popover's content is final, since it reads\n // the popover's rendered height to decide whether either side fits.\n #positionMarkerPopover(\n popover: HTMLElement,\n line: number,\n character: number\n ): void {\n const { getCharX, getLineY, getLineHeight, popoverManager } = this.#options;\n const [left, wrapLine] = getCharX(line, character);\n const lineHeight = getLineHeight();\n const rowTop = getLineY(line) + wrapLine * lineHeight;\n const popoverHeight = popover.offsetHeight;\n\n const preferred: PopoverPlacementBounds = {\n top: rowTop + lineHeight,\n bottom: rowTop + lineHeight + popoverHeight,\n };\n const fallback: PopoverPlacementBounds = {\n top: rowTop - popoverHeight,\n bottom: rowTop,\n };\n const atDocumentEdge = line >= this.#lineCount - POPOVER_BOUNDARY_LINES;\n const viewport = popoverManager.getPlacementBounds();\n const placeAbove =\n popoverManager.choosePlacement({\n preferred,\n fallback,\n viewport,\n popoverHeight,\n atDocumentEdge,\n placementKey: MARKER_POPOVER_PLACEMENT_KEY,\n }) === 'fallback';\n\n this.#setMarkerPopoverPosition(\n popover,\n left,\n placeAbove ? rowTop : rowTop + lineHeight,\n placeAbove,\n viewport\n );\n }\n\n #dismissMarkerPopover(): void {\n this.#markerPopoverEventDisposes?.forEach((dispose) => dispose());\n this.#markerPopoverEventDisposes = undefined;\n this.#markerPopoverElement?.remove();\n this.#markerPopoverElement = undefined;\n this.#hoveredMarkerIndex = undefined;\n this.#isMarkerPopoverHovered = false;\n this.#options.popoverManager.resetPlacement(MARKER_POPOVER_PLACEMENT_KEY);\n }\n\n #renderMarkerPopover(hoveredMarkerIndex: number): void {\n if (hoveredMarkerIndex === this.#hoveredMarkerIndex) {\n return;\n }\n\n const overlayElement = this.#options.getOverlayElement();\n if (hoveredMarkerIndex >= this.#markers.length || overlayElement == null) {\n return;\n }\n\n const { start, message, severity } = this.#markers[hoveredMarkerIndex];\n const { line, character } = start;\n const popover = this.#markerPopoverElement;\n this.#options.popoverManager.resetPlacement(MARKER_POPOVER_PLACEMENT_KEY);\n\n if (popover !== undefined) {\n setMarkerPopoverSeverity(popover, severity);\n const content = popover.firstElementChild as HTMLElement | null;\n if (content?.dataset.markerMessage !== undefined) {\n if (typeof message === 'string') {\n content.textContent = message;\n } else if (message instanceof HTMLElement) {\n content.replaceChildren(message);\n } else {\n content.innerHTML = message.html;\n }\n }\n // Position after updating content: a different message size changes\n // the offsetHeight #positionMarkerPopover reads to decide placement.\n this.#positionMarkerPopover(popover, line, character);\n this.#hoveredMarkerIndex = hoveredMarkerIndex;\n return;\n }\n\n this.#markerPopoverElement = h(\n 'div',\n {\n dataset: {\n editorWidget: '',\n markerPopover: '',\n [markerSeverityDatasetKey(severity)]: '',\n },\n children: [\n h('div', {\n dataset: 'markerMessage',\n ...(typeof message === 'string'\n ? { textContent: message }\n : message instanceof HTMLElement\n ? { children: [message] }\n : { innerHTML: message.html }),\n }),\n ],\n },\n overlayElement\n );\n this.#positionMarkerPopover(this.#markerPopoverElement, line, character);\n this.#hoveredMarkerIndex = hoveredMarkerIndex;\n this.#markerPopoverEventDisposes = [\n addEventListener(this.#markerPopoverElement, 'mouseenter', () => {\n this.#isMarkerPopoverHovered = true;\n this.#cancelMarkerPopoverHide();\n }),\n addEventListener(this.#markerPopoverElement, 'mouseleave', () => {\n this.#isMarkerPopoverHovered = false;\n this.#scheduleMarkerPopoverHide();\n }),\n ];\n }\n}\n\nconst MARKER_SEVERITIES: readonly MarkerSeverity[] = [\n 'error',\n 'warning',\n 'info',\n 'hint',\n];\n\n// Marks the popover with data-marker-<severity> (the same boolean attribute the\n// squiggle range element uses) so the CSS severity palette can target both with\n// a single selector. The popover element is reused across hovers, so any\n// previously applied severity attribute is cleared first.\nfunction setMarkerPopoverSeverity(\n popover: HTMLElement,\n severity: MarkerSeverity\n): void {\n for (const candidate of MARKER_SEVERITIES) {\n delete popover.dataset[markerSeverityDatasetKey(candidate)];\n }\n popover.dataset[markerSeverityDatasetKey(severity)] = '';\n}\n\nexport function markerSeverityDatasetKey(severity: MarkerSeverity): string {\n switch (severity) {\n case 'error':\n return 'markerError';\n case 'warning':\n return 'markerWarning';\n case 'info':\n return 'markerInfo';\n case 'hint':\n return 'markerHint';\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { Position, Range } from "./types.js";
|
|
2
2
|
import { TextDocument } from "./textDocument.js";
|
|
3
3
|
import { EditorTokenizer } from "./tokenizer.js";
|
|
4
|
-
|
|
5
4
|
//#region src/editor/matchBrackets.d.ts
|
|
6
5
|
declare function findBracketMatchRanges(textDocument: TextDocument, tokenizer: EditorTokenizer, position: Position): [open: Range, close: Range] | undefined;
|
|
7
6
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"matchBrackets.d.ts","names":[],"sources":["../../src/editor/matchBrackets.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"matchBrackets.d.ts","names":[],"sources":["../../src/editor/matchBrackets.ts"],"mappings":";;;;iBAqBgB,uBACd,cAAc,cACd,WAAW,iBACX,UAAU,YACR,MAAM,OAAO,OAAO"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pieceTable.d.ts","names":[],"sources":["../../src/editor/pieceTable.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"pieceTable.d.ts","names":[],"sources":["../../src/editor/pieceTable.ts"],"mappings":";;;;;;;;;;;;cAqHa;;EAiBX,YAAY;MAQR;EAIJ,QAAQ,QAAQ;EAShB,YAAY,cAAc;EAkB1B,cAAc,cAAc;EAqC5B,aAAa,eAAe,aAAa;EAsCzC,OAAO;EAWP,SAAS;EA2BT,gCACE,gBACA,oBAAoB,eAAe;EA0CrC,OAAO,cAAc,gBAAgB,eAAe;EAsFpD,OAAO,cAAc;EASrB,OAAO,gBAAgB;EAavB,WAAW,gBAAgB;EAiB3B,WAAW,iBAAiB;EAY5B,YAAY,6BAA6B;EAgBzC,SAAS,UAAU;;;;;;iBA6qBL,2BACd,aAAa,mBAAmB,UAChC,WAAW,UAAU,qBACrB,cAAc,yBACd,cAAc,cACd,oBACA"}
|