@pierre/diffs 1.1.0-beta.9 → 1.1.1
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.
- package/README.md +7 -18
- package/dist/components/AdvancedVirtualizedFileDiff.js +2 -7
- package/dist/components/AdvancedVirtualizedFileDiff.js.map +1 -1
- package/dist/components/AdvancedVirtualizer.js +1 -1
- package/dist/components/AdvancedVirtualizer.js.map +1 -1
- package/dist/components/File.d.ts +18 -8
- package/dist/components/File.d.ts.map +1 -1
- package/dist/components/File.js +111 -54
- package/dist/components/File.js.map +1 -1
- package/dist/components/FileDiff.d.ts +33 -15
- package/dist/components/FileDiff.d.ts.map +1 -1
- package/dist/components/FileDiff.js +156 -81
- package/dist/components/FileDiff.js.map +1 -1
- package/dist/components/UnresolvedFile.d.ts +60 -0
- package/dist/components/UnresolvedFile.d.ts.map +1 -0
- package/dist/components/UnresolvedFile.js +280 -0
- package/dist/components/UnresolvedFile.js.map +1 -0
- package/dist/components/VirtualizedFile.js +8 -5
- package/dist/components/VirtualizedFile.js.map +1 -1
- package/dist/components/VirtualizedFileDiff.d.ts +1 -1
- package/dist/components/VirtualizedFileDiff.d.ts.map +1 -1
- package/dist/components/VirtualizedFileDiff.js +15 -11
- package/dist/components/VirtualizedFileDiff.js.map +1 -1
- package/dist/components/Virtualizer.d.ts +3 -1
- package/dist/components/Virtualizer.d.ts.map +1 -1
- package/dist/components/Virtualizer.js +50 -24
- package/dist/components/Virtualizer.js.map +1 -1
- package/dist/constants.d.ts +3 -1
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +8 -1
- package/dist/constants.js.map +1 -1
- package/dist/highlighter/shared_highlighter.d.ts +4 -2
- package/dist/highlighter/shared_highlighter.d.ts.map +1 -1
- package/dist/highlighter/shared_highlighter.js +15 -7
- package/dist/highlighter/shared_highlighter.js.map +1 -1
- package/dist/index.d.ts +9 -7
- package/dist/index.js +8 -6
- package/dist/managers/InteractionManager.d.ts +146 -0
- package/dist/managers/InteractionManager.d.ts.map +1 -0
- package/dist/managers/InteractionManager.js +813 -0
- package/dist/managers/InteractionManager.js.map +1 -0
- package/dist/managers/ResizeManager.d.ts +0 -2
- package/dist/managers/ResizeManager.d.ts.map +1 -1
- package/dist/managers/ResizeManager.js +43 -32
- package/dist/managers/ResizeManager.js.map +1 -1
- package/dist/react/File.d.ts +2 -0
- package/dist/react/File.d.ts.map +1 -1
- package/dist/react/File.js +5 -2
- package/dist/react/File.js.map +1 -1
- package/dist/react/FileDiff.d.ts +2 -0
- package/dist/react/FileDiff.d.ts.map +1 -1
- package/dist/react/FileDiff.js +5 -2
- package/dist/react/FileDiff.js.map +1 -1
- package/dist/react/MultiFileDiff.d.ts +2 -0
- package/dist/react/MultiFileDiff.d.ts.map +1 -1
- package/dist/react/MultiFileDiff.js +5 -2
- package/dist/react/MultiFileDiff.js.map +1 -1
- package/dist/react/PatchDiff.d.ts +2 -0
- package/dist/react/PatchDiff.d.ts.map +1 -1
- package/dist/react/PatchDiff.js +5 -2
- package/dist/react/PatchDiff.js.map +1 -1
- package/dist/react/UnresolvedFile.d.ts +36 -0
- package/dist/react/UnresolvedFile.d.ts.map +1 -0
- package/dist/react/UnresolvedFile.js +43 -0
- package/dist/react/UnresolvedFile.js.map +1 -0
- package/dist/react/constants.d.ts +4 -2
- package/dist/react/constants.d.ts.map +1 -1
- package/dist/react/constants.js +6 -2
- package/dist/react/constants.js.map +1 -1
- package/dist/react/index.d.ts +4 -3
- package/dist/react/index.js +3 -2
- package/dist/react/jsx.d.ts.map +1 -1
- package/dist/react/types.d.ts +11 -2
- package/dist/react/types.d.ts.map +1 -1
- package/dist/react/utils/renderDiffChildren.d.ts +16 -5
- package/dist/react/utils/renderDiffChildren.d.ts.map +1 -1
- package/dist/react/utils/renderDiffChildren.js +34 -7
- package/dist/react/utils/renderDiffChildren.js.map +1 -1
- package/dist/react/utils/renderFileChildren.d.ts +5 -1
- package/dist/react/utils/renderFileChildren.d.ts.map +1 -1
- package/dist/react/utils/renderFileChildren.js +13 -7
- package/dist/react/utils/renderFileChildren.js.map +1 -1
- package/dist/react/utils/useFileDiffInstance.d.ts +4 -3
- package/dist/react/utils/useFileDiffInstance.d.ts.map +1 -1
- package/dist/react/utils/useFileDiffInstance.js +16 -7
- package/dist/react/utils/useFileDiffInstance.js.map +1 -1
- package/dist/react/utils/useFileInstance.d.ts +4 -3
- package/dist/react/utils/useFileInstance.d.ts.map +1 -1
- package/dist/react/utils/useFileInstance.js +14 -5
- package/dist/react/utils/useFileInstance.js.map +1 -1
- package/dist/react/utils/useUnresolvedFileInstance.d.ts +35 -0
- package/dist/react/utils/useUnresolvedFileInstance.d.ts.map +1 -0
- package/dist/react/utils/useUnresolvedFileInstance.js +88 -0
- package/dist/react/utils/useUnresolvedFileInstance.js.map +1 -0
- package/dist/renderers/DiffHunksRenderer.d.ts +50 -6
- package/dist/renderers/DiffHunksRenderer.d.ts.map +1 -1
- package/dist/renderers/DiffHunksRenderer.js +145 -45
- package/dist/renderers/DiffHunksRenderer.js.map +1 -1
- package/dist/renderers/FileRenderer.js +1 -1
- package/dist/renderers/UnresolvedFileHunksRenderer.d.ts +46 -0
- package/dist/renderers/UnresolvedFileHunksRenderer.d.ts.map +1 -0
- package/dist/renderers/UnresolvedFileHunksRenderer.js +207 -0
- package/dist/renderers/UnresolvedFileHunksRenderer.js.map +1 -0
- package/dist/shiki-stream/stream.d.ts +1 -1
- package/dist/shiki-stream/stream.d.ts.map +1 -1
- package/dist/shiki-stream/stream.js.map +1 -1
- package/dist/shiki-stream/tokenizer.d.ts +1 -1
- package/dist/shiki-stream/tokenizer.d.ts.map +1 -1
- package/dist/shiki-stream/tokenizer.js.map +1 -1
- package/dist/shiki-stream/types.d.ts +1 -1
- package/dist/shiki-stream/types.d.ts.map +1 -1
- package/dist/sprite.d.ts +2 -2
- package/dist/sprite.d.ts.map +1 -1
- package/dist/sprite.js +3 -0
- package/dist/sprite.js.map +1 -1
- package/dist/ssr/index.d.ts +3 -3
- package/dist/ssr/index.js +2 -2
- package/dist/ssr/preloadDiffs.d.ts +23 -14
- package/dist/ssr/preloadDiffs.d.ts.map +1 -1
- package/dist/ssr/preloadDiffs.js +40 -14
- package/dist/ssr/preloadDiffs.js.map +1 -1
- package/dist/style.js +1 -1
- package/dist/style.js.map +1 -1
- package/dist/types.d.ts +29 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/areMergeConflictActionsEqual.d.ts +7 -0
- package/dist/utils/areMergeConflictActionsEqual.d.ts.map +1 -0
- package/dist/utils/areMergeConflictActionsEqual.js +11 -0
- package/dist/utils/areMergeConflictActionsEqual.js.map +1 -0
- package/dist/utils/arePrePropertiesEqual.js +10 -1
- package/dist/utils/arePrePropertiesEqual.js.map +1 -1
- package/dist/utils/areSelectionPointsEqual.d.ts +7 -0
- package/dist/utils/areSelectionPointsEqual.d.ts.map +1 -0
- package/dist/utils/areSelectionPointsEqual.js +8 -0
- package/dist/utils/areSelectionPointsEqual.js.map +1 -0
- package/dist/utils/areSelectionsEqual.d.ts +1 -1
- package/dist/utils/areSelectionsEqual.d.ts.map +1 -1
- package/dist/utils/areSelectionsEqual.js.map +1 -1
- package/dist/utils/createFileHeaderElement.js +5 -2
- package/dist/utils/createFileHeaderElement.js.map +1 -1
- package/dist/utils/createGutterUtilityContentNode.d.ts +5 -0
- package/dist/utils/createGutterUtilityContentNode.d.ts.map +1 -0
- package/dist/utils/createGutterUtilityContentNode.js +15 -0
- package/dist/utils/createGutterUtilityContentNode.js.map +1 -0
- package/dist/utils/createGutterUtilityElement.d.ts +7 -0
- package/dist/utils/createGutterUtilityElement.d.ts.map +1 -0
- package/dist/utils/createGutterUtilityElement.js +20 -0
- package/dist/utils/createGutterUtilityElement.js.map +1 -0
- package/dist/utils/createPreElement.d.ts +2 -1
- package/dist/utils/createPreElement.d.ts.map +1 -1
- package/dist/utils/createPreElement.js +2 -1
- package/dist/utils/createPreElement.js.map +1 -1
- package/dist/utils/createSeparator.js +1 -1
- package/dist/utils/createSeparator.js.map +1 -1
- package/dist/utils/createWindowFromScrollPosition.js +12 -11
- package/dist/utils/createWindowFromScrollPosition.js.map +1 -1
- package/dist/utils/getHighlighterOptions.d.ts +7 -2
- package/dist/utils/getHighlighterOptions.d.ts.map +1 -1
- package/dist/utils/getHighlighterOptions.js +3 -2
- package/dist/utils/getHighlighterOptions.js.map +1 -1
- package/dist/utils/getMergeConflictActionSlotName.d.ts +16 -0
- package/dist/utils/getMergeConflictActionSlotName.d.ts.map +1 -0
- package/dist/utils/getMergeConflictActionSlotName.js +8 -0
- package/dist/utils/getMergeConflictActionSlotName.js.map +1 -0
- package/dist/utils/getMergeConflictLineTypes.d.ts +15 -0
- package/dist/utils/getMergeConflictLineTypes.d.ts.map +1 -0
- package/dist/utils/getMergeConflictLineTypes.js +81 -0
- package/dist/utils/getMergeConflictLineTypes.js.map +1 -0
- package/dist/utils/getOrCreateCodeNode.d.ts +3 -1
- package/dist/utils/getOrCreateCodeNode.d.ts.map +1 -1
- package/dist/utils/getOrCreateCodeNode.js +5 -3
- package/dist/utils/getOrCreateCodeNode.js.map +1 -1
- package/dist/utils/hast_utils.d.ts +2 -2
- package/dist/utils/hast_utils.d.ts.map +1 -1
- package/dist/utils/hast_utils.js +3 -2
- package/dist/utils/hast_utils.js.map +1 -1
- package/dist/utils/parseMergeConflictDiffFromFile.d.ts +26 -0
- package/dist/utils/parseMergeConflictDiffFromFile.d.ts.map +1 -0
- package/dist/utils/parseMergeConflictDiffFromFile.js +143 -0
- package/dist/utils/parseMergeConflictDiffFromFile.js.map +1 -0
- package/dist/utils/resolveMergeConflict.d.ts +7 -0
- package/dist/utils/resolveMergeConflict.d.ts.map +1 -0
- package/dist/utils/resolveMergeConflict.js +30 -0
- package/dist/utils/resolveMergeConflict.js.map +1 -0
- package/dist/utils/resolveVirtualFileMetrics.js +1 -0
- package/dist/utils/resolveVirtualFileMetrics.js.map +1 -1
- package/dist/utils/setWrapperNodeProps.d.ts +2 -1
- package/dist/utils/setWrapperNodeProps.d.ts.map +1 -1
- package/dist/utils/setWrapperNodeProps.js +5 -1
- package/dist/utils/setWrapperNodeProps.js.map +1 -1
- package/dist/worker/WorkerPoolManager.d.ts +4 -2
- package/dist/worker/WorkerPoolManager.d.ts.map +1 -1
- package/dist/worker/WorkerPoolManager.js +16 -9
- package/dist/worker/WorkerPoolManager.js.map +1 -1
- package/dist/worker/types.d.ts +3 -1
- package/dist/worker/types.d.ts.map +1 -1
- package/dist/worker/wasm-BlUZCxHM.js +10 -0
- package/dist/worker/wasm-BlUZCxHM.js.map +1 -0
- package/dist/worker/worker-portable.js +10546 -10106
- package/dist/worker/worker-portable.js.map +1 -1
- package/dist/worker/worker.js +27 -19
- package/dist/worker/worker.js.map +1 -1
- package/package.json +3 -7
- package/dist/managers/LineSelectionManager.d.ts +0 -64
- package/dist/managers/LineSelectionManager.d.ts.map +0 -1
- package/dist/managers/LineSelectionManager.js +0 -270
- package/dist/managers/LineSelectionManager.js.map +0 -1
- package/dist/managers/MouseEventManager.d.ts +0 -71
- package/dist/managers/MouseEventManager.d.ts.map +0 -1
- package/dist/managers/MouseEventManager.js +0 -358
- package/dist/managers/MouseEventManager.js.map +0 -1
- package/dist/themes/pierre-dark.js +0 -1328
- package/dist/themes/pierre-dark.js.map +0 -1
- package/dist/themes/pierre-light.js +0 -1328
- package/dist/themes/pierre-light.js.map +0 -1
- package/dist/utils/createHoverContentNode.d.ts +0 -5
- package/dist/utils/createHoverContentNode.d.ts.map +0 -1
- package/dist/utils/createHoverContentNode.js +0 -15
- package/dist/utils/createHoverContentNode.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InteractionManager.js","names":["mode: TMode","options: InteractionManagerOptions<TMode>","reasons: string[]","nextRange: SelectedLineRange | null","lineType: LineTypes | undefined","codeElement: HTMLElement | undefined","lineElement: HTMLElement | undefined","lineIndexValue: string | undefined","numberElement: HTMLElement | undefined","expandInfo:\n | {\n hunkIndex: number | undefined;\n direction: ExpansionDirections;\n }\n | undefined","lineNumber: number | undefined","mergeConflictActionTarget: MergeConflictActionTarget | undefined","annotationSide: AnnotationSide"],"sources":["../../src/managers/InteractionManager.ts"],"sourcesContent":["import { toHtml } from 'hast-util-to-html';\n\nimport type {\n AnnotationSide,\n DiffLineEventBaseProps,\n ExpansionDirections,\n LineEventBaseProps,\n LineTypes,\n MergeConflictResolution,\n SelectionPoint,\n SelectionSide,\n} from '../types';\nimport { areSelectionPointsEqual } from '../utils/areSelectionPointsEqual';\nimport { areSelectionsEqual } from '../utils/areSelectionsEqual';\nimport { createGutterUtilityElement } from '../utils/createGutterUtilityElement';\n\nexport type LogTypes = 'click' | 'move' | 'both' | 'none';\n\nexport type InteractionManagerMode = 'file' | 'diff';\n\nexport interface OnLineClickProps extends LineEventBaseProps {\n event: PointerEvent;\n}\n\nexport interface OnLineEnterLeaveProps extends LineEventBaseProps {\n event: PointerEvent;\n}\n\nexport interface OnDiffLineClickProps extends DiffLineEventBaseProps {\n event: PointerEvent;\n}\n\nexport interface OnDiffLineEnterLeaveProps extends DiffLineEventBaseProps {\n event: PointerEvent;\n}\n\nexport interface SelectedLineRange {\n start: number;\n side?: SelectionSide;\n end: number;\n endSide?: SelectionSide;\n}\n\nexport type GetLineIndexUtility = (\n lineNumber: number,\n side?: SelectionSide\n) => [number, number] | undefined;\n\ntype EventClickProps<TMode extends InteractionManagerMode> =\n TMode extends 'file' ? OnLineClickProps : OnDiffLineClickProps;\n\ntype PointerEventEnterLeaveProps<TMode extends InteractionManagerMode> =\n TMode extends 'file' ? OnLineEnterLeaveProps : OnDiffLineEnterLeaveProps;\n\ntype EventBaseProps<TMode extends InteractionManagerMode> = TMode extends 'file'\n ? LineEventBaseProps\n : DiffLineEventBaseProps;\n\ninterface ExpandoEventProps {\n type: 'line-info';\n hunkIndex: number;\n direction: ExpansionDirections;\n}\n\nexport type GetHoveredLineResult<TMode extends InteractionManagerMode> =\n TMode extends 'file'\n ? { lineNumber: number }\n : { lineNumber: number; side: AnnotationSide };\n\ninterface SelectionPointerInfo {\n lineNumber: number;\n eventSide: SelectionSide | undefined;\n lineIndex: number;\n}\n\ninterface ResolvedLineTarget<TMode extends InteractionManagerMode> {\n kind: 'line';\n lineType: LineTypes;\n lineElement: HTMLElement;\n lineNumber: number;\n numberColumn: boolean;\n numberElement: HTMLElement;\n side: TMode extends 'diff' ? AnnotationSide : undefined;\n splitLineIndex: number | undefined;\n}\n\nexport interface MergeConflictActionTarget {\n kind: 'merge-conflict-action';\n resolution: MergeConflictResolution;\n conflictIndex: number;\n}\n\ntype ResolvedPointerTarget<TMode extends InteractionManagerMode> =\n | ResolvedLineTarget<TMode>\n | ExpandoEventProps\n | MergeConflictActionTarget;\n\ntype LinePointerTarget<TMode extends InteractionManagerMode> =\n ResolvedLineTarget<TMode>;\n\ninterface SessionIdle {\n mode: 'idle';\n}\n\ninterface SessionSelecting {\n mode: 'selecting';\n pointerId: number;\n}\n\ninterface SessionPendingSingleLineUnselect {\n mode: 'pendingSingleLineUnselect';\n pointerId: number;\n anchor: SelectionPoint;\n pending: SelectionPoint;\n}\n\ninterface SessionGutterSelecting {\n mode: 'gutterSelecting';\n pointerId: number;\n anchor: SelectionPoint;\n current: SelectionPoint;\n}\n\ntype PointerSession =\n | SessionIdle\n | SessionSelecting\n | SessionPendingSingleLineUnselect\n | SessionGutterSelecting;\n\nexport interface InteractionManagerBaseOptions<\n TMode extends InteractionManagerMode,\n> {\n lineHoverHighlight?: 'disabled' | 'both' | 'number' | 'line';\n enableGutterUtility?: boolean;\n onGutterUtilityClick?(range: SelectedLineRange): unknown;\n onLineClick?(props: EventClickProps<TMode>): unknown;\n onLineNumberClick?(props: EventClickProps<TMode>): unknown;\n onLineEnter?(props: PointerEventEnterLeaveProps<TMode>): unknown;\n onLineLeave?(props: PointerEventEnterLeaveProps<TMode>): unknown;\n __debugPointerEvents?: LogTypes;\n enableLineSelection?: boolean;\n onLineSelected?: (range: SelectedLineRange | null) => void;\n onLineSelectionStart?: (range: SelectedLineRange | null) => void;\n onLineSelectionChange?: (range: SelectedLineRange | null) => void;\n onLineSelectionEnd?: (range: SelectedLineRange | null) => void;\n getLineIndex?: GetLineIndexUtility;\n}\n\nexport interface InteractionManagerOptions<\n TMode extends InteractionManagerMode,\n> extends InteractionManagerBaseOptions<TMode> {\n usesCustomGutterUtility?: boolean;\n onHunkExpand?(\n hunkIndex: number,\n direction: ExpansionDirections,\n expansionLineCountOverride?: number\n ): unknown;\n onMergeConflictActionClick?(target: MergeConflictActionTarget): void;\n}\n\ninterface HandlePointerEventProps {\n eventType: 'click' | 'move';\n event: PointerEvent | MouseEvent;\n}\n\nexport class InteractionManager<TMode extends InteractionManagerMode> {\n private hoveredLine: EventBaseProps<TMode> | undefined;\n private pre: HTMLPreElement | undefined;\n\n private gutterUtilityContainer: HTMLDivElement | undefined;\n private gutterUtilityButton: HTMLButtonElement | undefined;\n private gutterUtilitySlot: HTMLSlotElement | undefined;\n\n private interactiveLinesAttr = false;\n private interactiveLineNumbersAttr = false;\n\n private hasPointerListeners = false;\n private hasDocumentPointerListeners = false;\n\n private selectedRange: SelectedLineRange | null = null;\n private renderedSelectionRange: SelectedLineRange | null | undefined;\n private selectionAnchor: SelectionPoint | undefined;\n private queuedSelectionRender: number | undefined;\n private pointerSession: PointerSession = { mode: 'idle' };\n\n constructor(\n private mode: TMode,\n private options: InteractionManagerOptions<TMode>\n ) {}\n\n setOptions(options: InteractionManagerOptions<TMode>): void {\n this.options = options;\n }\n\n cleanUp(): void {\n this.pre?.removeEventListener('click', this.handlePointerClick);\n this.pre?.removeEventListener('pointerdown', this.handlePointerDown);\n this.pre?.removeEventListener('pointermove', this.handlePointerMove);\n this.pre?.removeEventListener('pointerleave', this.handlePointerLeave);\n this.pre?.removeAttribute('data-interactive-lines');\n this.pre?.removeAttribute('data-interactive-line-numbers');\n this.pre = undefined;\n this.gutterUtilityContainer?.remove();\n this.gutterUtilityContainer = undefined;\n this.gutterUtilityButton = undefined;\n this.gutterUtilitySlot = undefined;\n this.clearHoveredLine();\n this.detachDocumentPointerListeners();\n this.clearPointerSession();\n if (this.queuedSelectionRender != null) {\n cancelAnimationFrame(this.queuedSelectionRender);\n this.queuedSelectionRender = undefined;\n }\n this.interactiveLinesAttr = false;\n this.interactiveLineNumbersAttr = false;\n this.hasPointerListeners = false;\n }\n\n setup(pre: HTMLPreElement): void {\n this.setSelectionDirty();\n const { usesCustomGutterUtility = false, enableGutterUtility = false } =\n this.options;\n\n const newContainer = this.pre !== pre;\n if (newContainer) {\n this.cleanUp();\n this.pre = pre;\n }\n\n if (enableGutterUtility) {\n this.ensureGutterUtilityNode(usesCustomGutterUtility);\n } else if (this.gutterUtilityContainer != null) {\n this.gutterUtilityContainer.remove();\n this.gutterUtilityContainer = undefined;\n this.gutterUtilityButton = undefined;\n this.gutterUtilitySlot = undefined;\n if (this.pointerSession.mode === 'gutterSelecting') {\n this.clearPointerSession();\n this.detachDocumentPointerListeners();\n }\n }\n\n this.syncPointerListeners(pre);\n this.updateInteractiveLineAttributes();\n this.renderSelection();\n }\n\n setSelectionDirty(): void {\n this.renderedSelectionRange = undefined;\n }\n\n isSelectionDirty(): boolean {\n return this.renderedSelectionRange === null;\n }\n\n setSelection(range: SelectedLineRange | null): void {\n const isRangeChange = !(\n range === this.selectedRange ||\n areSelectionsEqual(range ?? undefined, this.selectedRange ?? undefined)\n );\n if (!this.isSelectionDirty() && !isRangeChange) {\n return;\n }\n this.selectedRange = range;\n this.renderSelection();\n if (isRangeChange) {\n this.notifySelectionCommitted();\n }\n }\n\n getSelection(): SelectedLineRange | null {\n return this.selectedRange;\n }\n\n getHoveredLine = (): GetHoveredLineResult<TMode> | undefined => {\n if (this.hoveredLine != null) {\n if (this.mode === 'diff' && this.hoveredLine.type === 'diff-line') {\n return {\n lineNumber: this.hoveredLine.lineNumber,\n side: this.hoveredLine.annotationSide,\n } as GetHoveredLineResult<TMode>;\n }\n if (this.mode === 'file' && this.hoveredLine.type === 'line') {\n return {\n lineNumber: this.hoveredLine.lineNumber,\n } as GetHoveredLineResult<TMode>;\n }\n }\n return undefined;\n };\n\n handlePointerClick = (event: MouseEvent): void => {\n const {\n onHunkExpand,\n onLineClick,\n onLineNumberClick,\n onMergeConflictActionClick,\n } = this.options;\n if (\n onHunkExpand == null &&\n onLineClick == null &&\n onLineNumberClick == null &&\n onMergeConflictActionClick == null\n ) {\n return;\n }\n if (\n this.options.onGutterUtilityClick != null &&\n isGutterUtilityPointerPath(event.composedPath())\n ) {\n return;\n }\n debugLogIfEnabled(\n this.options.__debugPointerEvents,\n 'click',\n 'FileDiff.DEBUG.handlePointerClick:',\n event\n );\n this.handlePointerEvent({ eventType: 'click', event });\n };\n\n handlePointerMove = (event: PointerEvent): void => {\n const {\n lineHoverHighlight = 'disabled',\n onLineEnter,\n onLineLeave,\n enableGutterUtility = false,\n } = this.options;\n if (\n lineHoverHighlight === 'disabled' &&\n !enableGutterUtility &&\n onLineEnter == null &&\n onLineLeave == null\n ) {\n return;\n }\n debugLogIfEnabled(\n this.options.__debugPointerEvents,\n 'move',\n 'FileDiff.DEBUG.handlePointerMove:',\n event\n );\n // should we perhaps throttle this a bit because move can be fast as fuk\n // boiiii\n this.handlePointerEvent({ eventType: 'move', event });\n };\n\n handlePointerLeave = (event: PointerEvent): void => {\n const { __debugPointerEvents } = this.options;\n debugLogIfEnabled(\n __debugPointerEvents,\n 'move',\n 'FileDiff.DEBUG.handlePointerLeave: no event'\n );\n if (this.hoveredLine == null) {\n debugLogIfEnabled(\n __debugPointerEvents,\n 'move',\n 'FileDiff.DEBUG.handlePointerLeave: returned early, no .hoveredLine'\n );\n return;\n }\n this.gutterUtilityContainer?.remove();\n this.options.onLineLeave?.({\n ...this.hoveredLine,\n event,\n } as PointerEventEnterLeaveProps<TMode>);\n this.clearHoveredLine();\n };\n\n private handlePointerEvent({ eventType, event }: HandlePointerEventProps) {\n const { __debugPointerEvents } = this.options;\n const composedPath = event.composedPath();\n debugLogIfEnabled(\n __debugPointerEvents,\n eventType,\n 'FileDiff.DEBUG.handlePointerEvent:',\n { eventType, composedPath }\n );\n const target = this.resolvePointerTarget(composedPath);\n debugLogIfEnabled(\n __debugPointerEvents,\n eventType,\n 'FileDiff.DEBUG.handlePointerEvent: resolvePointerTarget result:',\n target\n );\n\n const {\n onLineClick,\n onLineNumberClick,\n onLineEnter,\n onLineLeave,\n onHunkExpand,\n onMergeConflictActionClick,\n } = this.options;\n\n switch (eventType) {\n case 'move': {\n if (\n isLinePointerTarget(target) &&\n this.hoveredLine?.lineElement === target.lineElement\n ) {\n break;\n }\n if (this.hoveredLine != null) {\n this.gutterUtilityContainer?.remove();\n onLineLeave?.({\n ...this.hoveredLine,\n event: event as PointerEvent,\n } as PointerEventEnterLeaveProps<TMode>);\n this.clearHoveredLine();\n }\n if (isLinePointerTarget(target)) {\n this.setHoveredLine(this.toEventBaseProps(target));\n if (this.gutterUtilityContainer != null) {\n target.numberElement.appendChild(this.gutterUtilityContainer);\n }\n onLineEnter?.({\n ...this.hoveredLine,\n event: event as PointerEvent,\n } as PointerEventEnterLeaveProps<TMode>);\n }\n break;\n }\n case 'click': {\n if (target == null) {\n break;\n }\n if (\n isMergeConflictActionPointerTarget(target) &&\n onMergeConflictActionClick != null\n ) {\n onMergeConflictActionClick(target);\n break;\n }\n if (isExpandoPointerTarget(target) && onHunkExpand != null) {\n onHunkExpand(\n target.hunkIndex,\n event.shiftKey ? 'both' : target.direction,\n event.shiftKey ? Number.POSITIVE_INFINITY : undefined\n );\n break;\n }\n if (!isLinePointerTarget(target)) {\n break;\n }\n\n const eventBase = this.toEventBaseProps(target);\n if (onLineNumberClick != null && target.numberColumn) {\n onLineNumberClick({\n ...eventBase,\n event: event as PointerEvent,\n } as EventClickProps<TMode>);\n } else if (onLineClick != null) {\n onLineClick({\n ...eventBase,\n event: event as PointerEvent,\n } as EventClickProps<TMode>);\n }\n break;\n }\n }\n }\n\n private syncPointerListeners(pre: HTMLPreElement): void {\n const {\n __debugPointerEvents,\n lineHoverHighlight = 'disabled',\n onLineClick,\n onLineNumberClick,\n onLineEnter,\n onLineLeave,\n onHunkExpand,\n onMergeConflictActionClick,\n enableGutterUtility = false,\n enableLineSelection = false,\n onGutterUtilityClick,\n } = this.options;\n const enableGutterSelection = onGutterUtilityClick != null;\n const shouldAttachPointerListeners =\n lineHoverHighlight !== 'disabled' ||\n onLineClick != null ||\n onLineNumberClick != null ||\n onHunkExpand != null ||\n onMergeConflictActionClick != null ||\n onLineEnter != null ||\n onLineLeave != null ||\n enableGutterUtility ||\n enableLineSelection ||\n enableGutterSelection;\n\n if (shouldAttachPointerListeners && !this.hasPointerListeners) {\n pre.addEventListener('click', this.handlePointerClick);\n pre.addEventListener('pointerdown', this.handlePointerDown);\n pre.addEventListener('pointermove', this.handlePointerMove);\n pre.addEventListener('pointerleave', this.handlePointerLeave);\n this.hasPointerListeners = true;\n\n debugLogIfEnabled(\n __debugPointerEvents,\n 'click',\n 'FileDiff.DEBUG.attachEventListeners: Attaching click events for:',\n (() => {\n const reasons: string[] = [];\n if (\n __debugPointerEvents === 'both' ||\n __debugPointerEvents === 'click'\n ) {\n if (onLineClick != null) {\n reasons.push('onLineClick');\n }\n if (onLineNumberClick != null) {\n reasons.push('onLineNumberClick');\n }\n if (onHunkExpand != null) {\n reasons.push('expandable hunk separators');\n }\n if (onMergeConflictActionClick != null) {\n reasons.push('merge conflict actions');\n }\n }\n return reasons;\n })()\n );\n debugLogIfEnabled(\n __debugPointerEvents,\n 'move',\n 'FileDiff.DEBUG.attachEventListeners: Attaching pointer move event'\n );\n debugLogIfEnabled(\n __debugPointerEvents,\n 'move',\n 'FileDiff.DEBUG.attachEventListeners: Attaching pointer leave event'\n );\n } else if (!shouldAttachPointerListeners && this.hasPointerListeners) {\n pre.removeEventListener('click', this.handlePointerClick);\n pre.removeEventListener('pointerdown', this.handlePointerDown);\n pre.removeEventListener('pointermove', this.handlePointerMove);\n pre.removeEventListener('pointerleave', this.handlePointerLeave);\n this.hasPointerListeners = false;\n }\n\n const hasActiveLineSelectionSession =\n this.pointerSession.mode === 'selecting' ||\n this.pointerSession.mode === 'pendingSingleLineUnselect';\n const hasActiveGutterSelectionSession =\n this.pointerSession.mode === 'gutterSelecting';\n if (\n (!enableLineSelection && hasActiveLineSelectionSession) ||\n (!enableGutterSelection && hasActiveGutterSelectionSession)\n ) {\n this.clearPointerSession();\n this.detachDocumentPointerListeners();\n this.selectionAnchor = undefined;\n this.clearPendingSingleLineState();\n }\n }\n\n private updateInteractiveLineAttributes(): void {\n if (this.pre == null) {\n return;\n }\n\n const {\n onLineClick,\n onLineNumberClick,\n enableLineSelection = false,\n } = this.options;\n\n const shouldHaveInteractiveLines = onLineClick != null;\n const shouldHaveInteractiveLineNumbers =\n onLineNumberClick != null || enableLineSelection;\n\n if (shouldHaveInteractiveLines && !this.interactiveLinesAttr) {\n this.pre.setAttribute('data-interactive-lines', '');\n this.interactiveLinesAttr = true;\n } else if (!shouldHaveInteractiveLines && this.interactiveLinesAttr) {\n this.pre.removeAttribute('data-interactive-lines');\n this.interactiveLinesAttr = false;\n }\n\n if (shouldHaveInteractiveLineNumbers && !this.interactiveLineNumbersAttr) {\n this.pre.setAttribute('data-interactive-line-numbers', '');\n this.interactiveLineNumbersAttr = true;\n } else if (\n !shouldHaveInteractiveLineNumbers &&\n this.interactiveLineNumbersAttr\n ) {\n this.pre.removeAttribute('data-interactive-line-numbers');\n this.interactiveLineNumbersAttr = false;\n }\n }\n\n private handlePointerDown = (event: PointerEvent): void => {\n if (\n (event.pointerType === 'mouse' && event.button !== 0) ||\n this.pre == null ||\n this.pointerSession.mode !== 'idle'\n ) {\n return;\n }\n\n const path = event.composedPath();\n if (\n isGutterUtilityPointerPath(path) &&\n this.options.onGutterUtilityClick != null\n ) {\n this.startGutterSelectionFromPointerDown(event, path);\n } else {\n this.startLineSelectionFromPointerDown(event, path);\n }\n };\n\n private startLineSelectionFromPointerDown(\n event: PointerEvent,\n path: (EventTarget | undefined)[]\n ): void {\n const { enableLineSelection = false } = this.options;\n if (!enableLineSelection) {\n return;\n }\n\n const pointerInfo = this.getSelectionPointerInfo(path, true);\n if (pointerInfo == null) {\n return;\n }\n\n const { pre } = this;\n if (pre == null) {\n return;\n }\n\n event.preventDefault();\n const { lineNumber, eventSide, lineIndex } = pointerInfo;\n\n if (event.shiftKey && this.selectedRange != null) {\n const rowRange = this.getIndexesFromSelection(\n this.selectedRange,\n pre.getAttribute('data-diff-type') === 'split'\n );\n if (rowRange == null) {\n return;\n }\n const useStart =\n rowRange.start <= rowRange.end\n ? lineIndex >= rowRange.start\n : lineIndex <= rowRange.end;\n this.selectionAnchor = {\n lineNumber: useStart\n ? this.selectedRange.start\n : this.selectedRange.end,\n side: useStart\n ? this.selectedRange.side\n : (this.selectedRange.endSide ?? this.selectedRange.side),\n };\n this.updateSelection(lineNumber, eventSide, false);\n this.notifySelectionStart(this.selectedRange);\n this.pointerSession = { mode: 'selecting', pointerId: event.pointerId };\n this.attachDocumentPointerListeners();\n return;\n }\n\n if (\n this.selectedRange?.start === lineNumber &&\n this.selectedRange?.end === lineNumber\n ) {\n const point = { lineNumber, side: eventSide };\n this.selectionAnchor = point;\n this.pointerSession = {\n mode: 'pendingSingleLineUnselect',\n pointerId: event.pointerId,\n anchor: point,\n pending: point,\n };\n this.attachDocumentPointerListeners();\n return;\n }\n\n this.selectedRange = null;\n this.selectionAnchor = { lineNumber, side: eventSide };\n this.updateSelection(lineNumber, eventSide, false);\n this.notifySelectionStart(this.selectedRange);\n this.pointerSession = { mode: 'selecting', pointerId: event.pointerId };\n this.attachDocumentPointerListeners();\n }\n\n private startGutterSelectionFromPointerDown(\n event: PointerEvent,\n path: (EventTarget | undefined)[]\n ): void {\n const { enableLineSelection = false, onGutterUtilityClick } = this.options;\n if (onGutterUtilityClick == null) {\n return;\n }\n const point = this.getSelectionPointFromPath(path);\n if (point == null) {\n return;\n }\n event.preventDefault();\n event.stopPropagation();\n this.pointerSession = {\n mode: 'gutterSelecting',\n pointerId: event.pointerId,\n anchor: point,\n current: point,\n };\n if (enableLineSelection) {\n this.selectionAnchor = {\n lineNumber: point.lineNumber,\n side: point.side,\n };\n this.updateSelection(point.lineNumber, point.side, false);\n this.notifySelectionStart(this.selectedRange);\n }\n this.attachDocumentPointerListeners();\n }\n\n private handleDocumentPointerMove = (event: PointerEvent): void => {\n const { enableLineSelection = false } = this.options;\n switch (this.pointerSession.mode) {\n case 'idle':\n return;\n case 'gutterSelecting': {\n if (event.pointerId !== this.pointerSession.pointerId) {\n return;\n }\n const point = this.getSelectionPointFromPath(event.composedPath());\n if (point == null) {\n return;\n }\n this.pointerSession.current = point;\n if (enableLineSelection === true) {\n this.updateSelection(point.lineNumber, point.side);\n }\n return;\n }\n case 'selecting': {\n if (event.pointerId !== this.pointerSession.pointerId) {\n return;\n }\n const pointerInfo = this.getSelectionPointerInfo(\n event.composedPath(),\n false\n );\n if (pointerInfo == null || this.selectionAnchor == null) {\n return;\n }\n this.updateSelection(pointerInfo.lineNumber, pointerInfo.eventSide);\n return;\n }\n case 'pendingSingleLineUnselect': {\n if (event.pointerId !== this.pointerSession.pointerId) {\n return;\n }\n const pointerInfo = this.getSelectionPointerInfo(\n event.composedPath(),\n false\n );\n if (pointerInfo == null || this.selectionAnchor == null) {\n return;\n }\n const point = {\n lineNumber: pointerInfo.lineNumber,\n side: pointerInfo.eventSide,\n };\n if (areSelectionPointsEqual(this.pointerSession.pending, point)) {\n return;\n }\n this.updateSelection(\n pointerInfo.lineNumber,\n pointerInfo.eventSide,\n false\n );\n this.notifySelectionStart(this.selectedRange);\n this.notifySelectionChangeDelta();\n this.pointerSession = {\n mode: 'selecting',\n pointerId: event.pointerId,\n };\n return;\n }\n }\n };\n\n private handleDocumentPointerUp = (event: PointerEvent): void => {\n const { enableLineSelection = false, onGutterUtilityClick } = this.options;\n switch (this.pointerSession.mode) {\n case 'idle':\n return;\n case 'gutterSelecting': {\n if (event.pointerId !== this.pointerSession.pointerId) {\n return;\n }\n const point = this.getSelectionPointFromPath(event.composedPath());\n if (point != null) {\n this.pointerSession.current = point;\n if (enableLineSelection) {\n this.updateSelection(point.lineNumber, point.side);\n }\n }\n onGutterUtilityClick?.(\n this.buildSelectedLineRange(\n this.pointerSession.anchor,\n this.pointerSession.current\n )\n );\n this.selectionAnchor = undefined;\n if (enableLineSelection) {\n this.notifySelectionEnd(this.selectedRange);\n this.notifySelectionCommitted();\n }\n this.clearPointerSession();\n this.detachDocumentPointerListeners();\n return;\n }\n case 'pendingSingleLineUnselect': {\n if (event.pointerId !== this.pointerSession.pointerId) {\n return;\n }\n this.updateSelection(null, undefined, false);\n this.selectionAnchor = undefined;\n this.clearPendingSingleLineState();\n this.detachDocumentPointerListeners();\n this.notifySelectionEnd(this.selectedRange);\n this.notifySelectionCommitted();\n return;\n }\n case 'selecting': {\n if (event.pointerId !== this.pointerSession.pointerId) {\n return;\n }\n this.selectionAnchor = undefined;\n this.detachDocumentPointerListeners();\n this.clearPointerSession();\n this.notifySelectionEnd(this.selectedRange);\n this.notifySelectionCommitted();\n }\n }\n };\n\n private handleDocumentPointerCancel = (event: PointerEvent): void => {\n switch (this.pointerSession.mode) {\n case 'idle':\n return;\n case 'gutterSelecting':\n case 'selecting':\n case 'pendingSingleLineUnselect': {\n if ('pointerId' in this.pointerSession) {\n if (event.pointerId !== this.pointerSession.pointerId) {\n return;\n }\n }\n this.selectionAnchor = undefined;\n this.clearPendingSingleLineState();\n this.clearPointerSession();\n this.detachDocumentPointerListeners();\n }\n }\n };\n\n private clearHoveredLine() {\n if (this.hoveredLine == null) {\n return;\n }\n this.hoveredLine.lineElement.removeAttribute('data-hovered');\n this.hoveredLine.numberElement.removeAttribute('data-hovered');\n this.hoveredLine = undefined;\n }\n\n private setHoveredLine(hoveredLine: EventBaseProps<TMode>) {\n const { lineHoverHighlight = 'disabled' } = this.options;\n if (this.hoveredLine != null) {\n this.clearHoveredLine();\n }\n this.hoveredLine = hoveredLine;\n if (lineHoverHighlight !== 'disabled') {\n if (lineHoverHighlight === 'both' || lineHoverHighlight === 'line') {\n this.hoveredLine.lineElement.setAttribute('data-hovered', '');\n }\n if (lineHoverHighlight === 'both' || lineHoverHighlight === 'number') {\n this.hoveredLine.numberElement.setAttribute('data-hovered', '');\n }\n }\n }\n\n private ensureGutterUtilityNode(useCustomGutterUtility: boolean): void {\n if (this.gutterUtilityContainer == null) {\n this.gutterUtilityContainer = document.createElement('div');\n this.gutterUtilityContainer.setAttribute('data-gutter-utility-slot', '');\n }\n if (useCustomGutterUtility) {\n if (this.gutterUtilityButton != null) {\n this.gutterUtilityButton.remove();\n this.gutterUtilityButton = undefined;\n }\n if (this.gutterUtilitySlot == null) {\n this.gutterUtilitySlot = document.createElement('slot');\n this.gutterUtilitySlot.name = 'gutter-utility-slot';\n }\n if (this.gutterUtilitySlot.parentNode !== this.gutterUtilityContainer) {\n this.gutterUtilityContainer.replaceChildren(this.gutterUtilitySlot);\n }\n } else {\n this.gutterUtilitySlot?.remove();\n this.gutterUtilitySlot = undefined;\n if (this.gutterUtilityButton == null) {\n const tempDiv = document.createElement('div');\n tempDiv.innerHTML = toHtml(createGutterUtilityElement());\n const utilityButton = tempDiv.firstElementChild;\n if (!(utilityButton instanceof HTMLButtonElement)) {\n throw new Error(\n 'InteractionManager.ensureGutterUtilityNode: Node element should be a button'\n );\n }\n utilityButton.remove();\n this.gutterUtilityButton = utilityButton;\n }\n if (this.gutterUtilityButton.parentNode !== this.gutterUtilityContainer) {\n this.gutterUtilityContainer.replaceChildren(this.gutterUtilityButton);\n }\n }\n }\n\n private attachDocumentPointerListeners(): void {\n if (this.hasDocumentPointerListeners) {\n return;\n }\n document.addEventListener('pointermove', this.handleDocumentPointerMove);\n document.addEventListener('pointerup', this.handleDocumentPointerUp);\n document.addEventListener(\n 'pointercancel',\n this.handleDocumentPointerCancel\n );\n this.hasDocumentPointerListeners = true;\n }\n\n private detachDocumentPointerListeners(): void {\n if (!this.hasDocumentPointerListeners) {\n return;\n }\n document.removeEventListener('pointermove', this.handleDocumentPointerMove);\n document.removeEventListener('pointerup', this.handleDocumentPointerUp);\n document.removeEventListener(\n 'pointercancel',\n this.handleDocumentPointerCancel\n );\n this.hasDocumentPointerListeners = false;\n }\n\n private clearPointerSession(): void {\n this.pointerSession = { mode: 'idle' };\n }\n\n private clearPendingSingleLineState(): void {\n if (this.pointerSession.mode === 'pendingSingleLineUnselect') {\n this.pointerSession = { mode: 'idle' };\n }\n }\n\n private getSelectionPointerInfo(\n path: (EventTarget | undefined)[],\n requireNumberColumn: boolean\n ): SelectionPointerInfo | undefined {\n const target = this.resolvePointerTarget(path);\n if (!isLinePointerTarget(target)) {\n return undefined;\n }\n if (requireNumberColumn && !target.numberColumn) {\n return undefined;\n }\n if (target.splitLineIndex == null) {\n return undefined;\n }\n\n return {\n lineIndex: target.splitLineIndex,\n lineNumber: target.lineNumber,\n eventSide: this.mode === 'diff' ? target.side : undefined,\n };\n }\n\n private getSelectionPointFromPath(\n path: (EventTarget | undefined)[]\n ): SelectionPoint | undefined {\n const target = this.resolvePointerTarget(path);\n if (!isLinePointerTarget(target)) {\n return undefined;\n }\n return {\n lineNumber: target.lineNumber,\n side: this.mode === 'diff' ? target.side : undefined,\n };\n }\n\n private getLineIndex(\n lineNumber: number,\n side?: SelectionSide\n ): [number, number] | undefined {\n const { getLineIndex } = this.options;\n return getLineIndex != null\n ? getLineIndex(lineNumber, side)\n : [lineNumber - 1, lineNumber - 1];\n }\n\n private updateSelection(\n currentLine: number | null,\n side?: SelectionSide,\n emitChange = true\n ): void {\n const { selectedRange: previousRange } = this;\n let nextRange: SelectedLineRange | null;\n if (currentLine == null) {\n nextRange = null;\n } else {\n const anchorSide = this.selectionAnchor?.side ?? side;\n const anchorLine = this.selectionAnchor?.lineNumber ?? currentLine;\n nextRange = this.buildSelectionRange(\n anchorLine,\n currentLine,\n anchorSide,\n side\n );\n }\n if (\n areSelectionsEqual(previousRange ?? undefined, nextRange ?? undefined)\n ) {\n return;\n }\n this.selectedRange = nextRange;\n if (emitChange) {\n this.notifySelectionChangeDelta();\n }\n this.queuedSelectionRender ??= requestAnimationFrame(this.renderSelection);\n }\n\n private getIndexesFromSelection(\n selectedRange: SelectedLineRange,\n split: boolean\n ): { start: number; end: number } | undefined {\n if (this.pre == null) {\n return undefined;\n }\n const startIndexes = this.getLineIndex(\n selectedRange.start,\n selectedRange.side\n );\n const finalIndexes = this.getLineIndex(\n selectedRange.end,\n selectedRange.endSide ?? selectedRange.side\n );\n\n return startIndexes != null && finalIndexes != null\n ? {\n start: split ? startIndexes[1] : startIndexes[0],\n end: split ? finalIndexes[1] : finalIndexes[0],\n }\n : undefined;\n }\n\n private renderSelection = (): void => {\n if (this.queuedSelectionRender != null) {\n cancelAnimationFrame(this.queuedSelectionRender);\n this.queuedSelectionRender = undefined;\n }\n if (\n this.pre == null ||\n this.renderedSelectionRange === this.selectedRange\n ) {\n return;\n }\n\n const allSelected = this.pre.querySelectorAll('[data-selected-line]');\n for (const element of allSelected) {\n element.removeAttribute('data-selected-line');\n }\n\n this.renderedSelectionRange = this.selectedRange;\n if (this.selectedRange == null) {\n return;\n }\n\n const { children: codeElements } = this.pre;\n if (codeElements.length === 0) {\n return;\n }\n if (codeElements.length > 2) {\n console.error(codeElements);\n throw new Error(\n 'InteractionManager.renderSelection: Somehow there are more than 2 code elements...'\n );\n }\n const split = this.pre.getAttribute('data-diff-type') === 'split';\n const rowRange = this.getIndexesFromSelection(this.selectedRange, split);\n if (rowRange == null) {\n console.error({ rowRange, selectedRange: this.selectedRange });\n throw new Error('InteractionManager.renderSelection: No valid rowRange');\n }\n const isSingle = rowRange.start === rowRange.end;\n const first = Math.min(rowRange.start, rowRange.end);\n const last = Math.max(rowRange.start, rowRange.end);\n for (const code of codeElements) {\n const [gutter, content] = code.children;\n const len = content.children.length;\n if (len !== gutter.children.length) {\n throw new Error(\n 'InteractionManager.renderSelection: gutter and content children dont match, something is wrong'\n );\n }\n for (let i = 0; i < len; i++) {\n const contentElement = content.children[i];\n const gutterElement = gutter.children[i];\n if (\n !(contentElement instanceof HTMLElement) ||\n !(gutterElement instanceof HTMLElement)\n ) {\n continue;\n }\n\n const lineIndex = this.parseLineIndex(contentElement, split);\n if ((lineIndex ?? 0) > last) {\n break;\n }\n if (lineIndex == null || lineIndex < first) {\n continue;\n }\n let attributeValue = isSingle\n ? 'single'\n : lineIndex === first\n ? 'first'\n : lineIndex === last\n ? 'last'\n : '';\n contentElement.setAttribute('data-selected-line', attributeValue);\n gutterElement.setAttribute('data-selected-line', attributeValue);\n if (\n gutterElement.nextSibling instanceof HTMLElement &&\n contentElement.nextSibling instanceof HTMLElement &&\n (contentElement.nextSibling.hasAttribute('data-line-annotation') ||\n contentElement.nextSibling.hasAttribute(\n 'data-merge-conflict-actions'\n ))\n ) {\n if (isSingle) {\n attributeValue = 'last';\n contentElement.setAttribute('data-selected-line', 'first');\n } else if (lineIndex === first) {\n attributeValue = '';\n } else if (lineIndex === last) {\n contentElement.setAttribute('data-selected-line', '');\n }\n contentElement.nextSibling.setAttribute(\n 'data-selected-line',\n attributeValue\n );\n gutterElement.nextSibling.setAttribute(\n 'data-selected-line',\n attributeValue\n );\n }\n }\n }\n };\n\n private notifySelectionCommitted(): void {\n this.options.onLineSelected?.(this.selectedRange ?? null);\n }\n\n private notifySelectionChangeDelta(): void {\n this.options.onLineSelectionChange?.(this.selectedRange ?? null);\n }\n\n private notifySelectionStart(range: SelectedLineRange | null): void {\n this.options.onLineSelectionStart?.(range);\n }\n\n private notifySelectionEnd(range: SelectedLineRange | null): void {\n this.options.onLineSelectionEnd?.(range);\n }\n\n private toEventBaseProps(\n target: LinePointerTarget<TMode>\n ): EventBaseProps<TMode> {\n if (this.mode === 'file') {\n return {\n type: 'line',\n lineElement: target.lineElement,\n lineNumber: target.lineNumber,\n numberColumn: target.numberColumn,\n numberElement: target.numberElement,\n } as EventBaseProps<TMode>;\n }\n\n return {\n type: 'diff-line',\n annotationSide: target.side as AnnotationSide,\n lineType: target.lineType,\n lineElement: target.lineElement,\n numberElement: target.numberElement,\n lineNumber: target.lineNumber,\n numberColumn: target.numberColumn,\n } as EventBaseProps<TMode>;\n }\n\n private buildSelectedLineRange(\n anchor: SelectionPoint,\n current: SelectionPoint\n ): SelectedLineRange {\n return this.buildSelectionRange(\n anchor.lineNumber,\n current.lineNumber,\n anchor.side,\n current.side\n );\n }\n\n private buildSelectionRange(\n start: number,\n end: number,\n side?: SelectionSide,\n endSide?: SelectionSide\n ): SelectedLineRange {\n return {\n start,\n end,\n ...(side != null ? { side } : {}),\n ...(side !== endSide && endSide != null ? { endSide } : {}),\n };\n }\n\n private resolvePointerTarget(\n path: (EventTarget | undefined)[]\n ): ResolvedPointerTarget<TMode> | undefined {\n let numberColumn = false;\n let lineType: LineTypes | undefined;\n let codeElement: HTMLElement | undefined;\n let lineElement: HTMLElement | undefined;\n let lineIndexValue: string | undefined;\n let numberElement: HTMLElement | undefined;\n let expandInfo:\n | {\n hunkIndex: number | undefined;\n direction: ExpansionDirections;\n }\n | undefined;\n let lineNumber: number | undefined;\n let mergeConflictActionTarget: MergeConflictActionTarget | undefined;\n\n for (const element of path) {\n if (!(element instanceof HTMLElement)) {\n continue;\n }\n\n if (\n mergeConflictActionTarget == null &&\n element.hasAttribute('data-merge-conflict-action')\n ) {\n const resolutionValue =\n element.getAttribute('data-merge-conflict-action') ?? undefined;\n const conflictIndexValue =\n element.getAttribute('data-merge-conflict-conflict-index') ??\n undefined;\n const conflictIndex =\n conflictIndexValue != null\n ? Number.parseInt(conflictIndexValue, 10)\n : Number.NaN;\n if (\n isMergeConflictResolution(resolutionValue) &&\n Number.isFinite(conflictIndex)\n ) {\n mergeConflictActionTarget = {\n kind: 'merge-conflict-action',\n resolution: resolutionValue,\n conflictIndex,\n };\n }\n }\n\n const columnNumber =\n numberElement == null\n ? (element.getAttribute('data-column-number') ?? undefined)\n : undefined;\n if (columnNumber != null) {\n numberElement = element;\n lineNumber = Number.parseInt(columnNumber, 10);\n numberColumn = true;\n lineType = getLineTypeFromElement(element);\n lineIndexValue = element.getAttribute('data-line-index') ?? undefined;\n continue;\n }\n\n const lineAttr =\n lineElement == null\n ? (element.getAttribute('data-line') ?? undefined)\n : undefined;\n if (lineAttr != null) {\n lineElement = element;\n lineNumber = Number.parseInt(lineAttr, 10);\n lineType = getLineTypeFromElement(element);\n lineIndexValue = element.getAttribute('data-line-index') ?? undefined;\n continue;\n }\n\n if (expandInfo == null && element.hasAttribute('data-expand-button')) {\n expandInfo = {\n hunkIndex: undefined,\n direction: (() => {\n if (element.hasAttribute('data-expand-up')) {\n return 'up';\n }\n if (element.hasAttribute('data-expand-down')) {\n return 'down';\n }\n return 'both';\n })(),\n };\n continue;\n }\n\n const expandIndexValue =\n expandInfo != null\n ? (element.getAttribute('data-expand-index') ?? undefined)\n : undefined;\n if (expandInfo != null && expandIndexValue != null) {\n const expandIndex = Number.parseInt(expandIndexValue, 10);\n if (!Number.isNaN(expandIndex)) {\n expandInfo.hunkIndex = expandIndex;\n }\n continue;\n }\n\n if (codeElement == null && element.hasAttribute('data-code')) {\n codeElement = element;\n break;\n }\n }\n\n if (mergeConflictActionTarget != null) {\n return mergeConflictActionTarget as ResolvedPointerTarget<TMode>;\n }\n\n if (expandInfo?.hunkIndex != null) {\n return {\n type: 'line-info',\n hunkIndex: expandInfo.hunkIndex,\n direction: expandInfo.direction,\n } as ResolvedPointerTarget<TMode>;\n }\n\n lineElement ??=\n lineIndexValue != null\n ? queryHTMLElement(\n codeElement,\n `[data-line][data-line-index=\"${lineIndexValue}\"]`\n )\n : undefined;\n numberElement ??=\n lineIndexValue != null\n ? queryHTMLElement(\n codeElement,\n `[data-column-number][data-line-index=\"${lineIndexValue}\"]`\n )\n : undefined;\n\n if (\n codeElement == null ||\n lineElement == null ||\n numberElement == null ||\n lineType == null ||\n lineNumber == null ||\n Number.isNaN(lineNumber)\n ) {\n return undefined;\n }\n\n const splitLineIndex = this.parseLineIndex(lineElement, this.isSplitDiff());\n\n if (this.mode === 'file') {\n return {\n kind: 'line',\n lineType,\n lineElement,\n lineNumber,\n numberColumn,\n numberElement,\n side: undefined,\n splitLineIndex,\n } as ResolvedPointerTarget<TMode>;\n }\n\n const annotationSide: AnnotationSide = (() => {\n switch (lineType) {\n case 'change-deletion':\n return 'deletions';\n case 'change-addition':\n return 'additions';\n default:\n return codeElement.hasAttribute('data-deletions')\n ? 'deletions'\n : 'additions';\n }\n })();\n\n return {\n kind: 'line',\n lineType,\n lineElement,\n lineNumber,\n numberColumn,\n numberElement,\n side: annotationSide,\n splitLineIndex,\n } as ResolvedPointerTarget<TMode>;\n }\n\n private isSplitDiff(): boolean {\n return this.pre?.getAttribute('data-diff-type') === 'split';\n }\n\n private parseLineIndex(\n element: HTMLElement,\n split: boolean\n ): number | undefined {\n const lineIndexes = (element.getAttribute('data-line-index') ?? '')\n .split(',')\n .map((value) => Number.parseInt(value, 10))\n .filter((value) => !Number.isNaN(value));\n\n if (split && lineIndexes.length === 2) {\n return lineIndexes[1];\n }\n if (!split) {\n return lineIndexes[0];\n }\n return undefined;\n }\n}\n\ntype InteractionPluckOptions<TMode extends InteractionManagerMode> =\n InteractionManagerBaseOptions<TMode> & {\n enableHoverUtility?: boolean;\n renderGutterUtility?(\n getHoveredRow: () => GetHoveredLineResult<TMode> | undefined\n ): HTMLElement | null | undefined;\n renderHoverUtility?(\n getHoveredRow: () => GetHoveredLineResult<TMode> | undefined\n ): HTMLElement | null | undefined;\n };\n\nexport function pluckInteractionOptions<TMode extends InteractionManagerMode>(\n {\n enableGutterUtility,\n enableHoverUtility,\n lineHoverHighlight,\n onGutterUtilityClick,\n onLineClick,\n onLineEnter,\n onLineLeave,\n onLineNumberClick,\n renderGutterUtility,\n renderHoverUtility,\n __debugPointerEvents,\n enableLineSelection,\n onLineSelected,\n onLineSelectionStart,\n onLineSelectionChange,\n onLineSelectionEnd,\n }: InteractionPluckOptions<TMode>,\n onHunkExpand?: (\n hunkIndex: number,\n direction: ExpansionDirections,\n expansionLineCount?: number\n ) => unknown,\n getLineIndex?: GetLineIndexUtility,\n onMergeConflictActionClick?: (target: MergeConflictActionTarget) => void\n): InteractionManagerOptions<TMode> {\n return {\n enableGutterUtility: resolveEnableGutterUtilityOption({\n enableGutterUtility,\n enableHoverUtility,\n renderGutterUtility,\n renderHoverUtility,\n onGutterUtilityClick,\n }),\n usesCustomGutterUtility:\n renderGutterUtility != null || renderHoverUtility != null,\n lineHoverHighlight,\n\n onGutterUtilityClick,\n onHunkExpand,\n onMergeConflictActionClick,\n onLineClick,\n onLineEnter,\n onLineLeave,\n onLineNumberClick,\n __debugPointerEvents,\n\n enableLineSelection,\n onLineSelected,\n onLineSelectionStart,\n onLineSelectionChange,\n onLineSelectionEnd,\n\n getLineIndex,\n };\n}\n\nfunction resolveEnableGutterUtilityOption<\n TMode extends InteractionManagerMode,\n>({\n enableGutterUtility,\n enableHoverUtility,\n renderGutterUtility,\n renderHoverUtility,\n onGutterUtilityClick,\n}: Pick<\n InteractionPluckOptions<TMode>,\n | 'enableGutterUtility'\n | 'enableHoverUtility'\n | 'renderGutterUtility'\n | 'renderHoverUtility'\n | 'onGutterUtilityClick'\n>): boolean {\n if (enableGutterUtility !== undefined && enableHoverUtility !== undefined) {\n throw new Error(\n \"Cannot use both 'enableGutterUtility' and deprecated 'enableHoverUtility'. Use only 'enableGutterUtility'.\"\n );\n }\n if (renderGutterUtility != null && renderHoverUtility != null) {\n throw new Error(\n \"Cannot use both 'renderGutterUtility' and deprecated 'renderHoverUtility'. Use only 'renderGutterUtility'.\"\n );\n }\n if (\n onGutterUtilityClick != null &&\n (renderGutterUtility != null || renderHoverUtility != null)\n ) {\n throw new Error(\n \"Cannot use both 'onGutterUtilityClick' and render utility callbacks ('renderGutterUtility'/'renderHoverUtility'). Use only one gutter utility API.\"\n );\n }\n return enableGutterUtility ?? enableHoverUtility ?? false;\n}\n\nfunction isLinePointerTarget<TMode extends InteractionManagerMode>(\n target: ResolvedPointerTarget<TMode> | undefined\n): target is LinePointerTarget<TMode> {\n return target != null && 'kind' in target && target.kind === 'line';\n}\n\nfunction isExpandoPointerTarget<TMode extends InteractionManagerMode>(\n target: ResolvedPointerTarget<TMode>\n): target is ExpandoEventProps {\n return 'type' in target && target.type === 'line-info';\n}\n\nfunction isMergeConflictActionPointerTarget<\n TMode extends InteractionManagerMode,\n>(target: ResolvedPointerTarget<TMode>): target is MergeConflictActionTarget {\n return 'kind' in target && target.kind === 'merge-conflict-action';\n}\n\nfunction isMergeConflictResolution(\n value: string | undefined\n): value is MergeConflictResolution {\n return value === 'current' || value === 'incoming' || value === 'both';\n}\n\nfunction queryHTMLElement(\n parent: HTMLElement | undefined,\n query: string\n): HTMLElement | undefined {\n const element = parent?.querySelector(query);\n return element instanceof HTMLElement ? element : undefined;\n}\n\nfunction getLineTypeFromElement(element: HTMLElement): LineTypes | undefined {\n const lineType = element.getAttribute('data-line-type');\n if (lineType == null) {\n return undefined;\n }\n switch (lineType) {\n case 'change-deletion':\n case 'change-addition':\n case 'context':\n case 'context-expanded':\n return lineType;\n default:\n return undefined;\n }\n}\n\nfunction isGutterUtilityPointerPath(\n path: (EventTarget | undefined)[]\n): boolean {\n for (const element of path) {\n if (\n element instanceof HTMLElement &&\n element.hasAttribute('data-utility-button')\n ) {\n return true;\n }\n }\n return false;\n}\n\nfunction debugLogIfEnabled(\n debugLogType: LogTypes | undefined = 'none',\n logIfType: 'move' | 'click',\n ...args: unknown[]\n) {\n switch (debugLogType) {\n case 'none':\n return;\n case 'both':\n break;\n case 'click':\n if (logIfType !== 'click') {\n return;\n }\n break;\n case 'move':\n if (logIfType !== 'move') {\n return;\n }\n break;\n }\n console.log(...args);\n}\n"],"mappings":"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"}
|
|
@@ -1,13 +1,11 @@
|
|
|
1
1
|
//#region src/managers/ResizeManager.d.ts
|
|
2
2
|
declare class ResizeManager {
|
|
3
3
|
private observedNodes;
|
|
4
|
-
private timeoutID;
|
|
5
4
|
private queuedUpdates;
|
|
6
5
|
cleanUp(): void;
|
|
7
6
|
private resizeObserver;
|
|
8
7
|
setup(pre: HTMLPreElement, disableAnnotations: boolean): void;
|
|
9
8
|
private handleResizeObserver;
|
|
10
|
-
private queueColumnUpdate;
|
|
11
9
|
private handleColumnChange;
|
|
12
10
|
private applyNewHeight;
|
|
13
11
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ResizeManager.d.ts","names":["ResizeManager","HTMLPreElement"],"sources":["../../src/managers/ResizeManager.d.ts"],"sourcesContent":["export declare class ResizeManager {\n private observedNodes;\n private
|
|
1
|
+
{"version":3,"file":"ResizeManager.d.ts","names":["ResizeManager","HTMLPreElement"],"sources":["../../src/managers/ResizeManager.d.ts"],"sourcesContent":["export declare class ResizeManager {\n private observedNodes;\n private queuedUpdates;\n cleanUp(): void;\n private resizeObserver;\n setup(pre: HTMLPreElement, disableAnnotations: boolean): void;\n private handleResizeObserver;\n private handleColumnChange;\n private applyNewHeight;\n}\n//# sourceMappingURL=ResizeManager.d.ts.map"],"mappings":";cAAqBA,aAAAA;EAAAA,QAAAA,aAAa;;;;aAKnBC"}
|
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
//#region src/managers/ResizeManager.ts
|
|
2
2
|
var ResizeManager = class {
|
|
3
3
|
observedNodes = /* @__PURE__ */ new Map();
|
|
4
|
-
timeoutID;
|
|
5
4
|
queuedUpdates = /* @__PURE__ */ new Map();
|
|
6
5
|
cleanUp() {
|
|
7
6
|
this.resizeObserver?.disconnect();
|
|
8
7
|
this.observedNodes.clear();
|
|
9
|
-
|
|
8
|
+
this.queuedUpdates.clear();
|
|
10
9
|
}
|
|
11
10
|
resizeObserver;
|
|
12
11
|
setup(pre, disableAnnotations) {
|
|
@@ -16,25 +15,38 @@ var ResizeManager = class {
|
|
|
16
15
|
this.observedNodes.clear();
|
|
17
16
|
for (const codeElement of codeElements) {
|
|
18
17
|
let item = observedNodes.get(codeElement);
|
|
18
|
+
if (item != null && item.type !== "code") throw new Error("ResizeManager.setup: somehow a code node is being used for an annotation, should be impossible");
|
|
19
|
+
let numberElement = codeElement.firstElementChild;
|
|
20
|
+
if (!(numberElement instanceof HTMLElement)) numberElement = null;
|
|
19
21
|
if (item != null) {
|
|
20
22
|
this.observedNodes.set(codeElement, item);
|
|
21
23
|
observedNodes.delete(codeElement);
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
24
|
+
if (item.numberElement !== numberElement) {
|
|
25
|
+
if (item.numberElement != null) this.resizeObserver.unobserve(item.numberElement);
|
|
26
|
+
if (numberElement != null) {
|
|
27
|
+
this.resizeObserver.observe(numberElement);
|
|
28
|
+
observedNodes.delete(numberElement);
|
|
29
|
+
this.observedNodes.set(numberElement, item);
|
|
30
|
+
}
|
|
31
|
+
item.numberElement = numberElement;
|
|
32
|
+
} else if (item.numberElement != null) {
|
|
33
|
+
observedNodes.delete(item.numberElement);
|
|
34
|
+
this.observedNodes.set(item.numberElement, item);
|
|
35
|
+
}
|
|
36
|
+
} else {
|
|
37
|
+
item = {
|
|
38
|
+
type: "code",
|
|
39
|
+
codeElement,
|
|
40
|
+
numberElement,
|
|
41
|
+
codeWidth: "auto",
|
|
42
|
+
numberWidth: 0
|
|
43
|
+
};
|
|
44
|
+
this.observedNodes.set(codeElement, item);
|
|
45
|
+
this.resizeObserver.observe(codeElement);
|
|
46
|
+
if (numberElement != null) {
|
|
47
|
+
this.observedNodes.set(numberElement, item);
|
|
48
|
+
this.resizeObserver.observe(numberElement);
|
|
49
|
+
}
|
|
38
50
|
}
|
|
39
51
|
}
|
|
40
52
|
if (codeElements.length > 1 && !disableAnnotations) {
|
|
@@ -136,27 +148,26 @@ var ResizeManager = class {
|
|
|
136
148
|
const newHeight = Math.max(item.column1.childHeight, item.column2.childHeight);
|
|
137
149
|
this.applyNewHeight(item, newHeight);
|
|
138
150
|
} else if (item.type === "code") {
|
|
139
|
-
|
|
140
|
-
this.
|
|
151
|
+
const update = [target, specs.inlineSize];
|
|
152
|
+
const updates = this.queuedUpdates.get(item) ?? [];
|
|
153
|
+
updates.push(update);
|
|
154
|
+
this.queuedUpdates.set(item, updates);
|
|
141
155
|
}
|
|
142
156
|
}
|
|
157
|
+
this.handleColumnChange();
|
|
143
158
|
};
|
|
144
|
-
queueColumnUpdate() {
|
|
145
|
-
if (this.timeoutID != null) clearTimeout(this.timeoutID);
|
|
146
|
-
this.timeoutID = setTimeout(this.handleColumnChange, 1e3 / 30);
|
|
147
|
-
}
|
|
148
159
|
handleColumnChange = () => {
|
|
149
|
-
this.
|
|
150
|
-
|
|
151
|
-
const inlineSize = Math.max(Math.floor(specs.inlineSize), 0);
|
|
160
|
+
for (const [item, updates] of this.queuedUpdates) for (const [target, targetInlineSize] of updates) if (target === item.codeElement) {
|
|
161
|
+
const inlineSize = Math.max(Math.floor(targetInlineSize), 0);
|
|
152
162
|
if (inlineSize !== item.codeWidth) {
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
item.codeElement.style.setProperty("--diffs-column-content-width", `${targetWidth
|
|
156
|
-
item.codeElement.style.setProperty("--diffs-column-width", `${item.codeWidth ===
|
|
163
|
+
const targetWidth = Math.max(inlineSize - item.numberWidth, 0);
|
|
164
|
+
item.codeWidth = inlineSize === 0 ? "auto" : inlineSize;
|
|
165
|
+
item.codeElement.style.setProperty("--diffs-column-content-width", `${targetWidth > 0 ? `${targetWidth}px` : "auto"}`);
|
|
166
|
+
item.codeElement.style.setProperty("--diffs-column-width", `${typeof item.codeWidth === "number" ? `${item.codeWidth}px` : "auto"}`);
|
|
157
167
|
}
|
|
168
|
+
if (item.numberElement != null && typeof item.codeWidth === "number" && item.numberWidth === 0) updates.push([item.numberElement, item.numberElement.getBoundingClientRect().width]);
|
|
158
169
|
} else if (target === item.numberElement) {
|
|
159
|
-
const inlineSize = Math.max(Math.ceil(
|
|
170
|
+
const inlineSize = Math.max(Math.ceil(targetInlineSize), 0);
|
|
160
171
|
if (inlineSize !== item.numberWidth) {
|
|
161
172
|
item.numberWidth = inlineSize;
|
|
162
173
|
item.codeElement.style.setProperty("--diffs-column-number-width", `${item.numberWidth === 0 ? "auto" : `${item.numberWidth}px`}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ResizeManager.js","names":["item: ObservedGridNodes | ObservedAnnotationNodes | undefined"],"sources":["../../src/managers/ResizeManager.ts"],"sourcesContent":["import type { ObservedAnnotationNodes, ObservedGridNodes } from '../types';\n\nexport class ResizeManager {\n private observedNodes = new Map<\n HTMLElement,\n ObservedAnnotationNodes | ObservedGridNodes\n >();\n private timeoutID: NodeJS.Timeout | undefined;\n private queuedUpdates: Map<\n HTMLElement,\n [ObservedGridNodes, ResizeObserverSize]\n > = new Map();\n\n cleanUp(): void {\n // Disconnect any existing observer\n this.resizeObserver?.disconnect();\n this.observedNodes.clear();\n if (this.timeoutID != null) {\n clearTimeout(this.timeoutID);\n }\n }\n\n private resizeObserver: ResizeObserver | undefined;\n\n setup(pre: HTMLPreElement, disableAnnotations: boolean): void {\n this.resizeObserver ??= new ResizeObserver(this.handleResizeObserver);\n const codeElements = pre.querySelectorAll('code');\n\n const observedNodes = new Map(this.observedNodes);\n this.observedNodes.clear();\n for (const codeElement of codeElements) {\n let item: ObservedGridNodes | ObservedAnnotationNodes | undefined =\n observedNodes.get(codeElement);\n if (item != null) {\n this.observedNodes.set(codeElement, item);\n observedNodes.delete(codeElement);\n continue;\n }\n let numberElement = codeElement.querySelector('[data-gutter]');\n if (!(numberElement instanceof HTMLElement)) {\n numberElement = null;\n }\n item = {\n type: 'code',\n codeElement,\n numberElement,\n codeWidth: 'auto',\n numberWidth: 0,\n };\n this.observedNodes.set(codeElement, item);\n this.resizeObserver.observe(codeElement);\n if (numberElement != null) {\n this.observedNodes.set(numberElement, item);\n this.resizeObserver.observe(numberElement);\n }\n }\n\n if (codeElements.length > 1 && !disableAnnotations) {\n const annotationElements = pre.querySelectorAll(\n '[data-line-annotation*=\",\"]'\n );\n\n const elementMap = new Map<string, HTMLElement[]>();\n for (const element of annotationElements) {\n if (!(element instanceof HTMLElement)) {\n continue;\n }\n const { lineAnnotation = '' } = element.dataset;\n if (!/^\\d+,\\d+$/.test(lineAnnotation)) {\n console.error(\n 'DiffFileRenderer.setupResizeObserver: Invalid element or annotation',\n { lineAnnotation, element }\n );\n continue;\n }\n let pairs = elementMap.get(lineAnnotation);\n if (pairs == null) {\n pairs = [];\n elementMap.set(lineAnnotation, pairs);\n }\n pairs.push(element);\n }\n\n for (const [key, pair] of elementMap) {\n if (pair.length !== 2) {\n console.error(\n 'DiffFileRenderer.setupResizeObserver: Bad Pair',\n key,\n pair\n );\n continue;\n }\n const [container1, container2] = pair;\n const child1 = container1.firstElementChild;\n const child2 = container2.firstElementChild;\n if (\n !(container1 instanceof HTMLElement) ||\n !(container2 instanceof HTMLElement) ||\n !(child1 instanceof HTMLElement) ||\n !(child2 instanceof HTMLElement)\n ) {\n continue;\n }\n\n let item = observedNodes.get(child1);\n\n if (item != null) {\n this.observedNodes.set(child1, item);\n this.observedNodes.set(child2, item);\n observedNodes.delete(child1);\n observedNodes.delete(child2);\n continue;\n }\n\n item = {\n type: 'annotations',\n column1: {\n container: container1,\n child: child1,\n childHeight: child1.getBoundingClientRect().height,\n },\n column2: {\n container: container2,\n child: child2,\n childHeight: child2.getBoundingClientRect().height,\n },\n currentHeight: 'auto',\n };\n\n const newHeight = Math.max(\n item.column1.childHeight,\n item.column2.childHeight\n );\n this.applyNewHeight(item, newHeight);\n\n this.observedNodes.set(child1, item);\n this.observedNodes.set(child2, item);\n this.resizeObserver.observe(child1);\n this.resizeObserver.observe(child2);\n }\n }\n\n for (const element of observedNodes.keys()) {\n if (element.isConnected) {\n element.style.removeProperty('--diffs-column-content-width');\n element.style.removeProperty('--diffs-column-number-width');\n element.style.removeProperty('--diffs-column-width');\n if (element.parentElement instanceof HTMLElement) {\n element.parentElement.style.removeProperty(\n '--diffs-annotation-min-height'\n );\n }\n }\n this.resizeObserver.unobserve(element);\n }\n observedNodes.clear();\n }\n\n private handleResizeObserver = (entries: ResizeObserverEntry[]) => {\n for (const entry of entries) {\n const { target, borderBoxSize } = entry;\n if (!(target instanceof HTMLElement)) {\n console.error(\n 'FileDiff.handleResizeObserver: Invalid element for ResizeObserver',\n entry\n );\n continue;\n }\n const item = this.observedNodes.get(target);\n if (item == null) {\n console.error(\n 'FileDiff.handleResizeObserver: Not a valid observed node',\n entry\n );\n continue;\n }\n const specs = borderBoxSize[0];\n if (item.type === 'annotations') {\n const column = (() => {\n if (target === item.column1.child) {\n return item.column1;\n }\n if (target === item.column2.child) {\n return item.column2;\n }\n return undefined;\n })();\n\n if (column == null) {\n console.error(\n `FileDiff.handleResizeObserver: Couldn't find a column for`,\n { item, target }\n );\n continue;\n }\n\n column.childHeight = specs.blockSize;\n const newHeight = Math.max(\n item.column1.childHeight,\n item.column2.childHeight\n );\n this.applyNewHeight(item, newHeight);\n } else if (item.type === 'code') {\n // We debounce code column updates to help with resize performance (mb)\n this.queuedUpdates.set(target, [item, specs]);\n this.queueColumnUpdate();\n }\n }\n };\n\n private queueColumnUpdate() {\n if (this.timeoutID != null) {\n clearTimeout(this.timeoutID);\n }\n // Attempt to debounce resize events to improve general performance... mb\n this.timeoutID = setTimeout(this.handleColumnChange, 1000 / 30);\n }\n\n private handleColumnChange = () => {\n this.timeoutID = undefined;\n for (const [target, [item, specs]] of this.queuedUpdates) {\n // FIXME(amadeus): This needs to be re-worked with display: contents,\n // not sure setting to auto is a good assumption most of the time...\n if (target === item.codeElement) {\n const inlineSize = Math.max(Math.floor(specs.inlineSize), 0);\n if (inlineSize !== item.codeWidth) {\n item.codeWidth = inlineSize;\n const targetWidth = Math.max(item.codeWidth - item.numberWidth, 0);\n item.codeElement.style.setProperty(\n '--diffs-column-content-width',\n `${targetWidth === 0 ? 'auto' : `${targetWidth}px`}`\n );\n item.codeElement.style.setProperty(\n '--diffs-column-width',\n `${item.codeWidth === 0 ? 'auto' : `${item.codeWidth}px`}`\n );\n }\n } else if (target === item.numberElement) {\n const inlineSize = Math.max(Math.ceil(specs.inlineSize), 0);\n if (inlineSize !== item.numberWidth) {\n item.numberWidth = inlineSize;\n item.codeElement.style.setProperty(\n '--diffs-column-number-width',\n `${item.numberWidth === 0 ? 'auto' : `${item.numberWidth}px`}`\n );\n // We probably need to update code width variable if\n // `numberWidth` changed\n if (item.codeWidth !== 'auto') {\n const targetWidth = Math.max(item.codeWidth - item.numberWidth, 0);\n item.codeElement.style.setProperty(\n '--diffs-column-content-width',\n `${targetWidth === 0 ? 'auto' : `${targetWidth}px`}`\n );\n }\n }\n }\n }\n this.queuedUpdates.clear();\n };\n\n private applyNewHeight(item: ObservedAnnotationNodes, newHeight: number) {\n if (newHeight !== item.currentHeight) {\n item.currentHeight = Math.max(newHeight, 0);\n item.column1.container.style.setProperty(\n '--diffs-annotation-min-height',\n `${item.currentHeight}px`\n );\n item.column2.container.style.setProperty(\n '--diffs-annotation-min-height',\n `${item.currentHeight}px`\n );\n }\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ResizeManager.js","names":["item: ObservedGridNodes | ObservedAnnotationNodes | undefined","update: CodeColumnUpdate"],"sources":["../../src/managers/ResizeManager.ts"],"sourcesContent":["import type { ObservedAnnotationNodes, ObservedGridNodes } from '../types';\n\ntype CodeColumnUpdate = [HTMLElement, number];\n\nexport class ResizeManager {\n private observedNodes = new Map<\n HTMLElement,\n ObservedAnnotationNodes | ObservedGridNodes\n >();\n private queuedUpdates: Map<ObservedGridNodes, CodeColumnUpdate[]> = new Map();\n\n cleanUp(): void {\n // Disconnect any existing observer\n this.resizeObserver?.disconnect();\n this.observedNodes.clear();\n this.queuedUpdates.clear();\n }\n\n private resizeObserver: ResizeObserver | undefined;\n\n setup(pre: HTMLPreElement, disableAnnotations: boolean): void {\n this.resizeObserver ??= new ResizeObserver(this.handleResizeObserver);\n const codeElements = pre.querySelectorAll('code');\n\n const observedNodes = new Map(this.observedNodes);\n this.observedNodes.clear();\n for (const codeElement of codeElements) {\n let item: ObservedGridNodes | ObservedAnnotationNodes | undefined =\n observedNodes.get(codeElement);\n if (item != null && item.type !== 'code') {\n throw new Error(\n 'ResizeManager.setup: somehow a code node is being used for an annotation, should be impossible'\n );\n }\n\n let numberElement = codeElement.firstElementChild;\n if (!(numberElement instanceof HTMLElement)) {\n numberElement = null;\n }\n\n if (item != null) {\n this.observedNodes.set(codeElement, item);\n observedNodes.delete(codeElement);\n if (item.numberElement !== numberElement) {\n if (item.numberElement != null) {\n this.resizeObserver.unobserve(item.numberElement);\n }\n if (numberElement != null) {\n this.resizeObserver.observe(numberElement);\n observedNodes.delete(numberElement);\n this.observedNodes.set(numberElement, item);\n }\n item.numberElement = numberElement;\n } else if (item.numberElement != null) {\n observedNodes.delete(item.numberElement);\n this.observedNodes.set(item.numberElement, item);\n }\n } else {\n item = {\n type: 'code',\n codeElement,\n numberElement,\n codeWidth: 'auto',\n numberWidth: 0,\n };\n this.observedNodes.set(codeElement, item);\n this.resizeObserver.observe(codeElement);\n if (numberElement != null) {\n this.observedNodes.set(numberElement, item);\n this.resizeObserver.observe(numberElement);\n }\n }\n }\n\n if (codeElements.length > 1 && !disableAnnotations) {\n const annotationElements = pre.querySelectorAll(\n '[data-line-annotation*=\",\"]'\n );\n\n const elementMap = new Map<string, HTMLElement[]>();\n for (const element of annotationElements) {\n if (!(element instanceof HTMLElement)) {\n continue;\n }\n const { lineAnnotation = '' } = element.dataset;\n if (!/^\\d+,\\d+$/.test(lineAnnotation)) {\n console.error(\n 'DiffFileRenderer.setupResizeObserver: Invalid element or annotation',\n { lineAnnotation, element }\n );\n continue;\n }\n let pairs = elementMap.get(lineAnnotation);\n if (pairs == null) {\n pairs = [];\n elementMap.set(lineAnnotation, pairs);\n }\n pairs.push(element);\n }\n\n for (const [key, pair] of elementMap) {\n if (pair.length !== 2) {\n console.error(\n 'DiffFileRenderer.setupResizeObserver: Bad Pair',\n key,\n pair\n );\n continue;\n }\n const [container1, container2] = pair;\n const child1 = container1.firstElementChild;\n const child2 = container2.firstElementChild;\n if (\n !(container1 instanceof HTMLElement) ||\n !(container2 instanceof HTMLElement) ||\n !(child1 instanceof HTMLElement) ||\n !(child2 instanceof HTMLElement)\n ) {\n continue;\n }\n\n let item = observedNodes.get(child1);\n\n if (item != null) {\n this.observedNodes.set(child1, item);\n this.observedNodes.set(child2, item);\n observedNodes.delete(child1);\n observedNodes.delete(child2);\n continue;\n }\n\n item = {\n type: 'annotations',\n column1: {\n container: container1,\n child: child1,\n childHeight: child1.getBoundingClientRect().height,\n },\n column2: {\n container: container2,\n child: child2,\n childHeight: child2.getBoundingClientRect().height,\n },\n currentHeight: 'auto',\n };\n\n const newHeight = Math.max(\n item.column1.childHeight,\n item.column2.childHeight\n );\n this.applyNewHeight(item, newHeight);\n\n this.observedNodes.set(child1, item);\n this.observedNodes.set(child2, item);\n this.resizeObserver.observe(child1);\n this.resizeObserver.observe(child2);\n }\n }\n\n for (const element of observedNodes.keys()) {\n if (element.isConnected) {\n element.style.removeProperty('--diffs-column-content-width');\n element.style.removeProperty('--diffs-column-number-width');\n element.style.removeProperty('--diffs-column-width');\n if (element.parentElement instanceof HTMLElement) {\n element.parentElement.style.removeProperty(\n '--diffs-annotation-min-height'\n );\n }\n }\n this.resizeObserver.unobserve(element);\n }\n observedNodes.clear();\n }\n\n private handleResizeObserver = (entries: ResizeObserverEntry[]) => {\n for (const entry of entries) {\n const { target, borderBoxSize } = entry;\n if (!(target instanceof HTMLElement)) {\n console.error(\n 'FileDiff.handleResizeObserver: Invalid element for ResizeObserver',\n entry\n );\n continue;\n }\n const item = this.observedNodes.get(target);\n if (item == null) {\n console.error(\n 'FileDiff.handleResizeObserver: Not a valid observed node',\n entry\n );\n continue;\n }\n const specs = borderBoxSize[0];\n if (item.type === 'annotations') {\n const column = (() => {\n if (target === item.column1.child) {\n return item.column1;\n }\n if (target === item.column2.child) {\n return item.column2;\n }\n return undefined;\n })();\n\n if (column == null) {\n console.error(\n `FileDiff.handleResizeObserver: Couldn't find a column for`,\n { item, target }\n );\n continue;\n }\n\n column.childHeight = specs.blockSize;\n const newHeight = Math.max(\n item.column1.childHeight,\n item.column2.childHeight\n );\n this.applyNewHeight(item, newHeight);\n } else if (item.type === 'code') {\n const update: CodeColumnUpdate = [target, specs.inlineSize];\n const updates = this.queuedUpdates.get(item) ?? [];\n updates.push(update);\n this.queuedUpdates.set(item, updates);\n }\n }\n this.handleColumnChange();\n };\n\n private handleColumnChange = () => {\n for (const [item, updates] of this.queuedUpdates) {\n for (const [target, targetInlineSize] of updates) {\n // FIXME(amadeus): This needs to be re-worked with display: contents,\n // not sure setting to auto is a good assumption most of the time...\n if (target === item.codeElement) {\n const inlineSize = Math.max(Math.floor(targetInlineSize), 0);\n if (inlineSize !== item.codeWidth) {\n const targetWidth = Math.max(inlineSize - item.numberWidth, 0);\n item.codeWidth = inlineSize === 0 ? 'auto' : inlineSize;\n item.codeElement.style.setProperty(\n '--diffs-column-content-width',\n `${targetWidth > 0 ? `${targetWidth}px` : 'auto'}`\n );\n item.codeElement.style.setProperty(\n '--diffs-column-width',\n `${typeof item.codeWidth === 'number' ? `${item.codeWidth}px` : 'auto'}`\n );\n }\n if (\n item.numberElement != null &&\n typeof item.codeWidth === 'number' &&\n item.numberWidth === 0\n ) {\n updates.push([\n item.numberElement,\n item.numberElement.getBoundingClientRect().width,\n ]);\n }\n } else if (target === item.numberElement) {\n const inlineSize = Math.max(Math.ceil(targetInlineSize), 0);\n if (inlineSize !== item.numberWidth) {\n item.numberWidth = inlineSize;\n item.codeElement.style.setProperty(\n '--diffs-column-number-width',\n `${item.numberWidth === 0 ? 'auto' : `${item.numberWidth}px`}`\n );\n // We probably need to update code width variable if\n // `numberWidth` changed\n if (item.codeWidth !== 'auto') {\n const targetWidth = Math.max(\n item.codeWidth - item.numberWidth,\n 0\n );\n item.codeElement.style.setProperty(\n '--diffs-column-content-width',\n `${targetWidth === 0 ? 'auto' : `${targetWidth}px`}`\n );\n }\n }\n }\n }\n }\n this.queuedUpdates.clear();\n };\n\n private applyNewHeight(item: ObservedAnnotationNodes, newHeight: number) {\n if (newHeight !== item.currentHeight) {\n item.currentHeight = Math.max(newHeight, 0);\n item.column1.container.style.setProperty(\n '--diffs-annotation-min-height',\n `${item.currentHeight}px`\n );\n item.column2.container.style.setProperty(\n '--diffs-annotation-min-height',\n `${item.currentHeight}px`\n );\n }\n }\n}\n"],"mappings":"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"}
|
package/dist/react/File.d.ts
CHANGED
|
@@ -11,8 +11,10 @@ declare function File<LAnnotation = undefined>({
|
|
|
11
11
|
className,
|
|
12
12
|
style,
|
|
13
13
|
renderAnnotation,
|
|
14
|
+
renderHeaderPrefix,
|
|
14
15
|
renderHeaderMetadata,
|
|
15
16
|
prerenderedHTML,
|
|
17
|
+
renderGutterUtility,
|
|
16
18
|
renderHoverUtility
|
|
17
19
|
}: FileProps<LAnnotation>): React.JSX.Element;
|
|
18
20
|
//#endregion
|
package/dist/react/File.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"File.d.ts","names":["FileOptions","FileProps","File","LAnnotation","file","lineAnnotations","selectedLines","options","metrics","className","style","renderAnnotation","renderHeaderMetadata","prerenderedHTML","renderHoverUtility","React","JSX","Element"],"sources":["../../src/react/File.d.ts"],"sourcesContent":["import { type FileOptions } from '../components/File';\nimport type { FileProps } from './types';\nexport type { FileOptions };\nexport declare function File<LAnnotation = undefined>({ file, lineAnnotations, selectedLines, options, metrics, className, style, renderAnnotation, renderHeaderMetadata, prerenderedHTML, renderHoverUtility }: FileProps<LAnnotation>): React.JSX.Element;\n//# sourceMappingURL=File.d.ts.map"],"mappings":";;;;iBAGwBE
|
|
1
|
+
{"version":3,"file":"File.d.ts","names":["FileOptions","FileProps","File","LAnnotation","file","lineAnnotations","selectedLines","options","metrics","className","style","renderAnnotation","renderHeaderPrefix","renderHeaderMetadata","prerenderedHTML","renderGutterUtility","renderHoverUtility","React","JSX","Element"],"sources":["../../src/react/File.d.ts"],"sourcesContent":["import { type FileOptions } from '../components/File';\nimport type { FileProps } from './types';\nexport type { FileOptions };\nexport declare function File<LAnnotation = undefined>({ file, lineAnnotations, selectedLines, options, metrics, className, style, renderAnnotation, renderHeaderPrefix, renderHeaderMetadata, prerenderedHTML, renderGutterUtility, renderHoverUtility }: FileProps<LAnnotation>): React.JSX.Element;\n//# sourceMappingURL=File.d.ts.map"],"mappings":";;;;iBAGwBE;;;;;;;;;;;;;;GAAkOD,UAAUE,eAAec,KAAAA,CAAMC,GAAAA,CAAIC"}
|
package/dist/react/File.js
CHANGED
|
@@ -8,14 +8,15 @@ import { useFileInstance } from "./utils/useFileInstance.js";
|
|
|
8
8
|
import { jsx } from "react/jsx-runtime";
|
|
9
9
|
|
|
10
10
|
//#region src/react/File.tsx
|
|
11
|
-
function File({ file, lineAnnotations, selectedLines, options, metrics, className, style, renderAnnotation, renderHeaderMetadata, prerenderedHTML, renderHoverUtility }) {
|
|
11
|
+
function File({ file, lineAnnotations, selectedLines, options, metrics, className, style, renderAnnotation, renderHeaderPrefix, renderHeaderMetadata, prerenderedHTML, renderGutterUtility, renderHoverUtility }) {
|
|
12
12
|
const { ref, getHoveredLine } = useFileInstance({
|
|
13
13
|
file,
|
|
14
14
|
options,
|
|
15
15
|
metrics,
|
|
16
16
|
lineAnnotations,
|
|
17
17
|
selectedLines,
|
|
18
|
-
prerenderedHTML
|
|
18
|
+
prerenderedHTML,
|
|
19
|
+
hasGutterRenderUtility: renderGutterUtility != null || renderHoverUtility != null
|
|
19
20
|
});
|
|
20
21
|
return /* @__PURE__ */ jsx(DIFFS_TAG_NAME, {
|
|
21
22
|
ref,
|
|
@@ -24,7 +25,9 @@ function File({ file, lineAnnotations, selectedLines, options, metrics, classNam
|
|
|
24
25
|
children: templateRender(renderFileChildren({
|
|
25
26
|
file,
|
|
26
27
|
renderAnnotation,
|
|
28
|
+
renderHeaderPrefix,
|
|
27
29
|
renderHeaderMetadata,
|
|
30
|
+
renderGutterUtility,
|
|
28
31
|
renderHoverUtility,
|
|
29
32
|
lineAnnotations,
|
|
30
33
|
getHoveredLine
|
package/dist/react/File.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"File.js","names":[],"sources":["../../src/react/File.tsx"],"sourcesContent":["'use client';\n\nimport { type FileOptions } from '../components/File';\nimport { DIFFS_TAG_NAME } from '../constants';\nimport type { FileProps } from './types';\nimport { renderFileChildren } from './utils/renderFileChildren';\nimport { templateRender } from './utils/templateRender';\nimport { useFileInstance } from './utils/useFileInstance';\n\nexport type { FileOptions };\n\nexport function File<LAnnotation = undefined>({\n file,\n lineAnnotations,\n selectedLines,\n options,\n metrics,\n className,\n style,\n renderAnnotation,\n renderHeaderMetadata,\n prerenderedHTML,\n renderHoverUtility,\n}: FileProps<LAnnotation>): React.JSX.Element {\n const { ref, getHoveredLine } = useFileInstance({\n file,\n options,\n metrics,\n lineAnnotations,\n selectedLines,\n prerenderedHTML,\n });\n const children = renderFileChildren({\n file,\n renderAnnotation,\n renderHeaderMetadata,\n renderHoverUtility,\n lineAnnotations,\n getHoveredLine,\n });\n return (\n <DIFFS_TAG_NAME ref={ref} className={className} style={style}>\n {templateRender(children, prerenderedHTML)}\n </DIFFS_TAG_NAME>\n );\n}\n"],"mappings":";;;;;;;;;;AAWA,SAAgB,KAA8B,EAC5C,MACA,iBACA,eACA,SACA,SACA,WACA,OACA,kBACA,sBACA,iBACA,sBAC4C;CAC5C,MAAM,EAAE,KAAK,mBAAmB,gBAAgB;EAC9C;EACA;EACA;EACA;EACA;EACA;
|
|
1
|
+
{"version":3,"file":"File.js","names":[],"sources":["../../src/react/File.tsx"],"sourcesContent":["'use client';\n\nimport { type FileOptions } from '../components/File';\nimport { DIFFS_TAG_NAME } from '../constants';\nimport type { FileProps } from './types';\nimport { renderFileChildren } from './utils/renderFileChildren';\nimport { templateRender } from './utils/templateRender';\nimport { useFileInstance } from './utils/useFileInstance';\n\nexport type { FileOptions };\n\nexport function File<LAnnotation = undefined>({\n file,\n lineAnnotations,\n selectedLines,\n options,\n metrics,\n className,\n style,\n renderAnnotation,\n renderHeaderPrefix,\n renderHeaderMetadata,\n prerenderedHTML,\n renderGutterUtility,\n renderHoverUtility,\n}: FileProps<LAnnotation>): React.JSX.Element {\n const { ref, getHoveredLine } = useFileInstance({\n file,\n options,\n metrics,\n lineAnnotations,\n selectedLines,\n prerenderedHTML,\n hasGutterRenderUtility:\n renderGutterUtility != null || renderHoverUtility != null,\n });\n const children = renderFileChildren({\n file,\n renderAnnotation,\n renderHeaderPrefix,\n renderHeaderMetadata,\n renderGutterUtility,\n renderHoverUtility,\n lineAnnotations,\n getHoveredLine,\n });\n return (\n <DIFFS_TAG_NAME ref={ref} className={className} style={style}>\n {templateRender(children, prerenderedHTML)}\n </DIFFS_TAG_NAME>\n );\n}\n"],"mappings":";;;;;;;;;;AAWA,SAAgB,KAA8B,EAC5C,MACA,iBACA,eACA,SACA,SACA,WACA,OACA,kBACA,oBACA,sBACA,iBACA,qBACA,sBAC4C;CAC5C,MAAM,EAAE,KAAK,mBAAmB,gBAAgB;EAC9C;EACA;EACA;EACA;EACA;EACA;EACA,wBACE,uBAAuB,QAAQ,sBAAsB;EACxD,CAAC;AAWF,QACE,oBAAC;EAAoB;EAAgB;EAAkB;YACpD,eAZY,mBAAmB;GAClC;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACD,CAAC,EAG4B,gBAAgB;GAC3B"}
|
package/dist/react/FileDiff.d.ts
CHANGED
|
@@ -15,7 +15,9 @@ declare function FileDiff<LAnnotation = undefined>({
|
|
|
15
15
|
style,
|
|
16
16
|
prerenderedHTML,
|
|
17
17
|
renderAnnotation,
|
|
18
|
+
renderHeaderPrefix,
|
|
18
19
|
renderHeaderMetadata,
|
|
20
|
+
renderGutterUtility,
|
|
19
21
|
renderHoverUtility
|
|
20
22
|
}: FileDiffProps<LAnnotation>): React.JSX.Element;
|
|
21
23
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileDiff.d.ts","names":["FileDiffMetadata","DiffBasePropsReact","FileDiffProps","LAnnotation","FileDiff","fileDiff","options","metrics","lineAnnotations","selectedLines","className","style","prerenderedHTML","renderAnnotation","renderHeaderMetadata","renderHoverUtility","React","JSX","Element"],"sources":["../../src/react/FileDiff.d.ts"],"sourcesContent":["import type { FileDiffMetadata } from '../types';\nimport type { DiffBasePropsReact } from './types';\nexport type { FileDiffMetadata };\nexport interface FileDiffProps<LAnnotation> extends DiffBasePropsReact<LAnnotation> {\n fileDiff: FileDiffMetadata;\n}\nexport declare function FileDiff<LAnnotation = undefined>({ fileDiff, options, metrics, lineAnnotations, selectedLines, className, style, prerenderedHTML, renderAnnotation, renderHeaderMetadata, renderHoverUtility }: FileDiffProps<LAnnotation>): React.JSX.Element;\n//# sourceMappingURL=FileDiff.d.ts.map"],"mappings":";;;;UAGiBE,mCAAmCD,mBAAmBE;EAAtDD,QAAAA,EACHF,gBADgBG;;AAChBH,iBAEUI,QAFVJ,CAAAA,cAAAA,SAAAA,CAAAA,CAAAA;EAAAA,QAAAA;EAAAA,OAAAA;EAAAA,OAAAA;EAAAA,eAAAA;EAAAA,aAAAA;EAAAA,SAAAA;EAAAA,KAAAA;EAAAA,eAAAA;EAAAA,gBAAAA;EAAAA,oBAAAA;EAAAA;AAAAA,CAAAA,
|
|
1
|
+
{"version":3,"file":"FileDiff.d.ts","names":["FileDiffMetadata","DiffBasePropsReact","FileDiffProps","LAnnotation","FileDiff","fileDiff","options","metrics","lineAnnotations","selectedLines","className","style","prerenderedHTML","renderAnnotation","renderHeaderPrefix","renderHeaderMetadata","renderGutterUtility","renderHoverUtility","React","JSX","Element"],"sources":["../../src/react/FileDiff.d.ts"],"sourcesContent":["import type { FileDiffMetadata } from '../types';\nimport type { DiffBasePropsReact } from './types';\nexport type { FileDiffMetadata };\nexport interface FileDiffProps<LAnnotation> extends DiffBasePropsReact<LAnnotation> {\n fileDiff: FileDiffMetadata;\n}\nexport declare function FileDiff<LAnnotation = undefined>({ fileDiff, options, metrics, lineAnnotations, selectedLines, className, style, prerenderedHTML, renderAnnotation, renderHeaderPrefix, renderHeaderMetadata, renderGutterUtility, renderHoverUtility }: FileDiffProps<LAnnotation>): React.JSX.Element;\n//# sourceMappingURL=FileDiff.d.ts.map"],"mappings":";;;;UAGiBE,mCAAmCD,mBAAmBE;EAAtDD,QAAAA,EACHF,gBADgBG;;AAChBH,iBAEUI,QAFVJ,CAAAA,cAAAA,SAAAA,CAAAA,CAAAA;EAAAA,QAAAA;EAAAA,OAAAA;EAAAA,OAAAA;EAAAA,eAAAA;EAAAA,aAAAA;EAAAA,SAAAA;EAAAA,KAAAA;EAAAA,eAAAA;EAAAA,gBAAAA;EAAAA,kBAAAA;EAAAA,oBAAAA;EAAAA,mBAAAA;EAAAA;AAAAA,CAAAA,EAEoPE,aAFpPF,CAEkQG,WAFlQH,CAAAA,CAAAA,EAEiRkB,KAAAA,CAAMC,GAAAA,CAAIC,OAF3RpB"}
|
package/dist/react/FileDiff.js
CHANGED
|
@@ -8,14 +8,15 @@ import { useFileDiffInstance } from "./utils/useFileDiffInstance.js";
|
|
|
8
8
|
import { jsx } from "react/jsx-runtime";
|
|
9
9
|
|
|
10
10
|
//#region src/react/FileDiff.tsx
|
|
11
|
-
function FileDiff({ fileDiff, options, metrics, lineAnnotations, selectedLines, className, style, prerenderedHTML, renderAnnotation, renderHeaderMetadata, renderHoverUtility }) {
|
|
11
|
+
function FileDiff({ fileDiff, options, metrics, lineAnnotations, selectedLines, className, style, prerenderedHTML, renderAnnotation, renderHeaderPrefix, renderHeaderMetadata, renderGutterUtility, renderHoverUtility }) {
|
|
12
12
|
const { ref, getHoveredLine } = useFileDiffInstance({
|
|
13
13
|
fileDiff,
|
|
14
14
|
options,
|
|
15
15
|
metrics,
|
|
16
16
|
lineAnnotations,
|
|
17
17
|
selectedLines,
|
|
18
|
-
prerenderedHTML
|
|
18
|
+
prerenderedHTML,
|
|
19
|
+
hasGutterRenderUtility: renderGutterUtility != null || renderHoverUtility != null
|
|
19
20
|
});
|
|
20
21
|
return /* @__PURE__ */ jsx(DIFFS_TAG_NAME, {
|
|
21
22
|
ref,
|
|
@@ -23,8 +24,10 @@ function FileDiff({ fileDiff, options, metrics, lineAnnotations, selectedLines,
|
|
|
23
24
|
style,
|
|
24
25
|
children: templateRender(renderDiffChildren({
|
|
25
26
|
fileDiff,
|
|
27
|
+
renderHeaderPrefix,
|
|
26
28
|
renderHeaderMetadata,
|
|
27
29
|
renderAnnotation,
|
|
30
|
+
renderGutterUtility,
|
|
28
31
|
lineAnnotations,
|
|
29
32
|
renderHoverUtility,
|
|
30
33
|
getHoveredLine
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileDiff.js","names":[],"sources":["../../src/react/FileDiff.tsx"],"sourcesContent":["'use client';\n\nimport { DIFFS_TAG_NAME } from '../constants';\nimport type { FileDiffMetadata } from '../types';\nimport type { DiffBasePropsReact } from './types';\nimport { renderDiffChildren } from './utils/renderDiffChildren';\nimport { templateRender } from './utils/templateRender';\nimport { useFileDiffInstance } from './utils/useFileDiffInstance';\n\nexport type { FileDiffMetadata };\n\nexport interface FileDiffProps<\n LAnnotation,\n> extends DiffBasePropsReact<LAnnotation> {\n fileDiff: FileDiffMetadata;\n}\n\nexport function FileDiff<LAnnotation = undefined>({\n fileDiff,\n options,\n metrics,\n lineAnnotations,\n selectedLines,\n className,\n style,\n prerenderedHTML,\n renderAnnotation,\n renderHeaderMetadata,\n renderHoverUtility,\n}: FileDiffProps<LAnnotation>): React.JSX.Element {\n const { ref, getHoveredLine } = useFileDiffInstance({\n fileDiff,\n options,\n metrics,\n lineAnnotations,\n selectedLines,\n prerenderedHTML,\n });\n const children = renderDiffChildren({\n fileDiff,\n renderHeaderMetadata,\n renderAnnotation,\n lineAnnotations,\n renderHoverUtility,\n getHoveredLine,\n });\n return (\n <DIFFS_TAG_NAME ref={ref} className={className} style={style}>\n {templateRender(children, prerenderedHTML)}\n </DIFFS_TAG_NAME>\n );\n}\n"],"mappings":";;;;;;;;;;AAiBA,SAAgB,SAAkC,EAChD,UACA,SACA,SACA,iBACA,eACA,WACA,OACA,iBACA,kBACA,sBACA,sBACgD;CAChD,MAAM,EAAE,KAAK,mBAAmB,oBAAoB;EAClD;EACA;EACA;EACA;EACA;EACA;
|
|
1
|
+
{"version":3,"file":"FileDiff.js","names":[],"sources":["../../src/react/FileDiff.tsx"],"sourcesContent":["'use client';\n\nimport { DIFFS_TAG_NAME } from '../constants';\nimport type { FileDiffMetadata } from '../types';\nimport type { DiffBasePropsReact } from './types';\nimport { renderDiffChildren } from './utils/renderDiffChildren';\nimport { templateRender } from './utils/templateRender';\nimport { useFileDiffInstance } from './utils/useFileDiffInstance';\n\nexport type { FileDiffMetadata };\n\nexport interface FileDiffProps<\n LAnnotation,\n> extends DiffBasePropsReact<LAnnotation> {\n fileDiff: FileDiffMetadata;\n}\n\nexport function FileDiff<LAnnotation = undefined>({\n fileDiff,\n options,\n metrics,\n lineAnnotations,\n selectedLines,\n className,\n style,\n prerenderedHTML,\n renderAnnotation,\n renderHeaderPrefix,\n renderHeaderMetadata,\n renderGutterUtility,\n renderHoverUtility,\n}: FileDiffProps<LAnnotation>): React.JSX.Element {\n const { ref, getHoveredLine } = useFileDiffInstance({\n fileDiff,\n options,\n metrics,\n lineAnnotations,\n selectedLines,\n prerenderedHTML,\n hasGutterRenderUtility:\n renderGutterUtility != null || renderHoverUtility != null,\n });\n const children = renderDiffChildren({\n fileDiff,\n renderHeaderPrefix,\n renderHeaderMetadata,\n renderAnnotation,\n renderGutterUtility,\n lineAnnotations,\n renderHoverUtility,\n getHoveredLine,\n });\n return (\n <DIFFS_TAG_NAME ref={ref} className={className} style={style}>\n {templateRender(children, prerenderedHTML)}\n </DIFFS_TAG_NAME>\n );\n}\n"],"mappings":";;;;;;;;;;AAiBA,SAAgB,SAAkC,EAChD,UACA,SACA,SACA,iBACA,eACA,WACA,OACA,iBACA,kBACA,oBACA,sBACA,qBACA,sBACgD;CAChD,MAAM,EAAE,KAAK,mBAAmB,oBAAoB;EAClD;EACA;EACA;EACA;EACA;EACA;EACA,wBACE,uBAAuB,QAAQ,sBAAsB;EACxD,CAAC;AAWF,QACE,oBAAC;EAAoB;EAAgB;EAAkB;YACpD,eAZY,mBAAmB;GAClC;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACD,CAAC,EAG4B,gBAAgB;GAC3B"}
|
|
@@ -17,7 +17,9 @@ declare function MultiFileDiff<LAnnotation = undefined>({
|
|
|
17
17
|
style,
|
|
18
18
|
prerenderedHTML,
|
|
19
19
|
renderAnnotation,
|
|
20
|
+
renderHeaderPrefix,
|
|
20
21
|
renderHeaderMetadata,
|
|
22
|
+
renderGutterUtility,
|
|
21
23
|
renderHoverUtility
|
|
22
24
|
}: MultiFileDiffProps<LAnnotation>): React.JSX.Element;
|
|
23
25
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MultiFileDiff.d.ts","names":["FileContents","DiffBasePropsReact","MultiFileDiffProps","LAnnotation","MultiFileDiff","oldFile","newFile","options","metrics","lineAnnotations","selectedLines","className","style","prerenderedHTML","renderAnnotation","renderHeaderMetadata","renderHoverUtility","React","JSX","Element"],"sources":["../../src/react/MultiFileDiff.d.ts"],"sourcesContent":["import type { FileContents } from '../types';\nimport type { DiffBasePropsReact } from './types';\nexport type { FileContents };\nexport interface MultiFileDiffProps<LAnnotation> extends DiffBasePropsReact<LAnnotation> {\n oldFile: FileContents;\n newFile: FileContents;\n}\nexport declare function MultiFileDiff<LAnnotation = undefined>({ oldFile, newFile, options, metrics, lineAnnotations, selectedLines, className, style, prerenderedHTML, renderAnnotation, renderHeaderMetadata, renderHoverUtility }: MultiFileDiffProps<LAnnotation>): React.JSX.Element;\n//# sourceMappingURL=MultiFileDiff.d.ts.map"],"mappings":";;;;UAGiBE,wCAAwCD,mBAAmBE;EAA3DD,OAAAA,EACJF,YADsB;EAAyCG,OAAAA,EAE/DH,YAF+DG;;AAE/DH,iBAEWI,aAFXJ,CAAAA,cAAAA,SAAAA,CAAAA,CAAAA;EAAAA,OAAAA;EAAAA,OAAAA;EAAAA,OAAAA;EAAAA,OAAAA;EAAAA,eAAAA;EAAAA,aAAAA;EAAAA,SAAAA;EAAAA,KAAAA;EAAAA,eAAAA;EAAAA,gBAAAA;EAAAA,oBAAAA;EAAAA;AAAAA,CAAAA,
|
|
1
|
+
{"version":3,"file":"MultiFileDiff.d.ts","names":["FileContents","DiffBasePropsReact","MultiFileDiffProps","LAnnotation","MultiFileDiff","oldFile","newFile","options","metrics","lineAnnotations","selectedLines","className","style","prerenderedHTML","renderAnnotation","renderHeaderPrefix","renderHeaderMetadata","renderGutterUtility","renderHoverUtility","React","JSX","Element"],"sources":["../../src/react/MultiFileDiff.d.ts"],"sourcesContent":["import type { FileContents } from '../types';\nimport type { DiffBasePropsReact } from './types';\nexport type { FileContents };\nexport interface MultiFileDiffProps<LAnnotation> extends DiffBasePropsReact<LAnnotation> {\n oldFile: FileContents;\n newFile: FileContents;\n}\nexport declare function MultiFileDiff<LAnnotation = undefined>({ oldFile, newFile, options, metrics, lineAnnotations, selectedLines, className, style, prerenderedHTML, renderAnnotation, renderHeaderPrefix, renderHeaderMetadata, renderGutterUtility, renderHoverUtility }: MultiFileDiffProps<LAnnotation>): React.JSX.Element;\n//# sourceMappingURL=MultiFileDiff.d.ts.map"],"mappings":";;;;UAGiBE,wCAAwCD,mBAAmBE;EAA3DD,OAAAA,EACJF,YADsB;EAAyCG,OAAAA,EAE/DH,YAF+DG;;AAE/DH,iBAEWI,aAFXJ,CAAAA,cAAAA,SAAAA,CAAAA,CAAAA;EAAAA,OAAAA;EAAAA,OAAAA;EAAAA,OAAAA;EAAAA,OAAAA;EAAAA,eAAAA;EAAAA,aAAAA;EAAAA,SAAAA;EAAAA,KAAAA;EAAAA,eAAAA;EAAAA,gBAAAA;EAAAA,kBAAAA;EAAAA,oBAAAA;EAAAA,mBAAAA;EAAAA;AAAAA,CAAAA,EAEkQE,kBAFlQF,CAEqRG,WAFrRH,CAAAA,CAAAA,EAEoSmB,KAAAA,CAAMC,GAAAA,CAAIC,OAF9SrB"}
|
|
@@ -8,7 +8,7 @@ import { useFileDiffInstance } from "./utils/useFileDiffInstance.js";
|
|
|
8
8
|
import { jsx } from "react/jsx-runtime";
|
|
9
9
|
|
|
10
10
|
//#region src/react/MultiFileDiff.tsx
|
|
11
|
-
function MultiFileDiff({ oldFile, newFile, options, metrics, lineAnnotations, selectedLines, className, style, prerenderedHTML, renderAnnotation, renderHeaderMetadata, renderHoverUtility }) {
|
|
11
|
+
function MultiFileDiff({ oldFile, newFile, options, metrics, lineAnnotations, selectedLines, className, style, prerenderedHTML, renderAnnotation, renderHeaderPrefix, renderHeaderMetadata, renderGutterUtility, renderHoverUtility }) {
|
|
12
12
|
const { ref, getHoveredLine } = useFileDiffInstance({
|
|
13
13
|
oldFile,
|
|
14
14
|
newFile,
|
|
@@ -16,7 +16,8 @@ function MultiFileDiff({ oldFile, newFile, options, metrics, lineAnnotations, se
|
|
|
16
16
|
metrics,
|
|
17
17
|
lineAnnotations,
|
|
18
18
|
selectedLines,
|
|
19
|
-
prerenderedHTML
|
|
19
|
+
prerenderedHTML,
|
|
20
|
+
hasGutterRenderUtility: renderGutterUtility != null || renderHoverUtility != null
|
|
20
21
|
});
|
|
21
22
|
return /* @__PURE__ */ jsx(DIFFS_TAG_NAME, {
|
|
22
23
|
ref,
|
|
@@ -25,9 +26,11 @@ function MultiFileDiff({ oldFile, newFile, options, metrics, lineAnnotations, se
|
|
|
25
26
|
children: templateRender(renderDiffChildren({
|
|
26
27
|
deletionFile: oldFile,
|
|
27
28
|
additionFile: newFile,
|
|
29
|
+
renderHeaderPrefix,
|
|
28
30
|
renderHeaderMetadata,
|
|
29
31
|
renderAnnotation,
|
|
30
32
|
lineAnnotations,
|
|
33
|
+
renderGutterUtility,
|
|
31
34
|
renderHoverUtility,
|
|
32
35
|
getHoveredLine
|
|
33
36
|
}), prerenderedHTML)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MultiFileDiff.js","names":[],"sources":["../../src/react/MultiFileDiff.tsx"],"sourcesContent":["'use client';\n\nimport { DIFFS_TAG_NAME } from '../constants';\nimport type { FileContents } from '../types';\nimport type { DiffBasePropsReact } from './types';\nimport { renderDiffChildren } from './utils/renderDiffChildren';\nimport { templateRender } from './utils/templateRender';\nimport { useFileDiffInstance } from './utils/useFileDiffInstance';\n\nexport type { FileContents };\n\nexport interface MultiFileDiffProps<\n LAnnotation,\n> extends DiffBasePropsReact<LAnnotation> {\n oldFile: FileContents;\n newFile: FileContents;\n}\n\nexport function MultiFileDiff<LAnnotation = undefined>({\n oldFile,\n newFile,\n options,\n metrics,\n lineAnnotations,\n selectedLines,\n className,\n style,\n prerenderedHTML,\n renderAnnotation,\n renderHeaderMetadata,\n renderHoverUtility,\n}: MultiFileDiffProps<LAnnotation>): React.JSX.Element {\n const { ref, getHoveredLine } = useFileDiffInstance({\n oldFile,\n newFile,\n options,\n metrics,\n lineAnnotations,\n selectedLines,\n prerenderedHTML,\n });\n const children = renderDiffChildren({\n deletionFile: oldFile,\n additionFile: newFile,\n renderHeaderMetadata,\n renderAnnotation,\n lineAnnotations,\n renderHoverUtility,\n getHoveredLine,\n });\n return (\n <DIFFS_TAG_NAME ref={ref} className={className} style={style}>\n {templateRender(children, prerenderedHTML)}\n </DIFFS_TAG_NAME>\n );\n}\n"],"mappings":";;;;;;;;;;AAkBA,SAAgB,cAAuC,EACrD,SACA,SACA,SACA,SACA,iBACA,eACA,WACA,OACA,iBACA,kBACA,sBACA,sBACqD;CACrD,MAAM,EAAE,KAAK,mBAAmB,oBAAoB;EAClD;EACA;EACA;EACA;EACA;EACA;EACA;
|
|
1
|
+
{"version":3,"file":"MultiFileDiff.js","names":[],"sources":["../../src/react/MultiFileDiff.tsx"],"sourcesContent":["'use client';\n\nimport { DIFFS_TAG_NAME } from '../constants';\nimport type { FileContents } from '../types';\nimport type { DiffBasePropsReact } from './types';\nimport { renderDiffChildren } from './utils/renderDiffChildren';\nimport { templateRender } from './utils/templateRender';\nimport { useFileDiffInstance } from './utils/useFileDiffInstance';\n\nexport type { FileContents };\n\nexport interface MultiFileDiffProps<\n LAnnotation,\n> extends DiffBasePropsReact<LAnnotation> {\n oldFile: FileContents;\n newFile: FileContents;\n}\n\nexport function MultiFileDiff<LAnnotation = undefined>({\n oldFile,\n newFile,\n options,\n metrics,\n lineAnnotations,\n selectedLines,\n className,\n style,\n prerenderedHTML,\n renderAnnotation,\n renderHeaderPrefix,\n renderHeaderMetadata,\n renderGutterUtility,\n renderHoverUtility,\n}: MultiFileDiffProps<LAnnotation>): React.JSX.Element {\n const { ref, getHoveredLine } = useFileDiffInstance({\n oldFile,\n newFile,\n options,\n metrics,\n lineAnnotations,\n selectedLines,\n prerenderedHTML,\n hasGutterRenderUtility:\n renderGutterUtility != null || renderHoverUtility != null,\n });\n const children = renderDiffChildren({\n deletionFile: oldFile,\n additionFile: newFile,\n renderHeaderPrefix,\n renderHeaderMetadata,\n renderAnnotation,\n lineAnnotations,\n renderGutterUtility,\n renderHoverUtility,\n getHoveredLine,\n });\n return (\n <DIFFS_TAG_NAME ref={ref} className={className} style={style}>\n {templateRender(children, prerenderedHTML)}\n </DIFFS_TAG_NAME>\n );\n}\n"],"mappings":";;;;;;;;;;AAkBA,SAAgB,cAAuC,EACrD,SACA,SACA,SACA,SACA,iBACA,eACA,WACA,OACA,iBACA,kBACA,oBACA,sBACA,qBACA,sBACqD;CACrD,MAAM,EAAE,KAAK,mBAAmB,oBAAoB;EAClD;EACA;EACA;EACA;EACA;EACA;EACA;EACA,wBACE,uBAAuB,QAAQ,sBAAsB;EACxD,CAAC;AAYF,QACE,oBAAC;EAAoB;EAAgB;EAAkB;YACpD,eAbY,mBAAmB;GAClC,cAAc;GACd,cAAc;GACd;GACA;GACA;GACA;GACA;GACA;GACA;GACD,CAAC,EAG4B,gBAAgB;GAC3B"}
|
|
@@ -14,7 +14,9 @@ declare function PatchDiff<LAnnotation = undefined>({
|
|
|
14
14
|
style,
|
|
15
15
|
prerenderedHTML,
|
|
16
16
|
renderAnnotation,
|
|
17
|
+
renderHeaderPrefix,
|
|
17
18
|
renderHeaderMetadata,
|
|
19
|
+
renderGutterUtility,
|
|
18
20
|
renderHoverUtility
|
|
19
21
|
}: PatchDiffProps<LAnnotation>): React.JSX.Element;
|
|
20
22
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PatchDiff.d.ts","names":["DiffBasePropsReact","PatchDiffProps","LAnnotation","PatchDiff","patch","options","metrics","lineAnnotations","selectedLines","className","style","prerenderedHTML","renderAnnotation","renderHeaderMetadata","renderHoverUtility","React","JSX","Element"],"sources":["../../src/react/PatchDiff.d.ts"],"sourcesContent":["import type { DiffBasePropsReact } from './types';\nexport interface PatchDiffProps<LAnnotation> extends DiffBasePropsReact<LAnnotation> {\n patch: string;\n}\nexport declare function PatchDiff<LAnnotation = undefined>({ patch, options, metrics, lineAnnotations, selectedLines, className, style, prerenderedHTML, renderAnnotation, renderHeaderMetadata, renderHoverUtility }: PatchDiffProps<LAnnotation>): React.JSX.Element;\n//# sourceMappingURL=PatchDiff.d.ts.map"],"mappings":";;;UACiBC,oCAAoCD,mBAAmBE;;AAAxE;AAGwBC,iBAAAA,SAASD,CAAAA,cAAA,SAAA,CAAA,CAAA;EAAA,KAAA;EAAA,OAAA;EAAA,OAAA;EAAA,eAAA;EAAA,aAAA;EAAA,SAAA;EAAA,KAAA;EAAA,eAAA;EAAA,gBAAA;EAAA,oBAAA;EAAA;AAAA,CAAA,
|
|
1
|
+
{"version":3,"file":"PatchDiff.d.ts","names":["DiffBasePropsReact","PatchDiffProps","LAnnotation","PatchDiff","patch","options","metrics","lineAnnotations","selectedLines","className","style","prerenderedHTML","renderAnnotation","renderHeaderPrefix","renderHeaderMetadata","renderGutterUtility","renderHoverUtility","React","JSX","Element"],"sources":["../../src/react/PatchDiff.d.ts"],"sourcesContent":["import type { DiffBasePropsReact } from './types';\nexport interface PatchDiffProps<LAnnotation> extends DiffBasePropsReact<LAnnotation> {\n patch: string;\n}\nexport declare function PatchDiff<LAnnotation = undefined>({ patch, options, metrics, lineAnnotations, selectedLines, className, style, prerenderedHTML, renderAnnotation, renderHeaderPrefix, renderHeaderMetadata, renderGutterUtility, renderHoverUtility }: PatchDiffProps<LAnnotation>): React.JSX.Element;\n//# sourceMappingURL=PatchDiff.d.ts.map"],"mappings":";;;UACiBC,oCAAoCD,mBAAmBE;;AAAxE;AAGwBC,iBAAAA,SAASD,CAAAA,cAAA,SAAA,CAAA,CAAA;EAAA,KAAA;EAAA,OAAA;EAAA,OAAA;EAAA,eAAA;EAAA,aAAA;EAAA,SAAA;EAAA,KAAA;EAAA,eAAA;EAAA,gBAAA;EAAA,kBAAA;EAAA,oBAAA;EAAA,mBAAA;EAAA;AAAA,CAAA,EAA+ND,cAA/N,CAA8OC,WAA9O,CAAA,CAAA,EAA6Pe,KAAAA,CAAMC,GAAAA,CAAIC,OAAvQ"}
|