@pierre/diffs 1.1.0-beta.6 → 1.1.0-beta.8

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 (291) hide show
  1. package/dist/components/AdvancedVirtualizedFileDiff.d.ts +40 -0
  2. package/dist/components/AdvancedVirtualizedFileDiff.d.ts.map +1 -0
  3. package/dist/components/AdvancedVirtualizedFileDiff.js +145 -0
  4. package/dist/components/AdvancedVirtualizedFileDiff.js.map +1 -0
  5. package/dist/components/AdvancedVirtualizer.d.ts +38 -0
  6. package/dist/components/AdvancedVirtualizer.d.ts.map +1 -0
  7. package/dist/components/AdvancedVirtualizer.js +201 -0
  8. package/dist/components/AdvancedVirtualizer.js.map +1 -0
  9. package/dist/components/File.d.ts +58 -33
  10. package/dist/components/File.d.ts.map +1 -1
  11. package/dist/components/File.js +223 -22
  12. package/dist/components/File.js.map +1 -1
  13. package/dist/components/FileDiff.d.ts +42 -16
  14. package/dist/components/FileDiff.d.ts.map +1 -1
  15. package/dist/components/FileDiff.js +505 -65
  16. package/dist/components/FileDiff.js.map +1 -1
  17. package/dist/components/FileStream.d.ts +5 -0
  18. package/dist/components/FileStream.d.ts.map +1 -1
  19. package/dist/components/FileStream.js +66 -8
  20. package/dist/components/FileStream.js.map +1 -1
  21. package/dist/components/VirtualizedFile.d.ts +33 -0
  22. package/dist/components/VirtualizedFile.d.ts.map +1 -0
  23. package/dist/components/VirtualizedFile.js +227 -0
  24. package/dist/components/VirtualizedFile.js.map +1 -0
  25. package/dist/components/VirtualizedFileDiff.d.ts +39 -0
  26. package/dist/components/VirtualizedFileDiff.d.ts.map +1 -0
  27. package/dist/components/VirtualizedFileDiff.js +316 -0
  28. package/dist/components/VirtualizedFileDiff.js.map +1 -0
  29. package/dist/components/Virtualizer.d.ts +63 -0
  30. package/dist/components/Virtualizer.d.ts.map +1 -0
  31. package/dist/components/Virtualizer.js +369 -0
  32. package/dist/components/Virtualizer.js.map +1 -0
  33. package/dist/components/VirtulizerDevelopment.d.ts +14 -0
  34. package/dist/components/VirtulizerDevelopment.d.ts.map +1 -0
  35. package/dist/components/web-components.d.ts +1 -1
  36. package/dist/components/web-components.d.ts.map +1 -1
  37. package/dist/constants.d.ts +4 -7
  38. package/dist/constants.d.ts.map +1 -1
  39. package/dist/constants.js +14 -6
  40. package/dist/constants.js.map +1 -1
  41. package/dist/highlighter/languages/areLanguagesAttached.d.ts.map +1 -1
  42. package/dist/highlighter/languages/attachResolvedLanguages.d.ts.map +1 -1
  43. package/dist/highlighter/languages/cleanUpResolvedLanguages.d.ts.map +1 -1
  44. package/dist/highlighter/languages/constants.d.ts.map +1 -1
  45. package/dist/highlighter/languages/getResolvedLanguages.d.ts.map +1 -1
  46. package/dist/highlighter/languages/getResolvedOrResolveLanguage.d.ts +1 -1
  47. package/dist/highlighter/languages/getResolvedOrResolveLanguage.d.ts.map +1 -1
  48. package/dist/highlighter/languages/hasResolvedLanguages.d.ts.map +1 -1
  49. package/dist/highlighter/languages/registerCustomLanguage.d.ts +11 -4
  50. package/dist/highlighter/languages/registerCustomLanguage.d.ts.map +1 -1
  51. package/dist/highlighter/languages/resolveLanguage.d.ts +1 -1
  52. package/dist/highlighter/languages/resolveLanguage.d.ts.map +1 -1
  53. package/dist/highlighter/languages/resolveLanguages.d.ts.map +1 -1
  54. package/dist/highlighter/shared_highlighter.d.ts.map +1 -1
  55. package/dist/highlighter/shared_highlighter.js.map +1 -1
  56. package/dist/highlighter/themes/areThemesAttached.d.ts.map +1 -1
  57. package/dist/highlighter/themes/attachResolvedThemes.d.ts.map +1 -1
  58. package/dist/highlighter/themes/cleanUpResolvedThemes.d.ts.map +1 -1
  59. package/dist/highlighter/themes/constants.d.ts.map +1 -1
  60. package/dist/highlighter/themes/getResolvedOrResolveTheme.d.ts.map +1 -1
  61. package/dist/highlighter/themes/getResolvedThemes.d.ts.map +1 -1
  62. package/dist/highlighter/themes/hasResolvedThemes.d.ts.map +1 -1
  63. package/dist/highlighter/themes/registerCustomCSSVariableTheme.d.ts.map +1 -1
  64. package/dist/highlighter/themes/registerCustomTheme.d.ts.map +1 -1
  65. package/dist/highlighter/themes/resolveTheme.d.ts.map +1 -1
  66. package/dist/highlighter/themes/resolveThemes.d.ts.map +1 -1
  67. package/dist/index.d.ts +13 -10
  68. package/dist/index.js +10 -7
  69. package/dist/managers/LineSelectionManager.d.ts +14 -15
  70. package/dist/managers/LineSelectionManager.d.ts.map +1 -1
  71. package/dist/managers/LineSelectionManager.js +60 -71
  72. package/dist/managers/LineSelectionManager.js.map +1 -1
  73. package/dist/managers/MouseEventManager.d.ts +13 -6
  74. package/dist/managers/MouseEventManager.d.ts.map +1 -1
  75. package/dist/managers/MouseEventManager.js +161 -47
  76. package/dist/managers/MouseEventManager.js.map +1 -1
  77. package/dist/managers/ResizeManager.d.ts +6 -1
  78. package/dist/managers/ResizeManager.d.ts.map +1 -1
  79. package/dist/managers/ResizeManager.js +114 -64
  80. package/dist/managers/ResizeManager.js.map +1 -1
  81. package/dist/managers/ScrollSyncManager.d.ts.map +1 -1
  82. package/dist/managers/UniversalRenderingManager.d.ts.map +1 -1
  83. package/dist/react/File.d.ts +1 -0
  84. package/dist/react/File.d.ts.map +1 -1
  85. package/dist/react/File.js +2 -1
  86. package/dist/react/File.js.map +1 -1
  87. package/dist/react/FileDiff.d.ts +1 -0
  88. package/dist/react/FileDiff.d.ts.map +1 -1
  89. package/dist/react/FileDiff.js +2 -1
  90. package/dist/react/FileDiff.js.map +1 -1
  91. package/dist/react/MultiFileDiff.d.ts +1 -0
  92. package/dist/react/MultiFileDiff.d.ts.map +1 -1
  93. package/dist/react/MultiFileDiff.js +2 -1
  94. package/dist/react/MultiFileDiff.js.map +1 -1
  95. package/dist/react/PatchDiff.d.ts +1 -0
  96. package/dist/react/PatchDiff.d.ts.map +1 -1
  97. package/dist/react/PatchDiff.js +3 -2
  98. package/dist/react/PatchDiff.js.map +1 -1
  99. package/dist/react/Virtualizer.d.ts +25 -0
  100. package/dist/react/Virtualizer.d.ts.map +1 -0
  101. package/dist/react/Virtualizer.js +38 -0
  102. package/dist/react/Virtualizer.js.map +1 -0
  103. package/dist/react/WorkerPoolContext.d.ts.map +1 -1
  104. package/dist/react/WorkerPoolContext.js +1 -1
  105. package/dist/react/WorkerPoolContext.js.map +1 -1
  106. package/dist/react/constants.d.ts.map +1 -1
  107. package/dist/react/index.d.ts +3 -2
  108. package/dist/react/index.js +2 -1
  109. package/dist/react/jsx.d.ts.map +1 -1
  110. package/dist/react/types.d.ts +5 -3
  111. package/dist/react/types.d.ts.map +1 -1
  112. package/dist/react/utils/renderDiffChildren.d.ts +5 -5
  113. package/dist/react/utils/renderDiffChildren.d.ts.map +1 -1
  114. package/dist/react/utils/renderFileChildren.d.ts +5 -5
  115. package/dist/react/utils/renderFileChildren.d.ts.map +1 -1
  116. package/dist/react/utils/templateRender.d.ts.map +1 -1
  117. package/dist/react/utils/useFileDiffInstance.d.ts +5 -3
  118. package/dist/react/utils/useFileDiffInstance.d.ts.map +1 -1
  119. package/dist/react/utils/useFileDiffInstance.js +6 -2
  120. package/dist/react/utils/useFileDiffInstance.js.map +1 -1
  121. package/dist/react/utils/useFileInstance.d.ts +5 -3
  122. package/dist/react/utils/useFileInstance.d.ts.map +1 -1
  123. package/dist/react/utils/useFileInstance.js +6 -2
  124. package/dist/react/utils/useFileInstance.js.map +1 -1
  125. package/dist/react/utils/useStableCallback.d.ts.map +1 -1
  126. package/dist/react/utils/useStableCallback.js.map +1 -1
  127. package/dist/renderers/DiffHunksRenderer.d.ts +15 -10
  128. package/dist/renderers/DiffHunksRenderer.d.ts.map +1 -1
  129. package/dist/renderers/DiffHunksRenderer.js +240 -136
  130. package/dist/renderers/DiffHunksRenderer.js.map +1 -1
  131. package/dist/renderers/FileRenderer.d.ts +12 -5
  132. package/dist/renderers/FileRenderer.d.ts.map +1 -1
  133. package/dist/renderers/FileRenderer.js +90 -31
  134. package/dist/renderers/FileRenderer.js.map +1 -1
  135. package/dist/shiki-stream/stream.d.ts +2 -2
  136. package/dist/shiki-stream/stream.d.ts.map +1 -1
  137. package/dist/shiki-stream/stream.js.map +1 -1
  138. package/dist/shiki-stream/tokenizer.d.ts +2 -2
  139. package/dist/shiki-stream/tokenizer.d.ts.map +1 -1
  140. package/dist/shiki-stream/tokenizer.js.map +1 -1
  141. package/dist/shiki-stream/types.d.ts +18 -18
  142. package/dist/shiki-stream/types.d.ts.map +1 -1
  143. package/dist/sprite.d.ts +1 -1
  144. package/dist/sprite.d.ts.map +1 -1
  145. package/dist/ssr/FileDiffReact.d.ts.map +1 -1
  146. package/dist/ssr/FileDiffReact.js +1 -1
  147. package/dist/ssr/index.d.ts +2 -2
  148. package/dist/ssr/preloadDiffs.d.ts.map +1 -1
  149. package/dist/ssr/preloadFile.d.ts.map +1 -1
  150. package/dist/ssr/preloadPatchFile.d.ts.map +1 -1
  151. package/dist/ssr/preloadPatchFile.js.map +1 -1
  152. package/dist/ssr/renderHTML.d.ts.map +1 -1
  153. package/dist/style.js +1 -1
  154. package/dist/style.js.map +1 -1
  155. package/dist/types.d.ts +191 -172
  156. package/dist/types.d.ts.map +1 -1
  157. package/dist/utils/areDiffLineAnnotationsEqual.d.ts.map +1 -1
  158. package/dist/utils/areDiffLineAnnotationsEqual.js.map +1 -1
  159. package/dist/utils/areFilesEqual.d.ts.map +1 -1
  160. package/dist/utils/areHunkDataEqual.d.ts.map +1 -1
  161. package/dist/utils/areLineAnnotationsEqual.d.ts.map +1 -1
  162. package/dist/utils/areObjectsEqual.d.ts.map +1 -1
  163. package/dist/utils/areOptionsEqual.d.ts +1 -1
  164. package/dist/utils/areOptionsEqual.d.ts.map +1 -1
  165. package/dist/utils/arePrePropertiesEqual.d.ts.map +1 -1
  166. package/dist/utils/arePrePropertiesEqual.js +1 -1
  167. package/dist/utils/arePrePropertiesEqual.js.map +1 -1
  168. package/dist/utils/areRenderRangesEqual.d.ts.map +1 -1
  169. package/dist/utils/areSelectionsEqual.d.ts.map +1 -1
  170. package/dist/utils/areThemesEqual.d.ts.map +1 -1
  171. package/dist/utils/areVirtualWindowSpecsEqual.d.ts.map +1 -1
  172. package/dist/utils/areWorkerStatsEqual.d.ts.map +1 -1
  173. package/dist/utils/cleanLastNewline.d.ts.map +1 -1
  174. package/dist/utils/createAnnotationElement.d.ts.map +1 -1
  175. package/dist/utils/createAnnotationWrapperNode.d.ts.map +1 -1
  176. package/dist/utils/createContentColumn.d.ts +7 -0
  177. package/dist/utils/createContentColumn.d.ts.map +1 -0
  178. package/dist/utils/createContentColumn.js +17 -0
  179. package/dist/utils/createContentColumn.js.map +1 -0
  180. package/dist/utils/createEmptyRowBuffer.d.ts.map +1 -1
  181. package/dist/utils/createEmptyRowBuffer.js +2 -1
  182. package/dist/utils/createEmptyRowBuffer.js.map +1 -1
  183. package/dist/utils/createFileHeaderElement.d.ts.map +1 -1
  184. package/dist/utils/createHoverContentNode.d.ts.map +1 -1
  185. package/dist/utils/createNoNewlineElement.d.ts +2 -1
  186. package/dist/utils/createNoNewlineElement.d.ts.map +1 -1
  187. package/dist/utils/createNoNewlineElement.js +3 -6
  188. package/dist/utils/createNoNewlineElement.js.map +1 -1
  189. package/dist/utils/createPreElement.d.ts +2 -1
  190. package/dist/utils/createPreElement.d.ts.map +1 -1
  191. package/dist/utils/createPreElement.js +4 -3
  192. package/dist/utils/createPreElement.js.map +1 -1
  193. package/dist/utils/createRowNodes.d.ts.map +1 -1
  194. package/dist/utils/createSeparator.d.ts.map +1 -1
  195. package/dist/utils/createSeparator.js +1 -1
  196. package/dist/utils/createSeparator.js.map +1 -1
  197. package/dist/utils/createSpanNodeFromToken.d.ts.map +1 -1
  198. package/dist/utils/createSpanNodeFromToken.js.map +1 -1
  199. package/dist/utils/createStyleElement.d.ts.map +1 -1
  200. package/dist/utils/createTransformerWithState.d.ts.map +1 -1
  201. package/dist/utils/createUnsafeCSSStyleNode.d.ts.map +1 -1
  202. package/dist/utils/createWindowFromScrollPosition.d.ts.map +1 -1
  203. package/dist/utils/cssWrappers.d.ts.map +1 -1
  204. package/dist/utils/diffAcceptRejectHunk.d.ts +1 -1
  205. package/dist/utils/diffAcceptRejectHunk.d.ts.map +1 -1
  206. package/dist/utils/formatCSSVariablePrefix.d.ts +1 -1
  207. package/dist/utils/formatCSSVariablePrefix.d.ts.map +1 -1
  208. package/dist/utils/getFiletypeFromFileName.d.ts.map +1 -1
  209. package/dist/utils/getHighlighterOptions.d.ts.map +1 -1
  210. package/dist/utils/getHighlighterThemeStyles.d.ts.map +1 -1
  211. package/dist/utils/getHunkSeparatorSlotName.d.ts +3 -1
  212. package/dist/utils/getHunkSeparatorSlotName.d.ts.map +1 -1
  213. package/dist/utils/getHunkSeparatorSlotName.js.map +1 -1
  214. package/dist/utils/getIconForType.d.ts +1 -1
  215. package/dist/utils/getIconForType.d.ts.map +1 -1
  216. package/dist/utils/getLineAnnotationName.d.ts.map +1 -1
  217. package/dist/utils/getLineEndingType.d.ts +1 -1
  218. package/dist/utils/getLineEndingType.d.ts.map +1 -1
  219. package/dist/utils/getLineNodes.d.ts.map +1 -1
  220. package/dist/utils/getOrCreateCodeNode.d.ts +4 -2
  221. package/dist/utils/getOrCreateCodeNode.d.ts.map +1 -1
  222. package/dist/utils/getOrCreateCodeNode.js +9 -6
  223. package/dist/utils/getOrCreateCodeNode.js.map +1 -1
  224. package/dist/utils/getSingularPatch.d.ts.map +1 -1
  225. package/dist/utils/getThemes.d.ts.map +1 -1
  226. package/dist/utils/getTotalLineCountFromHunks.d.ts.map +1 -1
  227. package/dist/utils/hast_utils.d.ts +6 -3
  228. package/dist/utils/hast_utils.d.ts.map +1 -1
  229. package/dist/utils/hast_utils.js +28 -4
  230. package/dist/utils/hast_utils.js.map +1 -1
  231. package/dist/utils/isDefaultRenderRange.d.ts.map +1 -1
  232. package/dist/utils/isWorkerContext.d.ts.map +1 -1
  233. package/dist/utils/iterateOverDiff.d.ts +26 -13
  234. package/dist/utils/iterateOverDiff.d.ts.map +1 -1
  235. package/dist/utils/iterateOverDiff.js +94 -55
  236. package/dist/utils/iterateOverDiff.js.map +1 -1
  237. package/dist/utils/iterateOverFile.d.ts +50 -0
  238. package/dist/utils/iterateOverFile.d.ts.map +1 -0
  239. package/dist/utils/iterateOverFile.js +49 -0
  240. package/dist/utils/iterateOverFile.js.map +1 -0
  241. package/dist/utils/parseDiffDecorations.d.ts.map +1 -1
  242. package/dist/utils/parseDiffFromFile.d.ts +6 -6
  243. package/dist/utils/parseDiffFromFile.d.ts.map +1 -1
  244. package/dist/utils/parseDiffFromFile.js +3 -2
  245. package/dist/utils/parseDiffFromFile.js.map +1 -1
  246. package/dist/utils/parseLineType.d.ts +1 -1
  247. package/dist/utils/parseLineType.d.ts.map +1 -1
  248. package/dist/utils/parsePatchFiles.d.ts +12 -10
  249. package/dist/utils/parsePatchFiles.d.ts.map +1 -1
  250. package/dist/utils/parsePatchFiles.js +16 -9
  251. package/dist/utils/parsePatchFiles.js.map +1 -1
  252. package/dist/utils/prerenderHTMLIfNecessary.d.ts.map +1 -1
  253. package/dist/utils/processLine.d.ts.map +1 -1
  254. package/dist/utils/processLine.js +7 -24
  255. package/dist/utils/processLine.js.map +1 -1
  256. package/dist/utils/renderDiffWithHighlighter.d.ts +2 -2
  257. package/dist/utils/renderDiffWithHighlighter.d.ts.map +1 -1
  258. package/dist/utils/renderDiffWithHighlighter.js +15 -14
  259. package/dist/utils/renderDiffWithHighlighter.js.map +1 -1
  260. package/dist/utils/renderFileWithHighlighter.d.ts +7 -2
  261. package/dist/utils/renderFileWithHighlighter.d.ts.map +1 -1
  262. package/dist/utils/renderFileWithHighlighter.js +30 -4
  263. package/dist/utils/renderFileWithHighlighter.js.map +1 -1
  264. package/dist/utils/resolveVirtualFileMetrics.d.ts +7 -0
  265. package/dist/utils/resolveVirtualFileMetrics.d.ts.map +1 -0
  266. package/dist/utils/resolveVirtualFileMetrics.js +24 -0
  267. package/dist/utils/resolveVirtualFileMetrics.js.map +1 -0
  268. package/dist/utils/setLanguageOverride.d.ts.map +1 -1
  269. package/dist/utils/setWrapperNodeProps.d.ts +1 -0
  270. package/dist/utils/setWrapperNodeProps.d.ts.map +1 -1
  271. package/dist/utils/setWrapperNodeProps.js +19 -12
  272. package/dist/utils/setWrapperNodeProps.js.map +1 -1
  273. package/dist/utils/splitFileContents.d.ts +12 -0
  274. package/dist/utils/splitFileContents.d.ts.map +1 -0
  275. package/dist/utils/splitFileContents.js +17 -0
  276. package/dist/utils/splitFileContents.js.map +1 -0
  277. package/dist/utils/trimPatchContext.d.ts +5 -5
  278. package/dist/utils/trimPatchContext.d.ts.map +1 -1
  279. package/dist/worker/WorkerPoolManager.d.ts +2 -2
  280. package/dist/worker/WorkerPoolManager.d.ts.map +1 -1
  281. package/dist/worker/WorkerPoolManager.js +36 -24
  282. package/dist/worker/WorkerPoolManager.js.map +1 -1
  283. package/dist/worker/getOrCreateWorkerPoolSingleton.d.ts.map +1 -1
  284. package/dist/worker/getOrCreateWorkerPoolSingleton.js.map +1 -1
  285. package/dist/worker/types.d.ts +26 -26
  286. package/dist/worker/types.d.ts.map +1 -1
  287. package/dist/worker/worker-portable.js +323 -143
  288. package/dist/worker/worker-portable.js.map +1 -1
  289. package/dist/worker/worker.js +206 -106
  290. package/dist/worker/worker.js.map +1 -1
  291. package/package.json +52 -53
@@ -31,7 +31,7 @@ var LineSelectionManager = class {
31
31
  cancelAnimationFrame(this._queuedRender);
32
32
  this._queuedRender = void 0;
33
33
  }
34
- if (this.pre != null) delete this.pre.dataset.interactiveLineNumbers;
34
+ this.pre?.removeAttribute("data-interactive-line-numbers");
35
35
  this.pre = void 0;
36
36
  }
37
37
  setup(pre) {
@@ -61,10 +61,14 @@ var LineSelectionManager = class {
61
61
  getSelection() {
62
62
  return this.selectedRange;
63
63
  }
64
+ getLineIndex(lineNumber, side) {
65
+ const { getLineIndex } = this.options;
66
+ return getLineIndex != null ? getLineIndex(lineNumber, side) : [lineNumber - 1, lineNumber - 1];
67
+ }
64
68
  attachEventListeners() {
65
69
  if (this.pre == null) return;
66
70
  this.removeEventListeners();
67
- this.pre.dataset.interactiveLineNumbers = "";
71
+ this.pre.setAttribute("data-interactive-line-numbers", "");
68
72
  this.pre.addEventListener("pointerdown", this.handleMouseDown);
69
73
  }
70
74
  removeEventListeners() {
@@ -72,15 +76,15 @@ var LineSelectionManager = class {
72
76
  this.pre.removeEventListener("pointerdown", this.handleMouseDown);
73
77
  document.removeEventListener("pointermove", this.handleMouseMove);
74
78
  document.removeEventListener("pointerup", this.handleMouseUp);
75
- delete this.pre.dataset.interactiveLineNumbers;
79
+ this.pre.removeAttribute("data-interactive-line-numbers");
76
80
  }
77
81
  handleMouseDown = (event) => {
78
82
  const mouseEventData = event.button === 0 ? this.getMouseEventDataForPath(event.composedPath(), "click") : void 0;
79
- if (mouseEventData == null) return;
83
+ if (mouseEventData == null || this.pre == null) return;
80
84
  event.preventDefault();
81
85
  const { lineNumber, eventSide, lineIndex } = mouseEventData;
82
86
  if (event.shiftKey && this.selectedRange != null) {
83
- const range = this.deriveRowRangeFromDOM(this.selectedRange, this.pre?.dataset.type === "split");
87
+ const range = this.getIndexesFromSelection(this.selectedRange, this.pre.getAttribute("data-diff-type") === "split");
84
88
  if (range == null) return;
85
89
  const useStart = range.start <= range.end ? lineIndex >= range.start : lineIndex <= range.end;
86
90
  this.anchor = {
@@ -133,6 +137,15 @@ var LineSelectionManager = class {
133
137
  }
134
138
  this._queuedRender ??= requestAnimationFrame(this.renderSelection);
135
139
  }
140
+ getIndexesFromSelection(selectedRange, split) {
141
+ if (this.pre == null) return;
142
+ const startIndexes = this.getLineIndex(selectedRange.start, selectedRange.side);
143
+ const finalIndexes = this.getLineIndex(selectedRange.end, selectedRange.endSide ?? selectedRange.side);
144
+ return startIndexes != null && finalIndexes != null ? {
145
+ start: split ? startIndexes[1] : startIndexes[0],
146
+ end: split ? finalIndexes[1] : finalIndexes[0]
147
+ } : void 0;
148
+ }
136
149
  renderSelection = () => {
137
150
  if (this._queuedRender != null) {
138
151
  cancelAnimationFrame(this._queuedRender);
@@ -143,14 +156,14 @@ var LineSelectionManager = class {
143
156
  for (const element of allSelected) element.removeAttribute("data-selected-line");
144
157
  this.renderedSelectionRange = this.selectedRange;
145
158
  if (this.selectedRange == null) return;
146
- const codeElements = this.pre.querySelectorAll("[data-code]");
159
+ const { children: codeElements } = this.pre;
147
160
  if (codeElements.length === 0) return;
148
161
  if (codeElements.length > 2) {
149
162
  console.error(codeElements);
150
163
  throw new Error("LineSelectionManager.applySelectionToDOM: Somehow there are more than 2 code elements...");
151
164
  }
152
- const split = this.pre.dataset.type === "split";
153
- const rowRange = this.deriveRowRangeFromDOM(this.selectedRange, split);
165
+ const split = this.pre.getAttribute("data-diff-type") === "split";
166
+ const rowRange = this.getIndexesFromSelection(this.selectedRange, split);
154
167
  if (rowRange == null) {
155
168
  console.error({
156
169
  rowRange,
@@ -161,44 +174,32 @@ var LineSelectionManager = class {
161
174
  const isSingle = rowRange.start === rowRange.end;
162
175
  const first = Math.min(rowRange.start, rowRange.end);
163
176
  const last = Math.max(rowRange.start, rowRange.end);
164
- for (const code of codeElements) for (const element of code.children) {
165
- if (!(element instanceof HTMLElement)) continue;
166
- const lineIndex = this.getLineIndex(element, split);
167
- if ((lineIndex ?? 0) > last) break;
168
- if (lineIndex == null || lineIndex < first) continue;
169
- let attributeValue = isSingle ? "single" : lineIndex === first ? "first" : lineIndex === last ? "last" : "";
170
- element.setAttribute("data-selected-line", attributeValue);
171
- if (element.nextSibling instanceof HTMLElement && element.nextSibling.hasAttribute("data-line-annotation")) {
172
- if (isSingle) {
173
- attributeValue = "last";
174
- element.setAttribute("data-selected-line", "first");
175
- } else if (lineIndex === first) attributeValue = "";
176
- else if (lineIndex === last) element.setAttribute("data-selected-line", "");
177
- element.nextSibling.setAttribute("data-selected-line", attributeValue);
177
+ for (const code of codeElements) {
178
+ const [gutter, content] = code.children;
179
+ const len = content.children.length;
180
+ if (len !== gutter.children.length) throw new Error("LineSelectionManager.renderSelection: gutter and content children dont match, something is wrong");
181
+ for (let i = 0; i < len; i++) {
182
+ const contentElement = content.children[i];
183
+ const gutterElement = gutter.children[i];
184
+ if (!(contentElement instanceof HTMLElement) || !(gutterElement instanceof HTMLElement)) continue;
185
+ const lineIndex = this.parseLineIndex(contentElement, split);
186
+ if ((lineIndex ?? 0) > last) break;
187
+ if (lineIndex == null || lineIndex < first) continue;
188
+ let attributeValue = isSingle ? "single" : lineIndex === first ? "first" : lineIndex === last ? "last" : "";
189
+ contentElement.setAttribute("data-selected-line", attributeValue);
190
+ gutterElement.setAttribute("data-selected-line", attributeValue);
191
+ if (gutterElement.nextSibling instanceof HTMLElement && contentElement.nextSibling instanceof HTMLElement && contentElement.nextSibling.hasAttribute("data-line-annotation")) {
192
+ if (isSingle) {
193
+ attributeValue = "last";
194
+ contentElement.setAttribute("data-selected-line", "first");
195
+ } else if (lineIndex === first) attributeValue = "";
196
+ else if (lineIndex === last) contentElement.setAttribute("data-selected-line", "");
197
+ contentElement.nextSibling.setAttribute("data-selected-line", attributeValue);
198
+ gutterElement.nextSibling.setAttribute("data-selected-line", attributeValue);
199
+ }
178
200
  }
179
201
  }
180
202
  };
181
- deriveRowRangeFromDOM(range, split) {
182
- if (range == null) return void 0;
183
- const start = this.findRowIndexForLineNumber(range.start, range.side, split);
184
- const end = range.end === range.start && (range.endSide == null || range.endSide === range.side) ? start : this.findRowIndexForLineNumber(range.end, range.endSide ?? range.side, split);
185
- return start != null && end != null ? {
186
- start,
187
- end
188
- } : void 0;
189
- }
190
- findRowIndexForLineNumber(lineNumber, targetSide = "additions", split) {
191
- if (this.pre == null) return void 0;
192
- const elements = Array.from(this.pre.querySelectorAll(`[data-line="${lineNumber}"]`));
193
- elements.push(...Array.from(this.pre.querySelectorAll(`[data-alt-line="${lineNumber}"]`)));
194
- if (elements.length === 0) return void 0;
195
- for (const element of elements) {
196
- if (!(element instanceof HTMLElement)) continue;
197
- if (this.getLineSideFromElement(element) === targetSide) return this.getLineIndex(element, split);
198
- else if (parseInt(element.dataset.altLine ?? "") === lineNumber) return this.getLineIndex(element, split);
199
- }
200
- console.error("LineSelectionManager.findRowIndexForLineNumber: Invalid selection", lineNumber, targetSide);
201
- }
202
203
  notifySelectionChange() {
203
204
  const { onLineSelected } = this.options;
204
205
  if (onLineSelected == null) return;
@@ -215,31 +216,25 @@ var LineSelectionManager = class {
215
216
  onLineSelectionEnd(range);
216
217
  }
217
218
  getMouseEventDataForPath(path, eventType) {
219
+ if (this.pre == null) return;
218
220
  let lineNumber;
219
221
  let lineIndex;
220
222
  let isNumberColumn = false;
221
223
  let eventSide;
222
224
  for (const element of path) {
225
+ if (lineNumber != null && lineIndex != null && eventSide != null) break;
223
226
  if (!(element instanceof HTMLElement)) continue;
224
- if (element.hasAttribute("data-column-number")) {
225
- isNumberColumn = true;
226
- continue;
227
- }
228
- if (element.hasAttribute("data-line")) {
227
+ if (element.hasAttribute("data-line-index")) {
228
+ isNumberColumn = element.hasAttribute("data-column-number");
229
229
  lineNumber = this.getLineNumber(element);
230
- lineIndex = this.getLineIndex(element, this.pre?.dataset.type === "split");
231
- if (element.dataset.lineType === "change-deletion") eventSide = "deletions";
232
- else if (element.dataset.lineType === "change-additions") eventSide = "additions";
233
- if (lineIndex == null || lineNumber == null) {
234
- lineIndex = void 0;
235
- lineNumber = void 0;
236
- break;
237
- }
238
- if (eventSide != null) break;
230
+ lineIndex = this.parseLineIndex(element, this.pre.getAttribute("data-diff-type") === "split");
231
+ const lineType = element.getAttribute("data-line-type");
232
+ if (lineType === "change-deletion") eventSide = "deletions";
233
+ else if (lineType === "change-additions") eventSide = "additions";
239
234
  continue;
240
235
  }
241
- if (element.hasAttribute("data-code")) {
242
- eventSide ??= element.hasAttribute("data-deletions") ? "deletions" : "additions";
236
+ if (eventSide == null && element.hasAttribute("data-code")) {
237
+ eventSide = element.hasAttribute("data-deletions") ? "deletions" : element.hasAttribute("data-additions") ? "additions" : void 0;
243
238
  break;
244
239
  }
245
240
  }
@@ -251,28 +246,22 @@ var LineSelectionManager = class {
251
246
  };
252
247
  }
253
248
  getLineNumber(element) {
254
- const lineNumber = parseInt(element.dataset.line ?? "", 10);
249
+ const lineNumber = parseInt(element.getAttribute("data-column-number") ?? element.getAttribute("data-line") ?? "", 10);
255
250
  return !Number.isNaN(lineNumber) ? lineNumber : void 0;
256
251
  }
257
- getLineIndex(element, split) {
258
- const lineIndexes = (element.dataset.lineIndex ?? "").split(",").map((value) => parseInt(value)).filter((value) => !Number.isNaN(value));
252
+ parseLineIndex(element, split) {
253
+ const lineIndexes = (element.getAttribute("data-line-index") ?? "").split(",").map((value) => parseInt(value)).filter((value) => !Number.isNaN(value));
259
254
  if (split && lineIndexes.length === 2) return lineIndexes[1];
260
255
  else if (!split) return lineIndexes[0];
261
256
  }
262
- getLineSideFromElement(element) {
263
- if (element.dataset.lineType === "change-deletion") return "deletions";
264
- if (element.dataset.lineType === "change-addition") return "additions";
265
- const parent = element.closest("[data-code]");
266
- if (!(parent instanceof HTMLElement)) return "additions";
267
- return parent.hasAttribute("data-deletions") ? "deletions" : "additions";
268
- }
269
257
  };
270
- function pluckLineSelectionOptions({ enableLineSelection, onLineSelected, onLineSelectionStart, onLineSelectionEnd }) {
258
+ function pluckLineSelectionOptions({ enableLineSelection, onLineSelected, onLineSelectionStart, onLineSelectionEnd }, getLineIndex) {
271
259
  return {
272
260
  enableLineSelection,
273
261
  onLineSelected,
274
262
  onLineSelectionStart,
275
- onLineSelectionEnd
263
+ onLineSelectionEnd,
264
+ getLineIndex
276
265
  };
277
266
  }
278
267
 
@@ -1 +1 @@
1
- {"version":3,"file":"LineSelectionManager.js","names":["options: LineSelectionOptions","lineNumber: number | undefined","lineIndex: number | undefined","eventSide: AnnotationSide | undefined"],"sources":["../../src/managers/LineSelectionManager.ts"],"sourcesContent":["import type { AnnotationSide } from '../types';\nimport { areSelectionsEqual } from '../utils/areSelectionsEqual';\n\nexport type SelectionSide = AnnotationSide;\n\nexport interface SelectedLineRange {\n start: number;\n side?: SelectionSide;\n end: number;\n endSide?: SelectionSide;\n}\n\nexport interface LineSelectionOptions {\n enableLineSelection?: boolean;\n onLineSelected?: (range: SelectedLineRange | null) => void;\n onLineSelectionStart?: (range: SelectedLineRange | null) => void;\n onLineSelectionEnd?: (range: SelectedLineRange | null) => void;\n}\n\ninterface MouseInfo {\n lineNumber: number;\n eventSide: AnnotationSide;\n lineIndex: number;\n}\n\n/**\n * Manages line selection state and interactions for code/diff viewers.\n * Handles:\n * - Click and drag selection\n * - Shift-click to extend selection\n * - DOM attribute updates (data-selected-line)\n */\nexport class LineSelectionManager {\n private pre: HTMLPreElement | undefined;\n private selectedRange: SelectedLineRange | null = null;\n private renderedSelectionRange: SelectedLineRange | null | undefined;\n private anchor: { line: number; side: SelectionSide } | undefined;\n private _queuedRender: number | undefined;\n\n constructor(private options: LineSelectionOptions = {}) {}\n\n setOptions(options: LineSelectionOptions): void {\n this.options = { ...this.options, ...options };\n this.removeEventListeners();\n if (this.options.enableLineSelection === true) {\n this.attachEventListeners();\n }\n }\n\n cleanUp(): void {\n this.removeEventListeners();\n if (this._queuedRender != null) {\n cancelAnimationFrame(this._queuedRender);\n this._queuedRender = undefined;\n }\n if (this.pre != null) {\n delete this.pre.dataset.interactiveLineNumbers;\n }\n this.pre = undefined;\n }\n\n setup(pre: HTMLPreElement): void {\n // Assume we are always dirty after a setup...\n this.setDirty();\n if (this.pre !== pre) {\n this.cleanUp();\n this.pre = pre;\n const { enableLineSelection = false } = this.options;\n if (enableLineSelection) {\n this.attachEventListeners();\n } else {\n this.removeEventListeners();\n }\n }\n this.setSelection(this.selectedRange);\n }\n\n setDirty(): void {\n this.renderedSelectionRange = undefined;\n }\n\n isDirty(): boolean {\n return this.renderedSelectionRange === undefined;\n }\n\n setSelection(range: SelectedLineRange | null): void {\n const isRangeChange = !(\n range === this.selectedRange ||\n areSelectionsEqual(range ?? undefined, this.selectedRange ?? undefined)\n );\n if (!this.isDirty() && !isRangeChange) return;\n this.selectedRange = range;\n this.renderSelection();\n if (isRangeChange) {\n this.notifySelectionChange();\n }\n }\n\n getSelection(): SelectedLineRange | null {\n return this.selectedRange;\n }\n\n private attachEventListeners(): void {\n if (this.pre == null) return;\n // Lets run a cleanup, just in case\n this.removeEventListeners();\n this.pre.dataset.interactiveLineNumbers = '';\n this.pre.addEventListener('pointerdown', this.handleMouseDown);\n }\n\n private removeEventListeners(): void {\n if (this.pre == null) return;\n this.pre.removeEventListener('pointerdown', this.handleMouseDown);\n document.removeEventListener('pointermove', this.handleMouseMove);\n document.removeEventListener('pointerup', this.handleMouseUp);\n delete this.pre.dataset.interactiveLineNumbers;\n }\n\n private handleMouseDown = (event: PointerEvent): void => {\n // Only handle left mouse button\n const mouseEventData =\n event.button === 0\n ? this.getMouseEventDataForPath(event.composedPath(), 'click')\n : undefined;\n if (mouseEventData == null) {\n return;\n }\n event.preventDefault();\n const { lineNumber, eventSide, lineIndex } = mouseEventData;\n if (event.shiftKey && this.selectedRange != null) {\n const range = this.deriveRowRangeFromDOM(\n this.selectedRange,\n this.pre?.dataset.type === 'split'\n );\n if (range == null) return;\n const useStart =\n range.start <= range.end\n ? lineIndex >= range.start\n : lineIndex <= range.end;\n this.anchor = {\n line: useStart ? this.selectedRange.start : this.selectedRange.end,\n side:\n (useStart\n ? this.selectedRange.side\n : (this.selectedRange.endSide ?? this.selectedRange.side)) ??\n 'additions',\n };\n this.updateSelection(lineNumber, eventSide);\n this.notifySelectionStart(this.selectedRange);\n } else {\n // Check if clicking on already selected single line to unselect\n if (\n this.selectedRange?.start === lineNumber &&\n this.selectedRange?.end === lineNumber\n ) {\n this.updateSelection(null);\n this.notifySelectionEnd(null);\n this.notifySelectionChange();\n return;\n }\n this.selectedRange = null;\n this.anchor = { line: lineNumber, side: eventSide };\n this.updateSelection(lineNumber, eventSide);\n this.notifySelectionStart(this.selectedRange);\n }\n\n document.addEventListener('pointermove', this.handleMouseMove);\n document.addEventListener('pointerup', this.handleMouseUp);\n };\n\n private handleMouseMove = (event: PointerEvent): void => {\n const mouseEventData = this.getMouseEventDataForPath(\n event.composedPath(),\n 'move'\n );\n if (mouseEventData == null || this.anchor == null) return;\n const { lineNumber, eventSide } = mouseEventData;\n this.updateSelection(lineNumber, eventSide);\n };\n\n private handleMouseUp = (): void => {\n this.anchor = undefined;\n document.removeEventListener('pointermove', this.handleMouseMove);\n document.removeEventListener('pointerup', this.handleMouseUp);\n this.notifySelectionEnd(this.selectedRange);\n this.notifySelectionChange();\n };\n\n private updateSelection(currentLine: null): void;\n private updateSelection(currentLine: number, side: AnnotationSide): void;\n private updateSelection(\n currentLine: number | null,\n side?: AnnotationSide\n ): void {\n if (currentLine == null) {\n this.selectedRange = null;\n } else {\n const anchorSide = this.anchor?.side ?? side;\n const anchorLine = this.anchor?.line ?? currentLine;\n this.selectedRange = {\n start: anchorLine,\n end: currentLine,\n side: anchorSide,\n endSide: anchorSide !== side ? side : undefined,\n };\n }\n this._queuedRender ??= requestAnimationFrame(this.renderSelection);\n }\n\n private renderSelection = (): void => {\n if (this._queuedRender != null) {\n cancelAnimationFrame(this._queuedRender);\n this._queuedRender = undefined;\n }\n if (\n this.pre == null ||\n this.renderedSelectionRange === this.selectedRange\n ) {\n return;\n }\n\n // First clear existing selections, maybe we\n // can cache this to better avoid this query?\n const allSelected = this.pre.querySelectorAll('[data-selected-line]');\n for (const element of allSelected) {\n element.removeAttribute('data-selected-line');\n }\n\n this.renderedSelectionRange = this.selectedRange;\n if (this.selectedRange == null) {\n return;\n }\n\n const codeElements = this.pre.querySelectorAll('[data-code]');\n if (codeElements.length === 0) return;\n if (codeElements.length > 2) {\n console.error(codeElements);\n throw new Error(\n 'LineSelectionManager.applySelectionToDOM: Somehow there are more than 2 code elements...'\n );\n }\n const split = this.pre.dataset.type === 'split';\n const rowRange = this.deriveRowRangeFromDOM(this.selectedRange, split);\n if (rowRange == null) {\n console.error({ rowRange, selectedRange: this.selectedRange });\n throw new Error(\n 'LineSelectionManager.renderSelection: No valid rowRange'\n );\n }\n const isSingle = rowRange.start === rowRange.end;\n const first = Math.min(rowRange.start, rowRange.end);\n const last = Math.max(rowRange.start, rowRange.end);\n for (const code of codeElements) {\n for (const element of code.children) {\n if (!(element instanceof HTMLElement)) continue;\n const lineIndex = this.getLineIndex(element, split);\n if ((lineIndex ?? 0) > last) break;\n if (lineIndex == null || lineIndex < first) continue;\n let attributeValue = isSingle\n ? 'single'\n : lineIndex === first\n ? 'first'\n : lineIndex === last\n ? 'last'\n : '';\n element.setAttribute('data-selected-line', attributeValue);\n // If we have a line annotation following our selected line, we should\n // mark it as selected as well\n if (\n element.nextSibling instanceof HTMLElement &&\n element.nextSibling.hasAttribute('data-line-annotation')\n ) {\n // Depending on the line's attribute value, lets go ahead and correct\n // it when adding in the annotation row\n if (isSingle) {\n // Single technically becomes 2 selected lines\n attributeValue = 'last';\n element.setAttribute('data-selected-line', 'first');\n } else if (lineIndex === first) {\n // We don't want apply 'first' to the line annotation\n attributeValue = '';\n } else if (lineIndex === last) {\n // the annotation will become the last selected line and therefore\n // our existing line should no longer be last\n element.setAttribute('data-selected-line', '');\n }\n element.nextSibling.setAttribute(\n 'data-selected-line',\n attributeValue\n );\n }\n }\n }\n };\n\n private deriveRowRangeFromDOM(\n range: SelectedLineRange,\n split: boolean\n ): { start: number; end: number } | undefined {\n if (range == null) return undefined;\n const start = this.findRowIndexForLineNumber(\n range.start,\n range.side,\n split\n );\n const end =\n range.end === range.start &&\n (range.endSide == null || range.endSide === range.side)\n ? start\n : this.findRowIndexForLineNumber(\n range.end,\n range.endSide ?? range.side,\n split\n );\n return start != null && end != null ? { start, end } : undefined;\n }\n\n private findRowIndexForLineNumber(\n lineNumber: number,\n targetSide: SelectionSide = 'additions',\n split: boolean\n ): number | undefined {\n if (this.pre == null) return undefined;\n const elements = Array.from(\n this.pre.querySelectorAll(`[data-line=\"${lineNumber}\"]`)\n );\n // Given how unified diffs can order things, we need to always process\n // `[data-line]` elements before `[data-alt-line]`\n elements.push(\n ...Array.from(\n this.pre.querySelectorAll(`[data-alt-line=\"${lineNumber}\"]`)\n )\n );\n if (elements.length === 0) return undefined;\n\n for (const element of elements) {\n if (!(element instanceof HTMLElement)) {\n continue;\n }\n const side = this.getLineSideFromElement(element);\n if (side === targetSide) {\n return this.getLineIndex(element, split);\n } else if (parseInt(element.dataset.altLine ?? '') === lineNumber) {\n return this.getLineIndex(element, split);\n }\n }\n console.error(\n 'LineSelectionManager.findRowIndexForLineNumber: Invalid selection',\n lineNumber,\n targetSide\n );\n return undefined;\n }\n\n private notifySelectionChange(): void {\n const { onLineSelected } = this.options;\n if (onLineSelected == null) return;\n\n onLineSelected(this.selectedRange ?? null);\n }\n\n private notifySelectionStart(range: SelectedLineRange | null): void {\n const { onLineSelectionStart } = this.options;\n if (onLineSelectionStart == null) return;\n onLineSelectionStart(range);\n }\n\n private notifySelectionEnd(range: SelectedLineRange | null): void {\n const { onLineSelectionEnd } = this.options;\n if (onLineSelectionEnd == null) return;\n onLineSelectionEnd(range);\n }\n\n private getMouseEventDataForPath(\n path: (EventTarget | undefined)[],\n eventType: 'click' | 'move'\n ): MouseInfo | undefined {\n let lineNumber: number | undefined;\n let lineIndex: number | undefined;\n let isNumberColumn = false;\n let eventSide: AnnotationSide | undefined;\n for (const element of path) {\n if (!(element instanceof HTMLElement)) {\n continue;\n }\n if (element.hasAttribute('data-column-number')) {\n isNumberColumn = true;\n continue;\n }\n if (element.hasAttribute('data-line')) {\n lineNumber = this.getLineNumber(element);\n lineIndex = this.getLineIndex(\n element,\n this.pre?.dataset.type === 'split'\n );\n if (element.dataset.lineType === 'change-deletion') {\n eventSide = 'deletions';\n } else if (element.dataset.lineType === 'change-additions') {\n eventSide = 'additions';\n }\n // if we can't pull out an index or line number, we can't do anything.\n if (lineIndex == null || lineNumber == null) {\n lineIndex = undefined;\n lineNumber = undefined;\n break;\n }\n // If we already have an eventSide, we done computin\n if (eventSide != null) {\n break;\n } else {\n // context type lines will need to be discovered higher up\n // at the data-code level\n }\n continue;\n }\n if (element.hasAttribute('data-code')) {\n eventSide ??= element.hasAttribute('data-deletions')\n ? 'deletions'\n : // context in unified style are assumed to be additions based on\n // their line numbers\n 'additions';\n // If we got to the code element, we def done, son\n break;\n }\n }\n if (\n (eventType === 'click' && !isNumberColumn) ||\n lineIndex == null ||\n lineNumber == null\n ) {\n return undefined;\n }\n return {\n lineIndex,\n lineNumber,\n // Normally this shouldn't hit unless we broke early for whatever reason,\n // but for types lets ensure it's additions if undefined\n eventSide: eventSide ?? 'additions',\n };\n }\n\n private getLineNumber(element: HTMLElement): number | undefined {\n const lineNumber = parseInt(element.dataset.line ?? '', 10);\n return !Number.isNaN(lineNumber) ? lineNumber : undefined;\n }\n\n private getLineIndex(\n element: HTMLElement,\n split: boolean\n ): number | undefined {\n const lineIndexes = (element.dataset.lineIndex ?? '')\n .split(',')\n .map((value) => parseInt(value))\n .filter((value) => !Number.isNaN(value));\n\n if (split && lineIndexes.length === 2) {\n return lineIndexes[1];\n } else if (!split) {\n return lineIndexes[0];\n }\n return undefined;\n }\n\n private getLineSideFromElement(element: HTMLElement): SelectionSide {\n if (element.dataset.lineType === 'change-deletion') {\n return 'deletions';\n }\n if (element.dataset.lineType === 'change-addition') {\n return 'additions';\n }\n const parent = element.closest('[data-code]');\n if (!(parent instanceof HTMLElement)) {\n return 'additions';\n }\n return parent.hasAttribute('data-deletions') ? 'deletions' : 'additions';\n }\n}\n\nexport function pluckLineSelectionOptions({\n enableLineSelection,\n onLineSelected,\n onLineSelectionStart,\n onLineSelectionEnd,\n}: LineSelectionOptions): LineSelectionOptions {\n return {\n enableLineSelection,\n onLineSelected,\n onLineSelectionStart,\n onLineSelectionEnd,\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"LineSelectionManager.js","names":["options: LineSelectionOptions","lineNumber: number | undefined","lineIndex: number | undefined","eventSide: SelectionSide | undefined"],"sources":["../../src/managers/LineSelectionManager.ts"],"sourcesContent":["import type { SelectionSide } from '../types';\nimport { areSelectionsEqual } from '../utils/areSelectionsEqual';\n\nexport interface SelectedLineRange {\n start: number;\n side?: SelectionSide;\n end: number;\n endSide?: SelectionSide;\n}\n\nexport type GetLineIndexUtility = (\n lineNumber: number,\n side?: SelectionSide\n) => [number, number] | undefined;\n\nexport interface LineSelectionOptions {\n enableLineSelection?: boolean;\n onLineSelected?: (range: SelectedLineRange | null) => void;\n onLineSelectionStart?: (range: SelectedLineRange | null) => void;\n onLineSelectionEnd?: (range: SelectedLineRange | null) => void;\n getLineIndex?: GetLineIndexUtility;\n}\n\ninterface MouseInfo {\n lineNumber: number;\n eventSide: SelectionSide | undefined;\n lineIndex: number;\n}\n\n/**\n * Manages line selection state and interactions for code/diff viewers.\n * Handles:\n * - Click and drag selection\n * - Shift-click to extend selection\n * - DOM attribute updates (data-selected-line)\n */\nexport class LineSelectionManager {\n private pre: HTMLPreElement | undefined;\n private selectedRange: SelectedLineRange | null = null;\n private renderedSelectionRange: SelectedLineRange | null | undefined;\n private anchor: { line: number; side: SelectionSide | undefined } | undefined;\n private _queuedRender: number | undefined;\n\n constructor(private options: LineSelectionOptions = {}) {}\n\n setOptions(options: LineSelectionOptions): void {\n this.options = { ...this.options, ...options };\n this.removeEventListeners();\n if (this.options.enableLineSelection === true) {\n this.attachEventListeners();\n }\n }\n\n cleanUp(): void {\n this.removeEventListeners();\n if (this._queuedRender != null) {\n cancelAnimationFrame(this._queuedRender);\n this._queuedRender = undefined;\n }\n this.pre?.removeAttribute('data-interactive-line-numbers');\n this.pre = undefined;\n }\n\n setup(pre: HTMLPreElement): void {\n // Assume we are always dirty after a setup...\n this.setDirty();\n if (this.pre !== pre) {\n this.cleanUp();\n this.pre = pre;\n const { enableLineSelection = false } = this.options;\n if (enableLineSelection) {\n this.attachEventListeners();\n } else {\n this.removeEventListeners();\n }\n }\n this.setSelection(this.selectedRange);\n }\n\n setDirty(): void {\n this.renderedSelectionRange = undefined;\n }\n\n isDirty(): boolean {\n return this.renderedSelectionRange === undefined;\n }\n\n setSelection(range: SelectedLineRange | null): void {\n const isRangeChange = !(\n range === this.selectedRange ||\n areSelectionsEqual(range ?? undefined, this.selectedRange ?? undefined)\n );\n if (!this.isDirty() && !isRangeChange) return;\n this.selectedRange = range;\n this.renderSelection();\n if (isRangeChange) {\n this.notifySelectionChange();\n }\n }\n\n getSelection(): SelectedLineRange | null {\n return this.selectedRange;\n }\n\n getLineIndex(\n lineNumber: number,\n side?: SelectionSide\n ): [number, number] | undefined {\n const { getLineIndex } = this.options;\n return getLineIndex != null\n ? getLineIndex(lineNumber, side)\n : [lineNumber - 1, lineNumber - 1];\n }\n\n private attachEventListeners(): void {\n if (this.pre == null) return;\n // Lets run a cleanup, just in case\n this.removeEventListeners();\n this.pre.setAttribute('data-interactive-line-numbers', '');\n this.pre.addEventListener('pointerdown', this.handleMouseDown);\n }\n\n private removeEventListeners(): void {\n if (this.pre == null) return;\n this.pre.removeEventListener('pointerdown', this.handleMouseDown);\n document.removeEventListener('pointermove', this.handleMouseMove);\n document.removeEventListener('pointerup', this.handleMouseUp);\n this.pre.removeAttribute('data-interactive-line-numbers');\n }\n\n private handleMouseDown = (event: PointerEvent): void => {\n // Only handle left mouse button\n const mouseEventData =\n event.button === 0\n ? this.getMouseEventDataForPath(event.composedPath(), 'click')\n : undefined;\n if (mouseEventData == null || this.pre == null) {\n return;\n }\n event.preventDefault();\n const { lineNumber, eventSide, lineIndex } = mouseEventData;\n if (event.shiftKey && this.selectedRange != null) {\n const range = this.getIndexesFromSelection(\n this.selectedRange,\n this.pre.getAttribute('data-diff-type') === 'split'\n );\n if (range == null) return;\n const useStart =\n range.start <= range.end\n ? lineIndex >= range.start\n : lineIndex <= range.end;\n this.anchor = {\n line: useStart ? this.selectedRange.start : this.selectedRange.end,\n side:\n (useStart\n ? this.selectedRange.side\n : (this.selectedRange.endSide ?? this.selectedRange.side)) ??\n 'additions',\n };\n this.updateSelection(lineNumber, eventSide);\n this.notifySelectionStart(this.selectedRange);\n } else {\n // Check if clicking on already selected single line to unselect\n if (\n this.selectedRange?.start === lineNumber &&\n this.selectedRange?.end === lineNumber\n ) {\n this.updateSelection(null);\n this.notifySelectionEnd(null);\n this.notifySelectionChange();\n return;\n }\n this.selectedRange = null;\n this.anchor = { line: lineNumber, side: eventSide };\n this.updateSelection(lineNumber, eventSide);\n this.notifySelectionStart(this.selectedRange);\n }\n\n document.addEventListener('pointermove', this.handleMouseMove);\n document.addEventListener('pointerup', this.handleMouseUp);\n };\n\n private handleMouseMove = (event: PointerEvent): void => {\n const mouseEventData = this.getMouseEventDataForPath(\n event.composedPath(),\n 'move'\n );\n if (mouseEventData == null || this.anchor == null) return;\n const { lineNumber, eventSide } = mouseEventData;\n this.updateSelection(lineNumber, eventSide);\n };\n\n private handleMouseUp = (): void => {\n this.anchor = undefined;\n document.removeEventListener('pointermove', this.handleMouseMove);\n document.removeEventListener('pointerup', this.handleMouseUp);\n this.notifySelectionEnd(this.selectedRange);\n this.notifySelectionChange();\n };\n\n private updateSelection(currentLine: null): void;\n private updateSelection(currentLine: number, side?: SelectionSide): void;\n private updateSelection(\n currentLine: number | null,\n side?: SelectionSide\n ): void {\n if (currentLine == null) {\n this.selectedRange = null;\n } else {\n const anchorSide = this.anchor?.side ?? side;\n const anchorLine = this.anchor?.line ?? currentLine;\n this.selectedRange = {\n start: anchorLine,\n end: currentLine,\n side: anchorSide,\n endSide: anchorSide !== side ? side : undefined,\n };\n }\n this._queuedRender ??= requestAnimationFrame(this.renderSelection);\n }\n\n private getIndexesFromSelection(\n selectedRange: SelectedLineRange,\n split: boolean\n ): { start: number; end: number } | undefined {\n if (this.pre == null) {\n return undefined;\n }\n const startIndexes = this.getLineIndex(\n selectedRange.start,\n selectedRange.side\n );\n const finalIndexes = this.getLineIndex(\n selectedRange.end,\n selectedRange.endSide ?? selectedRange.side\n );\n\n return startIndexes != null && finalIndexes != null\n ? {\n start: split ? startIndexes[1] : startIndexes[0],\n end: split ? finalIndexes[1] : finalIndexes[0],\n }\n : undefined;\n }\n\n private renderSelection = (): void => {\n if (this._queuedRender != null) {\n cancelAnimationFrame(this._queuedRender);\n this._queuedRender = undefined;\n }\n if (\n this.pre == null ||\n this.renderedSelectionRange === this.selectedRange\n ) {\n return;\n }\n\n // First clear existing selections, maybe we\n // can cache this to better avoid this query?\n const allSelected = this.pre.querySelectorAll('[data-selected-line]');\n for (const element of allSelected) {\n element.removeAttribute('data-selected-line');\n }\n\n this.renderedSelectionRange = this.selectedRange;\n if (this.selectedRange == null) {\n return;\n }\n\n const { children: codeElements } = this.pre;\n if (codeElements.length === 0) return;\n if (codeElements.length > 2) {\n console.error(codeElements);\n throw new Error(\n 'LineSelectionManager.applySelectionToDOM: Somehow there are more than 2 code elements...'\n );\n }\n const split = this.pre.getAttribute('data-diff-type') === 'split';\n const rowRange = this.getIndexesFromSelection(this.selectedRange, split);\n if (rowRange == null) {\n console.error({ rowRange, selectedRange: this.selectedRange });\n throw new Error(\n 'LineSelectionManager.renderSelection: No valid rowRange'\n );\n }\n const isSingle = rowRange.start === rowRange.end;\n const first = Math.min(rowRange.start, rowRange.end);\n const last = Math.max(rowRange.start, rowRange.end);\n for (const code of codeElements) {\n const [gutter, content] = code.children;\n const len = content.children.length;\n if (len !== gutter.children.length) {\n throw new Error(\n 'LineSelectionManager.renderSelection: gutter and content children dont match, something is wrong'\n );\n }\n for (let i = 0; i < len; i++) {\n const contentElement = content.children[i];\n const gutterElement = gutter.children[i];\n if (\n !(contentElement instanceof HTMLElement) ||\n !(gutterElement instanceof HTMLElement)\n ) {\n continue;\n }\n\n const lineIndex = this.parseLineIndex(contentElement, split);\n if ((lineIndex ?? 0) > last) break;\n if (lineIndex == null || lineIndex < first) continue;\n let attributeValue = isSingle\n ? 'single'\n : lineIndex === first\n ? 'first'\n : lineIndex === last\n ? 'last'\n : '';\n contentElement.setAttribute('data-selected-line', attributeValue);\n gutterElement.setAttribute('data-selected-line', attributeValue);\n // If we have a line annotation following our selected line, we should\n // mark it as selected as well\n if (\n gutterElement.nextSibling instanceof HTMLElement &&\n contentElement.nextSibling instanceof HTMLElement &&\n contentElement.nextSibling.hasAttribute('data-line-annotation')\n ) {\n // Depending on the line's attribute value, lets go ahead and correct\n // it when adding in the annotation row\n if (isSingle) {\n // Single technically becomes 2 selected lines\n attributeValue = 'last';\n contentElement.setAttribute('data-selected-line', 'first');\n } else if (lineIndex === first) {\n // We don't want apply 'first' to the line annotation\n attributeValue = '';\n } else if (lineIndex === last) {\n // the annotation will become the last selected line and therefore\n // our existing line should no longer be last\n contentElement.setAttribute('data-selected-line', '');\n }\n contentElement.nextSibling.setAttribute(\n 'data-selected-line',\n attributeValue\n );\n gutterElement.nextSibling.setAttribute(\n 'data-selected-line',\n attributeValue\n );\n }\n }\n }\n };\n\n private notifySelectionChange(): void {\n const { onLineSelected } = this.options;\n if (onLineSelected == null) return;\n\n onLineSelected(this.selectedRange ?? null);\n }\n\n private notifySelectionStart(range: SelectedLineRange | null): void {\n const { onLineSelectionStart } = this.options;\n if (onLineSelectionStart == null) return;\n onLineSelectionStart(range);\n }\n\n private notifySelectionEnd(range: SelectedLineRange | null): void {\n const { onLineSelectionEnd } = this.options;\n if (onLineSelectionEnd == null) return;\n onLineSelectionEnd(range);\n }\n\n private getMouseEventDataForPath(\n path: (EventTarget | undefined)[],\n eventType: 'click' | 'move'\n ): MouseInfo | undefined {\n if (this.pre == null) {\n return undefined;\n }\n let lineNumber: number | undefined;\n let lineIndex: number | undefined;\n let isNumberColumn = false;\n let eventSide: SelectionSide | undefined;\n for (const element of path) {\n if (lineNumber != null && lineIndex != null && eventSide != null) {\n break;\n }\n if (!(element instanceof HTMLElement)) {\n continue;\n }\n\n if (element.hasAttribute('data-line-index')) {\n isNumberColumn = element.hasAttribute('data-column-number');\n lineNumber = this.getLineNumber(element);\n lineIndex = this.parseLineIndex(\n element,\n this.pre.getAttribute('data-diff-type') === 'split'\n );\n const lineType = element.getAttribute('data-line-type');\n if (lineType === 'change-deletion') {\n eventSide = 'deletions';\n } else if (lineType === 'change-additions') {\n eventSide = 'additions';\n }\n continue;\n }\n\n if (eventSide == null && element.hasAttribute('data-code')) {\n eventSide = element.hasAttribute('data-deletions')\n ? 'deletions'\n : element.hasAttribute('data-additions')\n ? 'additions'\n : undefined;\n break;\n }\n }\n\n if (\n (eventType === 'click' && !isNumberColumn) ||\n lineIndex == null ||\n lineNumber == null\n ) {\n return undefined;\n }\n return {\n lineIndex,\n lineNumber,\n // Default side to 'additions' if we were unable to get a side,\n // otherwise later on we risk the side getting inverted in future if the\n // selection expands into a 'deletions' side\n eventSide: eventSide ?? 'additions',\n };\n }\n\n private getLineNumber(element: HTMLElement): number | undefined {\n const lineNumber = parseInt(\n element.getAttribute('data-column-number') ??\n element.getAttribute('data-line') ??\n '',\n 10\n );\n return !Number.isNaN(lineNumber) ? lineNumber : undefined;\n }\n\n private parseLineIndex(\n element: HTMLElement,\n split: boolean\n ): number | undefined {\n const lineIndexes = (element.getAttribute('data-line-index') ?? '')\n .split(',')\n .map((value) => parseInt(value))\n .filter((value) => !Number.isNaN(value));\n\n if (split && lineIndexes.length === 2) {\n return lineIndexes[1];\n } else if (!split) {\n return lineIndexes[0];\n }\n return undefined;\n }\n}\n\nexport function pluckLineSelectionOptions(\n {\n enableLineSelection,\n onLineSelected,\n onLineSelectionStart,\n onLineSelectionEnd,\n }: LineSelectionOptions,\n getLineIndex?: GetLineIndexUtility\n): LineSelectionOptions {\n return {\n enableLineSelection,\n onLineSelected,\n onLineSelectionStart,\n onLineSelectionEnd,\n getLineIndex,\n };\n}\n"],"mappings":"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"}
@@ -1,8 +1,8 @@
1
1
  import { AnnotationSide, DiffLineEventBaseProps, ExpansionDirections, LineEventBaseProps } from "../types.js";
2
2
 
3
3
  //#region src/managers/MouseEventManager.d.ts
4
- type LogTypes = "click" | "move" | "both" | "none";
5
- type MouseEventManagerMode = "file" | "diff";
4
+ type LogTypes = 'click' | 'move' | 'both' | 'none';
5
+ type MouseEventManagerMode = 'file' | 'diff';
6
6
  interface OnLineClickProps extends LineEventBaseProps {
7
7
  event: PointerEvent;
8
8
  }
@@ -15,15 +15,16 @@ interface OnDiffLineClickProps extends DiffLineEventBaseProps {
15
15
  interface OnDiffLineEnterLeaveProps extends DiffLineEventBaseProps {
16
16
  event: PointerEvent;
17
17
  }
18
- type EventClickProps<TMode extends MouseEventManagerMode> = TMode extends "file" ? OnLineClickProps : OnDiffLineClickProps;
19
- type MouseEventEnterLeaveProps<TMode extends MouseEventManagerMode> = TMode extends "file" ? OnLineEnterLeaveProps : OnDiffLineEnterLeaveProps;
20
- type GetHoveredLineResult<TMode extends MouseEventManagerMode> = TMode extends "file" ? {
18
+ type EventClickProps<TMode extends MouseEventManagerMode> = TMode extends 'file' ? OnLineClickProps : OnDiffLineClickProps;
19
+ type MouseEventEnterLeaveProps<TMode extends MouseEventManagerMode> = TMode extends 'file' ? OnLineEnterLeaveProps : OnDiffLineEnterLeaveProps;
20
+ type GetHoveredLineResult<TMode extends MouseEventManagerMode> = TMode extends 'file' ? {
21
21
  lineNumber: number;
22
22
  } : {
23
23
  lineNumber: number;
24
24
  side: AnnotationSide;
25
25
  };
26
26
  interface MouseEventManagerBaseOptions<TMode extends MouseEventManagerMode> {
27
+ lineHoverHighlight?: 'disabled' | 'both' | 'number' | 'line';
27
28
  enableHoverUtility?: boolean;
28
29
  onLineClick?(props: EventClickProps<TMode>): unknown;
29
30
  onLineNumberClick?(props: EventClickProps<TMode>): unknown;
@@ -40,18 +41,24 @@ declare class MouseEventManager<TMode extends MouseEventManagerMode> {
40
41
  private hoveredLine;
41
42
  private pre;
42
43
  private hoverSlot;
44
+ private interactiveLinesAttr;
45
+ private interactiveLineNumbersAttr;
46
+ private hasEventListeners;
43
47
  constructor(mode: TMode, options: MouseEventManagerOptions<TMode>);
44
48
  setOptions(options: MouseEventManagerOptions<TMode>): void;
45
49
  cleanUp(): void;
46
50
  setup(pre: HTMLPreElement): void;
47
51
  getHoveredLine: () => GetHoveredLineResult<TMode> | undefined;
48
- handleMouseClick: (event: PointerEvent) => void;
52
+ handleMouseClick: (event: MouseEvent) => void;
49
53
  handleMouseMove: (event: PointerEvent) => void;
50
54
  handleMouseLeave: (event: PointerEvent) => void;
51
55
  private handleMouseEvent;
56
+ private clearHoveredLine;
57
+ private setHoveredLine;
52
58
  private getLineData;
53
59
  }
54
60
  declare function pluckMouseEventOptions<TMode extends MouseEventManagerMode>({
61
+ lineHoverHighlight,
55
62
  onLineClick,
56
63
  onLineNumberClick,
57
64
  onLineEnter,
@@ -1 +1 @@
1
- {"version":3,"file":"MouseEventManager.d.ts","names":["mode: TMode","options: MouseEventManagerOptions<TMode>"],"sources":["../../src/managers/MouseEventManager.ts"],"sourcesContent":[],"mappings":";;;KAOY,QAAA;KAEA,qBAAA;AAFA,UAIK,gBAAA,SAAyB,kBAJ9B,CAAA;EAEZ,KAAY,EAGH,YAHG;AAEZ;AAIiB,UAAA,qBAAA,SAA8B,kBAAA,CAAA;EAI/C,KAAiB,EAHR,YAGQ;AAIjB;AAQK,UAZY,oBAAA,SAA6B,sBAYzC,CAAA;EAA8B,KAAA,EAX1B,YAW0B;;AAC/B,UATa,yBAAA,SAAkC,sBAS/C,CAAA;EACA,KAAA,EATK,YASL;;AAAA,KAFC,eAIA,CAAA,cAJ8B,qBAI9B,CAAA,GAJuD,KAIvD,SAAA,MAAA,GAHD,gBAGC,GAFD,oBAEC;KAAA,yBAAwC,CAAA,cAAA,qBAAA,CAAA,GAC3C,KAD2C,SAAA,MAAA,GACpB,qBADoB,GACI,yBADJ;AAC3C,KAYU,oBAZV,CAAA,cAY6C,qBAZ7C,CAAA,GAaA,KAbA,SAAA,MAAA,GAAA;EAAuB,UAAA,EAAA,MAAA;CAAwB,GAAA;EAAA,UAAA,EAAA,MAAA;EAYjD,IAAY,EAGsB,cAHtB;CAAmC;AAC7C,UAmCe,4BAnCf,CAAA,cAoCc,qBApCd,CAAA,CAAA;EAEgC,kBAAA,CAAA,EAAA,OAAA;EAAA,WAAA,EAAA,KAAA,EAqCZ,eArCY,CAqCI,KArCJ,CAAA,CAAA,EAAA,OAAA;EAiClC,iBAAiB,EAAA,KAAA,EAKW,eALX,CAK2B,KAL3B,CAAA,CAAA,EAAA,OAAA;EACD,WAAA,EAAA,KAAA,EAKM,yBALN,CAKgC,KALhC,CAAA,CAAA,EAAA,OAAA;EAGsB,WAAA,EAAA,KAAA,EAGhB,yBAHgB,CAGU,KAHV,CAAA,CAAA,EAAA,OAAA;EAAhB,kBAAA,CAAA,EAIC,QAJD;;AACM,UAMX,wBANW,CAAA,cAM4B,qBAN5B,CAAA,SAOlB,4BAPkB,CAOW,KAPX,CAAA,CAAA;EACoB,YAAA,EAAA,SAAA,EAAA,MAAA,EAAA,SAAA,EAOF,mBAPE,CAAA,EAAA,OAAA;;AACA,cASnC,iBATmC,CAAA,cASH,qBATG,CAAA,CAAA;EAA1B,QAAA,IAAA;EACC,QAAA,OAAA;EAAA,QAAA,WAAA;EAGvB,QAAiB,GAAA;EAAuC,QAAA,SAAA;EACjB,WAAA,CAAA,IAAA,EAUrB,KAVqB,EAAA,OAAA,EAWlB,wBAXkB,CAWO,KAXP,CAAA;EACO,UAAA,CAAA,OAAA,EAaxB,wBAbwB,CAaC,KAbD,CAAA,CAAA,EAAA,IAAA;EADpC,OAAA,CAAA,CAAA,EAAA,IAAA;EAAA,KAAA,CAAA,GAAA,EA2BG,cA3BH,CAAA,EAAA,IAAA;EAIV,cAAa,EAAA,GAAA,GAgGU,oBAhGV,CAgG+B,KAhG/B,CAAA,GAAA,SAAA;EAAgC,gBAAA,EAAA,CAAA,KAAA,EAiHhB,YAjHgB,EAAA,GAAA,IAAA;EAM3B,eAAA,EAAA,CAAA,KAAA,EAqHU,YArHV,EAAA,GAAA,IAAA;EAC4B,gBAAA,EAAA,CAAA,KAAA,EA8HjB,YA9HiB,EAAA,GAAA,IAAA;EAAzB,QAAA,gBAAA;EAG0B,QAAA,WAAA;;AAalC,iBAsWG,sBAtWH,CAAA,cAsWwC,qBAtWxC,CAAA,CAAA;EAAA,WAAA;EAAA,iBAAA;EAAA,WAAA;EAAA,WAAA;EAAA,kBAAA;EAAA;AAAA,CAAA,EA8WR,4BA9WQ,CA8WqB,KA9WrB,CAAA,EAAA,YAAA,CAAA,EAAA,CAAA,SAAA,EAAA,MAAA,EAAA,SAAA,EA+WmC,mBA/WnC,EAAA,GAAA,OAAA,CAAA,EAgXV,wBAhXU,CAgXe,KAhXf,CAAA"}
1
+ {"version":3,"file":"MouseEventManager.d.ts","names":["AnnotationSide","DiffLineEventBaseProps","ExpansionDirections","LineEventBaseProps","LogTypes","MouseEventManagerMode","OnLineClickProps","PointerEvent","OnLineEnterLeaveProps","OnDiffLineClickProps","OnDiffLineEnterLeaveProps","EventClickProps","TMode","MouseEventEnterLeaveProps","GetHoveredLineResult","MouseEventManagerBaseOptions","MouseEventManagerOptions","MouseEventManager","HTMLPreElement","MouseEvent","pluckMouseEventOptions","lineHoverHighlight","onLineClick","onLineNumberClick","onLineEnter","onLineLeave","enableHoverUtility","__debugMouseEvents"],"sources":["../../src/managers/MouseEventManager.d.ts"],"sourcesContent":["import type { AnnotationSide, DiffLineEventBaseProps, ExpansionDirections, LineEventBaseProps } from '../types';\nexport type LogTypes = 'click' | 'move' | 'both' | 'none';\nexport type MouseEventManagerMode = 'file' | 'diff';\nexport interface OnLineClickProps extends LineEventBaseProps {\n event: PointerEvent;\n}\nexport interface OnLineEnterLeaveProps extends LineEventBaseProps {\n event: PointerEvent;\n}\nexport interface OnDiffLineClickProps extends DiffLineEventBaseProps {\n event: PointerEvent;\n}\nexport interface OnDiffLineEnterLeaveProps extends DiffLineEventBaseProps {\n event: PointerEvent;\n}\ntype EventClickProps<TMode extends MouseEventManagerMode> = TMode extends 'file' ? OnLineClickProps : OnDiffLineClickProps;\ntype MouseEventEnterLeaveProps<TMode extends MouseEventManagerMode> = TMode extends 'file' ? OnLineEnterLeaveProps : OnDiffLineEnterLeaveProps;\nexport type GetHoveredLineResult<TMode extends MouseEventManagerMode> = TMode extends 'file' ? {\n lineNumber: number;\n} : {\n lineNumber: number;\n side: AnnotationSide;\n};\nexport interface MouseEventManagerBaseOptions<TMode extends MouseEventManagerMode> {\n lineHoverHighlight?: 'disabled' | 'both' | 'number' | 'line';\n enableHoverUtility?: boolean;\n onLineClick?(props: EventClickProps<TMode>): unknown;\n onLineNumberClick?(props: EventClickProps<TMode>): unknown;\n onLineEnter?(props: MouseEventEnterLeaveProps<TMode>): unknown;\n onLineLeave?(props: MouseEventEnterLeaveProps<TMode>): unknown;\n __debugMouseEvents?: LogTypes;\n}\nexport interface MouseEventManagerOptions<TMode extends MouseEventManagerMode> extends MouseEventManagerBaseOptions<TMode> {\n onHunkExpand?(hunkIndex: number, direction: ExpansionDirections): unknown;\n}\nexport declare class MouseEventManager<TMode extends MouseEventManagerMode> {\n private mode;\n private options;\n private hoveredLine;\n private pre;\n private hoverSlot;\n private interactiveLinesAttr;\n private interactiveLineNumbersAttr;\n private hasEventListeners;\n constructor(mode: TMode, options: MouseEventManagerOptions<TMode>);\n setOptions(options: MouseEventManagerOptions<TMode>): void;\n cleanUp(): void;\n setup(pre: HTMLPreElement): void;\n getHoveredLine: () => GetHoveredLineResult<TMode> | undefined;\n handleMouseClick: (event: MouseEvent) => void;\n handleMouseMove: (event: PointerEvent) => void;\n handleMouseLeave: (event: PointerEvent) => void;\n private handleMouseEvent;\n private clearHoveredLine;\n private setHoveredLine;\n private getLineData;\n}\nexport declare function pluckMouseEventOptions<TMode extends MouseEventManagerMode>({ lineHoverHighlight, onLineClick, onLineNumberClick, onLineEnter, onLineLeave, enableHoverUtility, __debugMouseEvents }: MouseEventManagerBaseOptions<TMode>, onHunkExpand?: (hunkIndex: number, direction: ExpansionDirections) => unknown): MouseEventManagerOptions<TMode>;\nexport {};\n//# sourceMappingURL=MouseEventManager.d.ts.map"],"mappings":"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"}