@pierre/diffs 1.1.13 → 1.1.15

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.
@@ -1 +1 @@
1
- {"version":3,"file":"UnresolvedFile.d.ts","names":["HunksRenderResult","UnresolvedFileHunksRenderer","UnresolvedFileHunksRendererOptions","FileContents","FileDiffMetadata","MergeConflictActionPayload","MergeConflictMarkerRow","MergeConflictResolution","MergeConflictDiffAction","WorkerPoolManager","FileDiff","FileDiffOptions","FileDiffRenderProps","RenderMergeConflictActions","LAnnotation","UnresolvedFile","HTMLElement","DocumentFragment","MergeConflictActionsTypeOption","UnresolvedFileOptions","Omit","UnresolvedFileRenderProps","UnresolvedFileHydrationProps","GetOrComputeDiffProps","ResolveConflictReturn","UnresolvedFileDataCache","HTMLPreElement","getUnresolvedDiffHunksRendererOptions"],"sources":["../../src/components/UnresolvedFile.d.ts"],"sourcesContent":["import type { HunksRenderResult } from '../renderers/DiffHunksRenderer';\nimport { UnresolvedFileHunksRenderer, type UnresolvedFileHunksRendererOptions } from '../renderers/UnresolvedFileHunksRenderer';\nimport type { FileContents, FileDiffMetadata, MergeConflictActionPayload, MergeConflictMarkerRow, MergeConflictResolution } from '../types';\nimport { type MergeConflictDiffAction } from '../utils/parseMergeConflictDiffFromFile';\nimport type { WorkerPoolManager } from '../worker';\nimport { FileDiff, type FileDiffOptions, type FileDiffRenderProps } from './FileDiff';\nexport type RenderMergeConflictActions<LAnnotation> = (action: MergeConflictDiffAction, instance: UnresolvedFile<LAnnotation>) => HTMLElement | DocumentFragment | null | undefined;\nexport type MergeConflictActionsTypeOption<LAnnotation> = 'none' | 'default' | RenderMergeConflictActions<LAnnotation>;\nexport interface UnresolvedFileOptions<LAnnotation> extends Omit<FileDiffOptions<LAnnotation>, 'diffStyle'> {\n onPostRender?(node: HTMLElement, instance: UnresolvedFile<LAnnotation>): unknown;\n mergeConflictActionsType?: MergeConflictActionsTypeOption<LAnnotation>;\n onMergeConflictAction?(payload: MergeConflictActionPayload, instance: UnresolvedFile<LAnnotation>): void;\n onMergeConflictResolve?(file: FileContents, payload: MergeConflictActionPayload): void;\n maxContextLines?: number;\n}\nexport interface UnresolvedFileRenderProps<LAnnotation> extends Omit<FileDiffRenderProps<LAnnotation>, 'oldFile' | 'newFile'> {\n file?: FileContents;\n actions?: (MergeConflictDiffAction | undefined)[];\n markerRows?: MergeConflictMarkerRow[];\n}\nexport interface UnresolvedFileHydrationProps<LAnnotation> extends Omit<UnresolvedFileRenderProps<LAnnotation>, 'file'> {\n file?: FileContents;\n fileContainer: HTMLElement;\n prerenderedHTML?: string;\n}\ninterface GetOrComputeDiffProps {\n file: FileContents | undefined;\n fileDiff: FileDiffMetadata | undefined;\n actions: (MergeConflictDiffAction | undefined)[] | undefined;\n markerRows: MergeConflictMarkerRow[] | undefined;\n}\ninterface ResolveConflictReturn {\n file: FileContents;\n fileDiff: FileDiffMetadata;\n actions: (MergeConflictDiffAction | undefined)[];\n markerRows: MergeConflictMarkerRow[];\n}\ntype UnresolvedFileDataCache = GetOrComputeDiffProps;\nexport declare class UnresolvedFile<LAnnotation = undefined> extends FileDiff<LAnnotation> {\n options: UnresolvedFileOptions<LAnnotation>;\n readonly __id: string;\n protected computedCache: UnresolvedFileDataCache;\n private conflictActions;\n private markerRows;\n private conflictActionCache;\n constructor(options?: UnresolvedFileOptions<LAnnotation>, workerManager?: WorkerPoolManager | undefined, isContainerManaged?: boolean);\n setOptions(options: UnresolvedFileOptions<LAnnotation> | undefined): void;\n protected createHunksRenderer(options: UnresolvedFileOptions<LAnnotation>): UnresolvedFileHunksRenderer<LAnnotation>;\n protected getHunksRendererOptions(options: UnresolvedFileOptions<LAnnotation>): UnresolvedFileHunksRendererOptions;\n protected applyPreNodeAttributes(pre: HTMLPreElement, result: HunksRenderResult): void;\n cleanUp(): void;\n private getOrComputeDiff;\n hydrate(props: UnresolvedFileHydrationProps<LAnnotation>): void;\n rerender(): void;\n render(props?: UnresolvedFileRenderProps<LAnnotation>): boolean;\n resolveConflict(conflictIndex: number, resolution: MergeConflictResolution, fileDiff?: FileDiffMetadata | undefined): ResolveConflictReturn | undefined;\n private resolveConflictAndRender;\n private setActiveMergeConflictState;\n private handleMergeConflictActionClick;\n private renderMergeConflictActionSlots;\n private renderMergeConflictAction;\n private clearMergeConflictActionCache;\n}\nexport declare function getUnresolvedDiffHunksRendererOptions<LAnnotation>(options?: UnresolvedFileOptions<LAnnotation>, baseOptions?: UnresolvedFileOptions<LAnnotation>): UnresolvedFileHunksRendererOptions;\nexport {};\n//# sourceMappingURL=UnresolvedFile.d.ts.map"],"mappings":"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"}
1
+ {"version":3,"file":"UnresolvedFile.d.ts","names":["HunksRenderResult","UnresolvedFileHunksRenderer","UnresolvedFileHunksRendererOptions","FileContents","FileDiffMetadata","MergeConflictActionPayload","MergeConflictMarkerRow","MergeConflictResolution","MergeConflictDiffAction","WorkerPoolManager","FileDiff","FileDiffOptions","FileDiffRenderProps","RenderMergeConflictActions","LAnnotation","UnresolvedFile","HTMLElement","DocumentFragment","MergeConflictActionsTypeOption","UnresolvedFileOptions","Omit","UnresolvedFileRenderProps","UnresolvedFileHydrationProps","GetOrComputeDiffProps","ResolveConflictReturn","UnresolvedFileDataCache","HTMLPreElement","getUnresolvedDiffHunksRendererOptions"],"sources":["../../src/components/UnresolvedFile.d.ts"],"sourcesContent":["import type { HunksRenderResult } from '../renderers/DiffHunksRenderer';\nimport { UnresolvedFileHunksRenderer, type UnresolvedFileHunksRendererOptions } from '../renderers/UnresolvedFileHunksRenderer';\nimport type { FileContents, FileDiffMetadata, MergeConflictActionPayload, MergeConflictMarkerRow, MergeConflictResolution } from '../types';\nimport { type MergeConflictDiffAction } from '../utils/parseMergeConflictDiffFromFile';\nimport type { WorkerPoolManager } from '../worker';\nimport { FileDiff, type FileDiffOptions, type FileDiffRenderProps } from './FileDiff';\nexport type RenderMergeConflictActions<LAnnotation> = (action: MergeConflictDiffAction, instance: UnresolvedFile<LAnnotation>) => HTMLElement | DocumentFragment | null | undefined;\nexport type MergeConflictActionsTypeOption<LAnnotation> = 'none' | 'default' | RenderMergeConflictActions<LAnnotation>;\nexport interface UnresolvedFileOptions<LAnnotation> extends Omit<FileDiffOptions<LAnnotation>, 'diffStyle'> {\n onPostRender?(node: HTMLElement, instance: UnresolvedFile<LAnnotation>): unknown;\n mergeConflictActionsType?: MergeConflictActionsTypeOption<LAnnotation>;\n onMergeConflictAction?(payload: MergeConflictActionPayload, instance: UnresolvedFile<LAnnotation>): void;\n onMergeConflictResolve?(file: FileContents, payload: MergeConflictActionPayload): void;\n maxContextLines?: number;\n}\nexport interface UnresolvedFileRenderProps<LAnnotation> extends Omit<FileDiffRenderProps<LAnnotation>, 'oldFile' | 'newFile'> {\n file?: FileContents;\n actions?: (MergeConflictDiffAction | undefined)[];\n markerRows?: MergeConflictMarkerRow[];\n}\nexport interface UnresolvedFileHydrationProps<LAnnotation> extends Omit<UnresolvedFileRenderProps<LAnnotation>, 'file'> {\n file?: FileContents;\n fileContainer: HTMLElement;\n prerenderedHTML?: string;\n}\ninterface GetOrComputeDiffProps {\n file: FileContents | undefined;\n fileDiff: FileDiffMetadata | undefined;\n actions: (MergeConflictDiffAction | undefined)[] | undefined;\n markerRows: MergeConflictMarkerRow[] | undefined;\n}\ninterface ResolveConflictReturn {\n file: FileContents;\n fileDiff: FileDiffMetadata;\n actions: (MergeConflictDiffAction | undefined)[];\n markerRows: MergeConflictMarkerRow[];\n}\ntype UnresolvedFileDataCache = GetOrComputeDiffProps;\nexport declare class UnresolvedFile<LAnnotation = undefined> extends FileDiff<LAnnotation> {\n options: UnresolvedFileOptions<LAnnotation>;\n readonly __id: string;\n protected computedCache: UnresolvedFileDataCache;\n private conflictActions;\n private markerRows;\n private conflictActionCache;\n constructor(options?: UnresolvedFileOptions<LAnnotation>, workerManager?: WorkerPoolManager | undefined, isContainerManaged?: boolean);\n setOptions(options: UnresolvedFileOptions<LAnnotation> | undefined): void;\n protected createHunksRenderer(options: UnresolvedFileOptions<LAnnotation>): UnresolvedFileHunksRenderer<LAnnotation>;\n protected getHunksRendererOptions(options: UnresolvedFileOptions<LAnnotation>): UnresolvedFileHunksRendererOptions;\n protected applyPreNodeAttributes(pre: HTMLPreElement, result: HunksRenderResult): void;\n cleanUp(): void;\n private getOrComputeDiff;\n hydrate(props: UnresolvedFileHydrationProps<LAnnotation>): void;\n rerender(): void;\n render(props?: UnresolvedFileRenderProps<LAnnotation>): boolean;\n resolveConflict(conflictIndex: number, resolution: MergeConflictResolution, fileDiff?: FileDiffMetadata | undefined): ResolveConflictReturn | undefined;\n private resolveConflictAndRender;\n private setActiveMergeConflictState;\n private handleMergeConflictActionClick;\n private renderMergeConflictActionSlots;\n private renderMergeConflictAction;\n private clearMergeConflictActionCache;\n}\nexport declare function getUnresolvedDiffHunksRendererOptions<LAnnotation>(options?: UnresolvedFileOptions<LAnnotation>, baseOptions?: UnresolvedFileOptions<LAnnotation>): UnresolvedFileHunksRendererOptions;\nexport {};\n//# sourceMappingURL=UnresolvedFile.d.ts.map"],"mappings":"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"}
@@ -187,7 +187,7 @@ var InteractionManager = class {
187
187
  break;
188
188
  }
189
189
  if (isExpandoPointerTarget(target) && onHunkExpand != null) {
190
- onHunkExpand(target.hunkIndex, event.shiftKey ? "both" : target.direction, event.shiftKey ? Number.POSITIVE_INFINITY : void 0);
190
+ onHunkExpand(target.hunkIndex, target.all || event.shiftKey ? "both" : target.direction, target.all || event.shiftKey ? Number.POSITIVE_INFINITY : void 0);
191
191
  break;
192
192
  }
193
193
  if (!isHoverableLinePointerTarget(target)) break;
@@ -730,14 +730,15 @@ var InteractionManager = class {
730
730
  lineIndexValue = element.getAttribute("data-line-index") ?? void 0;
731
731
  continue;
732
732
  }
733
- if (expandInfo == null && element.hasAttribute("data-expand-button")) {
733
+ if (expandInfo == null && (element.hasAttribute("data-expand-button") || element.hasAttribute("data-unmodified-lines"))) {
734
734
  expandInfo = {
735
735
  hunkIndex: void 0,
736
736
  direction: (() => {
737
737
  if (element.hasAttribute("data-expand-up")) return "up";
738
738
  if (element.hasAttribute("data-expand-down")) return "down";
739
739
  return "both";
740
- })()
740
+ })(),
741
+ all: element.hasAttribute("data-expand-all-button")
741
742
  };
742
743
  continue;
743
744
  }
@@ -756,7 +757,8 @@ var InteractionManager = class {
756
757
  if (expandInfo?.hunkIndex != null) return {
757
758
  type: "line-info",
758
759
  hunkIndex: expandInfo.hunkIndex,
759
- direction: expandInfo.direction
760
+ direction: expandInfo.direction,
761
+ all: expandInfo.all
760
762
  };
761
763
  lineElement ??= lineIndexValue != null ? queryHTMLElement(codeElement, `[data-line][data-line-index="${lineIndexValue}"]`) : void 0;
762
764
  numberElement ??= lineIndexValue != null ? queryHTMLElement(codeElement, `[data-column-number][data-line-index="${lineIndexValue}"]`) : void 0;
@@ -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","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
+ {"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 all: boolean;\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 all: boolean;\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 target.all || event.shiftKey ? 'both' : target.direction,\n target.all || 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 (\n expandInfo == null &&\n (element.hasAttribute('data-expand-button') ||\n element.hasAttribute('data-unmodified-lines'))\n ) {\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 all: element.hasAttribute('data-expand-all-button'),\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 all: expandInfo.all,\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":"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"}
@@ -146,7 +146,12 @@ var DiffHunksRenderer = class {
146
146
  result: cache?.result,
147
147
  renderRange: void 0
148
148
  };
149
- if (this.workerManager?.isWorkingPool() === true && this.renderCache.result == null) this.workerManager.highlightDiffAST(this, this.diff);
149
+ if (this.workerManager?.isWorkingPool() === true) {
150
+ if (this.renderCache.result == null) this.workerManager.highlightDiffAST(this, this.diff);
151
+ } else if (this.highlighter == null) {
152
+ this.computedLang = diff.lang ?? getFiletypeFromFileName(diff.name);
153
+ this.initializeHighlighter();
154
+ }
150
155
  }
151
156
  getRenderOptions(diff) {
152
157
  const options = (() => {
@@ -215,6 +220,7 @@ var DiffHunksRenderer = class {
215
220
  };
216
221
  }
217
222
  if (!hasThemes || !hasLangs) this.asyncHighlight(diff).then(({ result, options: options$1 }) => {
223
+ if (this.renderCache != null) this.renderCache.highlighted = false;
218
224
  this.onHighlightSuccess(diff, result, options$1);
219
225
  });
220
226
  }