|
|
@@ -8,7 +8,7 @@ import { Spinner } from "@opencode-ai/ui/spinner"
|
|
|
import { showToast } from "@opencode-ai/ui/toast"
|
|
|
import { Tooltip, TooltipKeybind } from "@opencode-ai/ui/tooltip"
|
|
|
import { getFilename } from "@opencode-ai/shared/util/path"
|
|
|
-import { createEffect, createMemo, For, Show } from "solid-js"
|
|
|
+import { createEffect, createMemo, createSignal, For, onMount, Show } from "solid-js"
|
|
|
import { createStore } from "solid-js/store"
|
|
|
import { Portal } from "solid-js/web"
|
|
|
import { useCommand } from "@/context/command"
|
|
|
@@ -16,6 +16,7 @@ import { useLanguage } from "@/context/language"
|
|
|
import { useLayout } from "@/context/layout"
|
|
|
import { usePlatform } from "@/context/platform"
|
|
|
import { useServer } from "@/context/server"
|
|
|
+import { useSettings } from "@/context/settings"
|
|
|
import { useSync } from "@/context/sync"
|
|
|
import { useTerminal } from "@/context/terminal"
|
|
|
import { focusTerminalById } from "@/pages/session/helpers"
|
|
|
@@ -134,6 +135,7 @@ export function SessionHeader() {
|
|
|
const server = useServer()
|
|
|
const platform = usePlatform()
|
|
|
const language = useLanguage()
|
|
|
+ const settings = useSettings()
|
|
|
const sync = useSync()
|
|
|
const terminal = useTerminal()
|
|
|
const { params, view } = useSessionLayout()
|
|
|
@@ -151,6 +153,11 @@ export function SessionHeader() {
|
|
|
})
|
|
|
const hotkey = createMemo(() => command.keybind("file.open"))
|
|
|
const os = createMemo(() => detectOS(platform))
|
|
|
+ const isDesktopBeta = platform.platform === "desktop" && import.meta.env.VITE_OPENCODE_CHANNEL === "beta"
|
|
|
+ const search = createMemo(() => !isDesktopBeta || settings.general.showSearch())
|
|
|
+ const tree = createMemo(() => !isDesktopBeta || settings.general.showFileTree())
|
|
|
+ const term = createMemo(() => !isDesktopBeta || settings.general.showTerminal())
|
|
|
+ const status = createMemo(() => !isDesktopBeta || settings.general.showStatus())
|
|
|
|
|
|
const [exists, setExists] = createStore<Partial<Record<OpenApp, boolean>>>({
|
|
|
finder: true,
|
|
|
@@ -262,12 +269,16 @@ export function SessionHeader() {
|
|
|
.catch((err: unknown) => showRequestError(language, err))
|
|
|
}
|
|
|
|
|
|
- const centerMount = createMemo(() => document.getElementById("opencode-titlebar-center"))
|
|
|
- const rightMount = createMemo(() => document.getElementById("opencode-titlebar-right"))
|
|
|
+ const [centerMount, setCenterMount] = createSignal<HTMLElement | null>(null)
|
|
|
+ const [rightMount, setRightMount] = createSignal<HTMLElement | null>(null)
|
|
|
+ onMount(() => {
|
|
|
+ setCenterMount(document.getElementById("opencode-titlebar-center"))
|
|
|
+ setRightMount(document.getElementById("opencode-titlebar-right"))
|
|
|
+ })
|
|
|
|
|
|
return (
|
|
|
<>
|
|
|
- <Show when={centerMount()}>
|
|
|
+ <Show when={search() && centerMount()}>
|
|
|
{(mount) => (
|
|
|
<Portal mount={mount()}>
|
|
|
<Button
|
|
|
@@ -415,24 +426,28 @@ export function SessionHeader() {
|
|
|
</div>
|
|
|
</Show>
|
|
|
<div class="flex items-center gap-1">
|
|
|
- <Tooltip placement="bottom" value={language.t("status.popover.trigger")}>
|
|
|
- <StatusPopover />
|
|
|
- </Tooltip>
|
|
|
- <TooltipKeybind
|
|
|
- title={language.t("command.terminal.toggle")}
|
|
|
- keybind={command.keybind("terminal.toggle")}
|
|
|
- >
|
|
|
- <Button
|
|
|
- variant="ghost"
|
|
|
- class="group/terminal-toggle titlebar-icon w-8 h-6 p-0 box-border shrink-0"
|
|
|
- onClick={toggleTerminal}
|
|
|
- aria-label={language.t("command.terminal.toggle")}
|
|
|
- aria-expanded={view().terminal.opened()}
|
|
|
- aria-controls="terminal-panel"
|
|
|
+ <Show when={status()}>
|
|
|
+ <Tooltip placement="bottom" value={language.t("status.popover.trigger")}>
|
|
|
+ <StatusPopover />
|
|
|
+ </Tooltip>
|
|
|
+ </Show>
|
|
|
+ <Show when={term()}>
|
|
|
+ <TooltipKeybind
|
|
|
+ title={language.t("command.terminal.toggle")}
|
|
|
+ keybind={command.keybind("terminal.toggle")}
|
|
|
>
|
|
|
- <Icon size="small" name={view().terminal.opened() ? "terminal-active" : "terminal"} />
|
|
|
- </Button>
|
|
|
- </TooltipKeybind>
|
|
|
+ <Button
|
|
|
+ variant="ghost"
|
|
|
+ class="group/terminal-toggle titlebar-icon w-8 h-6 p-0 box-border shrink-0"
|
|
|
+ onClick={toggleTerminal}
|
|
|
+ aria-label={language.t("command.terminal.toggle")}
|
|
|
+ aria-expanded={view().terminal.opened()}
|
|
|
+ aria-controls="terminal-panel"
|
|
|
+ >
|
|
|
+ <Icon size="small" name={view().terminal.opened() ? "terminal-active" : "terminal"} />
|
|
|
+ </Button>
|
|
|
+ </TooltipKeybind>
|
|
|
+ </Show>
|
|
|
|
|
|
<div class="hidden md:flex items-center gap-1 shrink-0">
|
|
|
<TooltipKeybind
|
|
|
@@ -451,30 +466,32 @@ export function SessionHeader() {
|
|
|
</Button>
|
|
|
</TooltipKeybind>
|
|
|
|
|
|
- <TooltipKeybind
|
|
|
- title={language.t("command.fileTree.toggle")}
|
|
|
- keybind={command.keybind("fileTree.toggle")}
|
|
|
- >
|
|
|
- <Button
|
|
|
- variant="ghost"
|
|
|
- class="titlebar-icon w-8 h-6 p-0 box-border"
|
|
|
- onClick={() => layout.fileTree.toggle()}
|
|
|
- aria-label={language.t("command.fileTree.toggle")}
|
|
|
- aria-expanded={layout.fileTree.opened()}
|
|
|
- aria-controls="file-tree-panel"
|
|
|
+ <Show when={tree()}>
|
|
|
+ <TooltipKeybind
|
|
|
+ title={language.t("command.fileTree.toggle")}
|
|
|
+ keybind={command.keybind("fileTree.toggle")}
|
|
|
>
|
|
|
- <div class="relative flex items-center justify-center size-4">
|
|
|
- <Icon
|
|
|
- size="small"
|
|
|
- name={layout.fileTree.opened() ? "file-tree-active" : "file-tree"}
|
|
|
- classList={{
|
|
|
- "text-icon-strong": layout.fileTree.opened(),
|
|
|
- "text-icon-weak": !layout.fileTree.opened(),
|
|
|
- }}
|
|
|
- />
|
|
|
- </div>
|
|
|
- </Button>
|
|
|
- </TooltipKeybind>
|
|
|
+ <Button
|
|
|
+ variant="ghost"
|
|
|
+ class="titlebar-icon w-8 h-6 p-0 box-border"
|
|
|
+ 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">
|
|
|
+ <Icon
|
|
|
+ size="small"
|
|
|
+ name={layout.fileTree.opened() ? "file-tree-active" : "file-tree"}
|
|
|
+ classList={{
|
|
|
+ "text-icon-strong": layout.fileTree.opened(),
|
|
|
+ "text-icon-weak": !layout.fileTree.opened(),
|
|
|
+ }}
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ </Button>
|
|
|
+ </TooltipKeybind>
|
|
|
+ </Show>
|
|
|
</div>
|
|
|
</div>
|
|
|
</div>
|