diff --git a/packages/app/index.html b/packages/app/index.html
index 8c86360af3d..ad49b255324 100644
--- a/packages/app/index.html
+++ b/packages/app/index.html
@@ -2,7 +2,10 @@
diff --git a/packages/app/src/context/settings.tsx b/packages/app/src/context/settings.tsx
index 21c845d0d1e..2b7520da12a 100644
--- a/packages/app/src/context/settings.tsx
+++ b/packages/app/src/context/settings.tsx
@@ -33,6 +33,7 @@ export interface Settings {
editToolPartsExpanded: boolean
showSessionProgressBar: boolean
showCustomAgents: boolean
+ mobileTitlebarPosition: "top" | "bottom"
newLayoutDesigns?: boolean
}
appearance: {
@@ -118,6 +119,7 @@ const defaultSettings: Settings = {
editToolPartsExpanded: false,
showSessionProgressBar: true,
showCustomAgents: false,
+ mobileTitlebarPosition: "top",
},
appearance: {
fontSize: 14,
@@ -248,6 +250,13 @@ export const { use: useSettings, provider: SettingsProvider } = createSimpleCont
setShowCustomAgents(value: boolean) {
setStore("general", "showCustomAgents", value)
},
+ mobileTitlebarPosition: withFallback(
+ () => store.general?.mobileTitlebarPosition,
+ defaultSettings.general.mobileTitlebarPosition,
+ ),
+ setMobileTitlebarPosition(value: "top" | "bottom") {
+ setStore("general", "mobileTitlebarPosition", value)
+ },
newLayoutDesigns,
setNewLayoutDesigns(value: boolean) {
setStore("general", "newLayoutDesigns", value)
diff --git a/packages/app/src/i18n/en.ts b/packages/app/src/i18n/en.ts
index 1ba0c3d230a..152bd0d108d 100644
--- a/packages/app/src/i18n/en.ts
+++ b/packages/app/src/i18n/en.ts
@@ -839,6 +839,9 @@ export const dict = {
"settings.general.row.showTerminal.description": "Show the terminal button in the desktop title bar",
"settings.general.row.showStatus.title": "Server status",
"settings.general.row.showStatus.description": "Show the server status button in the title bar",
+ "settings.general.row.mobileTitlebarBottom.title": "Bottom navigation",
+ "settings.general.row.mobileTitlebarBottom.description":
+ "Place the title bar and session tabs at the bottom of the screen on mobile",
"settings.general.row.showCustomAgents.title": "Custom agents",
"settings.general.row.showCustomAgents.description": "Show the agent picker in the composer",
"settings.general.row.reasoningSummaries.title": "Show reasoning summaries",
diff --git a/packages/app/src/pages/session.tsx b/packages/app/src/pages/session.tsx
index 9371cdd9913..bae32a18a0d 100644
--- a/packages/app/src/pages/session.tsx
+++ b/packages/app/src/pages/session.tsx
@@ -1570,12 +1570,20 @@ export default function Page() {
/>
)
- const mobileTabs = (compact = false) => (
+ const mobileTabs = (compact = false, bottom = false) => (
-
+
setStore("mobileTab", "session")}
>
@@ -1583,7 +1591,10 @@ export default function Page() {
setStore("mobileTab", "changes")}
>
@@ -1594,6 +1605,9 @@ export default function Page() {
)
+ const mobileTabsBottom = createMemo(
+ () => !isDesktop() && settings.general.newLayoutDesigns() && settings.general.mobileTitlebarPosition() === "bottom",
+ )
return (
@@ -1624,7 +1638,7 @@ export default function Page() {
"shadow-[var(--v2-elevation-raised)]": settings.general.newLayoutDesigns() && !!params.id,
}}
>
-
+
{mobileTabs(true)}
@@ -1692,6 +1706,7 @@ export default function Page() {
{composerRegion("dock")}
+ {mobileTabs(true, true)}