| 1 | interface LineGeometry { |
| 2 | readonly top: number; |
| 3 | readonly height: number; |
| 4 | } |
| 5 | |
| 6 | interface 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 | |
| 16 | export 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 | } |