diff --git a/src/App.css b/src/App.css
index 4e75be2c2..b1a9e1ff2 100644
--- a/src/App.css
+++ b/src/App.css
@@ -16,13 +16,6 @@
       format("woff"); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */
 }
 
-/* Needed for the fallbacks below */
-@supports (height: -webkit-fill-available) {
-  :root {
-    --webkit-vhh: -webkit-fill-available;
-  }
-}
-
 :root {
   /* Seems to fix a Safari glitch: https://github.com/microbit-foundation/python-editor-v3/issues/369 */
   font-size: 16px;
@@ -34,9 +27,9 @@ body,
 .WorkbenchContainer,
 .Workbench {
   width: 100%;
-  /* --ios-vvh set by VisualViewPortCSSVariables on iOS only. */
-  height: var(--ios-vvh, var(--webkit-vvh, 100vh));
-}
-body {
-  overflow: hidden;
+  height: 100%;
+  /* 516px is the min height of the sidebar */
+  min-height: 516px;
+  /* 372px is the sidebar width + simulator width */
+  min-width: 372px;
 }
diff --git a/src/App.tsx b/src/App.tsx
index 1e2187d5a..71c5f9dcf 100644
--- a/src/App.tsx
+++ b/src/App.tsx
@@ -8,7 +8,6 @@ import { polyfill } from "mobile-drag-drop";
 import { useEffect } from "react";
 import "./App.css";
 import { DialogProvider } from "./common/use-dialogs";
-import VisualViewPortCSSVariables from "./common/VisualViewportCSSVariables";
 import { deployment, useDeployment } from "./deployment";
 import { MicrobitWebUSBConnection } from "./device/webusb";
 import { DeviceContextProvider } from "./device/device-hooks";
@@ -65,7 +64,6 @@ const App = () => {
   const { ConsentProvider } = deployment.compliance;
   return (
     <>
-      <VisualViewPortCSSVariables />
       <ChakraProvider theme={deployment.chakraTheme}>
         <LoggingProvider value={logging}>
           <SettingsProvider>
diff --git a/src/common/SplitView/SplitViewSized.tsx b/src/common/SplitView/SplitViewSized.tsx
index 83f8d9f24..44f79d67e 100644
--- a/src/common/SplitView/SplitViewSized.tsx
+++ b/src/common/SplitView/SplitViewSized.tsx
@@ -3,9 +3,9 @@
  *
  * SPDX-License-Identifier: MIT
  */
+import { Box } from "@chakra-ui/layout";
 import { createRef, useEffect } from "react";
 import { dimensionPropName, useSplitViewContext } from "./context";
-import { Box } from "@chakra-ui/layout";
 
 interface SizedPaneProps {
   children: JSX.Element;
@@ -38,6 +38,7 @@ const SplitViewSized = ({ children }: SizedPaneProps) => {
   return (
     <Box
       pointerEvents={dragging ? "none" : "unset"}
+      display={mode === "collapsed" ? "none" : undefined}
       visibility={mode === "collapsed" ? "hidden" : undefined}
       ref={ref}
     >
diff --git a/src/common/VisualViewportCSSVariables.tsx b/src/common/VisualViewportCSSVariables.tsx
deleted file mode 100644
index 88a3c3853..000000000
--- a/src/common/VisualViewportCSSVariables.tsx
+++ /dev/null
@@ -1,52 +0,0 @@
-/**
- * (c) 2021, Micro:bit Educational Foundation and contributors
- *
- * SPDX-License-Identifier: MIT
- */
-import { useEffect } from "react";
-
-const styleId = "vvp-style";
-
-const isIOS = (): boolean =>
-  /iPad|iPhone|iPod/.test(navigator.platform) ||
-  (navigator.platform === "MacIntel" && navigator.maxTouchPoints > 1);
-
-/**
- * Maintains CSS variables for the visual viewport width and height.
- * Use with fallbacks, e.g. var(--ios-vvh, 100vh)
- * https://developer.mozilla.org/en-US/docs/Web/API/Visual_Viewport_API
- *
- * This is important for iOS where we want to avoid the keyboard being
- * drawn over the toolbar at the bottom.
- *
- * We skip it on other platforms and rely on the fallback.
- */
-const VisualViewPortCSSVariables = () => {
-  useEffect(() => {
-    // If we remove the iOS check then we should look carefully at resize performance.
-    if (!window.visualViewport || !isIOS()) {
-      return;
-    }
-    const resizeHandler = () => {
-      const { width, height } = window.visualViewport ?? {};
-      let style = document.getElementById(styleId);
-      if (!style) {
-        style = document.head.appendChild(document.createElement("style"));
-        style.id = styleId;
-      }
-      style.innerText = `:root { --ios-vvw: ${width}px; --ios-vvh: ${height}px; }`;
-    };
-    window.visualViewport.addEventListener("resize", resizeHandler);
-    resizeHandler();
-    return () => {
-      window.visualViewport?.removeEventListener("resize", resizeHandler);
-      const style = document.getElementById(styleId);
-      if (style) {
-        style.remove();
-      }
-    };
-  }, []);
-  return null;
-};
-
-export default VisualViewPortCSSVariables;