+
+ {/* Which account you are in is otherwise only visible in Settings.
+ Last, so it sits on the far edge, mirrored under RTL by the flex row. */}
+
+
+ );
+}
+
+export interface PhoneAppHeaderProps extends PhoneHeaderActionsProps {
+ title: string;
+ /** Controls drawn before the title, such as a back or menu button. */
+ leading?: ReactNode;
+}
+
+/** A whole phone header for a screen that has none of its own: title, then the shared cluster. */
+export function PhoneAppHeader({ title, leading, ...actions }: PhoneAppHeaderProps) {
+ const isMobile = useIsMobile();
+ const isDesktop = useIsDesktop();
+ const shown = (actions.below ?? "lg") === "md" ? isMobile : !isDesktop;
+ if (!shown) return null;
+ return (
+
+ {!isEmbedded &&
}
{inlineApp &&
}
{content}
diff --git a/components/settings/settings-app.tsx b/components/settings/settings-app.tsx
index 9de63f354..acdb7a001 100644
--- a/components/settings/settings-app.tsx
+++ b/components/settings/settings-app.tsx
@@ -63,6 +63,7 @@ import { useSettingsStore } from '@/stores/settings-store';
import { useManagedAccountStore } from '@/stores/managed-account-store';
import { useIsDesktop } from '@/hooks/use-media-query';
import { NavigationRail } from '@/components/layout/navigation-rail';
+import { PhoneHeaderActions } from '@/components/layout/phone-header-actions';
import { SidebarAppsModal } from '@/components/layout/sidebar-apps-modal';
import { InlineAppView } from '@/components/layout/inline-app-view';
import { useSidebarApps } from '@/hooks/use-sidebar-apps';
@@ -844,6 +845,7 @@ export function SettingsApp({ linkSegments: routeSegments }: SettingsAppProps =
{activeTabLabel}
+
@@ -880,6 +882,7 @@ export function SettingsApp({ linkSegments: routeSegments }: SettingsAppProps =
{t('title')}
+