@pierre/diffs 1.1.0-beta.8 → 1.1.0

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 (217) hide show
  1. package/README.md +7 -18
  2. package/dist/components/AdvancedVirtualizedFileDiff.js +2 -7
  3. package/dist/components/AdvancedVirtualizedFileDiff.js.map +1 -1
  4. package/dist/components/AdvancedVirtualizer.js +1 -1
  5. package/dist/components/AdvancedVirtualizer.js.map +1 -1
  6. package/dist/components/File.d.ts +17 -7
  7. package/dist/components/File.d.ts.map +1 -1
  8. package/dist/components/File.js +111 -54
  9. package/dist/components/File.js.map +1 -1
  10. package/dist/components/FileDiff.d.ts +32 -14
  11. package/dist/components/FileDiff.d.ts.map +1 -1
  12. package/dist/components/FileDiff.js +156 -81
  13. package/dist/components/FileDiff.js.map +1 -1
  14. package/dist/components/UnresolvedFile.d.ts +60 -0
  15. package/dist/components/UnresolvedFile.d.ts.map +1 -0
  16. package/dist/components/UnresolvedFile.js +280 -0
  17. package/dist/components/UnresolvedFile.js.map +1 -0
  18. package/dist/components/VirtualizedFile.js +8 -5
  19. package/dist/components/VirtualizedFile.js.map +1 -1
  20. package/dist/components/VirtualizedFileDiff.d.ts +1 -1
  21. package/dist/components/VirtualizedFileDiff.d.ts.map +1 -1
  22. package/dist/components/VirtualizedFileDiff.js +15 -11
  23. package/dist/components/VirtualizedFileDiff.js.map +1 -1
  24. package/dist/components/Virtualizer.d.ts +3 -1
  25. package/dist/components/Virtualizer.d.ts.map +1 -1
  26. package/dist/components/Virtualizer.js +50 -24
  27. package/dist/components/Virtualizer.js.map +1 -1
  28. package/dist/constants.d.ts +3 -1
  29. package/dist/constants.d.ts.map +1 -1
  30. package/dist/constants.js +8 -1
  31. package/dist/constants.js.map +1 -1
  32. package/dist/highlighter/shared_highlighter.d.ts +4 -2
  33. package/dist/highlighter/shared_highlighter.d.ts.map +1 -1
  34. package/dist/highlighter/shared_highlighter.js +15 -7
  35. package/dist/highlighter/shared_highlighter.js.map +1 -1
  36. package/dist/index.d.ts +9 -7
  37. package/dist/index.js +8 -6
  38. package/dist/managers/InteractionManager.d.ts +146 -0
  39. package/dist/managers/InteractionManager.d.ts.map +1 -0
  40. package/dist/managers/InteractionManager.js +813 -0
  41. package/dist/managers/InteractionManager.js.map +1 -0
  42. package/dist/managers/ResizeManager.d.ts +0 -2
  43. package/dist/managers/ResizeManager.d.ts.map +1 -1
  44. package/dist/managers/ResizeManager.js +43 -32
  45. package/dist/managers/ResizeManager.js.map +1 -1
  46. package/dist/react/File.d.ts +2 -0
  47. package/dist/react/File.d.ts.map +1 -1
  48. package/dist/react/File.js +3 -1
  49. package/dist/react/File.js.map +1 -1
  50. package/dist/react/FileDiff.d.ts +2 -0
  51. package/dist/react/FileDiff.d.ts.map +1 -1
  52. package/dist/react/FileDiff.js +3 -1
  53. package/dist/react/FileDiff.js.map +1 -1
  54. package/dist/react/MultiFileDiff.d.ts +2 -0
  55. package/dist/react/MultiFileDiff.d.ts.map +1 -1
  56. package/dist/react/MultiFileDiff.js +3 -1
  57. package/dist/react/MultiFileDiff.js.map +1 -1
  58. package/dist/react/PatchDiff.d.ts +2 -0
  59. package/dist/react/PatchDiff.d.ts.map +1 -1
  60. package/dist/react/PatchDiff.js +3 -1
  61. package/dist/react/PatchDiff.js.map +1 -1
  62. package/dist/react/UnresolvedFile.d.ts +36 -0
  63. package/dist/react/UnresolvedFile.d.ts.map +1 -0
  64. package/dist/react/UnresolvedFile.js +42 -0
  65. package/dist/react/UnresolvedFile.js.map +1 -0
  66. package/dist/react/constants.d.ts +3 -2
  67. package/dist/react/constants.d.ts.map +1 -1
  68. package/dist/react/constants.js +3 -2
  69. package/dist/react/constants.js.map +1 -1
  70. package/dist/react/index.d.ts +4 -3
  71. package/dist/react/index.js +3 -2
  72. package/dist/react/types.d.ts +11 -2
  73. package/dist/react/types.d.ts.map +1 -1
  74. package/dist/react/utils/renderDiffChildren.d.ts +16 -5
  75. package/dist/react/utils/renderDiffChildren.d.ts.map +1 -1
  76. package/dist/react/utils/renderDiffChildren.js +34 -7
  77. package/dist/react/utils/renderDiffChildren.js.map +1 -1
  78. package/dist/react/utils/renderFileChildren.d.ts +5 -1
  79. package/dist/react/utils/renderFileChildren.d.ts.map +1 -1
  80. package/dist/react/utils/renderFileChildren.js +13 -7
  81. package/dist/react/utils/renderFileChildren.js.map +1 -1
  82. package/dist/react/utils/useFileDiffInstance.d.ts +1 -2
  83. package/dist/react/utils/useFileDiffInstance.d.ts.map +1 -1
  84. package/dist/react/utils/useFileDiffInstance.js +2 -2
  85. package/dist/react/utils/useFileDiffInstance.js.map +1 -1
  86. package/dist/react/utils/useFileInstance.d.ts +1 -2
  87. package/dist/react/utils/useFileInstance.d.ts.map +1 -1
  88. package/dist/react/utils/useFileInstance.js.map +1 -1
  89. package/dist/react/utils/useUnresolvedFileInstance.d.ts +33 -0
  90. package/dist/react/utils/useUnresolvedFileInstance.d.ts.map +1 -0
  91. package/dist/react/utils/useUnresolvedFileInstance.js +87 -0
  92. package/dist/react/utils/useUnresolvedFileInstance.js.map +1 -0
  93. package/dist/renderers/DiffHunksRenderer.d.ts +50 -6
  94. package/dist/renderers/DiffHunksRenderer.d.ts.map +1 -1
  95. package/dist/renderers/DiffHunksRenderer.js +146 -45
  96. package/dist/renderers/DiffHunksRenderer.js.map +1 -1
  97. package/dist/renderers/FileRenderer.js +1 -1
  98. package/dist/renderers/UnresolvedFileHunksRenderer.d.ts +46 -0
  99. package/dist/renderers/UnresolvedFileHunksRenderer.d.ts.map +1 -0
  100. package/dist/renderers/UnresolvedFileHunksRenderer.js +207 -0
  101. package/dist/renderers/UnresolvedFileHunksRenderer.js.map +1 -0
  102. package/dist/shiki-stream/stream.d.ts +1 -1
  103. package/dist/shiki-stream/stream.d.ts.map +1 -1
  104. package/dist/shiki-stream/stream.js.map +1 -1
  105. package/dist/shiki-stream/tokenizer.d.ts +1 -1
  106. package/dist/shiki-stream/tokenizer.d.ts.map +1 -1
  107. package/dist/shiki-stream/tokenizer.js.map +1 -1
  108. package/dist/shiki-stream/types.d.ts +1 -1
  109. package/dist/shiki-stream/types.d.ts.map +1 -1
  110. package/dist/sprite.d.ts +2 -2
  111. package/dist/sprite.d.ts.map +1 -1
  112. package/dist/sprite.js +3 -0
  113. package/dist/sprite.js.map +1 -1
  114. package/dist/ssr/index.d.ts +3 -3
  115. package/dist/ssr/index.js +2 -2
  116. package/dist/ssr/preloadDiffs.d.ts +23 -14
  117. package/dist/ssr/preloadDiffs.d.ts.map +1 -1
  118. package/dist/ssr/preloadDiffs.js +40 -14
  119. package/dist/ssr/preloadDiffs.js.map +1 -1
  120. package/dist/style.js +1 -1
  121. package/dist/style.js.map +1 -1
  122. package/dist/types.d.ts +29 -2
  123. package/dist/types.d.ts.map +1 -1
  124. package/dist/utils/areMergeConflictActionsEqual.d.ts +7 -0
  125. package/dist/utils/areMergeConflictActionsEqual.d.ts.map +1 -0
  126. package/dist/utils/areMergeConflictActionsEqual.js +11 -0
  127. package/dist/utils/areMergeConflictActionsEqual.js.map +1 -0
  128. package/dist/utils/arePrePropertiesEqual.js +10 -1
  129. package/dist/utils/arePrePropertiesEqual.js.map +1 -1
  130. package/dist/utils/areSelectionPointsEqual.d.ts +7 -0
  131. package/dist/utils/areSelectionPointsEqual.d.ts.map +1 -0
  132. package/dist/utils/areSelectionPointsEqual.js +8 -0
  133. package/dist/utils/areSelectionPointsEqual.js.map +1 -0
  134. package/dist/utils/areSelectionsEqual.d.ts +1 -1
  135. package/dist/utils/areSelectionsEqual.d.ts.map +1 -1
  136. package/dist/utils/areSelectionsEqual.js.map +1 -1
  137. package/dist/utils/createFileHeaderElement.js +5 -2
  138. package/dist/utils/createFileHeaderElement.js.map +1 -1
  139. package/dist/utils/createGutterUtilityContentNode.d.ts +5 -0
  140. package/dist/utils/createGutterUtilityContentNode.d.ts.map +1 -0
  141. package/dist/utils/createGutterUtilityContentNode.js +15 -0
  142. package/dist/utils/createGutterUtilityContentNode.js.map +1 -0
  143. package/dist/utils/createGutterUtilityElement.d.ts +7 -0
  144. package/dist/utils/createGutterUtilityElement.d.ts.map +1 -0
  145. package/dist/utils/createGutterUtilityElement.js +20 -0
  146. package/dist/utils/createGutterUtilityElement.js.map +1 -0
  147. package/dist/utils/createPreElement.d.ts +2 -1
  148. package/dist/utils/createPreElement.d.ts.map +1 -1
  149. package/dist/utils/createPreElement.js +2 -1
  150. package/dist/utils/createPreElement.js.map +1 -1
  151. package/dist/utils/createSeparator.js +1 -1
  152. package/dist/utils/createSeparator.js.map +1 -1
  153. package/dist/utils/createWindowFromScrollPosition.js +12 -11
  154. package/dist/utils/createWindowFromScrollPosition.js.map +1 -1
  155. package/dist/utils/getHighlighterOptions.d.ts +7 -2
  156. package/dist/utils/getHighlighterOptions.d.ts.map +1 -1
  157. package/dist/utils/getHighlighterOptions.js +3 -2
  158. package/dist/utils/getHighlighterOptions.js.map +1 -1
  159. package/dist/utils/getMergeConflictActionSlotName.d.ts +16 -0
  160. package/dist/utils/getMergeConflictActionSlotName.d.ts.map +1 -0
  161. package/dist/utils/getMergeConflictActionSlotName.js +8 -0
  162. package/dist/utils/getMergeConflictActionSlotName.js.map +1 -0
  163. package/dist/utils/getMergeConflictLineTypes.d.ts +15 -0
  164. package/dist/utils/getMergeConflictLineTypes.d.ts.map +1 -0
  165. package/dist/utils/getMergeConflictLineTypes.js +81 -0
  166. package/dist/utils/getMergeConflictLineTypes.js.map +1 -0
  167. package/dist/utils/getOrCreateCodeNode.d.ts +3 -1
  168. package/dist/utils/getOrCreateCodeNode.d.ts.map +1 -1
  169. package/dist/utils/getOrCreateCodeNode.js +5 -3
  170. package/dist/utils/getOrCreateCodeNode.js.map +1 -1
  171. package/dist/utils/hast_utils.d.ts +2 -2
  172. package/dist/utils/hast_utils.d.ts.map +1 -1
  173. package/dist/utils/hast_utils.js +3 -2
  174. package/dist/utils/hast_utils.js.map +1 -1
  175. package/dist/utils/parseMergeConflictDiffFromFile.d.ts +26 -0
  176. package/dist/utils/parseMergeConflictDiffFromFile.d.ts.map +1 -0
  177. package/dist/utils/parseMergeConflictDiffFromFile.js +143 -0
  178. package/dist/utils/parseMergeConflictDiffFromFile.js.map +1 -0
  179. package/dist/utils/resolveMergeConflict.d.ts +7 -0
  180. package/dist/utils/resolveMergeConflict.d.ts.map +1 -0
  181. package/dist/utils/resolveMergeConflict.js +30 -0
  182. package/dist/utils/resolveMergeConflict.js.map +1 -0
  183. package/dist/utils/resolveVirtualFileMetrics.js +1 -0
  184. package/dist/utils/resolveVirtualFileMetrics.js.map +1 -1
  185. package/dist/utils/setWrapperNodeProps.d.ts +2 -1
  186. package/dist/utils/setWrapperNodeProps.d.ts.map +1 -1
  187. package/dist/utils/setWrapperNodeProps.js +5 -1
  188. package/dist/utils/setWrapperNodeProps.js.map +1 -1
  189. package/dist/worker/WorkerPoolManager.d.ts +4 -2
  190. package/dist/worker/WorkerPoolManager.d.ts.map +1 -1
  191. package/dist/worker/WorkerPoolManager.js +16 -9
  192. package/dist/worker/WorkerPoolManager.js.map +1 -1
  193. package/dist/worker/types.d.ts +3 -1
  194. package/dist/worker/types.d.ts.map +1 -1
  195. package/dist/worker/wasm-BlUZCxHM.js +10 -0
  196. package/dist/worker/wasm-BlUZCxHM.js.map +1 -0
  197. package/dist/worker/worker-portable.js +10546 -10106
  198. package/dist/worker/worker-portable.js.map +1 -1
  199. package/dist/worker/worker.js +27 -19
  200. package/dist/worker/worker.js.map +1 -1
  201. package/package.json +3 -7
  202. package/dist/managers/LineSelectionManager.d.ts +0 -64
  203. package/dist/managers/LineSelectionManager.d.ts.map +0 -1
  204. package/dist/managers/LineSelectionManager.js +0 -270
  205. package/dist/managers/LineSelectionManager.js.map +0 -1
  206. package/dist/managers/MouseEventManager.d.ts +0 -71
  207. package/dist/managers/MouseEventManager.d.ts.map +0 -1
  208. package/dist/managers/MouseEventManager.js +0 -358
  209. package/dist/managers/MouseEventManager.js.map +0 -1
  210. package/dist/themes/pierre-dark.js +0 -1328
  211. package/dist/themes/pierre-dark.js.map +0 -1
  212. package/dist/themes/pierre-light.js +0 -1328
  213. package/dist/themes/pierre-light.js.map +0 -1
  214. package/dist/utils/createHoverContentNode.d.ts +0 -5
  215. package/dist/utils/createHoverContentNode.d.ts.map +0 -1
  216. package/dist/utils/createHoverContentNode.js +0 -15
  217. package/dist/utils/createHoverContentNode.js.map +0 -1
@@ -1,64 +0,0 @@
1
- import { SelectionSide } from "../types.js";
2
-
3
- //#region src/managers/LineSelectionManager.d.ts
4
- interface SelectedLineRange {
5
- start: number;
6
- side?: SelectionSide;
7
- end: number;
8
- endSide?: SelectionSide;
9
- }
10
- type GetLineIndexUtility = (lineNumber: number, side?: SelectionSide) => [number, number] | undefined;
11
- interface LineSelectionOptions {
12
- enableLineSelection?: boolean;
13
- onLineSelected?: (range: SelectedLineRange | null) => void;
14
- onLineSelectionStart?: (range: SelectedLineRange | null) => void;
15
- onLineSelectionEnd?: (range: SelectedLineRange | null) => void;
16
- getLineIndex?: GetLineIndexUtility;
17
- }
18
- /**
19
- * Manages line selection state and interactions for code/diff viewers.
20
- * Handles:
21
- * - Click and drag selection
22
- * - Shift-click to extend selection
23
- * - DOM attribute updates (data-selected-line)
24
- */
25
- declare class LineSelectionManager {
26
- private options;
27
- private pre;
28
- private selectedRange;
29
- private renderedSelectionRange;
30
- private anchor;
31
- private _queuedRender;
32
- constructor(options?: LineSelectionOptions);
33
- setOptions(options: LineSelectionOptions): void;
34
- cleanUp(): void;
35
- setup(pre: HTMLPreElement): void;
36
- setDirty(): void;
37
- isDirty(): boolean;
38
- setSelection(range: SelectedLineRange | null): void;
39
- getSelection(): SelectedLineRange | null;
40
- getLineIndex(lineNumber: number, side?: SelectionSide): [number, number] | undefined;
41
- private attachEventListeners;
42
- private removeEventListeners;
43
- private handleMouseDown;
44
- private handleMouseMove;
45
- private handleMouseUp;
46
- private updateSelection;
47
- private getIndexesFromSelection;
48
- private renderSelection;
49
- private notifySelectionChange;
50
- private notifySelectionStart;
51
- private notifySelectionEnd;
52
- private getMouseEventDataForPath;
53
- private getLineNumber;
54
- private parseLineIndex;
55
- }
56
- declare function pluckLineSelectionOptions({
57
- enableLineSelection,
58
- onLineSelected,
59
- onLineSelectionStart,
60
- onLineSelectionEnd
61
- }: LineSelectionOptions, getLineIndex?: GetLineIndexUtility): LineSelectionOptions;
62
- //#endregion
63
- export { GetLineIndexUtility, LineSelectionManager, LineSelectionOptions, SelectedLineRange, pluckLineSelectionOptions };
64
- //# sourceMappingURL=LineSelectionManager.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"LineSelectionManager.d.ts","names":["SelectionSide","SelectedLineRange","GetLineIndexUtility","LineSelectionOptions","LineSelectionManager","HTMLPreElement","pluckLineSelectionOptions","enableLineSelection","onLineSelected","onLineSelectionStart","onLineSelectionEnd"],"sources":["../../src/managers/LineSelectionManager.d.ts"],"sourcesContent":["import type { SelectionSide } from '../types';\nexport interface SelectedLineRange {\n start: number;\n side?: SelectionSide;\n end: number;\n endSide?: SelectionSide;\n}\nexport type GetLineIndexUtility = (lineNumber: number, side?: SelectionSide) => [number, number] | undefined;\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/**\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 declare class LineSelectionManager {\n private options;\n private pre;\n private selectedRange;\n private renderedSelectionRange;\n private anchor;\n private _queuedRender;\n constructor(options?: LineSelectionOptions);\n setOptions(options: LineSelectionOptions): void;\n cleanUp(): void;\n setup(pre: HTMLPreElement): void;\n setDirty(): void;\n isDirty(): boolean;\n setSelection(range: SelectedLineRange | null): void;\n getSelection(): SelectedLineRange | null;\n getLineIndex(lineNumber: number, side?: SelectionSide): [number, number] | undefined;\n private attachEventListeners;\n private removeEventListeners;\n private handleMouseDown;\n private handleMouseMove;\n private handleMouseUp;\n private updateSelection;\n private getIndexesFromSelection;\n private renderSelection;\n private notifySelectionChange;\n private notifySelectionStart;\n private notifySelectionEnd;\n private getMouseEventDataForPath;\n private getLineNumber;\n private parseLineIndex;\n}\nexport declare function pluckLineSelectionOptions({ enableLineSelection, onLineSelected, onLineSelectionStart, onLineSelectionEnd }: LineSelectionOptions, getLineIndex?: GetLineIndexUtility): LineSelectionOptions;\n//# sourceMappingURL=LineSelectionManager.d.ts.map"],"mappings":";;;UACiBC,iBAAAA;;EAAAA,IAAAA,CAAAA,EAEND,aAFuB;EAMtBE,GAAAA,EAAAA,MAAAA;EACKC,OAAAA,CAAAA,EAHHH,aAGuB;;AAGFC,KAJvBC,mBAAAA,GAIuBD,CAAAA,UAAAA,EAAAA,MAAAA,EAAAA,IAAAA,CAAAA,EAJ2BD,aAI3BC,EAAAA,GAAAA,CAAAA,MAAAA,EAAAA,MAAAA,CAAAA,GAAAA,SAAAA;AACFA,UAJhBE,oBAAAA,CAIgBF;EACdC,mBAAAA,CAAAA,EAAAA,OAAAA;EAAmB,cAAA,CAAA,EAAA,CAAA,KAAA,EAHTD,iBAGS,GAAA,IAAA,EAAA,GAAA,IAAA;EASjBG,oBAAAA,CAAAA,EAAoB,CAAA,KAAA,EAXNH,iBAWM,GAAA,IAAA,EAAA,GAAA,IAAA;EAOfE,kBAAAA,CAAAA,EAAAA,CAAAA,KAAAA,EAjBOF,iBAiBPE,GAAAA,IAAAA,EAAAA,GAAAA,IAAAA;EACFA,YAAAA,CAAAA,EAjBLD,mBAiBKC;;;;;;AAuBxB;;;AAAyFM,cA/BpEL,oBAAAA,CA+BoEK;EAAsBC,QAAAA,OAAAA;EAAsBP,QAAAA,GAAAA;EAAqCD,QAAAA,aAAAA;EAAsBC,QAAAA,sBAAAA;EAAoB,QAAA,MAAA;;wBAxB1LA;sBACFA;;aAETE;;;sBAGSJ;kBACJA;0CACwBD;;;;;;;;;;;;;;;;iBAgBpBM,yBAAAA;;;;;GAA6GH,qCAAqCD,sBAAsBC"}
@@ -1,270 +0,0 @@
1
- import { areSelectionsEqual } from "../utils/areSelectionsEqual.js";
2
-
3
- //#region src/managers/LineSelectionManager.ts
4
- /**
5
- * Manages line selection state and interactions for code/diff viewers.
6
- * Handles:
7
- * - Click and drag selection
8
- * - Shift-click to extend selection
9
- * - DOM attribute updates (data-selected-line)
10
- */
11
- var LineSelectionManager = class {
12
- pre;
13
- selectedRange = null;
14
- renderedSelectionRange;
15
- anchor;
16
- _queuedRender;
17
- constructor(options = {}) {
18
- this.options = options;
19
- }
20
- setOptions(options) {
21
- this.options = {
22
- ...this.options,
23
- ...options
24
- };
25
- this.removeEventListeners();
26
- if (this.options.enableLineSelection === true) this.attachEventListeners();
27
- }
28
- cleanUp() {
29
- this.removeEventListeners();
30
- if (this._queuedRender != null) {
31
- cancelAnimationFrame(this._queuedRender);
32
- this._queuedRender = void 0;
33
- }
34
- this.pre?.removeAttribute("data-interactive-line-numbers");
35
- this.pre = void 0;
36
- }
37
- setup(pre) {
38
- this.setDirty();
39
- if (this.pre !== pre) {
40
- this.cleanUp();
41
- this.pre = pre;
42
- const { enableLineSelection = false } = this.options;
43
- if (enableLineSelection) this.attachEventListeners();
44
- else this.removeEventListeners();
45
- }
46
- this.setSelection(this.selectedRange);
47
- }
48
- setDirty() {
49
- this.renderedSelectionRange = void 0;
50
- }
51
- isDirty() {
52
- return this.renderedSelectionRange === void 0;
53
- }
54
- setSelection(range) {
55
- const isRangeChange = !(range === this.selectedRange || areSelectionsEqual(range ?? void 0, this.selectedRange ?? void 0));
56
- if (!this.isDirty() && !isRangeChange) return;
57
- this.selectedRange = range;
58
- this.renderSelection();
59
- if (isRangeChange) this.notifySelectionChange();
60
- }
61
- getSelection() {
62
- return this.selectedRange;
63
- }
64
- getLineIndex(lineNumber, side) {
65
- const { getLineIndex } = this.options;
66
- return getLineIndex != null ? getLineIndex(lineNumber, side) : [lineNumber - 1, lineNumber - 1];
67
- }
68
- attachEventListeners() {
69
- if (this.pre == null) return;
70
- this.removeEventListeners();
71
- this.pre.setAttribute("data-interactive-line-numbers", "");
72
- this.pre.addEventListener("pointerdown", this.handleMouseDown);
73
- }
74
- removeEventListeners() {
75
- if (this.pre == null) return;
76
- this.pre.removeEventListener("pointerdown", this.handleMouseDown);
77
- document.removeEventListener("pointermove", this.handleMouseMove);
78
- document.removeEventListener("pointerup", this.handleMouseUp);
79
- this.pre.removeAttribute("data-interactive-line-numbers");
80
- }
81
- handleMouseDown = (event) => {
82
- const mouseEventData = event.button === 0 ? this.getMouseEventDataForPath(event.composedPath(), "click") : void 0;
83
- if (mouseEventData == null || this.pre == null) return;
84
- event.preventDefault();
85
- const { lineNumber, eventSide, lineIndex } = mouseEventData;
86
- if (event.shiftKey && this.selectedRange != null) {
87
- const range = this.getIndexesFromSelection(this.selectedRange, this.pre.getAttribute("data-diff-type") === "split");
88
- if (range == null) return;
89
- const useStart = range.start <= range.end ? lineIndex >= range.start : lineIndex <= range.end;
90
- this.anchor = {
91
- line: useStart ? this.selectedRange.start : this.selectedRange.end,
92
- side: (useStart ? this.selectedRange.side : this.selectedRange.endSide ?? this.selectedRange.side) ?? "additions"
93
- };
94
- this.updateSelection(lineNumber, eventSide);
95
- this.notifySelectionStart(this.selectedRange);
96
- } else {
97
- if (this.selectedRange?.start === lineNumber && this.selectedRange?.end === lineNumber) {
98
- this.updateSelection(null);
99
- this.notifySelectionEnd(null);
100
- this.notifySelectionChange();
101
- return;
102
- }
103
- this.selectedRange = null;
104
- this.anchor = {
105
- line: lineNumber,
106
- side: eventSide
107
- };
108
- this.updateSelection(lineNumber, eventSide);
109
- this.notifySelectionStart(this.selectedRange);
110
- }
111
- document.addEventListener("pointermove", this.handleMouseMove);
112
- document.addEventListener("pointerup", this.handleMouseUp);
113
- };
114
- handleMouseMove = (event) => {
115
- const mouseEventData = this.getMouseEventDataForPath(event.composedPath(), "move");
116
- if (mouseEventData == null || this.anchor == null) return;
117
- const { lineNumber, eventSide } = mouseEventData;
118
- this.updateSelection(lineNumber, eventSide);
119
- };
120
- handleMouseUp = () => {
121
- this.anchor = void 0;
122
- document.removeEventListener("pointermove", this.handleMouseMove);
123
- document.removeEventListener("pointerup", this.handleMouseUp);
124
- this.notifySelectionEnd(this.selectedRange);
125
- this.notifySelectionChange();
126
- };
127
- updateSelection(currentLine, side) {
128
- if (currentLine == null) this.selectedRange = null;
129
- else {
130
- const anchorSide = this.anchor?.side ?? side;
131
- this.selectedRange = {
132
- start: this.anchor?.line ?? currentLine,
133
- end: currentLine,
134
- side: anchorSide,
135
- endSide: anchorSide !== side ? side : void 0
136
- };
137
- }
138
- this._queuedRender ??= requestAnimationFrame(this.renderSelection);
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
- }
149
- renderSelection = () => {
150
- if (this._queuedRender != null) {
151
- cancelAnimationFrame(this._queuedRender);
152
- this._queuedRender = void 0;
153
- }
154
- if (this.pre == null || this.renderedSelectionRange === this.selectedRange) return;
155
- const allSelected = this.pre.querySelectorAll("[data-selected-line]");
156
- for (const element of allSelected) element.removeAttribute("data-selected-line");
157
- this.renderedSelectionRange = this.selectedRange;
158
- if (this.selectedRange == null) return;
159
- const { children: codeElements } = this.pre;
160
- if (codeElements.length === 0) return;
161
- if (codeElements.length > 2) {
162
- console.error(codeElements);
163
- throw new Error("LineSelectionManager.applySelectionToDOM: Somehow there are more than 2 code elements...");
164
- }
165
- const split = this.pre.getAttribute("data-diff-type") === "split";
166
- const rowRange = this.getIndexesFromSelection(this.selectedRange, split);
167
- if (rowRange == null) {
168
- console.error({
169
- rowRange,
170
- selectedRange: this.selectedRange
171
- });
172
- throw new Error("LineSelectionManager.renderSelection: No valid rowRange");
173
- }
174
- const isSingle = rowRange.start === rowRange.end;
175
- const first = Math.min(rowRange.start, rowRange.end);
176
- const last = Math.max(rowRange.start, rowRange.end);
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
- }
200
- }
201
- }
202
- };
203
- notifySelectionChange() {
204
- const { onLineSelected } = this.options;
205
- if (onLineSelected == null) return;
206
- onLineSelected(this.selectedRange ?? null);
207
- }
208
- notifySelectionStart(range) {
209
- const { onLineSelectionStart } = this.options;
210
- if (onLineSelectionStart == null) return;
211
- onLineSelectionStart(range);
212
- }
213
- notifySelectionEnd(range) {
214
- const { onLineSelectionEnd } = this.options;
215
- if (onLineSelectionEnd == null) return;
216
- onLineSelectionEnd(range);
217
- }
218
- getMouseEventDataForPath(path, eventType) {
219
- if (this.pre == null) return;
220
- let lineNumber;
221
- let lineIndex;
222
- let isNumberColumn = false;
223
- let eventSide;
224
- for (const element of path) {
225
- if (lineNumber != null && lineIndex != null && eventSide != null) break;
226
- if (!(element instanceof HTMLElement)) continue;
227
- if (element.hasAttribute("data-line-index")) {
228
- isNumberColumn = element.hasAttribute("data-column-number");
229
- lineNumber = this.getLineNumber(element);
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";
234
- continue;
235
- }
236
- if (eventSide == null && element.hasAttribute("data-code")) {
237
- eventSide = element.hasAttribute("data-deletions") ? "deletions" : element.hasAttribute("data-additions") ? "additions" : void 0;
238
- break;
239
- }
240
- }
241
- if (eventType === "click" && !isNumberColumn || lineIndex == null || lineNumber == null) return;
242
- return {
243
- lineIndex,
244
- lineNumber,
245
- eventSide: eventSide ?? "additions"
246
- };
247
- }
248
- getLineNumber(element) {
249
- const lineNumber = parseInt(element.getAttribute("data-column-number") ?? element.getAttribute("data-line") ?? "", 10);
250
- return !Number.isNaN(lineNumber) ? lineNumber : void 0;
251
- }
252
- parseLineIndex(element, split) {
253
- const lineIndexes = (element.getAttribute("data-line-index") ?? "").split(",").map((value) => parseInt(value)).filter((value) => !Number.isNaN(value));
254
- if (split && lineIndexes.length === 2) return lineIndexes[1];
255
- else if (!split) return lineIndexes[0];
256
- }
257
- };
258
- function pluckLineSelectionOptions({ enableLineSelection, onLineSelected, onLineSelectionStart, onLineSelectionEnd }, getLineIndex) {
259
- return {
260
- enableLineSelection,
261
- onLineSelected,
262
- onLineSelectionStart,
263
- onLineSelectionEnd,
264
- getLineIndex
265
- };
266
- }
267
-
268
- //#endregion
269
- export { LineSelectionManager, pluckLineSelectionOptions };
270
- //# sourceMappingURL=LineSelectionManager.js.map
@@ -1 +0,0 @@
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,71 +0,0 @@
1
- import { AnnotationSide, DiffLineEventBaseProps, ExpansionDirections, LineEventBaseProps } from "../types.js";
2
-
3
- //#region src/managers/MouseEventManager.d.ts
4
- type LogTypes = 'click' | 'move' | 'both' | 'none';
5
- type MouseEventManagerMode = 'file' | 'diff';
6
- interface OnLineClickProps extends LineEventBaseProps {
7
- event: PointerEvent;
8
- }
9
- interface OnLineEnterLeaveProps extends LineEventBaseProps {
10
- event: PointerEvent;
11
- }
12
- interface OnDiffLineClickProps extends DiffLineEventBaseProps {
13
- event: PointerEvent;
14
- }
15
- interface OnDiffLineEnterLeaveProps extends DiffLineEventBaseProps {
16
- event: PointerEvent;
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' ? {
21
- lineNumber: number;
22
- } : {
23
- lineNumber: number;
24
- side: AnnotationSide;
25
- };
26
- interface MouseEventManagerBaseOptions<TMode extends MouseEventManagerMode> {
27
- lineHoverHighlight?: 'disabled' | 'both' | 'number' | 'line';
28
- enableHoverUtility?: boolean;
29
- onLineClick?(props: EventClickProps<TMode>): unknown;
30
- onLineNumberClick?(props: EventClickProps<TMode>): unknown;
31
- onLineEnter?(props: MouseEventEnterLeaveProps<TMode>): unknown;
32
- onLineLeave?(props: MouseEventEnterLeaveProps<TMode>): unknown;
33
- __debugMouseEvents?: LogTypes;
34
- }
35
- interface MouseEventManagerOptions<TMode extends MouseEventManagerMode> extends MouseEventManagerBaseOptions<TMode> {
36
- onHunkExpand?(hunkIndex: number, direction: ExpansionDirections): unknown;
37
- }
38
- declare class MouseEventManager<TMode extends MouseEventManagerMode> {
39
- private mode;
40
- private options;
41
- private hoveredLine;
42
- private pre;
43
- private hoverSlot;
44
- private interactiveLinesAttr;
45
- private interactiveLineNumbersAttr;
46
- private hasEventListeners;
47
- constructor(mode: TMode, options: MouseEventManagerOptions<TMode>);
48
- setOptions(options: MouseEventManagerOptions<TMode>): void;
49
- cleanUp(): void;
50
- setup(pre: HTMLPreElement): void;
51
- getHoveredLine: () => GetHoveredLineResult<TMode> | undefined;
52
- handleMouseClick: (event: MouseEvent) => void;
53
- handleMouseMove: (event: PointerEvent) => void;
54
- handleMouseLeave: (event: PointerEvent) => void;
55
- private handleMouseEvent;
56
- private clearHoveredLine;
57
- private setHoveredLine;
58
- private getLineData;
59
- }
60
- declare function pluckMouseEventOptions<TMode extends MouseEventManagerMode>({
61
- lineHoverHighlight,
62
- onLineClick,
63
- onLineNumberClick,
64
- onLineEnter,
65
- onLineLeave,
66
- enableHoverUtility,
67
- __debugMouseEvents
68
- }: MouseEventManagerBaseOptions<TMode>, onHunkExpand?: (hunkIndex: number, direction: ExpansionDirections) => unknown): MouseEventManagerOptions<TMode>;
69
- //#endregion
70
- export { GetHoveredLineResult, LogTypes, MouseEventManager, MouseEventManagerBaseOptions, MouseEventManagerMode, MouseEventManagerOptions, OnDiffLineClickProps, OnDiffLineEnterLeaveProps, OnLineClickProps, OnLineEnterLeaveProps, pluckMouseEventOptions };
71
- //# sourceMappingURL=MouseEventManager.d.ts.map
@@ -1 +0,0 @@
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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"}