// Unit test for the mobile keyboard-lift logic (pure function, no DOM). // The composer must sit exactly on top of the keyboard. The amount to lift it is the gap between the // LAYOUT viewport (document.documentElement.clientHeight) and the VISIBLE viewport // (window.visualViewport.height + offsetTop). This is self-adapting across Capacitor keyboard resize // modes, and needs no per-device constant. // // Run: node test/keyboard-lift.test.js function bzKeyboardLift(clientHeight, vvHeight, vvTop) { return Math.max(0, Math.round(clientHeight - vvHeight - (vvTop || 0))); } // Cases use REAL numbers captured from the on-device debug readout (iPhone, dpr=3): const cases = [ // [name, clientHeight, vvHeight, vvTop, expectedLift] ['keyboard closed (all equal) ', 926, 926, 0, 0], ['resize:native open (WebView shrank; residual)', 581, 535, 0, 46], // <- the device values you sent ['resize:none open (WebView full; full lift) ', 926, 581, 0, 345], ['with a visual-viewport offset ', 926, 560, 20, 346], ['guard: never negative ', 500, 600, 0, 0], ]; let pass = 0, fail = 0; for (const [name, ch, vh, vt, expected] of cases) { const got = bzKeyboardLift(ch, vh, vt); const ok = got === expected; console.log(`${ok ? 'PASS' : 'FAIL'} ${name} lift=${got}${ok ? '' : ` (expected ${expected})`}`); ok ? pass++ : fail++; } console.log(`\n${pass} passed, ${fail} failed`); process.exit(fail ? 1 : 0);