+
{placeholder}
)
diff --git a/apps/web/src/components/chat/ChatHeader.tsx b/apps/web/src/components/chat/ChatHeader.tsx
index 3f2c480c546..5d7c9292474 100644
--- a/apps/web/src/components/chat/ChatHeader.tsx
+++ b/apps/web/src/components/chat/ChatHeader.tsx
@@ -16,6 +16,7 @@ import ProjectScriptsControl, { type NewProjectScriptInput } from "../ProjectScr
import { Toggle } from "../ui/toggle";
import { SidebarTrigger } from "../ui/sidebar";
import { OpenInPicker } from "./OpenInPicker";
+import { usePrimaryEnvironmentId } from "../../environments/primary";
interface ChatHeaderProps {
activeThreadEnvironmentId: EnvironmentId;
@@ -68,6 +69,10 @@ export const ChatHeader = memo(function ChatHeader({
onToggleTerminal,
onToggleDiff,
}: ChatHeaderProps) {
+ const primaryEnvironmentId = usePrimaryEnvironmentId();
+ const isRemoteEnvironment =
+ primaryEnvironmentId !== null && activeThreadEnvironmentId !== primaryEnvironmentId;
+
return (
@@ -101,7 +106,7 @@ export const ChatHeader = memo(function ChatHeader({
onDeleteScript={onDeleteProjectScript}
/>
)}
- {activeProjectName && (
+ {activeProjectName && !isRemoteEnvironment && (
Sidebar
Displays the mobile sidebar.
- {children}
+
+ {children}
+
diff --git a/apps/web/src/index.css b/apps/web/src/index.css
index 5c568ad5d67..edf71b675bb 100644
--- a/apps/web/src/index.css
+++ b/apps/web/src/index.css
@@ -58,6 +58,22 @@
}
}
+/* Safe-area inset utilities for surfaces that opt into edge-to-edge rendering.
+ Insets resolve to 0 when the browser already constrains the layout viewport
+ to the safe area. */
+@utility pt-safe {
+ padding-top: max(env(safe-area-inset-top), 0px);
+}
+@utility pb-safe {
+ padding-bottom: max(env(safe-area-inset-bottom), 0px);
+}
+@utility pl-safe {
+ padding-left: max(env(safe-area-inset-left), 0px);
+}
+@utility pr-safe {
+ padding-right: max(env(safe-area-inset-right), 0px);
+}
+
/* Suppress all transitions during theme changes */
.no-transitions,
.no-transitions *,
@@ -138,19 +154,28 @@ body {
sans-serif;
margin: 0;
padding: 0;
- min-height: 100vh;
}
html,
-body,
+body {
+ min-height: calc(100svh + env(safe-area-inset-top));
+ overscroll-behavior: none;
+}
+
+body {
+ height: 100%;
+ overflow: hidden;
+}
+
#root {
height: 100%;
width: 100%;
max-width: 100%;
- overflow-y: hidden;
overflow-x: hidden;
overflow-x: clip;
+ overflow-y: hidden;
overscroll-behavior-y: none;
+ padding-top: max(env(safe-area-inset-top), 0px);
}
body::after {
diff --git a/apps/web/src/routes/_chat.$environmentId.$threadId.tsx b/apps/web/src/routes/_chat.$environmentId.$threadId.tsx
index ff20673e2de..0309d43d7e3 100644
--- a/apps/web/src/routes/_chat.$environmentId.$threadId.tsx
+++ b/apps/web/src/routes/_chat.$environmentId.$threadId.tsx
@@ -238,7 +238,7 @@ function ChatThreadRouteView() {
if (!shouldUseDiffSheet) {
return (
<>
-
+
-
+
+
+