summaryrefslogtreecommitdiffhomepage
path: root/packages/app/src/components
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/components
parente2c57735b43d4bbca3b8de1ea0d2fe706f3e2799 (diff)
downloadopencode-7de42ca242af2045fdfc4bbbe1ada33069d2769e.tar.gz
opencode-7de42ca242af2045fdfc4bbbe1ada33069d2769e.zip
feat(app): improved layout
Diffstat (limited to 'packages/app/src/components')
-rw-r--r--packages/app/src/components/dialog-select-file.tsx5
-rw-r--r--packages/app/src/components/prompt-input.tsx14
-rw-r--r--packages/app/src/components/session-context-usage.tsx3
-rw-r--r--packages/app/src/components/session/session-header.tsx53
4 files changed, 21 insertions, 54 deletions
diff --git a/packages/app/src/components/dialog-select-file.tsx b/packages/app/src/components/dialog-select-file.tsx
index 54ed48a9d..5c58725c7 100644
--- a/packages/app/src/components/dialog-select-file.tsx
+++ b/packages/app/src/components/dialog-select-file.tsx
@@ -36,7 +36,6 @@ export function DialogSelectFile(props: { mode?: DialogSelectFileMode; onOpenFil
const filesOnly = () => props.mode === "files"
const sessionKey = createMemo(() => `${params.dir}${params.id ? "/" + params.id : ""}`)
const tabs = createMemo(() => layout.tabs(sessionKey))
- const view = createMemo(() => layout.view(sessionKey))
const state = { cleanup: undefined as (() => void) | void, committed: false }
const [grouped, setGrouped] = createSignal(false)
const common = [
@@ -45,7 +44,7 @@ export function DialogSelectFile(props: { mode?: DialogSelectFileMode; onOpenFil
"session.previous",
"session.next",
"terminal.toggle",
- "review.toggle",
+ "fileTree.toggle",
]
const limit = 5
@@ -163,7 +162,7 @@ export function DialogSelectFile(props: { mode?: DialogSelectFileMode; onOpenFil
const value = file.tab(path)
tabs().open(value)
file.load(path)
- view().reviewPanel.open()
+ layout.fileTree.setTab("all")
props.onOpenFile?.(path)
}
diff --git a/packages/app/src/components/prompt-input.tsx b/packages/app/src/components/prompt-input.tsx
index c736ef0f1..1bd7aa4eb 100644
--- a/packages/app/src/components/prompt-input.tsx
+++ b/packages/app/src/components/prompt-input.tsx
@@ -171,7 +171,6 @@ export const PromptInput: Component<PromptInputProps> = (props) => {
const sessionKey = createMemo(() => `${params.dir}${params.id ? "/" + params.id : ""}`)
const tabs = createMemo(() => layout.tabs(sessionKey))
- const view = createMemo(() => layout.view(sessionKey))
const commentInReview = (path: string) => {
const sessionID = params.id
@@ -187,20 +186,15 @@ export const PromptInput: Component<PromptInputProps> = (props) => {
const focus = { file: item.path, id: item.commentID }
comments.setActive(focus)
- view().reviewPanel.open()
- if (item.commentOrigin === "review") {
- tabs().open("review")
- requestAnimationFrame(() => comments.setFocus(focus))
- return
- }
-
- if (item.commentOrigin !== "file" && commentInReview(item.path)) {
- tabs().open("review")
+ const wantsReview = item.commentOrigin === "review" || (item.commentOrigin !== "file" && commentInReview(item.path))
+ if (wantsReview) {
+ layout.fileTree.setTab("changes")
requestAnimationFrame(() => comments.setFocus(focus))
return
}
+ layout.fileTree.setTab("all")
const tab = files.tab(item.path)
tabs().open(tab)
files.load(item.path)
diff --git a/packages/app/src/components/session-context-usage.tsx b/packages/app/src/components/session-context-usage.tsx
index 4dbb9e048..afdb18bb0 100644
--- a/packages/app/src/components/session-context-usage.tsx
+++ b/packages/app/src/components/session-context-usage.tsx
@@ -23,7 +23,6 @@ export function SessionContextUsage(props: SessionContextUsageProps) {
const variant = createMemo(() => props.variant ?? "button")
const sessionKey = createMemo(() => `${params.dir}${params.id ? "/" + params.id : ""}`)
const tabs = createMemo(() => layout.tabs(sessionKey))
- const view = createMemo(() => layout.view(sessionKey))
const messages = createMemo(() => (params.id ? (sync.data.message[params.id] ?? []) : []))
const usd = createMemo(
@@ -58,7 +57,7 @@ export function SessionContextUsage(props: SessionContextUsageProps) {
const openContext = () => {
if (!params.id) return
- view().reviewPanel.open()
+ layout.fileTree.setTab("all")
tabs().open("context")
tabs().setActive("context")
}
diff --git a/packages/app/src/components/session/session-header.tsx b/packages/app/src/components/session/session-header.tsx
index db43b5eaf..9fddb4507 100644
--- a/packages/app/src/components/session/session-header.tsx
+++ b/packages/app/src/components/session/session-header.tsx
@@ -45,7 +45,6 @@ export function SessionHeader() {
const currentSession = createMemo(() => sync.data.session.find((s) => s.id === params.id))
const shareEnabled = createMemo(() => sync.data.config.share !== "disabled")
const showShare = createMemo(() => shareEnabled() && !!currentSession())
- const showReview = createMemo(() => !!currentSession())
const sessionKey = createMemo(() => `${params.dir}${params.id ? "/" + params.id : ""}`)
const view = createMemo(() => layout.view(sessionKey))
@@ -281,62 +280,38 @@ export function SessionHeader() {
</TooltipKeybind>
</div>
<div class="hidden md:block shrink-0">
- <TooltipKeybind title={language.t("command.review.toggle")} keybind={command.keybind("review.toggle")}>
+ <TooltipKeybind
+ title={language.t("command.fileTree.toggle")}
+ keybind={command.keybind("fileTree.toggle")}
+ >
<Button
variant="ghost"
- class="group/review-toggle size-6 p-0"
- onClick={() => view().reviewPanel.toggle()}
- aria-label={language.t("command.review.toggle")}
- aria-expanded={view().reviewPanel.opened()}
- aria-controls="review-panel"
- tabIndex={showReview() ? 0 : -1}
+ class="group/file-tree-toggle size-6 p-0"
+ onClick={() => layout.fileTree.toggle()}
+ aria-label={language.t("command.fileTree.toggle")}
+ aria-expanded={layout.fileTree.opened()}
+ aria-controls="file-tree-panel"
>
<div class="relative flex items-center justify-center size-4 [&>*]:absolute [&>*]:inset-0">
<Icon
size="small"
- name={view().reviewPanel.opened() ? "layout-right-full" : "layout-right"}
- class="group-hover/review-toggle:hidden"
+ name={layout.fileTree.opened() ? "layout-right-full" : "layout-right"}
+ class="group-hover/file-tree-toggle:hidden"
/>
<Icon
size="small"
name="layout-right-partial"
- class="hidden group-hover/review-toggle:inline-block"
+ class="hidden group-hover/file-tree-toggle:inline-block"
/>
<Icon
size="small"
- name={view().reviewPanel.opened() ? "layout-right" : "layout-right-full"}
- class="hidden group-active/review-toggle:inline-block"
+ name={layout.fileTree.opened() ? "layout-right" : "layout-right-full"}
+ class="hidden group-active/file-tree-toggle:inline-block"
/>
</div>
</Button>
</TooltipKeybind>
</div>
- <div class="hidden md:block shrink-0">
- <Tooltip value="Toggle file tree" placement="bottom">
- <Button
- variant="ghost"
- class="group/file-tree-toggle size-6 p-0"
- onClick={() => {
- const opening = !layout.fileTree.opened()
- if (opening && !view().reviewPanel.opened()) view().reviewPanel.open()
- layout.fileTree.toggle()
- }}
- aria-label="Toggle file tree"
- aria-expanded={layout.fileTree.opened()}
- >
- <div class="relative flex items-center justify-center size-4">
- <Icon
- size="small"
- name="bullet-list"
- classList={{
- "text-icon-strong": layout.fileTree.opened(),
- "text-icon-weak": !layout.fileTree.opened(),
- }}
- />
- </div>
- </Button>
- </Tooltip>
- </div>
</div>
</Portal>
)}