@pierre/diffs 1.3.0-beta.2 → 1.3.0-beta.4

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.
Files changed (158) hide show
  1. package/dist/components/CodeView.d.ts +4 -0
  2. package/dist/components/CodeView.d.ts.map +1 -1
  3. package/dist/components/CodeView.js +38 -0
  4. package/dist/components/CodeView.js.map +1 -1
  5. package/dist/components/File.d.ts +2 -2
  6. package/dist/components/File.d.ts.map +1 -1
  7. package/dist/components/File.js +13 -13
  8. package/dist/components/File.js.map +1 -1
  9. package/dist/components/FileDiff.d.ts +7 -4
  10. package/dist/components/FileDiff.d.ts.map +1 -1
  11. package/dist/components/FileDiff.js +57 -47
  12. package/dist/components/FileDiff.js.map +1 -1
  13. package/dist/components/UnresolvedFile.d.ts.map +1 -1
  14. package/dist/components/UnresolvedFile.js +1 -1
  15. package/dist/components/VirtualizedFile.d.ts +1 -1
  16. package/dist/components/VirtualizedFile.d.ts.map +1 -1
  17. package/dist/components/VirtualizedFile.js +13 -4
  18. package/dist/components/VirtualizedFile.js.map +1 -1
  19. package/dist/components/VirtualizedFileDiff.d.ts +2 -1
  20. package/dist/components/VirtualizedFileDiff.d.ts.map +1 -1
  21. package/dist/components/VirtualizedFileDiff.js +36 -42
  22. package/dist/components/VirtualizedFileDiff.js.map +1 -1
  23. package/dist/components/Virtualizer.js +5 -3
  24. package/dist/components/Virtualizer.js.map +1 -1
  25. package/dist/components/VirtulizerDevelopment.d.ts.map +1 -1
  26. package/dist/editor/editStack.d.ts +1 -1
  27. package/dist/editor/editor.d.ts +14 -6
  28. package/dist/editor/editor.d.ts.map +1 -1
  29. package/dist/editor/editor.js +745 -553
  30. package/dist/editor/editor.js.map +1 -1
  31. package/dist/editor/editor2.js +6 -0
  32. package/dist/editor/editor2.js.map +1 -0
  33. package/dist/editor/lineAnnotations.d.ts +2 -1
  34. package/dist/editor/lineAnnotations.d.ts.map +1 -1
  35. package/dist/editor/lineAnnotations.js +111 -1
  36. package/dist/editor/lineAnnotations.js.map +1 -1
  37. package/dist/editor/marker.d.ts +33 -0
  38. package/dist/editor/marker.d.ts.map +1 -0
  39. package/dist/editor/marker.js +185 -0
  40. package/dist/editor/marker.js.map +1 -0
  41. package/dist/editor/pieceTable.d.ts +3 -3
  42. package/dist/editor/pieceTable.d.ts.map +1 -1
  43. package/dist/editor/pieceTable.js +44 -33
  44. package/dist/editor/pieceTable.js.map +1 -1
  45. package/dist/editor/searchPanel.d.ts +6 -7
  46. package/dist/editor/searchPanel.d.ts.map +1 -1
  47. package/dist/editor/searchPanel.js +103 -138
  48. package/dist/editor/searchPanel.js.map +1 -1
  49. package/dist/editor/selection.d.ts +19 -3
  50. package/dist/editor/selection.d.ts.map +1 -1
  51. package/dist/editor/selection.js +196 -39
  52. package/dist/editor/selection.js.map +1 -1
  53. package/dist/editor/{quickEdit.d.ts → selectionAction.d.ts} +8 -8
  54. package/dist/editor/selectionAction.d.ts.map +1 -0
  55. package/dist/editor/{quickEdit.js → selectionAction.js} +19 -21
  56. package/dist/editor/selectionAction.js.map +1 -0
  57. package/dist/editor/sprite.d.ts +8 -0
  58. package/dist/editor/sprite.d.ts.map +1 -0
  59. package/dist/editor/sprite.js +45 -0
  60. package/dist/editor/sprite.js.map +1 -0
  61. package/dist/editor/textDocument.d.ts +5 -5
  62. package/dist/editor/textDocument.d.ts.map +1 -1
  63. package/dist/editor/textDocument.js +9 -9
  64. package/dist/editor/textDocument.js.map +1 -1
  65. package/dist/editor/textMeasure.js +3 -3
  66. package/dist/editor/textMeasure.js.map +1 -1
  67. package/dist/editor/tokenzier.d.ts +6 -2
  68. package/dist/editor/tokenzier.d.ts.map +1 -1
  69. package/dist/editor/tokenzier.js +135 -85
  70. package/dist/editor/tokenzier.js.map +1 -1
  71. package/dist/editor/utils.d.ts +3 -1
  72. package/dist/editor/utils.d.ts.map +1 -1
  73. package/dist/editor/utils.js +16 -1
  74. package/dist/editor/utils.js.map +1 -1
  75. package/dist/highlighter/shared_highlighter.js +3 -29
  76. package/dist/highlighter/shared_highlighter.js.map +1 -1
  77. package/dist/highlighter/themes/attachResolvedThemes.js +4 -3
  78. package/dist/highlighter/themes/attachResolvedThemes.js.map +1 -1
  79. package/dist/highlighter/themes/cleanUpResolvedThemes.js +3 -2
  80. package/dist/highlighter/themes/cleanUpResolvedThemes.js.map +1 -1
  81. package/dist/highlighter/themes/constants.d.ts +1 -7
  82. package/dist/highlighter/themes/constants.d.ts.map +1 -1
  83. package/dist/highlighter/themes/constants.js +1 -4
  84. package/dist/highlighter/themes/constants.js.map +1 -1
  85. package/dist/highlighter/themes/getResolvedOrResolveTheme.js +2 -2
  86. package/dist/highlighter/themes/getResolvedOrResolveTheme.js.map +1 -1
  87. package/dist/highlighter/themes/getResolvedThemes.js +2 -8
  88. package/dist/highlighter/themes/getResolvedThemes.js.map +1 -1
  89. package/dist/highlighter/themes/hasResolvedThemes.js +2 -3
  90. package/dist/highlighter/themes/hasResolvedThemes.js.map +1 -1
  91. package/dist/highlighter/themes/registerCustomCSSVariableTheme.js +1 -1
  92. package/dist/highlighter/themes/registerCustomTheme.d.ts +5 -3
  93. package/dist/highlighter/themes/registerCustomTheme.d.ts.map +1 -1
  94. package/dist/highlighter/themes/registerCustomTheme.js +15 -5
  95. package/dist/highlighter/themes/registerCustomTheme.js.map +1 -1
  96. package/dist/highlighter/themes/resolveTheme.js +6 -27
  97. package/dist/highlighter/themes/resolveTheme.js.map +1 -1
  98. package/dist/highlighter/themes/resolveThemes.js +5 -12
  99. package/dist/highlighter/themes/resolveThemes.js.map +1 -1
  100. package/dist/highlighter/themes/themeResolution.d.ts +8 -0
  101. package/dist/highlighter/themes/themeResolution.d.ts.map +1 -0
  102. package/dist/highlighter/themes/themeResolution.js +22 -0
  103. package/dist/highlighter/themes/themeResolution.js.map +1 -0
  104. package/dist/highlighter/themes/themeResolver.d.ts +8 -0
  105. package/dist/highlighter/themes/themeResolver.d.ts.map +1 -0
  106. package/dist/highlighter/themes/themeResolver.js +8 -0
  107. package/dist/highlighter/themes/themeResolver.js.map +1 -0
  108. package/dist/index.d.ts +4 -4
  109. package/dist/index.js +3 -3
  110. package/dist/react/index.d.ts +2 -2
  111. package/dist/react/jsx.d.ts.map +1 -1
  112. package/dist/react/utils/useFileDiffInstance.js +1 -0
  113. package/dist/react/utils/useFileDiffInstance.js.map +1 -1
  114. package/dist/renderers/DiffHunksRenderer.d.ts +4 -1
  115. package/dist/renderers/DiffHunksRenderer.d.ts.map +1 -1
  116. package/dist/renderers/DiffHunksRenderer.js +139 -19
  117. package/dist/renderers/DiffHunksRenderer.js.map +1 -1
  118. package/dist/renderers/FileRenderer.d.ts +2 -2
  119. package/dist/renderers/FileRenderer.d.ts.map +1 -1
  120. package/dist/renderers/FileRenderer.js +5 -5
  121. package/dist/renderers/FileRenderer.js.map +1 -1
  122. package/dist/ssr/index.d.ts +2 -2
  123. package/dist/style.js +1 -1
  124. package/dist/style.js.map +1 -1
  125. package/dist/types.d.ts +19 -16
  126. package/dist/types.d.ts.map +1 -1
  127. package/dist/utils/computeEstimatedDiffHeights.js +9 -20
  128. package/dist/utils/computeEstimatedDiffHeights.js.map +1 -1
  129. package/dist/utils/getHighlighterThemeStyles.js +16 -12
  130. package/dist/utils/getHighlighterThemeStyles.js.map +1 -1
  131. package/dist/utils/iterateOverDiff.js +147 -182
  132. package/dist/utils/iterateOverDiff.js.map +1 -1
  133. package/dist/utils/parsePatchFiles.js +93 -4
  134. package/dist/utils/parsePatchFiles.js.map +1 -1
  135. package/dist/utils/updateDiffHunks.d.ts +13 -0
  136. package/dist/utils/updateDiffHunks.d.ts.map +1 -0
  137. package/dist/utils/updateDiffHunks.js +171 -0
  138. package/dist/utils/updateDiffHunks.js.map +1 -0
  139. package/dist/utils/virtualDiffLayout.d.ts +24 -2
  140. package/dist/utils/virtualDiffLayout.d.ts.map +1 -1
  141. package/dist/utils/virtualDiffLayout.js +49 -1
  142. package/dist/utils/virtualDiffLayout.js.map +1 -1
  143. package/dist/worker/WorkerPoolManager.js +1 -1
  144. package/dist/worker/WorkerPoolManager.js.map +1 -1
  145. package/dist/worker/{wasm-D4DU5jgR.js → wasm-BaDzIkIn.js} +2 -2
  146. package/dist/worker/wasm-BaDzIkIn.js.map +1 -0
  147. package/dist/worker/worker-portable.js +1021 -314
  148. package/dist/worker/worker-portable.js.map +1 -1
  149. package/dist/worker/worker.js +202 -196
  150. package/dist/worker/worker.js.map +1 -1
  151. package/package.json +4 -2
  152. package/dist/editor/css.d.ts +0 -6
  153. package/dist/editor/css.d.ts.map +0 -1
  154. package/dist/editor/css.js +0 -218
  155. package/dist/editor/css.js.map +0 -1
  156. package/dist/editor/quickEdit.d.ts.map +0 -1
  157. package/dist/editor/quickEdit.js.map +0 -1
  158. package/dist/worker/wasm-D4DU5jgR.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"selection.js","names":["edits: TextEdit[]","newSelection: EditorSelection","selectionPositions: Position[]","ordered: Array<{\n index: number;\n start: number;\n end: number;\n }>","edits: ResolvedTextEdit[]","nextSelectionOffsets: Array<[number, number] | undefined>","mergedGroup:\n | {\n start: number;\n end: number;\n indices: number[];\n }\n | undefined","nextOffsets: [number, number]","ordered: Array<{\n index: number;\n start: number;\n end: number;\n text: string;\n }>","nextSelectionOffsets: number[]","nextOffsetPairs: Array<[number, number]>","edit: ResolvedTextEdit | undefined","deleteSelections: EditorSelection[]","accepted: {\n index: number;\n selection: EditorSelection;\n }[]","last: HTMLElement | null","lastTextNode: Text | null","normalizedOffsets: number[]","lineEl: HTMLElement | null","tokens: HTMLElement[]","stack: Array<{ container: Node; index: number }>","current: Node | null","offset","target: HTMLElement | null","current: HTMLElement | null","base"],"sources":["../../src/editor/selection.ts"],"sourcesContent":["import type { DiffLineAnnotation } from '../types';\nimport { applyDocumentChangeToLineAnnotations } from './lineAnnotations';\nimport type {\n Position,\n Range,\n ResolvedTextEdit,\n TextDocument,\n TextDocumentChange,\n TextEdit,\n} from './textDocument';\n\nexport const DirectionBackward = -1;\nexport const DirectionNone = 0;\nexport const DirectionForward = 1;\n\nexport type SelectionDirection =\n | typeof DirectionBackward\n | typeof DirectionNone\n | typeof DirectionForward;\n\nexport interface EditorSelection extends Range {\n direction: SelectionDirection;\n}\n\n/**\n * Converts a selection from a web selection to an editor selection.\n */\nexport function convertSelection(\n range: StaticRange,\n direction: SelectionDirection = DirectionNone\n): EditorSelection | undefined {\n const start = boundaryToPosition(range.startContainer, range.startOffset);\n const end = boundaryToPosition(range.endContainer, range.endOffset);\n if (start === null || end === null) {\n return undefined;\n }\n return {\n start,\n end,\n direction,\n };\n}\n\n/**\n * Resolves the indent edits for a selection.\n */\nexport function resolveIndentEdits(\n textDocument: TextDocument<unknown>,\n selection: EditorSelection,\n tabSize: number,\n outdent: boolean\n): [edits: TextEdit[], nextSelection: EditorSelection] {\n if (textDocument === undefined) {\n return [[], selection];\n }\n const { start, end } = selection;\n const edits: TextEdit[] = [];\n let newSelection: EditorSelection = { ...selection };\n let endLine = end.line;\n if (start.line < end.line && end.character === 0) {\n endLine--;\n }\n for (let line = start.line; line <= endLine; line++) {\n const lineText = textDocument.getLineText(line);\n if (lineText === undefined) {\n continue;\n }\n const indentUnit = lineText.startsWith('\\t') ? '\\t' : ' '.repeat(tabSize);\n let deleteLength = 0;\n let newText = indentUnit;\n if (outdent) {\n if (lineText.startsWith('\\t')) {\n deleteLength = 1;\n } else if (lineText.startsWith(' ')) {\n const leadingSpacesLength =\n lineText.length - lineText.trimStart().length;\n deleteLength = Math.min(indentUnit.length, leadingSpacesLength);\n }\n if (deleteLength === 0) {\n continue;\n }\n newText = '';\n }\n edits.push({\n range: {\n start: { line, character: 0 },\n end: { line, character: deleteLength },\n },\n newText,\n });\n const delta = newText.length - deleteLength;\n if (line === start.line) {\n newSelection = {\n ...newSelection,\n start: {\n ...start,\n character: Math.max(0, start.character + delta),\n },\n };\n }\n if (line === end.line) {\n newSelection = {\n ...newSelection,\n end: {\n ...end,\n character: Math.max(0, end.character + delta),\n },\n };\n }\n }\n return [edits, newSelection];\n}\n\n/**\n * Maps the cursor move to all selections.\n */\nexport function mapCursorMove(\n textDocument: TextDocument<unknown>,\n selections: EditorSelection[],\n shortcut: 'textStart' | 'start' | 'end' | 'up' | 'down' | 'left' | 'right'\n): EditorSelection[] {\n const lineCount = textDocument.lineCount;\n return selections.map((selection) => {\n let { line, character } =\n shortcut === 'up' || shortcut === 'left'\n ? selection.start\n : selection.end;\n if (\n shortcut === 'textStart' ||\n shortcut === 'start' ||\n shortcut === 'end'\n ) {\n if (shortcut === 'textStart') {\n const indent = getLeadingSpaces(textDocument.getLineText(line));\n character = character === indent ? 0 : indent;\n } else {\n character =\n shortcut === 'start' ? 0 : textDocument.getLineText(line).length;\n }\n if (selection.direction === DirectionBackward) {\n line = selection.start.line;\n } else {\n line = selection.end.line;\n }\n } else if (shortcut === 'up') {\n line = Math.max(0, line - 1);\n } else if (shortcut === 'down') {\n line = Math.min(Math.max(lineCount - 1, 0), line + 1);\n } else if (isCollapsedSelection(selection)) {\n if (shortcut === 'left') {\n character--;\n\n if (character < 0) {\n if (line === 0) {\n character = 0;\n } else {\n line = Math.max(0, line - 1);\n character = textDocument.getLineText(line).length;\n }\n }\n } else {\n character++;\n if (character > textDocument.getLineText(line).length) {\n if (line === lineCount - 1) {\n character--;\n } else {\n line = Math.min(Math.max(lineCount - 1, 0), line + 1);\n character = 0;\n }\n }\n }\n }\n const pos = { line, character };\n return {\n start: pos,\n end: pos,\n direction: DirectionNone,\n };\n });\n}\n\n/**\n * Same as mapCursorMove, but with shift key pressed.\n */\nexport function mapSelectionShift(\n textDocument: TextDocument<unknown>,\n selections: EditorSelection[],\n shortcut: 'textStart' | 'start' | 'end' | 'up' | 'down' | 'left' | 'right'\n): EditorSelection[] {\n return selections.map((selection) => {\n const [anchorOffset, focusOffset] = getSelectionAnchorAndFocusOffsets(\n textDocument,\n selection\n );\n const focusPosition = textDocument.positionAt(focusOffset);\n const [movedFocusSelection] = mapCursorMove(\n textDocument,\n [\n {\n start: focusPosition,\n end: focusPosition,\n direction: DirectionNone,\n },\n ],\n shortcut\n );\n const movedFocusOffset = textDocument.offsetAt(movedFocusSelection.start);\n return createSelectionFromAnchorAndFocusOffsets(\n textDocument,\n anchorOffset,\n movedFocusOffset\n );\n });\n}\n\n/**\n * Applies a text change to the given text document\n */\nexport function applyTextChangeToSelections<LAnnotation>(\n textDocument: TextDocument<LAnnotation>,\n selections: EditorSelection[],\n edit: ResolvedTextEdit,\n lineAnnotations?: DiffLineAnnotation<LAnnotation>[],\n tabSize = 2\n): {\n nextSelections: EditorSelection[];\n change?: TextDocumentChange;\n} {\n const primarySelection = selections[selections.length - 1];\n if (primarySelection === undefined) {\n return { nextSelections: [] };\n }\n const selectionPositions: Position[] = [];\n for (const selection of selections) {\n selectionPositions.push(selection.start, selection.end);\n }\n const selectionOffsets = textDocument.offsetsAt(selectionPositions);\n const primaryStartOffset = selectionOffsets[(selections.length - 1) * 2];\n const primaryEndOffset = selectionOffsets[(selections.length - 1) * 2 + 1];\n const ordered: Array<{\n index: number;\n start: number;\n end: number;\n }> = [];\n let isAlreadyOrdered = true;\n for (let index = 0; index < selections.length; index++) {\n const entry = {\n index,\n start: selectionOffsets[index * 2],\n end: selectionOffsets[index * 2 + 1],\n };\n const previous = ordered[ordered.length - 1];\n if (\n previous !== undefined &&\n (entry.start < previous.start ||\n (entry.start === previous.start && entry.end < previous.end))\n ) {\n isAlreadyOrdered = false;\n }\n ordered.push(entry);\n }\n if (!isAlreadyOrdered) {\n ordered.sort((a, b) => {\n const startOrder = a.start - b.start;\n if (startOrder !== 0) {\n return startOrder;\n }\n const endOrder = a.end - b.end;\n if (endOrder !== 0) {\n return endOrder;\n }\n return a.index - b.index;\n });\n }\n const adjustedChange = normalizeLeadingIndentForChange(\n textDocument,\n edit,\n tabSize\n );\n const edits: ResolvedTextEdit[] = [];\n const nextSelectionOffsets: Array<[number, number] | undefined> = Array.from({\n length: selections.length,\n });\n let offsetDelta = 0;\n let mergedGroup:\n | {\n start: number;\n end: number;\n indices: number[];\n }\n | undefined;\n const finalizeMergedGroup = () => {\n if (mergedGroup === undefined) {\n return;\n }\n const perGroupChange = normalizeLeadingIndentForChange(\n textDocument,\n {\n start: mergedGroup.start,\n end: mergedGroup.end,\n text: adjustedChange.text,\n },\n tabSize\n );\n const newText = expandSingleNewlineInsert(\n textDocument,\n perGroupChange.text,\n perGroupChange.start\n );\n edits.push({\n start: perGroupChange.start,\n end: perGroupChange.end,\n text: newText,\n });\n const nextOffsets: [number, number] = [\n mergedGroup.start + offsetDelta + newText.length,\n mergedGroup.start + offsetDelta + newText.length,\n ];\n for (const index of mergedGroup.indices) {\n nextSelectionOffsets[index] = nextOffsets;\n }\n offsetDelta += newText.length - (perGroupChange.end - perGroupChange.start);\n mergedGroup = undefined;\n };\n for (const entry of ordered) {\n const startOffset = Math.max(\n 0,\n entry.start + (adjustedChange.start - primaryStartOffset)\n );\n const endOffset = Math.max(\n startOffset,\n entry.end + (adjustedChange.end - primaryEndOffset)\n );\n if (mergedGroup !== undefined && startOffset < mergedGroup.end) {\n mergedGroup.end = Math.max(mergedGroup.end, endOffset);\n mergedGroup.indices.push(entry.index);\n continue;\n }\n finalizeMergedGroup();\n mergedGroup = {\n start: startOffset,\n end: endOffset,\n indices: [entry.index],\n };\n }\n finalizeMergedGroup();\n\n const change = textDocument.applyResolvedEdits(edits, true, selections);\n const nextSelections = createSelectionsFromOffsetPairs(\n textDocument,\n nextSelectionOffsets.map((offsets) => {\n if (offsets === undefined) {\n throw new Error('Missing next selection offsets');\n }\n return offsets;\n })\n );\n textDocument.setLastUndoSelectionsAfter(nextSelections);\n if (change !== undefined && lineAnnotations !== undefined) {\n const nextLineAnnotations =\n applyDocumentChangeToLineAnnotations<LAnnotation>(\n change,\n lineAnnotations\n );\n if (nextLineAnnotations !== undefined) {\n textDocument.setLastUndoLineAnnotations(\n lineAnnotations,\n nextLineAnnotations\n );\n }\n }\n return { nextSelections, change };\n}\n\n/**\n * Applies a text replace to multiple selections.\n */\nexport function applyTextReplaceToSelections<LAnnotation>(\n textDocument: TextDocument<LAnnotation>,\n selections: EditorSelection[],\n texts: string[],\n lineAnnotations?: DiffLineAnnotation<LAnnotation>[]\n): {\n nextSelections: EditorSelection[];\n change?: TextDocumentChange;\n} {\n if (selections.length !== texts.length) {\n throw new Error(\n 'Selection text replacements must match the selection count'\n );\n }\n const selectionPositions: Position[] = [];\n for (const selection of selections) {\n selectionPositions.push(selection.start, selection.end);\n }\n const selectionOffsets = textDocument.offsetsAt(selectionPositions);\n const ordered: Array<{\n index: number;\n start: number;\n end: number;\n text: string;\n }> = [];\n let isAlreadyOrdered = true;\n for (let index = 0; index < selections.length; index++) {\n const entry = {\n index,\n start: selectionOffsets[index * 2],\n end: selectionOffsets[index * 2 + 1],\n text: texts[index],\n };\n const previous = ordered[ordered.length - 1];\n if (\n previous !== undefined &&\n (entry.start < previous.start ||\n (entry.start === previous.start && entry.end < previous.end))\n ) {\n isAlreadyOrdered = false;\n }\n ordered.push(entry);\n }\n if (!isAlreadyOrdered) {\n ordered.sort((a, b) => {\n const startOrder = a.start - b.start;\n if (startOrder !== 0) {\n return startOrder;\n }\n const endOrder = a.end - b.end;\n if (endOrder !== 0) {\n return endOrder;\n }\n return a.index - b.index;\n });\n }\n const edits: ResolvedTextEdit[] = [];\n const nextSelectionOffsets: number[] = Array.from({\n length: selections.length,\n });\n let offsetDelta = 0;\n let previousEditEnd = -1;\n for (const entry of ordered) {\n if (entry.start < previousEditEnd) {\n throw new Error('Overlapping multi-selection edits are not supported');\n }\n previousEditEnd = entry.end;\n const newText = expandSingleNewlineInsert(\n textDocument,\n entry.text,\n entry.start\n );\n edits.push({\n start: entry.start,\n end: entry.end,\n text: newText,\n });\n nextSelectionOffsets[entry.index] =\n entry.start + offsetDelta + newText.length;\n offsetDelta += newText.length - (entry.end - entry.start);\n }\n\n const change = textDocument.applyResolvedEdits(edits, true, selections);\n const nextSelections = createSelectionsFromOffsetPairs(\n textDocument,\n nextSelectionOffsets.map((offset) => [offset, offset])\n );\n textDocument.setLastUndoSelectionsAfter(nextSelections);\n if (change !== undefined && lineAnnotations !== undefined) {\n const nextLineAnnotations =\n applyDocumentChangeToLineAnnotations<LAnnotation>(\n change,\n lineAnnotations\n );\n if (nextLineAnnotations !== undefined) {\n textDocument.setLastUndoLineAnnotations(\n lineAnnotations,\n nextLineAnnotations\n );\n }\n }\n return { nextSelections, change };\n}\n\n/**\n * Swaps the two characters adjacent to a collapsed selection, matching browser\n * insertTranspose (Ctrl+T) behavior.\n */\nexport function applyTransposeToSelections<LAnnotation>(\n textDocument: TextDocument<LAnnotation>,\n selections: EditorSelection[],\n lineAnnotations?: DiffLineAnnotation<LAnnotation>[]\n): {\n nextSelections: EditorSelection[];\n change?: TextDocumentChange;\n} {\n const text = textDocument.getText();\n const edits: ResolvedTextEdit[] = [];\n const nextOffsetPairs: Array<[number, number]> = [];\n\n for (const selection of selections) {\n const [anchor, focus] = getSelectionAnchorAndFocusOffsets(\n textDocument,\n selection\n );\n if (!isCollapsedSelection(selection)) {\n nextOffsetPairs.push([anchor, focus]);\n continue;\n }\n\n const { line, character } = selection.start;\n const offset = anchor;\n const lineLength = textDocument.getLineText(line).length;\n let edit: ResolvedTextEdit | undefined;\n\n if (character > 0 && character < lineLength) {\n edit = {\n start: offset - 1,\n end: offset + 1,\n text: text[offset] + text[offset - 1],\n };\n nextOffsetPairs.push([offset + 1, offset + 1]);\n } else if (character === lineLength && lineLength >= 2) {\n edit = {\n start: offset - 2,\n end: offset,\n text: text[offset - 1] + text[offset - 2],\n };\n nextOffsetPairs.push([offset, offset]);\n } else if (character === 0 && line > 0 && lineLength > 0) {\n const prevLine = line - 1;\n const prevLength = textDocument.getLineText(prevLine).length;\n const prevEnd = textDocument.offsetAt({\n line: prevLine,\n character: prevLength,\n });\n const prevStart = prevLength > 0 ? prevEnd - 1 : prevEnd;\n edit = {\n start: prevStart,\n end: offset + 1,\n text:\n text[offset] +\n text.slice(prevEnd, offset) +\n text.slice(prevStart, prevEnd),\n };\n nextOffsetPairs.push([offset + 1, offset + 1]);\n } else {\n nextOffsetPairs.push([anchor, focus]);\n continue;\n }\n\n edits.push(edit);\n }\n\n if (edits.length === 0) {\n return { nextSelections: selections };\n }\n\n edits.sort((a, b) => a.start - b.start);\n for (let index = 1; index < edits.length; index++) {\n if (edits[index].start < edits[index - 1].end) {\n throw new Error('Overlapping multi-selection edits are not supported');\n }\n }\n\n const change = textDocument.applyResolvedEdits(edits, true, selections);\n const nextSelections = createSelectionsFromOffsetPairs(\n textDocument,\n nextOffsetPairs\n );\n textDocument.setLastUndoSelectionsAfter(nextSelections);\n if (change !== undefined && lineAnnotations !== undefined) {\n const nextLineAnnotations =\n applyDocumentChangeToLineAnnotations<LAnnotation>(\n change,\n lineAnnotations\n );\n if (nextLineAnnotations !== undefined) {\n textDocument.setLastUndoLineAnnotations(\n lineAnnotations,\n nextLineAnnotations\n );\n }\n }\n return { nextSelections, change };\n}\n\n/**\n * Deletes from each selection to the end of its line, including the line break\n * when the caret is already at the end of a non-final line. Non-collapsed\n * selections delete their selected text instead.\n */\nexport function applyDeleteHardLineForwardToSelections<LAnnotation>(\n textDocument: TextDocument<LAnnotation>,\n selections: EditorSelection[],\n lineAnnotations?: DiffLineAnnotation<LAnnotation>[]\n): {\n nextSelections: EditorSelection[];\n change?: TextDocumentChange;\n} {\n const deleteSelections: EditorSelection[] = selections.map((selection) => {\n const range = resolveDeleteHardLineForwardRange(textDocument, selection);\n const deleteSelection: EditorSelection = {\n start: range.start,\n end: range.end,\n direction: DirectionNone,\n };\n return deleteSelection;\n });\n const hasEffect = deleteSelections.some(\n (selection) => comparePosition(selection.start, selection.end) !== 0\n );\n if (!hasEffect) {\n return { nextSelections: selections };\n }\n return applyTextReplaceToSelections(\n textDocument,\n deleteSelections,\n deleteSelections.map(() => ''),\n lineAnnotations\n );\n}\n\n/**\n * Checks if a selection is collapsed.\n */\nexport function isCollapsedSelection(selection: EditorSelection): boolean {\n return (\n selection.start.line === selection.end.line &&\n selection.start.character === selection.end.character\n );\n}\n\n/**\n * Returns the caret (focus) position for a selection.\n */\nexport function getCaretPosition(selection: EditorSelection): Position {\n const { start, end, direction } = selection;\n return direction === DirectionBackward ? start : end;\n}\n\n/**\n * Checks if a line is editable.\n */\nexport function isLineEditable(lineType: string): boolean {\n return (\n lineType === 'context' ||\n lineType === 'change-addition' ||\n lineType === 'context-expanded'\n );\n}\n\n/**\n * Checks whether selections `a` and `b` intersect.\n */\nexport function selectionIntersects(\n a: EditorSelection,\n b: EditorSelection\n): boolean {\n const aCollapsed = isCollapsedSelection(a);\n const bCollapsed = isCollapsedSelection(b);\n if (aCollapsed && bCollapsed) {\n return comparePosition(a.start, b.start) === 0;\n }\n if (aCollapsed) {\n return (\n comparePosition(b.start, a.start) <= 0 &&\n comparePosition(a.start, b.end) <= 0\n );\n }\n if (bCollapsed) {\n return (\n comparePosition(a.start, b.start) <= 0 &&\n comparePosition(b.start, a.end) <= 0\n );\n }\n return (\n comparePosition(a.start, b.end) < 0 && comparePosition(b.start, a.end) < 0\n );\n}\n\n/**\n * Compares two positions.\n */\nexport function comparePosition(a: Position, b: Position): number {\n if (a.line !== b.line) {\n return a.line - b.line;\n }\n return a.character - b.character;\n}\n\n/**\n * Creates a selection from anchor and focus offsets.\n */\nexport function createSelectionFromAnchorAndFocusOffsets(\n textDocument: TextDocument<unknown>,\n anchorOffset: number,\n focusOffset: number\n): EditorSelection {\n const direction =\n anchorOffset === focusOffset\n ? DirectionNone\n : anchorOffset < focusOffset\n ? DirectionForward\n : DirectionBackward;\n const start = Math.min(anchorOffset, focusOffset);\n const end = Math.max(anchorOffset, focusOffset);\n return {\n start: textDocument.positionAt(start),\n end: textDocument.positionAt(end),\n direction,\n };\n}\n\n/**\n * Creates a selection from a anchor and focus selection.\n */\nexport function createSelectionFrom(\n anchorSelection: EditorSelection,\n focusSelection: EditorSelection\n): EditorSelection {\n const anchor =\n anchorSelection.direction === DirectionBackward\n ? anchorSelection.end\n : anchorSelection.start;\n const currentStartOrder = comparePosition(anchor, focusSelection.start);\n const currentEndOrder = comparePosition(anchor, focusSelection.end);\n let focus = focusSelection.end;\n if (currentStartOrder <= 0) {\n focus = focusSelection.end;\n } else if (currentEndOrder >= 0) {\n focus = focusSelection.start;\n } else {\n // When the original anchor sits inside `current`, keep whichever edge\n // stayed at the anchor so drag direction remains stable.\n focus = currentStartOrder === 0 ? focusSelection.end : focusSelection.start;\n }\n const anchorVsFocus = comparePosition(anchor, focus);\n const direction: SelectionDirection =\n anchorVsFocus === 0\n ? DirectionNone\n : anchorVsFocus < 0\n ? DirectionForward\n : DirectionBackward;\n const selectionStart = anchorVsFocus <= 0 ? anchor : focus;\n const selectionEnd = anchorVsFocus <= 0 ? focus : anchor;\n return {\n start: selectionStart,\n end: selectionEnd,\n direction,\n };\n}\n\n/**\n * Extends or shrinks the selection `original` using the endpoints of `target`, \\\n * matching contenteditable shift + click extend behavior.\n */\nexport function extendSelection(\n original: EditorSelection,\n target: EditorSelection\n): EditorSelection {\n const leftExtended = comparePosition(target.start, original.start) < 0;\n const rightExtended = comparePosition(target.end, original.end) > 0;\n\n if (leftExtended && !rightExtended) {\n return {\n start: target.start,\n end: original.end,\n direction: DirectionBackward,\n };\n }\n\n if (rightExtended && !leftExtended) {\n return {\n start: original.start,\n end: target.end,\n direction: DirectionForward,\n };\n }\n\n if (original.direction === DirectionBackward) {\n return {\n start: target.start,\n end: original.end,\n direction:\n comparePosition(target.start, original.end) === 0\n ? DirectionNone\n : DirectionBackward,\n };\n }\n\n return {\n start: original.start,\n end: target.end,\n direction:\n comparePosition(original.start, target.end) === 0\n ? DirectionNone\n : DirectionForward,\n };\n}\n\n/**\n * Extends multiple selections.\n */\nexport function extendSelections(\n selections: EditorSelection[],\n target: EditorSelection\n): EditorSelection[] {\n const newSelections = selections.map((selection) => {\n return extendSelection(selection, target);\n });\n return mergeOverlappingSelections(newSelections);\n}\n\n/**\n * Merges overlapping selections.\n */\nexport function mergeOverlappingSelections(\n selections: EditorSelection[]\n): EditorSelection[] {\n if (selections.length <= 1) {\n return selections;\n }\n const selected = new Set<number>();\n const accepted: {\n index: number;\n selection: EditorSelection;\n }[] = [];\n for (let i = selections.length - 1; i >= 0; i--) {\n const selection = selections[i];\n if (selection === undefined) {\n continue;\n }\n let left = 0;\n let right = accepted.length;\n while (left < right) {\n const mid = Math.floor((left + right) / 2);\n const candidate = accepted[mid]?.selection;\n if (candidate === undefined) {\n break;\n }\n if (comparePosition(candidate.start, selection.start) < 0) {\n left = mid + 1;\n } else {\n right = mid;\n }\n }\n const previous = accepted[left - 1]?.selection;\n const next = accepted[left]?.selection;\n if (\n (previous !== undefined && selectionIntersects(previous, selection)) ||\n (next !== undefined && selectionIntersects(next, selection))\n ) {\n continue;\n }\n accepted.splice(left, 0, { index: i, selection });\n selected.add(i);\n }\n return selections.filter((_, index) => selected.has(index));\n}\n\n/**\n * Finds the next matching word and updates the selections.\n */\nexport function findNexMatch(\n textDocument: TextDocument<unknown>,\n selections: EditorSelection[]\n): EditorSelection[] | undefined {\n if (selections.length === 0) {\n return undefined;\n }\n\n const normalizedSelections = selections.map((selection) =>\n isCollapsedSelection(selection)\n ? expandCollapsedSelectionToWord(textDocument, selection)\n : selection\n );\n const texts = normalizedSelections.map((s) => textDocument.getText(s));\n const needle = texts[0];\n if (needle.length === 0 || texts.some((t) => t !== needle)) {\n return undefined;\n }\n\n const occupied = normalizedSelections.map(\n (s) =>\n [textDocument.offsetAt(s.start), textDocument.offsetAt(s.end)] as [\n number,\n number,\n ]\n );\n const nextOffset = textDocument.findNextNonOverlappingSubstring(\n needle,\n occupied\n );\n if (nextOffset === undefined) {\n return normalizedSelections.some((selection, index) => {\n const original = selections[index];\n return (\n comparePosition(selection.start, original.start) !== 0 ||\n comparePosition(selection.end, original.end) !== 0 ||\n selection.direction !== original.direction\n );\n })\n ? normalizedSelections\n : undefined;\n }\n const added = createSelectionFromAnchorAndFocusOffsets(\n textDocument,\n nextOffset,\n nextOffset + needle.length\n );\n return [...normalizedSelections, added];\n}\n\n/**\n * Get the full selection of the document.\n */\nexport function getDocumentFullSelection(\n textDocument: TextDocument<unknown>\n): EditorSelection {\n const lastLine = textDocument.lineCount - 1;\n const lastCharacter = textDocument.getLineText(lastLine)?.length ?? 0;\n return {\n start: { line: 0, character: 0 },\n end: { line: lastLine, character: lastCharacter },\n direction: DirectionForward,\n };\n}\n\n/**\n * Get the boundary selection of the document.\n */\nexport function getDocumentBoundarySelection(\n textDocument: TextDocument<unknown>,\n atEnd: boolean\n): EditorSelection {\n const line = atEnd ? textDocument.lineCount - 1 : 0;\n const character = atEnd ? (textDocument.getLineText(line)?.length ?? 0) : 0;\n const start = { line, character };\n return {\n start: start,\n end: start,\n direction: DirectionForward,\n };\n}\n\n/**\n * Get the text of the selections for the given text document.\n */\nexport function getSelectionText(\n textDocument: TextDocument<unknown>,\n selections: EditorSelection[]\n): string {\n return [...selections]\n .sort((a, b) => {\n const startOrder = comparePosition(a.start, b.start);\n if (startOrder !== 0) {\n return startOrder;\n }\n return comparePosition(a.end, b.end);\n })\n .map((selection) => {\n if (isCollapsedSelection(selection)) {\n return textDocument.getLineText(selection.start.line, false);\n }\n return textDocument.getText(selection);\n })\n .join('\\n');\n}\n\n/**\n * Get the anchor node and offset for a selection.\n */\nexport function getSelectionAnchor(\n lineElement: HTMLElement,\n character: number\n): [Node, number] {\n const ch = Math.max(0, character);\n const tokens = collectTokens(lineElement);\n\n let last: HTMLElement | null = null;\n for (const token of tokens) {\n last = token;\n const base = getCharacterIndex(token)!;\n const end = base + (token.textContent?.length ?? 0);\n if (ch <= end) {\n const anchor = textAt(token, ch < base ? 0 : ch - base);\n if (anchor !== null) {\n return anchor;\n }\n }\n }\n\n if (last !== null) {\n const anchor = textAt(last, last.textContent?.length ?? 0);\n if (anchor !== null) {\n return anchor;\n }\n return [last, 0];\n }\n\n let textOffset = 0;\n let lastTextNode: Text | null = null;\n for (const child of lineElement.childNodes) {\n if (child.nodeType === 1 && (child as HTMLElement).tagName === 'BR') {\n return [child, 0];\n }\n if (child.nodeType !== 3) {\n continue;\n }\n lastTextNode = child as Text;\n const len = getTextOffset(\n lastTextNode.textContent,\n lastTextNode.textContent?.length ?? 0\n );\n if (ch <= textOffset + len) {\n return [\n lastTextNode,\n getTextOffset(lastTextNode.textContent, ch - textOffset),\n ];\n }\n textOffset += len;\n }\n\n if (lastTextNode !== null) {\n return [\n lastTextNode,\n getTextOffset(\n lastTextNode.textContent,\n lastTextNode.textContent?.length ?? 0\n ),\n ];\n }\n return [lineElement, 0];\n}\n\n/**\n * Expands a zero-width selection to the word-like segment that contains the caret.\n */\nexport function expandCollapsedSelectionToWord(\n textDocument: TextDocument<unknown>,\n selection: EditorSelection\n): EditorSelection {\n const { line, character } = selection.start;\n const lineText = textDocument.getLineText(line);\n const ch = Math.max(0, Math.min(character, lineText.length));\n const span = expandCollapsedLineWord(lineText, ch);\n if (span === undefined) {\n return selection;\n }\n return {\n start: { line, character: span.start },\n end: { line, character: span.end },\n direction: DirectionForward,\n };\n}\n\nfunction expandCollapsedLineWord(\n lineText: string,\n character: number\n): { start: number; end: number } | undefined {\n const segmenter = new Intl.Segmenter(undefined, {\n granularity: 'word',\n });\n for (const seg of segmenter.segment(lineText)) {\n if (seg.isWordLike !== true) {\n continue;\n }\n const lo = seg.index;\n const hi = lo + seg.segment.length;\n // Match when the cursor is inside the word or immediately touching\n // one of its boundaries — not when separated by non-word characters.\n if (character >= lo && character <= hi) {\n return { start: lo, end: hi };\n }\n }\n return undefined;\n}\n\nfunction getSelectionAnchorAndFocusOffsets(\n textDocument: TextDocument<unknown>,\n selection: EditorSelection\n): [anchorOffset: number, focusOffset: number] {\n const isBackward = selection.direction === DirectionBackward;\n return [\n textDocument.offsetAt(isBackward ? selection.end : selection.start),\n textDocument.offsetAt(getCaretPosition(selection)),\n ];\n}\n\n// Resolves the range removed by deleteHardLineForward for one selection.\nfunction resolveDeleteHardLineForwardRange(\n textDocument: TextDocument<unknown>,\n selection: EditorSelection\n): Range {\n if (!isCollapsedSelection(selection)) {\n return { start: selection.start, end: selection.end };\n }\n const { line, character } = selection.start;\n const lineText = textDocument.getLineText(line);\n const lineLength = lineText.length;\n if (character < lineLength) {\n return {\n start: { line, character },\n end: { line, character: lineLength },\n };\n }\n if (line < textDocument.lineCount - 1) {\n return {\n start: { line, character },\n end: { line: line + 1, character: 0 },\n };\n }\n return {\n start: { line, character },\n end: { line, character },\n };\n}\n\n// When the user inserts a lone line break, copy the current line's indentation onto the new line.\nfunction expandSingleNewlineInsert(\n textDocument: TextDocument<unknown>,\n insertText: string,\n insertStartOffset: number\n): string {\n if (insertText !== '\\n' && insertText !== '\\r\\n') {\n return insertText;\n }\n const line = textDocument.positionAt(insertStartOffset).line;\n const lineText = textDocument.getLineText(line);\n const indentLen = getLeadingSpaces(lineText);\n if (indentLen === 0) {\n return insertText;\n }\n return insertText + lineText.slice(0, indentLen);\n}\n\nfunction getLeadingSpaces(text: string): number {\n let indent = 0;\n for (; indent < text.length; indent++) {\n const c = text.charCodeAt(indent);\n if (c !== /* space */ 32 && c !== /* tab */ 9) {\n break;\n }\n }\n return indent;\n}\n\nfunction createSelectionsFromOffsetPairs(\n textDocument: TextDocument<unknown>,\n offsetPairs: readonly [anchorOffset: number, focusOffset: number][]\n): EditorSelection[] {\n const normalizedOffsets: number[] = [];\n for (const [anchorOffset, focusOffset] of offsetPairs) {\n normalizedOffsets.push(\n Math.min(anchorOffset, focusOffset),\n Math.max(anchorOffset, focusOffset)\n );\n }\n const positions = textDocument.positionsAt(normalizedOffsets);\n return offsetPairs.map(([anchorOffset, focusOffset], index) => {\n const direction =\n anchorOffset === focusOffset\n ? DirectionNone\n : anchorOffset < focusOffset\n ? DirectionForward\n : DirectionBackward;\n return {\n start: positions[index * 2],\n end: positions[index * 2 + 1],\n direction,\n };\n });\n}\n\n// Expands a backspace over leading spaces into one soft-tab width so mixed hard/soft indentation\n// behaves like the explicit outdent command.\nfunction normalizeLeadingIndentForChange(\n textDocument: TextDocument<unknown>,\n change: ResolvedTextEdit,\n tabSize: number\n): ResolvedTextEdit {\n if (change.text !== '' || change.start !== change.end - 1) {\n return change;\n }\n const caretPosition = textDocument.positionAt(change.end);\n if (caretPosition.character === 0) {\n return change;\n }\n const lineText = textDocument.getLineText(caretPosition.line);\n const leadingText = lineText.slice(0, caretPosition.character);\n if (/[^ \\t]/.test(leadingText)) {\n return change;\n }\n if (lineText[caretPosition.character - 1] === '\\t') {\n return change;\n }\n const softTabStart = Math.max(0, caretPosition.character - tabSize);\n const softTabText = lineText.slice(softTabStart, caretPosition.character);\n if (softTabText.length === tabSize && /^ +$/.test(softTabText)) {\n return {\n ...change,\n start: change.end - softTabText.length,\n };\n }\n return change;\n}\n\nfunction boundaryToPosition(node: Node, offset: number): Position | null {\n const host = node.nodeType === 1 ? (node as HTMLElement) : node.parentElement;\n let lineEl: HTMLElement | null = host;\n while (lineEl !== null && getLineIndex(lineEl) === undefined) {\n lineEl = lineEl.parentElement;\n }\n if (lineEl === null) {\n return null;\n }\n const line = getLineIndex(lineEl);\n if (line === undefined) {\n return null;\n }\n\n if (node.nodeType === 3) {\n if (node.parentElement === null) {\n return null;\n }\n if (findTokenSpan(node.parentElement) !== null) {\n return { line, character: getLineChildEnd(node, offset) };\n }\n return {\n line,\n character:\n offsetBefore(lineEl, node) + getTextOffset(node.textContent, offset),\n };\n }\n\n if (node.nodeType === 1) {\n const el = node as HTMLElement;\n if (el.tagName === 'DIV') {\n let character = 0;\n for (let i = 0; i < offset; i++) {\n character = getLineChildEnd(el.childNodes[i]);\n }\n return { line, character };\n }\n if (el.tagName === 'BR') {\n return { line, character: 0 };\n }\n if (el.tagName === 'SPAN') {\n if (offset < el.childNodes.length) {\n const next = el.childNodes[offset];\n if (next?.nodeType === 1) {\n const nextBase = getCharacterIndex(next as HTMLElement);\n if (nextBase !== undefined) {\n return { line, character: nextBase };\n }\n const token = findTokenSpan(next as HTMLElement);\n const tokenBase =\n token === null ? undefined : getCharacterIndex(token);\n if (tokenBase !== undefined) {\n return { line, character: tokenBase };\n }\n }\n }\n return {\n line,\n character:\n offset > 0\n ? getLineChildEnd(el.childNodes[offset - 1])\n : offsetBefore(lineEl, el),\n };\n }\n return { line, character: offsetBefore(lineEl, el) };\n }\n return null;\n}\n\nfunction collectTokens(line: HTMLElement): HTMLElement[] {\n const tokens: HTMLElement[] = [];\n for (const child of line.childNodes) {\n if (child.nodeType !== 1) {\n continue;\n }\n const el = child as HTMLElement;\n if (el.tagName !== 'SPAN') {\n continue;\n }\n const base = getCharacterIndex(el);\n if (base !== undefined) {\n tokens.push(el);\n continue;\n }\n for (const nested of el.childNodes) {\n if (\n nested.nodeType === 1 &&\n getCharacterIndex(nested as HTMLElement) !== undefined\n ) {\n tokens.push(nested as HTMLElement);\n }\n }\n }\n return tokens;\n}\n\nfunction textAt(token: HTMLElement, offset: number): [Node, number] | null {\n let remaining = Math.max(0, offset);\n const stack: Array<{ container: Node; index: number }> = [\n { container: token, index: 0 },\n ];\n while (stack.length > 0) {\n const frame = stack[stack.length - 1];\n if (frame.index >= frame.container.childNodes.length) {\n stack.pop();\n continue;\n }\n const walkNode = frame.container.childNodes[frame.index];\n frame.index++;\n if (walkNode.nodeType === 3) {\n const len = getTextOffset(\n walkNode.textContent,\n walkNode.textContent?.length ?? 0\n );\n if (remaining <= len) {\n return [walkNode, remaining];\n }\n remaining -= len;\n } else if (walkNode.nodeType === 1) {\n stack.push({ container: walkNode, index: 0 });\n }\n }\n return null;\n}\n\nfunction textLengthBefore(root: Node, target: Node): number {\n let before = 0;\n const stack: Array<{ container: Node; index: number }> = [\n { container: root, index: 0 },\n ];\n while (stack.length > 0) {\n const frame = stack[stack.length - 1];\n if (frame.index >= frame.container.childNodes.length) {\n stack.pop();\n continue;\n }\n const walkNode = frame.container.childNodes[frame.index];\n if (walkNode === target) {\n return before;\n }\n frame.index++;\n if (walkNode.nodeType === 3) {\n before += getTextOffset(\n walkNode.textContent,\n walkNode.textContent?.length ?? 0\n );\n } else if (walkNode.nodeType === 1) {\n stack.push({ container: walkNode, index: 0 });\n }\n }\n return before;\n}\n\nfunction isInside(token: HTMLElement, node: Node): boolean {\n let current: Node | null = node;\n while (current !== null) {\n if (current === token) {\n return true;\n }\n current = current.parentElement;\n }\n return false;\n}\n\nfunction offsetBefore(line: HTMLElement, node: Node): number {\n if (node.parentElement === line) {\n let offset = 0;\n const index = Array.prototype.indexOf.call(line.childNodes, node);\n for (let i = 0; i < index; i++) {\n offset = getLineChildEnd(line.childNodes[i]);\n }\n return offset;\n }\n for (const token of collectTokens(line)) {\n if (isInside(token, node)) {\n const base = getCharacterIndex(token)!;\n return base + (node.nodeType === 3 ? textLengthBefore(token, node) : 0);\n }\n }\n let offset = 0;\n let target: HTMLElement | null =\n node.nodeType === 1 ? (node as HTMLElement) : node.parentElement;\n while (target !== null && target.parentElement !== null) {\n if (getLineIndex(target.parentElement) !== undefined) {\n break;\n }\n const parent = target.parentElement;\n const index = Array.prototype.indexOf.call(parent.childNodes, target);\n for (let i = 0; i < index; i++) {\n offset = getLineChildEnd(parent.childNodes[i]);\n }\n target = parent;\n }\n return offset;\n}\n\nfunction findTokenSpan(el: HTMLElement): HTMLElement | null {\n let current: HTMLElement | null = el;\n while (current !== null) {\n if (getLineIndex(current) !== undefined) {\n return null;\n }\n if (getCharacterIndex(current) !== undefined) {\n return current;\n }\n current = current.parentElement;\n }\n return null;\n}\n\nfunction getLineChildEnd(\n child: Node | undefined,\n textOffsetInChild?: number\n): number {\n if (child === undefined) {\n return 0;\n }\n if (child.nodeType === 3) {\n const parent = child.parentElement;\n if (parent === null) {\n return 0;\n }\n const token = findTokenSpan(parent);\n if (token === null) {\n return 0;\n }\n const base = getCharacterIndex(token);\n if (base === undefined) {\n return 0;\n }\n const length =\n textOffsetInChild === undefined\n ? getTextOffset(child.textContent, child.textContent?.length ?? 0)\n : getTextOffset(child.textContent, textOffsetInChild);\n return base + textLengthBefore(token, child) + length;\n }\n if (child.nodeType !== 1) {\n return 0;\n }\n const el = child as HTMLElement;\n if (el.tagName !== 'SPAN' && el.tagName !== 'BR') {\n return 0;\n }\n const base = getCharacterIndex(el);\n if (base !== undefined) {\n return base + (el.textContent?.length ?? 0);\n }\n let end = 0;\n for (const token of el.childNodes) {\n end = Math.max(end, getLineChildEnd(token));\n }\n return end;\n}\n\nfunction getLineIndex(el: HTMLElement): number | undefined {\n const { line } = el.dataset;\n if (line !== undefined) {\n return parseInt(line) - 1;\n }\n return undefined;\n}\n\nfunction getCharacterIndex(el: HTMLElement): number | undefined {\n const { char } = el.dataset;\n return char !== undefined ? parseInt(char) : undefined;\n}\n\nfunction getTextOffset(\n text: string | null | undefined,\n offset: number\n): number {\n const value = text ?? '';\n const lineBreakIndex = value.search(/[\\r\\n]/);\n return Math.min(\n offset,\n lineBreakIndex === -1 ? value.length : lineBreakIndex\n );\n}\n"],"mappings":";;;AAWA,MAAa,oBAAoB;AACjC,MAAa,gBAAgB;AAC7B,MAAa,mBAAmB;;;;AAchC,SAAgB,iBACd,OACA,YAAgC,eACH;CAC7B,MAAM,QAAQ,mBAAmB,MAAM,gBAAgB,MAAM,YAAY;CACzE,MAAM,MAAM,mBAAmB,MAAM,cAAc,MAAM,UAAU;AACnE,KAAI,UAAU,QAAQ,QAAQ,KAC5B;AAEF,QAAO;EACL;EACA;EACA;EACD;;;;;AAMH,SAAgB,mBACd,cACA,WACA,SACA,SACqD;AACrD,KAAI,iBAAiB,OACnB,QAAO,CAAC,EAAE,EAAE,UAAU;CAExB,MAAM,EAAE,OAAO,QAAQ;CACvB,MAAMA,QAAoB,EAAE;CAC5B,IAAIC,eAAgC,EAAE,GAAG,WAAW;CACpD,IAAI,UAAU,IAAI;AAClB,KAAI,MAAM,OAAO,IAAI,QAAQ,IAAI,cAAc,EAC7C;AAEF,MAAK,IAAI,OAAO,MAAM,MAAM,QAAQ,SAAS,QAAQ;EACnD,MAAM,WAAW,aAAa,YAAY,KAAK;AAC/C,MAAI,aAAa,OACf;EAEF,MAAM,aAAa,SAAS,WAAW,IAAK,GAAG,MAAO,IAAI,OAAO,QAAQ;EACzE,IAAI,eAAe;EACnB,IAAI,UAAU;AACd,MAAI,SAAS;AACX,OAAI,SAAS,WAAW,IAAK,CAC3B,gBAAe;YACN,SAAS,WAAW,IAAI,EAAE;IACnC,MAAM,sBACJ,SAAS,SAAS,SAAS,WAAW,CAAC;AACzC,mBAAe,KAAK,IAAI,WAAW,QAAQ,oBAAoB;;AAEjE,OAAI,iBAAiB,EACnB;AAEF,aAAU;;AAEZ,QAAM,KAAK;GACT,OAAO;IACL,OAAO;KAAE;KAAM,WAAW;KAAG;IAC7B,KAAK;KAAE;KAAM,WAAW;KAAc;IACvC;GACD;GACD,CAAC;EACF,MAAM,QAAQ,QAAQ,SAAS;AAC/B,MAAI,SAAS,MAAM,KACjB,gBAAe;GACb,GAAG;GACH,OAAO;IACL,GAAG;IACH,WAAW,KAAK,IAAI,GAAG,MAAM,YAAY,MAAM;IAChD;GACF;AAEH,MAAI,SAAS,IAAI,KACf,gBAAe;GACb,GAAG;GACH,KAAK;IACH,GAAG;IACH,WAAW,KAAK,IAAI,GAAG,IAAI,YAAY,MAAM;IAC9C;GACF;;AAGL,QAAO,CAAC,OAAO,aAAa;;;;;AAM9B,SAAgB,cACd,cACA,YACA,UACmB;CACnB,MAAM,YAAY,aAAa;AAC/B,QAAO,WAAW,KAAK,cAAc;EACnC,IAAI,EAAE,MAAM,cACV,aAAa,QAAQ,aAAa,SAC9B,UAAU,QACV,UAAU;AAChB,MACE,aAAa,eACb,aAAa,WACb,aAAa,OACb;AACA,OAAI,aAAa,aAAa;IAC5B,MAAM,SAAS,iBAAiB,aAAa,YAAY,KAAK,CAAC;AAC/D,gBAAY,cAAc,SAAS,IAAI;SAEvC,aACE,aAAa,UAAU,IAAI,aAAa,YAAY,KAAK,CAAC;AAE9D,OAAI,UAAU,cAAc,kBAC1B,QAAO,UAAU,MAAM;OAEvB,QAAO,UAAU,IAAI;aAEd,aAAa,KACtB,QAAO,KAAK,IAAI,GAAG,OAAO,EAAE;WACnB,aAAa,OACtB,QAAO,KAAK,IAAI,KAAK,IAAI,YAAY,GAAG,EAAE,EAAE,OAAO,EAAE;WAC5C,qBAAqB,UAAU,CACxC,KAAI,aAAa,QAAQ;AACvB;AAEA,OAAI,YAAY,EACd,KAAI,SAAS,EACX,aAAY;QACP;AACL,WAAO,KAAK,IAAI,GAAG,OAAO,EAAE;AAC5B,gBAAY,aAAa,YAAY,KAAK,CAAC;;SAG1C;AACL;AACA,OAAI,YAAY,aAAa,YAAY,KAAK,CAAC,OAC7C,KAAI,SAAS,YAAY,EACvB;QACK;AACL,WAAO,KAAK,IAAI,KAAK,IAAI,YAAY,GAAG,EAAE,EAAE,OAAO,EAAE;AACrD,gBAAY;;;EAKpB,MAAM,MAAM;GAAE;GAAM;GAAW;AAC/B,SAAO;GACL,OAAO;GACP,KAAK;GACL,WAAW;GACZ;GACD;;;;;AAMJ,SAAgB,kBACd,cACA,YACA,UACmB;AACnB,QAAO,WAAW,KAAK,cAAc;EACnC,MAAM,CAAC,cAAc,eAAe,kCAClC,cACA,UACD;EACD,MAAM,gBAAgB,aAAa,WAAW,YAAY;EAC1D,MAAM,CAAC,uBAAuB,cAC5B,cACA,CACE;GACE,OAAO;GACP,KAAK;GACL,WAAW;GACZ,CACF,EACD,SACD;AAED,SAAO,yCACL,cACA,cAHuB,aAAa,SAAS,oBAAoB,MAAM,CAKxE;GACD;;;;;AAMJ,SAAgB,4BACd,cACA,YACA,MACA,iBACA,UAAU,GAIV;AAEA,KADyB,WAAW,WAAW,SAAS,OAC/B,OACvB,QAAO,EAAE,gBAAgB,EAAE,EAAE;CAE/B,MAAMC,qBAAiC,EAAE;AACzC,MAAK,MAAM,aAAa,WACtB,oBAAmB,KAAK,UAAU,OAAO,UAAU,IAAI;CAEzD,MAAM,mBAAmB,aAAa,UAAU,mBAAmB;CACnE,MAAM,qBAAqB,kBAAkB,WAAW,SAAS,KAAK;CACtE,MAAM,mBAAmB,kBAAkB,WAAW,SAAS,KAAK,IAAI;CACxE,MAAMC,UAID,EAAE;CACP,IAAI,mBAAmB;AACvB,MAAK,IAAI,QAAQ,GAAG,QAAQ,WAAW,QAAQ,SAAS;EACtD,MAAM,QAAQ;GACZ;GACA,OAAO,iBAAiB,QAAQ;GAChC,KAAK,iBAAiB,QAAQ,IAAI;GACnC;EACD,MAAM,WAAW,QAAQ,QAAQ,SAAS;AAC1C,MACE,aAAa,WACZ,MAAM,QAAQ,SAAS,SACrB,MAAM,UAAU,SAAS,SAAS,MAAM,MAAM,SAAS,KAE1D,oBAAmB;AAErB,UAAQ,KAAK,MAAM;;AAErB,KAAI,CAAC,iBACH,SAAQ,MAAM,GAAG,MAAM;EACrB,MAAM,aAAa,EAAE,QAAQ,EAAE;AAC/B,MAAI,eAAe,EACjB,QAAO;EAET,MAAM,WAAW,EAAE,MAAM,EAAE;AAC3B,MAAI,aAAa,EACf,QAAO;AAET,SAAO,EAAE,QAAQ,EAAE;GACnB;CAEJ,MAAM,iBAAiB,gCACrB,cACA,MACA,QACD;CACD,MAAMC,QAA4B,EAAE;CACpC,MAAMC,uBAA4D,MAAM,KAAK,EAC3E,QAAQ,WAAW,QACpB,CAAC;CACF,IAAI,cAAc;CAClB,IAAIC;CAOJ,MAAM,4BAA4B;AAChC,MAAI,gBAAgB,OAClB;EAEF,MAAM,iBAAiB,gCACrB,cACA;GACE,OAAO,YAAY;GACnB,KAAK,YAAY;GACjB,MAAM,eAAe;GACtB,EACD,QACD;EACD,MAAM,UAAU,0BACd,cACA,eAAe,MACf,eAAe,MAChB;AACD,QAAM,KAAK;GACT,OAAO,eAAe;GACtB,KAAK,eAAe;GACpB,MAAM;GACP,CAAC;EACF,MAAMC,cAAgC,CACpC,YAAY,QAAQ,cAAc,QAAQ,QAC1C,YAAY,QAAQ,cAAc,QAAQ,OAC3C;AACD,OAAK,MAAM,SAAS,YAAY,QAC9B,sBAAqB,SAAS;AAEhC,iBAAe,QAAQ,UAAU,eAAe,MAAM,eAAe;AACrE,gBAAc;;AAEhB,MAAK,MAAM,SAAS,SAAS;EAC3B,MAAM,cAAc,KAAK,IACvB,GACA,MAAM,SAAS,eAAe,QAAQ,oBACvC;EACD,MAAM,YAAY,KAAK,IACrB,aACA,MAAM,OAAO,eAAe,MAAM,kBACnC;AACD,MAAI,gBAAgB,UAAa,cAAc,YAAY,KAAK;AAC9D,eAAY,MAAM,KAAK,IAAI,YAAY,KAAK,UAAU;AACtD,eAAY,QAAQ,KAAK,MAAM,MAAM;AACrC;;AAEF,uBAAqB;AACrB,gBAAc;GACZ,OAAO;GACP,KAAK;GACL,SAAS,CAAC,MAAM,MAAM;GACvB;;AAEH,sBAAqB;CAErB,MAAM,SAAS,aAAa,mBAAmB,OAAO,MAAM,WAAW;CACvE,MAAM,iBAAiB,gCACrB,cACA,qBAAqB,KAAK,YAAY;AACpC,MAAI,YAAY,OACd,OAAM,IAAI,MAAM,iCAAiC;AAEnD,SAAO;GACP,CACH;AACD,cAAa,2BAA2B,eAAe;AACvD,KAAI,WAAW,UAAa,oBAAoB,QAAW;EACzD,MAAM,sBACJ,qCACE,QACA,gBACD;AACH,MAAI,wBAAwB,OAC1B,cAAa,2BACX,iBACA,oBACD;;AAGL,QAAO;EAAE;EAAgB;EAAQ;;;;;AAMnC,SAAgB,6BACd,cACA,YACA,OACA,iBAIA;AACA,KAAI,WAAW,WAAW,MAAM,OAC9B,OAAM,IAAI,MACR,6DACD;CAEH,MAAML,qBAAiC,EAAE;AACzC,MAAK,MAAM,aAAa,WACtB,oBAAmB,KAAK,UAAU,OAAO,UAAU,IAAI;CAEzD,MAAM,mBAAmB,aAAa,UAAU,mBAAmB;CACnE,MAAMM,UAKD,EAAE;CACP,IAAI,mBAAmB;AACvB,MAAK,IAAI,QAAQ,GAAG,QAAQ,WAAW,QAAQ,SAAS;EACtD,MAAM,QAAQ;GACZ;GACA,OAAO,iBAAiB,QAAQ;GAChC,KAAK,iBAAiB,QAAQ,IAAI;GAClC,MAAM,MAAM;GACb;EACD,MAAM,WAAW,QAAQ,QAAQ,SAAS;AAC1C,MACE,aAAa,WACZ,MAAM,QAAQ,SAAS,SACrB,MAAM,UAAU,SAAS,SAAS,MAAM,MAAM,SAAS,KAE1D,oBAAmB;AAErB,UAAQ,KAAK,MAAM;;AAErB,KAAI,CAAC,iBACH,SAAQ,MAAM,GAAG,MAAM;EACrB,MAAM,aAAa,EAAE,QAAQ,EAAE;AAC/B,MAAI,eAAe,EACjB,QAAO;EAET,MAAM,WAAW,EAAE,MAAM,EAAE;AAC3B,MAAI,aAAa,EACf,QAAO;AAET,SAAO,EAAE,QAAQ,EAAE;GACnB;CAEJ,MAAMJ,QAA4B,EAAE;CACpC,MAAMK,uBAAiC,MAAM,KAAK,EAChD,QAAQ,WAAW,QACpB,CAAC;CACF,IAAI,cAAc;CAClB,IAAI,kBAAkB;AACtB,MAAK,MAAM,SAAS,SAAS;AAC3B,MAAI,MAAM,QAAQ,gBAChB,OAAM,IAAI,MAAM,sDAAsD;AAExE,oBAAkB,MAAM;EACxB,MAAM,UAAU,0BACd,cACA,MAAM,MACN,MAAM,MACP;AACD,QAAM,KAAK;GACT,OAAO,MAAM;GACb,KAAK,MAAM;GACX,MAAM;GACP,CAAC;AACF,uBAAqB,MAAM,SACzB,MAAM,QAAQ,cAAc,QAAQ;AACtC,iBAAe,QAAQ,UAAU,MAAM,MAAM,MAAM;;CAGrD,MAAM,SAAS,aAAa,mBAAmB,OAAO,MAAM,WAAW;CACvE,MAAM,iBAAiB,gCACrB,cACA,qBAAqB,KAAK,WAAW,CAAC,QAAQ,OAAO,CAAC,CACvD;AACD,cAAa,2BAA2B,eAAe;AACvD,KAAI,WAAW,UAAa,oBAAoB,QAAW;EACzD,MAAM,sBACJ,qCACE,QACA,gBACD;AACH,MAAI,wBAAwB,OAC1B,cAAa,2BACX,iBACA,oBACD;;AAGL,QAAO;EAAE;EAAgB;EAAQ;;;;;;AAOnC,SAAgB,2BACd,cACA,YACA,iBAIA;CACA,MAAM,OAAO,aAAa,SAAS;CACnC,MAAML,QAA4B,EAAE;CACpC,MAAMM,kBAA2C,EAAE;AAEnD,MAAK,MAAM,aAAa,YAAY;EAClC,MAAM,CAAC,QAAQ,SAAS,kCACtB,cACA,UACD;AACD,MAAI,CAAC,qBAAqB,UAAU,EAAE;AACpC,mBAAgB,KAAK,CAAC,QAAQ,MAAM,CAAC;AACrC;;EAGF,MAAM,EAAE,MAAM,cAAc,UAAU;EACtC,MAAM,SAAS;EACf,MAAM,aAAa,aAAa,YAAY,KAAK,CAAC;EAClD,IAAIC;AAEJ,MAAI,YAAY,KAAK,YAAY,YAAY;AAC3C,UAAO;IACL,OAAO,SAAS;IAChB,KAAK,SAAS;IACd,MAAM,KAAK,UAAU,KAAK,SAAS;IACpC;AACD,mBAAgB,KAAK,CAAC,SAAS,GAAG,SAAS,EAAE,CAAC;aACrC,cAAc,cAAc,cAAc,GAAG;AACtD,UAAO;IACL,OAAO,SAAS;IAChB,KAAK;IACL,MAAM,KAAK,SAAS,KAAK,KAAK,SAAS;IACxC;AACD,mBAAgB,KAAK,CAAC,QAAQ,OAAO,CAAC;aAC7B,cAAc,KAAK,OAAO,KAAK,aAAa,GAAG;GACxD,MAAM,WAAW,OAAO;GACxB,MAAM,aAAa,aAAa,YAAY,SAAS,CAAC;GACtD,MAAM,UAAU,aAAa,SAAS;IACpC,MAAM;IACN,WAAW;IACZ,CAAC;GACF,MAAM,YAAY,aAAa,IAAI,UAAU,IAAI;AACjD,UAAO;IACL,OAAO;IACP,KAAK,SAAS;IACd,MACE,KAAK,UACL,KAAK,MAAM,SAAS,OAAO,GAC3B,KAAK,MAAM,WAAW,QAAQ;IACjC;AACD,mBAAgB,KAAK,CAAC,SAAS,GAAG,SAAS,EAAE,CAAC;SACzC;AACL,mBAAgB,KAAK,CAAC,QAAQ,MAAM,CAAC;AACrC;;AAGF,QAAM,KAAK,KAAK;;AAGlB,KAAI,MAAM,WAAW,EACnB,QAAO,EAAE,gBAAgB,YAAY;AAGvC,OAAM,MAAM,GAAG,MAAM,EAAE,QAAQ,EAAE,MAAM;AACvC,MAAK,IAAI,QAAQ,GAAG,QAAQ,MAAM,QAAQ,QACxC,KAAI,MAAM,OAAO,QAAQ,MAAM,QAAQ,GAAG,IACxC,OAAM,IAAI,MAAM,sDAAsD;CAI1E,MAAM,SAAS,aAAa,mBAAmB,OAAO,MAAM,WAAW;CACvE,MAAM,iBAAiB,gCACrB,cACA,gBACD;AACD,cAAa,2BAA2B,eAAe;AACvD,KAAI,WAAW,UAAa,oBAAoB,QAAW;EACzD,MAAM,sBACJ,qCACE,QACA,gBACD;AACH,MAAI,wBAAwB,OAC1B,cAAa,2BACX,iBACA,oBACD;;AAGL,QAAO;EAAE;EAAgB;EAAQ;;;;;;;AAQnC,SAAgB,uCACd,cACA,YACA,iBAIA;CACA,MAAMC,mBAAsC,WAAW,KAAK,cAAc;EACxE,MAAM,QAAQ,kCAAkC,cAAc,UAAU;AAMxE,SALyC;GACvC,OAAO,MAAM;GACb,KAAK,MAAM;GACX,WAAW;GACZ;GAED;AAIF,KAAI,CAHc,iBAAiB,MAChC,cAAc,gBAAgB,UAAU,OAAO,UAAU,IAAI,KAAK,EACpE,CAEC,QAAO,EAAE,gBAAgB,YAAY;AAEvC,QAAO,6BACL,cACA,kBACA,iBAAiB,UAAU,GAAG,EAC9B,gBACD;;;;;AAMH,SAAgB,qBAAqB,WAAqC;AACxE,QACE,UAAU,MAAM,SAAS,UAAU,IAAI,QACvC,UAAU,MAAM,cAAc,UAAU,IAAI;;;;;AAOhD,SAAgB,iBAAiB,WAAsC;CACrE,MAAM,EAAE,OAAO,KAAK,cAAc;AAClC,QAAO,cAAc,oBAAoB,QAAQ;;;;;AAMnD,SAAgB,eAAe,UAA2B;AACxD,QACE,aAAa,aACb,aAAa,qBACb,aAAa;;;;;AAOjB,SAAgB,oBACd,GACA,GACS;CACT,MAAM,aAAa,qBAAqB,EAAE;CAC1C,MAAM,aAAa,qBAAqB,EAAE;AAC1C,KAAI,cAAc,WAChB,QAAO,gBAAgB,EAAE,OAAO,EAAE,MAAM,KAAK;AAE/C,KAAI,WACF,QACE,gBAAgB,EAAE,OAAO,EAAE,MAAM,IAAI,KACrC,gBAAgB,EAAE,OAAO,EAAE,IAAI,IAAI;AAGvC,KAAI,WACF,QACE,gBAAgB,EAAE,OAAO,EAAE,MAAM,IAAI,KACrC,gBAAgB,EAAE,OAAO,EAAE,IAAI,IAAI;AAGvC,QACE,gBAAgB,EAAE,OAAO,EAAE,IAAI,GAAG,KAAK,gBAAgB,EAAE,OAAO,EAAE,IAAI,GAAG;;;;;AAO7E,SAAgB,gBAAgB,GAAa,GAAqB;AAChE,KAAI,EAAE,SAAS,EAAE,KACf,QAAO,EAAE,OAAO,EAAE;AAEpB,QAAO,EAAE,YAAY,EAAE;;;;;AAMzB,SAAgB,yCACd,cACA,cACA,aACiB;CACjB,MAAM,YACJ,iBAAiB,cACb,gBACA,eAAe,cACb,mBACA;CACR,MAAM,QAAQ,KAAK,IAAI,cAAc,YAAY;CACjD,MAAM,MAAM,KAAK,IAAI,cAAc,YAAY;AAC/C,QAAO;EACL,OAAO,aAAa,WAAW,MAAM;EACrC,KAAK,aAAa,WAAW,IAAI;EACjC;EACD;;;;;AAMH,SAAgB,oBACd,iBACA,gBACiB;CACjB,MAAM,SACJ,gBAAgB,cAAc,oBAC1B,gBAAgB,MAChB,gBAAgB;CACtB,MAAM,oBAAoB,gBAAgB,QAAQ,eAAe,MAAM;CACvE,MAAM,kBAAkB,gBAAgB,QAAQ,eAAe,IAAI;CACnE,IAAI,QAAQ,eAAe;AAC3B,KAAI,qBAAqB,EACvB,SAAQ,eAAe;UACd,mBAAmB,EAC5B,SAAQ,eAAe;KAIvB,SAAQ,sBAAsB,IAAI,eAAe,MAAM,eAAe;CAExE,MAAM,gBAAgB,gBAAgB,QAAQ,MAAM;AASpD,QAAO;EACL,OAHqB,iBAAiB,IAAI,SAAS;EAInD,KAHmB,iBAAiB,IAAI,QAAQ;EAIhD,WAVA,kBAAkB,IACd,gBACA,gBAAgB,IACd,mBACA;EAOP;;;;;;AAOH,SAAgB,gBACd,UACA,QACiB;CACjB,MAAM,eAAe,gBAAgB,OAAO,OAAO,SAAS,MAAM,GAAG;CACrE,MAAM,gBAAgB,gBAAgB,OAAO,KAAK,SAAS,IAAI,GAAG;AAElE,KAAI,gBAAgB,CAAC,cACnB,QAAO;EACL,OAAO,OAAO;EACd,KAAK,SAAS;EACd,WAAW;EACZ;AAGH,KAAI,iBAAiB,CAAC,aACpB,QAAO;EACL,OAAO,SAAS;EAChB,KAAK,OAAO;EACZ,WAAW;EACZ;AAGH,KAAI,SAAS,cAAc,kBACzB,QAAO;EACL,OAAO,OAAO;EACd,KAAK,SAAS;EACd,WACE,gBAAgB,OAAO,OAAO,SAAS,IAAI,KAAK,IAC5C,gBACA;EACP;AAGH,QAAO;EACL,OAAO,SAAS;EAChB,KAAK,OAAO;EACZ,WACE,gBAAgB,SAAS,OAAO,OAAO,IAAI,KAAK,IAC5C,gBACA;EACP;;;;;AAMH,SAAgB,iBACd,YACA,QACmB;AAInB,QAAO,2BAHe,WAAW,KAAK,cAAc;AAClD,SAAO,gBAAgB,WAAW,OAAO;GACzC,CAC8C;;;;;AAMlD,SAAgB,2BACd,YACmB;AACnB,KAAI,WAAW,UAAU,EACvB,QAAO;CAET,MAAM,2BAAW,IAAI,KAAa;CAClC,MAAMC,WAGA,EAAE;AACR,MAAK,IAAI,IAAI,WAAW,SAAS,GAAG,KAAK,GAAG,KAAK;EAC/C,MAAM,YAAY,WAAW;AAC7B,MAAI,cAAc,OAChB;EAEF,IAAI,OAAO;EACX,IAAI,QAAQ,SAAS;AACrB,SAAO,OAAO,OAAO;GACnB,MAAM,MAAM,KAAK,OAAO,OAAO,SAAS,EAAE;GAC1C,MAAM,YAAY,SAAS,MAAM;AACjC,OAAI,cAAc,OAChB;AAEF,OAAI,gBAAgB,UAAU,OAAO,UAAU,MAAM,GAAG,EACtD,QAAO,MAAM;OAEb,SAAQ;;EAGZ,MAAM,WAAW,SAAS,OAAO,IAAI;EACrC,MAAM,OAAO,SAAS,OAAO;AAC7B,MACG,aAAa,UAAa,oBAAoB,UAAU,UAAU,IAClE,SAAS,UAAa,oBAAoB,MAAM,UAAU,CAE3D;AAEF,WAAS,OAAO,MAAM,GAAG;GAAE,OAAO;GAAG;GAAW,CAAC;AACjD,WAAS,IAAI,EAAE;;AAEjB,QAAO,WAAW,QAAQ,GAAG,UAAU,SAAS,IAAI,MAAM,CAAC;;;;;AAM7D,SAAgB,aACd,cACA,YAC+B;AAC/B,KAAI,WAAW,WAAW,EACxB;CAGF,MAAM,uBAAuB,WAAW,KAAK,cAC3C,qBAAqB,UAAU,GAC3B,+BAA+B,cAAc,UAAU,GACvD,UACL;CACD,MAAM,QAAQ,qBAAqB,KAAK,MAAM,aAAa,QAAQ,EAAE,CAAC;CACtE,MAAM,SAAS,MAAM;AACrB,KAAI,OAAO,WAAW,KAAK,MAAM,MAAM,MAAM,MAAM,OAAO,CACxD;CAGF,MAAM,WAAW,qBAAqB,KACnC,MACC,CAAC,aAAa,SAAS,EAAE,MAAM,EAAE,aAAa,SAAS,EAAE,IAAI,CAAC,CAIjE;CACD,MAAM,aAAa,aAAa,gCAC9B,QACA,SACD;AACD,KAAI,eAAe,OACjB,QAAO,qBAAqB,MAAM,WAAW,UAAU;EACrD,MAAM,WAAW,WAAW;AAC5B,SACE,gBAAgB,UAAU,OAAO,SAAS,MAAM,KAAK,KACrD,gBAAgB,UAAU,KAAK,SAAS,IAAI,KAAK,KACjD,UAAU,cAAc,SAAS;GAEnC,GACE,uBACA;CAEN,MAAM,QAAQ,yCACZ,cACA,YACA,aAAa,OAAO,OACrB;AACD,QAAO,CAAC,GAAG,sBAAsB,MAAM;;;;;AAMzC,SAAgB,yBACd,cACiB;CACjB,MAAM,WAAW,aAAa,YAAY;AAE1C,QAAO;EACL,OAAO;GAAE,MAAM;GAAG,WAAW;GAAG;EAChC,KAAK;GAAE,MAAM;GAAU,WAHH,aAAa,YAAY,SAAS,EAAE,UAAU;GAGjB;EACjD,WAAW;EACZ;;;;;AAMH,SAAgB,6BACd,cACA,OACiB;CACjB,MAAM,OAAO,QAAQ,aAAa,YAAY,IAAI;CAElD,MAAM,QAAQ;EAAE;EAAM,WADJ,QAAS,aAAa,YAAY,KAAK,EAAE,UAAU,IAAK;EACzC;AACjC,QAAO;EACE;EACP,KAAK;EACL,WAAW;EACZ;;;;;AAMH,SAAgB,iBACd,cACA,YACQ;AACR,QAAO,CAAC,GAAG,WAAW,CACnB,MAAM,GAAG,MAAM;EACd,MAAM,aAAa,gBAAgB,EAAE,OAAO,EAAE,MAAM;AACpD,MAAI,eAAe,EACjB,QAAO;AAET,SAAO,gBAAgB,EAAE,KAAK,EAAE,IAAI;GACpC,CACD,KAAK,cAAc;AAClB,MAAI,qBAAqB,UAAU,CACjC,QAAO,aAAa,YAAY,UAAU,MAAM,MAAM,MAAM;AAE9D,SAAO,aAAa,QAAQ,UAAU;GACtC,CACD,KAAK,KAAK;;;;;AAMf,SAAgB,mBACd,aACA,WACgB;CAChB,MAAM,KAAK,KAAK,IAAI,GAAG,UAAU;CACjC,MAAM,SAAS,cAAc,YAAY;CAEzC,IAAIC,OAA2B;AAC/B,MAAK,MAAM,SAAS,QAAQ;AAC1B,SAAO;EACP,MAAM,OAAO,kBAAkB,MAAM;AAErC,MAAI,MADQ,QAAQ,MAAM,aAAa,UAAU,IAClC;GACb,MAAM,SAAS,OAAO,OAAO,KAAK,OAAO,IAAI,KAAK,KAAK;AACvD,OAAI,WAAW,KACb,QAAO;;;AAKb,KAAI,SAAS,MAAM;EACjB,MAAM,SAAS,OAAO,MAAM,KAAK,aAAa,UAAU,EAAE;AAC1D,MAAI,WAAW,KACb,QAAO;AAET,SAAO,CAAC,MAAM,EAAE;;CAGlB,IAAI,aAAa;CACjB,IAAIC,eAA4B;AAChC,MAAK,MAAM,SAAS,YAAY,YAAY;AAC1C,MAAI,MAAM,aAAa,KAAM,MAAsB,YAAY,KAC7D,QAAO,CAAC,OAAO,EAAE;AAEnB,MAAI,MAAM,aAAa,EACrB;AAEF,iBAAe;EACf,MAAM,MAAM,cACV,aAAa,aACb,aAAa,aAAa,UAAU,EACrC;AACD,MAAI,MAAM,aAAa,IACrB,QAAO,CACL,cACA,cAAc,aAAa,aAAa,KAAK,WAAW,CACzD;AAEH,gBAAc;;AAGhB,KAAI,iBAAiB,KACnB,QAAO,CACL,cACA,cACE,aAAa,aACb,aAAa,aAAa,UAAU,EACrC,CACF;AAEH,QAAO,CAAC,aAAa,EAAE;;;;;AAMzB,SAAgB,+BACd,cACA,WACiB;CACjB,MAAM,EAAE,MAAM,cAAc,UAAU;CACtC,MAAM,WAAW,aAAa,YAAY,KAAK;CAE/C,MAAM,OAAO,wBAAwB,UAD1B,KAAK,IAAI,GAAG,KAAK,IAAI,WAAW,SAAS,OAAO,CAAC,CACV;AAClD,KAAI,SAAS,OACX,QAAO;AAET,QAAO;EACL,OAAO;GAAE;GAAM,WAAW,KAAK;GAAO;EACtC,KAAK;GAAE;GAAM,WAAW,KAAK;GAAK;EAClC,WAAW;EACZ;;AAGH,SAAS,wBACP,UACA,WAC4C;CAC5C,MAAM,YAAY,IAAI,KAAK,UAAU,QAAW,EAC9C,aAAa,QACd,CAAC;AACF,MAAK,MAAM,OAAO,UAAU,QAAQ,SAAS,EAAE;AAC7C,MAAI,IAAI,eAAe,KACrB;EAEF,MAAM,KAAK,IAAI;EACf,MAAM,KAAK,KAAK,IAAI,QAAQ;AAG5B,MAAI,aAAa,MAAM,aAAa,GAClC,QAAO;GAAE,OAAO;GAAI,KAAK;GAAI;;;AAMnC,SAAS,kCACP,cACA,WAC6C;CAC7C,MAAM,aAAa,UAAU,cAAc;AAC3C,QAAO,CACL,aAAa,SAAS,aAAa,UAAU,MAAM,UAAU,MAAM,EACnE,aAAa,SAAS,iBAAiB,UAAU,CAAC,CACnD;;AAIH,SAAS,kCACP,cACA,WACO;AACP,KAAI,CAAC,qBAAqB,UAAU,CAClC,QAAO;EAAE,OAAO,UAAU;EAAO,KAAK,UAAU;EAAK;CAEvD,MAAM,EAAE,MAAM,cAAc,UAAU;CAEtC,MAAM,aADW,aAAa,YAAY,KAAK,CACnB;AAC5B,KAAI,YAAY,WACd,QAAO;EACL,OAAO;GAAE;GAAM;GAAW;EAC1B,KAAK;GAAE;GAAM,WAAW;GAAY;EACrC;AAEH,KAAI,OAAO,aAAa,YAAY,EAClC,QAAO;EACL,OAAO;GAAE;GAAM;GAAW;EAC1B,KAAK;GAAE,MAAM,OAAO;GAAG,WAAW;GAAG;EACtC;AAEH,QAAO;EACL,OAAO;GAAE;GAAM;GAAW;EAC1B,KAAK;GAAE;GAAM;GAAW;EACzB;;AAIH,SAAS,0BACP,cACA,YACA,mBACQ;AACR,KAAI,eAAe,QAAQ,eAAe,OACxC,QAAO;CAET,MAAM,OAAO,aAAa,WAAW,kBAAkB,CAAC;CACxD,MAAM,WAAW,aAAa,YAAY,KAAK;CAC/C,MAAM,YAAY,iBAAiB,SAAS;AAC5C,KAAI,cAAc,EAChB,QAAO;AAET,QAAO,aAAa,SAAS,MAAM,GAAG,UAAU;;AAGlD,SAAS,iBAAiB,MAAsB;CAC9C,IAAI,SAAS;AACb,QAAO,SAAS,KAAK,QAAQ,UAAU;EACrC,MAAM,IAAI,KAAK,WAAW,OAAO;AACjC,MAAI,MAAkB,MAAM,MAAgB,EAC1C;;AAGJ,QAAO;;AAGT,SAAS,gCACP,cACA,aACmB;CACnB,MAAMC,oBAA8B,EAAE;AACtC,MAAK,MAAM,CAAC,cAAc,gBAAgB,YACxC,mBAAkB,KAChB,KAAK,IAAI,cAAc,YAAY,EACnC,KAAK,IAAI,cAAc,YAAY,CACpC;CAEH,MAAM,YAAY,aAAa,YAAY,kBAAkB;AAC7D,QAAO,YAAY,KAAK,CAAC,cAAc,cAAc,UAAU;EAC7D,MAAM,YACJ,iBAAiB,cACb,gBACA,eAAe,cACb,mBACA;AACR,SAAO;GACL,OAAO,UAAU,QAAQ;GACzB,KAAK,UAAU,QAAQ,IAAI;GAC3B;GACD;GACD;;AAKJ,SAAS,gCACP,cACA,QACA,SACkB;AAClB,KAAI,OAAO,SAAS,MAAM,OAAO,UAAU,OAAO,MAAM,EACtD,QAAO;CAET,MAAM,gBAAgB,aAAa,WAAW,OAAO,IAAI;AACzD,KAAI,cAAc,cAAc,EAC9B,QAAO;CAET,MAAM,WAAW,aAAa,YAAY,cAAc,KAAK;CAC7D,MAAM,cAAc,SAAS,MAAM,GAAG,cAAc,UAAU;AAC9D,KAAI,SAAS,KAAK,YAAY,CAC5B,QAAO;AAET,KAAI,SAAS,cAAc,YAAY,OAAO,IAC5C,QAAO;CAET,MAAM,eAAe,KAAK,IAAI,GAAG,cAAc,YAAY,QAAQ;CACnE,MAAM,cAAc,SAAS,MAAM,cAAc,cAAc,UAAU;AACzE,KAAI,YAAY,WAAW,WAAW,OAAO,KAAK,YAAY,CAC5D,QAAO;EACL,GAAG;EACH,OAAO,OAAO,MAAM,YAAY;EACjC;AAEH,QAAO;;AAGT,SAAS,mBAAmB,MAAY,QAAiC;CAEvE,IAAIC,SADS,KAAK,aAAa,IAAK,OAAuB,KAAK;AAEhE,QAAO,WAAW,QAAQ,aAAa,OAAO,KAAK,OACjD,UAAS,OAAO;AAElB,KAAI,WAAW,KACb,QAAO;CAET,MAAM,OAAO,aAAa,OAAO;AACjC,KAAI,SAAS,OACX,QAAO;AAGT,KAAI,KAAK,aAAa,GAAG;AACvB,MAAI,KAAK,kBAAkB,KACzB,QAAO;AAET,MAAI,cAAc,KAAK,cAAc,KAAK,KACxC,QAAO;GAAE;GAAM,WAAW,gBAAgB,MAAM,OAAO;GAAE;AAE3D,SAAO;GACL;GACA,WACE,aAAa,QAAQ,KAAK,GAAG,cAAc,KAAK,aAAa,OAAO;GACvE;;AAGH,KAAI,KAAK,aAAa,GAAG;EACvB,MAAM,KAAK;AACX,MAAI,GAAG,YAAY,OAAO;GACxB,IAAI,YAAY;AAChB,QAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,IAC1B,aAAY,gBAAgB,GAAG,WAAW,GAAG;AAE/C,UAAO;IAAE;IAAM;IAAW;;AAE5B,MAAI,GAAG,YAAY,KACjB,QAAO;GAAE;GAAM,WAAW;GAAG;AAE/B,MAAI,GAAG,YAAY,QAAQ;AACzB,OAAI,SAAS,GAAG,WAAW,QAAQ;IACjC,MAAM,OAAO,GAAG,WAAW;AAC3B,QAAI,MAAM,aAAa,GAAG;KACxB,MAAM,WAAW,kBAAkB,KAAoB;AACvD,SAAI,aAAa,OACf,QAAO;MAAE;MAAM,WAAW;MAAU;KAEtC,MAAM,QAAQ,cAAc,KAAoB;KAChD,MAAM,YACJ,UAAU,OAAO,SAAY,kBAAkB,MAAM;AACvD,SAAI,cAAc,OAChB,QAAO;MAAE;MAAM,WAAW;MAAW;;;AAI3C,UAAO;IACL;IACA,WACE,SAAS,IACL,gBAAgB,GAAG,WAAW,SAAS,GAAG,GAC1C,aAAa,QAAQ,GAAG;IAC/B;;AAEH,SAAO;GAAE;GAAM,WAAW,aAAa,QAAQ,GAAG;GAAE;;AAEtD,QAAO;;AAGT,SAAS,cAAc,MAAkC;CACvD,MAAMC,SAAwB,EAAE;AAChC,MAAK,MAAM,SAAS,KAAK,YAAY;AACnC,MAAI,MAAM,aAAa,EACrB;EAEF,MAAM,KAAK;AACX,MAAI,GAAG,YAAY,OACjB;AAGF,MADa,kBAAkB,GAAG,KACrB,QAAW;AACtB,UAAO,KAAK,GAAG;AACf;;AAEF,OAAK,MAAM,UAAU,GAAG,WACtB,KACE,OAAO,aAAa,KACpB,kBAAkB,OAAsB,KAAK,OAE7C,QAAO,KAAK,OAAsB;;AAIxC,QAAO;;AAGT,SAAS,OAAO,OAAoB,QAAuC;CACzE,IAAI,YAAY,KAAK,IAAI,GAAG,OAAO;CACnC,MAAMC,QAAmD,CACvD;EAAE,WAAW;EAAO,OAAO;EAAG,CAC/B;AACD,QAAO,MAAM,SAAS,GAAG;EACvB,MAAM,QAAQ,MAAM,MAAM,SAAS;AACnC,MAAI,MAAM,SAAS,MAAM,UAAU,WAAW,QAAQ;AACpD,SAAM,KAAK;AACX;;EAEF,MAAM,WAAW,MAAM,UAAU,WAAW,MAAM;AAClD,QAAM;AACN,MAAI,SAAS,aAAa,GAAG;GAC3B,MAAM,MAAM,cACV,SAAS,aACT,SAAS,aAAa,UAAU,EACjC;AACD,OAAI,aAAa,IACf,QAAO,CAAC,UAAU,UAAU;AAE9B,gBAAa;aACJ,SAAS,aAAa,EAC/B,OAAM,KAAK;GAAE,WAAW;GAAU,OAAO;GAAG,CAAC;;AAGjD,QAAO;;AAGT,SAAS,iBAAiB,MAAY,QAAsB;CAC1D,IAAI,SAAS;CACb,MAAMA,QAAmD,CACvD;EAAE,WAAW;EAAM,OAAO;EAAG,CAC9B;AACD,QAAO,MAAM,SAAS,GAAG;EACvB,MAAM,QAAQ,MAAM,MAAM,SAAS;AACnC,MAAI,MAAM,SAAS,MAAM,UAAU,WAAW,QAAQ;AACpD,SAAM,KAAK;AACX;;EAEF,MAAM,WAAW,MAAM,UAAU,WAAW,MAAM;AAClD,MAAI,aAAa,OACf,QAAO;AAET,QAAM;AACN,MAAI,SAAS,aAAa,EACxB,WAAU,cACR,SAAS,aACT,SAAS,aAAa,UAAU,EACjC;WACQ,SAAS,aAAa,EAC/B,OAAM,KAAK;GAAE,WAAW;GAAU,OAAO;GAAG,CAAC;;AAGjD,QAAO;;AAGT,SAAS,SAAS,OAAoB,MAAqB;CACzD,IAAIC,UAAuB;AAC3B,QAAO,YAAY,MAAM;AACvB,MAAI,YAAY,MACd,QAAO;AAET,YAAU,QAAQ;;AAEpB,QAAO;;AAGT,SAAS,aAAa,MAAmB,MAAoB;AAC3D,KAAI,KAAK,kBAAkB,MAAM;EAC/B,IAAIC,WAAS;EACb,MAAM,QAAQ,MAAM,UAAU,QAAQ,KAAK,KAAK,YAAY,KAAK;AACjE,OAAK,IAAI,IAAI,GAAG,IAAI,OAAO,IACzB,YAAS,gBAAgB,KAAK,WAAW,GAAG;AAE9C,SAAOA;;AAET,MAAK,MAAM,SAAS,cAAc,KAAK,CACrC,KAAI,SAAS,OAAO,KAAK,CAEvB,QADa,kBAAkB,MAAM,IACtB,KAAK,aAAa,IAAI,iBAAiB,OAAO,KAAK,GAAG;CAGzE,IAAI,SAAS;CACb,IAAIC,SACF,KAAK,aAAa,IAAK,OAAuB,KAAK;AACrD,QAAO,WAAW,QAAQ,OAAO,kBAAkB,MAAM;AACvD,MAAI,aAAa,OAAO,cAAc,KAAK,OACzC;EAEF,MAAM,SAAS,OAAO;EACtB,MAAM,QAAQ,MAAM,UAAU,QAAQ,KAAK,OAAO,YAAY,OAAO;AACrE,OAAK,IAAI,IAAI,GAAG,IAAI,OAAO,IACzB,UAAS,gBAAgB,OAAO,WAAW,GAAG;AAEhD,WAAS;;AAEX,QAAO;;AAGT,SAAS,cAAc,IAAqC;CAC1D,IAAIC,UAA8B;AAClC,QAAO,YAAY,MAAM;AACvB,MAAI,aAAa,QAAQ,KAAK,OAC5B,QAAO;AAET,MAAI,kBAAkB,QAAQ,KAAK,OACjC,QAAO;AAET,YAAU,QAAQ;;AAEpB,QAAO;;AAGT,SAAS,gBACP,OACA,mBACQ;AACR,KAAI,UAAU,OACZ,QAAO;AAET,KAAI,MAAM,aAAa,GAAG;EACxB,MAAM,SAAS,MAAM;AACrB,MAAI,WAAW,KACb,QAAO;EAET,MAAM,QAAQ,cAAc,OAAO;AACnC,MAAI,UAAU,KACZ,QAAO;EAET,MAAMC,SAAO,kBAAkB,MAAM;AACrC,MAAIA,WAAS,OACX,QAAO;EAET,MAAM,SACJ,sBAAsB,SAClB,cAAc,MAAM,aAAa,MAAM,aAAa,UAAU,EAAE,GAChE,cAAc,MAAM,aAAa,kBAAkB;AACzD,SAAOA,SAAO,iBAAiB,OAAO,MAAM,GAAG;;AAEjD,KAAI,MAAM,aAAa,EACrB,QAAO;CAET,MAAM,KAAK;AACX,KAAI,GAAG,YAAY,UAAU,GAAG,YAAY,KAC1C,QAAO;CAET,MAAM,OAAO,kBAAkB,GAAG;AAClC,KAAI,SAAS,OACX,QAAO,QAAQ,GAAG,aAAa,UAAU;CAE3C,IAAI,MAAM;AACV,MAAK,MAAM,SAAS,GAAG,WACrB,OAAM,KAAK,IAAI,KAAK,gBAAgB,MAAM,CAAC;AAE7C,QAAO;;AAGT,SAAS,aAAa,IAAqC;CACzD,MAAM,EAAE,SAAS,GAAG;AACpB,KAAI,SAAS,OACX,QAAO,SAAS,KAAK,GAAG;;AAK5B,SAAS,kBAAkB,IAAqC;CAC9D,MAAM,EAAE,SAAS,GAAG;AACpB,QAAO,SAAS,SAAY,SAAS,KAAK,GAAG;;AAG/C,SAAS,cACP,MACA,QACQ;CACR,MAAM,QAAQ,QAAQ;CACtB,MAAM,iBAAiB,MAAM,OAAO,SAAS;AAC7C,QAAO,KAAK,IACV,QACA,mBAAmB,KAAK,MAAM,SAAS,eACxC"}
1
+ {"version":3,"file":"selection.js","names":["edits: TextEdit[]","newSelection: EditorSelection","selectionPositions: Position[]","ordered: Array<{\n index: number;\n start: number;\n end: number;\n }>","edits: ResolvedTextEdit[]","nextSelectionOffsets: Array<[number, number] | undefined>","mergedGroup:\n | {\n start: number;\n end: number;\n indices: number[];\n }\n | undefined","nextOffsets: [number, number]","ordered: Array<{\n index: number;\n start: number;\n end: number;\n text: string;\n }>","nextSelectionOffsets: number[]","nextOffsetPairs: Array<[number, number]>","edit: ResolvedTextEdit | undefined","deleteSelections: EditorSelection[]","accepted: {\n index: number;\n selection: EditorSelection;\n }[]","last: HTMLElement | null","lastTextNode: Text | null","match: number | undefined","normalizedOffsets: number[]","lineEl: HTMLElement | null","tokens: HTMLElement[]","stack: Array<{ container: Node; index: number }>","current: Node | null","offset","target: HTMLElement | null","current: HTMLElement | null","base"],"sources":["../../src/editor/selection.ts"],"sourcesContent":["import type { DiffLineAnnotation } from '../types';\nimport { applyDocumentChangeToLineAnnotations } from './lineAnnotations';\nimport type {\n Position,\n Range,\n ResolvedTextEdit,\n TextDocument,\n TextDocumentChange,\n TextEdit,\n} from './textDocument';\n\nexport const DirectionBackward = -1;\nexport const DirectionNone = 0;\nexport const DirectionForward = 1;\n\nexport type SelectionDirection =\n | typeof DirectionBackward\n | typeof DirectionNone\n | typeof DirectionForward;\n\nexport interface EditorSelection extends Range {\n direction: SelectionDirection;\n}\n\n/**\n * Converts a selection from a web selection to an editor selection.\n */\nexport function convertSelection(\n range: StaticRange,\n direction: SelectionDirection = DirectionNone\n): EditorSelection | undefined {\n const start = boundaryToPosition(range.startContainer, range.startOffset);\n const end = boundaryToPosition(range.endContainer, range.endOffset);\n if (start === null || end === null) {\n return undefined;\n }\n return {\n start,\n end,\n direction,\n };\n}\n\n/**\n * Resolves the indent edits for a selection.\n */\nexport function resolveIndentEdits(\n textDocument: TextDocument<unknown>,\n selection: EditorSelection,\n tabSize: number,\n outdent: boolean\n): [edits: TextEdit[], nextSelection: EditorSelection] {\n if (textDocument === undefined) {\n return [[], selection];\n }\n const { start, end } = selection;\n const edits: TextEdit[] = [];\n let newSelection: EditorSelection = { ...selection };\n let endLine = end.line;\n if (start.line < end.line && end.character === 0) {\n endLine--;\n }\n for (let line = start.line; line <= endLine; line++) {\n const lineText = textDocument.getLineText(line);\n if (lineText === undefined) {\n continue;\n }\n const indentUnit = lineText.startsWith('\\t') ? '\\t' : ' '.repeat(tabSize);\n let deleteLength = 0;\n let newText = indentUnit;\n if (outdent) {\n if (lineText.startsWith('\\t')) {\n deleteLength = 1;\n } else if (lineText.startsWith(' ')) {\n const leadingSpacesLength =\n lineText.length - lineText.trimStart().length;\n deleteLength = Math.min(indentUnit.length, leadingSpacesLength);\n }\n if (deleteLength === 0) {\n continue;\n }\n newText = '';\n }\n edits.push({\n range: {\n start: { line, character: 0 },\n end: { line, character: deleteLength },\n },\n newText,\n });\n const delta = newText.length - deleteLength;\n if (line === start.line) {\n newSelection = {\n ...newSelection,\n start: {\n ...start,\n character: Math.max(0, start.character + delta),\n },\n };\n }\n if (line === end.line) {\n newSelection = {\n ...newSelection,\n end: {\n ...end,\n character: Math.max(0, end.character + delta),\n },\n };\n }\n }\n return [edits, newSelection];\n}\n\n/**\n * Maps the cursor move to all selections.\n */\nexport function mapCursorMove(\n textDocument: TextDocument<unknown>,\n selections: EditorSelection[],\n shortcut: 'textStart' | 'start' | 'end' | 'up' | 'down' | 'left' | 'right'\n): EditorSelection[] {\n const lineCount = textDocument.lineCount;\n return selections.map((selection) => {\n let { line, character } =\n shortcut === 'up' || shortcut === 'left'\n ? selection.start\n : selection.end;\n if (\n shortcut === 'textStart' ||\n shortcut === 'start' ||\n shortcut === 'end'\n ) {\n if (shortcut === 'textStart') {\n const indent = getLeadingSpaces(textDocument.getLineText(line));\n character = character === indent ? 0 : indent;\n } else {\n character = shortcut === 'start' ? 0 : textDocument.getLineLength(line);\n }\n if (selection.direction === DirectionBackward) {\n line = selection.start.line;\n } else {\n line = selection.end.line;\n }\n } else if (shortcut === 'up') {\n line = Math.max(0, line - 1);\n } else if (shortcut === 'down') {\n line = Math.min(Math.max(lineCount - 1, 0), line + 1);\n } else if (isCollapsedSelection(selection)) {\n const lineLength = textDocument.getLineLength(line);\n character = Math.min(character, lineLength);\n if (shortcut === 'left') {\n character--;\n\n if (character < 0) {\n if (line === 0) {\n character = 0;\n } else {\n line = Math.max(0, line - 1);\n character = textDocument.getLineLength(line);\n }\n }\n } else {\n character++;\n if (character > lineLength) {\n if (line === lineCount - 1) {\n character--;\n } else {\n line = Math.min(Math.max(lineCount - 1, 0), line + 1);\n character = 0;\n }\n }\n }\n }\n const pos = { line, character };\n return {\n start: pos,\n end: pos,\n direction: DirectionNone,\n };\n });\n}\n\n/**\n * Same as mapCursorMove, but with shift key pressed.\n */\nexport function mapSelectionShift(\n textDocument: TextDocument<unknown>,\n selections: EditorSelection[],\n shortcut: 'textStart' | 'start' | 'end' | 'up' | 'down' | 'left' | 'right'\n): EditorSelection[] {\n return selections.map((selection) => {\n const [anchorOffset, focusOffset] = getSelectionAnchorAndFocusOffsets(\n textDocument,\n selection\n );\n const focusPosition = textDocument.positionAt(focusOffset);\n const [movedFocusSelection] = mapCursorMove(\n textDocument,\n [\n {\n start: focusPosition,\n end: focusPosition,\n direction: DirectionNone,\n },\n ],\n shortcut\n );\n const movedFocusOffset = textDocument.offsetAt(movedFocusSelection.start);\n return createSelectionFromAnchorAndFocusOffsets(\n textDocument,\n anchorOffset,\n movedFocusOffset\n );\n });\n}\n\n/**\n * Applies a text change to the given text document\n */\nexport function applyTextChangeToSelections<LAnnotation>(\n textDocument: TextDocument<LAnnotation>,\n selections: EditorSelection[],\n edit: ResolvedTextEdit,\n lineAnnotations?: DiffLineAnnotation<LAnnotation>[],\n tabSize = 2\n): {\n nextSelections: EditorSelection[];\n change?: TextDocumentChange;\n} {\n const primarySelection = selections[selections.length - 1];\n if (primarySelection === undefined) {\n return { nextSelections: [] };\n }\n const selectionPositions: Position[] = [];\n for (const selection of selections) {\n selectionPositions.push(selection.start, selection.end);\n }\n const selectionOffsets = selectionPositions.map((position) =>\n textDocument.offsetAt(position)\n );\n const primaryStartOffset = selectionOffsets[(selections.length - 1) * 2];\n const primaryEndOffset = selectionOffsets[(selections.length - 1) * 2 + 1];\n const ordered: Array<{\n index: number;\n start: number;\n end: number;\n }> = [];\n let isAlreadyOrdered = true;\n for (let index = 0; index < selections.length; index++) {\n const entry = {\n index,\n start: selectionOffsets[index * 2],\n end: selectionOffsets[index * 2 + 1],\n };\n const previous = ordered[ordered.length - 1];\n if (\n previous !== undefined &&\n (entry.start < previous.start ||\n (entry.start === previous.start && entry.end < previous.end))\n ) {\n isAlreadyOrdered = false;\n }\n ordered.push(entry);\n }\n if (!isAlreadyOrdered) {\n ordered.sort((a, b) => {\n const startOrder = a.start - b.start;\n if (startOrder !== 0) {\n return startOrder;\n }\n const endOrder = a.end - b.end;\n if (endOrder !== 0) {\n return endOrder;\n }\n return a.index - b.index;\n });\n }\n const adjustedChange = normalizeLeadingIndentForChange(\n textDocument,\n edit,\n tabSize\n );\n const edits: ResolvedTextEdit[] = [];\n const nextSelectionOffsets: Array<[number, number] | undefined> = Array.from({\n length: selections.length,\n });\n let offsetDelta = 0;\n let mergedGroup:\n | {\n start: number;\n end: number;\n indices: number[];\n }\n | undefined;\n const finalizeMergedGroup = () => {\n if (mergedGroup === undefined) {\n return;\n }\n const perGroupChange = normalizeLeadingIndentForChange(\n textDocument,\n {\n start: mergedGroup.start,\n end: mergedGroup.end,\n text: adjustedChange.text,\n },\n tabSize\n );\n const newText = expandSingleNewlineInsert(\n textDocument,\n perGroupChange.text,\n perGroupChange.start\n );\n edits.push({\n start: perGroupChange.start,\n end: perGroupChange.end,\n text: newText,\n });\n const nextOffsets: [number, number] = [\n mergedGroup.start + offsetDelta + newText.length,\n mergedGroup.start + offsetDelta + newText.length,\n ];\n for (const index of mergedGroup.indices) {\n nextSelectionOffsets[index] = nextOffsets;\n }\n offsetDelta += newText.length - (perGroupChange.end - perGroupChange.start);\n mergedGroup = undefined;\n };\n for (const entry of ordered) {\n const startOffset = Math.max(\n 0,\n entry.start + (adjustedChange.start - primaryStartOffset)\n );\n const endOffset = Math.max(\n startOffset,\n entry.end + (adjustedChange.end - primaryEndOffset)\n );\n if (mergedGroup !== undefined && startOffset < mergedGroup.end) {\n mergedGroup.end = Math.max(mergedGroup.end, endOffset);\n mergedGroup.indices.push(entry.index);\n continue;\n }\n finalizeMergedGroup();\n mergedGroup = {\n start: startOffset,\n end: endOffset,\n indices: [entry.index],\n };\n }\n finalizeMergedGroup();\n\n const change = textDocument.applyResolvedEdits(edits, true, selections);\n const nextSelections = createSelectionsFromOffsetPairs(\n textDocument,\n nextSelectionOffsets.map((offsets) => {\n if (offsets === undefined) {\n throw new Error('Missing next selection offsets');\n }\n return offsets;\n })\n );\n textDocument.setLastUndoSelectionsAfter(nextSelections);\n if (change !== undefined && lineAnnotations !== undefined) {\n const nextLineAnnotations =\n applyDocumentChangeToLineAnnotations<LAnnotation>(\n change,\n lineAnnotations\n );\n if (nextLineAnnotations !== undefined) {\n textDocument.setLastUndoLineAnnotations(\n lineAnnotations,\n nextLineAnnotations\n );\n }\n }\n return { nextSelections, change };\n}\n\n/**\n * Applies a text replace to multiple selections.\n */\nexport function applyTextReplaceToSelections<LAnnotation>(\n textDocument: TextDocument<LAnnotation>,\n selections: EditorSelection[],\n texts: string[],\n lineAnnotations?: DiffLineAnnotation<LAnnotation>[]\n): {\n nextSelections: EditorSelection[];\n change?: TextDocumentChange;\n} {\n if (selections.length !== texts.length) {\n throw new Error(\n 'Selection text replacements must match the selection count'\n );\n }\n const selectionPositions: Position[] = [];\n for (const selection of selections) {\n selectionPositions.push(selection.start, selection.end);\n }\n const selectionOffsets = selectionPositions.map((position) =>\n textDocument.offsetAt(position)\n );\n const ordered: Array<{\n index: number;\n start: number;\n end: number;\n text: string;\n }> = [];\n let isAlreadyOrdered = true;\n for (let index = 0; index < selections.length; index++) {\n const entry = {\n index,\n start: selectionOffsets[index * 2],\n end: selectionOffsets[index * 2 + 1],\n text: texts[index],\n };\n const previous = ordered[ordered.length - 1];\n if (\n previous !== undefined &&\n (entry.start < previous.start ||\n (entry.start === previous.start && entry.end < previous.end))\n ) {\n isAlreadyOrdered = false;\n }\n ordered.push(entry);\n }\n if (!isAlreadyOrdered) {\n ordered.sort((a, b) => {\n const startOrder = a.start - b.start;\n if (startOrder !== 0) {\n return startOrder;\n }\n const endOrder = a.end - b.end;\n if (endOrder !== 0) {\n return endOrder;\n }\n return a.index - b.index;\n });\n }\n const allDeletes = texts.every((text) => text === '');\n let edits: ResolvedTextEdit[];\n const nextSelectionOffsets: number[] = Array.from({\n length: selections.length,\n });\n if (allDeletes) {\n edits = [];\n let hasEffect = false;\n for (const entry of ordered) {\n nextSelectionOffsets[entry.index] = entry.end;\n if (entry.start >= entry.end) {\n continue;\n }\n hasEffect = true;\n const last = edits[edits.length - 1];\n if (last !== undefined && entry.start < last.end) {\n edits[edits.length - 1] = {\n start: last.start,\n end: Math.max(last.end, entry.end),\n text: '',\n };\n } else {\n edits.push({ start: entry.start, end: entry.end, text: '' });\n }\n }\n if (!hasEffect) {\n return { nextSelections: selections };\n }\n for (const entry of ordered) {\n const caret = entry.end;\n let delta = 0;\n let next = caret;\n for (const edit of edits) {\n if (caret <= edit.start) {\n break;\n }\n if (caret >= edit.end) {\n delta -= edit.end - edit.start;\n continue;\n }\n next = edit.start + delta;\n break;\n }\n if (next === caret) {\n next += delta;\n }\n nextSelectionOffsets[entry.index] = next;\n }\n } else {\n edits = [];\n let offsetDelta = 0;\n let previousEditEnd = -1;\n for (const entry of ordered) {\n if (entry.start < previousEditEnd) {\n throw new Error('Overlapping multi-selection edits are not supported');\n }\n previousEditEnd = entry.end;\n const newText = expandSingleNewlineInsert(\n textDocument,\n entry.text,\n entry.start\n );\n edits.push({\n start: entry.start,\n end: entry.end,\n text: newText,\n });\n nextSelectionOffsets[entry.index] =\n entry.start + offsetDelta + newText.length;\n offsetDelta += newText.length - (entry.end - entry.start);\n }\n }\n\n const change = textDocument.applyResolvedEdits(edits, true, selections);\n const nextSelections = createSelectionsFromOffsetPairs(\n textDocument,\n nextSelectionOffsets.map((offset) => [offset, offset])\n );\n textDocument.setLastUndoSelectionsAfter(nextSelections);\n if (change !== undefined && lineAnnotations !== undefined) {\n const nextLineAnnotations =\n applyDocumentChangeToLineAnnotations<LAnnotation>(\n change,\n lineAnnotations\n );\n if (nextLineAnnotations !== undefined) {\n textDocument.setLastUndoLineAnnotations(\n lineAnnotations,\n nextLineAnnotations\n );\n }\n }\n return { nextSelections, change };\n}\n\n/**\n * Swaps the two characters adjacent to a collapsed selection, matching browser\n * insertTranspose (Ctrl+T) behavior.\n */\nexport function applyTransposeToSelections<LAnnotation>(\n textDocument: TextDocument<LAnnotation>,\n selections: EditorSelection[],\n lineAnnotations?: DiffLineAnnotation<LAnnotation>[]\n): {\n nextSelections: EditorSelection[];\n change?: TextDocumentChange;\n} {\n const text = textDocument.getText();\n const edits: ResolvedTextEdit[] = [];\n const nextOffsetPairs: Array<[number, number]> = [];\n\n for (const selection of selections) {\n const [anchor, focus] = getSelectionAnchorAndFocusOffsets(\n textDocument,\n selection\n );\n if (!isCollapsedSelection(selection)) {\n nextOffsetPairs.push([anchor, focus]);\n continue;\n }\n\n const { line, character } = selection.start;\n const offset = anchor;\n const lineLength = textDocument.getLineLength(line);\n let edit: ResolvedTextEdit | undefined;\n\n if (character > 0 && character < lineLength) {\n edit = {\n start: offset - 1,\n end: offset + 1,\n text: text[offset] + text[offset - 1],\n };\n nextOffsetPairs.push([offset + 1, offset + 1]);\n } else if (character === lineLength && lineLength >= 2) {\n edit = {\n start: offset - 2,\n end: offset,\n text: text[offset - 1] + text[offset - 2],\n };\n nextOffsetPairs.push([offset, offset]);\n } else if (character === 0 && line > 0 && lineLength > 0) {\n const prevLine = line - 1;\n const prevLength = textDocument.getLineLength(prevLine);\n const prevEnd = textDocument.offsetAt({\n line: prevLine,\n character: prevLength,\n });\n const prevStart = prevLength > 0 ? prevEnd - 1 : prevEnd;\n edit = {\n start: prevStart,\n end: offset + 1,\n text:\n text[offset] +\n text.slice(prevEnd, offset) +\n text.slice(prevStart, prevEnd),\n };\n nextOffsetPairs.push([offset + 1, offset + 1]);\n } else {\n nextOffsetPairs.push([anchor, focus]);\n continue;\n }\n\n edits.push(edit);\n }\n\n if (edits.length === 0) {\n return { nextSelections: selections };\n }\n\n edits.sort((a, b) => a.start - b.start);\n for (let index = 1; index < edits.length; index++) {\n if (edits[index].start < edits[index - 1].end) {\n throw new Error('Overlapping multi-selection edits are not supported');\n }\n }\n\n const change = textDocument.applyResolvedEdits(edits, true, selections);\n const nextSelections = createSelectionsFromOffsetPairs(\n textDocument,\n nextOffsetPairs\n );\n textDocument.setLastUndoSelectionsAfter(nextSelections);\n if (change !== undefined && lineAnnotations !== undefined) {\n const nextLineAnnotations =\n applyDocumentChangeToLineAnnotations<LAnnotation>(\n change,\n lineAnnotations\n );\n if (nextLineAnnotations !== undefined) {\n textDocument.setLastUndoLineAnnotations(\n lineAnnotations,\n nextLineAnnotations\n );\n }\n }\n return { nextSelections, change };\n}\n\n/**\n * Deletes from each selection to the end of its line, including the line break\n * when the caret is already at the end of a non-final line. Non-collapsed\n * selections delete their selected text instead.\n */\nexport function applyDeleteHardLineForwardToSelections<LAnnotation>(\n textDocument: TextDocument<LAnnotation>,\n selections: EditorSelection[],\n lineAnnotations?: DiffLineAnnotation<LAnnotation>[]\n): {\n nextSelections: EditorSelection[];\n change?: TextDocumentChange;\n} {\n const deleteSelections: EditorSelection[] = selections.map((selection) => {\n const range = resolveDeleteHardLineForwardRange(textDocument, selection);\n return {\n start: range.start,\n end: range.end,\n direction: DirectionNone,\n };\n });\n return applyTextReplaceToSelections(\n textDocument,\n deleteSelections,\n deleteSelections.map(() => ''),\n lineAnnotations\n );\n}\n\n/**\n * Deletes from each selection back to the start of its soft (visual) line.\n * Non-collapsed selections delete their selected text instead.\n */\nexport function applyDeleteSoftLineBackwardToSelections<LAnnotation>(\n textDocument: TextDocument<LAnnotation>,\n selections: EditorSelection[],\n getSoftLineStart?: (line: number, character: number) => number,\n lineAnnotations?: DiffLineAnnotation<LAnnotation>[]\n): {\n nextSelections: EditorSelection[];\n change?: TextDocumentChange;\n} {\n const deleteSelections: EditorSelection[] = selections.map((selection) => {\n if (!isCollapsedSelection(selection)) {\n return {\n start: selection.start,\n end: selection.end,\n direction: DirectionNone,\n };\n }\n const caret = getCaretPosition(selection);\n const { line, character } = caret;\n const softLineStart = getSoftLineStart?.(line, character) ?? 0;\n if (character > softLineStart) {\n return {\n start: { line, character: softLineStart },\n end: { line, character },\n direction: DirectionNone,\n };\n }\n if (line === 0) {\n return {\n start: caret,\n end: caret,\n direction: DirectionNone,\n };\n }\n const prevLineLength = textDocument.getLineLength(line - 1);\n return {\n start: { line: line - 1, character: prevLineLength },\n end: { line, character: 0 },\n direction: DirectionNone,\n };\n });\n return applyTextReplaceToSelections(\n textDocument,\n deleteSelections,\n deleteSelections.map(() => ''),\n lineAnnotations\n );\n}\n\n/**\n * Deletes the word or separator group immediately before each selection.\n * Non-collapsed selections delete their selected text instead.\n */\nexport function applyDeleteWordBackwardToSelections<LAnnotation>(\n textDocument: TextDocument<LAnnotation>,\n selections: EditorSelection[],\n lineAnnotations?: DiffLineAnnotation<LAnnotation>[]\n): {\n nextSelections: EditorSelection[];\n change?: TextDocumentChange;\n} {\n const deleteSelections: EditorSelection[] = selections.map((selection) => {\n const [start, end] = resolveDeleteWordBackwardRange(\n textDocument,\n selection\n );\n return {\n start,\n end,\n direction: DirectionNone,\n };\n });\n return applyTextReplaceToSelections(\n textDocument,\n deleteSelections,\n deleteSelections.map(() => ''),\n lineAnnotations\n );\n}\n\n/**\n * Checks if a selection is collapsed.\n */\nexport function isCollapsedSelection(\n selection: EditorSelection | Range\n): boolean {\n return (\n selection.start.line === selection.end.line &&\n selection.start.character === selection.end.character\n );\n}\n\n/**\n * Returns the caret (focus) position for a selection.\n */\nexport function getCaretPosition(selection: EditorSelection): Position {\n const { start, end, direction } = selection;\n return direction === DirectionBackward ? start : end;\n}\n\n/**\n * Checks if a line is editable.\n */\nexport function isLineEditable(lineType: string): boolean {\n return (\n lineType === 'context' ||\n lineType === 'context-expanded' ||\n lineType === 'change-addition'\n );\n}\n\n/**\n * Checks whether selections `a` and `b` intersect.\n */\nexport function selectionIntersects(\n a: EditorSelection | Range,\n b: EditorSelection | Range\n): boolean {\n const aCollapsed = isCollapsedSelection(a);\n const bCollapsed = isCollapsedSelection(b);\n if (aCollapsed && bCollapsed) {\n return comparePosition(a.start, b.start) === 0;\n }\n if (aCollapsed) {\n return (\n comparePosition(b.start, a.start) <= 0 &&\n comparePosition(a.start, b.end) <= 0\n );\n }\n if (bCollapsed) {\n return (\n comparePosition(a.start, b.start) <= 0 &&\n comparePosition(b.start, a.end) <= 0\n );\n }\n return (\n comparePosition(a.start, b.end) < 0 && comparePosition(b.start, a.end) < 0\n );\n}\n\n/**\n * Compares two positions.\n */\nexport function comparePosition(a: Position, b: Position): number {\n if (a.line !== b.line) {\n return a.line - b.line;\n }\n return a.character - b.character;\n}\n\n/**\n * Creates a selection from anchor and focus offsets.\n */\nexport function createSelectionFromAnchorAndFocusOffsets(\n textDocument: TextDocument<unknown>,\n anchorOffset: number,\n focusOffset: number\n): EditorSelection {\n const direction =\n anchorOffset === focusOffset\n ? DirectionNone\n : anchorOffset < focusOffset\n ? DirectionForward\n : DirectionBackward;\n const start = Math.min(anchorOffset, focusOffset);\n const end = Math.max(anchorOffset, focusOffset);\n return {\n start: textDocument.positionAt(start),\n end: textDocument.positionAt(end),\n direction,\n };\n}\n\n/**\n * Creates a selection from a anchor and focus selection.\n */\nexport function createSelectionFrom(\n anchorSelection: EditorSelection,\n focusSelection: EditorSelection\n): EditorSelection {\n const anchor =\n anchorSelection.direction === DirectionBackward\n ? anchorSelection.end\n : anchorSelection.start;\n const currentStartOrder = comparePosition(anchor, focusSelection.start);\n const currentEndOrder = comparePosition(anchor, focusSelection.end);\n let focus = focusSelection.end;\n if (currentStartOrder <= 0) {\n focus = focusSelection.end;\n } else if (currentEndOrder >= 0) {\n focus = focusSelection.start;\n } else {\n // When the original anchor sits inside `current`, keep whichever edge\n // stayed at the anchor so drag direction remains stable.\n focus = currentStartOrder === 0 ? focusSelection.end : focusSelection.start;\n }\n const anchorVsFocus = comparePosition(anchor, focus);\n const direction: SelectionDirection =\n anchorVsFocus === 0\n ? DirectionNone\n : anchorVsFocus < 0\n ? DirectionForward\n : DirectionBackward;\n const selectionStart = anchorVsFocus <= 0 ? anchor : focus;\n const selectionEnd = anchorVsFocus <= 0 ? focus : anchor;\n return {\n start: selectionStart,\n end: selectionEnd,\n direction,\n };\n}\n\n/**\n * Extends or shrinks the selection `original` using the endpoints of `target`, \\\n * matching contenteditable shift + click extend behavior.\n */\nexport function extendSelection(\n original: EditorSelection,\n target: EditorSelection\n): EditorSelection {\n const leftExtended = comparePosition(target.start, original.start) < 0;\n const rightExtended = comparePosition(target.end, original.end) > 0;\n\n if (leftExtended && !rightExtended) {\n return {\n start: target.start,\n end: original.end,\n direction: DirectionBackward,\n };\n }\n\n if (rightExtended && !leftExtended) {\n return {\n start: original.start,\n end: target.end,\n direction: DirectionForward,\n };\n }\n\n if (original.direction === DirectionBackward) {\n return {\n start: target.start,\n end: original.end,\n direction:\n comparePosition(target.start, original.end) === 0\n ? DirectionNone\n : DirectionBackward,\n };\n }\n\n return {\n start: original.start,\n end: target.end,\n direction:\n comparePosition(original.start, target.end) === 0\n ? DirectionNone\n : DirectionForward,\n };\n}\n\n/**\n * Extends multiple selections.\n */\nexport function extendSelections(\n selections: EditorSelection[],\n target: EditorSelection\n): EditorSelection[] {\n const newSelections = selections.map((selection) => {\n return extendSelection(selection, target);\n });\n return mergeOverlappingSelections(newSelections);\n}\n\n/**\n * Merges overlapping selections.\n */\nexport function mergeOverlappingSelections(\n selections: EditorSelection[]\n): EditorSelection[] {\n if (selections.length <= 1) {\n return selections;\n }\n const selected = new Set<number>();\n const accepted: {\n index: number;\n selection: EditorSelection;\n }[] = [];\n for (let i = selections.length - 1; i >= 0; i--) {\n const selection = selections[i];\n if (selection === undefined) {\n continue;\n }\n let left = 0;\n let right = accepted.length;\n while (left < right) {\n const mid = Math.floor((left + right) / 2);\n const candidate = accepted[mid]?.selection;\n if (candidate === undefined) {\n break;\n }\n if (comparePosition(candidate.start, selection.start) < 0) {\n left = mid + 1;\n } else {\n right = mid;\n }\n }\n const previous = accepted[left - 1]?.selection;\n const next = accepted[left]?.selection;\n if (\n (previous !== undefined && selectionIntersects(previous, selection)) ||\n (next !== undefined && selectionIntersects(next, selection))\n ) {\n continue;\n }\n accepted.splice(left, 0, { index: i, selection });\n selected.add(i);\n }\n return selections.filter((_, index) => selected.has(index));\n}\n\n/**\n * Finds the next matching word and updates the selections.\n */\nexport function findNexMatch(\n textDocument: TextDocument<unknown>,\n selections: EditorSelection[]\n): EditorSelection[] | undefined {\n if (selections.length === 0) {\n return undefined;\n }\n\n const normalizedSelections = selections.map((selection) =>\n isCollapsedSelection(selection)\n ? expandCollapsedSelectionToWord(textDocument, selection)\n : selection\n );\n const texts = normalizedSelections.map((s) => textDocument.getText(s));\n const needle = texts[0];\n if (needle.length === 0 || texts.some((t) => t !== needle)) {\n return undefined;\n }\n\n const occupied = normalizedSelections.map(\n (s) =>\n [textDocument.offsetAt(s.start), textDocument.offsetAt(s.end)] as [\n number,\n number,\n ]\n );\n const nextOffset = textDocument.findNextNonOverlappingSubstring(\n needle,\n occupied\n );\n if (nextOffset === undefined) {\n return normalizedSelections.some((selection, index) => {\n const original = selections[index];\n return (\n comparePosition(selection.start, original.start) !== 0 ||\n comparePosition(selection.end, original.end) !== 0 ||\n selection.direction !== original.direction\n );\n })\n ? normalizedSelections\n : undefined;\n }\n const added = createSelectionFromAnchorAndFocusOffsets(\n textDocument,\n nextOffset,\n nextOffset + needle.length\n );\n return [...normalizedSelections, added];\n}\n\n/**\n * Get the full selection of the document.\n */\nexport function getDocumentFullSelection(\n textDocument: TextDocument<unknown>\n): EditorSelection {\n const lastLine = textDocument.lineCount - 1;\n const lastCharacter = textDocument.getLineLength(lastLine);\n return {\n start: { line: 0, character: 0 },\n end: { line: lastLine, character: lastCharacter },\n direction: DirectionForward,\n };\n}\n\n/**\n * Get the boundary selection of the document.\n */\nexport function getDocumentBoundarySelection(\n textDocument: TextDocument<unknown>,\n atEnd: boolean\n): EditorSelection {\n const line = atEnd ? textDocument.lineCount - 1 : 0;\n const character = atEnd ? textDocument.getLineLength(line) : 0;\n const start = { line, character };\n return {\n start: start,\n end: start,\n direction: DirectionForward,\n };\n}\n\n/**\n * Get the text of the selections for the given text document.\n */\nexport function getSelectionText(\n textDocument: TextDocument<unknown>,\n selections: EditorSelection[]\n): string {\n return [...selections]\n .sort((a, b) => {\n const startOrder = comparePosition(a.start, b.start);\n if (startOrder !== 0) {\n return startOrder;\n }\n return comparePosition(a.end, b.end);\n })\n .map((selection) => {\n if (isCollapsedSelection(selection)) {\n return textDocument.getLineText(selection.start.line, false);\n }\n return textDocument.getText(selection);\n })\n .join('\\n');\n}\n\n/**\n * Get the anchor node and offset for a selection.\n */\nexport function getSelectionAnchor(\n lineElement: HTMLElement,\n character: number\n): [Node, number] {\n const ch = Math.max(0, character);\n const tokens = collectTokens(lineElement);\n\n let last: HTMLElement | null = null;\n for (const token of tokens) {\n last = token;\n const base = getCharacterIndex(token)!;\n const end = base + (token.textContent?.length ?? 0);\n if (ch <= end) {\n const anchor = textAt(token, ch < base ? 0 : ch - base);\n if (anchor !== null) {\n return anchor;\n }\n }\n }\n\n if (last !== null) {\n const anchor = textAt(last, last.textContent?.length ?? 0);\n if (anchor !== null) {\n return anchor;\n }\n return [last, 0];\n }\n\n let textOffset = 0;\n let lastTextNode: Text | null = null;\n for (const child of lineElement.childNodes) {\n if (child.nodeType === 1 && (child as HTMLElement).tagName === 'BR') {\n return [child, 0];\n }\n if (child.nodeType !== 3) {\n continue;\n }\n lastTextNode = child as Text;\n const len = getTextOffset(\n lastTextNode.textContent,\n lastTextNode.textContent?.length ?? 0\n );\n if (ch <= textOffset + len) {\n return [\n lastTextNode,\n getTextOffset(lastTextNode.textContent, ch - textOffset),\n ];\n }\n textOffset += len;\n }\n\n if (lastTextNode !== null) {\n return [\n lastTextNode,\n getTextOffset(\n lastTextNode.textContent,\n lastTextNode.textContent?.length ?? 0\n ),\n ];\n }\n return [lineElement, 0];\n}\n\n/**\n * Expands a zero-width selection to the word-like segment that contains the caret.\n */\nexport function expandCollapsedSelectionToWord(\n textDocument: TextDocument<unknown>,\n selection: EditorSelection\n): EditorSelection {\n const { line, character } = selection.start;\n const lineText = textDocument.getLineText(line);\n const ch = Math.max(0, Math.min(character, lineText.length));\n const span = expandCollapsedLineWord(lineText, ch);\n if (span === undefined) {\n return selection;\n }\n return {\n start: { line, character: span.start },\n end: { line, character: span.end },\n direction: DirectionForward,\n };\n}\n\nfunction expandCollapsedLineWord(\n lineText: string,\n character: number\n): { start: number; end: number } | undefined {\n const segmenter = new Intl.Segmenter(undefined, {\n granularity: 'word',\n });\n for (const seg of segmenter.segment(lineText)) {\n if (seg.isWordLike !== true) {\n continue;\n }\n const lo = seg.index;\n const hi = lo + seg.segment.length;\n // Match when the cursor is inside the word or immediately touching\n // one of its boundaries — not when separated by non-word characters.\n if (character >= lo && character <= hi) {\n return { start: lo, end: hi };\n }\n }\n return undefined;\n}\n\n// Resolves the range removed by deleteWordBackward for one selection.\nfunction resolveDeleteWordBackwardRange(\n textDocument: TextDocument<unknown>,\n selection: EditorSelection\n): [start: Position, end: Position] {\n if (!isCollapsedSelection(selection)) {\n return [selection.start, selection.end];\n }\n const caret = getCaretPosition(selection);\n const { line, character: head } = caret;\n if (head === 0) {\n if (line === 0) {\n return [caret, caret];\n }\n const prevLineLength = textDocument.getLineLength(line - 1);\n return [\n { line: line - 1, character: prevLineLength },\n { line, character: 0 },\n ];\n }\n const lineText = textDocument.getLineText(line);\n const graphemeStarts = [0];\n const segmenter = new Intl.Segmenter(undefined, { granularity: 'grapheme' });\n for (const segment of segmenter.segment(lineText)) {\n if (segment.index > 0) {\n graphemeStarts.push(segment.index);\n }\n }\n let pos = head;\n let match: number | undefined;\n while (pos > 0) {\n const prev = findClusterBreak(lineText, pos, false, graphemeStarts);\n const nextChar = lineText.slice(prev, pos);\n const nextMatch = !/\\S/.test(nextChar)\n ? 0\n : /\\p{Alphabetic}|\\p{Number}|_/u.test(nextChar)\n ? 1\n : 2;\n if (match !== undefined && nextMatch !== match) {\n break;\n }\n if (nextChar !== ' ' || pos !== head) {\n match = nextMatch;\n }\n pos = prev;\n }\n return [\n { line, character: pos },\n { line, character: head },\n ];\n}\n\nfunction findClusterBreak(\n text: string,\n pos: number,\n forward: boolean,\n graphemeStarts: number[]\n): number {\n if (forward) {\n for (const start of graphemeStarts) {\n if (start > pos) {\n return start;\n }\n }\n return text.length;\n }\n for (let i = graphemeStarts.length - 1; i >= 0; i--) {\n const start = graphemeStarts[i];\n if (start < pos) {\n return start;\n }\n }\n return 0;\n}\n\nfunction getSelectionAnchorAndFocusOffsets(\n textDocument: TextDocument<unknown>,\n selection: EditorSelection\n): [anchorOffset: number, focusOffset: number] {\n const isBackward = selection.direction === DirectionBackward;\n return [\n textDocument.offsetAt(isBackward ? selection.end : selection.start),\n textDocument.offsetAt(getCaretPosition(selection)),\n ];\n}\n\n// Resolves the range removed by deleteHardLineForward for one selection.\nfunction resolveDeleteHardLineForwardRange(\n textDocument: TextDocument<unknown>,\n selection: EditorSelection\n): Range {\n if (!isCollapsedSelection(selection)) {\n return { start: selection.start, end: selection.end };\n }\n const { line, character } = selection.start;\n const lineText = textDocument.getLineText(line);\n const lineLength = lineText.length;\n if (character < lineLength) {\n return {\n start: { line, character },\n end: { line, character: lineLength },\n };\n }\n if (line < textDocument.lineCount - 1) {\n return {\n start: { line, character },\n end: { line: line + 1, character: 0 },\n };\n }\n return {\n start: { line, character },\n end: { line, character },\n };\n}\n\n// When the user inserts a lone line break, copy the current line's indentation onto the new line.\nfunction expandSingleNewlineInsert(\n textDocument: TextDocument<unknown>,\n insertText: string,\n insertStartOffset: number\n): string {\n if (insertText !== '\\n' && insertText !== '\\r\\n') {\n return insertText;\n }\n const line = textDocument.positionAt(insertStartOffset).line;\n const lineText = textDocument.getLineText(line);\n const indentLen = getLeadingSpaces(lineText);\n if (indentLen === 0) {\n return insertText;\n }\n return insertText + lineText.slice(0, indentLen);\n}\n\nfunction getLeadingSpaces(text: string): number {\n let indent = 0;\n for (; indent < text.length; indent++) {\n const c = text.charCodeAt(indent);\n if (c !== /* space */ 32 && c !== /* tab */ 9) {\n break;\n }\n }\n return indent;\n}\n\nfunction createSelectionsFromOffsetPairs(\n textDocument: TextDocument<unknown>,\n offsetPairs: readonly [anchorOffset: number, focusOffset: number][]\n): EditorSelection[] {\n const normalizedOffsets: number[] = [];\n for (const [anchorOffset, focusOffset] of offsetPairs) {\n normalizedOffsets.push(\n Math.min(anchorOffset, focusOffset),\n Math.max(anchorOffset, focusOffset)\n );\n }\n const positions = textDocument.positionsAt(normalizedOffsets);\n return offsetPairs.map(([anchorOffset, focusOffset], index) => {\n const direction =\n anchorOffset === focusOffset\n ? DirectionNone\n : anchorOffset < focusOffset\n ? DirectionForward\n : DirectionBackward;\n return {\n start: positions[index * 2],\n end: positions[index * 2 + 1],\n direction,\n };\n });\n}\n\n// Expands a backspace over leading spaces into one soft-tab width so mixed hard/soft indentation\n// behaves like the explicit outdent command.\nfunction normalizeLeadingIndentForChange(\n textDocument: TextDocument<unknown>,\n change: ResolvedTextEdit,\n tabSize: number\n): ResolvedTextEdit {\n if (change.text !== '' || change.start !== change.end - 1) {\n return change;\n }\n const caretPosition = textDocument.positionAt(change.end);\n if (caretPosition.character === 0) {\n return change;\n }\n const lineText = textDocument.getLineText(caretPosition.line);\n const leadingText = lineText.slice(0, caretPosition.character);\n if (/[^ \\t]/.test(leadingText)) {\n return change;\n }\n if (lineText[caretPosition.character - 1] === '\\t') {\n return change;\n }\n const softTabStart = Math.max(0, caretPosition.character - tabSize);\n const softTabText = lineText.slice(softTabStart, caretPosition.character);\n if (softTabText.length === tabSize && /^ +$/.test(softTabText)) {\n return {\n ...change,\n start: change.end - softTabText.length,\n };\n }\n return change;\n}\n\nfunction boundaryToPosition(node: Node, offset: number): Position | null {\n const host = node.nodeType === 1 ? (node as HTMLElement) : node.parentElement;\n let lineEl: HTMLElement | null = host;\n while (lineEl !== null && getLineIndex(lineEl) === undefined) {\n lineEl = lineEl.parentElement;\n }\n if (lineEl === null) {\n return null;\n }\n const line = getLineIndex(lineEl);\n if (line === undefined) {\n return null;\n }\n\n if (node.nodeType === 3) {\n if (node.parentElement === null) {\n return null;\n }\n if (findTokenSpan(node.parentElement) !== null) {\n return { line, character: getLineChildEnd(node, offset) };\n }\n return {\n line,\n character:\n offsetBefore(lineEl, node) + getTextOffset(node.textContent, offset),\n };\n }\n\n if (node.nodeType === 1) {\n const el = node as HTMLElement;\n if (el.tagName === 'DIV') {\n let character = 0;\n for (let i = 0; i < offset; i++) {\n character = getLineChildEnd(el.childNodes[i]);\n }\n return { line, character };\n }\n if (el.tagName === 'BR') {\n return { line, character: 0 };\n }\n if (el.tagName === 'SPAN') {\n if (offset < el.childNodes.length) {\n const next = el.childNodes[offset];\n if (next?.nodeType === 1) {\n const nextBase = getCharacterIndex(next as HTMLElement);\n if (nextBase !== undefined) {\n return { line, character: nextBase };\n }\n const token = findTokenSpan(next as HTMLElement);\n const tokenBase =\n token === null ? undefined : getCharacterIndex(token);\n if (tokenBase !== undefined) {\n return { line, character: tokenBase };\n }\n }\n }\n return {\n line,\n character:\n offset > 0\n ? getLineChildEnd(el.childNodes[offset - 1])\n : offsetBefore(lineEl, el),\n };\n }\n return { line, character: offsetBefore(lineEl, el) };\n }\n return null;\n}\n\nfunction collectTokens(line: HTMLElement): HTMLElement[] {\n const tokens: HTMLElement[] = [];\n for (const child of line.childNodes) {\n if (child.nodeType !== 1) {\n continue;\n }\n const el = child as HTMLElement;\n if (el.tagName !== 'SPAN') {\n continue;\n }\n const base = getCharacterIndex(el);\n if (base !== undefined) {\n tokens.push(el);\n continue;\n }\n for (const nested of el.childNodes) {\n if (\n nested.nodeType === 1 &&\n getCharacterIndex(nested as HTMLElement) !== undefined\n ) {\n tokens.push(nested as HTMLElement);\n }\n }\n }\n return tokens;\n}\n\nfunction textAt(token: HTMLElement, offset: number): [Node, number] | null {\n let remaining = Math.max(0, offset);\n const stack: Array<{ container: Node; index: number }> = [\n { container: token, index: 0 },\n ];\n while (stack.length > 0) {\n const frame = stack[stack.length - 1];\n if (frame.index >= frame.container.childNodes.length) {\n stack.pop();\n continue;\n }\n const walkNode = frame.container.childNodes[frame.index];\n frame.index++;\n if (walkNode.nodeType === 3) {\n const len = getTextOffset(\n walkNode.textContent,\n walkNode.textContent?.length ?? 0\n );\n if (remaining <= len) {\n return [walkNode, remaining];\n }\n remaining -= len;\n } else if (walkNode.nodeType === 1) {\n stack.push({ container: walkNode, index: 0 });\n }\n }\n return null;\n}\n\nfunction textLengthBefore(root: Node, target: Node): number {\n let before = 0;\n const stack: Array<{ container: Node; index: number }> = [\n { container: root, index: 0 },\n ];\n while (stack.length > 0) {\n const frame = stack[stack.length - 1];\n if (frame.index >= frame.container.childNodes.length) {\n stack.pop();\n continue;\n }\n const walkNode = frame.container.childNodes[frame.index];\n if (walkNode === target) {\n return before;\n }\n frame.index++;\n if (walkNode.nodeType === 3) {\n before += getTextOffset(\n walkNode.textContent,\n walkNode.textContent?.length ?? 0\n );\n } else if (walkNode.nodeType === 1) {\n stack.push({ container: walkNode, index: 0 });\n }\n }\n return before;\n}\n\nfunction isInside(token: HTMLElement, node: Node): boolean {\n let current: Node | null = node;\n while (current !== null) {\n if (current === token) {\n return true;\n }\n current = current.parentElement;\n }\n return false;\n}\n\nfunction offsetBefore(line: HTMLElement, node: Node): number {\n if (node.parentElement === line) {\n let offset = 0;\n const index = Array.prototype.indexOf.call(line.childNodes, node);\n for (let i = 0; i < index; i++) {\n offset = getLineChildEnd(line.childNodes[i]);\n }\n return offset;\n }\n for (const token of collectTokens(line)) {\n if (isInside(token, node)) {\n const base = getCharacterIndex(token)!;\n return base + (node.nodeType === 3 ? textLengthBefore(token, node) : 0);\n }\n }\n let offset = 0;\n let target: HTMLElement | null =\n node.nodeType === 1 ? (node as HTMLElement) : node.parentElement;\n while (target !== null && target.parentElement !== null) {\n if (getLineIndex(target.parentElement) !== undefined) {\n break;\n }\n const parent = target.parentElement;\n const index = Array.prototype.indexOf.call(parent.childNodes, target);\n for (let i = 0; i < index; i++) {\n offset = getLineChildEnd(parent.childNodes[i]);\n }\n target = parent;\n }\n return offset;\n}\n\nfunction findTokenSpan(el: HTMLElement): HTMLElement | null {\n let current: HTMLElement | null = el;\n while (current !== null) {\n if (getLineIndex(current) !== undefined) {\n return null;\n }\n if (getCharacterIndex(current) !== undefined) {\n return current;\n }\n current = current.parentElement;\n }\n return null;\n}\n\nfunction getLineChildEnd(\n child: Node | undefined,\n textOffsetInChild?: number\n): number {\n if (child === undefined) {\n return 0;\n }\n if (child.nodeType === 3) {\n const parent = child.parentElement;\n if (parent === null) {\n return 0;\n }\n const token = findTokenSpan(parent);\n if (token === null) {\n return 0;\n }\n const base = getCharacterIndex(token);\n if (base === undefined) {\n return 0;\n }\n const length =\n textOffsetInChild === undefined\n ? getTextOffset(child.textContent, child.textContent?.length ?? 0)\n : getTextOffset(child.textContent, textOffsetInChild);\n return base + textLengthBefore(token, child) + length;\n }\n if (child.nodeType !== 1) {\n return 0;\n }\n const el = child as HTMLElement;\n if (el.tagName !== 'SPAN' && el.tagName !== 'BR') {\n return 0;\n }\n const base = getCharacterIndex(el);\n if (base !== undefined) {\n return base + (el.textContent?.length ?? 0);\n }\n let end = 0;\n for (const token of el.childNodes) {\n end = Math.max(end, getLineChildEnd(token));\n }\n return end;\n}\n\nfunction getLineIndex(el: HTMLElement): number | undefined {\n const { line } = el.dataset;\n if (line !== undefined) {\n const lineNumber = parseInt(line, 10);\n if (!Number.isNaN(lineNumber)) {\n return lineNumber - 1;\n }\n }\n return undefined;\n}\n\nfunction getCharacterIndex(el: HTMLElement): number | undefined {\n const { char } = el.dataset;\n if (char !== undefined) {\n const charIndex = parseInt(char, 10);\n if (!Number.isNaN(charIndex)) {\n return charIndex;\n }\n }\n return undefined;\n}\n\nfunction getTextOffset(\n text: string | null | undefined,\n offset: number\n): number {\n const value = text ?? '';\n const lineBreakIndex = value.search(/[\\r\\n]/);\n return Math.min(\n offset,\n lineBreakIndex === -1 ? value.length : lineBreakIndex\n );\n}\n"],"mappings":"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"}
@@ -1,8 +1,8 @@
1
- import { TextDocument, TextEdit } from "./textDocument.js";
2
1
  import { EditorSelection } from "./selection.js";
2
+ import { TextDocument, TextEdit } from "./textDocument.js";
3
3
 
4
- //#region src/editor/quickEdit.d.ts
5
- interface QuickEditContext<LAnnotation> {
4
+ //#region src/editor/selectionAction.d.ts
5
+ interface SelectionActionContext<LAnnotation> {
6
6
  /** The current selection. */
7
7
  selection: EditorSelection;
8
8
  /** The text document. */
@@ -13,17 +13,17 @@ interface QuickEditContext<LAnnotation> {
13
13
  getSelectionText: () => string;
14
14
  /** Replaces the text of the current selection. */
15
15
  replaceSelectionText: (text: string) => void;
16
- /** Closes the quick edit. */
16
+ /** Closes the selection action. */
17
17
  close: () => void;
18
18
  }
19
- declare class QuickEditWidget {
19
+ declare class SelectionActionWidget {
20
20
  #private;
21
21
  line: number;
22
22
  static renderIcon(x: number, y: number, container: HTMLElement | DocumentFragment, onclick: () => void): HTMLElement;
23
- constructor(line: number, quickEditElement: HTMLElement, fileContainer: HTMLElement, leadingWhitespaces: number | undefined, handleDomResize: () => void);
23
+ constructor(line: number, selectionActionElement: HTMLElement, fileContainer: HTMLElement, leadingWhitespaces: number | undefined, handleDomResize: () => void);
24
24
  render(containerElement: HTMLElement): void;
25
25
  cleanup(): void;
26
26
  }
27
27
  //#endregion
28
- export { QuickEditContext, QuickEditWidget };
29
- //# sourceMappingURL=quickEdit.d.ts.map
28
+ export { SelectionActionContext, SelectionActionWidget };
29
+ //# sourceMappingURL=selectionAction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selectionAction.d.ts","names":["EditorSelection","TextDocument","TextEdit","SelectionActionContext","LAnnotation","SelectionActionWidget","HTMLElement","DocumentFragment"],"sources":["../../src/editor/selectionAction.d.ts"],"sourcesContent":["import type { EditorSelection } from './selection';\nimport type { TextDocument, TextEdit } from './textDocument';\nexport interface SelectionActionContext<LAnnotation> {\n /** The current selection. */\n selection: EditorSelection;\n /** The text document. */\n textDocument: TextDocument<LAnnotation>;\n /** Applies the edits to the text document. */\n applyEdits: (edits: TextEdit[]) => void;\n /** Gets the text of the current selection. */\n getSelectionText: () => string;\n /** Replaces the text of the current selection. */\n replaceSelectionText: (text: string) => void;\n /** Closes the selection action. */\n close: () => void;\n}\nexport declare class SelectionActionWidget {\n #private;\n line: number;\n static renderIcon(x: number, y: number, container: HTMLElement | DocumentFragment, onclick: () => void): HTMLElement;\n constructor(line: number, selectionActionElement: HTMLElement, fileContainer: HTMLElement, leadingWhitespaces: number | undefined, handleDomResize: () => void);\n render(containerElement: HTMLElement): void;\n cleanup(): void;\n}\n//# sourceMappingURL=selectionAction.d.ts.map"],"mappings":";;;;UAEiBG;;EAAAA,SAAAA,EAEFH,eAFwB;EAExBA;EAEgBI,YAAAA,EAAbH,YAAaG,CAAAA,WAAAA,CAAAA;EAAbH;EAEMC,UAAAA,EAAAA,CAAAA,KAAAA,EAAAA,QAAAA,EAAAA,EAAAA,GAAAA,IAAAA;EAAQ;EAQXG,gBAAAA,EAAAA,GAAAA,GAAqB,MAAA;EAGaC;EAAcC,oBAAAA,EAAAA,CAAAA,IAAAA,EAAAA,MAAAA,EAAAA,GAAAA,IAAAA;EAAwCD;EACvDA,KAAAA,EAAAA,GAAAA,GAAAA,IAAAA;;AACzBA,cALRD,qBAAAA,CAKQC;EAAW,CAAA,OAAA;;qDAFeA,cAAcC,wCAAwCD;oDACvDA,4BAA4BA;2BACrDA"}
@@ -1,45 +1,43 @@
1
1
  import { h } from "./utils.js";
2
+ import { getEditorIconSvg } from "./sprite.js";
2
3
 
3
- //#region src/editor/quickEdit.ts
4
- var QuickEditWidget = class {
4
+ //#region src/editor/selectionAction.ts
5
+ var SelectionActionWidget = class {
5
6
  static renderIcon(x, y, container, onclick) {
6
7
  return h("div", {
7
8
  dataset: {
8
- quickEditIcon: "",
9
+ selectionActionIcon: "",
9
10
  visible: "false"
10
11
  },
11
- title: "Quick Edit",
12
+ title: "Selection Action",
12
13
  style: { transform: `translateY(${y}px) translateX(${x}px)` },
13
- innerHTML: `<svg width="16" height="16" viewBox="0 0 20 20">
14
- <polygon points="11 3 9 9 16 9 9 17 11 11 4 11 11 3" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" fill="currentColor"></polygon>
15
- </svg>
16
- `,
14
+ innerHTML: getEditorIconSvg("quick"),
17
15
  onclick
18
16
  }, container);
19
17
  }
20
18
  #gutterBuffer;
21
- #quickEditContainer;
19
+ #selectionActionContainer;
22
20
  #slot;
23
21
  #observer;
24
22
  #handleDomResize;
25
- constructor(line, quickEditElement, fileContainer, leadingWhitespaces = 0, handleDomResize) {
23
+ constructor(line, selectionActionElement, fileContainer, leadingWhitespaces = 0, handleDomResize) {
26
24
  this.line = line;
27
- const slotName = "quick-edit-" + line;
25
+ const slotName = "selection-action-" + line;
28
26
  this.#slot = h("div", {
29
- dataset: "quickEditSlot",
27
+ dataset: "selectionActionSlot",
30
28
  slot: slotName,
31
29
  style: "white-space: normal",
32
- children: [quickEditElement]
30
+ children: [selectionActionElement]
33
31
  }, fileContainer);
34
32
  this.#gutterBuffer = h("div", {
35
33
  dataset: {
36
- gutterBuffer: "quickEdit",
34
+ gutterBuffer: "selectionAction",
37
35
  bufferSize: "1"
38
36
  },
39
37
  style: "grid-row: span 1"
40
38
  });
41
- this.#quickEditContainer = h("div", {
42
- dataset: { quickEdit: String(line) },
39
+ this.#selectionActionContainer = h("div", {
40
+ dataset: { selectionAction: String(line) },
43
41
  style: { paddingInlineStart: leadingWhitespaces + 1 + "ch" },
44
42
  contentEditable: "false",
45
43
  children: [h("slot", { name: slotName })]
@@ -55,7 +53,7 @@ var QuickEditWidget = class {
55
53
  const contentLineElement = containerElement.querySelector(`[data-line="${lineNumber}"]`);
56
54
  if (gutterElement != null && gutterLineElement != null && contentLineElement != null) {
57
55
  gutterLineElement.after(this.#gutterBuffer);
58
- contentLineElement.after(this.#quickEditContainer);
56
+ contentLineElement.after(this.#selectionActionContainer);
59
57
  gutterElement.style.gridRow = "span " + gutterElement.children.length;
60
58
  containerElement.style.gridRow = "span " + containerElement.children.length;
61
59
  this.#handleDomResize();
@@ -63,9 +61,9 @@ var QuickEditWidget = class {
63
61
  }
64
62
  cleanup() {
65
63
  const gutter = this.#gutterBuffer.parentElement;
66
- const content = this.#quickEditContainer.parentElement;
64
+ const content = this.#selectionActionContainer.parentElement;
67
65
  this.#gutterBuffer.remove();
68
- this.#quickEditContainer.remove();
66
+ this.#selectionActionContainer.remove();
69
67
  if (gutter != null && content != null) {
70
68
  gutter.style.gridRow = "span " + gutter.children.length;
71
69
  content.style.gridRow = "span " + content.children.length;
@@ -77,5 +75,5 @@ var QuickEditWidget = class {
77
75
  };
78
76
 
79
77
  //#endregion
80
- export { QuickEditWidget };
81
- //# sourceMappingURL=quickEdit.js.map
78
+ export { SelectionActionWidget };
79
+ //# sourceMappingURL=selectionAction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selectionAction.js","names":["line: number","#slot","#gutterBuffer","#selectionActionContainer","#observer","#handleDomResize"],"sources":["../../src/editor/selectionAction.ts"],"sourcesContent":["import type { EditorSelection } from './selection';\nimport { getEditorIconSvg } from './sprite';\nimport type { TextDocument, TextEdit } from './textDocument';\nimport { h } from './utils';\n\nexport interface SelectionActionContext<LAnnotation> {\n /** The current selection. */\n selection: EditorSelection;\n /** The text document. */\n textDocument: TextDocument<LAnnotation>;\n /** Applies the edits to the text document. */\n applyEdits: (edits: TextEdit[]) => void;\n /** Gets the text of the current selection. */\n getSelectionText: () => string;\n /** Replaces the text of the current selection. */\n replaceSelectionText: (text: string) => void;\n /** Closes the selection action. */\n close: () => void;\n}\n\nexport class SelectionActionWidget {\n static renderIcon(\n x: number,\n y: number,\n container: HTMLElement | DocumentFragment,\n onclick: () => void\n ): HTMLElement {\n return h(\n 'div',\n {\n dataset: { selectionActionIcon: '', visible: 'false' },\n title: 'Selection Action',\n style: {\n transform: `translateY(${y}px) translateX(${x}px)`,\n },\n innerHTML: getEditorIconSvg('quick'),\n onclick,\n },\n container\n );\n }\n\n #gutterBuffer: HTMLElement;\n #selectionActionContainer: HTMLElement;\n #slot: HTMLElement;\n #observer: ResizeObserver;\n #handleDomResize: () => void;\n\n constructor(\n public line: number,\n selectionActionElement: HTMLElement,\n fileContainer: HTMLElement,\n leadingWhitespaces = 0,\n handleDomResize: () => void\n ) {\n const slotName = 'selection-action-' + line;\n this.#slot = h(\n 'div',\n {\n dataset: 'selectionActionSlot',\n slot: slotName,\n style: 'white-space: normal',\n children: [selectionActionElement],\n },\n fileContainer\n );\n this.#gutterBuffer = h('div', {\n dataset: { gutterBuffer: 'selectionAction', bufferSize: '1' },\n style: 'grid-row: span 1',\n });\n this.#selectionActionContainer = h('div', {\n dataset: { selectionAction: String(line) },\n style: {\n paddingInlineStart: leadingWhitespaces + 1 + 'ch', // +1 align css `padding-inline`\n },\n contentEditable: 'false',\n children: [h('slot', { name: slotName })],\n });\n this.#observer = new ResizeObserver(handleDomResize);\n this.#observer.observe(this.#slot);\n this.#handleDomResize = handleDomResize;\n }\n\n render(containerElement: HTMLElement): void {\n const gutterElement =\n containerElement.previousElementSibling as HTMLElement | null;\n const lineNumber = this.line + 1;\n const gutterLineElement = gutterElement?.querySelector<HTMLElement>(\n `[data-column-number=\"${lineNumber}\"]`\n );\n const contentLineElement = containerElement.querySelector<HTMLElement>(\n `[data-line=\"${lineNumber}\"]`\n );\n if (\n gutterElement != null &&\n gutterLineElement != null &&\n contentLineElement != null\n ) {\n gutterLineElement.after(this.#gutterBuffer);\n contentLineElement.after(this.#selectionActionContainer);\n gutterElement.style.gridRow = 'span ' + gutterElement.children.length;\n containerElement.style.gridRow =\n 'span ' + containerElement.children.length;\n this.#handleDomResize();\n }\n }\n\n cleanup(): void {\n const gutter = this.#gutterBuffer.parentElement;\n const content = this.#selectionActionContainer.parentElement;\n\n this.#gutterBuffer.remove();\n this.#selectionActionContainer.remove();\n\n if (gutter != null && content != null) {\n gutter.style.gridRow = 'span ' + gutter.children.length;\n content.style.gridRow = 'span ' + content.children.length;\n }\n this.#handleDomResize();\n\n this.#slot.remove();\n this.#observer.disconnect();\n }\n}\n"],"mappings":";;;;AAoBA,IAAa,wBAAb,MAAmC;CACjC,OAAO,WACL,GACA,GACA,WACA,SACa;AACb,SAAO,EACL,OACA;GACE,SAAS;IAAE,qBAAqB;IAAI,SAAS;IAAS;GACtD,OAAO;GACP,OAAO,EACL,WAAW,cAAc,EAAE,iBAAiB,EAAE,MAC/C;GACD,WAAW,iBAAiB,QAAQ;GACpC;GACD,EACD,UACD;;CAGH;CACA;CACA;CACA;CACA;CAEA,YACE,AAAOA,MACP,wBACA,eACA,qBAAqB,GACrB,iBACA;EALO;EAMP,MAAM,WAAW,sBAAsB;AACvC,QAAKC,OAAQ,EACX,OACA;GACE,SAAS;GACT,MAAM;GACN,OAAO;GACP,UAAU,CAAC,uBAAuB;GACnC,EACD,cACD;AACD,QAAKC,eAAgB,EAAE,OAAO;GAC5B,SAAS;IAAE,cAAc;IAAmB,YAAY;IAAK;GAC7D,OAAO;GACR,CAAC;AACF,QAAKC,2BAA4B,EAAE,OAAO;GACxC,SAAS,EAAE,iBAAiB,OAAO,KAAK,EAAE;GAC1C,OAAO,EACL,oBAAoB,qBAAqB,IAAI,MAC9C;GACD,iBAAiB;GACjB,UAAU,CAAC,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC,CAAC;GAC1C,CAAC;AACF,QAAKC,WAAY,IAAI,eAAe,gBAAgB;AACpD,QAAKA,SAAU,QAAQ,MAAKH,KAAM;AAClC,QAAKI,kBAAmB;;CAG1B,OAAO,kBAAqC;EAC1C,MAAM,gBACJ,iBAAiB;EACnB,MAAM,aAAa,KAAK,OAAO;EAC/B,MAAM,oBAAoB,eAAe,cACvC,wBAAwB,WAAW,IACpC;EACD,MAAM,qBAAqB,iBAAiB,cAC1C,eAAe,WAAW,IAC3B;AACD,MACE,iBAAiB,QACjB,qBAAqB,QACrB,sBAAsB,MACtB;AACA,qBAAkB,MAAM,MAAKH,aAAc;AAC3C,sBAAmB,MAAM,MAAKC,yBAA0B;AACxD,iBAAc,MAAM,UAAU,UAAU,cAAc,SAAS;AAC/D,oBAAiB,MAAM,UACrB,UAAU,iBAAiB,SAAS;AACtC,SAAKE,iBAAkB;;;CAI3B,UAAgB;EACd,MAAM,SAAS,MAAKH,aAAc;EAClC,MAAM,UAAU,MAAKC,yBAA0B;AAE/C,QAAKD,aAAc,QAAQ;AAC3B,QAAKC,yBAA0B,QAAQ;AAEvC,MAAI,UAAU,QAAQ,WAAW,MAAM;AACrC,UAAO,MAAM,UAAU,UAAU,OAAO,SAAS;AACjD,WAAQ,MAAM,UAAU,UAAU,QAAQ,SAAS;;AAErD,QAAKE,iBAAkB;AAEvB,QAAKJ,KAAM,QAAQ;AACnB,QAAKG,SAAU,YAAY"}
@@ -0,0 +1,8 @@
1
+ //#region src/editor/sprite.d.ts
2
+ type SVGSpriteNames = 'arrow-down' | 'arrow-up' | 'case' | 'close' | 'quick' | 'regex' | 'search' | 'whole-word';
3
+ declare const SVGSpriteSheet = "<svg data-icon-sprite aria-hidden=\"true\" width=\"0\" height=\"0\">\n <symbol id=\"diffs-editor-icon-search\" viewBox=\"0 0 16 16\">\n <path fill=\"currentColor\" fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M10.7747 12.8961C9.68558 13.5948 8.39011 14 7 14C3.13401 14 0 10.866 0 7C0 3.13401 3.13401 0 7 0C10.866 0 14 3.13401 14 7C14 8.39011 13.5948 9.68558 12.8961 10.7747L15.5607 13.4393C16.1464 14.0251 16.1464 14.9749 15.5607 15.5607C14.9749 16.1464 14.0251 16.1464 13.4393 15.5607L10.7747 12.8961ZM7 1.5C10.0376 1.5 12.5 3.96243 12.5 7C12.5 10.0376 10.0376 12.5 7 12.5C3.96243 12.5 1.5 10.0376 1.5 7C1.5 3.96243 3.96243 1.5 7 1.5Z\"></path>\n </symbol>\n <symbol id=\"diffs-editor-icon-close\" viewBox=\"0 0 16 16\">\n <path fill=\"currentColor\" d=\"M3.21967 3.21967C3.51256 2.92678 3.98744 2.92678 4.28033 3.21967L8 6.93934L11.7197 3.21967C12.0126 2.92678 12.4874 2.92678 12.7803 3.21967C13.0732 3.51256 13.0732 3.98744 12.7803 4.28033L9.06066 8L12.7803 11.7197C13.0732 12.0126 13.0732 12.4874 12.7803 12.7803C12.4874 13.0732 12.0126 13.0732 11.7197 12.7803L8 9.06066L4.28033 12.7803C3.98744 13.0732 3.51256 13.0732 3.21967 12.7803C2.92678 12.4874 2.92678 12.0126 3.21967 11.7197L6.93934 8L3.21967 4.28033C2.92678 3.98744 2.92678 3.51256 3.21967 3.21967Z\"></path>\n </symbol>\n <symbol id=\"diffs-editor-icon-arrow-up\" viewBox=\"0 0 16 16\">\n <path fill=\"currentColor\" transform=\"rotate(-90 8 8)\" d=\"M8.46967 4.21967C8.17678 4.51256 8.17678 4.98744 8.46967 5.28033L10.4393 7.25H3.75C3.33579 7.25 3 7.58579 3 8C3 8.41421 3.33579 8.75 3.75 8.75H10.4393L8.46967 10.7197C8.17678 11.0126 8.17678 11.4874 8.46967 11.7803C8.76256 12.0732 9.23744 12.0732 9.53033 11.7803L12.7803 8.53033C13.0732 8.23744 13.0732 7.76256 12.7803 7.46967L9.53033 4.21967C9.23744 3.92678 8.76256 3.92678 8.46967 4.21967Z\"></path>\n </symbol>\n <symbol id=\"diffs-editor-icon-arrow-down\" viewBox=\"0 0 16 16\">\n <path fill=\"currentColor\" transform=\"rotate(90 8 8)\" d=\"M8.46967 4.21967C8.17678 4.51256 8.17678 4.98744 8.46967 5.28033L10.4393 7.25H3.75C3.33579 7.25 3 7.58579 3 8C3 8.41421 3.33579 8.75 3.75 8.75H10.4393L8.46967 10.7197C8.17678 11.0126 8.17678 11.4874 8.46967 11.7803C8.76256 12.0732 9.23744 12.0732 9.53033 11.7803L12.7803 8.53033C13.0732 8.23744 13.0732 7.76256 12.7803 7.46967L9.53033 4.21967C9.23744 3.92678 8.76256 3.92678 8.46967 4.21967Z\"></path>\n </symbol>\n <symbol id=\"diffs-editor-icon-case\" viewBox=\"0 0 16 16\">\n <path fill=\"currentColor\" d=\"M12.2969 12.9969C10.7109 12.9969 9.61719 12.0125 9.61719 10.5047C9.61719 9.06719 10.6172 8.16094 12.5 8.15312H14.6641V7.31719C14.6641 6.23906 14.0391 5.64531 12.9297 5.64531C11.875 5.64531 11.2734 6.18437 11.1953 7.00469H9.92969C10.0156 5.56719 10.9922 4.52031 12.9766 4.52031C14.7266 4.52031 16 5.47344 16 7.2V12.8641H14.7109V11.8406H14.6719C14.2578 12.5047 13.5078 12.9969 12.2969 12.9969ZM12.6562 11.8797C13.8047 11.8797 14.6641 11.1609 14.6641 10.1375V9.18437H12.6016C11.4766 9.18437 10.9922 9.71562 10.9922 10.4578C10.9922 11.4266 11.7969 11.8797 12.6562 11.8797Z\"></path>\n <path fill=\"currentColor\" d=\"M1.42188 12.8641H0L3.79688 2H5.1875L8.98438 12.8641H7.54688L6.46875 9.66094H2.5L1.42188 12.8641ZM4.50781 3.60938H4.46875L2.86719 8.55937H6.10156L4.50781 3.60938Z\"></path>\n </symbol>\n <symbol id=\"diffs-editor-icon-whole-word\" viewBox=\"0 0 16 16\">\n <path fill=\"currentColor\" d=\"M11.4089 9.99449C11.1417 9.99449 10.8961 9.95595 10.6722 9.87887C10.4519 9.80179 10.2605 9.69167 10.098 9.54852C9.93551 9.40537 9.81453 9.23469 9.73508 9.03648H9.67007V9.91191H8.5V2H9.70258V5.01721H9.76758C9.81092 4.86671 9.88314 4.7309 9.98426 4.60977C10.089 4.48497 10.2136 4.37853 10.358 4.29043C10.5025 4.19867 10.6668 4.13076 10.851 4.08672C11.0352 4.039 11.2302 4.01514 11.436 4.01514C11.8802 4.01514 12.2648 4.11792 12.5898 4.32347C12.9149 4.52535 13.164 4.81532 13.3374 5.19339C13.5107 5.57146 13.5974 6.02478 13.5974 6.55334V7.45079C13.5974 7.97568 13.5089 8.429 13.332 8.81074C13.1586 9.1888 12.9076 9.48061 12.579 9.68617C12.2504 9.89172 11.8604 9.99449 11.4089 9.99449ZM11.0785 8.99243C11.353 8.99243 11.5859 8.92636 11.7773 8.79422C11.9723 8.66208 12.1204 8.46937 12.2215 8.2161C12.3226 7.95916 12.3732 7.65267 12.3732 7.29663V6.73503C12.3732 6.37164 12.3208 6.06332 12.2161 5.81005C12.115 5.55311 11.9669 5.35673 11.7719 5.22092C11.5769 5.08511 11.3385 5.01721 11.0568 5.01721C10.7824 5.01721 10.5422 5.08328 10.3364 5.21542C10.1341 5.34389 9.97704 5.52925 9.86509 5.77151C9.75675 6.01009 9.70258 6.2964 9.70258 6.63042V7.47281C9.70258 7.77013 9.76036 8.03441 9.87592 8.26566C9.99509 8.49323 10.1576 8.67125 10.3635 8.79972C10.5729 8.92819 10.8113 8.99243 11.0785 8.99243Z\"></path>\n <path fill=\"currentColor\" d=\"M4.70482 9.99449C4.15229 9.99449 3.70087 9.83482 3.35057 9.51548C3.00388 9.19247 2.83054 8.75935 2.83054 8.2161C2.83054 7.70223 3.00207 7.28745 3.34515 6.97178C3.69184 6.65244 4.19562 6.49277 4.8565 6.49277H6.30284V5.94769C6.30284 5.61367 6.20533 5.36774 6.01032 5.20991C5.81531 5.04841 5.55349 4.96765 5.22485 4.96765C5.00817 4.96765 4.82941 4.99702 4.68857 5.05575C4.54773 5.11081 4.43758 5.18789 4.35813 5.28699C4.27868 5.38243 4.22271 5.49621 4.19021 5.62835H3.04722C3.06527 5.3861 3.12305 5.16586 3.22056 4.96765C3.32168 4.76577 3.46252 4.59326 3.64309 4.4501C3.82727 4.30328 4.05297 4.19133 4.32021 4.11425C4.59106 4.03716 4.90525 3.99862 5.26277 3.99862C5.67086 3.99862 6.04463 4.06286 6.38409 4.19133C6.72356 4.31613 6.99441 4.52168 7.19665 4.80798C7.39888 5.09429 7.5 5.4797 7.5 5.96421V9.9064H6.35701V9.1521H6.30284C6.21978 9.29892 6.10783 9.43657 5.96698 9.56504C5.82614 9.69351 5.65099 9.79812 5.44153 9.87887C5.23569 9.95595 4.99012 9.99449 4.70482 9.99449ZM5.07318 9.04749C5.3043 9.04749 5.51196 8.99977 5.69613 8.90434C5.88031 8.80523 6.02657 8.67309 6.13491 8.50791C6.24686 8.34274 6.30284 8.1537 6.30284 7.94081V7.31314H5.04609C4.69579 7.31314 4.43939 7.39206 4.27688 7.5499C4.11798 7.70773 4.03853 7.90961 4.03853 8.15554C4.03853 8.4602 4.14326 8.68594 4.35272 8.83276C4.56578 8.97591 4.80594 9.04749 5.07318 9.04749Z\"></path>\n <path fill=\"currentColor\" d=\"M2.5 12.5L13.5 12.5C14.3284 12.5 15 11.8284 15 11V9.5C15 9.22386 15.2239 9 15.5 9C15.7761 9 16 9.22386 16 9.5V11C16 12.3807 14.8807 13.5 13.5 13.5L2.5 13.5C1.11929 13.5 -7.56324e-07 12.3807 0 11L6.55675e-08 9.5C3.58362e-07 9.22386 0.223858 9 0.5 9C0.776142 9 1 9.22386 1 9.5L1 11C0.999999 11.8284 1.67157 12.5 2.5 12.5Z\"></path>\n </symbol>\n <symbol id=\"diffs-editor-icon-regex\" viewBox=\"0 0 16 16\">\n <path fill=\"currentColor\" d=\"M8.60788 6.59074C8.78227 6.46701 9.02141 6.60508 9.00146 6.81797L8.77564 9.22666C8.76189 9.37331 8.87726 9.5 9.02455 9.5H9.97548C10.1228 9.5 10.2381 9.37331 10.2244 9.22667L9.99858 6.81801C9.97862 6.60513 10.2178 6.46706 10.3922 6.59079L12.3652 7.99066C12.4853 8.07589 12.6527 8.03932 12.7264 7.91177L13.2018 7.08823C13.2755 6.96068 13.2234 6.79742 13.0896 6.73601L10.8907 5.72723C10.6963 5.63807 10.6963 5.36193 10.8907 5.27277L13.0896 4.264C13.2234 4.20258 13.2755 4.03932 13.2018 3.91177L12.7263 3.08824C12.6527 2.96068 12.4853 2.92411 12.3652 3.00934L10.3922 4.40921C10.2178 4.53294 9.97862 4.39486 9.99858 4.18198L10.2244 1.77334C10.2381 1.62669 10.1228 1.5 9.97548 1.5H9.02455C8.87726 1.5 8.76189 1.62669 8.77564 1.77334L9.00146 4.18203C9.02141 4.39491 8.78227 4.53298 8.60788 4.40926L6.63479 3.00934C6.51466 2.92411 6.34726 2.96068 6.27362 3.08823L5.79815 3.91177C5.72451 4.03932 5.77654 4.20258 5.91041 4.26399L8.10929 5.27277C8.30363 5.36193 8.30363 5.63807 8.10929 5.72723L5.91041 6.73601C5.77653 6.79742 5.7245 6.96068 5.79814 7.08824L6.27361 7.91177C6.34725 8.03932 6.51466 8.07589 6.63478 7.99066L8.60788 6.59074Z\"></path>\n <path fill=\"currentColor\" d=\"M4 11C3.44772 11 3 11.4477 3 12V13C3 13.5523 3.44772 14 4 14H5C5.55228 14 6 13.5523 6 13V12C6 11.4477 5.55228 11 5 11H4Z\"></path>\n </symbol>\n <symbol id=\"diffs-editor-icon-quick\" viewBox=\"0 0 20 20\">\n <polygon points=\"11 3 9 9 16 9 9 17 11 11 4 11 11 3\" fill=\"currentColor\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"></polygon>\n </symbol>\n</svg>";
4
+ declare const createSpriteElement: () => SVGSVGElement;
5
+ declare const getEditorIconSvg: (name: SVGSpriteNames, size?: number) => string;
6
+ //#endregion
7
+ export { SVGSpriteNames, SVGSpriteSheet, createSpriteElement, getEditorIconSvg };
8
+ //# sourceMappingURL=sprite.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sprite.d.ts","names":["SVGSpriteNames","SVGSpriteSheet","createSpriteElement","SVGSVGElement","getEditorIconSvg"],"sources":["../../src/editor/sprite.d.ts"],"sourcesContent":["export type SVGSpriteNames = 'arrow-down' | 'arrow-up' | 'case' | 'close' | 'quick' | 'regex' | 'search' | 'whole-word';\nexport declare const SVGSpriteSheet = \"<svg data-icon-sprite aria-hidden=\\\"true\\\" width=\\\"0\\\" height=\\\"0\\\">\\n <symbol id=\\\"diffs-editor-icon-search\\\" viewBox=\\\"0 0 16 16\\\">\\n <path fill=\\\"currentColor\\\" fill-rule=\\\"evenodd\\\" clip-rule=\\\"evenodd\\\" d=\\\"M10.7747 12.8961C9.68558 13.5948 8.39011 14 7 14C3.13401 14 0 10.866 0 7C0 3.13401 3.13401 0 7 0C10.866 0 14 3.13401 14 7C14 8.39011 13.5948 9.68558 12.8961 10.7747L15.5607 13.4393C16.1464 14.0251 16.1464 14.9749 15.5607 15.5607C14.9749 16.1464 14.0251 16.1464 13.4393 15.5607L10.7747 12.8961ZM7 1.5C10.0376 1.5 12.5 3.96243 12.5 7C12.5 10.0376 10.0376 12.5 7 12.5C3.96243 12.5 1.5 10.0376 1.5 7C1.5 3.96243 3.96243 1.5 7 1.5Z\\\"></path>\\n </symbol>\\n <symbol id=\\\"diffs-editor-icon-close\\\" viewBox=\\\"0 0 16 16\\\">\\n <path fill=\\\"currentColor\\\" d=\\\"M3.21967 3.21967C3.51256 2.92678 3.98744 2.92678 4.28033 3.21967L8 6.93934L11.7197 3.21967C12.0126 2.92678 12.4874 2.92678 12.7803 3.21967C13.0732 3.51256 13.0732 3.98744 12.7803 4.28033L9.06066 8L12.7803 11.7197C13.0732 12.0126 13.0732 12.4874 12.7803 12.7803C12.4874 13.0732 12.0126 13.0732 11.7197 12.7803L8 9.06066L4.28033 12.7803C3.98744 13.0732 3.51256 13.0732 3.21967 12.7803C2.92678 12.4874 2.92678 12.0126 3.21967 11.7197L6.93934 8L3.21967 4.28033C2.92678 3.98744 2.92678 3.51256 3.21967 3.21967Z\\\"></path>\\n </symbol>\\n <symbol id=\\\"diffs-editor-icon-arrow-up\\\" viewBox=\\\"0 0 16 16\\\">\\n <path fill=\\\"currentColor\\\" transform=\\\"rotate(-90 8 8)\\\" d=\\\"M8.46967 4.21967C8.17678 4.51256 8.17678 4.98744 8.46967 5.28033L10.4393 7.25H3.75C3.33579 7.25 3 7.58579 3 8C3 8.41421 3.33579 8.75 3.75 8.75H10.4393L8.46967 10.7197C8.17678 11.0126 8.17678 11.4874 8.46967 11.7803C8.76256 12.0732 9.23744 12.0732 9.53033 11.7803L12.7803 8.53033C13.0732 8.23744 13.0732 7.76256 12.7803 7.46967L9.53033 4.21967C9.23744 3.92678 8.76256 3.92678 8.46967 4.21967Z\\\"></path>\\n </symbol>\\n <symbol id=\\\"diffs-editor-icon-arrow-down\\\" viewBox=\\\"0 0 16 16\\\">\\n <path fill=\\\"currentColor\\\" transform=\\\"rotate(90 8 8)\\\" d=\\\"M8.46967 4.21967C8.17678 4.51256 8.17678 4.98744 8.46967 5.28033L10.4393 7.25H3.75C3.33579 7.25 3 7.58579 3 8C3 8.41421 3.33579 8.75 3.75 8.75H10.4393L8.46967 10.7197C8.17678 11.0126 8.17678 11.4874 8.46967 11.7803C8.76256 12.0732 9.23744 12.0732 9.53033 11.7803L12.7803 8.53033C13.0732 8.23744 13.0732 7.76256 12.7803 7.46967L9.53033 4.21967C9.23744 3.92678 8.76256 3.92678 8.46967 4.21967Z\\\"></path>\\n </symbol>\\n <symbol id=\\\"diffs-editor-icon-case\\\" viewBox=\\\"0 0 16 16\\\">\\n <path fill=\\\"currentColor\\\" d=\\\"M12.2969 12.9969C10.7109 12.9969 9.61719 12.0125 9.61719 10.5047C9.61719 9.06719 10.6172 8.16094 12.5 8.15312H14.6641V7.31719C14.6641 6.23906 14.0391 5.64531 12.9297 5.64531C11.875 5.64531 11.2734 6.18437 11.1953 7.00469H9.92969C10.0156 5.56719 10.9922 4.52031 12.9766 4.52031C14.7266 4.52031 16 5.47344 16 7.2V12.8641H14.7109V11.8406H14.6719C14.2578 12.5047 13.5078 12.9969 12.2969 12.9969ZM12.6562 11.8797C13.8047 11.8797 14.6641 11.1609 14.6641 10.1375V9.18437H12.6016C11.4766 9.18437 10.9922 9.71562 10.9922 10.4578C10.9922 11.4266 11.7969 11.8797 12.6562 11.8797Z\\\"></path>\\n <path fill=\\\"currentColor\\\" d=\\\"M1.42188 12.8641H0L3.79688 2H5.1875L8.98438 12.8641H7.54688L6.46875 9.66094H2.5L1.42188 12.8641ZM4.50781 3.60938H4.46875L2.86719 8.55937H6.10156L4.50781 3.60938Z\\\"></path>\\n </symbol>\\n <symbol id=\\\"diffs-editor-icon-whole-word\\\" viewBox=\\\"0 0 16 16\\\">\\n <path fill=\\\"currentColor\\\" d=\\\"M11.4089 9.99449C11.1417 9.99449 10.8961 9.95595 10.6722 9.87887C10.4519 9.80179 10.2605 9.69167 10.098 9.54852C9.93551 9.40537 9.81453 9.23469 9.73508 9.03648H9.67007V9.91191H8.5V2H9.70258V5.01721H9.76758C9.81092 4.86671 9.88314 4.7309 9.98426 4.60977C10.089 4.48497 10.2136 4.37853 10.358 4.29043C10.5025 4.19867 10.6668 4.13076 10.851 4.08672C11.0352 4.039 11.2302 4.01514 11.436 4.01514C11.8802 4.01514 12.2648 4.11792 12.5898 4.32347C12.9149 4.52535 13.164 4.81532 13.3374 5.19339C13.5107 5.57146 13.5974 6.02478 13.5974 6.55334V7.45079C13.5974 7.97568 13.5089 8.429 13.332 8.81074C13.1586 9.1888 12.9076 9.48061 12.579 9.68617C12.2504 9.89172 11.8604 9.99449 11.4089 9.99449ZM11.0785 8.99243C11.353 8.99243 11.5859 8.92636 11.7773 8.79422C11.9723 8.66208 12.1204 8.46937 12.2215 8.2161C12.3226 7.95916 12.3732 7.65267 12.3732 7.29663V6.73503C12.3732 6.37164 12.3208 6.06332 12.2161 5.81005C12.115 5.55311 11.9669 5.35673 11.7719 5.22092C11.5769 5.08511 11.3385 5.01721 11.0568 5.01721C10.7824 5.01721 10.5422 5.08328 10.3364 5.21542C10.1341 5.34389 9.97704 5.52925 9.86509 5.77151C9.75675 6.01009 9.70258 6.2964 9.70258 6.63042V7.47281C9.70258 7.77013 9.76036 8.03441 9.87592 8.26566C9.99509 8.49323 10.1576 8.67125 10.3635 8.79972C10.5729 8.92819 10.8113 8.99243 11.0785 8.99243Z\\\"></path>\\n <path fill=\\\"currentColor\\\" d=\\\"M4.70482 9.99449C4.15229 9.99449 3.70087 9.83482 3.35057 9.51548C3.00388 9.19247 2.83054 8.75935 2.83054 8.2161C2.83054 7.70223 3.00207 7.28745 3.34515 6.97178C3.69184 6.65244 4.19562 6.49277 4.8565 6.49277H6.30284V5.94769C6.30284 5.61367 6.20533 5.36774 6.01032 5.20991C5.81531 5.04841 5.55349 4.96765 5.22485 4.96765C5.00817 4.96765 4.82941 4.99702 4.68857 5.05575C4.54773 5.11081 4.43758 5.18789 4.35813 5.28699C4.27868 5.38243 4.22271 5.49621 4.19021 5.62835H3.04722C3.06527 5.3861 3.12305 5.16586 3.22056 4.96765C3.32168 4.76577 3.46252 4.59326 3.64309 4.4501C3.82727 4.30328 4.05297 4.19133 4.32021 4.11425C4.59106 4.03716 4.90525 3.99862 5.26277 3.99862C5.67086 3.99862 6.04463 4.06286 6.38409 4.19133C6.72356 4.31613 6.99441 4.52168 7.19665 4.80798C7.39888 5.09429 7.5 5.4797 7.5 5.96421V9.9064H6.35701V9.1521H6.30284C6.21978 9.29892 6.10783 9.43657 5.96698 9.56504C5.82614 9.69351 5.65099 9.79812 5.44153 9.87887C5.23569 9.95595 4.99012 9.99449 4.70482 9.99449ZM5.07318 9.04749C5.3043 9.04749 5.51196 8.99977 5.69613 8.90434C5.88031 8.80523 6.02657 8.67309 6.13491 8.50791C6.24686 8.34274 6.30284 8.1537 6.30284 7.94081V7.31314H5.04609C4.69579 7.31314 4.43939 7.39206 4.27688 7.5499C4.11798 7.70773 4.03853 7.90961 4.03853 8.15554C4.03853 8.4602 4.14326 8.68594 4.35272 8.83276C4.56578 8.97591 4.80594 9.04749 5.07318 9.04749Z\\\"></path>\\n <path fill=\\\"currentColor\\\" d=\\\"M2.5 12.5L13.5 12.5C14.3284 12.5 15 11.8284 15 11V9.5C15 9.22386 15.2239 9 15.5 9C15.7761 9 16 9.22386 16 9.5V11C16 12.3807 14.8807 13.5 13.5 13.5L2.5 13.5C1.11929 13.5 -7.56324e-07 12.3807 0 11L6.55675e-08 9.5C3.58362e-07 9.22386 0.223858 9 0.5 9C0.776142 9 1 9.22386 1 9.5L1 11C0.999999 11.8284 1.67157 12.5 2.5 12.5Z\\\"></path>\\n </symbol>\\n <symbol id=\\\"diffs-editor-icon-regex\\\" viewBox=\\\"0 0 16 16\\\">\\n <path fill=\\\"currentColor\\\" d=\\\"M8.60788 6.59074C8.78227 6.46701 9.02141 6.60508 9.00146 6.81797L8.77564 9.22666C8.76189 9.37331 8.87726 9.5 9.02455 9.5H9.97548C10.1228 9.5 10.2381 9.37331 10.2244 9.22667L9.99858 6.81801C9.97862 6.60513 10.2178 6.46706 10.3922 6.59079L12.3652 7.99066C12.4853 8.07589 12.6527 8.03932 12.7264 7.91177L13.2018 7.08823C13.2755 6.96068 13.2234 6.79742 13.0896 6.73601L10.8907 5.72723C10.6963 5.63807 10.6963 5.36193 10.8907 5.27277L13.0896 4.264C13.2234 4.20258 13.2755 4.03932 13.2018 3.91177L12.7263 3.08824C12.6527 2.96068 12.4853 2.92411 12.3652 3.00934L10.3922 4.40921C10.2178 4.53294 9.97862 4.39486 9.99858 4.18198L10.2244 1.77334C10.2381 1.62669 10.1228 1.5 9.97548 1.5H9.02455C8.87726 1.5 8.76189 1.62669 8.77564 1.77334L9.00146 4.18203C9.02141 4.39491 8.78227 4.53298 8.60788 4.40926L6.63479 3.00934C6.51466 2.92411 6.34726 2.96068 6.27362 3.08823L5.79815 3.91177C5.72451 4.03932 5.77654 4.20258 5.91041 4.26399L8.10929 5.27277C8.30363 5.36193 8.30363 5.63807 8.10929 5.72723L5.91041 6.73601C5.77653 6.79742 5.7245 6.96068 5.79814 7.08824L6.27361 7.91177C6.34725 8.03932 6.51466 8.07589 6.63478 7.99066L8.60788 6.59074Z\\\"></path>\\n <path fill=\\\"currentColor\\\" d=\\\"M4 11C3.44772 11 3 11.4477 3 12V13C3 13.5523 3.44772 14 4 14H5C5.55228 14 6 13.5523 6 13V12C6 11.4477 5.55228 11 5 11H4Z\\\"></path>\\n </symbol>\\n <symbol id=\\\"diffs-editor-icon-quick\\\" viewBox=\\\"0 0 20 20\\\">\\n <polygon points=\\\"11 3 9 9 16 9 9 17 11 11 4 11 11 3\\\" fill=\\\"currentColor\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"></polygon>\\n </symbol>\\n</svg>\";\nexport declare const createSpriteElement: () => SVGSVGElement;\nexport declare const getEditorIconSvg: (name: SVGSpriteNames, size?: number) => string;\n//# sourceMappingURL=sprite.d.ts.map"],"mappings":";KAAYA,cAAAA;AAAAA,cACSC,cAAAA,GADK,i+PAAA;AACLA,cACAC,mBADc,EAAA,GAAA,GACaC,aADb;AACdD,cACAE,gBADwC,EAAbD,CAAAA,IAAAA,EACFH,cADe,EAAA,IAAA,CAAA,EAAA,MAAA,EAAA,GAAA,MAAA"}
@@ -0,0 +1,45 @@
1
+ //#region src/editor/sprite.ts
2
+ const SVGSpriteSheet = `<svg data-icon-sprite aria-hidden="true" width="0" height="0">
3
+ <symbol id="diffs-editor-icon-search" viewBox="0 0 16 16">
4
+ <path fill="currentColor" fill-rule="evenodd" clip-rule="evenodd" d="M10.7747 12.8961C9.68558 13.5948 8.39011 14 7 14C3.13401 14 0 10.866 0 7C0 3.13401 3.13401 0 7 0C10.866 0 14 3.13401 14 7C14 8.39011 13.5948 9.68558 12.8961 10.7747L15.5607 13.4393C16.1464 14.0251 16.1464 14.9749 15.5607 15.5607C14.9749 16.1464 14.0251 16.1464 13.4393 15.5607L10.7747 12.8961ZM7 1.5C10.0376 1.5 12.5 3.96243 12.5 7C12.5 10.0376 10.0376 12.5 7 12.5C3.96243 12.5 1.5 10.0376 1.5 7C1.5 3.96243 3.96243 1.5 7 1.5Z"></path>
5
+ </symbol>
6
+ <symbol id="diffs-editor-icon-close" viewBox="0 0 16 16">
7
+ <path fill="currentColor" d="M3.21967 3.21967C3.51256 2.92678 3.98744 2.92678 4.28033 3.21967L8 6.93934L11.7197 3.21967C12.0126 2.92678 12.4874 2.92678 12.7803 3.21967C13.0732 3.51256 13.0732 3.98744 12.7803 4.28033L9.06066 8L12.7803 11.7197C13.0732 12.0126 13.0732 12.4874 12.7803 12.7803C12.4874 13.0732 12.0126 13.0732 11.7197 12.7803L8 9.06066L4.28033 12.7803C3.98744 13.0732 3.51256 13.0732 3.21967 12.7803C2.92678 12.4874 2.92678 12.0126 3.21967 11.7197L6.93934 8L3.21967 4.28033C2.92678 3.98744 2.92678 3.51256 3.21967 3.21967Z"></path>
8
+ </symbol>
9
+ <symbol id="diffs-editor-icon-arrow-up" viewBox="0 0 16 16">
10
+ <path fill="currentColor" transform="rotate(-90 8 8)" d="M8.46967 4.21967C8.17678 4.51256 8.17678 4.98744 8.46967 5.28033L10.4393 7.25H3.75C3.33579 7.25 3 7.58579 3 8C3 8.41421 3.33579 8.75 3.75 8.75H10.4393L8.46967 10.7197C8.17678 11.0126 8.17678 11.4874 8.46967 11.7803C8.76256 12.0732 9.23744 12.0732 9.53033 11.7803L12.7803 8.53033C13.0732 8.23744 13.0732 7.76256 12.7803 7.46967L9.53033 4.21967C9.23744 3.92678 8.76256 3.92678 8.46967 4.21967Z"></path>
11
+ </symbol>
12
+ <symbol id="diffs-editor-icon-arrow-down" viewBox="0 0 16 16">
13
+ <path fill="currentColor" transform="rotate(90 8 8)" d="M8.46967 4.21967C8.17678 4.51256 8.17678 4.98744 8.46967 5.28033L10.4393 7.25H3.75C3.33579 7.25 3 7.58579 3 8C3 8.41421 3.33579 8.75 3.75 8.75H10.4393L8.46967 10.7197C8.17678 11.0126 8.17678 11.4874 8.46967 11.7803C8.76256 12.0732 9.23744 12.0732 9.53033 11.7803L12.7803 8.53033C13.0732 8.23744 13.0732 7.76256 12.7803 7.46967L9.53033 4.21967C9.23744 3.92678 8.76256 3.92678 8.46967 4.21967Z"></path>
14
+ </symbol>
15
+ <symbol id="diffs-editor-icon-case" viewBox="0 0 16 16">
16
+ <path fill="currentColor" d="M12.2969 12.9969C10.7109 12.9969 9.61719 12.0125 9.61719 10.5047C9.61719 9.06719 10.6172 8.16094 12.5 8.15312H14.6641V7.31719C14.6641 6.23906 14.0391 5.64531 12.9297 5.64531C11.875 5.64531 11.2734 6.18437 11.1953 7.00469H9.92969C10.0156 5.56719 10.9922 4.52031 12.9766 4.52031C14.7266 4.52031 16 5.47344 16 7.2V12.8641H14.7109V11.8406H14.6719C14.2578 12.5047 13.5078 12.9969 12.2969 12.9969ZM12.6562 11.8797C13.8047 11.8797 14.6641 11.1609 14.6641 10.1375V9.18437H12.6016C11.4766 9.18437 10.9922 9.71562 10.9922 10.4578C10.9922 11.4266 11.7969 11.8797 12.6562 11.8797Z"></path>
17
+ <path fill="currentColor" d="M1.42188 12.8641H0L3.79688 2H5.1875L8.98438 12.8641H7.54688L6.46875 9.66094H2.5L1.42188 12.8641ZM4.50781 3.60938H4.46875L2.86719 8.55937H6.10156L4.50781 3.60938Z"></path>
18
+ </symbol>
19
+ <symbol id="diffs-editor-icon-whole-word" viewBox="0 0 16 16">
20
+ <path fill="currentColor" d="M11.4089 9.99449C11.1417 9.99449 10.8961 9.95595 10.6722 9.87887C10.4519 9.80179 10.2605 9.69167 10.098 9.54852C9.93551 9.40537 9.81453 9.23469 9.73508 9.03648H9.67007V9.91191H8.5V2H9.70258V5.01721H9.76758C9.81092 4.86671 9.88314 4.7309 9.98426 4.60977C10.089 4.48497 10.2136 4.37853 10.358 4.29043C10.5025 4.19867 10.6668 4.13076 10.851 4.08672C11.0352 4.039 11.2302 4.01514 11.436 4.01514C11.8802 4.01514 12.2648 4.11792 12.5898 4.32347C12.9149 4.52535 13.164 4.81532 13.3374 5.19339C13.5107 5.57146 13.5974 6.02478 13.5974 6.55334V7.45079C13.5974 7.97568 13.5089 8.429 13.332 8.81074C13.1586 9.1888 12.9076 9.48061 12.579 9.68617C12.2504 9.89172 11.8604 9.99449 11.4089 9.99449ZM11.0785 8.99243C11.353 8.99243 11.5859 8.92636 11.7773 8.79422C11.9723 8.66208 12.1204 8.46937 12.2215 8.2161C12.3226 7.95916 12.3732 7.65267 12.3732 7.29663V6.73503C12.3732 6.37164 12.3208 6.06332 12.2161 5.81005C12.115 5.55311 11.9669 5.35673 11.7719 5.22092C11.5769 5.08511 11.3385 5.01721 11.0568 5.01721C10.7824 5.01721 10.5422 5.08328 10.3364 5.21542C10.1341 5.34389 9.97704 5.52925 9.86509 5.77151C9.75675 6.01009 9.70258 6.2964 9.70258 6.63042V7.47281C9.70258 7.77013 9.76036 8.03441 9.87592 8.26566C9.99509 8.49323 10.1576 8.67125 10.3635 8.79972C10.5729 8.92819 10.8113 8.99243 11.0785 8.99243Z"></path>
21
+ <path fill="currentColor" d="M4.70482 9.99449C4.15229 9.99449 3.70087 9.83482 3.35057 9.51548C3.00388 9.19247 2.83054 8.75935 2.83054 8.2161C2.83054 7.70223 3.00207 7.28745 3.34515 6.97178C3.69184 6.65244 4.19562 6.49277 4.8565 6.49277H6.30284V5.94769C6.30284 5.61367 6.20533 5.36774 6.01032 5.20991C5.81531 5.04841 5.55349 4.96765 5.22485 4.96765C5.00817 4.96765 4.82941 4.99702 4.68857 5.05575C4.54773 5.11081 4.43758 5.18789 4.35813 5.28699C4.27868 5.38243 4.22271 5.49621 4.19021 5.62835H3.04722C3.06527 5.3861 3.12305 5.16586 3.22056 4.96765C3.32168 4.76577 3.46252 4.59326 3.64309 4.4501C3.82727 4.30328 4.05297 4.19133 4.32021 4.11425C4.59106 4.03716 4.90525 3.99862 5.26277 3.99862C5.67086 3.99862 6.04463 4.06286 6.38409 4.19133C6.72356 4.31613 6.99441 4.52168 7.19665 4.80798C7.39888 5.09429 7.5 5.4797 7.5 5.96421V9.9064H6.35701V9.1521H6.30284C6.21978 9.29892 6.10783 9.43657 5.96698 9.56504C5.82614 9.69351 5.65099 9.79812 5.44153 9.87887C5.23569 9.95595 4.99012 9.99449 4.70482 9.99449ZM5.07318 9.04749C5.3043 9.04749 5.51196 8.99977 5.69613 8.90434C5.88031 8.80523 6.02657 8.67309 6.13491 8.50791C6.24686 8.34274 6.30284 8.1537 6.30284 7.94081V7.31314H5.04609C4.69579 7.31314 4.43939 7.39206 4.27688 7.5499C4.11798 7.70773 4.03853 7.90961 4.03853 8.15554C4.03853 8.4602 4.14326 8.68594 4.35272 8.83276C4.56578 8.97591 4.80594 9.04749 5.07318 9.04749Z"></path>
22
+ <path fill="currentColor" d="M2.5 12.5L13.5 12.5C14.3284 12.5 15 11.8284 15 11V9.5C15 9.22386 15.2239 9 15.5 9C15.7761 9 16 9.22386 16 9.5V11C16 12.3807 14.8807 13.5 13.5 13.5L2.5 13.5C1.11929 13.5 -7.56324e-07 12.3807 0 11L6.55675e-08 9.5C3.58362e-07 9.22386 0.223858 9 0.5 9C0.776142 9 1 9.22386 1 9.5L1 11C0.999999 11.8284 1.67157 12.5 2.5 12.5Z"></path>
23
+ </symbol>
24
+ <symbol id="diffs-editor-icon-regex" viewBox="0 0 16 16">
25
+ <path fill="currentColor" d="M8.60788 6.59074C8.78227 6.46701 9.02141 6.60508 9.00146 6.81797L8.77564 9.22666C8.76189 9.37331 8.87726 9.5 9.02455 9.5H9.97548C10.1228 9.5 10.2381 9.37331 10.2244 9.22667L9.99858 6.81801C9.97862 6.60513 10.2178 6.46706 10.3922 6.59079L12.3652 7.99066C12.4853 8.07589 12.6527 8.03932 12.7264 7.91177L13.2018 7.08823C13.2755 6.96068 13.2234 6.79742 13.0896 6.73601L10.8907 5.72723C10.6963 5.63807 10.6963 5.36193 10.8907 5.27277L13.0896 4.264C13.2234 4.20258 13.2755 4.03932 13.2018 3.91177L12.7263 3.08824C12.6527 2.96068 12.4853 2.92411 12.3652 3.00934L10.3922 4.40921C10.2178 4.53294 9.97862 4.39486 9.99858 4.18198L10.2244 1.77334C10.2381 1.62669 10.1228 1.5 9.97548 1.5H9.02455C8.87726 1.5 8.76189 1.62669 8.77564 1.77334L9.00146 4.18203C9.02141 4.39491 8.78227 4.53298 8.60788 4.40926L6.63479 3.00934C6.51466 2.92411 6.34726 2.96068 6.27362 3.08823L5.79815 3.91177C5.72451 4.03932 5.77654 4.20258 5.91041 4.26399L8.10929 5.27277C8.30363 5.36193 8.30363 5.63807 8.10929 5.72723L5.91041 6.73601C5.77653 6.79742 5.7245 6.96068 5.79814 7.08824L6.27361 7.91177C6.34725 8.03932 6.51466 8.07589 6.63478 7.99066L8.60788 6.59074Z"></path>
26
+ <path fill="currentColor" d="M4 11C3.44772 11 3 11.4477 3 12V13C3 13.5523 3.44772 14 4 14H5C5.55228 14 6 13.5523 6 13V12C6 11.4477 5.55228 11 5 11H4Z"></path>
27
+ </symbol>
28
+ <symbol id="diffs-editor-icon-quick" viewBox="0 0 20 20">
29
+ <polygon points="11 3 9 9 16 9 9 17 11 11 4 11 11 3" fill="currentColor" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"></polygon>
30
+ </symbol>
31
+ </svg>`;
32
+ const createSpriteElement = () => {
33
+ const fragment = document.createElement("div");
34
+ fragment.innerHTML = SVGSpriteSheet;
35
+ const sprite = fragment.firstElementChild;
36
+ if (sprite === null || !(sprite instanceof SVGSVGElement)) throw new Error("Failed to create sprite element");
37
+ return sprite;
38
+ };
39
+ const getEditorIconSvg = (name, size = 16) => `<svg width="${size}" height="${size}" aria-hidden="true" focusable="false">
40
+ <use href="#diffs-editor-icon-${name}"></use>
41
+ </svg>`;
42
+
43
+ //#endregion
44
+ export { SVGSpriteSheet, createSpriteElement, getEditorIconSvg };
45
+ //# sourceMappingURL=sprite.js.map