@pierre/diffs 1.1.7 → 1.1.9

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/AdvancedVirtualizedFileDiff.d.ts.map +1 -1
  2. package/dist/components/File.d.ts.map +1 -1
  3. package/dist/components/FileDiff.js +2 -2
  4. package/dist/components/FileDiff.js.map +1 -1
  5. package/dist/components/UnresolvedFile.d.ts.map +1 -1
  6. package/dist/components/VirtualizedFileDiff.js +1 -1
  7. package/dist/components/VirtualizedFileDiff.js.map +1 -1
  8. package/dist/index.d.ts +4 -3
  9. package/dist/index.js +2 -1
  10. package/dist/managers/InteractionManager.d.ts +15 -2
  11. package/dist/managers/InteractionManager.d.ts.map +1 -1
  12. package/dist/managers/InteractionManager.js +143 -40
  13. package/dist/managers/InteractionManager.js.map +1 -1
  14. package/dist/react/index.d.ts +2 -2
  15. package/dist/renderers/DiffHunksRenderer.js +11 -10
  16. package/dist/renderers/DiffHunksRenderer.js.map +1 -1
  17. package/dist/renderers/FileRenderer.js +3 -1
  18. package/dist/renderers/FileRenderer.js.map +1 -1
  19. package/dist/ssr/FileDiffReact.js +1 -1
  20. package/dist/ssr/index.d.ts +2 -2
  21. package/dist/ssr/preloadDiffs.js +1 -1
  22. package/dist/ssr/preloadDiffs.js.map +1 -1
  23. package/dist/style.js +1 -1
  24. package/dist/style.js.map +1 -1
  25. package/dist/types.d.ts +23 -2
  26. package/dist/types.d.ts.map +1 -1
  27. package/dist/utils/areDiffRenderOptionsEqual.d.ts +7 -0
  28. package/dist/utils/areDiffRenderOptionsEqual.d.ts.map +1 -0
  29. package/dist/utils/areDiffRenderOptionsEqual.js +10 -0
  30. package/dist/utils/areDiffRenderOptionsEqual.js.map +1 -0
  31. package/dist/utils/areOptionsEqual.d.ts +2 -1
  32. package/dist/utils/areOptionsEqual.d.ts.map +1 -1
  33. package/dist/utils/areOptionsEqual.js +8 -1
  34. package/dist/utils/areOptionsEqual.js.map +1 -1
  35. package/dist/utils/createTransformerWithState.d.ts +1 -1
  36. package/dist/utils/createTransformerWithState.d.ts.map +1 -1
  37. package/dist/utils/createTransformerWithState.js +27 -2
  38. package/dist/utils/createTransformerWithState.js.map +1 -1
  39. package/dist/utils/parseDiffFromFile.js +1 -0
  40. package/dist/utils/parseDiffFromFile.js.map +1 -1
  41. package/dist/utils/renderDiffWithHighlighter.js +6 -3
  42. package/dist/utils/renderDiffWithHighlighter.js.map +1 -1
  43. package/dist/utils/renderFileWithHighlighter.d.ts +2 -1
  44. package/dist/utils/renderFileWithHighlighter.d.ts.map +1 -1
  45. package/dist/utils/renderFileWithHighlighter.js +2 -2
  46. package/dist/utils/renderFileWithHighlighter.js.map +1 -1
  47. package/dist/utils/shouldUseTokenTransformer.d.ts +9 -0
  48. package/dist/utils/shouldUseTokenTransformer.d.ts.map +1 -0
  49. package/dist/utils/shouldUseTokenTransformer.js +8 -0
  50. package/dist/utils/shouldUseTokenTransformer.js.map +1 -0
  51. package/dist/utils/wrapTokenFragments.d.ts +10 -0
  52. package/dist/utils/wrapTokenFragments.d.ts.map +1 -0
  53. package/dist/utils/wrapTokenFragments.js +82 -0
  54. package/dist/utils/wrapTokenFragments.js.map +1 -0
  55. package/dist/worker/WorkerPoolManager.d.ts +4 -0
  56. package/dist/worker/WorkerPoolManager.d.ts.map +1 -1
  57. package/dist/worker/WorkerPoolManager.js +11 -6
  58. package/dist/worker/WorkerPoolManager.js.map +1 -1
  59. package/dist/worker/types.d.ts +2 -0
  60. package/dist/worker/types.d.ts.map +1 -1
  61. package/dist/worker/worker-portable.js +142 -8
  62. package/dist/worker/worker-portable.js.map +1 -1
  63. package/dist/worker/worker.js +124 -8
  64. package/dist/worker/worker.js.map +1 -1
  65. package/package.json +1 -1
@@ -1 +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","mergeConflictActionTarget: MergeConflictActionTarget | 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 MergeConflictResolution,\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\nexport interface MergeConflictActionTarget {\n kind: 'merge-conflict-action';\n resolution: MergeConflictResolution;\n conflictIndex: number;\n}\n\ntype ResolvedPointerTarget<TMode extends InteractionManagerMode> =\n | ResolvedLineTarget<TMode>\n | ExpandoEventProps\n | MergeConflictActionTarget;\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 expansionLineCountOverride?: number\n ): unknown;\n onMergeConflictActionClick?(target: MergeConflictActionTarget): void;\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 {\n onHunkExpand,\n onLineClick,\n onLineNumberClick,\n onMergeConflictActionClick,\n } = this.options;\n if (\n onHunkExpand == null &&\n onLineClick == null &&\n onLineNumberClick == null &&\n onMergeConflictActionClick == 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 onMergeConflictActionClick,\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 (\n isMergeConflictActionPointerTarget(target) &&\n onMergeConflictActionClick != null\n ) {\n onMergeConflictActionClick(target);\n break;\n }\n if (isExpandoPointerTarget(target) && onHunkExpand != null) {\n onHunkExpand(\n target.hunkIndex,\n event.shiftKey ? 'both' : target.direction,\n event.shiftKey ? Number.POSITIVE_INFINITY : undefined\n );\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 onMergeConflictActionClick,\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 onMergeConflictActionClick != 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 if (onMergeConflictActionClick != null) {\n reasons.push('merge conflict actions');\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 contentElement.nextSibling.hasAttribute(\n 'data-merge-conflict-actions'\n ))\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 let mergeConflictActionTarget: MergeConflictActionTarget | undefined;\n\n for (const element of path) {\n if (!(element instanceof HTMLElement)) {\n continue;\n }\n\n if (\n mergeConflictActionTarget == null &&\n element.hasAttribute('data-merge-conflict-action')\n ) {\n const resolutionValue =\n element.getAttribute('data-merge-conflict-action') ?? undefined;\n const conflictIndexValue =\n element.getAttribute('data-merge-conflict-conflict-index') ??\n undefined;\n const conflictIndex =\n conflictIndexValue != null\n ? Number.parseInt(conflictIndexValue, 10)\n : Number.NaN;\n if (\n isMergeConflictResolution(resolutionValue) &&\n Number.isFinite(conflictIndex)\n ) {\n mergeConflictActionTarget = {\n kind: 'merge-conflict-action',\n resolution: resolutionValue,\n conflictIndex,\n };\n }\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 (mergeConflictActionTarget != null) {\n return mergeConflictActionTarget as ResolvedPointerTarget<TMode>;\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 | undefined;\n renderHoverUtility?(\n getHoveredRow: () => GetHoveredLineResult<TMode> | undefined\n ): HTMLElement | null | undefined;\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 expansionLineCount?: number\n ) => unknown,\n getLineIndex?: GetLineIndexUtility,\n onMergeConflictActionClick?: (target: MergeConflictActionTarget) => void\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 onMergeConflictActionClick,\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 isMergeConflictActionPointerTarget<\n TMode extends InteractionManagerMode,\n>(target: ResolvedPointerTarget<TMode>): target is MergeConflictActionTarget {\n return 'kind' in target && target.kind === 'merge-conflict-action';\n}\n\nfunction isMergeConflictResolution(\n value: string | undefined\n): value is MergeConflictResolution {\n return value === 'current' || value === 'incoming' || value === 'both';\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":"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"}
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","tokenElement: HTMLElement | undefined","tokenInfo: TokenCache | undefined","expandInfo: ExpandCache | undefined","lineNumber: number | undefined","mergeConflictActionTarget: MergeConflictActionTarget | undefined"],"sources":["../../src/managers/InteractionManager.ts"],"sourcesContent":["import { toHtml } from 'hast-util-to-html';\n\nimport type {\n AnnotationSide,\n DiffLineEventBaseProps,\n DiffTokenEventBaseProps,\n ExpansionDirections,\n LineEventBaseProps,\n LineTypes,\n MergeConflictResolution,\n SelectionPoint,\n SelectionSide,\n TokenEventBase,\n} from '../types';\nimport { areSelectionPointsEqual } from '../utils/areSelectionPointsEqual';\nimport { areSelectionsEqual } from '../utils/areSelectionsEqual';\nimport { createGutterUtilityElement } from '../utils/createGutterUtilityElement';\n\ninterface TokenCache {\n tokenElement: HTMLElement;\n lineCharStart: number;\n lineCharEnd: number;\n tokenText: string;\n}\n\ninterface ExpandCache {\n hunkIndex: number | undefined;\n direction: ExpansionDirections;\n}\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\nexport type OnTokenEventProps<TMode extends InteractionManagerMode> =\n TMode extends 'file' ? TokenEventBase : DiffTokenEventBaseProps;\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\ninterface ResolvedTokenTarget<TMode extends InteractionManagerMode> {\n kind: 'token';\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 tokenElement: HTMLElement;\n tokenText: string;\n lineCharStart: number;\n lineCharEnd: number;\n}\n\nexport interface MergeConflictActionTarget {\n kind: 'merge-conflict-action';\n resolution: MergeConflictResolution;\n conflictIndex: number;\n}\n\ntype ResolvedPointerTarget<TMode extends InteractionManagerMode> =\n | ResolvedLineTarget<TMode>\n | ResolvedTokenTarget<TMode>\n | ExpandoEventProps\n | MergeConflictActionTarget;\n\ntype LinePointerTarget<TMode extends InteractionManagerMode> =\n ResolvedLineTarget<TMode>;\n\ntype TokenPointerTarget<TMode extends InteractionManagerMode> =\n ResolvedTokenTarget<TMode>;\n\ntype HoverableLinePointerTarget<TMode extends InteractionManagerMode> =\n | LinePointerTarget<TMode>\n | TokenPointerTarget<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 enableTokenInteractionsOnWhitespace?: boolean;\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 onTokenClick?(props: OnTokenEventProps<TMode>, event: MouseEvent): unknown;\n onTokenEnter?(props: OnTokenEventProps<TMode>, event: PointerEvent): unknown;\n onTokenLeave?(props: OnTokenEventProps<TMode>, event: PointerEvent): 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 expansionLineCountOverride?: number\n ): unknown;\n onMergeConflictActionClick?(target: MergeConflictActionTarget): void;\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 hoveredToken: OnTokenEventProps<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.clearHoveredToken();\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 {\n onHunkExpand,\n onLineClick,\n onLineNumberClick,\n onTokenClick,\n onMergeConflictActionClick,\n } = this.options;\n if (\n onHunkExpand == null &&\n onLineClick == null &&\n onLineNumberClick == null &&\n onMergeConflictActionClick == null &&\n onTokenClick == 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 onTokenEnter,\n onTokenLeave,\n enableGutterUtility = false,\n } = this.options;\n if (\n lineHoverHighlight === 'disabled' &&\n !enableGutterUtility &&\n onLineEnter == null &&\n onLineLeave == null &&\n onTokenEnter == null &&\n onTokenLeave == 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 && this.hoveredToken == null) {\n debugLogIfEnabled(\n __debugPointerEvents,\n 'move',\n 'FileDiff.DEBUG.handlePointerLeave: returned early, no hovered line or token'\n );\n return;\n }\n this.gutterUtilityContainer?.remove();\n if (this.hoveredToken != null) {\n this.options.onTokenLeave?.(this.hoveredToken, event);\n this.clearHoveredToken();\n }\n\n if (this.hoveredLine != null) {\n this.options.onLineLeave?.({\n ...this.hoveredLine,\n event,\n } as PointerEventEnterLeaveProps<TMode>);\n this.clearHoveredLine();\n }\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 onTokenClick,\n onTokenEnter,\n onTokenLeave,\n onHunkExpand,\n onMergeConflictActionClick,\n } = this.options;\n\n switch (eventType) {\n case 'move': {\n const sameLine =\n isHoverableLinePointerTarget(target) &&\n this.hoveredLine?.lineElement === target.lineElement;\n const sameToken =\n isTokenPointerTarget(target) &&\n this.hoveredToken?.tokenElement === target.tokenElement;\n\n // Handle token transitions\n if (!sameToken) {\n if (this.hoveredToken != null) {\n onTokenLeave?.(this.hoveredToken, event as PointerEvent);\n this.clearHoveredToken();\n }\n if (isTokenPointerTarget(target)) {\n this.setHoveredToken(this.toTokenEventBaseProps(target));\n onTokenEnter?.(\n this.hoveredToken as OnTokenEventProps<TMode>,\n event as PointerEvent\n );\n }\n }\n\n // Handle line transitions\n if (!sameLine) {\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 (isHoverableLinePointerTarget(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 }\n break;\n }\n case 'click': {\n if (target == null) {\n break;\n }\n if (\n isMergeConflictActionPointerTarget(target) &&\n onMergeConflictActionClick != null\n ) {\n onMergeConflictActionClick(target);\n break;\n }\n if (isExpandoPointerTarget(target) && onHunkExpand != null) {\n onHunkExpand(\n target.hunkIndex,\n event.shiftKey ? 'both' : target.direction,\n event.shiftKey ? Number.POSITIVE_INFINITY : undefined\n );\n break;\n }\n\n if (!isHoverableLinePointerTarget(target)) {\n break;\n }\n\n if (isTokenPointerTarget(target) && onTokenClick != null) {\n onTokenClick(this.toTokenEventBaseProps(target), event as MouseEvent);\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 onTokenClick,\n onTokenEnter,\n onTokenLeave,\n onHunkExpand,\n onMergeConflictActionClick,\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 onLineEnter != null ||\n onLineLeave != null ||\n onTokenClick != null ||\n onTokenEnter != null ||\n onTokenLeave != null ||\n onHunkExpand != null ||\n onMergeConflictActionClick != 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 if (onMergeConflictActionClick != null) {\n reasons.push('merge conflict actions');\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 clearHoveredToken() {\n if (this.hoveredToken == null) {\n return;\n }\n this.hoveredToken = undefined;\n }\n\n private setHoveredToken(hoveredToken: OnTokenEventProps<TMode>) {\n if (this.hoveredToken != null) {\n this.clearHoveredToken();\n }\n this.hoveredToken = hoveredToken;\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 contentElement.nextSibling.hasAttribute(\n 'data-merge-conflict-actions'\n ))\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: HoverableLinePointerTarget<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 toTokenEventBaseProps({\n lineCharEnd,\n lineCharStart,\n lineNumber,\n side,\n tokenElement,\n tokenText,\n }: TokenPointerTarget<TMode>): OnTokenEventProps<TMode> {\n if (this.mode === 'file') {\n return {\n type: 'token',\n lineCharEnd,\n lineCharStart,\n lineNumber,\n tokenElement,\n tokenText,\n } as OnTokenEventProps<TMode>;\n }\n\n return {\n type: 'token',\n lineCharEnd,\n lineCharStart,\n lineNumber,\n side,\n tokenElement,\n tokenText,\n } as OnTokenEventProps<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 tokenElement: HTMLElement | undefined;\n let tokenInfo: TokenCache | undefined;\n let expandInfo: ExpandCache | undefined;\n let lineNumber: number | undefined;\n let mergeConflictActionTarget: MergeConflictActionTarget | undefined;\n\n for (const element of path) {\n if (!(element instanceof HTMLElement)) {\n continue;\n }\n\n if (\n mergeConflictActionTarget == null &&\n element.hasAttribute('data-merge-conflict-action')\n ) {\n const resolutionValue =\n element.getAttribute('data-merge-conflict-action') ?? undefined;\n const conflictIndexValue =\n element.getAttribute('data-merge-conflict-conflict-index') ??\n undefined;\n const conflictIndex =\n conflictIndexValue != null\n ? Number.parseInt(conflictIndexValue, 10)\n : Number.NaN;\n if (\n isMergeConflictResolution(resolutionValue) &&\n Number.isFinite(conflictIndex)\n ) {\n mergeConflictActionTarget = {\n kind: 'merge-conflict-action',\n resolution: resolutionValue,\n conflictIndex,\n };\n }\n }\n\n if (tokenElement == null && element.hasAttribute('data-char')) {\n tokenElement = element;\n const startAttr = element.getAttribute('data-char');\n\n if (startAttr != null) {\n const lineCharStart = Number.parseInt(startAttr, 10);\n if (!Number.isNaN(lineCharStart)) {\n const tokenText = element.textContent ?? '';\n const lineCharEnd = lineCharStart + tokenText.length;\n if (\n tokenText.trim() !== '' ||\n this.options.enableTokenInteractionsOnWhitespace === true\n ) {\n tokenInfo = {\n tokenElement,\n lineCharStart,\n lineCharEnd,\n tokenText,\n };\n }\n continue;\n }\n }\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 (mergeConflictActionTarget != null) {\n return mergeConflictActionTarget as ResolvedPointerTarget<TMode>;\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 (tokenInfo != null) {\n if (this.mode === 'file') {\n return {\n kind: 'token',\n lineType,\n lineElement,\n lineNumber,\n numberColumn,\n numberElement,\n side: undefined,\n splitLineIndex,\n ...tokenInfo,\n } as ResolvedPointerTarget<TMode>;\n }\n\n return {\n kind: 'token',\n lineType,\n lineElement,\n lineNumber,\n numberColumn,\n numberElement,\n side: getAnnotationSide(lineType, codeElement),\n splitLineIndex,\n ...tokenInfo,\n } as ResolvedPointerTarget<TMode>;\n }\n\n // Otherwise return line target\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 return {\n kind: 'line',\n lineType,\n lineElement,\n lineNumber,\n numberColumn,\n numberElement,\n side: getAnnotationSide(lineType, codeElement),\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 | undefined;\n renderHoverUtility?(\n getHoveredRow: () => GetHoveredLineResult<TMode> | undefined\n ): HTMLElement | null | undefined;\n };\n\nexport function pluckInteractionOptions<TMode extends InteractionManagerMode>(\n {\n enableTokenInteractionsOnWhitespace,\n enableGutterUtility,\n enableHoverUtility,\n lineHoverHighlight,\n onGutterUtilityClick,\n onLineClick,\n onLineEnter,\n onLineLeave,\n onLineNumberClick,\n onTokenClick,\n onTokenEnter,\n onTokenLeave,\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 expansionLineCount?: number\n ) => unknown,\n getLineIndex?: GetLineIndexUtility,\n onMergeConflictActionClick?: (target: MergeConflictActionTarget) => void\n): InteractionManagerOptions<TMode> {\n return {\n enableTokenInteractionsOnWhitespace,\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 onMergeConflictActionClick,\n onLineClick,\n onLineEnter,\n onLineLeave,\n onLineNumberClick,\n onTokenClick,\n onTokenEnter,\n onTokenLeave,\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 isTokenPointerTarget<TMode extends InteractionManagerMode>(\n target: ResolvedPointerTarget<TMode> | undefined\n): target is TokenPointerTarget<TMode> {\n return target != null && 'kind' in target && target.kind === 'token';\n}\n\nfunction isHoverableLinePointerTarget<TMode extends InteractionManagerMode>(\n target: ResolvedPointerTarget<TMode> | undefined\n): target is HoverableLinePointerTarget<TMode> {\n return isLinePointerTarget(target) || isTokenPointerTarget(target);\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 isMergeConflictActionPointerTarget<\n TMode extends InteractionManagerMode,\n>(target: ResolvedPointerTarget<TMode>): target is MergeConflictActionTarget {\n return 'kind' in target && target.kind === 'merge-conflict-action';\n}\n\nfunction isMergeConflictResolution(\n value: string | undefined\n): value is MergeConflictResolution {\n return value === 'current' || value === 'incoming' || value === 'both';\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 getAnnotationSide(\n lineType: LineTypes,\n codeElement: HTMLElement\n): 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\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":";;;;;;AAiNA,IAAa,qBAAb,MAAsE;CACpE,AAAQ;CACR,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,mBAAmB;AACxB,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,EACJ,cACA,aACA,mBACA,cACA,+BACE,KAAK;AACT,MACE,gBAAgB,QAChB,eAAe,QACf,qBAAqB,QACrB,8BAA8B,QAC9B,gBAAgB,KAEhB;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,cACA,cACA,sBAAsB,UACpB,KAAK;AACT,MACE,uBAAuB,cACvB,CAAC,uBACD,eAAe,QACf,eAAe,QACf,gBAAgB,QAChB,gBAAgB,KAEhB;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,QAAQ,KAAK,gBAAgB,MAAM;AACzD,qBACE,sBACA,QACA,8EACD;AACD;;AAEF,OAAK,wBAAwB,QAAQ;AACrC,MAAI,KAAK,gBAAgB,MAAM;AAC7B,QAAK,QAAQ,eAAe,KAAK,cAAc,MAAM;AACrD,QAAK,mBAAmB;;AAG1B,MAAI,KAAK,eAAe,MAAM;AAC5B,QAAK,QAAQ,cAAc;IACzB,GAAG,KAAK;IACR;IACD,CAAuC;AACxC,QAAK,kBAAkB;;;CAI3B,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,cACA,cACA,cACA,cACA,+BACE,KAAK;AAET,UAAQ,WAAR;GACE,KAAK,QAAQ;IACX,MAAM,WACJ,6BAA6B,OAAO,IACpC,KAAK,aAAa,gBAAgB,OAAO;AAM3C,QAAI,EAJF,qBAAqB,OAAO,IAC5B,KAAK,cAAc,iBAAiB,OAAO,eAG7B;AACd,SAAI,KAAK,gBAAgB,MAAM;AAC7B,qBAAe,KAAK,cAAc,MAAsB;AACxD,WAAK,mBAAmB;;AAE1B,SAAI,qBAAqB,OAAO,EAAE;AAChC,WAAK,gBAAgB,KAAK,sBAAsB,OAAO,CAAC;AACxD,qBACE,KAAK,cACL,MACD;;;AAKL,QAAI,CAAC,UAAU;AACb,SAAI,KAAK,eAAe,MAAM;AAC5B,WAAK,wBAAwB,QAAQ;AACrC,oBAAc;OACZ,GAAG,KAAK;OACD;OACR,CAAuC;AACxC,WAAK,kBAAkB;;AAEzB,SAAI,6BAA6B,OAAO,EAAE;AACxC,WAAK,eAAe,KAAK,iBAAiB,OAAO,CAAC;AAClD,UAAI,KAAK,0BAA0B,KACjC,QAAO,cAAc,YAAY,KAAK,uBAAuB;AAE/D,oBAAc;OACZ,GAAG,KAAK;OACD;OACR,CAAuC;;;AAG5C;;GAEF,KAAK,SAAS;AACZ,QAAI,UAAU,KACZ;AAEF,QACE,mCAAmC,OAAO,IAC1C,8BAA8B,MAC9B;AACA,gCAA2B,OAAO;AAClC;;AAEF,QAAI,uBAAuB,OAAO,IAAI,gBAAgB,MAAM;AAC1D,kBACE,OAAO,WACP,MAAM,WAAW,SAAS,OAAO,WACjC,MAAM,WAAW,OAAO,oBAAoB,OAC7C;AACD;;AAGF,QAAI,CAAC,6BAA6B,OAAO,CACvC;AAGF,QAAI,qBAAqB,OAAO,IAAI,gBAAgB,KAClD,cAAa,KAAK,sBAAsB,OAAO,EAAE,MAAoB;IAGvE,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,cACA,cACA,cACA,4BACA,sBAAsB,OACtB,sBAAsB,OACtB,yBACE,KAAK;EACT,MAAM,wBAAwB,wBAAwB;EACtD,MAAM,+BACJ,uBAAuB,cACvB,eAAe,QACf,qBAAqB,QACrB,eAAe,QACf,eAAe,QACf,gBAAgB,QAChB,gBAAgB,QAChB,gBAAgB,QAChB,gBAAgB,QAChB,8BAA8B,QAC9B,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;AAE5C,SAAI,8BAA8B,KAChC,SAAQ,KAAK,yBAAyB;;AAG1C,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,oBAAoB;AAC1B,MAAI,KAAK,gBAAgB,KACvB;AAEF,OAAK,eAAe;;CAGtB,AAAQ,gBAAgB,cAAwC;AAC9D,MAAI,KAAK,gBAAgB,KACvB,MAAK,mBAAmB;AAE1B,OAAK,eAAe;;CAGtB,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,gBACrC,eAAe,YAAY,aAAa,uBAAuB,IAC9D,eAAe,YAAY,aACzB,8BACD,GACH;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,sBAAsB,EAC5B,aACA,eACA,YACA,MACA,cACA,aACsD;AACtD,MAAI,KAAK,SAAS,OAChB,QAAO;GACL,MAAM;GACN;GACA;GACA;GACA;GACA;GACD;AAGH,SAAO;GACL,MAAM;GACN;GACA;GACA;GACA;GACA;GACA;GACD;;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;EACJ,IAAIC;EACJ,IAAIC;EACJ,IAAIC;EACJ,IAAIC;AAEJ,OAAK,MAAM,WAAW,MAAM;AAC1B,OAAI,EAAE,mBAAmB,aACvB;AAGF,OACE,6BAA6B,QAC7B,QAAQ,aAAa,6BAA6B,EAClD;IACA,MAAM,kBACJ,QAAQ,aAAa,6BAA6B,IAAI;IACxD,MAAM,qBACJ,QAAQ,aAAa,qCAAqC,IAC1D;IACF,MAAM,gBACJ,sBAAsB,OAClB,OAAO,SAAS,oBAAoB,GAAG,GACvC;AACN,QACE,0BAA0B,gBAAgB,IAC1C,OAAO,SAAS,cAAc,CAE9B,6BAA4B;KAC1B,MAAM;KACN,YAAY;KACZ;KACD;;AAIL,OAAI,gBAAgB,QAAQ,QAAQ,aAAa,YAAY,EAAE;AAC7D,mBAAe;IACf,MAAM,YAAY,QAAQ,aAAa,YAAY;AAEnD,QAAI,aAAa,MAAM;KACrB,MAAM,gBAAgB,OAAO,SAAS,WAAW,GAAG;AACpD,SAAI,CAAC,OAAO,MAAM,cAAc,EAAE;MAChC,MAAM,YAAY,QAAQ,eAAe;MACzC,MAAM,cAAc,gBAAgB,UAAU;AAC9C,UACE,UAAU,MAAM,KAAK,MACrB,KAAK,QAAQ,wCAAwC,KAErD,aAAY;OACV;OACA;OACA;OACA;OACD;AAEH;;;;GAKN,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,6BAA6B,KAC/B,QAAO;AAGT,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,aAAa,MAAM;AACrB,OAAI,KAAK,SAAS,OAChB,QAAO;IACL,MAAM;IACN;IACA;IACA;IACA;IACA;IACA,MAAM;IACN;IACA,GAAG;IACJ;AAGH,UAAO;IACL,MAAM;IACN;IACA;IACA;IACA;IACA;IACA,MAAM,kBAAkB,UAAU,YAAY;IAC9C;IACA,GAAG;IACJ;;AAIH,MAAI,KAAK,SAAS,OAChB,QAAO;GACL,MAAM;GACN;GACA;GACA;GACA;GACA;GACA,MAAM;GACN;GACD;AAGH,SAAO;GACL,MAAM;GACN;GACA;GACA;GACA;GACA;GACA,MAAM,kBAAkB,UAAU,YAAY;GAC9C;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,qCACA,qBACA,oBACA,oBACA,sBACA,aACA,aACA,aACA,mBACA,cACA,cACA,cACA,qBACA,oBACA,sBACA,qBACA,gBACA,sBACA,uBACA,sBAEF,cAKA,cACA,4BACkC;AAClC,QAAO;EACL;EACA,qBAAqB,iCAAiC;GACpD;GACA;GACA;GACA;GACA;GACD,CAAC;EACF,yBACE,uBAAuB,QAAQ,sBAAsB;EACvD;EAEA;EACA;EACA;EACA;EACA;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,qBACP,QACqC;AACrC,QAAO,UAAU,QAAQ,UAAU,UAAU,OAAO,SAAS;;AAG/D,SAAS,6BACP,QAC6C;AAC7C,QAAO,oBAAoB,OAAO,IAAI,qBAAqB,OAAO;;AAGpE,SAAS,uBACP,QAC6B;AAC7B,QAAO,UAAU,UAAU,OAAO,SAAS;;AAG7C,SAAS,mCAEP,QAA2E;AAC3E,QAAO,UAAU,UAAU,OAAO,SAAS;;AAG7C,SAAS,0BACP,OACkC;AAClC,QAAO,UAAU,aAAa,UAAU,cAAc,UAAU;;AAGlE,SAAS,iBACP,QACA,OACyB;CACzB,MAAM,UAAU,QAAQ,cAAc,MAAM;AAC5C,QAAO,mBAAmB,cAAc,UAAU;;AAGpD,SAAS,kBACP,UACA,aACgB;AAChB,SAAQ,UAAR;EACE,KAAK,kBACH,QAAO;EACT,KAAK,kBACH,QAAO;EACT,QACE,QAAO,YAAY,aAAa,iBAAiB,GAC7C,cACA;;;AAIV,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,4 +1,4 @@
1
- import { AnnotationLineMap, AnnotationSide, AnnotationSpan, AppliedThemeStyleCache, BaseCodeOptions, BaseDiffOptions, BaseDiffOptionsWithDefaults, BundledLanguage, ChangeContent, ChangeTypes, CodeColumnType, CodeToHastOptions, ConflictResolverTypes, ContextContent, CustomPreProperties, DecorationItem, DiffAcceptRejectHunkConfig, DiffAcceptRejectHunkType, DiffLineAnnotation, DiffLineEventBaseProps, DiffsHighlighter, DiffsThemeNames, ExpansionDirections, ExtensionFormatMap, FileContents, FileDiffMetadata, FileHeaderRenderMode, ForceDiffPlainTextOptions, ForceFilePlainTextOptions, GapSpan, HighlighterTypes, Hunk, HunkData, HunkExpansionRegion, HunkLineType, HunkSeparators, LanguageRegistration, LineAnnotation, LineDiffTypes, LineEventBaseProps, LineInfo, LineSpans, LineTypes, MergeConflictActionPayload, MergeConflictMarkerRow, MergeConflictMarkerRowType, MergeConflictRegion, MergeConflictResolution, ObservedAnnotationNodes, ObservedGridNodes, ParsedPatch, PrePropertiesConfig, ProcessFileConflictData, RenderDiffFilesResult, RenderDiffOptions, RenderDiffResult, RenderFileMetadata, RenderFileOptions, RenderFileResult, RenderHeaderMetadataCallback, RenderHeaderPrefixCallback, RenderRange, RenderWindow, RenderedDiffASTCache, RenderedFileASTCache, SelectionPoint, SelectionSide, SharedRenderState, ShikiTransformer, SupportedLanguages, ThemeRegistrationResolved, ThemeTypes, ThemedDiffResult, ThemedFileResult, ThemedToken, ThemesType, VirtualFileMetrics, VirtualWindowSpecs } from "../types.js";
1
+ import { AnnotationLineMap, AnnotationSide, AnnotationSpan, AppliedThemeStyleCache, BaseCodeOptions, BaseDiffOptions, BaseDiffOptionsWithDefaults, BundledLanguage, ChangeContent, ChangeTypes, CodeColumnType, CodeToHastOptions, ConflictResolverTypes, ContextContent, CreatePatchOptionsNonabortable, CustomPreProperties, DecorationItem, DiffAcceptRejectHunkConfig, DiffAcceptRejectHunkType, DiffLineAnnotation, DiffLineEventBaseProps, DiffTokenEventBaseProps, DiffsHighlighter, DiffsThemeNames, ExpansionDirections, ExtensionFormatMap, FileContents, FileDiffMetadata, FileHeaderRenderMode, ForceDiffPlainTextOptions, ForceFilePlainTextOptions, GapSpan, HighlighterTypes, Hunk, HunkData, HunkExpansionRegion, HunkLineType, HunkSeparators, LanguageRegistration, LineAnnotation, LineDiffTypes, LineEventBaseProps, LineInfo, LineSpans, LineTypes, MergeConflictActionPayload, MergeConflictMarkerRow, MergeConflictMarkerRowType, MergeConflictRegion, MergeConflictResolution, ObservedAnnotationNodes, ObservedGridNodes, ParsedPatch, PrePropertiesConfig, ProcessFileConflictData, RenderDiffFilesResult, RenderDiffOptions, RenderDiffResult, RenderFileMetadata, RenderFileOptions, RenderFileResult, RenderHeaderMetadataCallback, RenderHeaderPrefixCallback, RenderRange, RenderWindow, RenderedDiffASTCache, RenderedFileASTCache, SelectionPoint, SelectionSide, SharedRenderState, ShikiTransformer, SupportedLanguages, ThemeRegistrationResolved, ThemeTypes, ThemedDiffResult, ThemedFileResult, ThemedToken, ThemesType, TokenEventBase, 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";
@@ -16,4 +16,4 @@ import { templateRender } from "./utils/templateRender.js";
16
16
  import { useFileDiffInstance } from "./utils/useFileDiffInstance.js";
17
17
  import { useFileInstance } from "./utils/useFileInstance.js";
18
18
  import { useStableCallback } from "./utils/useStableCallback.js";
19
- export { AnnotationLineMap, AnnotationSide, AnnotationSpan, AppliedThemeStyleCache, BaseCodeOptions, BaseDiffOptions, BaseDiffOptionsWithDefaults, BundledLanguage, ChangeContent, ChangeTypes, CodeColumnType, CodeToHastOptions, ConflictResolverTypes, ContextContent, CustomPreProperties, DecorationItem, DiffAcceptRejectHunkConfig, DiffAcceptRejectHunkType, DiffBasePropsReact, DiffLineAnnotation, DiffLineEventBaseProps, DiffsHighlighter, DiffsThemeNames, ExpansionDirections, ExtensionFormatMap, File, FileContents, FileDiff, FileDiffMetadata, FileDiffProps, FileHeaderRenderMode, FileOptions, FileProps, ForceDiffPlainTextOptions, ForceFilePlainTextOptions, GapSpan, GutterUtilitySlotStyles, HighlighterTypes, Hunk, HunkData, HunkExpansionRegion, HunkLineType, HunkSeparators, LanguageRegistration, LineAnnotation, LineDiffTypes, LineEventBaseProps, LineInfo, LineSpans, LineTypes, MergeConflictActionPayload, MergeConflictActionsTypeOption, MergeConflictMarkerRow, MergeConflictMarkerRowType, MergeConflictRegion, MergeConflictResolution, MergeConflictSlotStyles, MultiFileDiff, MultiFileDiffProps, ObservedAnnotationNodes, ObservedGridNodes, ParsedPatch, PatchDiff, PatchDiffProps, PrePropertiesConfig, ProcessFileConflictData, RenderDiffFilesResult, RenderDiffOptions, RenderDiffResult, RenderFileMetadata, RenderFileOptions, RenderFileResult, RenderHeaderMetadataCallback, RenderHeaderPrefixCallback, RenderMergeConflictActionContext, RenderMergeConflictActions, RenderRange, RenderWindow, RenderedDiffASTCache, RenderedFileASTCache, SelectionPoint, SelectionSide, SharedRenderState, ShikiTransformer, SupportedLanguages, ThemeRegistrationResolved, ThemeTypes, ThemedDiffResult, ThemedFileResult, ThemedToken, ThemesType, UnresolvedFile, UnresolvedFileProps, UnresolvedFileReactOptions, VirtualFileMetrics, VirtualWindowSpecs, Virtualizer, VirtualizerContext, WorkerInitializationRenderOptions, WorkerPoolContext, WorkerPoolContextProvider, WorkerPoolOptions, noopRender, renderDiffChildren, renderFileChildren, templateRender, useFileDiffInstance, useFileInstance, useStableCallback, useVirtualizer, useWorkerPool };
19
+ export { AnnotationLineMap, AnnotationSide, AnnotationSpan, AppliedThemeStyleCache, BaseCodeOptions, BaseDiffOptions, BaseDiffOptionsWithDefaults, BundledLanguage, ChangeContent, ChangeTypes, CodeColumnType, CodeToHastOptions, ConflictResolverTypes, ContextContent, CreatePatchOptionsNonabortable, CustomPreProperties, DecorationItem, DiffAcceptRejectHunkConfig, DiffAcceptRejectHunkType, DiffBasePropsReact, DiffLineAnnotation, DiffLineEventBaseProps, DiffTokenEventBaseProps, DiffsHighlighter, DiffsThemeNames, ExpansionDirections, ExtensionFormatMap, File, FileContents, FileDiff, FileDiffMetadata, FileDiffProps, FileHeaderRenderMode, FileOptions, FileProps, ForceDiffPlainTextOptions, ForceFilePlainTextOptions, GapSpan, GutterUtilitySlotStyles, HighlighterTypes, Hunk, HunkData, HunkExpansionRegion, HunkLineType, HunkSeparators, LanguageRegistration, LineAnnotation, LineDiffTypes, LineEventBaseProps, LineInfo, LineSpans, LineTypes, MergeConflictActionPayload, MergeConflictActionsTypeOption, MergeConflictMarkerRow, MergeConflictMarkerRowType, MergeConflictRegion, MergeConflictResolution, MergeConflictSlotStyles, MultiFileDiff, MultiFileDiffProps, ObservedAnnotationNodes, ObservedGridNodes, ParsedPatch, PatchDiff, PatchDiffProps, PrePropertiesConfig, ProcessFileConflictData, RenderDiffFilesResult, RenderDiffOptions, RenderDiffResult, RenderFileMetadata, RenderFileOptions, RenderFileResult, RenderHeaderMetadataCallback, RenderHeaderPrefixCallback, RenderMergeConflictActionContext, RenderMergeConflictActions, RenderRange, RenderWindow, RenderedDiffASTCache, RenderedFileASTCache, SelectionPoint, SelectionSide, SharedRenderState, ShikiTransformer, SupportedLanguages, ThemeRegistrationResolved, ThemeTypes, ThemedDiffResult, ThemedFileResult, ThemedToken, ThemesType, TokenEventBase, UnresolvedFile, UnresolvedFileProps, UnresolvedFileReactOptions, VirtualFileMetrics, VirtualWindowSpecs, Virtualizer, VirtualizerContext, WorkerInitializationRenderOptions, WorkerPoolContext, WorkerPoolContextProvider, WorkerPoolOptions, noopRender, renderDiffChildren, renderFileChildren, templateRender, useFileDiffInstance, useFileInstance, useStableCallback, useVirtualizer, useWorkerPool };
@@ -4,7 +4,6 @@ import { areLanguagesAttached } from "../highlighter/languages/areLanguagesAttac
4
4
  import { getHighlighterIfLoaded, getSharedHighlighter } from "../highlighter/shared_highlighter.js";
5
5
  import { areThemesAttached } from "../highlighter/themes/areThemesAttached.js";
6
6
  import { areRenderRangesEqual } from "../utils/areRenderRangesEqual.js";
7
- import { areThemesEqual } from "../utils/areThemesEqual.js";
8
7
  import { createAnnotationElement } from "../utils/createAnnotationElement.js";
9
8
  import { createContentColumn } from "../utils/createContentColumn.js";
10
9
  import { createFileHeaderElement } from "../utils/createFileHeaderElement.js";
@@ -12,6 +11,8 @@ import { createPreElement } from "../utils/createPreElement.js";
12
11
  import { getFiletypeFromFileName } from "../utils/getFiletypeFromFileName.js";
13
12
  import { getHighlighterOptions } from "../utils/getHighlighterOptions.js";
14
13
  import { getLineAnnotationName } from "../utils/getLineAnnotationName.js";
14
+ import { shouldUseTokenTransformer } from "../utils/shouldUseTokenTransformer.js";
15
+ import { areDiffRenderOptionsEqual } from "../utils/areDiffRenderOptionsEqual.js";
15
16
  import { createEmptyRowBuffer } from "../utils/createEmptyRowBuffer.js";
16
17
  import { createNoNewlineElement } from "../utils/createNoNewlineElement.js";
17
18
  import { createSeparator } from "../utils/createSeparator.js";
@@ -105,7 +106,7 @@ var DiffHunksRenderer = class {
105
106
  return createAnnotationElement(span);
106
107
  }
107
108
  getOptionsWithDefaults() {
108
- const { diffIndicators = "bars", diffStyle = "split", disableBackground = false, disableFileHeader = false, disableLineNumbers = false, disableVirtualizationBuffers = false, collapsed = false, expandUnchanged = false, collapsedContextThreshold = DEFAULT_COLLAPSED_CONTEXT_THRESHOLD, expansionLineCount = 100, hunkSeparators = "line-info", lineDiffType = "word-alt", maxLineDiffLength = 1e3, overflow = "scroll", theme = DEFAULT_THEMES, headerRenderMode = "default", tokenizeMaxLineLength = 1e3, useCSSClasses = false } = this.options;
109
+ const { diffIndicators = "bars", diffStyle = "split", disableBackground = false, disableFileHeader = false, disableLineNumbers = false, disableVirtualizationBuffers = false, collapsed = false, expandUnchanged = false, collapsedContextThreshold = DEFAULT_COLLAPSED_CONTEXT_THRESHOLD, expansionLineCount = 100, hunkSeparators = "line-info", lineDiffType = "word-alt", maxLineDiffLength = 1e3, overflow = "scroll", theme = DEFAULT_THEMES, headerRenderMode = "default", tokenizeMaxLineLength = 1e3, useTokenTransformer = false, useCSSClasses = false } = this.options;
109
110
  return {
110
111
  diffIndicators,
111
112
  diffStyle,
@@ -124,6 +125,7 @@ var DiffHunksRenderer = class {
124
125
  theme: this.workerManager?.getDiffRenderOptions().theme ?? theme,
125
126
  headerRenderMode,
126
127
  tokenizeMaxLineLength,
128
+ useTokenTransformer,
127
129
  useCSSClasses
128
130
  };
129
131
  }
@@ -136,7 +138,7 @@ var DiffHunksRenderer = class {
136
138
  this.diff = diff;
137
139
  const { options } = this.getRenderOptions(diff);
138
140
  let cache = this.workerManager?.getDiffResultCache(diff);
139
- if (cache != null && !areRenderOptionsEqual(options, cache.options)) cache = void 0;
141
+ if (cache != null && !areDiffRenderOptionsEqual(options, cache.options)) cache = void 0;
140
142
  this.renderCache ??= {
141
143
  diff,
142
144
  highlighted: !isDiffPlainText(diff),
@@ -149,11 +151,13 @@ var DiffHunksRenderer = class {
149
151
  getRenderOptions(diff) {
150
152
  const options = (() => {
151
153
  if (this.workerManager?.isWorkingPool() === true) return this.workerManager.getDiffRenderOptions();
152
- const { theme, tokenizeMaxLineLength, lineDiffType } = this.getOptionsWithDefaults();
154
+ const { theme, tokenizeMaxLineLength, lineDiffType, maxLineDiffLength } = this.getOptionsWithDefaults();
153
155
  return {
154
156
  theme,
157
+ useTokenTransformer: shouldUseTokenTransformer(this.options),
155
158
  tokenizeMaxLineLength,
156
- lineDiffType
159
+ lineDiffType,
160
+ maxLineDiffLength
157
161
  };
158
162
  })();
159
163
  this.getOptionsWithDefaults();
@@ -162,7 +166,7 @@ var DiffHunksRenderer = class {
162
166
  options,
163
167
  forceRender: true
164
168
  };
165
- if (diff !== renderCache.diff || !areRenderOptionsEqual(options, renderCache.options)) return {
169
+ if (diff !== renderCache.diff || !areDiffRenderOptionsEqual(options, renderCache.options)) return {
166
170
  options,
167
171
  forceRender: true
168
172
  };
@@ -254,7 +258,7 @@ var DiffHunksRenderer = class {
254
258
  }
255
259
  onHighlightSuccess(diff, result, options) {
256
260
  if (this.renderCache == null) return;
257
- const triggerRenderUpdate = !this.renderCache.highlighted || !areRenderOptionsEqual(this.renderCache.options, options) || this.renderCache.diff !== diff;
261
+ const triggerRenderUpdate = !this.renderCache.highlighted || !areDiffRenderOptionsEqual(this.renderCache.options, options) || this.renderCache.diff !== diff;
258
262
  this.renderCache = {
259
263
  diff,
260
264
  options,
@@ -627,9 +631,6 @@ var DiffHunksRenderer = class {
627
631
  });
628
632
  }
629
633
  };
630
- function areRenderOptionsEqual(optionsA, optionsB) {
631
- return areThemesEqual(optionsA.theme, optionsB.theme) && optionsA.tokenizeMaxLineLength === optionsB.tokenizeMaxLineLength && optionsA.lineDiffType === optionsB.lineDiffType;
632
- }
633
634
  function getModifiedLinesString(lines) {
634
635
  return `${lines} unmodified line${lines > 1 ? "s" : ""}`;
635
636
  }