summaryrefslogtreecommitdiffhomepage
path: root/packages/app/src/context
diff options
context:
space:
mode:
authoradamelmore <[email protected]>2026-01-27 11:34:30 -0600
committeradamelmore <[email protected]>2026-01-27 11:40:39 -0600
commit7de42ca242af2045fdfc4bbbe1ada33069d2769e (patch)
tree2df894cba88a9fb6c098853b8f0e9d0c7fa64c6e /packages/app/src/context
parente2c57735b43d4bbca3b8de1ea0d2fe706f3e2799 (diff)
downloadopencode-7de42ca242af2045fdfc4bbbe1ada33069d2769e.tar.gz
opencode-7de42ca242af2045fdfc4bbbe1ada33069d2769e.zip
feat(app): improved layout
Diffstat (limited to 'packages/app/src/context')
-rw-r--r--packages/app/src/context/layout.tsx104
1 files changed, 51 insertions, 53 deletions
diff --git a/packages/app/src/context/layout.tsx b/packages/app/src/context/layout.tsx
index 414c3d6f1..d30fd11cf 100644
--- a/packages/app/src/context/layout.tsx
+++ b/packages/app/src/context/layout.tsx
@@ -51,16 +51,37 @@ export const { use: useLayout, provider: LayoutProvider } = createSimpleContext(
const migrate = (value: unknown) => {
if (!isRecord(value)) return value
+
const sidebar = value.sidebar
- if (!isRecord(sidebar)) return value
- if (typeof sidebar.workspaces !== "boolean") return value
- return {
- ...value,
- sidebar: {
+ const migratedSidebar = (() => {
+ if (!isRecord(sidebar)) return sidebar
+ if (typeof sidebar.workspaces !== "boolean") return sidebar
+ return {
...sidebar,
workspaces: {},
workspacesDefault: sidebar.workspaces,
- },
+ }
+ })()
+
+ const fileTree = value.fileTree
+ const migratedFileTree = (() => {
+ if (!isRecord(fileTree)) return fileTree
+ if (fileTree.tab === "changes" || fileTree.tab === "all") return fileTree
+
+ const width = typeof fileTree.width === "number" ? fileTree.width : 344
+ return {
+ ...fileTree,
+ opened: true,
+ width: width === 260 ? 344 : width,
+ tab: "changes",
+ }
+ })()
+
+ if (migratedSidebar === sidebar && migratedFileTree === fileTree) return value
+ return {
+ ...value,
+ sidebar: migratedSidebar,
+ fileTree: migratedFileTree,
}
}
@@ -80,11 +101,11 @@ export const { use: useLayout, provider: LayoutProvider } = createSimpleContext(
},
review: {
diffStyle: "split" as ReviewDiffStyle,
- panelOpened: true,
},
fileTree: {
- opened: false,
- width: 260,
+ opened: true,
+ width: 344,
+ tab: "changes" as "changes" | "all",
},
session: {
width: 600,
@@ -454,32 +475,40 @@ export const { use: useLayout, provider: LayoutProvider } = createSimpleContext(
},
},
fileTree: {
- opened: createMemo(() => store.fileTree?.opened ?? false),
- width: createMemo(() => store.fileTree?.width ?? 260),
+ opened: createMemo(() => store.fileTree?.opened ?? true),
+ width: createMemo(() => store.fileTree?.width ?? 344),
+ tab: createMemo(() => store.fileTree?.tab ?? "changes"),
+ setTab(tab: "changes" | "all") {
+ if (!store.fileTree) {
+ setStore("fileTree", { opened: true, width: 344, tab })
+ return
+ }
+ setStore("fileTree", "tab", tab)
+ },
open() {
if (!store.fileTree) {
- setStore("fileTree", { opened: true, width: 260 })
+ setStore("fileTree", { opened: true, width: 344, tab: "changes" })
return
}
setStore("fileTree", "opened", true)
},
close() {
if (!store.fileTree) {
- setStore("fileTree", { opened: false, width: 260 })
+ setStore("fileTree", { opened: false, width: 344, tab: "changes" })
return
}
setStore("fileTree", "opened", false)
},
toggle() {
if (!store.fileTree) {
- setStore("fileTree", { opened: true, width: 260 })
+ setStore("fileTree", { opened: true, width: 344, tab: "changes" })
return
}
setStore("fileTree", "opened", (x) => !x)
},
resize(width: number) {
if (!store.fileTree) {
- setStore("fileTree", { opened: true, width })
+ setStore("fileTree", { opened: true, width, tab: "changes" })
return
}
setStore("fileTree", "width", width)
@@ -526,7 +555,6 @@ export const { use: useLayout, provider: LayoutProvider } = createSimpleContext(
const s = createMemo(() => store.sessionView[key()] ?? { scroll: {} })
const terminalOpened = createMemo(() => store.terminal?.opened ?? false)
- const reviewPanelOpened = createMemo(() => store.review?.panelOpened ?? true)
function setTerminalOpened(next: boolean) {
const current = store.terminal
@@ -540,18 +568,6 @@ export const { use: useLayout, provider: LayoutProvider } = createSimpleContext(
setStore("terminal", "opened", next)
}
- function setReviewPanelOpened(next: boolean) {
- const current = store.review
- if (!current) {
- setStore("review", { diffStyle: "split" as ReviewDiffStyle, panelOpened: next })
- return
- }
-
- const value = current.panelOpened ?? true
- if (value === next) return
- setStore("review", "panelOpened", next)
- }
-
return {
scroll(tab: string) {
return scroll.scroll(key(), tab)
@@ -571,18 +587,6 @@ export const { use: useLayout, provider: LayoutProvider } = createSimpleContext(
setTerminalOpened(!terminalOpened())
},
},
- reviewPanel: {
- opened: reviewPanelOpened,
- open() {
- setReviewPanelOpened(true)
- },
- close() {
- setReviewPanelOpened(false)
- },
- toggle() {
- setReviewPanelOpened(!reviewPanelOpened())
- },
- },
review: {
open: createMemo(() => s().reviewOpen),
setOpen(open: string[]) {
@@ -620,10 +624,11 @@ export const { use: useLayout, provider: LayoutProvider } = createSimpleContext(
const tabs = createMemo(() => store.sessionTabs[key()] ?? { all: [] })
return {
tabs,
- active: createMemo(() => tabs().active),
- all: createMemo(() => tabs().all),
+ active: createMemo(() => (tabs().active === "review" ? undefined : tabs().active)),
+ all: createMemo(() => tabs().all.filter((tab) => tab !== "review")),
setActive(tab: string | undefined) {
const session = key()
+ if (tab === "review") return
if (!store.sessionTabs[session]) {
setStore("sessionTabs", session, { all: [], active: tab })
} else {
@@ -632,25 +637,18 @@ export const { use: useLayout, provider: LayoutProvider } = createSimpleContext(
},
setAll(all: string[]) {
const session = key()
+ const next = all.filter((tab) => tab !== "review")
if (!store.sessionTabs[session]) {
- setStore("sessionTabs", session, { all, active: undefined })
+ setStore("sessionTabs", session, { all: next, active: undefined })
} else {
- setStore("sessionTabs", session, "all", all)
+ setStore("sessionTabs", session, "all", next)
}
},
async open(tab: string) {
+ if (tab === "review") return
const session = key()
const current = store.sessionTabs[session] ?? { all: [] }
- if (tab === "review") {
- if (!store.sessionTabs[session]) {
- setStore("sessionTabs", session, { all: [], active: tab })
- return
- }
- setStore("sessionTabs", session, "active", tab)
- return
- }
-
if (tab === "context") {
const all = [tab, ...current.all.filter((x) => x !== tab)]
if (!store.sessionTabs[session]) {