interface LineGeometry { readonly top: number; readonly height: number; } interface CenteredFileLineScrollInput { readonly scrollTop: number; readonly scrollHeight: number; readonly viewportTop: number; readonly viewportHeight: number; readonly fileTop: number; readonly estimatedLine: LineGeometry; readonly renderedLine?: LineGeometry; } export function resolveCenteredFileLineScrollTop(input: CenteredFileLineScrollInput): number { const lineTop = input.renderedLine === undefined ? input.fileTop + input.estimatedLine.top : input.scrollTop + input.renderedLine.top - input.viewportTop; const lineHeight = input.renderedLine?.height ?? input.estimatedLine.height; const centeredTop = Math.max(0, lineTop - Math.max(0, (input.viewportHeight - lineHeight) / 2)); return Math.min(centeredTop, Math.max(0, input.scrollHeight - input.viewportHeight)); }