From a6a4bbc49ce24106ddafa9f5f1e569f200f7f4fb Mon Sep 17 00:00:00 2001 From: "rexarrior@yandex.ru" Date: Fri, 21 Aug 2026 00:11:15 +0300 Subject: [PATCH] fix(tui): align informational dialogs --- packages/tui/src/component/dialog-debug.tsx | 4 +- packages/tui/src/component/dialog-status.tsx | 2 +- .../tui/test/component/dialog-layout.test.tsx | 68 +++++++++++++++++++ 3 files changed, 70 insertions(+), 4 deletions(-) create mode 100644 packages/tui/test/component/dialog-layout.test.tsx diff --git a/packages/tui/src/component/dialog-debug.tsx b/packages/tui/src/component/dialog-debug.tsx index 21554aac957f..8d36ed4fcafe 100644 --- a/packages/tui/src/component/dialog-debug.tsx +++ b/packages/tui/src/component/dialog-debug.tsx @@ -19,8 +19,6 @@ export function DialogDebug() { const toast = useToast() const [copied, setCopied] = createSignal(false) - dialog.setSize("large") - const entries = createMemo(() => { const model = local.model.current() return [ @@ -51,7 +49,7 @@ export function DialogDebug() { })) return ( - + Debug diff --git a/packages/tui/src/component/dialog-status.tsx b/packages/tui/src/component/dialog-status.tsx index 6c8fabdbb3a3..e60ac99b62f1 100644 --- a/packages/tui/src/component/dialog-status.tsx +++ b/packages/tui/src/component/dialog-status.tsx @@ -41,7 +41,7 @@ export function DialogStatus() { }) return ( - + Status diff --git a/packages/tui/test/component/dialog-layout.test.tsx b/packages/tui/test/component/dialog-layout.test.tsx new file mode 100644 index 000000000000..290ade50e70a --- /dev/null +++ b/packages/tui/test/component/dialog-layout.test.tsx @@ -0,0 +1,68 @@ +/** @jsxImportSource @opentui/solid */ +import { expect, mock, test } from "bun:test" +import type { TuiPluginApi } from "@opencode-ai/plugin/tui" +import { createTestRenderer } from "@opentui/core/testing" +import { Effect } from "effect" +import { AppNodeBuilder } from "@opencode-ai/core/effect/app-node-builder" +import { Global } from "@opencode-ai/core/global" +import { createTuiResolvedConfig } from "../fixture/tui-runtime" +import { createEventSource, createFetch, directory } from "../fixture/tui-sdk" + +test("aligns informational dialog content", async () => { + const setup = await createTestRenderer({ width: 100, height: 30, useThread: false }) + const core = await import("@opentui/core") + mock.module("@opentui/core", () => ({ ...core, createCliRenderer: async () => setup.renderer })) + const events = createEventSource() + const calls = createFetch() + let api: TuiPluginApi | undefined + let started!: () => void + const ready = new Promise((resolve) => { + started = resolve + }) + + try { + const { run } = await import("../../src/app") + const task = Effect.runPromise( + run({ + url: "http://test", + directory, + config: createTuiResolvedConfig({ plugin_enabled: {} }), + fetch: calls.fetch, + events: events.source, + args: {}, + pluginHost: { + async start(input) { + api = input.api + started() + }, + async dispose() {}, + }, + }).pipe(Effect.provide(AppNodeBuilder.build(Global.node))), + ) + await ready + await setup.renderOnce() + + const titleColumn = async (command: string, title: string) => { + api?.keymap.dispatchCommand(command) + await setup.renderOnce() + const line = setup + .captureCharFrame() + .split("\n") + .find((line) => line.includes(title)) + return line?.indexOf(title) + } + + const title = await titleColumn("theme.switch", "Themes") + const debug = await titleColumn("opencode.debug", "Debug") + const status = await titleColumn("opencode.status", "Status") + expect(title).toBeDefined() + expect(debug).toBe(title) + expect(status).toBe(title) + + api?.keymap.dispatchCommand("app.exit") + await task + } finally { + if (!setup.renderer.isDestroyed) setup.renderer.destroy() + mock.restore() + } +})