1interface LineGeometry {
2 readonly top: number;
3 readonly height: number;
4}
5
6interface CenteredFileLineScrollInput {
7 readonly scrollTop: number;
8 readonly scrollHeight: number;
9 readonly viewportTop: number;
10 readonly viewportHeight: number;
11 readonly fileTop: number;
12 readonly estimatedLine: LineGeometry;
13 readonly renderedLine?: LineGeometry;
14}
15
16export function resolveCenteredFileLineScrollTop(input: CenteredFileLineScrollInput): number {
17 const lineTop =
18 input.renderedLine === undefined
19 ? input.fileTop + input.estimatedLine.top
20 : input.scrollTop + input.renderedLine.top - input.viewportTop;
21 const lineHeight = input.renderedLine?.height ?? input.estimatedLine.height;
22 const centeredTop = Math.max(0, lineTop - Math.max(0, (input.viewportHeight - lineHeight) / 2));
23 return Math.min(centeredTop, Math.max(0, input.scrollHeight - input.viewportHeight));
24}