diff --git a/packages/ui/src/apps/MobileApp.tsx b/packages/ui/src/apps/MobileApp.tsx
index aa686406..7a3a8ee9 100644
--- a/packages/ui/src/apps/MobileApp.tsx
+++ b/packages/ui/src/apps/MobileApp.tsx
@@ -99,7 +99,7 @@ const MobileOverflowMenu: React.FC<{
@@ -286,47 +286,57 @@ const MobileShell: React.FC = () => {
) : null}
- setFilesOpen(false)}
- ariaLabel={t('mobile.menu.files')}
- headerless
- >
-
- setFilesOpen(false)} />
-
-
+ {/* Mounted only while open (like the sessions sheet) so each surface
+ computes its safe-area / fixed-position layout fresh on open. Keeping
+ them always-mounted left a stale startup layout, which made the
+ top-inset dimming appear only intermittently on iOS. */}
+ {filesOpen ? (
+ setFilesOpen(false)}
+ ariaLabel={t('mobile.menu.files')}
+ headerless
+ >
+
+ setFilesOpen(false)} />
+
+
+ ) : null}
-
-
-
-
-
+ {changesOpen ? (
+
+
+
+
+
+ ) : null}
- setSettingsOpen(false)}
- ariaLabel={t('mobile.menu.settings')}
- headerless
- >
-
- setSettingsOpen(false)}
- />
-
-
+ {settingsOpen ? (
+ setSettingsOpen(false)}
+ ariaLabel={t('mobile.menu.settings')}
+ headerless
+ >
+
+ setSettingsOpen(false)}
+ />
+
+
+ ) : null}
);
diff --git a/packages/ui/src/apps/MobileSurfaceShell.tsx b/packages/ui/src/apps/MobileSurfaceShell.tsx
index 20da21b1..7f5d9d82 100644
--- a/packages/ui/src/apps/MobileSurfaceShell.tsx
+++ b/packages/ui/src/apps/MobileSurfaceShell.tsx
@@ -69,7 +69,7 @@ export const MobileSurfaceShell: React.FC = ({
return () => window.clearTimeout(id);
}
setEntered(false);
- const id = window.setTimeout(() => setMounted(false), 220);
+ const id = window.setTimeout(() => setMounted(false), 300);
return () => window.clearTimeout(id);
}, [open]);
@@ -180,31 +180,32 @@ export const MobileSurfaceShell: React.FC = ({
return createPortal(
-
+ {/* Sheet is a normal flex child — mirroring MobileOverlayPanel. */}
event.stopPropagation()}
style={{
+ // Sized to leave the top safe area uncovered so the scrim dims it.
+ height: 'calc(100% - var(--oc-safe-area-top, 0px))',
transform: visualTransform,
transition: isDraggingRef.current
? 'none'
- : 'transform 220ms cubic-bezier(0.32, 0.72, 0, 1)',
- paddingTop: 'var(--oc-safe-area-top, 0px)',
+ : 'transform 300ms cubic-bezier(0.32, 0.72, 0, 1)',
}}
>