← Files Product DesignARCHIVED FILE
templates/mobile-app/src/mobile/MobileRuntime.tsx
1.31 KB · Sep 30, 2026 · 23:19 UTC
import { useEffect, type PropsWithChildren } from "react";
import { MobileDeviceProvider, useMobileDevice } from "./Device";
import { KeyboardDock, KeyboardProvider, useKeyboard } from "./Keyboard";
import { PhoneFrame } from "./PhoneFrame";
import { HomeIndicator, StatusBar } from "./components";
export function MobileRuntime({ children }: PropsWithChildren) {
return (
<MobileDeviceProvider>
<PhoneFrame>
<KeyboardProvider>
<KeyboardPreview />
<StatusBar />
<MobileAppViewport>{children}</MobileAppViewport>
<HomeIndicator />
<KeyboardDock />
</KeyboardProvider>
</PhoneFrame>
</MobileDeviceProvider>
);
}
function MobileAppViewport({ children }: PropsWithChildren) {
const { device } = useMobileDevice();
const keyboard = useKeyboard();
return (
<div
className="mobile-app-viewport"
data-keyboard-visible={keyboard.visible ? "true" : "false"}
data-platform={device.platform}
data-testid="mobile-app-viewport"
>
{children}
</div>
);
}
function KeyboardPreview() {
const keyboard = useKeyboard();
useEffect(() => {
const params = new URLSearchParams(window.location.search);
if (params.get("keyboard") === "1") {
keyboard.show();
}
}, [keyboard]);
return null;
}
SHA-256: 1ffe80a9582460005d66f10fc73deaff08b81431785a506887cc0d8320be747f