type WindowsViewportScaleInput = { windowWidth: number; innerWidth: number; devicePixelRatio: number; visualViewportScale?: number | null; }; export const computeWindowsViewportScaleRatio = ({ windowWidth, innerWidth, devicePixelRatio, }: WindowsViewportScaleInput): number => { const normalizedWindowWidth = Number(windowWidth); const normalizedInnerWidth = Number(innerWidth); const normalizedDevicePixelRatio = Number(devicePixelRatio); if ( !Number.isFinite(normalizedWindowWidth) || normalizedWindowWidth <= 0 || !Number.isFinite(normalizedInnerWidth) || normalizedInnerWidth <= 0 || !Number.isFinite(normalizedDevicePixelRatio) || normalizedDevicePixelRatio <= 0 ) { return 1; } return (normalizedWindowWidth / normalizedDevicePixelRatio) / normalizedInnerWidth; }; export const hasWindowsViewportScaleDrift = ( metrics: WindowsViewportScaleInput, tolerance = 0.08, ): boolean => { const normalizedTolerance = Math.max(0.01, Number(tolerance) || 0.08); const visualViewportScale = Number(metrics.visualViewportScale); if (Number.isFinite(visualViewportScale) && Math.abs(visualViewportScale - 1) > normalizedTolerance) { return true; } const viewportScaleRatio = computeWindowsViewportScaleRatio(metrics); return Math.abs(viewportScaleRatio - 1) > normalizedTolerance; }; export const getWindowsScaleFixNudgedWidth = (width: number): number => { const normalizedWidth = Math.trunc(Number(width) || 0); if (normalizedWidth <= 0) { return 0; } return normalizedWidth > 480 ? normalizedWidth - 1 : normalizedWidth + 1; };