diff --git a/packages/app/index.html b/packages/app/index.html
index 8c86360af..ad49b2553 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 21c845d0d..2b7520da1 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 3d9f37ca7..1baa5e40d 100644
--- a/packages/app/src/i18n/en.ts
+++ b/packages/app/src/i18n/en.ts
@@ -841,6 +841,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 21b42be48..badc2ae85 100644
--- a/packages/app/src/pages/session.tsx
+++ b/packages/app/src/pages/session.tsx
@@ -1568,12 +1568,20 @@ export default function Page() {
/>
)
- const mobileTabs = (compact = false) => (
+ const mobileTabs = (compact = false, bottom = false) => (
-
+
setStore("mobileTab", "session")}
>
@@ -1581,7 +1589,10 @@ export default function Page() {
setStore("mobileTab", "changes")}
>
@@ -1592,6 +1603,9 @@ export default function Page() {
)
+ const mobileTabsBottom = createMemo(
+ () => !isDesktop() && settings.general.newLayoutDesigns() && settings.general.mobileTitlebarPosition() === "bottom",
+ )
return (
@@ -1622,7 +1636,9 @@ export default function Page() {
"shadow-[var(--v2-elevation-raised)]": settings.general.newLayoutDesigns() && !!params.id,
}}
>
-
{mobileTabs(true)}
+
+ {mobileTabs(true)}
+
@@ -1688,6 +1704,7 @@ export default function Page() {
{composerRegion("dock")}
+
{mobileTabs(true, true)}