From cb316936e3b3eb862082b2722167f4abb565a2ac Mon Sep 17 00:00:00 2001 From: Bryan Helmkamp Date: Sun, 10 May 2026 10:23:11 -0400 Subject: [PATCH] feat(web): add chromeless TerminalView and full-screen terminal route New `/runs/:id/terminal` route renders a bare TerminalView at viewport size, opened outside the AppShell so there is no nav, sidebar, or run detail tabs around it. TerminalView gains a `chromeless` prop that hides the toolbar and decorative wrapper. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../app/components/terminal-view.tsx | 59 +++++++++++-------- apps/fabro-web/app/router.tsx | 2 + apps/fabro-web/app/routes/run-terminal.tsx | 19 ++++++ 3 files changed, 54 insertions(+), 26 deletions(-) create mode 100644 apps/fabro-web/app/routes/run-terminal.tsx diff --git a/apps/fabro-web/app/components/terminal-view.tsx b/apps/fabro-web/app/components/terminal-view.tsx index df25543d8..e43528022 100644 --- a/apps/fabro-web/app/components/terminal-view.tsx +++ b/apps/fabro-web/app/components/terminal-view.tsx @@ -188,9 +188,11 @@ function StatusPill({ export default function TerminalView({ runId, leading, + chromeless = false, }: { runId: string; leading?: React.ReactNode; + chromeless?: boolean; }) { const { push } = useToast(); const stateQuery = useRunState(runId); @@ -349,35 +351,38 @@ export default function TerminalView({

Terminal

-
- {leading} - -
- - - - {accessCommandLabel && ( - - )} + {!chromeless && ( +
+ {leading} + +
+ + + + {accessCommandLabel && ( + + )} +
-
+ )} {error ? (
+ ) : chromeless ? ( +
) : (
{ + const previous = document.title; + document.title = `Terminal · ${params.id} · Fabro`; + return () => { + document.title = previous; + }; + }, [params.id]); + + return ( +
+ +
+ ); +}