@pierre/diffs 1.1.0-beta.17 → 1.1.0-beta.19

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 (65) hide show
  1. package/dist/components/File.d.ts +3 -5
  2. package/dist/components/File.d.ts.map +1 -1
  3. package/dist/components/File.js +12 -21
  4. package/dist/components/File.js.map +1 -1
  5. package/dist/components/FileDiff.d.ts +5 -6
  6. package/dist/components/FileDiff.d.ts.map +1 -1
  7. package/dist/components/FileDiff.js +21 -22
  8. package/dist/components/FileDiff.js.map +1 -1
  9. package/dist/components/VirtualizedFileDiff.d.ts +1 -0
  10. package/dist/components/VirtualizedFileDiff.d.ts.map +1 -1
  11. package/dist/components/VirtualizedFileDiff.js +6 -0
  12. package/dist/components/VirtualizedFileDiff.js.map +1 -1
  13. package/dist/index.d.ts +3 -4
  14. package/dist/index.js +2 -3
  15. package/dist/managers/InteractionManager.d.ts +140 -0
  16. package/dist/managers/InteractionManager.d.ts.map +1 -0
  17. package/dist/managers/InteractionManager.js +789 -0
  18. package/dist/managers/InteractionManager.js.map +1 -0
  19. package/dist/managers/ResizeManager.d.ts +0 -2
  20. package/dist/managers/ResizeManager.d.ts.map +1 -1
  21. package/dist/managers/ResizeManager.js +43 -32
  22. package/dist/managers/ResizeManager.js.map +1 -1
  23. package/dist/react/index.d.ts +2 -2
  24. package/dist/react/jsx.d.ts.map +1 -1
  25. package/dist/react/types.d.ts +1 -2
  26. package/dist/react/types.d.ts.map +1 -1
  27. package/dist/react/utils/renderDiffChildren.d.ts +1 -1
  28. package/dist/react/utils/renderDiffChildren.d.ts.map +1 -1
  29. package/dist/react/utils/renderDiffChildren.js.map +1 -1
  30. package/dist/react/utils/renderFileChildren.d.ts +1 -1
  31. package/dist/react/utils/renderFileChildren.d.ts.map +1 -1
  32. package/dist/react/utils/renderFileChildren.js.map +1 -1
  33. package/dist/react/utils/useFileDiffInstance.d.ts +1 -2
  34. package/dist/react/utils/useFileDiffInstance.d.ts.map +1 -1
  35. package/dist/react/utils/useFileDiffInstance.js.map +1 -1
  36. package/dist/react/utils/useFileInstance.d.ts +1 -2
  37. package/dist/react/utils/useFileInstance.d.ts.map +1 -1
  38. package/dist/react/utils/useFileInstance.js.map +1 -1
  39. package/dist/renderers/DiffHunksRenderer.d.ts +1 -0
  40. package/dist/renderers/DiffHunksRenderer.d.ts.map +1 -1
  41. package/dist/renderers/DiffHunksRenderer.js +7 -0
  42. package/dist/renderers/DiffHunksRenderer.js.map +1 -1
  43. package/dist/ssr/index.d.ts +2 -2
  44. package/dist/style.js +1 -1
  45. package/dist/style.js.map +1 -1
  46. package/dist/types.d.ts +5 -1
  47. package/dist/types.d.ts.map +1 -1
  48. package/dist/utils/areSelectionPointsEqual.d.ts +7 -0
  49. package/dist/utils/areSelectionPointsEqual.d.ts.map +1 -0
  50. package/dist/utils/areSelectionPointsEqual.js +8 -0
  51. package/dist/utils/areSelectionPointsEqual.js.map +1 -0
  52. package/dist/utils/areSelectionsEqual.d.ts +1 -1
  53. package/dist/utils/areSelectionsEqual.d.ts.map +1 -1
  54. package/dist/utils/areSelectionsEqual.js.map +1 -1
  55. package/dist/worker/worker-portable.js +9 -6
  56. package/dist/worker/worker-portable.js.map +1 -1
  57. package/package.json +1 -1
  58. package/dist/managers/LineSelectionManager.d.ts +0 -64
  59. package/dist/managers/LineSelectionManager.d.ts.map +0 -1
  60. package/dist/managers/LineSelectionManager.js +0 -270
  61. package/dist/managers/LineSelectionManager.js.map +0 -1
  62. package/dist/managers/MouseEventManager.d.ts +0 -86
  63. package/dist/managers/MouseEventManager.d.ts.map +0 -1
  64. package/dist/managers/MouseEventManager.js +0 -424
  65. package/dist/managers/MouseEventManager.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InteractionManager.js","names":["mode: TMode","options: InteractionManagerOptions<TMode>","reasons: string[]","nextRange: SelectedLineRange | null","lineType: LineTypes | undefined","codeElement: HTMLElement | undefined","lineElement: HTMLElement | undefined","lineIndexValue: string | undefined","numberElement: HTMLElement | undefined","expandInfo:\n | {\n hunkIndex: number | undefined;\n direction: ExpansionDirections;\n }\n | undefined","lineNumber: number | undefined","annotationSide: AnnotationSide"],"sources":["../../src/managers/InteractionManager.ts"],"sourcesContent":["import { toHtml } from 'hast-util-to-html';\n\nimport type {\n AnnotationSide,\n DiffLineEventBaseProps,\n ExpansionDirections,\n LineEventBaseProps,\n LineTypes,\n SelectionPoint,\n SelectionSide,\n} from '../types';\nimport { areSelectionPointsEqual } from '../utils/areSelectionPointsEqual';\nimport { areSelectionsEqual } from '../utils/areSelectionsEqual';\nimport { createGutterUtilityElement } from '../utils/createGutterUtilityElement';\n\nexport type LogTypes = 'click' | 'move' | 'both' | 'none';\n\nexport type InteractionManagerMode = 'file' | 'diff';\n\nexport interface OnLineClickProps extends LineEventBaseProps {\n event: PointerEvent;\n}\n\nexport interface OnLineEnterLeaveProps extends LineEventBaseProps {\n event: PointerEvent;\n}\n\nexport interface OnDiffLineClickProps extends DiffLineEventBaseProps {\n event: PointerEvent;\n}\n\nexport interface OnDiffLineEnterLeaveProps extends DiffLineEventBaseProps {\n event: PointerEvent;\n}\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\ntype EventClickProps<TMode extends InteractionManagerMode> =\n TMode extends 'file' ? OnLineClickProps : OnDiffLineClickProps;\n\ntype PointerEventEnterLeaveProps<TMode extends InteractionManagerMode> =\n TMode extends 'file' ? OnLineEnterLeaveProps : OnDiffLineEnterLeaveProps;\n\ntype EventBaseProps<TMode extends InteractionManagerMode> = TMode extends 'file'\n ? LineEventBaseProps\n : DiffLineEventBaseProps;\n\ninterface ExpandoEventProps {\n type: 'line-info';\n hunkIndex: number;\n direction: ExpansionDirections;\n}\n\nexport type GetHoveredLineResult<TMode extends InteractionManagerMode> =\n TMode extends 'file'\n ? { lineNumber: number }\n : { lineNumber: number; side: AnnotationSide };\n\ninterface SelectionPointerInfo {\n lineNumber: number;\n eventSide: SelectionSide | undefined;\n lineIndex: number;\n}\n\ninterface ResolvedLineTarget<TMode extends InteractionManagerMode> {\n kind: 'line';\n lineType: LineTypes;\n lineElement: HTMLElement;\n lineNumber: number;\n numberColumn: boolean;\n numberElement: HTMLElement;\n side: TMode extends 'diff' ? AnnotationSide : undefined;\n splitLineIndex: number | undefined;\n}\n\ntype ResolvedPointerTarget<TMode extends InteractionManagerMode> =\n | ResolvedLineTarget<TMode>\n | ExpandoEventProps;\n\ntype LinePointerTarget<TMode extends InteractionManagerMode> =\n ResolvedLineTarget<TMode>;\n\ninterface SessionIdle {\n mode: 'idle';\n}\n\ninterface SessionSelecting {\n mode: 'selecting';\n pointerId: number;\n}\n\ninterface SessionPendingSingleLineUnselect {\n mode: 'pendingSingleLineUnselect';\n pointerId: number;\n anchor: SelectionPoint;\n pending: SelectionPoint;\n}\n\ninterface SessionGutterSelecting {\n mode: 'gutterSelecting';\n pointerId: number;\n anchor: SelectionPoint;\n current: SelectionPoint;\n}\n\ntype PointerSession =\n | SessionIdle\n | SessionSelecting\n | SessionPendingSingleLineUnselect\n | SessionGutterSelecting;\n\nexport interface InteractionManagerBaseOptions<\n TMode extends InteractionManagerMode,\n> {\n lineHoverHighlight?: 'disabled' | 'both' | 'number' | 'line';\n enableGutterUtility?: boolean;\n onGutterUtilityClick?(range: SelectedLineRange): unknown;\n onLineClick?(props: EventClickProps<TMode>): unknown;\n onLineNumberClick?(props: EventClickProps<TMode>): unknown;\n onLineEnter?(props: PointerEventEnterLeaveProps<TMode>): unknown;\n onLineLeave?(props: PointerEventEnterLeaveProps<TMode>): unknown;\n __debugPointerEvents?: LogTypes;\n enableLineSelection?: boolean;\n onLineSelected?: (range: SelectedLineRange | null) => void;\n onLineSelectionStart?: (range: SelectedLineRange | null) => void;\n onLineSelectionChange?: (range: SelectedLineRange | null) => void;\n onLineSelectionEnd?: (range: SelectedLineRange | null) => void;\n getLineIndex?: GetLineIndexUtility;\n}\n\nexport interface InteractionManagerOptions<\n TMode extends InteractionManagerMode,\n> extends InteractionManagerBaseOptions<TMode> {\n usesCustomGutterUtility?: boolean;\n onHunkExpand?(\n hunkIndex: number,\n direction: ExpansionDirections,\n expandFully?: boolean\n ): unknown;\n}\n\ninterface HandlePointerEventProps {\n eventType: 'click' | 'move';\n event: PointerEvent | MouseEvent;\n}\n\nexport class InteractionManager<TMode extends InteractionManagerMode> {\n private hoveredLine: EventBaseProps<TMode> | undefined;\n private pre: HTMLPreElement | undefined;\n\n private gutterUtilityContainer: HTMLDivElement | undefined;\n private gutterUtilityButton: HTMLButtonElement | undefined;\n private gutterUtilitySlot: HTMLSlotElement | undefined;\n\n private interactiveLinesAttr = false;\n private interactiveLineNumbersAttr = false;\n\n private hasPointerListeners = false;\n private hasDocumentPointerListeners = false;\n\n private selectedRange: SelectedLineRange | null = null;\n private renderedSelectionRange: SelectedLineRange | null | undefined;\n private selectionAnchor: SelectionPoint | undefined;\n private queuedSelectionRender: number | undefined;\n private pointerSession: PointerSession = { mode: 'idle' };\n\n constructor(\n private mode: TMode,\n private options: InteractionManagerOptions<TMode>\n ) {}\n\n setOptions(options: InteractionManagerOptions<TMode>): void {\n this.options = options;\n }\n\n cleanUp(): void {\n this.pre?.removeEventListener('click', this.handlePointerClick);\n this.pre?.removeEventListener('pointerdown', this.handlePointerDown);\n this.pre?.removeEventListener('pointermove', this.handlePointerMove);\n this.pre?.removeEventListener('pointerleave', this.handlePointerLeave);\n this.pre?.removeAttribute('data-interactive-lines');\n this.pre?.removeAttribute('data-interactive-line-numbers');\n this.pre = undefined;\n this.gutterUtilityContainer?.remove();\n this.gutterUtilityContainer = undefined;\n this.gutterUtilityButton = undefined;\n this.gutterUtilitySlot = undefined;\n this.clearHoveredLine();\n this.detachDocumentPointerListeners();\n this.clearPointerSession();\n if (this.queuedSelectionRender != null) {\n cancelAnimationFrame(this.queuedSelectionRender);\n this.queuedSelectionRender = undefined;\n }\n this.interactiveLinesAttr = false;\n this.interactiveLineNumbersAttr = false;\n this.hasPointerListeners = false;\n }\n\n setup(pre: HTMLPreElement): void {\n this.setSelectionDirty();\n const { usesCustomGutterUtility = false, enableGutterUtility = false } =\n this.options;\n\n const newContainer = this.pre !== pre;\n if (newContainer) {\n this.cleanUp();\n this.pre = pre;\n }\n\n if (enableGutterUtility) {\n this.ensureGutterUtilityNode(usesCustomGutterUtility);\n } else if (this.gutterUtilityContainer != null) {\n this.gutterUtilityContainer.remove();\n this.gutterUtilityContainer = undefined;\n this.gutterUtilityButton = undefined;\n this.gutterUtilitySlot = undefined;\n if (this.pointerSession.mode === 'gutterSelecting') {\n this.clearPointerSession();\n this.detachDocumentPointerListeners();\n }\n }\n\n this.syncPointerListeners(pre);\n this.updateInteractiveLineAttributes();\n this.renderSelection();\n }\n\n setSelectionDirty(): void {\n this.renderedSelectionRange = undefined;\n }\n\n isSelectionDirty(): boolean {\n return this.renderedSelectionRange === null;\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.isSelectionDirty() && !isRangeChange) {\n return;\n }\n this.selectedRange = range;\n this.renderSelection();\n if (isRangeChange) {\n this.notifySelectionCommitted();\n }\n }\n\n getSelection(): SelectedLineRange | null {\n return this.selectedRange;\n }\n\n getHoveredLine = (): GetHoveredLineResult<TMode> | undefined => {\n if (this.hoveredLine != null) {\n if (this.mode === 'diff' && this.hoveredLine.type === 'diff-line') {\n return {\n lineNumber: this.hoveredLine.lineNumber,\n side: this.hoveredLine.annotationSide,\n } as GetHoveredLineResult<TMode>;\n }\n if (this.mode === 'file' && this.hoveredLine.type === 'line') {\n return {\n lineNumber: this.hoveredLine.lineNumber,\n } as GetHoveredLineResult<TMode>;\n }\n }\n return undefined;\n };\n\n handlePointerClick = (event: MouseEvent): void => {\n const { onHunkExpand, onLineClick, onLineNumberClick } = this.options;\n if (\n onHunkExpand == null &&\n onLineClick == null &&\n onLineNumberClick == null\n ) {\n return;\n }\n if (\n this.options.onGutterUtilityClick != null &&\n isGutterUtilityPointerPath(event.composedPath())\n ) {\n return;\n }\n debugLogIfEnabled(\n this.options.__debugPointerEvents,\n 'click',\n 'FileDiff.DEBUG.handlePointerClick:',\n event\n );\n this.handlePointerEvent({ eventType: 'click', event });\n };\n\n handlePointerMove = (event: PointerEvent): void => {\n const {\n lineHoverHighlight = 'disabled',\n onLineEnter,\n onLineLeave,\n enableGutterUtility = false,\n } = this.options;\n if (\n lineHoverHighlight === 'disabled' &&\n !enableGutterUtility &&\n onLineEnter == null &&\n onLineLeave == null\n ) {\n return;\n }\n debugLogIfEnabled(\n this.options.__debugPointerEvents,\n 'move',\n 'FileDiff.DEBUG.handlePointerMove:',\n event\n );\n // should we perhaps throttle this a bit because move can be fast as fuk\n // boiiii\n this.handlePointerEvent({ eventType: 'move', event });\n };\n\n handlePointerLeave = (event: PointerEvent): void => {\n const { __debugPointerEvents } = this.options;\n debugLogIfEnabled(\n __debugPointerEvents,\n 'move',\n 'FileDiff.DEBUG.handlePointerLeave: no event'\n );\n if (this.hoveredLine == null) {\n debugLogIfEnabled(\n __debugPointerEvents,\n 'move',\n 'FileDiff.DEBUG.handlePointerLeave: returned early, no .hoveredLine'\n );\n return;\n }\n this.gutterUtilityContainer?.remove();\n this.options.onLineLeave?.({\n ...this.hoveredLine,\n event,\n } as PointerEventEnterLeaveProps<TMode>);\n this.clearHoveredLine();\n };\n\n private handlePointerEvent({ eventType, event }: HandlePointerEventProps) {\n const { __debugPointerEvents } = this.options;\n const composedPath = event.composedPath();\n debugLogIfEnabled(\n __debugPointerEvents,\n eventType,\n 'FileDiff.DEBUG.handlePointerEvent:',\n { eventType, composedPath }\n );\n const target = this.resolvePointerTarget(composedPath);\n debugLogIfEnabled(\n __debugPointerEvents,\n eventType,\n 'FileDiff.DEBUG.handlePointerEvent: resolvePointerTarget result:',\n target\n );\n\n const {\n onLineClick,\n onLineNumberClick,\n onLineEnter,\n onLineLeave,\n onHunkExpand,\n } = this.options;\n\n switch (eventType) {\n case 'move': {\n if (\n isLinePointerTarget(target) &&\n this.hoveredLine?.lineElement === target.lineElement\n ) {\n break;\n }\n if (this.hoveredLine != null) {\n this.gutterUtilityContainer?.remove();\n onLineLeave?.({\n ...this.hoveredLine,\n event: event as PointerEvent,\n } as PointerEventEnterLeaveProps<TMode>);\n this.clearHoveredLine();\n }\n if (isLinePointerTarget(target)) {\n this.setHoveredLine(this.toEventBaseProps(target));\n if (this.gutterUtilityContainer != null) {\n target.numberElement.appendChild(this.gutterUtilityContainer);\n }\n onLineEnter?.({\n ...this.hoveredLine,\n event: event as PointerEvent,\n } as PointerEventEnterLeaveProps<TMode>);\n }\n break;\n }\n case 'click': {\n if (target == null) {\n break;\n }\n if (isExpandoPointerTarget(target) && onHunkExpand != null) {\n onHunkExpand(target.hunkIndex, target.direction, event.shiftKey);\n break;\n }\n if (!isLinePointerTarget(target)) {\n break;\n }\n\n const eventBase = this.toEventBaseProps(target);\n if (onLineNumberClick != null && target.numberColumn) {\n onLineNumberClick({\n ...eventBase,\n event: event as PointerEvent,\n } as EventClickProps<TMode>);\n } else if (onLineClick != null) {\n onLineClick({\n ...eventBase,\n event: event as PointerEvent,\n } as EventClickProps<TMode>);\n }\n break;\n }\n }\n }\n\n private syncPointerListeners(pre: HTMLPreElement): void {\n const {\n __debugPointerEvents,\n lineHoverHighlight = 'disabled',\n onLineClick,\n onLineNumberClick,\n onLineEnter,\n onLineLeave,\n onHunkExpand,\n enableGutterUtility = false,\n enableLineSelection = false,\n onGutterUtilityClick,\n } = this.options;\n const enableGutterSelection = onGutterUtilityClick != null;\n const shouldAttachPointerListeners =\n lineHoverHighlight !== 'disabled' ||\n onLineClick != null ||\n onLineNumberClick != null ||\n onHunkExpand != null ||\n onLineEnter != null ||\n onLineLeave != null ||\n enableGutterUtility ||\n enableLineSelection ||\n enableGutterSelection;\n\n if (shouldAttachPointerListeners && !this.hasPointerListeners) {\n pre.addEventListener('click', this.handlePointerClick);\n pre.addEventListener('pointerdown', this.handlePointerDown);\n pre.addEventListener('pointermove', this.handlePointerMove);\n pre.addEventListener('pointerleave', this.handlePointerLeave);\n this.hasPointerListeners = true;\n\n debugLogIfEnabled(\n __debugPointerEvents,\n 'click',\n 'FileDiff.DEBUG.attachEventListeners: Attaching click events for:',\n (() => {\n const reasons: string[] = [];\n if (\n __debugPointerEvents === 'both' ||\n __debugPointerEvents === 'click'\n ) {\n if (onLineClick != null) {\n reasons.push('onLineClick');\n }\n if (onLineNumberClick != null) {\n reasons.push('onLineNumberClick');\n }\n if (onHunkExpand != null) {\n reasons.push('expandable hunk separators');\n }\n }\n return reasons;\n })()\n );\n debugLogIfEnabled(\n __debugPointerEvents,\n 'move',\n 'FileDiff.DEBUG.attachEventListeners: Attaching pointer move event'\n );\n debugLogIfEnabled(\n __debugPointerEvents,\n 'move',\n 'FileDiff.DEBUG.attachEventListeners: Attaching pointer leave event'\n );\n } else if (!shouldAttachPointerListeners && this.hasPointerListeners) {\n pre.removeEventListener('click', this.handlePointerClick);\n pre.removeEventListener('pointerdown', this.handlePointerDown);\n pre.removeEventListener('pointermove', this.handlePointerMove);\n pre.removeEventListener('pointerleave', this.handlePointerLeave);\n this.hasPointerListeners = false;\n }\n\n const hasActiveLineSelectionSession =\n this.pointerSession.mode === 'selecting' ||\n this.pointerSession.mode === 'pendingSingleLineUnselect';\n const hasActiveGutterSelectionSession =\n this.pointerSession.mode === 'gutterSelecting';\n if (\n (!enableLineSelection && hasActiveLineSelectionSession) ||\n (!enableGutterSelection && hasActiveGutterSelectionSession)\n ) {\n this.clearPointerSession();\n this.detachDocumentPointerListeners();\n this.selectionAnchor = undefined;\n this.clearPendingSingleLineState();\n }\n }\n\n private updateInteractiveLineAttributes(): void {\n if (this.pre == null) {\n return;\n }\n\n const {\n onLineClick,\n onLineNumberClick,\n enableLineSelection = false,\n } = this.options;\n\n const shouldHaveInteractiveLines = onLineClick != null;\n const shouldHaveInteractiveLineNumbers =\n onLineNumberClick != null || enableLineSelection;\n\n if (shouldHaveInteractiveLines && !this.interactiveLinesAttr) {\n this.pre.setAttribute('data-interactive-lines', '');\n this.interactiveLinesAttr = true;\n } else if (!shouldHaveInteractiveLines && this.interactiveLinesAttr) {\n this.pre.removeAttribute('data-interactive-lines');\n this.interactiveLinesAttr = false;\n }\n\n if (shouldHaveInteractiveLineNumbers && !this.interactiveLineNumbersAttr) {\n this.pre.setAttribute('data-interactive-line-numbers', '');\n this.interactiveLineNumbersAttr = true;\n } else if (\n !shouldHaveInteractiveLineNumbers &&\n this.interactiveLineNumbersAttr\n ) {\n this.pre.removeAttribute('data-interactive-line-numbers');\n this.interactiveLineNumbersAttr = false;\n }\n }\n\n private handlePointerDown = (event: PointerEvent): void => {\n if (\n (event.pointerType === 'mouse' && event.button !== 0) ||\n this.pre == null ||\n this.pointerSession.mode !== 'idle'\n ) {\n return;\n }\n\n const path = event.composedPath();\n if (\n isGutterUtilityPointerPath(path) &&\n this.options.onGutterUtilityClick != null\n ) {\n this.startGutterSelectionFromPointerDown(event, path);\n } else {\n this.startLineSelectionFromPointerDown(event, path);\n }\n };\n\n private startLineSelectionFromPointerDown(\n event: PointerEvent,\n path: (EventTarget | undefined)[]\n ): void {\n const { enableLineSelection = false } = this.options;\n if (!enableLineSelection) {\n return;\n }\n\n const pointerInfo = this.getSelectionPointerInfo(path, true);\n if (pointerInfo == null) {\n return;\n }\n\n const { pre } = this;\n if (pre == null) {\n return;\n }\n\n event.preventDefault();\n const { lineNumber, eventSide, lineIndex } = pointerInfo;\n\n if (event.shiftKey && this.selectedRange != null) {\n const rowRange = this.getIndexesFromSelection(\n this.selectedRange,\n pre.getAttribute('data-diff-type') === 'split'\n );\n if (rowRange == null) {\n return;\n }\n const useStart =\n rowRange.start <= rowRange.end\n ? lineIndex >= rowRange.start\n : lineIndex <= rowRange.end;\n this.selectionAnchor = {\n lineNumber: useStart\n ? this.selectedRange.start\n : this.selectedRange.end,\n side: useStart\n ? this.selectedRange.side\n : (this.selectedRange.endSide ?? this.selectedRange.side),\n };\n this.updateSelection(lineNumber, eventSide, false);\n this.notifySelectionStart(this.selectedRange);\n this.pointerSession = { mode: 'selecting', pointerId: event.pointerId };\n this.attachDocumentPointerListeners();\n return;\n }\n\n if (\n this.selectedRange?.start === lineNumber &&\n this.selectedRange?.end === lineNumber\n ) {\n const point = { lineNumber, side: eventSide };\n this.selectionAnchor = point;\n this.pointerSession = {\n mode: 'pendingSingleLineUnselect',\n pointerId: event.pointerId,\n anchor: point,\n pending: point,\n };\n this.attachDocumentPointerListeners();\n return;\n }\n\n this.selectedRange = null;\n this.selectionAnchor = { lineNumber, side: eventSide };\n this.updateSelection(lineNumber, eventSide, false);\n this.notifySelectionStart(this.selectedRange);\n this.pointerSession = { mode: 'selecting', pointerId: event.pointerId };\n this.attachDocumentPointerListeners();\n }\n\n private startGutterSelectionFromPointerDown(\n event: PointerEvent,\n path: (EventTarget | undefined)[]\n ): void {\n const { enableLineSelection = false, onGutterUtilityClick } = this.options;\n if (onGutterUtilityClick == null) {\n return;\n }\n const point = this.getSelectionPointFromPath(path);\n if (point == null) {\n return;\n }\n event.preventDefault();\n event.stopPropagation();\n this.pointerSession = {\n mode: 'gutterSelecting',\n pointerId: event.pointerId,\n anchor: point,\n current: point,\n };\n if (enableLineSelection) {\n this.selectionAnchor = {\n lineNumber: point.lineNumber,\n side: point.side,\n };\n this.updateSelection(point.lineNumber, point.side, false);\n this.notifySelectionStart(this.selectedRange);\n }\n this.attachDocumentPointerListeners();\n }\n\n private handleDocumentPointerMove = (event: PointerEvent): void => {\n const { enableLineSelection = false } = this.options;\n switch (this.pointerSession.mode) {\n case 'idle':\n return;\n case 'gutterSelecting': {\n if (event.pointerId !== this.pointerSession.pointerId) {\n return;\n }\n const point = this.getSelectionPointFromPath(event.composedPath());\n if (point == null) {\n return;\n }\n this.pointerSession.current = point;\n if (enableLineSelection === true) {\n this.updateSelection(point.lineNumber, point.side);\n }\n return;\n }\n case 'selecting': {\n if (event.pointerId !== this.pointerSession.pointerId) {\n return;\n }\n const pointerInfo = this.getSelectionPointerInfo(\n event.composedPath(),\n false\n );\n if (pointerInfo == null || this.selectionAnchor == null) {\n return;\n }\n this.updateSelection(pointerInfo.lineNumber, pointerInfo.eventSide);\n return;\n }\n case 'pendingSingleLineUnselect': {\n if (event.pointerId !== this.pointerSession.pointerId) {\n return;\n }\n const pointerInfo = this.getSelectionPointerInfo(\n event.composedPath(),\n false\n );\n if (pointerInfo == null || this.selectionAnchor == null) {\n return;\n }\n const point = {\n lineNumber: pointerInfo.lineNumber,\n side: pointerInfo.eventSide,\n };\n if (areSelectionPointsEqual(this.pointerSession.pending, point)) {\n return;\n }\n this.updateSelection(\n pointerInfo.lineNumber,\n pointerInfo.eventSide,\n false\n );\n this.notifySelectionStart(this.selectedRange);\n this.notifySelectionChangeDelta();\n this.pointerSession = {\n mode: 'selecting',\n pointerId: event.pointerId,\n };\n return;\n }\n }\n };\n\n private handleDocumentPointerUp = (event: PointerEvent): void => {\n const { enableLineSelection = false, onGutterUtilityClick } = this.options;\n switch (this.pointerSession.mode) {\n case 'idle':\n return;\n case 'gutterSelecting': {\n if (event.pointerId !== this.pointerSession.pointerId) {\n return;\n }\n const point = this.getSelectionPointFromPath(event.composedPath());\n if (point != null) {\n this.pointerSession.current = point;\n if (enableLineSelection) {\n this.updateSelection(point.lineNumber, point.side);\n }\n }\n onGutterUtilityClick?.(\n this.buildSelectedLineRange(\n this.pointerSession.anchor,\n this.pointerSession.current\n )\n );\n this.selectionAnchor = undefined;\n if (enableLineSelection) {\n this.notifySelectionEnd(this.selectedRange);\n this.notifySelectionCommitted();\n }\n this.clearPointerSession();\n this.detachDocumentPointerListeners();\n return;\n }\n case 'pendingSingleLineUnselect': {\n if (event.pointerId !== this.pointerSession.pointerId) {\n return;\n }\n this.updateSelection(null, undefined, false);\n this.selectionAnchor = undefined;\n this.clearPendingSingleLineState();\n this.detachDocumentPointerListeners();\n this.notifySelectionEnd(this.selectedRange);\n this.notifySelectionCommitted();\n return;\n }\n case 'selecting': {\n if (event.pointerId !== this.pointerSession.pointerId) {\n return;\n }\n this.selectionAnchor = undefined;\n this.detachDocumentPointerListeners();\n this.clearPointerSession();\n this.notifySelectionEnd(this.selectedRange);\n this.notifySelectionCommitted();\n }\n }\n };\n\n private handleDocumentPointerCancel = (event: PointerEvent): void => {\n switch (this.pointerSession.mode) {\n case 'idle':\n return;\n case 'gutterSelecting':\n case 'selecting':\n case 'pendingSingleLineUnselect': {\n if ('pointerId' in this.pointerSession) {\n if (event.pointerId !== this.pointerSession.pointerId) {\n return;\n }\n }\n this.selectionAnchor = undefined;\n this.clearPendingSingleLineState();\n this.clearPointerSession();\n this.detachDocumentPointerListeners();\n }\n }\n };\n\n private clearHoveredLine() {\n if (this.hoveredLine == null) {\n return;\n }\n this.hoveredLine.lineElement.removeAttribute('data-hovered');\n this.hoveredLine.numberElement.removeAttribute('data-hovered');\n this.hoveredLine = undefined;\n }\n\n private setHoveredLine(hoveredLine: EventBaseProps<TMode>) {\n const { lineHoverHighlight = 'disabled' } = this.options;\n if (this.hoveredLine != null) {\n this.clearHoveredLine();\n }\n this.hoveredLine = hoveredLine;\n if (lineHoverHighlight !== 'disabled') {\n if (lineHoverHighlight === 'both' || lineHoverHighlight === 'line') {\n this.hoveredLine.lineElement.setAttribute('data-hovered', '');\n }\n if (lineHoverHighlight === 'both' || lineHoverHighlight === 'number') {\n this.hoveredLine.numberElement.setAttribute('data-hovered', '');\n }\n }\n }\n\n private ensureGutterUtilityNode(useCustomGutterUtility: boolean): void {\n if (this.gutterUtilityContainer == null) {\n this.gutterUtilityContainer = document.createElement('div');\n this.gutterUtilityContainer.setAttribute('data-gutter-utility-slot', '');\n }\n if (useCustomGutterUtility) {\n if (this.gutterUtilityButton != null) {\n this.gutterUtilityButton.remove();\n this.gutterUtilityButton = undefined;\n }\n if (this.gutterUtilitySlot == null) {\n this.gutterUtilitySlot = document.createElement('slot');\n this.gutterUtilitySlot.name = 'gutter-utility-slot';\n }\n if (this.gutterUtilitySlot.parentNode !== this.gutterUtilityContainer) {\n this.gutterUtilityContainer.replaceChildren(this.gutterUtilitySlot);\n }\n } else {\n this.gutterUtilitySlot?.remove();\n this.gutterUtilitySlot = undefined;\n if (this.gutterUtilityButton == null) {\n const tempDiv = document.createElement('div');\n tempDiv.innerHTML = toHtml(createGutterUtilityElement());\n const utilityButton = tempDiv.firstElementChild;\n if (!(utilityButton instanceof HTMLButtonElement)) {\n throw new Error(\n 'InteractionManager.ensureGutterUtilityNode: Node element should be a button'\n );\n }\n utilityButton.remove();\n this.gutterUtilityButton = utilityButton;\n }\n if (this.gutterUtilityButton.parentNode !== this.gutterUtilityContainer) {\n this.gutterUtilityContainer.replaceChildren(this.gutterUtilityButton);\n }\n }\n }\n\n private attachDocumentPointerListeners(): void {\n if (this.hasDocumentPointerListeners) {\n return;\n }\n document.addEventListener('pointermove', this.handleDocumentPointerMove);\n document.addEventListener('pointerup', this.handleDocumentPointerUp);\n document.addEventListener(\n 'pointercancel',\n this.handleDocumentPointerCancel\n );\n this.hasDocumentPointerListeners = true;\n }\n\n private detachDocumentPointerListeners(): void {\n if (!this.hasDocumentPointerListeners) {\n return;\n }\n document.removeEventListener('pointermove', this.handleDocumentPointerMove);\n document.removeEventListener('pointerup', this.handleDocumentPointerUp);\n document.removeEventListener(\n 'pointercancel',\n this.handleDocumentPointerCancel\n );\n this.hasDocumentPointerListeners = false;\n }\n\n private clearPointerSession(): void {\n this.pointerSession = { mode: 'idle' };\n }\n\n private clearPendingSingleLineState(): void {\n if (this.pointerSession.mode === 'pendingSingleLineUnselect') {\n this.pointerSession = { mode: 'idle' };\n }\n }\n\n private getSelectionPointerInfo(\n path: (EventTarget | undefined)[],\n requireNumberColumn: boolean\n ): SelectionPointerInfo | undefined {\n const target = this.resolvePointerTarget(path);\n if (!isLinePointerTarget(target)) {\n return undefined;\n }\n if (requireNumberColumn && !target.numberColumn) {\n return undefined;\n }\n if (target.splitLineIndex == null) {\n return undefined;\n }\n\n return {\n lineIndex: target.splitLineIndex,\n lineNumber: target.lineNumber,\n eventSide: this.mode === 'diff' ? target.side : undefined,\n };\n }\n\n private getSelectionPointFromPath(\n path: (EventTarget | undefined)[]\n ): SelectionPoint | undefined {\n const target = this.resolvePointerTarget(path);\n if (!isLinePointerTarget(target)) {\n return undefined;\n }\n return {\n lineNumber: target.lineNumber,\n side: this.mode === 'diff' ? target.side : undefined,\n };\n }\n\n private 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 updateSelection(\n currentLine: number | null,\n side?: SelectionSide,\n emitChange = true\n ): void {\n const { selectedRange: previousRange } = this;\n let nextRange: SelectedLineRange | null;\n if (currentLine == null) {\n nextRange = null;\n } else {\n const anchorSide = this.selectionAnchor?.side ?? side;\n const anchorLine = this.selectionAnchor?.lineNumber ?? currentLine;\n nextRange = this.buildSelectionRange(\n anchorLine,\n currentLine,\n anchorSide,\n side\n );\n }\n if (\n areSelectionsEqual(previousRange ?? undefined, nextRange ?? undefined)\n ) {\n return;\n }\n this.selectedRange = nextRange;\n if (emitChange) {\n this.notifySelectionChangeDelta();\n }\n this.queuedSelectionRender ??= 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.queuedSelectionRender != null) {\n cancelAnimationFrame(this.queuedSelectionRender);\n this.queuedSelectionRender = undefined;\n }\n if (\n this.pre == null ||\n this.renderedSelectionRange === this.selectedRange\n ) {\n return;\n }\n\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) {\n return;\n }\n if (codeElements.length > 2) {\n console.error(codeElements);\n throw new Error(\n 'InteractionManager.renderSelection: 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('InteractionManager.renderSelection: No valid rowRange');\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 'InteractionManager.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) {\n break;\n }\n if (lineIndex == null || lineIndex < first) {\n continue;\n }\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 (\n gutterElement.nextSibling instanceof HTMLElement &&\n contentElement.nextSibling instanceof HTMLElement &&\n contentElement.nextSibling.hasAttribute('data-line-annotation')\n ) {\n if (isSingle) {\n attributeValue = 'last';\n contentElement.setAttribute('data-selected-line', 'first');\n } else if (lineIndex === first) {\n attributeValue = '';\n } else if (lineIndex === 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 notifySelectionCommitted(): void {\n this.options.onLineSelected?.(this.selectedRange ?? null);\n }\n\n private notifySelectionChangeDelta(): void {\n this.options.onLineSelectionChange?.(this.selectedRange ?? null);\n }\n\n private notifySelectionStart(range: SelectedLineRange | null): void {\n this.options.onLineSelectionStart?.(range);\n }\n\n private notifySelectionEnd(range: SelectedLineRange | null): void {\n this.options.onLineSelectionEnd?.(range);\n }\n\n private toEventBaseProps(\n target: LinePointerTarget<TMode>\n ): EventBaseProps<TMode> {\n if (this.mode === 'file') {\n return {\n type: 'line',\n lineElement: target.lineElement,\n lineNumber: target.lineNumber,\n numberColumn: target.numberColumn,\n numberElement: target.numberElement,\n } as EventBaseProps<TMode>;\n }\n\n return {\n type: 'diff-line',\n annotationSide: target.side as AnnotationSide,\n lineType: target.lineType,\n lineElement: target.lineElement,\n numberElement: target.numberElement,\n lineNumber: target.lineNumber,\n numberColumn: target.numberColumn,\n } as EventBaseProps<TMode>;\n }\n\n private buildSelectedLineRange(\n anchor: SelectionPoint,\n current: SelectionPoint\n ): SelectedLineRange {\n return this.buildSelectionRange(\n anchor.lineNumber,\n current.lineNumber,\n anchor.side,\n current.side\n );\n }\n\n private buildSelectionRange(\n start: number,\n end: number,\n side?: SelectionSide,\n endSide?: SelectionSide\n ): SelectedLineRange {\n return {\n start,\n end,\n ...(side != null ? { side } : {}),\n ...(side !== endSide && endSide != null ? { endSide } : {}),\n };\n }\n\n private resolvePointerTarget(\n path: (EventTarget | undefined)[]\n ): ResolvedPointerTarget<TMode> | undefined {\n let numberColumn = false;\n let lineType: LineTypes | undefined;\n let codeElement: HTMLElement | undefined;\n let lineElement: HTMLElement | undefined;\n let lineIndexValue: string | undefined;\n let numberElement: HTMLElement | undefined;\n let expandInfo:\n | {\n hunkIndex: number | undefined;\n direction: ExpansionDirections;\n }\n | undefined;\n let lineNumber: number | undefined;\n\n for (const element of path) {\n if (!(element instanceof HTMLElement)) {\n continue;\n }\n\n const columnNumber =\n numberElement == null\n ? (element.getAttribute('data-column-number') ?? undefined)\n : undefined;\n if (columnNumber != null) {\n numberElement = element;\n lineNumber = Number.parseInt(columnNumber, 10);\n numberColumn = true;\n lineType = getLineTypeFromElement(element);\n lineIndexValue = element.getAttribute('data-line-index') ?? undefined;\n continue;\n }\n\n const lineAttr =\n lineElement == null\n ? (element.getAttribute('data-line') ?? undefined)\n : undefined;\n if (lineAttr != null) {\n lineElement = element;\n lineNumber = Number.parseInt(lineAttr, 10);\n lineType = getLineTypeFromElement(element);\n lineIndexValue = element.getAttribute('data-line-index') ?? undefined;\n continue;\n }\n\n if (expandInfo == null && element.hasAttribute('data-expand-button')) {\n expandInfo = {\n hunkIndex: undefined,\n direction: (() => {\n if (element.hasAttribute('data-expand-up')) {\n return 'up';\n }\n if (element.hasAttribute('data-expand-down')) {\n return 'down';\n }\n return 'both';\n })(),\n };\n continue;\n }\n\n const expandIndexValue =\n expandInfo != null\n ? (element.getAttribute('data-expand-index') ?? undefined)\n : undefined;\n if (expandInfo != null && expandIndexValue != null) {\n const expandIndex = Number.parseInt(expandIndexValue, 10);\n if (!Number.isNaN(expandIndex)) {\n expandInfo.hunkIndex = expandIndex;\n }\n continue;\n }\n\n if (codeElement == null && element.hasAttribute('data-code')) {\n codeElement = element;\n break;\n }\n }\n\n if (expandInfo?.hunkIndex != null) {\n return {\n type: 'line-info',\n hunkIndex: expandInfo.hunkIndex,\n direction: expandInfo.direction,\n } as ResolvedPointerTarget<TMode>;\n }\n\n lineElement ??=\n lineIndexValue != null\n ? queryHTMLElement(\n codeElement,\n `[data-line][data-line-index=\"${lineIndexValue}\"]`\n )\n : undefined;\n numberElement ??=\n lineIndexValue != null\n ? queryHTMLElement(\n codeElement,\n `[data-column-number][data-line-index=\"${lineIndexValue}\"]`\n )\n : undefined;\n\n if (\n codeElement == null ||\n lineElement == null ||\n numberElement == null ||\n lineType == null ||\n lineNumber == null ||\n Number.isNaN(lineNumber)\n ) {\n return undefined;\n }\n\n const splitLineIndex = this.parseLineIndex(lineElement, this.isSplitDiff());\n\n if (this.mode === 'file') {\n return {\n kind: 'line',\n lineType,\n lineElement,\n lineNumber,\n numberColumn,\n numberElement,\n side: undefined,\n splitLineIndex,\n } as ResolvedPointerTarget<TMode>;\n }\n\n const annotationSide: AnnotationSide = (() => {\n switch (lineType) {\n case 'change-deletion':\n return 'deletions';\n case 'change-addition':\n return 'additions';\n default:\n return codeElement.hasAttribute('data-deletions')\n ? 'deletions'\n : 'additions';\n }\n })();\n\n return {\n kind: 'line',\n lineType,\n lineElement,\n lineNumber,\n numberColumn,\n numberElement,\n side: annotationSide,\n splitLineIndex,\n } as ResolvedPointerTarget<TMode>;\n }\n\n private isSplitDiff(): boolean {\n return this.pre?.getAttribute('data-diff-type') === 'split';\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) => Number.parseInt(value, 10))\n .filter((value) => !Number.isNaN(value));\n\n if (split && lineIndexes.length === 2) {\n return lineIndexes[1];\n }\n if (!split) {\n return lineIndexes[0];\n }\n return undefined;\n }\n}\n\ntype InteractionPluckOptions<TMode extends InteractionManagerMode> =\n InteractionManagerBaseOptions<TMode> & {\n enableHoverUtility?: boolean;\n renderGutterUtility?(\n getHoveredRow: () => GetHoveredLineResult<TMode> | undefined\n ): HTMLElement | null;\n renderHoverUtility?(\n getHoveredRow: () => GetHoveredLineResult<TMode> | undefined\n ): HTMLElement | null;\n };\n\nexport function pluckInteractionOptions<TMode extends InteractionManagerMode>(\n {\n enableGutterUtility,\n enableHoverUtility,\n lineHoverHighlight,\n onGutterUtilityClick,\n onLineClick,\n onLineEnter,\n onLineLeave,\n onLineNumberClick,\n renderGutterUtility,\n renderHoverUtility,\n __debugPointerEvents,\n enableLineSelection,\n onLineSelected,\n onLineSelectionStart,\n onLineSelectionChange,\n onLineSelectionEnd,\n }: InteractionPluckOptions<TMode>,\n onHunkExpand?: (\n hunkIndex: number,\n direction: ExpansionDirections,\n expandFully?: boolean\n ) => unknown,\n getLineIndex?: GetLineIndexUtility\n): InteractionManagerOptions<TMode> {\n return {\n enableGutterUtility: resolveEnableGutterUtilityOption({\n enableGutterUtility,\n enableHoverUtility,\n renderGutterUtility,\n renderHoverUtility,\n onGutterUtilityClick,\n }),\n usesCustomGutterUtility:\n renderGutterUtility != null || renderHoverUtility != null,\n lineHoverHighlight,\n\n onGutterUtilityClick,\n onHunkExpand,\n onLineClick,\n onLineEnter,\n onLineLeave,\n onLineNumberClick,\n __debugPointerEvents,\n\n enableLineSelection,\n onLineSelected,\n onLineSelectionStart,\n onLineSelectionChange,\n onLineSelectionEnd,\n\n getLineIndex,\n };\n}\n\nfunction resolveEnableGutterUtilityOption<\n TMode extends InteractionManagerMode,\n>({\n enableGutterUtility,\n enableHoverUtility,\n renderGutterUtility,\n renderHoverUtility,\n onGutterUtilityClick,\n}: Pick<\n InteractionPluckOptions<TMode>,\n | 'enableGutterUtility'\n | 'enableHoverUtility'\n | 'renderGutterUtility'\n | 'renderHoverUtility'\n | 'onGutterUtilityClick'\n>): boolean {\n if (enableGutterUtility !== undefined && enableHoverUtility !== undefined) {\n throw new Error(\n \"Cannot use both 'enableGutterUtility' and deprecated 'enableHoverUtility'. Use only 'enableGutterUtility'.\"\n );\n }\n if (renderGutterUtility != null && renderHoverUtility != null) {\n throw new Error(\n \"Cannot use both 'renderGutterUtility' and deprecated 'renderHoverUtility'. Use only 'renderGutterUtility'.\"\n );\n }\n if (\n onGutterUtilityClick != null &&\n (renderGutterUtility != null || renderHoverUtility != null)\n ) {\n throw new Error(\n \"Cannot use both 'onGutterUtilityClick' and render utility callbacks ('renderGutterUtility'/'renderHoverUtility'). Use only one gutter utility API.\"\n );\n }\n return enableGutterUtility ?? enableHoverUtility ?? false;\n}\n\nfunction isLinePointerTarget<TMode extends InteractionManagerMode>(\n target: ResolvedPointerTarget<TMode> | undefined\n): target is LinePointerTarget<TMode> {\n return target != null && 'kind' in target && target.kind === 'line';\n}\n\nfunction isExpandoPointerTarget<TMode extends InteractionManagerMode>(\n target: ResolvedPointerTarget<TMode>\n): target is ExpandoEventProps {\n return 'type' in target && target.type === 'line-info';\n}\n\nfunction queryHTMLElement(\n parent: HTMLElement | undefined,\n query: string\n): HTMLElement | undefined {\n const element = parent?.querySelector(query);\n return element instanceof HTMLElement ? element : undefined;\n}\n\nfunction getLineTypeFromElement(element: HTMLElement): LineTypes | undefined {\n const lineType = element.getAttribute('data-line-type');\n if (lineType == null) {\n return undefined;\n }\n switch (lineType) {\n case 'change-deletion':\n case 'change-addition':\n case 'context':\n case 'context-expanded':\n return lineType;\n default:\n return undefined;\n }\n}\n\nfunction isGutterUtilityPointerPath(\n path: (EventTarget | undefined)[]\n): boolean {\n for (const element of path) {\n if (\n element instanceof HTMLElement &&\n element.hasAttribute('data-utility-button')\n ) {\n return true;\n }\n }\n return false;\n}\n\nfunction debugLogIfEnabled(\n debugLogType: LogTypes | undefined = 'none',\n logIfType: 'move' | 'click',\n ...args: unknown[]\n) {\n switch (debugLogType) {\n case 'none':\n return;\n case 'both':\n break;\n case 'click':\n if (logIfType !== 'click') {\n return;\n }\n break;\n case 'move':\n if (logIfType !== 'move') {\n return;\n }\n break;\n }\n console.log(...args);\n}\n"],"mappings":";;;;;;AA4JA,IAAa,qBAAb,MAAsE;CACpE,AAAQ;CACR,AAAQ;CAER,AAAQ;CACR,AAAQ;CACR,AAAQ;CAER,AAAQ,uBAAuB;CAC/B,AAAQ,6BAA6B;CAErC,AAAQ,sBAAsB;CAC9B,AAAQ,8BAA8B;CAEtC,AAAQ,gBAA0C;CAClD,AAAQ;CACR,AAAQ;CACR,AAAQ;CACR,AAAQ,iBAAiC,EAAE,MAAM,QAAQ;CAEzD,YACE,AAAQA,MACR,AAAQC,SACR;EAFQ;EACA;;CAGV,WAAW,SAAiD;AAC1D,OAAK,UAAU;;CAGjB,UAAgB;AACd,OAAK,KAAK,oBAAoB,SAAS,KAAK,mBAAmB;AAC/D,OAAK,KAAK,oBAAoB,eAAe,KAAK,kBAAkB;AACpE,OAAK,KAAK,oBAAoB,eAAe,KAAK,kBAAkB;AACpE,OAAK,KAAK,oBAAoB,gBAAgB,KAAK,mBAAmB;AACtE,OAAK,KAAK,gBAAgB,yBAAyB;AACnD,OAAK,KAAK,gBAAgB,gCAAgC;AAC1D,OAAK,MAAM;AACX,OAAK,wBAAwB,QAAQ;AACrC,OAAK,yBAAyB;AAC9B,OAAK,sBAAsB;AAC3B,OAAK,oBAAoB;AACzB,OAAK,kBAAkB;AACvB,OAAK,gCAAgC;AACrC,OAAK,qBAAqB;AAC1B,MAAI,KAAK,yBAAyB,MAAM;AACtC,wBAAqB,KAAK,sBAAsB;AAChD,QAAK,wBAAwB;;AAE/B,OAAK,uBAAuB;AAC5B,OAAK,6BAA6B;AAClC,OAAK,sBAAsB;;CAG7B,MAAM,KAA2B;AAC/B,OAAK,mBAAmB;EACxB,MAAM,EAAE,0BAA0B,OAAO,sBAAsB,UAC7D,KAAK;AAGP,MADqB,KAAK,QAAQ,KAChB;AAChB,QAAK,SAAS;AACd,QAAK,MAAM;;AAGb,MAAI,oBACF,MAAK,wBAAwB,wBAAwB;WAC5C,KAAK,0BAA0B,MAAM;AAC9C,QAAK,uBAAuB,QAAQ;AACpC,QAAK,yBAAyB;AAC9B,QAAK,sBAAsB;AAC3B,QAAK,oBAAoB;AACzB,OAAI,KAAK,eAAe,SAAS,mBAAmB;AAClD,SAAK,qBAAqB;AAC1B,SAAK,gCAAgC;;;AAIzC,OAAK,qBAAqB,IAAI;AAC9B,OAAK,iCAAiC;AACtC,OAAK,iBAAiB;;CAGxB,oBAA0B;AACxB,OAAK,yBAAyB;;CAGhC,mBAA4B;AAC1B,SAAO,KAAK,2BAA2B;;CAGzC,aAAa,OAAuC;EAClD,MAAM,gBAAgB,EACpB,UAAU,KAAK,iBACf,mBAAmB,SAAS,QAAW,KAAK,iBAAiB,OAAU;AAEzE,MAAI,CAAC,KAAK,kBAAkB,IAAI,CAAC,cAC/B;AAEF,OAAK,gBAAgB;AACrB,OAAK,iBAAiB;AACtB,MAAI,cACF,MAAK,0BAA0B;;CAInC,eAAyC;AACvC,SAAO,KAAK;;CAGd,uBAAgE;AAC9D,MAAI,KAAK,eAAe,MAAM;AAC5B,OAAI,KAAK,SAAS,UAAU,KAAK,YAAY,SAAS,YACpD,QAAO;IACL,YAAY,KAAK,YAAY;IAC7B,MAAM,KAAK,YAAY;IACxB;AAEH,OAAI,KAAK,SAAS,UAAU,KAAK,YAAY,SAAS,OACpD,QAAO,EACL,YAAY,KAAK,YAAY,YAC9B;;;CAMP,sBAAsB,UAA4B;EAChD,MAAM,EAAE,cAAc,aAAa,sBAAsB,KAAK;AAC9D,MACE,gBAAgB,QAChB,eAAe,QACf,qBAAqB,KAErB;AAEF,MACE,KAAK,QAAQ,wBAAwB,QACrC,2BAA2B,MAAM,cAAc,CAAC,CAEhD;AAEF,oBACE,KAAK,QAAQ,sBACb,SACA,sCACA,MACD;AACD,OAAK,mBAAmB;GAAE,WAAW;GAAS;GAAO,CAAC;;CAGxD,qBAAqB,UAA8B;EACjD,MAAM,EACJ,qBAAqB,YACrB,aACA,aACA,sBAAsB,UACpB,KAAK;AACT,MACE,uBAAuB,cACvB,CAAC,uBACD,eAAe,QACf,eAAe,KAEf;AAEF,oBACE,KAAK,QAAQ,sBACb,QACA,qCACA,MACD;AAGD,OAAK,mBAAmB;GAAE,WAAW;GAAQ;GAAO,CAAC;;CAGvD,sBAAsB,UAA8B;EAClD,MAAM,EAAE,yBAAyB,KAAK;AACtC,oBACE,sBACA,QACA,8CACD;AACD,MAAI,KAAK,eAAe,MAAM;AAC5B,qBACE,sBACA,QACA,qEACD;AACD;;AAEF,OAAK,wBAAwB,QAAQ;AACrC,OAAK,QAAQ,cAAc;GACzB,GAAG,KAAK;GACR;GACD,CAAuC;AACxC,OAAK,kBAAkB;;CAGzB,AAAQ,mBAAmB,EAAE,WAAW,SAAkC;EACxE,MAAM,EAAE,yBAAyB,KAAK;EACtC,MAAM,eAAe,MAAM,cAAc;AACzC,oBACE,sBACA,WACA,sCACA;GAAE;GAAW;GAAc,CAC5B;EACD,MAAM,SAAS,KAAK,qBAAqB,aAAa;AACtD,oBACE,sBACA,WACA,mEACA,OACD;EAED,MAAM,EACJ,aACA,mBACA,aACA,aACA,iBACE,KAAK;AAET,UAAQ,WAAR;GACE,KAAK;AACH,QACE,oBAAoB,OAAO,IAC3B,KAAK,aAAa,gBAAgB,OAAO,YAEzC;AAEF,QAAI,KAAK,eAAe,MAAM;AAC5B,UAAK,wBAAwB,QAAQ;AACrC,mBAAc;MACZ,GAAG,KAAK;MACD;MACR,CAAuC;AACxC,UAAK,kBAAkB;;AAEzB,QAAI,oBAAoB,OAAO,EAAE;AAC/B,UAAK,eAAe,KAAK,iBAAiB,OAAO,CAAC;AAClD,SAAI,KAAK,0BAA0B,KACjC,QAAO,cAAc,YAAY,KAAK,uBAAuB;AAE/D,mBAAc;MACZ,GAAG,KAAK;MACD;MACR,CAAuC;;AAE1C;GAEF,KAAK,SAAS;AACZ,QAAI,UAAU,KACZ;AAEF,QAAI,uBAAuB,OAAO,IAAI,gBAAgB,MAAM;AAC1D,kBAAa,OAAO,WAAW,OAAO,WAAW,MAAM,SAAS;AAChE;;AAEF,QAAI,CAAC,oBAAoB,OAAO,CAC9B;IAGF,MAAM,YAAY,KAAK,iBAAiB,OAAO;AAC/C,QAAI,qBAAqB,QAAQ,OAAO,aACtC,mBAAkB;KAChB,GAAG;KACI;KACR,CAA2B;aACnB,eAAe,KACxB,aAAY;KACV,GAAG;KACI;KACR,CAA2B;AAE9B;;;;CAKN,AAAQ,qBAAqB,KAA2B;EACtD,MAAM,EACJ,sBACA,qBAAqB,YACrB,aACA,mBACA,aACA,aACA,cACA,sBAAsB,OACtB,sBAAsB,OACtB,yBACE,KAAK;EACT,MAAM,wBAAwB,wBAAwB;EACtD,MAAM,+BACJ,uBAAuB,cACvB,eAAe,QACf,qBAAqB,QACrB,gBAAgB,QAChB,eAAe,QACf,eAAe,QACf,uBACA,uBACA;AAEF,MAAI,gCAAgC,CAAC,KAAK,qBAAqB;AAC7D,OAAI,iBAAiB,SAAS,KAAK,mBAAmB;AACtD,OAAI,iBAAiB,eAAe,KAAK,kBAAkB;AAC3D,OAAI,iBAAiB,eAAe,KAAK,kBAAkB;AAC3D,OAAI,iBAAiB,gBAAgB,KAAK,mBAAmB;AAC7D,QAAK,sBAAsB;AAE3B,qBACE,sBACA,SACA,2EACO;IACL,MAAMC,UAAoB,EAAE;AAC5B,QACE,yBAAyB,UACzB,yBAAyB,SACzB;AACA,SAAI,eAAe,KACjB,SAAQ,KAAK,cAAc;AAE7B,SAAI,qBAAqB,KACvB,SAAQ,KAAK,oBAAoB;AAEnC,SAAI,gBAAgB,KAClB,SAAQ,KAAK,6BAA6B;;AAG9C,WAAO;OACL,CACL;AACD,qBACE,sBACA,QACA,oEACD;AACD,qBACE,sBACA,QACA,qEACD;aACQ,CAAC,gCAAgC,KAAK,qBAAqB;AACpE,OAAI,oBAAoB,SAAS,KAAK,mBAAmB;AACzD,OAAI,oBAAoB,eAAe,KAAK,kBAAkB;AAC9D,OAAI,oBAAoB,eAAe,KAAK,kBAAkB;AAC9D,OAAI,oBAAoB,gBAAgB,KAAK,mBAAmB;AAChE,QAAK,sBAAsB;;EAG7B,MAAM,gCACJ,KAAK,eAAe,SAAS,eAC7B,KAAK,eAAe,SAAS;EAC/B,MAAM,kCACJ,KAAK,eAAe,SAAS;AAC/B,MACG,CAAC,uBAAuB,iCACxB,CAAC,yBAAyB,iCAC3B;AACA,QAAK,qBAAqB;AAC1B,QAAK,gCAAgC;AACrC,QAAK,kBAAkB;AACvB,QAAK,6BAA6B;;;CAItC,AAAQ,kCAAwC;AAC9C,MAAI,KAAK,OAAO,KACd;EAGF,MAAM,EACJ,aACA,mBACA,sBAAsB,UACpB,KAAK;EAET,MAAM,6BAA6B,eAAe;EAClD,MAAM,mCACJ,qBAAqB,QAAQ;AAE/B,MAAI,8BAA8B,CAAC,KAAK,sBAAsB;AAC5D,QAAK,IAAI,aAAa,0BAA0B,GAAG;AACnD,QAAK,uBAAuB;aACnB,CAAC,8BAA8B,KAAK,sBAAsB;AACnE,QAAK,IAAI,gBAAgB,yBAAyB;AAClD,QAAK,uBAAuB;;AAG9B,MAAI,oCAAoC,CAAC,KAAK,4BAA4B;AACxE,QAAK,IAAI,aAAa,iCAAiC,GAAG;AAC1D,QAAK,6BAA6B;aAElC,CAAC,oCACD,KAAK,4BACL;AACA,QAAK,IAAI,gBAAgB,gCAAgC;AACzD,QAAK,6BAA6B;;;CAItC,AAAQ,qBAAqB,UAA8B;AACzD,MACG,MAAM,gBAAgB,WAAW,MAAM,WAAW,KACnD,KAAK,OAAO,QACZ,KAAK,eAAe,SAAS,OAE7B;EAGF,MAAM,OAAO,MAAM,cAAc;AACjC,MACE,2BAA2B,KAAK,IAChC,KAAK,QAAQ,wBAAwB,KAErC,MAAK,oCAAoC,OAAO,KAAK;MAErD,MAAK,kCAAkC,OAAO,KAAK;;CAIvD,AAAQ,kCACN,OACA,MACM;EACN,MAAM,EAAE,sBAAsB,UAAU,KAAK;AAC7C,MAAI,CAAC,oBACH;EAGF,MAAM,cAAc,KAAK,wBAAwB,MAAM,KAAK;AAC5D,MAAI,eAAe,KACjB;EAGF,MAAM,EAAE,QAAQ;AAChB,MAAI,OAAO,KACT;AAGF,QAAM,gBAAgB;EACtB,MAAM,EAAE,YAAY,WAAW,cAAc;AAE7C,MAAI,MAAM,YAAY,KAAK,iBAAiB,MAAM;GAChD,MAAM,WAAW,KAAK,wBACpB,KAAK,eACL,IAAI,aAAa,iBAAiB,KAAK,QACxC;AACD,OAAI,YAAY,KACd;GAEF,MAAM,WACJ,SAAS,SAAS,SAAS,MACvB,aAAa,SAAS,QACtB,aAAa,SAAS;AAC5B,QAAK,kBAAkB;IACrB,YAAY,WACR,KAAK,cAAc,QACnB,KAAK,cAAc;IACvB,MAAM,WACF,KAAK,cAAc,OAClB,KAAK,cAAc,WAAW,KAAK,cAAc;IACvD;AACD,QAAK,gBAAgB,YAAY,WAAW,MAAM;AAClD,QAAK,qBAAqB,KAAK,cAAc;AAC7C,QAAK,iBAAiB;IAAE,MAAM;IAAa,WAAW,MAAM;IAAW;AACvE,QAAK,gCAAgC;AACrC;;AAGF,MACE,KAAK,eAAe,UAAU,cAC9B,KAAK,eAAe,QAAQ,YAC5B;GACA,MAAM,QAAQ;IAAE;IAAY,MAAM;IAAW;AAC7C,QAAK,kBAAkB;AACvB,QAAK,iBAAiB;IACpB,MAAM;IACN,WAAW,MAAM;IACjB,QAAQ;IACR,SAAS;IACV;AACD,QAAK,gCAAgC;AACrC;;AAGF,OAAK,gBAAgB;AACrB,OAAK,kBAAkB;GAAE;GAAY,MAAM;GAAW;AACtD,OAAK,gBAAgB,YAAY,WAAW,MAAM;AAClD,OAAK,qBAAqB,KAAK,cAAc;AAC7C,OAAK,iBAAiB;GAAE,MAAM;GAAa,WAAW,MAAM;GAAW;AACvE,OAAK,gCAAgC;;CAGvC,AAAQ,oCACN,OACA,MACM;EACN,MAAM,EAAE,sBAAsB,OAAO,yBAAyB,KAAK;AACnE,MAAI,wBAAwB,KAC1B;EAEF,MAAM,QAAQ,KAAK,0BAA0B,KAAK;AAClD,MAAI,SAAS,KACX;AAEF,QAAM,gBAAgB;AACtB,QAAM,iBAAiB;AACvB,OAAK,iBAAiB;GACpB,MAAM;GACN,WAAW,MAAM;GACjB,QAAQ;GACR,SAAS;GACV;AACD,MAAI,qBAAqB;AACvB,QAAK,kBAAkB;IACrB,YAAY,MAAM;IAClB,MAAM,MAAM;IACb;AACD,QAAK,gBAAgB,MAAM,YAAY,MAAM,MAAM,MAAM;AACzD,QAAK,qBAAqB,KAAK,cAAc;;AAE/C,OAAK,gCAAgC;;CAGvC,AAAQ,6BAA6B,UAA8B;EACjE,MAAM,EAAE,sBAAsB,UAAU,KAAK;AAC7C,UAAQ,KAAK,eAAe,MAA5B;GACE,KAAK,OACH;GACF,KAAK,mBAAmB;AACtB,QAAI,MAAM,cAAc,KAAK,eAAe,UAC1C;IAEF,MAAM,QAAQ,KAAK,0BAA0B,MAAM,cAAc,CAAC;AAClE,QAAI,SAAS,KACX;AAEF,SAAK,eAAe,UAAU;AAC9B,QAAI,wBAAwB,KAC1B,MAAK,gBAAgB,MAAM,YAAY,MAAM,KAAK;AAEpD;;GAEF,KAAK,aAAa;AAChB,QAAI,MAAM,cAAc,KAAK,eAAe,UAC1C;IAEF,MAAM,cAAc,KAAK,wBACvB,MAAM,cAAc,EACpB,MACD;AACD,QAAI,eAAe,QAAQ,KAAK,mBAAmB,KACjD;AAEF,SAAK,gBAAgB,YAAY,YAAY,YAAY,UAAU;AACnE;;GAEF,KAAK,6BAA6B;AAChC,QAAI,MAAM,cAAc,KAAK,eAAe,UAC1C;IAEF,MAAM,cAAc,KAAK,wBACvB,MAAM,cAAc,EACpB,MACD;AACD,QAAI,eAAe,QAAQ,KAAK,mBAAmB,KACjD;IAEF,MAAM,QAAQ;KACZ,YAAY,YAAY;KACxB,MAAM,YAAY;KACnB;AACD,QAAI,wBAAwB,KAAK,eAAe,SAAS,MAAM,CAC7D;AAEF,SAAK,gBACH,YAAY,YACZ,YAAY,WACZ,MACD;AACD,SAAK,qBAAqB,KAAK,cAAc;AAC7C,SAAK,4BAA4B;AACjC,SAAK,iBAAiB;KACpB,MAAM;KACN,WAAW,MAAM;KAClB;AACD;;;;CAKN,AAAQ,2BAA2B,UAA8B;EAC/D,MAAM,EAAE,sBAAsB,OAAO,yBAAyB,KAAK;AACnE,UAAQ,KAAK,eAAe,MAA5B;GACE,KAAK,OACH;GACF,KAAK,mBAAmB;AACtB,QAAI,MAAM,cAAc,KAAK,eAAe,UAC1C;IAEF,MAAM,QAAQ,KAAK,0BAA0B,MAAM,cAAc,CAAC;AAClE,QAAI,SAAS,MAAM;AACjB,UAAK,eAAe,UAAU;AAC9B,SAAI,oBACF,MAAK,gBAAgB,MAAM,YAAY,MAAM,KAAK;;AAGtD,2BACE,KAAK,uBACH,KAAK,eAAe,QACpB,KAAK,eAAe,QACrB,CACF;AACD,SAAK,kBAAkB;AACvB,QAAI,qBAAqB;AACvB,UAAK,mBAAmB,KAAK,cAAc;AAC3C,UAAK,0BAA0B;;AAEjC,SAAK,qBAAqB;AAC1B,SAAK,gCAAgC;AACrC;;GAEF,KAAK;AACH,QAAI,MAAM,cAAc,KAAK,eAAe,UAC1C;AAEF,SAAK,gBAAgB,MAAM,QAAW,MAAM;AAC5C,SAAK,kBAAkB;AACvB,SAAK,6BAA6B;AAClC,SAAK,gCAAgC;AACrC,SAAK,mBAAmB,KAAK,cAAc;AAC3C,SAAK,0BAA0B;AAC/B;GAEF,KAAK;AACH,QAAI,MAAM,cAAc,KAAK,eAAe,UAC1C;AAEF,SAAK,kBAAkB;AACvB,SAAK,gCAAgC;AACrC,SAAK,qBAAqB;AAC1B,SAAK,mBAAmB,KAAK,cAAc;AAC3C,SAAK,0BAA0B;;;CAKrC,AAAQ,+BAA+B,UAA8B;AACnE,UAAQ,KAAK,eAAe,MAA5B;GACE,KAAK,OACH;GACF,KAAK;GACL,KAAK;GACL,KAAK;AACH,QAAI,eAAe,KAAK,gBACtB;SAAI,MAAM,cAAc,KAAK,eAAe,UAC1C;;AAGJ,SAAK,kBAAkB;AACvB,SAAK,6BAA6B;AAClC,SAAK,qBAAqB;AAC1B,SAAK,gCAAgC;;;CAK3C,AAAQ,mBAAmB;AACzB,MAAI,KAAK,eAAe,KACtB;AAEF,OAAK,YAAY,YAAY,gBAAgB,eAAe;AAC5D,OAAK,YAAY,cAAc,gBAAgB,eAAe;AAC9D,OAAK,cAAc;;CAGrB,AAAQ,eAAe,aAAoC;EACzD,MAAM,EAAE,qBAAqB,eAAe,KAAK;AACjD,MAAI,KAAK,eAAe,KACtB,MAAK,kBAAkB;AAEzB,OAAK,cAAc;AACnB,MAAI,uBAAuB,YAAY;AACrC,OAAI,uBAAuB,UAAU,uBAAuB,OAC1D,MAAK,YAAY,YAAY,aAAa,gBAAgB,GAAG;AAE/D,OAAI,uBAAuB,UAAU,uBAAuB,SAC1D,MAAK,YAAY,cAAc,aAAa,gBAAgB,GAAG;;;CAKrE,AAAQ,wBAAwB,wBAAuC;AACrE,MAAI,KAAK,0BAA0B,MAAM;AACvC,QAAK,yBAAyB,SAAS,cAAc,MAAM;AAC3D,QAAK,uBAAuB,aAAa,4BAA4B,GAAG;;AAE1E,MAAI,wBAAwB;AAC1B,OAAI,KAAK,uBAAuB,MAAM;AACpC,SAAK,oBAAoB,QAAQ;AACjC,SAAK,sBAAsB;;AAE7B,OAAI,KAAK,qBAAqB,MAAM;AAClC,SAAK,oBAAoB,SAAS,cAAc,OAAO;AACvD,SAAK,kBAAkB,OAAO;;AAEhC,OAAI,KAAK,kBAAkB,eAAe,KAAK,uBAC7C,MAAK,uBAAuB,gBAAgB,KAAK,kBAAkB;SAEhE;AACL,QAAK,mBAAmB,QAAQ;AAChC,QAAK,oBAAoB;AACzB,OAAI,KAAK,uBAAuB,MAAM;IACpC,MAAM,UAAU,SAAS,cAAc,MAAM;AAC7C,YAAQ,YAAY,OAAO,4BAA4B,CAAC;IACxD,MAAM,gBAAgB,QAAQ;AAC9B,QAAI,EAAE,yBAAyB,mBAC7B,OAAM,IAAI,MACR,8EACD;AAEH,kBAAc,QAAQ;AACtB,SAAK,sBAAsB;;AAE7B,OAAI,KAAK,oBAAoB,eAAe,KAAK,uBAC/C,MAAK,uBAAuB,gBAAgB,KAAK,oBAAoB;;;CAK3E,AAAQ,iCAAuC;AAC7C,MAAI,KAAK,4BACP;AAEF,WAAS,iBAAiB,eAAe,KAAK,0BAA0B;AACxE,WAAS,iBAAiB,aAAa,KAAK,wBAAwB;AACpE,WAAS,iBACP,iBACA,KAAK,4BACN;AACD,OAAK,8BAA8B;;CAGrC,AAAQ,iCAAuC;AAC7C,MAAI,CAAC,KAAK,4BACR;AAEF,WAAS,oBAAoB,eAAe,KAAK,0BAA0B;AAC3E,WAAS,oBAAoB,aAAa,KAAK,wBAAwB;AACvE,WAAS,oBACP,iBACA,KAAK,4BACN;AACD,OAAK,8BAA8B;;CAGrC,AAAQ,sBAA4B;AAClC,OAAK,iBAAiB,EAAE,MAAM,QAAQ;;CAGxC,AAAQ,8BAAoC;AAC1C,MAAI,KAAK,eAAe,SAAS,4BAC/B,MAAK,iBAAiB,EAAE,MAAM,QAAQ;;CAI1C,AAAQ,wBACN,MACA,qBACkC;EAClC,MAAM,SAAS,KAAK,qBAAqB,KAAK;AAC9C,MAAI,CAAC,oBAAoB,OAAO,CAC9B;AAEF,MAAI,uBAAuB,CAAC,OAAO,aACjC;AAEF,MAAI,OAAO,kBAAkB,KAC3B;AAGF,SAAO;GACL,WAAW,OAAO;GAClB,YAAY,OAAO;GACnB,WAAW,KAAK,SAAS,SAAS,OAAO,OAAO;GACjD;;CAGH,AAAQ,0BACN,MAC4B;EAC5B,MAAM,SAAS,KAAK,qBAAqB,KAAK;AAC9C,MAAI,CAAC,oBAAoB,OAAO,CAC9B;AAEF,SAAO;GACL,YAAY,OAAO;GACnB,MAAM,KAAK,SAAS,SAAS,OAAO,OAAO;GAC5C;;CAGH,AAAQ,aACN,YACA,MAC8B;EAC9B,MAAM,EAAE,iBAAiB,KAAK;AAC9B,SAAO,gBAAgB,OACnB,aAAa,YAAY,KAAK,GAC9B,CAAC,aAAa,GAAG,aAAa,EAAE;;CAGtC,AAAQ,gBACN,aACA,MACA,aAAa,MACP;EACN,MAAM,EAAE,eAAe,kBAAkB;EACzC,IAAIC;AACJ,MAAI,eAAe,KACjB,aAAY;OACP;GACL,MAAM,aAAa,KAAK,iBAAiB,QAAQ;GACjD,MAAM,aAAa,KAAK,iBAAiB,cAAc;AACvD,eAAY,KAAK,oBACf,YACA,aACA,YACA,KACD;;AAEH,MACE,mBAAmB,iBAAiB,QAAW,aAAa,OAAU,CAEtE;AAEF,OAAK,gBAAgB;AACrB,MAAI,WACF,MAAK,4BAA4B;AAEnC,OAAK,0BAA0B,sBAAsB,KAAK,gBAAgB;;CAG5E,AAAQ,wBACN,eACA,OAC4C;AAC5C,MAAI,KAAK,OAAO,KACd;EAEF,MAAM,eAAe,KAAK,aACxB,cAAc,OACd,cAAc,KACf;EACD,MAAM,eAAe,KAAK,aACxB,cAAc,KACd,cAAc,WAAW,cAAc,KACxC;AAED,SAAO,gBAAgB,QAAQ,gBAAgB,OAC3C;GACE,OAAO,QAAQ,aAAa,KAAK,aAAa;GAC9C,KAAK,QAAQ,aAAa,KAAK,aAAa;GAC7C,GACD;;CAGN,AAAQ,wBAA8B;AACpC,MAAI,KAAK,yBAAyB,MAAM;AACtC,wBAAqB,KAAK,sBAAsB;AAChD,QAAK,wBAAwB;;AAE/B,MACE,KAAK,OAAO,QACZ,KAAK,2BAA2B,KAAK,cAErC;EAGF,MAAM,cAAc,KAAK,IAAI,iBAAiB,uBAAuB;AACrE,OAAK,MAAM,WAAW,YACpB,SAAQ,gBAAgB,qBAAqB;AAG/C,OAAK,yBAAyB,KAAK;AACnC,MAAI,KAAK,iBAAiB,KACxB;EAGF,MAAM,EAAE,UAAU,iBAAiB,KAAK;AACxC,MAAI,aAAa,WAAW,EAC1B;AAEF,MAAI,aAAa,SAAS,GAAG;AAC3B,WAAQ,MAAM,aAAa;AAC3B,SAAM,IAAI,MACR,qFACD;;EAEH,MAAM,QAAQ,KAAK,IAAI,aAAa,iBAAiB,KAAK;EAC1D,MAAM,WAAW,KAAK,wBAAwB,KAAK,eAAe,MAAM;AACxE,MAAI,YAAY,MAAM;AACpB,WAAQ,MAAM;IAAE;IAAU,eAAe,KAAK;IAAe,CAAC;AAC9D,SAAM,IAAI,MAAM,wDAAwD;;EAE1E,MAAM,WAAW,SAAS,UAAU,SAAS;EAC7C,MAAM,QAAQ,KAAK,IAAI,SAAS,OAAO,SAAS,IAAI;EACpD,MAAM,OAAO,KAAK,IAAI,SAAS,OAAO,SAAS,IAAI;AACnD,OAAK,MAAM,QAAQ,cAAc;GAC/B,MAAM,CAAC,QAAQ,WAAW,KAAK;GAC/B,MAAM,MAAM,QAAQ,SAAS;AAC7B,OAAI,QAAQ,OAAO,SAAS,OAC1B,OAAM,IAAI,MACR,iGACD;AAEH,QAAK,IAAI,IAAI,GAAG,IAAI,KAAK,KAAK;IAC5B,MAAM,iBAAiB,QAAQ,SAAS;IACxC,MAAM,gBAAgB,OAAO,SAAS;AACtC,QACE,EAAE,0BAA0B,gBAC5B,EAAE,yBAAyB,aAE3B;IAGF,MAAM,YAAY,KAAK,eAAe,gBAAgB,MAAM;AAC5D,SAAK,aAAa,KAAK,KACrB;AAEF,QAAI,aAAa,QAAQ,YAAY,MACnC;IAEF,IAAI,iBAAiB,WACjB,WACA,cAAc,QACZ,UACA,cAAc,OACZ,SACA;AACR,mBAAe,aAAa,sBAAsB,eAAe;AACjE,kBAAc,aAAa,sBAAsB,eAAe;AAChE,QACE,cAAc,uBAAuB,eACrC,eAAe,uBAAuB,eACtC,eAAe,YAAY,aAAa,uBAAuB,EAC/D;AACA,SAAI,UAAU;AACZ,uBAAiB;AACjB,qBAAe,aAAa,sBAAsB,QAAQ;gBACjD,cAAc,MACvB,kBAAiB;cACR,cAAc,KACvB,gBAAe,aAAa,sBAAsB,GAAG;AAEvD,oBAAe,YAAY,aACzB,sBACA,eACD;AACD,mBAAc,YAAY,aACxB,sBACA,eACD;;;;;CAMT,AAAQ,2BAAiC;AACvC,OAAK,QAAQ,iBAAiB,KAAK,iBAAiB,KAAK;;CAG3D,AAAQ,6BAAmC;AACzC,OAAK,QAAQ,wBAAwB,KAAK,iBAAiB,KAAK;;CAGlE,AAAQ,qBAAqB,OAAuC;AAClE,OAAK,QAAQ,uBAAuB,MAAM;;CAG5C,AAAQ,mBAAmB,OAAuC;AAChE,OAAK,QAAQ,qBAAqB,MAAM;;CAG1C,AAAQ,iBACN,QACuB;AACvB,MAAI,KAAK,SAAS,OAChB,QAAO;GACL,MAAM;GACN,aAAa,OAAO;GACpB,YAAY,OAAO;GACnB,cAAc,OAAO;GACrB,eAAe,OAAO;GACvB;AAGH,SAAO;GACL,MAAM;GACN,gBAAgB,OAAO;GACvB,UAAU,OAAO;GACjB,aAAa,OAAO;GACpB,eAAe,OAAO;GACtB,YAAY,OAAO;GACnB,cAAc,OAAO;GACtB;;CAGH,AAAQ,uBACN,QACA,SACmB;AACnB,SAAO,KAAK,oBACV,OAAO,YACP,QAAQ,YACR,OAAO,MACP,QAAQ,KACT;;CAGH,AAAQ,oBACN,OACA,KACA,MACA,SACmB;AACnB,SAAO;GACL;GACA;GACA,GAAI,QAAQ,OAAO,EAAE,MAAM,GAAG,EAAE;GAChC,GAAI,SAAS,WAAW,WAAW,OAAO,EAAE,SAAS,GAAG,EAAE;GAC3D;;CAGH,AAAQ,qBACN,MAC0C;EAC1C,IAAI,eAAe;EACnB,IAAIC;EACJ,IAAIC;EACJ,IAAIC;EACJ,IAAIC;EACJ,IAAIC;EACJ,IAAIC;EAMJ,IAAIC;AAEJ,OAAK,MAAM,WAAW,MAAM;AAC1B,OAAI,EAAE,mBAAmB,aACvB;GAGF,MAAM,eACJ,iBAAiB,OACZ,QAAQ,aAAa,qBAAqB,IAAI,SAC/C;AACN,OAAI,gBAAgB,MAAM;AACxB,oBAAgB;AAChB,iBAAa,OAAO,SAAS,cAAc,GAAG;AAC9C,mBAAe;AACf,eAAW,uBAAuB,QAAQ;AAC1C,qBAAiB,QAAQ,aAAa,kBAAkB,IAAI;AAC5D;;GAGF,MAAM,WACJ,eAAe,OACV,QAAQ,aAAa,YAAY,IAAI,SACtC;AACN,OAAI,YAAY,MAAM;AACpB,kBAAc;AACd,iBAAa,OAAO,SAAS,UAAU,GAAG;AAC1C,eAAW,uBAAuB,QAAQ;AAC1C,qBAAiB,QAAQ,aAAa,kBAAkB,IAAI;AAC5D;;AAGF,OAAI,cAAc,QAAQ,QAAQ,aAAa,qBAAqB,EAAE;AACpE,iBAAa;KACX,WAAW;KACX,kBAAkB;AAChB,UAAI,QAAQ,aAAa,iBAAiB,CACxC,QAAO;AAET,UAAI,QAAQ,aAAa,mBAAmB,CAC1C,QAAO;AAET,aAAO;SACL;KACL;AACD;;GAGF,MAAM,mBACJ,cAAc,OACT,QAAQ,aAAa,oBAAoB,IAAI,SAC9C;AACN,OAAI,cAAc,QAAQ,oBAAoB,MAAM;IAClD,MAAM,cAAc,OAAO,SAAS,kBAAkB,GAAG;AACzD,QAAI,CAAC,OAAO,MAAM,YAAY,CAC5B,YAAW,YAAY;AAEzB;;AAGF,OAAI,eAAe,QAAQ,QAAQ,aAAa,YAAY,EAAE;AAC5D,kBAAc;AACd;;;AAIJ,MAAI,YAAY,aAAa,KAC3B,QAAO;GACL,MAAM;GACN,WAAW,WAAW;GACtB,WAAW,WAAW;GACvB;AAGH,kBACE,kBAAkB,OACd,iBACE,aACA,gCAAgC,eAAe,IAChD,GACD;AACN,oBACE,kBAAkB,OACd,iBACE,aACA,yCAAyC,eAAe,IACzD,GACD;AAEN,MACE,eAAe,QACf,eAAe,QACf,iBAAiB,QACjB,YAAY,QACZ,cAAc,QACd,OAAO,MAAM,WAAW,CAExB;EAGF,MAAM,iBAAiB,KAAK,eAAe,aAAa,KAAK,aAAa,CAAC;AAE3E,MAAI,KAAK,SAAS,OAChB,QAAO;GACL,MAAM;GACN;GACA;GACA;GACA;GACA;GACA,MAAM;GACN;GACD;EAGH,MAAMC,wBAAwC;AAC5C,WAAQ,UAAR;IACE,KAAK,kBACH,QAAO;IACT,KAAK,kBACH,QAAO;IACT,QACE,QAAO,YAAY,aAAa,iBAAiB,GAC7C,cACA;;MAEN;AAEJ,SAAO;GACL,MAAM;GACN;GACA;GACA;GACA;GACA;GACA,MAAM;GACN;GACD;;CAGH,AAAQ,cAAuB;AAC7B,SAAO,KAAK,KAAK,aAAa,iBAAiB,KAAK;;CAGtD,AAAQ,eACN,SACA,OACoB;EACpB,MAAM,eAAe,QAAQ,aAAa,kBAAkB,IAAI,IAC7D,MAAM,IAAI,CACV,KAAK,UAAU,OAAO,SAAS,OAAO,GAAG,CAAC,CAC1C,QAAQ,UAAU,CAAC,OAAO,MAAM,MAAM,CAAC;AAE1C,MAAI,SAAS,YAAY,WAAW,EAClC,QAAO,YAAY;AAErB,MAAI,CAAC,MACH,QAAO,YAAY;;;AAiBzB,SAAgB,wBACd,EACE,qBACA,oBACA,oBACA,sBACA,aACA,aACA,aACA,mBACA,qBACA,oBACA,sBACA,qBACA,gBACA,sBACA,uBACA,sBAEF,cAKA,cACkC;AAClC,QAAO;EACL,qBAAqB,iCAAiC;GACpD;GACA;GACA;GACA;GACA;GACD,CAAC;EACF,yBACE,uBAAuB,QAAQ,sBAAsB;EACvD;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EAEA;EACD;;AAGH,SAAS,iCAEP,EACA,qBACA,oBACA,qBACA,oBACA,wBAQU;AACV,KAAI,wBAAwB,UAAa,uBAAuB,OAC9D,OAAM,IAAI,MACR,6GACD;AAEH,KAAI,uBAAuB,QAAQ,sBAAsB,KACvD,OAAM,IAAI,MACR,6GACD;AAEH,KACE,wBAAwB,SACvB,uBAAuB,QAAQ,sBAAsB,MAEtD,OAAM,IAAI,MACR,qJACD;AAEH,QAAO,uBAAuB,sBAAsB;;AAGtD,SAAS,oBACP,QACoC;AACpC,QAAO,UAAU,QAAQ,UAAU,UAAU,OAAO,SAAS;;AAG/D,SAAS,uBACP,QAC6B;AAC7B,QAAO,UAAU,UAAU,OAAO,SAAS;;AAG7C,SAAS,iBACP,QACA,OACyB;CACzB,MAAM,UAAU,QAAQ,cAAc,MAAM;AAC5C,QAAO,mBAAmB,cAAc,UAAU;;AAGpD,SAAS,uBAAuB,SAA6C;CAC3E,MAAM,WAAW,QAAQ,aAAa,iBAAiB;AACvD,KAAI,YAAY,KACd;AAEF,SAAQ,UAAR;EACE,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK,mBACH,QAAO;EACT,QACE;;;AAIN,SAAS,2BACP,MACS;AACT,MAAK,MAAM,WAAW,KACpB,KACE,mBAAmB,eACnB,QAAQ,aAAa,sBAAsB,CAE3C,QAAO;AAGX,QAAO;;AAGT,SAAS,kBACP,eAAqC,QACrC,WACA,GAAG,MACH;AACA,SAAQ,cAAR;EACE,KAAK,OACH;EACF,KAAK,OACH;EACF,KAAK;AACH,OAAI,cAAc,QAChB;AAEF;EACF,KAAK;AACH,OAAI,cAAc,OAChB;AAEF;;AAEJ,SAAQ,IAAI,GAAG,KAAK"}
@@ -1,13 +1,11 @@
1
1
  //#region src/managers/ResizeManager.d.ts
2
2
  declare class ResizeManager {
3
3
  private observedNodes;
4
- private timeoutID;
5
4
  private queuedUpdates;
6
5
  cleanUp(): void;
7
6
  private resizeObserver;
8
7
  setup(pre: HTMLPreElement, disableAnnotations: boolean): void;
9
8
  private handleResizeObserver;
10
- private queueColumnUpdate;
11
9
  private handleColumnChange;
12
10
  private applyNewHeight;
13
11
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ResizeManager.d.ts","names":["ResizeManager","HTMLPreElement"],"sources":["../../src/managers/ResizeManager.d.ts"],"sourcesContent":["export declare class ResizeManager {\n private observedNodes;\n private timeoutID;\n private queuedUpdates;\n cleanUp(): void;\n private resizeObserver;\n setup(pre: HTMLPreElement, disableAnnotations: boolean): void;\n private handleResizeObserver;\n private queueColumnUpdate;\n private handleColumnChange;\n private applyNewHeight;\n}\n//# sourceMappingURL=ResizeManager.d.ts.map"],"mappings":";cAAqBA,aAAAA;EAAAA,QAAAA,aAAa;;;;;aAMnBC"}
1
+ {"version":3,"file":"ResizeManager.d.ts","names":["ResizeManager","HTMLPreElement"],"sources":["../../src/managers/ResizeManager.d.ts"],"sourcesContent":["export declare class ResizeManager {\n private observedNodes;\n private queuedUpdates;\n cleanUp(): void;\n private resizeObserver;\n setup(pre: HTMLPreElement, disableAnnotations: boolean): void;\n private handleResizeObserver;\n private handleColumnChange;\n private applyNewHeight;\n}\n//# sourceMappingURL=ResizeManager.d.ts.map"],"mappings":";cAAqBA,aAAAA;EAAAA,QAAAA,aAAa;;;;aAKnBC"}
@@ -1,12 +1,11 @@
1
1
  //#region src/managers/ResizeManager.ts
2
2
  var ResizeManager = class {
3
3
  observedNodes = /* @__PURE__ */ new Map();
4
- timeoutID;
5
4
  queuedUpdates = /* @__PURE__ */ new Map();
6
5
  cleanUp() {
7
6
  this.resizeObserver?.disconnect();
8
7
  this.observedNodes.clear();
9
- if (this.timeoutID != null) clearTimeout(this.timeoutID);
8
+ this.queuedUpdates.clear();
10
9
  }
11
10
  resizeObserver;
12
11
  setup(pre, disableAnnotations) {
@@ -16,25 +15,38 @@ var ResizeManager = class {
16
15
  this.observedNodes.clear();
17
16
  for (const codeElement of codeElements) {
18
17
  let item = observedNodes.get(codeElement);
18
+ if (item != null && item.type !== "code") throw new Error("ResizeManager.setup: somehow a code node is being used for an annotation, should be impossible");
19
+ let numberElement = codeElement.firstElementChild;
20
+ if (!(numberElement instanceof HTMLElement)) numberElement = null;
19
21
  if (item != null) {
20
22
  this.observedNodes.set(codeElement, item);
21
23
  observedNodes.delete(codeElement);
22
- continue;
23
- }
24
- let numberElement = codeElement.querySelector("[data-gutter]");
25
- if (!(numberElement instanceof HTMLElement)) numberElement = null;
26
- item = {
27
- type: "code",
28
- codeElement,
29
- numberElement,
30
- codeWidth: "auto",
31
- numberWidth: 0
32
- };
33
- this.observedNodes.set(codeElement, item);
34
- this.resizeObserver.observe(codeElement);
35
- if (numberElement != null) {
36
- this.observedNodes.set(numberElement, item);
37
- this.resizeObserver.observe(numberElement);
24
+ if (item.numberElement !== numberElement) {
25
+ if (item.numberElement != null) this.resizeObserver.unobserve(item.numberElement);
26
+ if (numberElement != null) {
27
+ this.resizeObserver.observe(numberElement);
28
+ observedNodes.delete(numberElement);
29
+ this.observedNodes.set(numberElement, item);
30
+ }
31
+ item.numberElement = numberElement;
32
+ } else if (item.numberElement != null) {
33
+ observedNodes.delete(item.numberElement);
34
+ this.observedNodes.set(item.numberElement, item);
35
+ }
36
+ } else {
37
+ item = {
38
+ type: "code",
39
+ codeElement,
40
+ numberElement,
41
+ codeWidth: "auto",
42
+ numberWidth: 0
43
+ };
44
+ this.observedNodes.set(codeElement, item);
45
+ this.resizeObserver.observe(codeElement);
46
+ if (numberElement != null) {
47
+ this.observedNodes.set(numberElement, item);
48
+ this.resizeObserver.observe(numberElement);
49
+ }
38
50
  }
39
51
  }
40
52
  if (codeElements.length > 1 && !disableAnnotations) {
@@ -136,27 +148,26 @@ var ResizeManager = class {
136
148
  const newHeight = Math.max(item.column1.childHeight, item.column2.childHeight);
137
149
  this.applyNewHeight(item, newHeight);
138
150
  } else if (item.type === "code") {
139
- this.queuedUpdates.set(target, [item, specs]);
140
- this.queueColumnUpdate();
151
+ const update = [target, specs.inlineSize];
152
+ const updates = this.queuedUpdates.get(item) ?? [];
153
+ updates.push(update);
154
+ this.queuedUpdates.set(item, updates);
141
155
  }
142
156
  }
157
+ this.handleColumnChange();
143
158
  };
144
- queueColumnUpdate() {
145
- if (this.timeoutID != null) clearTimeout(this.timeoutID);
146
- this.timeoutID = setTimeout(this.handleColumnChange, 1e3 / 30);
147
- }
148
159
  handleColumnChange = () => {
149
- this.timeoutID = void 0;
150
- for (const [target, [item, specs]] of this.queuedUpdates) if (target === item.codeElement) {
151
- const inlineSize = Math.max(Math.floor(specs.inlineSize), 0);
160
+ for (const [item, updates] of this.queuedUpdates) for (const [target, targetInlineSize] of updates) if (target === item.codeElement) {
161
+ const inlineSize = Math.max(Math.floor(targetInlineSize), 0);
152
162
  if (inlineSize !== item.codeWidth) {
153
- item.codeWidth = inlineSize;
154
- const targetWidth = Math.max(item.codeWidth - item.numberWidth, 0);
155
- item.codeElement.style.setProperty("--diffs-column-content-width", `${targetWidth === 0 ? "auto" : `${targetWidth}px`}`);
156
- item.codeElement.style.setProperty("--diffs-column-width", `${item.codeWidth === 0 ? "auto" : `${item.codeWidth}px`}`);
163
+ const targetWidth = Math.max(inlineSize - item.numberWidth, 0);
164
+ item.codeWidth = inlineSize === 0 ? "auto" : inlineSize;
165
+ item.codeElement.style.setProperty("--diffs-column-content-width", `${targetWidth > 0 ? `${targetWidth}px` : "auto"}`);
166
+ item.codeElement.style.setProperty("--diffs-column-width", `${typeof item.codeWidth === "number" ? `${item.codeWidth}px` : "auto"}`);
157
167
  }
168
+ if (item.numberElement != null && typeof item.codeWidth === "number" && item.numberWidth === 0) updates.push([item.numberElement, item.numberElement.getBoundingClientRect().width]);
158
169
  } else if (target === item.numberElement) {
159
- const inlineSize = Math.max(Math.ceil(specs.inlineSize), 0);
170
+ const inlineSize = Math.max(Math.ceil(targetInlineSize), 0);
160
171
  if (inlineSize !== item.numberWidth) {
161
172
  item.numberWidth = inlineSize;
162
173
  item.codeElement.style.setProperty("--diffs-column-number-width", `${item.numberWidth === 0 ? "auto" : `${item.numberWidth}px`}`);
@@ -1 +1 @@
1
- {"version":3,"file":"ResizeManager.js","names":["item: ObservedGridNodes | ObservedAnnotationNodes | undefined"],"sources":["../../src/managers/ResizeManager.ts"],"sourcesContent":["import type { ObservedAnnotationNodes, ObservedGridNodes } from '../types';\n\nexport class ResizeManager {\n private observedNodes = new Map<\n HTMLElement,\n ObservedAnnotationNodes | ObservedGridNodes\n >();\n private timeoutID: NodeJS.Timeout | undefined;\n private queuedUpdates: Map<\n HTMLElement,\n [ObservedGridNodes, ResizeObserverSize]\n > = new Map();\n\n cleanUp(): void {\n // Disconnect any existing observer\n this.resizeObserver?.disconnect();\n this.observedNodes.clear();\n if (this.timeoutID != null) {\n clearTimeout(this.timeoutID);\n }\n }\n\n private resizeObserver: ResizeObserver | undefined;\n\n setup(pre: HTMLPreElement, disableAnnotations: boolean): void {\n this.resizeObserver ??= new ResizeObserver(this.handleResizeObserver);\n const codeElements = pre.querySelectorAll('code');\n\n const observedNodes = new Map(this.observedNodes);\n this.observedNodes.clear();\n for (const codeElement of codeElements) {\n let item: ObservedGridNodes | ObservedAnnotationNodes | undefined =\n observedNodes.get(codeElement);\n if (item != null) {\n this.observedNodes.set(codeElement, item);\n observedNodes.delete(codeElement);\n continue;\n }\n let numberElement = codeElement.querySelector('[data-gutter]');\n if (!(numberElement instanceof HTMLElement)) {\n numberElement = null;\n }\n item = {\n type: 'code',\n codeElement,\n numberElement,\n codeWidth: 'auto',\n numberWidth: 0,\n };\n this.observedNodes.set(codeElement, item);\n this.resizeObserver.observe(codeElement);\n if (numberElement != null) {\n this.observedNodes.set(numberElement, item);\n this.resizeObserver.observe(numberElement);\n }\n }\n\n if (codeElements.length > 1 && !disableAnnotations) {\n const annotationElements = pre.querySelectorAll(\n '[data-line-annotation*=\",\"]'\n );\n\n const elementMap = new Map<string, HTMLElement[]>();\n for (const element of annotationElements) {\n if (!(element instanceof HTMLElement)) {\n continue;\n }\n const { lineAnnotation = '' } = element.dataset;\n if (!/^\\d+,\\d+$/.test(lineAnnotation)) {\n console.error(\n 'DiffFileRenderer.setupResizeObserver: Invalid element or annotation',\n { lineAnnotation, element }\n );\n continue;\n }\n let pairs = elementMap.get(lineAnnotation);\n if (pairs == null) {\n pairs = [];\n elementMap.set(lineAnnotation, pairs);\n }\n pairs.push(element);\n }\n\n for (const [key, pair] of elementMap) {\n if (pair.length !== 2) {\n console.error(\n 'DiffFileRenderer.setupResizeObserver: Bad Pair',\n key,\n pair\n );\n continue;\n }\n const [container1, container2] = pair;\n const child1 = container1.firstElementChild;\n const child2 = container2.firstElementChild;\n if (\n !(container1 instanceof HTMLElement) ||\n !(container2 instanceof HTMLElement) ||\n !(child1 instanceof HTMLElement) ||\n !(child2 instanceof HTMLElement)\n ) {\n continue;\n }\n\n let item = observedNodes.get(child1);\n\n if (item != null) {\n this.observedNodes.set(child1, item);\n this.observedNodes.set(child2, item);\n observedNodes.delete(child1);\n observedNodes.delete(child2);\n continue;\n }\n\n item = {\n type: 'annotations',\n column1: {\n container: container1,\n child: child1,\n childHeight: child1.getBoundingClientRect().height,\n },\n column2: {\n container: container2,\n child: child2,\n childHeight: child2.getBoundingClientRect().height,\n },\n currentHeight: 'auto',\n };\n\n const newHeight = Math.max(\n item.column1.childHeight,\n item.column2.childHeight\n );\n this.applyNewHeight(item, newHeight);\n\n this.observedNodes.set(child1, item);\n this.observedNodes.set(child2, item);\n this.resizeObserver.observe(child1);\n this.resizeObserver.observe(child2);\n }\n }\n\n for (const element of observedNodes.keys()) {\n if (element.isConnected) {\n element.style.removeProperty('--diffs-column-content-width');\n element.style.removeProperty('--diffs-column-number-width');\n element.style.removeProperty('--diffs-column-width');\n if (element.parentElement instanceof HTMLElement) {\n element.parentElement.style.removeProperty(\n '--diffs-annotation-min-height'\n );\n }\n }\n this.resizeObserver.unobserve(element);\n }\n observedNodes.clear();\n }\n\n private handleResizeObserver = (entries: ResizeObserverEntry[]) => {\n for (const entry of entries) {\n const { target, borderBoxSize } = entry;\n if (!(target instanceof HTMLElement)) {\n console.error(\n 'FileDiff.handleResizeObserver: Invalid element for ResizeObserver',\n entry\n );\n continue;\n }\n const item = this.observedNodes.get(target);\n if (item == null) {\n console.error(\n 'FileDiff.handleResizeObserver: Not a valid observed node',\n entry\n );\n continue;\n }\n const specs = borderBoxSize[0];\n if (item.type === 'annotations') {\n const column = (() => {\n if (target === item.column1.child) {\n return item.column1;\n }\n if (target === item.column2.child) {\n return item.column2;\n }\n return undefined;\n })();\n\n if (column == null) {\n console.error(\n `FileDiff.handleResizeObserver: Couldn't find a column for`,\n { item, target }\n );\n continue;\n }\n\n column.childHeight = specs.blockSize;\n const newHeight = Math.max(\n item.column1.childHeight,\n item.column2.childHeight\n );\n this.applyNewHeight(item, newHeight);\n } else if (item.type === 'code') {\n // We debounce code column updates to help with resize performance (mb)\n this.queuedUpdates.set(target, [item, specs]);\n this.queueColumnUpdate();\n }\n }\n };\n\n private queueColumnUpdate() {\n if (this.timeoutID != null) {\n clearTimeout(this.timeoutID);\n }\n // Attempt to debounce resize events to improve general performance... mb\n this.timeoutID = setTimeout(this.handleColumnChange, 1000 / 30);\n }\n\n private handleColumnChange = () => {\n this.timeoutID = undefined;\n for (const [target, [item, specs]] of this.queuedUpdates) {\n // FIXME(amadeus): This needs to be re-worked with display: contents,\n // not sure setting to auto is a good assumption most of the time...\n if (target === item.codeElement) {\n const inlineSize = Math.max(Math.floor(specs.inlineSize), 0);\n if (inlineSize !== item.codeWidth) {\n item.codeWidth = inlineSize;\n const targetWidth = Math.max(item.codeWidth - item.numberWidth, 0);\n item.codeElement.style.setProperty(\n '--diffs-column-content-width',\n `${targetWidth === 0 ? 'auto' : `${targetWidth}px`}`\n );\n item.codeElement.style.setProperty(\n '--diffs-column-width',\n `${item.codeWidth === 0 ? 'auto' : `${item.codeWidth}px`}`\n );\n }\n } else if (target === item.numberElement) {\n const inlineSize = Math.max(Math.ceil(specs.inlineSize), 0);\n if (inlineSize !== item.numberWidth) {\n item.numberWidth = inlineSize;\n item.codeElement.style.setProperty(\n '--diffs-column-number-width',\n `${item.numberWidth === 0 ? 'auto' : `${item.numberWidth}px`}`\n );\n // We probably need to update code width variable if\n // `numberWidth` changed\n if (item.codeWidth !== 'auto') {\n const targetWidth = Math.max(item.codeWidth - item.numberWidth, 0);\n item.codeElement.style.setProperty(\n '--diffs-column-content-width',\n `${targetWidth === 0 ? 'auto' : `${targetWidth}px`}`\n );\n }\n }\n }\n }\n this.queuedUpdates.clear();\n };\n\n private applyNewHeight(item: ObservedAnnotationNodes, newHeight: number) {\n if (newHeight !== item.currentHeight) {\n item.currentHeight = Math.max(newHeight, 0);\n item.column1.container.style.setProperty(\n '--diffs-annotation-min-height',\n `${item.currentHeight}px`\n );\n item.column2.container.style.setProperty(\n '--diffs-annotation-min-height',\n `${item.currentHeight}px`\n );\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"ResizeManager.js","names":["item: ObservedGridNodes | ObservedAnnotationNodes | undefined","update: CodeColumnUpdate"],"sources":["../../src/managers/ResizeManager.ts"],"sourcesContent":["import type { ObservedAnnotationNodes, ObservedGridNodes } from '../types';\n\ntype CodeColumnUpdate = [HTMLElement, number];\n\nexport class ResizeManager {\n private observedNodes = new Map<\n HTMLElement,\n ObservedAnnotationNodes | ObservedGridNodes\n >();\n private queuedUpdates: Map<ObservedGridNodes, CodeColumnUpdate[]> = new Map();\n\n cleanUp(): void {\n // Disconnect any existing observer\n this.resizeObserver?.disconnect();\n this.observedNodes.clear();\n this.queuedUpdates.clear();\n }\n\n private resizeObserver: ResizeObserver | undefined;\n\n setup(pre: HTMLPreElement, disableAnnotations: boolean): void {\n this.resizeObserver ??= new ResizeObserver(this.handleResizeObserver);\n const codeElements = pre.querySelectorAll('code');\n\n const observedNodes = new Map(this.observedNodes);\n this.observedNodes.clear();\n for (const codeElement of codeElements) {\n let item: ObservedGridNodes | ObservedAnnotationNodes | undefined =\n observedNodes.get(codeElement);\n if (item != null && item.type !== 'code') {\n throw new Error(\n 'ResizeManager.setup: somehow a code node is being used for an annotation, should be impossible'\n );\n }\n\n let numberElement = codeElement.firstElementChild;\n if (!(numberElement instanceof HTMLElement)) {\n numberElement = null;\n }\n\n if (item != null) {\n this.observedNodes.set(codeElement, item);\n observedNodes.delete(codeElement);\n if (item.numberElement !== numberElement) {\n if (item.numberElement != null) {\n this.resizeObserver.unobserve(item.numberElement);\n }\n if (numberElement != null) {\n this.resizeObserver.observe(numberElement);\n observedNodes.delete(numberElement);\n this.observedNodes.set(numberElement, item);\n }\n item.numberElement = numberElement;\n } else if (item.numberElement != null) {\n observedNodes.delete(item.numberElement);\n this.observedNodes.set(item.numberElement, item);\n }\n } else {\n item = {\n type: 'code',\n codeElement,\n numberElement,\n codeWidth: 'auto',\n numberWidth: 0,\n };\n this.observedNodes.set(codeElement, item);\n this.resizeObserver.observe(codeElement);\n if (numberElement != null) {\n this.observedNodes.set(numberElement, item);\n this.resizeObserver.observe(numberElement);\n }\n }\n }\n\n if (codeElements.length > 1 && !disableAnnotations) {\n const annotationElements = pre.querySelectorAll(\n '[data-line-annotation*=\",\"]'\n );\n\n const elementMap = new Map<string, HTMLElement[]>();\n for (const element of annotationElements) {\n if (!(element instanceof HTMLElement)) {\n continue;\n }\n const { lineAnnotation = '' } = element.dataset;\n if (!/^\\d+,\\d+$/.test(lineAnnotation)) {\n console.error(\n 'DiffFileRenderer.setupResizeObserver: Invalid element or annotation',\n { lineAnnotation, element }\n );\n continue;\n }\n let pairs = elementMap.get(lineAnnotation);\n if (pairs == null) {\n pairs = [];\n elementMap.set(lineAnnotation, pairs);\n }\n pairs.push(element);\n }\n\n for (const [key, pair] of elementMap) {\n if (pair.length !== 2) {\n console.error(\n 'DiffFileRenderer.setupResizeObserver: Bad Pair',\n key,\n pair\n );\n continue;\n }\n const [container1, container2] = pair;\n const child1 = container1.firstElementChild;\n const child2 = container2.firstElementChild;\n if (\n !(container1 instanceof HTMLElement) ||\n !(container2 instanceof HTMLElement) ||\n !(child1 instanceof HTMLElement) ||\n !(child2 instanceof HTMLElement)\n ) {\n continue;\n }\n\n let item = observedNodes.get(child1);\n\n if (item != null) {\n this.observedNodes.set(child1, item);\n this.observedNodes.set(child2, item);\n observedNodes.delete(child1);\n observedNodes.delete(child2);\n continue;\n }\n\n item = {\n type: 'annotations',\n column1: {\n container: container1,\n child: child1,\n childHeight: child1.getBoundingClientRect().height,\n },\n column2: {\n container: container2,\n child: child2,\n childHeight: child2.getBoundingClientRect().height,\n },\n currentHeight: 'auto',\n };\n\n const newHeight = Math.max(\n item.column1.childHeight,\n item.column2.childHeight\n );\n this.applyNewHeight(item, newHeight);\n\n this.observedNodes.set(child1, item);\n this.observedNodes.set(child2, item);\n this.resizeObserver.observe(child1);\n this.resizeObserver.observe(child2);\n }\n }\n\n for (const element of observedNodes.keys()) {\n if (element.isConnected) {\n element.style.removeProperty('--diffs-column-content-width');\n element.style.removeProperty('--diffs-column-number-width');\n element.style.removeProperty('--diffs-column-width');\n if (element.parentElement instanceof HTMLElement) {\n element.parentElement.style.removeProperty(\n '--diffs-annotation-min-height'\n );\n }\n }\n this.resizeObserver.unobserve(element);\n }\n observedNodes.clear();\n }\n\n private handleResizeObserver = (entries: ResizeObserverEntry[]) => {\n for (const entry of entries) {\n const { target, borderBoxSize } = entry;\n if (!(target instanceof HTMLElement)) {\n console.error(\n 'FileDiff.handleResizeObserver: Invalid element for ResizeObserver',\n entry\n );\n continue;\n }\n const item = this.observedNodes.get(target);\n if (item == null) {\n console.error(\n 'FileDiff.handleResizeObserver: Not a valid observed node',\n entry\n );\n continue;\n }\n const specs = borderBoxSize[0];\n if (item.type === 'annotations') {\n const column = (() => {\n if (target === item.column1.child) {\n return item.column1;\n }\n if (target === item.column2.child) {\n return item.column2;\n }\n return undefined;\n })();\n\n if (column == null) {\n console.error(\n `FileDiff.handleResizeObserver: Couldn't find a column for`,\n { item, target }\n );\n continue;\n }\n\n column.childHeight = specs.blockSize;\n const newHeight = Math.max(\n item.column1.childHeight,\n item.column2.childHeight\n );\n this.applyNewHeight(item, newHeight);\n } else if (item.type === 'code') {\n const update: CodeColumnUpdate = [target, specs.inlineSize];\n const updates = this.queuedUpdates.get(item) ?? [];\n updates.push(update);\n this.queuedUpdates.set(item, updates);\n }\n }\n this.handleColumnChange();\n };\n\n private handleColumnChange = () => {\n for (const [item, updates] of this.queuedUpdates) {\n for (const [target, targetInlineSize] of updates) {\n // FIXME(amadeus): This needs to be re-worked with display: contents,\n // not sure setting to auto is a good assumption most of the time...\n if (target === item.codeElement) {\n const inlineSize = Math.max(Math.floor(targetInlineSize), 0);\n if (inlineSize !== item.codeWidth) {\n const targetWidth = Math.max(inlineSize - item.numberWidth, 0);\n item.codeWidth = inlineSize === 0 ? 'auto' : inlineSize;\n item.codeElement.style.setProperty(\n '--diffs-column-content-width',\n `${targetWidth > 0 ? `${targetWidth}px` : 'auto'}`\n );\n item.codeElement.style.setProperty(\n '--diffs-column-width',\n `${typeof item.codeWidth === 'number' ? `${item.codeWidth}px` : 'auto'}`\n );\n }\n if (\n item.numberElement != null &&\n typeof item.codeWidth === 'number' &&\n item.numberWidth === 0\n ) {\n updates.push([\n item.numberElement,\n item.numberElement.getBoundingClientRect().width,\n ]);\n }\n } else if (target === item.numberElement) {\n const inlineSize = Math.max(Math.ceil(targetInlineSize), 0);\n if (inlineSize !== item.numberWidth) {\n item.numberWidth = inlineSize;\n item.codeElement.style.setProperty(\n '--diffs-column-number-width',\n `${item.numberWidth === 0 ? 'auto' : `${item.numberWidth}px`}`\n );\n // We probably need to update code width variable if\n // `numberWidth` changed\n if (item.codeWidth !== 'auto') {\n const targetWidth = Math.max(\n item.codeWidth - item.numberWidth,\n 0\n );\n item.codeElement.style.setProperty(\n '--diffs-column-content-width',\n `${targetWidth === 0 ? 'auto' : `${targetWidth}px`}`\n );\n }\n }\n }\n }\n }\n this.queuedUpdates.clear();\n };\n\n private applyNewHeight(item: ObservedAnnotationNodes, newHeight: number) {\n if (newHeight !== item.currentHeight) {\n item.currentHeight = Math.max(newHeight, 0);\n item.column1.container.style.setProperty(\n '--diffs-annotation-min-height',\n `${item.currentHeight}px`\n );\n item.column2.container.style.setProperty(\n '--diffs-annotation-min-height',\n `${item.currentHeight}px`\n );\n }\n }\n}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { AnnotationLineMap, AnnotationSide, AnnotationSpan, BaseCodeOptions, BaseDiffOptions, BundledLanguage, ChangeContent, ChangeTypes, CodeColumnType, CodeToHastOptions, ContextContent, DecorationItem, DiffLineAnnotation, DiffLineEventBaseProps, DiffsHighlighter, DiffsThemeNames, ExpansionDirections, ExtensionFormatMap, FileContents, FileDiffMetadata, ForceDiffPlainTextOptions, ForceFilePlainTextOptions, GapSpan, HighlighterTypes, Hunk, HunkData, HunkExpansionRegion, HunkLineType, HunkSeparators, LanguageRegistration, LineAnnotation, LineDiffTypes, LineEventBaseProps, LineInfo, LineSpans, LineTypes, ObservedAnnotationNodes, ObservedGridNodes, ParsedPatch, PrePropertiesConfig, RenderDiffFilesResult, RenderDiffOptions, RenderDiffResult, RenderFileMetadata, RenderFileOptions, RenderFileResult, RenderHeaderMetadataCallback, RenderHeaderMetadataProps, RenderHeaderPrefixCallback, RenderRange, RenderWindow, RenderedDiffASTCache, RenderedFileASTCache, SelectionSide, SharedRenderState, ShikiTransformer, SupportedLanguages, ThemeRegistrationResolved, ThemeTypes, ThemedDiffResult, ThemedFileResult, ThemedToken, ThemesType, VirtualFileMetrics, VirtualWindowSpecs } from "../types.js";
1
+ import { AnnotationLineMap, AnnotationSide, AnnotationSpan, BaseCodeOptions, BaseDiffOptions, BundledLanguage, ChangeContent, ChangeTypes, CodeColumnType, CodeToHastOptions, ContextContent, DecorationItem, DiffLineAnnotation, DiffLineEventBaseProps, DiffsHighlighter, DiffsThemeNames, ExpansionDirections, ExtensionFormatMap, FileContents, FileDiffMetadata, ForceDiffPlainTextOptions, ForceFilePlainTextOptions, GapSpan, HighlighterTypes, Hunk, HunkData, HunkExpansionRegion, HunkLineType, HunkSeparators, LanguageRegistration, LineAnnotation, LineDiffTypes, LineEventBaseProps, LineInfo, LineSpans, LineTypes, ObservedAnnotationNodes, ObservedGridNodes, ParsedPatch, PrePropertiesConfig, RenderDiffFilesResult, RenderDiffOptions, RenderDiffResult, RenderFileMetadata, RenderFileOptions, RenderFileResult, RenderHeaderMetadataCallback, RenderHeaderMetadataProps, RenderHeaderPrefixCallback, RenderRange, RenderWindow, RenderedDiffASTCache, RenderedFileASTCache, SelectionPoint, SelectionSide, SharedRenderState, ShikiTransformer, SupportedLanguages, ThemeRegistrationResolved, ThemeTypes, ThemedDiffResult, ThemedFileResult, ThemedToken, ThemesType, VirtualFileMetrics, VirtualWindowSpecs } from "../types.js";
2
2
  import { WorkerInitializationRenderOptions, WorkerPoolOptions } from "../worker/types.js";
3
3
  import { FileOptions } from "../components/File.js";
4
4
  import { DiffBasePropsReact, FileProps } from "./types.js";
@@ -15,4 +15,4 @@ import { templateRender } from "./utils/templateRender.js";
15
15
  import { useFileDiffInstance } from "./utils/useFileDiffInstance.js";
16
16
  import { useFileInstance } from "./utils/useFileInstance.js";
17
17
  import { useStableCallback } from "./utils/useStableCallback.js";
18
- export { AnnotationLineMap, AnnotationSide, AnnotationSpan, BaseCodeOptions, BaseDiffOptions, BundledLanguage, ChangeContent, ChangeTypes, CodeColumnType, CodeToHastOptions, ContextContent, DecorationItem, DiffBasePropsReact, DiffLineAnnotation, DiffLineEventBaseProps, DiffsHighlighter, DiffsThemeNames, ExpansionDirections, ExtensionFormatMap, File, FileContents, FileDiff, FileDiffMetadata, FileDiffProps, FileOptions, FileProps, ForceDiffPlainTextOptions, ForceFilePlainTextOptions, GapSpan, GutterUtilitySlotStyles, HighlighterTypes, Hunk, HunkData, HunkExpansionRegion, HunkLineType, HunkSeparators, LanguageRegistration, LineAnnotation, LineDiffTypes, LineEventBaseProps, LineInfo, LineSpans, LineTypes, MultiFileDiff, MultiFileDiffProps, ObservedAnnotationNodes, ObservedGridNodes, ParsedPatch, PatchDiff, PatchDiffProps, PrePropertiesConfig, RenderDiffFilesResult, RenderDiffOptions, RenderDiffResult, RenderFileMetadata, RenderFileOptions, RenderFileResult, RenderHeaderMetadataCallback, RenderHeaderMetadataProps, RenderHeaderPrefixCallback, RenderRange, RenderWindow, RenderedDiffASTCache, RenderedFileASTCache, SelectionSide, SharedRenderState, ShikiTransformer, SupportedLanguages, ThemeRegistrationResolved, ThemeTypes, ThemedDiffResult, ThemedFileResult, ThemedToken, ThemesType, VirtualFileMetrics, VirtualWindowSpecs, Virtualizer, VirtualizerContext, WorkerInitializationRenderOptions, WorkerPoolContext, WorkerPoolContextProvider, WorkerPoolOptions, renderDiffChildren, renderFileChildren, templateRender, useFileDiffInstance, useFileInstance, useStableCallback, useVirtualizer, useWorkerPool };
18
+ export { AnnotationLineMap, AnnotationSide, AnnotationSpan, BaseCodeOptions, BaseDiffOptions, BundledLanguage, ChangeContent, ChangeTypes, CodeColumnType, CodeToHastOptions, ContextContent, DecorationItem, DiffBasePropsReact, DiffLineAnnotation, DiffLineEventBaseProps, DiffsHighlighter, DiffsThemeNames, ExpansionDirections, ExtensionFormatMap, File, FileContents, FileDiff, FileDiffMetadata, FileDiffProps, FileOptions, FileProps, ForceDiffPlainTextOptions, ForceFilePlainTextOptions, GapSpan, GutterUtilitySlotStyles, HighlighterTypes, Hunk, HunkData, HunkExpansionRegion, HunkLineType, HunkSeparators, LanguageRegistration, LineAnnotation, LineDiffTypes, LineEventBaseProps, LineInfo, LineSpans, LineTypes, MultiFileDiff, MultiFileDiffProps, ObservedAnnotationNodes, ObservedGridNodes, ParsedPatch, PatchDiff, PatchDiffProps, PrePropertiesConfig, RenderDiffFilesResult, RenderDiffOptions, RenderDiffResult, RenderFileMetadata, RenderFileOptions, RenderFileResult, RenderHeaderMetadataCallback, RenderHeaderMetadataProps, RenderHeaderPrefixCallback, RenderRange, RenderWindow, RenderedDiffASTCache, RenderedFileASTCache, SelectionPoint, SelectionSide, SharedRenderState, ShikiTransformer, SupportedLanguages, ThemeRegistrationResolved, ThemeTypes, ThemedDiffResult, ThemedFileResult, ThemedToken, ThemesType, VirtualFileMetrics, VirtualWindowSpecs, Virtualizer, VirtualizerContext, WorkerInitializationRenderOptions, WorkerPoolContext, WorkerPoolContextProvider, WorkerPoolOptions, renderDiffChildren, renderFileChildren, templateRender, useFileDiffInstance, useFileInstance, useStableCallback, useVirtualizer, useWorkerPool };
@@ -1 +1 @@
1
- {"version":3,"file":"jsx.d.ts","names":["DIFFS_TAG_NAME","_1","HTMLElement","React","HTMLAttributes","DetailedHTMLProps","sideEffect"],"sources":["../../src/react/jsx.d.ts"],"sourcesContent":["import 'react';\nimport type { DIFFS_TAG_NAME } from '../constants';\n\ndeclare module 'react' {\n namespace JSX {\n interface IntrinsicElements {\n [DIFFS_TAG_NAME]: React.DetailedHTMLProps<\n React.HTMLAttributes<HTMLElement>,\n HTMLElement\n >;\n }\n }\n}\n"],"mappings":";;;;;EACmD,UAAA,GAAA,CAAA;IAAA,UAAA,iBAAA,CAAA;OAK5CA,cAAAA,CAL4C,EAK3BG,KAAAA,CAAME,iBALqB,CAM3CF,KAAAA,CAAMC,cAAeF,CAAAA,WAAAA,CAAAA,EACrBA,WADME,CACNF;IAFgBC;EAAjBH"}
1
+ {"version":3,"file":"jsx.d.ts","names":["DIFFS_TAG_NAME","_0","HTMLElement","React","HTMLAttributes","DetailedHTMLProps","sideEffect"],"sources":["../../src/react/jsx.d.ts"],"sourcesContent":["import 'react';\nimport type { DIFFS_TAG_NAME } from '../constants';\n\ndeclare module 'react' {\n namespace JSX {\n interface IntrinsicElements {\n [DIFFS_TAG_NAME]: React.DetailedHTMLProps<\n React.HTMLAttributes<HTMLElement>,\n HTMLElement\n >;\n }\n }\n}\n"],"mappings":";;;;;EACmD,UAAA,GAAA,CAAA;IAAA,UAAA,iBAAA,CAAA;OAK5CA,cAAAA,CAL4C,EAK3BG,KAAAA,CAAME,iBALqB,CAM3CF,KAAAA,CAAMC,cAAeF,CAAAA,WAAAA,CAAAA,EACrBA,WADME,CACNF;IAFgBC;EAAjBH"}
@@ -1,6 +1,5 @@
1
1
  import { DiffLineAnnotation, FileContents, LineAnnotation, RenderHeaderMetadataProps, VirtualFileMetrics } from "../types.js";
2
- import { SelectedLineRange } from "../managers/LineSelectionManager.js";
3
- import { GetHoveredLineResult } from "../managers/MouseEventManager.js";
2
+ import { GetHoveredLineResult, SelectedLineRange } from "../managers/InteractionManager.js";
4
3
  import { FileOptions } from "../components/File.js";
5
4
  import { FileDiffOptions } from "../components/FileDiff.js";
6
5
  import { CSSProperties, ReactNode } from "react";
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","names":["CSSProperties","ReactNode","FileOptions","FileDiffOptions","SelectedLineRange","GetHoveredLineResult","DiffLineAnnotation","FileContents","LineAnnotation","RenderHeaderMetadataProps","VirtualFileMetrics","DiffBasePropsReact","LAnnotation","FileProps"],"sources":["../../src/react/types.d.ts"],"sourcesContent":["import { type CSSProperties, type ReactNode } from 'react';\nimport type { FileOptions } from '../components/File';\nimport type { FileDiffOptions } from '../components/FileDiff';\nimport type { SelectedLineRange } from '../managers/LineSelectionManager';\nimport type { GetHoveredLineResult } from '../managers/MouseEventManager';\nimport type { DiffLineAnnotation, FileContents, LineAnnotation, RenderHeaderMetadataProps, VirtualFileMetrics } from '../types';\nexport interface DiffBasePropsReact<LAnnotation> {\n options?: FileDiffOptions<LAnnotation>;\n metrics?: VirtualFileMetrics;\n lineAnnotations?: DiffLineAnnotation<LAnnotation>[];\n selectedLines?: SelectedLineRange | null;\n renderAnnotation?(annotations: DiffLineAnnotation<LAnnotation>): ReactNode;\n renderHeaderPrefix?(props: RenderHeaderMetadataProps): ReactNode;\n renderHeaderMetadata?(props: RenderHeaderMetadataProps): ReactNode;\n renderGutterUtility?(getHoveredLine: () => GetHoveredLineResult<'diff'> | undefined): ReactNode;\n /**\n * @deprecated Use `renderGutterUtility` instead.\n */\n renderHoverUtility?(getHoveredLine: () => GetHoveredLineResult<'diff'> | undefined): ReactNode;\n className?: string;\n style?: CSSProperties;\n prerenderedHTML?: string;\n}\nexport interface FileProps<LAnnotation> {\n file: FileContents;\n options?: FileOptions<LAnnotation>;\n metrics?: VirtualFileMetrics;\n lineAnnotations?: LineAnnotation<LAnnotation>[];\n selectedLines?: SelectedLineRange | null;\n renderAnnotation?(annotations: LineAnnotation<LAnnotation>): ReactNode;\n renderHeaderPrefix?(file: FileContents): ReactNode;\n renderHeaderMetadata?(file: FileContents): ReactNode;\n renderGutterUtility?(getHoveredLine: () => GetHoveredLineResult<'file'> | undefined): ReactNode;\n /**\n * @deprecated Use `renderGutterUtility` instead.\n */\n renderHoverUtility?(getHoveredLine: () => GetHoveredLineResult<'file'> | undefined): ReactNode;\n className?: string;\n style?: CSSProperties;\n prerenderedHTML?: string;\n}\n//# sourceMappingURL=types.d.ts.map"],"mappings":";;;;;;;;UAMiBW;YACHR,gBAAgBS;EADbD,OAAAA,CAAAA,EAEHD,kBAFqBE;EACLA,eAAAA,CAAAA,EAERN,kBAFQM,CAEWA,WAFXA,CAAAA,EAAAA;EAAhBT,aAAAA,CAAAA,EAGMC,iBAHND,GAAAA,IAAAA;EACAO,gBAAAA,EAAAA,WAAAA,EAGqBJ,kBAHrBI,CAGwCE,WAHxCF,CAAAA,CAAAA,EAGuDT,SAHvDS;EAC2BE,kBAAAA,EAAAA,KAAAA,EAGVH,yBAHUG,CAAAA,EAGkBX,SAHlBW;EAAnBN,oBAAAA,EAAAA,KAAAA,EAIWG,yBAJXH,CAAAA,EAIuCL,SAJvCK;EACFF,mBAAAA,EAAAA,cAAAA,EAAAA,GAAAA,GAI2BC,oBAJ3BD,CAAAA,MAAAA,CAAAA,GAAAA,SAAAA,CAAAA,EAIsEH,SAJtEG;EACkCQ;;;EACvBH,kBAAAA,EAAAA,cAAAA,EAAAA,GAAAA,GAMeJ,oBANfI,CAAAA,MAAAA,CAAAA,GAAAA,SAAAA,CAAAA,EAM0DR,SAN1DQ;EAA4BR,SAAAA,CAAAA,EAAAA,MAAAA;EAC1BQ,KAAAA,CAAAA,EAOrBT,aAPqBS;EAA4BR,eAAAA,CAAAA,EAAAA,MAAAA;;AAC6BA,UASzEY,SATyEZ,CAAAA,WAAAA,CAAAA,CAAAA;EAI5CI,IAAAA,EAMpCE,YANoCF;EAA2CJ,OAAAA,CAAAA,EAO3EC,WAP2ED,CAO/DW,WAP+DX,CAAAA;EAE7ED,OAAAA,CAAAA,EAMEU,kBANFV;EAAa,eAAA,CAAA,EAOHQ,cAPG,CAOYI,WAPZ,CAAA,EAAA;EAGRC,aAAS,CAAA,EAKNT,iBALMQ,GAAA,IAAA;EAChBL,gBAAAA,EAAAA,WAAAA,EAKyBC,cALzBD,CAKwCK,WALxCL,CAAAA,CAAAA,EAKuDN,SALvDM;EACgBK,kBAAAA,EAAAA,IAAAA,EAKIL,YALJK,CAAAA,EAKmBX,SALnBW;EAAZV,oBAAAA,EAAAA,IAAAA,EAMkBK,YANlBL,CAAAA,EAMiCD,SANjCC;EACAQ,mBAAAA,EAAAA,cAAAA,EAAAA,GAAAA,GAMiCL,oBANjCK,CAAAA,MAAAA,CAAAA,GAAAA,SAAAA,CAAAA,EAM4ET,SAN5ES;EACuBE;;;EAEaA,kBAAAA,EAAAA,cAAAA,EAAAA,GAAAA,GAOJP,oBAPIO,CAAAA,MAAAA,CAAAA,GAAAA,SAAAA,CAAAA,EAOuCX,SAPvCW;EAAfJ,SAAAA,CAAAA,EAAAA,MAAAA;EAA8BP,KAAAA,CAAAA,EASrDD,aATqDC;EACnCM,eAAAA,CAAAA,EAAAA,MAAAA"}
1
+ {"version":3,"file":"types.d.ts","names":["CSSProperties","ReactNode","FileOptions","FileDiffOptions","GetHoveredLineResult","SelectedLineRange","DiffLineAnnotation","FileContents","LineAnnotation","RenderHeaderMetadataProps","VirtualFileMetrics","DiffBasePropsReact","LAnnotation","FileProps"],"sources":["../../src/react/types.d.ts"],"sourcesContent":["import { type CSSProperties, type ReactNode } from 'react';\nimport type { FileOptions } from '../components/File';\nimport type { FileDiffOptions } from '../components/FileDiff';\nimport type { GetHoveredLineResult, SelectedLineRange } from '../managers/InteractionManager';\nimport type { DiffLineAnnotation, FileContents, LineAnnotation, RenderHeaderMetadataProps, VirtualFileMetrics } from '../types';\nexport interface DiffBasePropsReact<LAnnotation> {\n options?: FileDiffOptions<LAnnotation>;\n metrics?: VirtualFileMetrics;\n lineAnnotations?: DiffLineAnnotation<LAnnotation>[];\n selectedLines?: SelectedLineRange | null;\n renderAnnotation?(annotations: DiffLineAnnotation<LAnnotation>): ReactNode;\n renderHeaderPrefix?(props: RenderHeaderMetadataProps): ReactNode;\n renderHeaderMetadata?(props: RenderHeaderMetadataProps): ReactNode;\n renderGutterUtility?(getHoveredLine: () => GetHoveredLineResult<'diff'> | undefined): ReactNode;\n /**\n * @deprecated Use `renderGutterUtility` instead.\n */\n renderHoverUtility?(getHoveredLine: () => GetHoveredLineResult<'diff'> | undefined): ReactNode;\n className?: string;\n style?: CSSProperties;\n prerenderedHTML?: string;\n}\nexport interface FileProps<LAnnotation> {\n file: FileContents;\n options?: FileOptions<LAnnotation>;\n metrics?: VirtualFileMetrics;\n lineAnnotations?: LineAnnotation<LAnnotation>[];\n selectedLines?: SelectedLineRange | null;\n renderAnnotation?(annotations: LineAnnotation<LAnnotation>): ReactNode;\n renderHeaderPrefix?(file: FileContents): ReactNode;\n renderHeaderMetadata?(file: FileContents): ReactNode;\n renderGutterUtility?(getHoveredLine: () => GetHoveredLineResult<'file'> | undefined): ReactNode;\n /**\n * @deprecated Use `renderGutterUtility` instead.\n */\n renderHoverUtility?(getHoveredLine: () => GetHoveredLineResult<'file'> | undefined): ReactNode;\n className?: string;\n style?: CSSProperties;\n prerenderedHTML?: string;\n}\n//# sourceMappingURL=types.d.ts.map"],"mappings":";;;;;;;UAKiBW;YACHR,gBAAgBS;EADbD,OAAAA,CAAAA,EAEHD,kBAFqBE;EACLA,eAAAA,CAAAA,EAERN,kBAFQM,CAEWA,WAFXA,CAAAA,EAAAA;EAAhBT,aAAAA,CAAAA,EAGME,iBAHNF,GAAAA,IAAAA;EACAO,gBAAAA,EAAAA,WAAAA,EAGqBJ,kBAHrBI,CAGwCE,WAHxCF,CAAAA,CAAAA,EAGuDT,SAHvDS;EAC2BE,kBAAAA,EAAAA,KAAAA,EAGVH,yBAHUG,CAAAA,EAGkBX,SAHlBW;EAAnBN,oBAAAA,EAAAA,KAAAA,EAIWG,yBAJXH,CAAAA,EAIuCL,SAJvCK;EACFD,mBAAAA,EAAAA,cAAAA,EAAAA,GAAAA,GAI2BD,oBAJ3BC,CAAAA,MAAAA,CAAAA,GAAAA,SAAAA,CAAAA,EAIsEJ,SAJtEI;EACkCO;;;EACvBH,kBAAAA,EAAAA,cAAAA,EAAAA,GAAAA,GAMeL,oBANfK,CAAAA,MAAAA,CAAAA,GAAAA,SAAAA,CAAAA,EAM0DR,SAN1DQ;EAA4BR,SAAAA,CAAAA,EAAAA,MAAAA;EAC1BQ,KAAAA,CAAAA,EAOrBT,aAPqBS;EAA4BR,eAAAA,CAAAA,EAAAA,MAAAA;;AAC6BA,UASzEY,SATyEZ,CAAAA,WAAAA,CAAAA,CAAAA;EAI5CG,IAAAA,EAMpCG,YANoCH;EAA2CH,OAAAA,CAAAA,EAO3EC,WAP2ED,CAO/DW,WAP+DX,CAAAA;EAE7ED,OAAAA,CAAAA,EAMEU,kBANFV;EAAa,eAAA,CAAA,EAOHQ,cAPG,CAOYI,WAPZ,CAAA,EAAA;EAGRC,aAAS,CAAA,EAKNR,iBALMO,GAAA,IAAA;EAChBL,gBAAAA,EAAAA,WAAAA,EAKyBC,cALzBD,CAKwCK,WALxCL,CAAAA,CAAAA,EAKuDN,SALvDM;EACgBK,kBAAAA,EAAAA,IAAAA,EAKIL,YALJK,CAAAA,EAKmBX,SALnBW;EAAZV,oBAAAA,EAAAA,IAAAA,EAMkBK,YANlBL,CAAAA,EAMiCD,SANjCC;EACAQ,mBAAAA,EAAAA,cAAAA,EAAAA,GAAAA,GAMiCN,oBANjCM,CAAAA,MAAAA,CAAAA,GAAAA,SAAAA,CAAAA,EAM4ET,SAN5ES;EACuBE;;;EAEaA,kBAAAA,EAAAA,cAAAA,EAAAA,GAAAA,GAOJR,oBAPIQ,CAAAA,MAAAA,CAAAA,GAAAA,SAAAA,CAAAA,EAOuCX,SAPvCW;EAAfJ,SAAAA,CAAAA,EAAAA,MAAAA;EAA8BP,KAAAA,CAAAA,EASrDD,aATqDC;EACnCM,eAAAA,CAAAA,EAAAA,MAAAA"}
@@ -1,5 +1,5 @@
1
1
  import { FileContents, FileDiffMetadata } from "../../types.js";
2
- import { GetHoveredLineResult } from "../../managers/MouseEventManager.js";
2
+ import { GetHoveredLineResult } from "../../managers/InteractionManager.js";
3
3
  import { DiffBasePropsReact } from "../types.js";
4
4
  import { ReactNode } from "react";
5
5
 
@@ -1 +1 @@
1
- {"version":3,"file":"renderDiffChildren.d.ts","names":["ReactNode","GetHoveredLineResult","FileContents","FileDiffMetadata","DiffBasePropsReact","RenderDiffChildrenProps","LAnnotation","renderDiffChildren","fileDiff","deletionFile","additionFile","renderHeaderPrefix","renderHeaderMetadata","renderAnnotation","renderGutterUtility","renderHoverUtility","lineAnnotations","getHoveredLine"],"sources":["../../../src/react/utils/renderDiffChildren.d.ts"],"sourcesContent":["import type { ReactNode } from 'react';\nimport type { GetHoveredLineResult } from '../../managers/MouseEventManager';\nimport type { FileContents, FileDiffMetadata } from '../../types';\nimport type { DiffBasePropsReact } from '../types';\ninterface RenderDiffChildrenProps<LAnnotation> {\n fileDiff?: FileDiffMetadata;\n deletionFile?: FileContents;\n additionFile?: FileContents;\n renderHeaderPrefix: DiffBasePropsReact<LAnnotation>['renderHeaderPrefix'];\n renderHeaderMetadata: DiffBasePropsReact<LAnnotation>['renderHeaderMetadata'];\n renderAnnotation: DiffBasePropsReact<LAnnotation>['renderAnnotation'];\n renderGutterUtility: DiffBasePropsReact<LAnnotation>['renderGutterUtility'];\n renderHoverUtility: DiffBasePropsReact<LAnnotation>['renderHoverUtility'];\n lineAnnotations: DiffBasePropsReact<LAnnotation>['lineAnnotations'];\n getHoveredLine(): GetHoveredLineResult<'diff'> | undefined;\n}\nexport declare function renderDiffChildren<LAnnotation>({ fileDiff, deletionFile, additionFile, renderHeaderPrefix, renderHeaderMetadata, renderAnnotation, renderGutterUtility, renderHoverUtility, lineAnnotations, getHoveredLine }: RenderDiffChildrenProps<LAnnotation>): ReactNode;\nexport {};\n//# sourceMappingURL=renderDiffChildren.d.ts.map"],"mappings":";;;;;;UAIUK;aACKF;EADLE,YAAAA,CAAAA,EAESH,YAFc;EAClBC,YAAAA,CAAAA,EAEID,YAFJC;EACID,kBAAAA,EAEKE,kBAFLF,CAEwBI,WAFxBJ,CAAAA,CAAAA,oBAAAA,CAAAA;EACAA,oBAAAA,EAEOE,kBAFPF,CAE0BI,WAF1BJ,CAAAA,CAAAA,sBAAAA,CAAAA;EACwBI,gBAAAA,EAErBF,kBAFqBE,CAEFA,WAFEA,CAAAA,CAAAA,kBAAAA,CAAAA;EAAnBF,mBAAAA,EAGCA,kBAHDA,CAGoBE,WAHpBF,CAAAA,CAAAA,qBAAAA,CAAAA;EACqBE,kBAAAA,EAGrBF,kBAHqBE,CAGFA,WAHEA,CAAAA,CAAAA,oBAAAA,CAAAA;EAAnBF,eAAAA,EAILA,kBAJKA,CAIcE,WAJdF,CAAAA,CAAAA,iBAAAA,CAAAA;EACeE,cAAAA,EAAAA,EAInBL,oBAJmBK,CAAAA,MAAAA,CAAAA,GAAAA,SAAAA;;AACGA,iBAKpBC,kBALoBD,CAAAA,WAAAA,CAAAA,CAAAA;EAAAA,QAAAA;EAAAA,YAAAA;EAAAA,YAAAA;EAAAA,kBAAAA;EAAAA,oBAAAA;EAAAA,gBAAAA;EAAAA,mBAAAA;EAAAA,kBAAAA;EAAAA,eAAAA;EAAAA;AAAAA,CAAAA,EAK4LD,uBAL5LC,CAKoNA,WALpNA,CAAAA,CAAAA,EAKmON,SALnOM"}
1
+ {"version":3,"file":"renderDiffChildren.d.ts","names":["ReactNode","GetHoveredLineResult","FileContents","FileDiffMetadata","DiffBasePropsReact","RenderDiffChildrenProps","LAnnotation","renderDiffChildren","fileDiff","deletionFile","additionFile","renderHeaderPrefix","renderHeaderMetadata","renderAnnotation","renderGutterUtility","renderHoverUtility","lineAnnotations","getHoveredLine"],"sources":["../../../src/react/utils/renderDiffChildren.d.ts"],"sourcesContent":["import type { ReactNode } from 'react';\nimport type { GetHoveredLineResult } from '../../managers/InteractionManager';\nimport type { FileContents, FileDiffMetadata } from '../../types';\nimport type { DiffBasePropsReact } from '../types';\ninterface RenderDiffChildrenProps<LAnnotation> {\n fileDiff?: FileDiffMetadata;\n deletionFile?: FileContents;\n additionFile?: FileContents;\n renderHeaderPrefix: DiffBasePropsReact<LAnnotation>['renderHeaderPrefix'];\n renderHeaderMetadata: DiffBasePropsReact<LAnnotation>['renderHeaderMetadata'];\n renderAnnotation: DiffBasePropsReact<LAnnotation>['renderAnnotation'];\n renderGutterUtility: DiffBasePropsReact<LAnnotation>['renderGutterUtility'];\n renderHoverUtility: DiffBasePropsReact<LAnnotation>['renderHoverUtility'];\n lineAnnotations: DiffBasePropsReact<LAnnotation>['lineAnnotations'];\n getHoveredLine(): GetHoveredLineResult<'diff'> | undefined;\n}\nexport declare function renderDiffChildren<LAnnotation>({ fileDiff, deletionFile, additionFile, renderHeaderPrefix, renderHeaderMetadata, renderAnnotation, renderGutterUtility, renderHoverUtility, lineAnnotations, getHoveredLine }: RenderDiffChildrenProps<LAnnotation>): ReactNode;\nexport {};\n//# sourceMappingURL=renderDiffChildren.d.ts.map"],"mappings":";;;;;;UAIUK;aACKF;EADLE,YAAAA,CAAAA,EAESH,YAFc;EAClBC,YAAAA,CAAAA,EAEID,YAFJC;EACID,kBAAAA,EAEKE,kBAFLF,CAEwBI,WAFxBJ,CAAAA,CAAAA,oBAAAA,CAAAA;EACAA,oBAAAA,EAEOE,kBAFPF,CAE0BI,WAF1BJ,CAAAA,CAAAA,sBAAAA,CAAAA;EACwBI,gBAAAA,EAErBF,kBAFqBE,CAEFA,WAFEA,CAAAA,CAAAA,kBAAAA,CAAAA;EAAnBF,mBAAAA,EAGCA,kBAHDA,CAGoBE,WAHpBF,CAAAA,CAAAA,qBAAAA,CAAAA;EACqBE,kBAAAA,EAGrBF,kBAHqBE,CAGFA,WAHEA,CAAAA,CAAAA,oBAAAA,CAAAA;EAAnBF,eAAAA,EAILA,kBAJKA,CAIcE,WAJdF,CAAAA,CAAAA,iBAAAA,CAAAA;EACeE,cAAAA,EAAAA,EAInBL,oBAJmBK,CAAAA,MAAAA,CAAAA,GAAAA,SAAAA;;AACGA,iBAKpBC,kBALoBD,CAAAA,WAAAA,CAAAA,CAAAA;EAAAA,QAAAA;EAAAA,YAAAA;EAAAA,YAAAA;EAAAA,kBAAAA;EAAAA,oBAAAA;EAAAA,gBAAAA;EAAAA,mBAAAA;EAAAA,kBAAAA;EAAAA,eAAAA;EAAAA;AAAAA,CAAAA,EAK4LD,uBAL5LC,CAKoNA,WALpNA,CAAAA,CAAAA,EAKmON,SALnOM"}
@@ -1 +1 @@
1
- {"version":3,"file":"renderDiffChildren.js","names":[],"sources":["../../../src/react/utils/renderDiffChildren.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\n\nimport {\n HEADER_METADATA_SLOT_ID,\n HEADER_PREFIX_SLOT_ID,\n} from '../../constants';\nimport type { GetHoveredLineResult } from '../../managers/MouseEventManager';\nimport type { FileContents, FileDiffMetadata } from '../../types';\nimport { getLineAnnotationName } from '../../utils/getLineAnnotationName';\nimport { GutterUtilitySlotStyles } from '../constants';\nimport type { DiffBasePropsReact } from '../types';\n\ninterface RenderDiffChildrenProps<LAnnotation> {\n fileDiff?: FileDiffMetadata;\n deletionFile?: FileContents;\n additionFile?: FileContents;\n renderHeaderPrefix: DiffBasePropsReact<LAnnotation>['renderHeaderPrefix'];\n renderHeaderMetadata: DiffBasePropsReact<LAnnotation>['renderHeaderMetadata'];\n renderAnnotation: DiffBasePropsReact<LAnnotation>['renderAnnotation'];\n renderGutterUtility: DiffBasePropsReact<LAnnotation>['renderGutterUtility'];\n renderHoverUtility: DiffBasePropsReact<LAnnotation>['renderHoverUtility'];\n lineAnnotations: DiffBasePropsReact<LAnnotation>['lineAnnotations'];\n getHoveredLine(): GetHoveredLineResult<'diff'> | undefined;\n}\n\nexport function renderDiffChildren<LAnnotation>({\n fileDiff,\n deletionFile,\n additionFile,\n renderHeaderPrefix,\n renderHeaderMetadata,\n renderAnnotation,\n renderGutterUtility,\n renderHoverUtility,\n lineAnnotations,\n getHoveredLine,\n}: RenderDiffChildrenProps<LAnnotation>): ReactNode {\n const gutterUtility = renderGutterUtility ?? renderHoverUtility;\n const prefix = renderHeaderPrefix?.({\n fileDiff,\n deletionFile,\n additionFile,\n });\n const metadata = renderHeaderMetadata?.({\n fileDiff,\n deletionFile,\n additionFile,\n });\n return (\n <>\n {prefix != null && <div slot={HEADER_PREFIX_SLOT_ID}>{prefix}</div>}\n {metadata != null && <div slot={HEADER_METADATA_SLOT_ID}>{metadata}</div>}\n {renderAnnotation != null &&\n lineAnnotations?.map((annotation, index) => (\n <div key={index} slot={getLineAnnotationName(annotation)}>\n {renderAnnotation(annotation)}\n </div>\n ))}\n {gutterUtility != null && (\n <div slot=\"gutter-utility-slot\" style={GutterUtilitySlotStyles}>\n {gutterUtility(getHoveredLine)}\n </div>\n )}\n </>\n );\n}\n"],"mappings":";;;;;;AAyBA,SAAgB,mBAAgC,EAC9C,UACA,cACA,cACA,oBACA,sBACA,kBACA,qBACA,oBACA,iBACA,kBACkD;CAClD,MAAM,gBAAgB,uBAAuB;CAC7C,MAAM,SAAS,qBAAqB;EAClC;EACA;EACA;EACD,CAAC;CACF,MAAM,WAAW,uBAAuB;EACtC;EACA;EACA;EACD,CAAC;AACF,QACE;EACG,UAAU,QAAQ,oBAAC;GAAI,MAAM;aAAwB;IAAa;EAClE,YAAY,QAAQ,oBAAC;GAAI,MAAM;aAA0B;IAAe;EACxE,oBAAoB,QACnB,iBAAiB,KAAK,YAAY,UAChC,oBAAC;GAAgB,MAAM,sBAAsB,WAAW;aACrD,iBAAiB,WAAW;KADrB,MAEJ,CACN;EACH,iBAAiB,QAChB,oBAAC;GAAI,MAAK;GAAsB,OAAO;aACpC,cAAc,eAAe;IAC1B;KAEP"}
1
+ {"version":3,"file":"renderDiffChildren.js","names":[],"sources":["../../../src/react/utils/renderDiffChildren.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\n\nimport {\n HEADER_METADATA_SLOT_ID,\n HEADER_PREFIX_SLOT_ID,\n} from '../../constants';\nimport type { GetHoveredLineResult } from '../../managers/InteractionManager';\nimport type { FileContents, FileDiffMetadata } from '../../types';\nimport { getLineAnnotationName } from '../../utils/getLineAnnotationName';\nimport { GutterUtilitySlotStyles } from '../constants';\nimport type { DiffBasePropsReact } from '../types';\n\ninterface RenderDiffChildrenProps<LAnnotation> {\n fileDiff?: FileDiffMetadata;\n deletionFile?: FileContents;\n additionFile?: FileContents;\n renderHeaderPrefix: DiffBasePropsReact<LAnnotation>['renderHeaderPrefix'];\n renderHeaderMetadata: DiffBasePropsReact<LAnnotation>['renderHeaderMetadata'];\n renderAnnotation: DiffBasePropsReact<LAnnotation>['renderAnnotation'];\n renderGutterUtility: DiffBasePropsReact<LAnnotation>['renderGutterUtility'];\n renderHoverUtility: DiffBasePropsReact<LAnnotation>['renderHoverUtility'];\n lineAnnotations: DiffBasePropsReact<LAnnotation>['lineAnnotations'];\n getHoveredLine(): GetHoveredLineResult<'diff'> | undefined;\n}\n\nexport function renderDiffChildren<LAnnotation>({\n fileDiff,\n deletionFile,\n additionFile,\n renderHeaderPrefix,\n renderHeaderMetadata,\n renderAnnotation,\n renderGutterUtility,\n renderHoverUtility,\n lineAnnotations,\n getHoveredLine,\n}: RenderDiffChildrenProps<LAnnotation>): ReactNode {\n const gutterUtility = renderGutterUtility ?? renderHoverUtility;\n const prefix = renderHeaderPrefix?.({\n fileDiff,\n deletionFile,\n additionFile,\n });\n const metadata = renderHeaderMetadata?.({\n fileDiff,\n deletionFile,\n additionFile,\n });\n return (\n <>\n {prefix != null && <div slot={HEADER_PREFIX_SLOT_ID}>{prefix}</div>}\n {metadata != null && <div slot={HEADER_METADATA_SLOT_ID}>{metadata}</div>}\n {renderAnnotation != null &&\n lineAnnotations?.map((annotation, index) => (\n <div key={index} slot={getLineAnnotationName(annotation)}>\n {renderAnnotation(annotation)}\n </div>\n ))}\n {gutterUtility != null && (\n <div slot=\"gutter-utility-slot\" style={GutterUtilitySlotStyles}>\n {gutterUtility(getHoveredLine)}\n </div>\n )}\n </>\n );\n}\n"],"mappings":";;;;;;AAyBA,SAAgB,mBAAgC,EAC9C,UACA,cACA,cACA,oBACA,sBACA,kBACA,qBACA,oBACA,iBACA,kBACkD;CAClD,MAAM,gBAAgB,uBAAuB;CAC7C,MAAM,SAAS,qBAAqB;EAClC;EACA;EACA;EACD,CAAC;CACF,MAAM,WAAW,uBAAuB;EACtC;EACA;EACA;EACD,CAAC;AACF,QACE;EACG,UAAU,QAAQ,oBAAC;GAAI,MAAM;aAAwB;IAAa;EAClE,YAAY,QAAQ,oBAAC;GAAI,MAAM;aAA0B;IAAe;EACxE,oBAAoB,QACnB,iBAAiB,KAAK,YAAY,UAChC,oBAAC;GAAgB,MAAM,sBAAsB,WAAW;aACrD,iBAAiB,WAAW;KADrB,MAEJ,CACN;EACH,iBAAiB,QAChB,oBAAC;GAAI,MAAK;GAAsB,OAAO;aACpC,cAAc,eAAe;IAC1B;KAEP"}
@@ -1,5 +1,5 @@
1
1
  import { FileContents } from "../../types.js";
2
- import { GetHoveredLineResult } from "../../managers/MouseEventManager.js";
2
+ import { GetHoveredLineResult } from "../../managers/InteractionManager.js";
3
3
  import { FileProps } from "../types.js";
4
4
  import { ReactNode } from "react";
5
5
 
@@ -1 +1 @@
1
- {"version":3,"file":"renderFileChildren.d.ts","names":["ReactNode","GetHoveredLineResult","FileContents","FileProps","RenderFileChildrenProps","LAnnotation","renderFileChildren","file","renderHeaderPrefix","renderHeaderMetadata","renderAnnotation","lineAnnotations","renderGutterUtility","renderHoverUtility","getHoveredLine"],"sources":["../../../src/react/utils/renderFileChildren.d.ts"],"sourcesContent":["import type { ReactNode } from 'react';\nimport type { GetHoveredLineResult } from '../../managers/MouseEventManager';\nimport type { FileContents } from '../../types';\nimport type { FileProps } from '../types';\ninterface RenderFileChildrenProps<LAnnotation> {\n file: FileContents;\n renderHeaderPrefix: FileProps<LAnnotation>['renderHeaderPrefix'];\n renderHeaderMetadata: FileProps<LAnnotation>['renderHeaderMetadata'];\n renderAnnotation: FileProps<LAnnotation>['renderAnnotation'];\n lineAnnotations: FileProps<LAnnotation>['lineAnnotations'];\n renderGutterUtility: FileProps<LAnnotation>['renderGutterUtility'];\n renderHoverUtility: FileProps<LAnnotation>['renderHoverUtility'];\n getHoveredLine(): GetHoveredLineResult<'file'> | undefined;\n}\nexport declare function renderFileChildren<LAnnotation>({ file, renderHeaderPrefix, renderHeaderMetadata, renderAnnotation, lineAnnotations, renderGutterUtility, renderHoverUtility, getHoveredLine }: RenderFileChildrenProps<LAnnotation>): ReactNode;\nexport {};\n//# sourceMappingURL=renderFileChildren.d.ts.map"],"mappings":";;;;;;UAIUI;QACAF;EADAE,kBAAAA,EAEcD,SAFS,CAECE,WAFDA,CAAAA,CAAAA,oBAAA,CAAA;EACvBH,oBAAAA,EAEgBC,SAFhBD,CAE0BG,WAF1BH,CAAAA,CAAAA,sBAAAA,CAAAA;EACwBG,gBAAAA,EAEZF,SAFYE,CAEFA,WAFEA,CAAAA,CAAAA,kBAAAA,CAAAA;EAAVF,eAAAA,EAGHA,SAHGA,CAGOE,WAHPF,CAAAA,CAAAA,iBAAAA,CAAAA;EACYE,mBAAAA,EAGXF,SAHWE,CAGDA,WAHCA,CAAAA,CAAAA,qBAAAA,CAAAA;EAAVF,kBAAAA,EAIFA,SAJEA,CAIQE,WAJRF,CAAAA,CAAAA,oBAAAA,CAAAA;EACME,cAAAA,EAAAA,EAIVJ,oBAJUI,CAAAA,MAAAA,CAAAA,GAAAA,SAAAA;;AACDA,iBAKPC,kBALOD,CAAAA,WAAAA,CAAAA,CAAAA;EAAAA,IAAAA;EAAAA,kBAAAA;EAAAA,oBAAAA;EAAAA,gBAAAA;EAAAA,eAAAA;EAAAA,mBAAAA;EAAAA,kBAAAA;EAAAA;AAAAA,CAAAA,EAKyKD,uBALzKC,CAKiMA,WALjMA,CAAAA,CAAAA,EAKgNL,SALhNK"}
1
+ {"version":3,"file":"renderFileChildren.d.ts","names":["ReactNode","GetHoveredLineResult","FileContents","FileProps","RenderFileChildrenProps","LAnnotation","renderFileChildren","file","renderHeaderPrefix","renderHeaderMetadata","renderAnnotation","lineAnnotations","renderGutterUtility","renderHoverUtility","getHoveredLine"],"sources":["../../../src/react/utils/renderFileChildren.d.ts"],"sourcesContent":["import type { ReactNode } from 'react';\nimport type { GetHoveredLineResult } from '../../managers/InteractionManager';\nimport type { FileContents } from '../../types';\nimport type { FileProps } from '../types';\ninterface RenderFileChildrenProps<LAnnotation> {\n file: FileContents;\n renderHeaderPrefix: FileProps<LAnnotation>['renderHeaderPrefix'];\n renderHeaderMetadata: FileProps<LAnnotation>['renderHeaderMetadata'];\n renderAnnotation: FileProps<LAnnotation>['renderAnnotation'];\n lineAnnotations: FileProps<LAnnotation>['lineAnnotations'];\n renderGutterUtility: FileProps<LAnnotation>['renderGutterUtility'];\n renderHoverUtility: FileProps<LAnnotation>['renderHoverUtility'];\n getHoveredLine(): GetHoveredLineResult<'file'> | undefined;\n}\nexport declare function renderFileChildren<LAnnotation>({ file, renderHeaderPrefix, renderHeaderMetadata, renderAnnotation, lineAnnotations, renderGutterUtility, renderHoverUtility, getHoveredLine }: RenderFileChildrenProps<LAnnotation>): ReactNode;\nexport {};\n//# sourceMappingURL=renderFileChildren.d.ts.map"],"mappings":";;;;;;UAIUI;QACAF;EADAE,kBAAAA,EAEcD,SAFS,CAECE,WAFDA,CAAAA,CAAAA,oBAAA,CAAA;EACvBH,oBAAAA,EAEgBC,SAFhBD,CAE0BG,WAF1BH,CAAAA,CAAAA,sBAAAA,CAAAA;EACwBG,gBAAAA,EAEZF,SAFYE,CAEFA,WAFEA,CAAAA,CAAAA,kBAAAA,CAAAA;EAAVF,eAAAA,EAGHA,SAHGA,CAGOE,WAHPF,CAAAA,CAAAA,iBAAAA,CAAAA;EACYE,mBAAAA,EAGXF,SAHWE,CAGDA,WAHCA,CAAAA,CAAAA,qBAAAA,CAAAA;EAAVF,kBAAAA,EAIFA,SAJEA,CAIQE,WAJRF,CAAAA,CAAAA,oBAAAA,CAAAA;EACME,cAAAA,EAAAA,EAIVJ,oBAJUI,CAAAA,MAAAA,CAAAA,GAAAA,SAAAA;;AACDA,iBAKPC,kBALOD,CAAAA,WAAAA,CAAAA,CAAAA;EAAAA,IAAAA;EAAAA,kBAAAA;EAAAA,oBAAAA;EAAAA,gBAAAA;EAAAA,eAAAA;EAAAA,mBAAAA;EAAAA,kBAAAA;EAAAA;AAAAA,CAAAA,EAKyKD,uBALzKC,CAKiMA,WALjMA,CAAAA,CAAAA,EAKgNL,SALhNK"}
@@ -1 +1 @@
1
- {"version":3,"file":"renderFileChildren.js","names":[],"sources":["../../../src/react/utils/renderFileChildren.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\n\nimport {\n HEADER_METADATA_SLOT_ID,\n HEADER_PREFIX_SLOT_ID,\n} from '../../constants';\nimport type { GetHoveredLineResult } from '../../managers/MouseEventManager';\nimport type { FileContents } from '../../types';\nimport { getLineAnnotationName } from '../../utils/getLineAnnotationName';\nimport { GutterUtilitySlotStyles } from '../constants';\nimport type { FileProps } from '../types';\n\ninterface RenderFileChildrenProps<LAnnotation> {\n file: FileContents;\n renderHeaderPrefix: FileProps<LAnnotation>['renderHeaderPrefix'];\n renderHeaderMetadata: FileProps<LAnnotation>['renderHeaderMetadata'];\n renderAnnotation: FileProps<LAnnotation>['renderAnnotation'];\n lineAnnotations: FileProps<LAnnotation>['lineAnnotations'];\n renderGutterUtility: FileProps<LAnnotation>['renderGutterUtility'];\n renderHoverUtility: FileProps<LAnnotation>['renderHoverUtility'];\n getHoveredLine(): GetHoveredLineResult<'file'> | undefined;\n}\n\nexport function renderFileChildren<LAnnotation>({\n file,\n renderHeaderPrefix,\n renderHeaderMetadata,\n renderAnnotation,\n lineAnnotations,\n renderGutterUtility,\n renderHoverUtility,\n getHoveredLine,\n}: RenderFileChildrenProps<LAnnotation>): ReactNode {\n const gutterUtility = renderGutterUtility ?? renderHoverUtility;\n const prefix = renderHeaderPrefix?.(file);\n const metadata = renderHeaderMetadata?.(file);\n return (\n <>\n {prefix != null && <div slot={HEADER_PREFIX_SLOT_ID}>{prefix}</div>}\n {metadata != null && <div slot={HEADER_METADATA_SLOT_ID}>{metadata}</div>}\n {renderAnnotation != null &&\n lineAnnotations?.map((annotation, index) => (\n <div key={index} slot={getLineAnnotationName(annotation)}>\n {renderAnnotation(annotation)}\n </div>\n ))}\n {gutterUtility != null && (\n <div slot=\"gutter-utility-slot\" style={GutterUtilitySlotStyles}>\n {gutterUtility(getHoveredLine)}\n </div>\n )}\n </>\n );\n}\n"],"mappings":";;;;;;AAuBA,SAAgB,mBAAgC,EAC9C,MACA,oBACA,sBACA,kBACA,iBACA,qBACA,oBACA,kBACkD;CAClD,MAAM,gBAAgB,uBAAuB;CAC7C,MAAM,SAAS,qBAAqB,KAAK;CACzC,MAAM,WAAW,uBAAuB,KAAK;AAC7C,QACE;EACG,UAAU,QAAQ,oBAAC;GAAI,MAAM;aAAwB;IAAa;EAClE,YAAY,QAAQ,oBAAC;GAAI,MAAM;aAA0B;IAAe;EACxE,oBAAoB,QACnB,iBAAiB,KAAK,YAAY,UAChC,oBAAC;GAAgB,MAAM,sBAAsB,WAAW;aACrD,iBAAiB,WAAW;KADrB,MAEJ,CACN;EACH,iBAAiB,QAChB,oBAAC;GAAI,MAAK;GAAsB,OAAO;aACpC,cAAc,eAAe;IAC1B;KAEP"}
1
+ {"version":3,"file":"renderFileChildren.js","names":[],"sources":["../../../src/react/utils/renderFileChildren.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\n\nimport {\n HEADER_METADATA_SLOT_ID,\n HEADER_PREFIX_SLOT_ID,\n} from '../../constants';\nimport type { GetHoveredLineResult } from '../../managers/InteractionManager';\nimport type { FileContents } from '../../types';\nimport { getLineAnnotationName } from '../../utils/getLineAnnotationName';\nimport { GutterUtilitySlotStyles } from '../constants';\nimport type { FileProps } from '../types';\n\ninterface RenderFileChildrenProps<LAnnotation> {\n file: FileContents;\n renderHeaderPrefix: FileProps<LAnnotation>['renderHeaderPrefix'];\n renderHeaderMetadata: FileProps<LAnnotation>['renderHeaderMetadata'];\n renderAnnotation: FileProps<LAnnotation>['renderAnnotation'];\n lineAnnotations: FileProps<LAnnotation>['lineAnnotations'];\n renderGutterUtility: FileProps<LAnnotation>['renderGutterUtility'];\n renderHoverUtility: FileProps<LAnnotation>['renderHoverUtility'];\n getHoveredLine(): GetHoveredLineResult<'file'> | undefined;\n}\n\nexport function renderFileChildren<LAnnotation>({\n file,\n renderHeaderPrefix,\n renderHeaderMetadata,\n renderAnnotation,\n lineAnnotations,\n renderGutterUtility,\n renderHoverUtility,\n getHoveredLine,\n}: RenderFileChildrenProps<LAnnotation>): ReactNode {\n const gutterUtility = renderGutterUtility ?? renderHoverUtility;\n const prefix = renderHeaderPrefix?.(file);\n const metadata = renderHeaderMetadata?.(file);\n return (\n <>\n {prefix != null && <div slot={HEADER_PREFIX_SLOT_ID}>{prefix}</div>}\n {metadata != null && <div slot={HEADER_METADATA_SLOT_ID}>{metadata}</div>}\n {renderAnnotation != null &&\n lineAnnotations?.map((annotation, index) => (\n <div key={index} slot={getLineAnnotationName(annotation)}>\n {renderAnnotation(annotation)}\n </div>\n ))}\n {gutterUtility != null && (\n <div slot=\"gutter-utility-slot\" style={GutterUtilitySlotStyles}>\n {gutterUtility(getHoveredLine)}\n </div>\n )}\n </>\n );\n}\n"],"mappings":";;;;;;AAuBA,SAAgB,mBAAgC,EAC9C,MACA,oBACA,sBACA,kBACA,iBACA,qBACA,oBACA,kBACkD;CAClD,MAAM,gBAAgB,uBAAuB;CAC7C,MAAM,SAAS,qBAAqB,KAAK;CACzC,MAAM,WAAW,uBAAuB,KAAK;AAC7C,QACE;EACG,UAAU,QAAQ,oBAAC;GAAI,MAAM;aAAwB;IAAa;EAClE,YAAY,QAAQ,oBAAC;GAAI,MAAM;aAA0B;IAAe;EACxE,oBAAoB,QACnB,iBAAiB,KAAK,YAAY,UAChC,oBAAC;GAAgB,MAAM,sBAAsB,WAAW;aACrD,iBAAiB,WAAW;KADrB,MAEJ,CACN;EACH,iBAAiB,QAChB,oBAAC;GAAI,MAAK;GAAsB,OAAO;aACpC,cAAc,eAAe;IAC1B;KAEP"}
@@ -1,6 +1,5 @@
1
1
  import { DiffLineAnnotation, FileContents, FileDiffMetadata, VirtualFileMetrics } from "../../types.js";
2
- import { SelectedLineRange } from "../../managers/LineSelectionManager.js";
3
- import { GetHoveredLineResult } from "../../managers/MouseEventManager.js";
2
+ import { GetHoveredLineResult, SelectedLineRange } from "../../managers/InteractionManager.js";
4
3
  import { FileDiffOptions } from "../../components/FileDiff.js";
5
4
 
6
5
  //#region src/react/utils/useFileDiffInstance.d.ts
@@ -1 +1 @@
1
- {"version":3,"file":"useFileDiffInstance.d.ts","names":["FileDiffOptions","SelectedLineRange","GetHoveredLineResult","DiffLineAnnotation","FileContents","FileDiffMetadata","VirtualFileMetrics","UseFileDiffInstanceProps","LAnnotation","UseFileDiffInstanceReturn","HTMLElement","useFileDiffInstance","oldFile","newFile","fileDiff","options","lineAnnotations","selectedLines","prerenderedHTML","metrics"],"sources":["../../../src/react/utils/useFileDiffInstance.d.ts"],"sourcesContent":["import { type FileDiffOptions } from '../../components/FileDiff';\nimport type { SelectedLineRange } from '../../managers/LineSelectionManager';\nimport type { GetHoveredLineResult } from '../../managers/MouseEventManager';\nimport type { DiffLineAnnotation, FileContents, FileDiffMetadata, VirtualFileMetrics } from '../../types';\ninterface UseFileDiffInstanceProps<LAnnotation> {\n oldFile?: FileContents;\n newFile?: FileContents;\n fileDiff?: FileDiffMetadata;\n options: FileDiffOptions<LAnnotation> | undefined;\n lineAnnotations: DiffLineAnnotation<LAnnotation>[] | undefined;\n selectedLines: SelectedLineRange | null | undefined;\n prerenderedHTML: string | undefined;\n metrics?: VirtualFileMetrics;\n}\ninterface UseFileDiffInstanceReturn {\n ref(node: HTMLElement | null): void;\n getHoveredLine(): GetHoveredLineResult<'diff'> | undefined;\n}\nexport declare function useFileDiffInstance<LAnnotation>({ oldFile, newFile, fileDiff, options, lineAnnotations, selectedLines, prerenderedHTML, metrics }: UseFileDiffInstanceProps<LAnnotation>): UseFileDiffInstanceReturn;\nexport {};\n//# sourceMappingURL=useFileDiffInstance.d.ts.map"],"mappings":";;;;;;UAIUO;YACIH;EADJG,OAAAA,CAAAA,EAEIH,YAFJG;EACIH,QAAAA,CAAAA,EAECC,gBAFDD;EACAA,OAAAA,EAEDJ,eAFCI,CAEeI,WAFfJ,CAAAA,GAAAA,SAAAA;EACCC,eAAAA,EAEMF,kBAFNE,CAEyBG,WAFzBH,CAAAA,EAAAA,GAAAA,SAAAA;EACcG,aAAAA,EAEVP,iBAFUO,GAAAA,IAAAA,GAAAA,SAAAA;EAAhBR,eAAAA,EAAAA,MAAAA,GAAAA,SAAAA;EAC2BQ,OAAAA,CAAAA,EAG1BF,kBAH0BE;;UAK9BC,yBAAAA,CAJSR;EAELK,GAAAA,CAAAA,IAAAA,EAGAI,WAHAJ,GAAAA,IAAAA,CAAAA,EAAAA,IAAAA;EAAkB,cAAA,EAAA,EAIVJ,oBAJU,CAAA,MAAA,CAAA,GAAA,SAAA;AAAA;AAMRS,iBAAAA,mBAAmBH,CAAAA,WAAA,CAAA,CAAA;EAAA,OAAA;EAAA,OAAA;EAAA,QAAA;EAAA,OAAA;EAAA,eAAA;EAAA,aAAA;EAAA,eAAA;EAAA;AAAA,CAAA,EAAiHD,wBAAjH,CAA0IC,WAA1I,CAAA,CAAA,EAAyJC,yBAAzJ"}
1
+ {"version":3,"file":"useFileDiffInstance.d.ts","names":["FileDiffOptions","GetHoveredLineResult","SelectedLineRange","DiffLineAnnotation","FileContents","FileDiffMetadata","VirtualFileMetrics","UseFileDiffInstanceProps","LAnnotation","UseFileDiffInstanceReturn","HTMLElement","useFileDiffInstance","oldFile","newFile","fileDiff","options","lineAnnotations","selectedLines","prerenderedHTML","metrics"],"sources":["../../../src/react/utils/useFileDiffInstance.d.ts"],"sourcesContent":["import { type FileDiffOptions } from '../../components/FileDiff';\nimport type { GetHoveredLineResult, SelectedLineRange } from '../../managers/InteractionManager';\nimport type { DiffLineAnnotation, FileContents, FileDiffMetadata, VirtualFileMetrics } from '../../types';\ninterface UseFileDiffInstanceProps<LAnnotation> {\n oldFile?: FileContents;\n newFile?: FileContents;\n fileDiff?: FileDiffMetadata;\n options: FileDiffOptions<LAnnotation> | undefined;\n lineAnnotations: DiffLineAnnotation<LAnnotation>[] | undefined;\n selectedLines: SelectedLineRange | null | undefined;\n prerenderedHTML: string | undefined;\n metrics?: VirtualFileMetrics;\n}\ninterface UseFileDiffInstanceReturn {\n ref(node: HTMLElement | null): void;\n getHoveredLine(): GetHoveredLineResult<'diff'> | undefined;\n}\nexport declare function useFileDiffInstance<LAnnotation>({ oldFile, newFile, fileDiff, options, lineAnnotations, selectedLines, prerenderedHTML, metrics }: UseFileDiffInstanceProps<LAnnotation>): UseFileDiffInstanceReturn;\nexport {};\n//# sourceMappingURL=useFileDiffInstance.d.ts.map"],"mappings":";;;;;UAGUO;YACIH;EADJG,OAAAA,CAAAA,EAEIH,YAFJG;EACIH,QAAAA,CAAAA,EAECC,gBAFDD;EACAA,OAAAA,EAEDJ,eAFCI,CAEeI,WAFfJ,CAAAA,GAAAA,SAAAA;EACCC,eAAAA,EAEMF,kBAFNE,CAEyBG,WAFzBH,CAAAA,EAAAA,GAAAA,SAAAA;EACcG,aAAAA,EAEVN,iBAFUM,GAAAA,IAAAA,GAAAA,SAAAA;EAAhBR,eAAAA,EAAAA,MAAAA,GAAAA,SAAAA;EAC2BQ,OAAAA,CAAAA,EAG1BF,kBAH0BE;;UAK9BC,yBAAAA,CAJSP;EAELI,GAAAA,CAAAA,IAAAA,EAGAI,WAHAJ,GAAAA,IAAAA,CAAAA,EAAAA,IAAAA;EAAkB,cAAA,EAAA,EAIVL,oBAJU,CAAA,MAAA,CAAA,GAAA,SAAA;AAAA;AAMRU,iBAAAA,mBAAmBH,CAAAA,WAAA,CAAA,CAAA;EAAA,OAAA;EAAA,OAAA;EAAA,QAAA;EAAA,OAAA;EAAA,eAAA;EAAA,aAAA;EAAA,eAAA;EAAA;AAAA,CAAA,EAAiHD,wBAAjH,CAA0IC,WAA1I,CAAA,CAAA,EAAyJC,yBAAzJ"}
@@ -1 +1 @@
1
- {"version":3,"file":"useFileDiffInstance.js","names":[],"sources":["../../../src/react/utils/useFileDiffInstance.ts"],"sourcesContent":["import {\n useCallback,\n useContext,\n useEffect,\n useLayoutEffect,\n useRef,\n} from 'react';\n\nimport { FileDiff, type FileDiffOptions } from '../../components/FileDiff';\nimport { VirtualizedFileDiff } from '../../components/VirtualizedFileDiff';\nimport type { SelectedLineRange } from '../../managers/LineSelectionManager';\nimport type { GetHoveredLineResult } from '../../managers/MouseEventManager';\nimport type {\n DiffLineAnnotation,\n FileContents,\n FileDiffMetadata,\n VirtualFileMetrics,\n} from '../../types';\nimport { areOptionsEqual } from '../../utils/areOptionsEqual';\nimport { useVirtualizer } from '../Virtualizer';\nimport { WorkerPoolContext } from '../WorkerPoolContext';\nimport { useStableCallback } from './useStableCallback';\n\nconst useIsometricEffect =\n typeof window === 'undefined' ? useEffect : useLayoutEffect;\n\ninterface UseFileDiffInstanceProps<LAnnotation> {\n oldFile?: FileContents;\n newFile?: FileContents;\n fileDiff?: FileDiffMetadata;\n options: FileDiffOptions<LAnnotation> | undefined;\n lineAnnotations: DiffLineAnnotation<LAnnotation>[] | undefined;\n selectedLines: SelectedLineRange | null | undefined;\n prerenderedHTML: string | undefined;\n metrics?: VirtualFileMetrics;\n}\n\ninterface UseFileDiffInstanceReturn {\n ref(node: HTMLElement | null): void;\n getHoveredLine(): GetHoveredLineResult<'diff'> | undefined;\n}\n\nexport function useFileDiffInstance<LAnnotation>({\n oldFile,\n newFile,\n fileDiff,\n options,\n lineAnnotations,\n selectedLines,\n prerenderedHTML,\n metrics,\n}: UseFileDiffInstanceProps<LAnnotation>): UseFileDiffInstanceReturn {\n const simpleVirtualizer = useVirtualizer();\n const poolManager = useContext(WorkerPoolContext);\n const instanceRef = useRef<\n FileDiff<LAnnotation> | VirtualizedFileDiff<LAnnotation> | null\n >(null);\n const ref = useStableCallback((fileContainer: HTMLElement | null) => {\n if (fileContainer != null) {\n if (instanceRef.current != null) {\n throw new Error(\n 'useFileDiffInstance: An instance should not already exist when a node is created'\n );\n }\n if (simpleVirtualizer != null) {\n instanceRef.current = new VirtualizedFileDiff(\n options,\n simpleVirtualizer,\n metrics,\n poolManager,\n true\n );\n } else {\n instanceRef.current = new FileDiff(options, poolManager, true);\n }\n void instanceRef.current.hydrate({\n fileDiff,\n oldFile,\n newFile,\n fileContainer,\n lineAnnotations,\n prerenderedHTML,\n });\n } else {\n if (instanceRef.current == null) {\n throw new Error(\n 'useFileDiffInstance: A FileDiff instance should exist when unmounting'\n );\n }\n instanceRef.current.cleanUp();\n instanceRef.current = null;\n }\n });\n\n useIsometricEffect(() => {\n if (instanceRef.current == null) return;\n const instance = instanceRef.current;\n const forceRender = !areOptionsEqual(instance.options, options);\n instance.setOptions(options);\n void instance.render({\n forceRender,\n fileDiff,\n oldFile,\n newFile,\n lineAnnotations,\n });\n if (selectedLines !== undefined) {\n instance.setSelectedLines(selectedLines);\n }\n });\n\n const getHoveredLine = useCallback(():\n | GetHoveredLineResult<'diff'>\n | undefined => {\n return instanceRef.current?.getHoveredLine();\n }, []);\n\n return { ref, getHoveredLine };\n}\n"],"mappings":";;;;;;;;;AAuBA,MAAM,qBACJ,OAAO,WAAW,cAAc,YAAY;AAkB9C,SAAgB,oBAAiC,EAC/C,SACA,SACA,UACA,SACA,iBACA,eACA,iBACA,WACmE;CACnE,MAAM,oBAAoB,gBAAgB;CAC1C,MAAM,cAAc,WAAW,kBAAkB;CACjD,MAAM,cAAc,OAElB,KAAK;CACP,MAAM,MAAM,mBAAmB,kBAAsC;AACnE,MAAI,iBAAiB,MAAM;AACzB,OAAI,YAAY,WAAW,KACzB,OAAM,IAAI,MACR,mFACD;AAEH,OAAI,qBAAqB,KACvB,aAAY,UAAU,IAAI,oBACxB,SACA,mBACA,SACA,aACA,KACD;OAED,aAAY,UAAU,IAAI,SAAS,SAAS,aAAa,KAAK;AAEhE,GAAK,YAAY,QAAQ,QAAQ;IAC/B;IACA;IACA;IACA;IACA;IACA;IACD,CAAC;SACG;AACL,OAAI,YAAY,WAAW,KACzB,OAAM,IAAI,MACR,wEACD;AAEH,eAAY,QAAQ,SAAS;AAC7B,eAAY,UAAU;;GAExB;AAEF,0BAAyB;AACvB,MAAI,YAAY,WAAW,KAAM;EACjC,MAAM,WAAW,YAAY;EAC7B,MAAM,cAAc,CAAC,gBAAgB,SAAS,SAAS,QAAQ;AAC/D,WAAS,WAAW,QAAQ;AAC5B,EAAK,SAAS,OAAO;GACnB;GACA;GACA;GACA;GACA;GACD,CAAC;AACF,MAAI,kBAAkB,OACpB,UAAS,iBAAiB,cAAc;GAE1C;AAQF,QAAO;EAAE;EAAK,gBANS,kBAEN;AACf,UAAO,YAAY,SAAS,gBAAgB;KAC3C,EAAE,CAAC;EAEwB"}
1
+ {"version":3,"file":"useFileDiffInstance.js","names":[],"sources":["../../../src/react/utils/useFileDiffInstance.ts"],"sourcesContent":["import {\n useCallback,\n useContext,\n useEffect,\n useLayoutEffect,\n useRef,\n} from 'react';\n\nimport { FileDiff, type FileDiffOptions } from '../../components/FileDiff';\nimport { VirtualizedFileDiff } from '../../components/VirtualizedFileDiff';\nimport type {\n GetHoveredLineResult,\n SelectedLineRange,\n} from '../../managers/InteractionManager';\nimport type {\n DiffLineAnnotation,\n FileContents,\n FileDiffMetadata,\n VirtualFileMetrics,\n} from '../../types';\nimport { areOptionsEqual } from '../../utils/areOptionsEqual';\nimport { useVirtualizer } from '../Virtualizer';\nimport { WorkerPoolContext } from '../WorkerPoolContext';\nimport { useStableCallback } from './useStableCallback';\n\nconst useIsometricEffect =\n typeof window === 'undefined' ? useEffect : useLayoutEffect;\n\ninterface UseFileDiffInstanceProps<LAnnotation> {\n oldFile?: FileContents;\n newFile?: FileContents;\n fileDiff?: FileDiffMetadata;\n options: FileDiffOptions<LAnnotation> | undefined;\n lineAnnotations: DiffLineAnnotation<LAnnotation>[] | undefined;\n selectedLines: SelectedLineRange | null | undefined;\n prerenderedHTML: string | undefined;\n metrics?: VirtualFileMetrics;\n}\n\ninterface UseFileDiffInstanceReturn {\n ref(node: HTMLElement | null): void;\n getHoveredLine(): GetHoveredLineResult<'diff'> | undefined;\n}\n\nexport function useFileDiffInstance<LAnnotation>({\n oldFile,\n newFile,\n fileDiff,\n options,\n lineAnnotations,\n selectedLines,\n prerenderedHTML,\n metrics,\n}: UseFileDiffInstanceProps<LAnnotation>): UseFileDiffInstanceReturn {\n const simpleVirtualizer = useVirtualizer();\n const poolManager = useContext(WorkerPoolContext);\n const instanceRef = useRef<\n FileDiff<LAnnotation> | VirtualizedFileDiff<LAnnotation> | null\n >(null);\n const ref = useStableCallback((fileContainer: HTMLElement | null) => {\n if (fileContainer != null) {\n if (instanceRef.current != null) {\n throw new Error(\n 'useFileDiffInstance: An instance should not already exist when a node is created'\n );\n }\n if (simpleVirtualizer != null) {\n instanceRef.current = new VirtualizedFileDiff(\n options,\n simpleVirtualizer,\n metrics,\n poolManager,\n true\n );\n } else {\n instanceRef.current = new FileDiff(options, poolManager, true);\n }\n void instanceRef.current.hydrate({\n fileDiff,\n oldFile,\n newFile,\n fileContainer,\n lineAnnotations,\n prerenderedHTML,\n });\n } else {\n if (instanceRef.current == null) {\n throw new Error(\n 'useFileDiffInstance: A FileDiff instance should exist when unmounting'\n );\n }\n instanceRef.current.cleanUp();\n instanceRef.current = null;\n }\n });\n\n useIsometricEffect(() => {\n if (instanceRef.current == null) return;\n const instance = instanceRef.current;\n const forceRender = !areOptionsEqual(instance.options, options);\n instance.setOptions(options);\n void instance.render({\n forceRender,\n fileDiff,\n oldFile,\n newFile,\n lineAnnotations,\n });\n if (selectedLines !== undefined) {\n instance.setSelectedLines(selectedLines);\n }\n });\n\n const getHoveredLine = useCallback(():\n | GetHoveredLineResult<'diff'>\n | undefined => {\n return instanceRef.current?.getHoveredLine();\n }, []);\n\n return { ref, getHoveredLine };\n}\n"],"mappings":";;;;;;;;;AAyBA,MAAM,qBACJ,OAAO,WAAW,cAAc,YAAY;AAkB9C,SAAgB,oBAAiC,EAC/C,SACA,SACA,UACA,SACA,iBACA,eACA,iBACA,WACmE;CACnE,MAAM,oBAAoB,gBAAgB;CAC1C,MAAM,cAAc,WAAW,kBAAkB;CACjD,MAAM,cAAc,OAElB,KAAK;CACP,MAAM,MAAM,mBAAmB,kBAAsC;AACnE,MAAI,iBAAiB,MAAM;AACzB,OAAI,YAAY,WAAW,KACzB,OAAM,IAAI,MACR,mFACD;AAEH,OAAI,qBAAqB,KACvB,aAAY,UAAU,IAAI,oBACxB,SACA,mBACA,SACA,aACA,KACD;OAED,aAAY,UAAU,IAAI,SAAS,SAAS,aAAa,KAAK;AAEhE,GAAK,YAAY,QAAQ,QAAQ;IAC/B;IACA;IACA;IACA;IACA;IACA;IACD,CAAC;SACG;AACL,OAAI,YAAY,WAAW,KACzB,OAAM,IAAI,MACR,wEACD;AAEH,eAAY,QAAQ,SAAS;AAC7B,eAAY,UAAU;;GAExB;AAEF,0BAAyB;AACvB,MAAI,YAAY,WAAW,KAAM;EACjC,MAAM,WAAW,YAAY;EAC7B,MAAM,cAAc,CAAC,gBAAgB,SAAS,SAAS,QAAQ;AAC/D,WAAS,WAAW,QAAQ;AAC5B,EAAK,SAAS,OAAO;GACnB;GACA;GACA;GACA;GACA;GACD,CAAC;AACF,MAAI,kBAAkB,OACpB,UAAS,iBAAiB,cAAc;GAE1C;AAQF,QAAO;EAAE;EAAK,gBANS,kBAEN;AACf,UAAO,YAAY,SAAS,gBAAgB;KAC3C,EAAE,CAAC;EAEwB"}
@@ -1,6 +1,5 @@
1
1
  import { FileContents, LineAnnotation, VirtualFileMetrics } from "../../types.js";
2
- import { SelectedLineRange } from "../../managers/LineSelectionManager.js";
3
- import { GetHoveredLineResult } from "../../managers/MouseEventManager.js";
2
+ import { GetHoveredLineResult, SelectedLineRange } from "../../managers/InteractionManager.js";
4
3
  import { FileOptions } from "../../components/File.js";
5
4
 
6
5
  //#region src/react/utils/useFileInstance.d.ts
@@ -1 +1 @@
1
- {"version":3,"file":"useFileInstance.d.ts","names":["FileOptions","SelectedLineRange","GetHoveredLineResult","FileContents","LineAnnotation","VirtualFileMetrics","UseFileInstanceProps","LAnnotation","UseFileInstanceReturn","HTMLElement","useFileInstance","file","options","lineAnnotations","selectedLines","prerenderedHTML","metrics"],"sources":["../../../src/react/utils/useFileInstance.d.ts"],"sourcesContent":["import { type FileOptions } from '../../components/File';\nimport type { SelectedLineRange } from '../../managers/LineSelectionManager';\nimport type { GetHoveredLineResult } from '../../managers/MouseEventManager';\nimport type { FileContents, LineAnnotation, VirtualFileMetrics } from '../../types';\ninterface UseFileInstanceProps<LAnnotation> {\n file: FileContents;\n options: FileOptions<LAnnotation> | undefined;\n lineAnnotations: LineAnnotation<LAnnotation>[] | undefined;\n selectedLines: SelectedLineRange | null | undefined;\n prerenderedHTML: string | undefined;\n metrics?: VirtualFileMetrics;\n}\ninterface UseFileInstanceReturn {\n ref(node: HTMLElement | null): void;\n getHoveredLine(): GetHoveredLineResult<'file'> | undefined;\n}\nexport declare function useFileInstance<LAnnotation>({ file, options, lineAnnotations, selectedLines, prerenderedHTML, metrics }: UseFileInstanceProps<LAnnotation>): UseFileInstanceReturn;\nexport {};\n//# sourceMappingURL=useFileInstance.d.ts.map"],"mappings":";;;;;;UAIUM;QACAH;EADAG,OAAAA,EAEGN,WAFHM,CAEeC,WAFKA,CAAAA,GAAAA,SAAAA;EACpBJ,eAAAA,EAEWC,cAFXD,CAE0BI,WAF1BJ,CAAAA,EAAAA,GAAAA,SAAAA;EACeI,aAAAA,EAENN,iBAFMM,GAAAA,IAAAA,GAAAA,SAAAA;EAAZP,eAAAA,EAAAA,MAAAA,GAAAA,SAAAA;EACuBO,OAAAA,CAAAA,EAGtBF,kBAHsBE;;UAK1BC,qBAAAA,CAJSP;EAELI,GAAAA,CAAAA,IAAAA,EAGAI,WAHAJ,GAAAA,IAAAA,CAAAA,EAAAA,IAAAA;EAAkB,cAAA,EAAA,EAIVH,oBAJU,CAAA,MAAA,CAAA,GAAA,SAAA;AAAA;AAMRQ,iBAAAA,eAAeH,CAAAA,WAAA,CAAA,CAAA;EAAA,IAAA;EAAA,OAAA;EAAA,eAAA;EAAA,aAAA;EAAA,eAAA;EAAA;AAAA,CAAA,EAA2FD,oBAA3F,CAAgHC,WAAhH,CAAA,CAAA,EAA+HC,qBAA/H"}
1
+ {"version":3,"file":"useFileInstance.d.ts","names":["FileOptions","GetHoveredLineResult","SelectedLineRange","FileContents","LineAnnotation","VirtualFileMetrics","UseFileInstanceProps","LAnnotation","UseFileInstanceReturn","HTMLElement","useFileInstance","file","options","lineAnnotations","selectedLines","prerenderedHTML","metrics"],"sources":["../../../src/react/utils/useFileInstance.d.ts"],"sourcesContent":["import { type FileOptions } from '../../components/File';\nimport type { GetHoveredLineResult, SelectedLineRange } from '../../managers/InteractionManager';\nimport type { FileContents, LineAnnotation, VirtualFileMetrics } from '../../types';\ninterface UseFileInstanceProps<LAnnotation> {\n file: FileContents;\n options: FileOptions<LAnnotation> | undefined;\n lineAnnotations: LineAnnotation<LAnnotation>[] | undefined;\n selectedLines: SelectedLineRange | null | undefined;\n prerenderedHTML: string | undefined;\n metrics?: VirtualFileMetrics;\n}\ninterface UseFileInstanceReturn {\n ref(node: HTMLElement | null): void;\n getHoveredLine(): GetHoveredLineResult<'file'> | undefined;\n}\nexport declare function useFileInstance<LAnnotation>({ file, options, lineAnnotations, selectedLines, prerenderedHTML, metrics }: UseFileInstanceProps<LAnnotation>): UseFileInstanceReturn;\nexport {};\n//# sourceMappingURL=useFileInstance.d.ts.map"],"mappings":";;;;;UAGUM;QACAH;EADAG,OAAAA,EAEGN,WAFHM,CAEeC,WAFKA,CAAAA,GAAAA,SAAAA;EACpBJ,eAAAA,EAEWC,cAFXD,CAE0BI,WAF1BJ,CAAAA,EAAAA,GAAAA,SAAAA;EACeI,aAAAA,EAENL,iBAFMK,GAAAA,IAAAA,GAAAA,SAAAA;EAAZP,eAAAA,EAAAA,MAAAA,GAAAA,SAAAA;EACuBO,OAAAA,CAAAA,EAGtBF,kBAHsBE;;UAK1BC,qBAAAA,CAJSN;EAELG,GAAAA,CAAAA,IAAAA,EAGAI,WAHAJ,GAAAA,IAAAA,CAAAA,EAAAA,IAAAA;EAAkB,cAAA,EAAA,EAIVJ,oBAJU,CAAA,MAAA,CAAA,GAAA,SAAA;AAAA;AAMRS,iBAAAA,eAAeH,CAAAA,WAAA,CAAA,CAAA;EAAA,IAAA;EAAA,OAAA;EAAA,eAAA;EAAA,aAAA;EAAA,eAAA;EAAA;AAAA,CAAA,EAA2FD,oBAA3F,CAAgHC,WAAhH,CAAA,CAAA,EAA+HC,qBAA/H"}