mobile-keyboard.js (2.1 KB)


 1 let initialViewportHeight = window.visualViewport ? window.visualViewport.height : window.innerHeight;
 2 
 3 // Mobile keyboard detection
 4 export function isMobileDevice() {
 5 	return window.matchMedia("(pointer: coarse), (pointer: none)").matches;
 6 }
 7 
 8 export function exitMobileKeyboardMode(editorView, updatePreviewCallback) {
 9 	const editorPane = document.querySelector('.editor-pane');
10 	if (!document.body.classList.contains('mobile-keyboard-open')) return;
11 
12 	editorPane.style.opacity = '0';
13 	document.body.classList.remove('mobile-keyboard-open');
14 
15 	requestAnimationFrame(() => requestAnimationFrame(() => {
16 		if (editorView) {
17 			const pos = editorView.state.selection.main.head;
18 			const lineBlock = editorView.lineBlockAt(pos);
19 			const targetScroll = lineBlock.top - (editorView.dom.clientHeight / 2);
20 			editorView.scrollDOM.scrollTop = Math.max(0, targetScroll);
21 		}
22 		editorPane.style.opacity = '';
23 		updatePreviewCallback();
24 	}));
25 }
26 
27 function updateViewportVariables() {
28 	const vv = window.visualViewport;
29 	if (vv) {
30 		document.documentElement.style.setProperty('--visual-viewport-height', `${vv.height}px`);
31 		document.documentElement.style.setProperty('--visual-viewport-offset-top', `${vv.offsetTop}px`);
32 	}
33 }
34 
35 function handleViewportChange(isEditorFocused, exitCallback) {
36 	if (!isMobileDevice()) return;
37 
38 	const currentHeight = window.visualViewport ? window.visualViewport.height : window.innerHeight;
39 	const heightDifference = initialViewportHeight - currentHeight;
40 	const isKeyboardOpen = heightDifference > 150;
41 
42 	updateViewportVariables();
43 
44 	if (isKeyboardOpen && isEditorFocused) {
45 		document.body.classList.add('mobile-keyboard-open');
46 	} else if (!isKeyboardOpen) {
47 		exitCallback();
48 	}
49 }
50 
51 export function initializeMobileKeyboard(getIsEditorFocused, exitCallback) {
52 	const handleChange = () => handleViewportChange(getIsEditorFocused(), exitCallback);
53 
54 	if (window.visualViewport) {
55 		window.visualViewport.addEventListener('resize', handleChange);
56 		window.visualViewport.addEventListener('scroll', updateViewportVariables);
57 	} else {
58 		window.addEventListener('resize', handleChange);
59 	}
60 }