diff --git a/packages/tui/src/component/dialog-debug.tsx b/packages/tui/src/component/dialog-debug.tsx index 92b18e905de9..630650e7b213 100644 --- a/packages/tui/src/component/dialog-debug.tsx +++ b/packages/tui/src/component/dialog-debug.tsx @@ -1,8 +1,7 @@ -import { TextAttributes } from "@opentui/core" import { createMemo, createSignal, For } from "solid-js" import { Keymap } from "../context/keymap" import { useTheme } from "../context/theme" -import { useDialog } from "../ui/dialog" +import { DialogHeader, useDialog } from "../ui/dialog" import { useRoute } from "../context/route" import { useLocal } from "../context/local" import { useClipboard } from "../context/clipboard" @@ -54,14 +53,7 @@ export function DialogDebug() { return ( - - - Debug - - dialog.clear()}> - esc - - + {/* No click-to-copy here: releasing a mouse selection must trigger the global copy-on-select so users can copy a single value, e.g. the session id. */} diff --git a/packages/tui/src/component/dialog-error-details.tsx b/packages/tui/src/component/dialog-error-details.tsx index c4ced3b4ffd6..f1f554764b3c 100644 --- a/packages/tui/src/component/dialog-error-details.tsx +++ b/packages/tui/src/component/dialog-error-details.tsx @@ -9,7 +9,7 @@ import { useRoute } from "../context/route" import { getScrollAcceleration } from "../util/scroll" import { useTheme } from "../context/theme" import { emptyPrompt } from "../prompt/history" -import { dialogWidth, useDialog } from "../ui/dialog" +import { DialogHeader, dialogWidth, useDialog } from "../ui/dialog" import { FilePath } from "../ui/file-path" import { useToast } from "../ui/toast" import { errorDetails } from "../util/error-details" @@ -73,21 +73,22 @@ export function DialogErrorDetails(props: { return ( - - - {props.title} - - - esc - - + + {props.title} + + } + /> {(source) => ( }) { @@ -34,14 +34,7 @@ export function DialogHighlights(props: { version: string; items: ReadonlyArray< return ( - - - What's new in {props.version} - - dialog.clear()}> - esc - - + {/* The band owns the vertical padding so it stays visible while the highlights scroll. */} - - - Image {index() + 1} of {props.images.length} - - dialog.clear()}> - esc - - + dialog.setSize("large")) return ( - - - {props.title} - - dialog.clear()}> - esc close - - + - - - {props.title} - - dialog.clear()}> - esc - - + {(url) => ( @@ -986,14 +971,7 @@ function StringChoiceField(props: { })) return ( - - - {formLabel(props.field)} - - (store.editing ? back() : dialog.clear())}> - esc - - + (store.editing ? back() : dialog.clear())} /> {(description) => {description()}} - - - Pair - - dialog.clear()}> - esc - - + - - - Shell output - + + Shell output + + } + > {status()} - dialog.clear()}> - esc - - + {props.shell.command} diff --git a/packages/tui/src/component/dialog-status.tsx b/packages/tui/src/component/dialog-status.tsx index 3c06c47aba31..1b3136a4906c 100644 --- a/packages/tui/src/component/dialog-status.tsx +++ b/packages/tui/src/component/dialog-status.tsx @@ -1,13 +1,11 @@ -import { TextAttributes } from "@opentui/core" import { useTheme } from "../context/theme" -import { useDialog } from "../ui/dialog" +import { DialogHeader } from "../ui/dialog" import { useData } from "../context/data" import { For, Match, Switch, Show, createMemo } from "solid-js" export function DialogStatus() { const data = useData() const theme = useTheme().surface("dialog") - const dialog = useDialog() const mcp = createMemo(() => data.location.mcp.server.list() ?? []) const color = (status: string) => { @@ -18,14 +16,7 @@ export function DialogStatus() { } return ( - - - Status - - dialog.clear()}> - esc - - + 0} fallback={No MCP servers}> diff --git a/packages/tui/src/component/dialog-update.tsx b/packages/tui/src/component/dialog-update.tsx index fd3884602756..23462e4d30b8 100644 --- a/packages/tui/src/component/dialog-update.tsx +++ b/packages/tui/src/component/dialog-update.tsx @@ -1,9 +1,8 @@ -import { TextAttributes } from "@opentui/core" import { createEffect, createMemo, createResource, createSignal, For, Match, onCleanup, Show, Switch } from "solid-js" import { Keymap } from "../context/keymap" import { useTheme } from "../context/theme" import type { UpdateState } from "../context/update-notification" -import { useDialog } from "../ui/dialog" +import { DialogHeader, useDialog } from "../ui/dialog" import { errorMessage } from "../util/error" import { Spinner } from "./spinner" @@ -87,18 +86,15 @@ export function DialogUpdate(props: { return ( - - - {state().type === "installing" + - dialog.clear()}> - esc - - + : "Update" + } + /> {(current) => ( diff --git a/packages/tui/src/component/dialog-workspace-file-changes.tsx b/packages/tui/src/component/dialog-workspace-file-changes.tsx index 6f35d38341be..58c661ccf6d7 100644 --- a/packages/tui/src/component/dialog-workspace-file-changes.tsx +++ b/packages/tui/src/component/dialog-workspace-file-changes.tsx @@ -1,4 +1,3 @@ -import { TextAttributes } from "@opentui/core" import { useKeyboard, useTerminalDimensions } from "@opentui/solid" import type { VcsFileStatus } from "@opencode/client" import { createMemo, For } from "solid-js" @@ -6,7 +5,7 @@ import { createStore } from "solid-js/store" import { FilePath } from "../ui/file-path" import { useTheme } from "../context/theme" import { useConfig } from "../config" -import { useDialog, type DialogContext } from "../ui/dialog" +import { DialogHeader, useDialog, type DialogContext } from "../ui/dialog" import { getScrollAcceleration } from "../util/scroll" const options = ["no", "yes"] as const @@ -71,14 +70,7 @@ export function DialogWorkspaceFileChanges(props: { return ( - - - {props.title ?? "File Changes Found"} - - dialog.clear()}> - esc - - + {props.message ?? "Do you want to move these changes with the session?"} diff --git a/packages/tui/src/component/dialog-worktree-name.tsx b/packages/tui/src/component/dialog-worktree-name.tsx index d1a0340655fc..b2797da84995 100644 --- a/packages/tui/src/component/dialog-worktree-name.tsx +++ b/packages/tui/src/component/dialog-worktree-name.tsx @@ -1,9 +1,9 @@ -import { InputRenderable, TextAttributes } from "@opentui/core" +import { InputRenderable } from "@opentui/core" import { Slug } from "@opencode/core/util/slug" import { createSignal, onMount } from "solid-js" import { Keymap } from "../context/keymap" import { useTheme } from "../context/theme" -import { useDialog, type DialogContext } from "../ui/dialog" +import { DialogHeader, useDialog, type DialogContext } from "../ui/dialog" import { useConfig } from "../config" export function DialogWorktreeName(props: { onConfirm: (name: string) => void }) { @@ -48,14 +48,7 @@ export function DialogWorktreeName(props: { onConfirm: (name: string) => void }) return ( - - - Name worktree - - dialog.clear()}> - esc - - + { diff --git a/packages/tui/src/feature-plugins/prompt/btw.tsx b/packages/tui/src/feature-plugins/prompt/btw.tsx index 4a18b82814e9..8afea3f70416 100644 --- a/packages/tui/src/feature-plugins/prompt/btw.tsx +++ b/packages/tui/src/feature-plugins/prompt/btw.tsx @@ -8,7 +8,7 @@ import { useClipboard } from "../../context/clipboard" import { Keymap } from "../../context/keymap" import { useTheme, useThemes } from "../../context/theme" import { usePlugin } from "../../plugin/context" -import { useDialog } from "../../ui/dialog" +import { DialogHeader } from "../../ui/dialog" import { useToast } from "../../ui/toast" import { getScrollAcceleration } from "../../util/scroll" @@ -90,7 +90,6 @@ export function Answer(props: { answer: string markdown: ReturnType["markdown"] }) { - const dialog = useDialog() const toast = useToast() const clipboard = useClipboard() const theme = useTheme().surface("dialog") @@ -126,17 +125,19 @@ export function Answer(props: { return ( - - - /btw - + + /btw + + } + > {props.question.replace(/\s+/g, " ")} - dialog.clear()}> - esc - - + (scroll = element)} maxHeight={maxHeight()} diff --git a/packages/tui/src/routes/session/dialog-execute.tsx b/packages/tui/src/routes/session/dialog-execute.tsx index 6ea1846acd7e..d605f0883fe5 100644 --- a/packages/tui/src/routes/session/dialog-execute.tsx +++ b/packages/tui/src/routes/session/dialog-execute.tsx @@ -8,7 +8,7 @@ import { useConfig } from "../../config" import { useClipboard } from "../../context/clipboard" import { Keymap } from "../../context/keymap" import { useTheme, useThemes } from "../../context/theme" -import { dialogWidth, useDialog } from "../../ui/dialog" +import { DialogHeader, dialogWidth, useDialog } from "../../ui/dialog" import { useToast } from "../../ui/toast" import { Locale } from "../../util/locale" import { getScrollAcceleration } from "../../util/scroll" @@ -93,15 +93,17 @@ export function DialogExecute(props: { part: SessionMessageAssistantTool }) { return ( - - - execute - + + execute + + } + > {status()} - dialog.clear()}> - esc - - + (scroll = value)} diff --git a/packages/tui/src/ui/dialog-alert.tsx b/packages/tui/src/ui/dialog-alert.tsx index cb7c324d3cac..3ca8bdff192d 100644 --- a/packages/tui/src/ui/dialog-alert.tsx +++ b/packages/tui/src/ui/dialog-alert.tsx @@ -1,7 +1,6 @@ -import { TextAttributes } from "@opentui/core" import { Keymap } from "../context/keymap" import { useTheme } from "../context/theme" -import { useDialog } from "./dialog" +import { DialogHeader, useDialog } from "./dialog" export type DialogAlertProps = { title: string @@ -29,14 +28,7 @@ export function DialogAlert(props: DialogAlertProps) { })) return ( - - - {props.title} - - dialog.clear()}> - esc - - + {props.message} diff --git a/packages/tui/src/ui/dialog-confirm.tsx b/packages/tui/src/ui/dialog-confirm.tsx index 19c8895ba8ea..0954af040fbd 100644 --- a/packages/tui/src/ui/dialog-confirm.tsx +++ b/packages/tui/src/ui/dialog-confirm.tsx @@ -1,7 +1,6 @@ -import { TextAttributes } from "@opentui/core" import { Keymap } from "../context/keymap" import { useTheme } from "../context/theme" -import { useDialog } from "./dialog" +import { DialogHeader, useDialog } from "./dialog" import { createStore } from "solid-js/store" import { For } from "solid-js" import { Locale } from "../util/locale" @@ -57,14 +56,7 @@ export function DialogConfirm(props: DialogConfirmProps) { })) return ( - - - {props.title} - - dialog.clear()}> - esc - - + {props.message} diff --git a/packages/tui/src/ui/dialog-export-options.tsx b/packages/tui/src/ui/dialog-export-options.tsx index 5f1ff9c8179c..928516dc13aa 100644 --- a/packages/tui/src/ui/dialog-export-options.tsx +++ b/packages/tui/src/ui/dialog-export-options.tsx @@ -1,7 +1,6 @@ -import { TextAttributes } from "@opentui/core" import { Keymap } from "../context/keymap" import { useTheme } from "../context/theme" -import { useDialog, type DialogContext } from "./dialog" +import { DialogHeader, type DialogContext } from "./dialog" import { createStore } from "solid-js/store" import { For, Show } from "solid-js" @@ -22,7 +21,6 @@ export type DialogExportOptionsProps = { type Active = ExportFormat | "thinking" | "tools" | "sanitize" | "copy" | "export" export function DialogExportOptions(props: DialogExportOptionsProps) { - const dialog = useDialog() const theme = useTheme().surface("dialog") const overlayTheme = useTheme() const [store, setStore] = createStore({ @@ -84,14 +82,7 @@ export function DialogExportOptions(props: DialogExportOptionsProps) { return ( - - - Export session - - dialog.clear()}> - esc - - + Export as: diff --git a/packages/tui/src/ui/dialog-export-result.tsx b/packages/tui/src/ui/dialog-export-result.tsx index 7261a7a6b004..40393cdc63e9 100644 --- a/packages/tui/src/ui/dialog-export-result.tsx +++ b/packages/tui/src/ui/dialog-export-result.tsx @@ -1,7 +1,6 @@ -import { TextAttributes } from "@opentui/core" import { Keymap } from "../context/keymap" import { useTheme } from "../context/theme" -import { useDialog, type DialogContext } from "./dialog" +import { DialogHeader, useDialog, type DialogContext } from "./dialog" export function DialogExportResult(props: { path: string; onClose?: () => void }) { const dialog = useDialog() @@ -26,14 +25,7 @@ export function DialogExportResult(props: { path: string; onClose?: () => void } return ( - - - Session exported - - - esc - - + {props.path} diff --git a/packages/tui/src/ui/dialog-help.tsx b/packages/tui/src/ui/dialog-help.tsx index 2c0e829666f6..8982013a46a6 100644 --- a/packages/tui/src/ui/dialog-help.tsx +++ b/packages/tui/src/ui/dialog-help.tsx @@ -1,7 +1,6 @@ -import { TextAttributes } from "@opentui/core" import { Keymap } from "../context/keymap" import { useTheme } from "../context/theme" -import { useDialog } from "./dialog" +import { DialogHeader, useDialog } from "./dialog" export function DialogHelp() { const dialog = useDialog() @@ -18,14 +17,7 @@ export function DialogHelp() { return ( - - - Help - - dialog.clear()}> - esc/enter - - + Press {shortcuts.get("command.palette.show")} to see all available actions and commands in any context. diff --git a/packages/tui/src/ui/dialog-prompt.tsx b/packages/tui/src/ui/dialog-prompt.tsx index 0bf40dfc78b9..32d2a4c1a122 100644 --- a/packages/tui/src/ui/dialog-prompt.tsx +++ b/packages/tui/src/ui/dialog-prompt.tsx @@ -1,7 +1,7 @@ -import { TextareaRenderable, TextAttributes } from "@opentui/core" +import { TextareaRenderable } from "@opentui/core" import { Keymap } from "../context/keymap" import { useTheme } from "../context/theme" -import { useDialog, type DialogSize } from "./dialog" +import { DialogHeader, useDialog, type DialogSize } from "./dialog" import { Show, createEffect, createSignal, onMount, type JSX } from "solid-js" import { Spinner } from "../component/spinner" import { useConfig } from "../config" @@ -97,19 +97,12 @@ export function DialogPrompt(props: DialogPromptProps) { return ( - - - {props.title} - - { - if (!props.busy) (props.onCancel ?? dialog.clear)() - }} - > - esc - - + { + if (!props.busy) (props.onCancel ?? dialog.clear)() + }} + /> {props.description?.()}