-
-
Notifications
You must be signed in to change notification settings - Fork 0
T-234: Terminal.tsx — xterm.js wrap + input/output binding + exit overlay #129
Copy link
Copy link
Open
Labels
priority:P0Priority P0 — must land in sprintPriority P0 — must land in sprintscope: frontendReact / Tauri webview / xterm / CodeMirrorReact / Tauri webview / xterm / CodeMirrorsprint:2026-05-14Sprint 2026-05-14 (Sprint 3) — terminals & PTY foundationSprint 2026-05-14 (Sprint 3) — terminals & PTY foundationtrack:CTrack C — frontend (React, Tailwind, Zustand, i18n)Track C — frontend (React, Tailwind, Zustand, i18n)type:featureFeature work (new capability)Feature work (new capability)
Metadata
Metadata
Assignees
Labels
priority:P0Priority P0 — must land in sprintPriority P0 — must land in sprintscope: frontendReact / Tauri webview / xterm / CodeMirrorReact / Tauri webview / xterm / CodeMirrorsprint:2026-05-14Sprint 2026-05-14 (Sprint 3) — terminals & PTY foundationSprint 2026-05-14 (Sprint 3) — terminals & PTY foundationtrack:CTrack C — frontend (React, Tailwind, Zustand, i18n)Track C — frontend (React, Tailwind, Zustand, i18n)type:featureFeature work (new capability)Feature work (new capability)
Goal
Build
src/features/terminals/Terminal.tsx: a React component wrapping a single@xterm/xterminstance. Bridges keyboard input →invokeTerminalsWrite, broadcast chunks →term.write(bytes), exit event → "session ended" overlay. Lifecycle handles xterm dispose on unmount; bindsFitAddonto a parentResizeObserver.Add
@xterm/xterm,@xterm/addon-fit,@xterm/addon-web-linksviapnpm add(never edit package.json). Tree-shake to keep bundle delta < 200 KB gzipped.Acceptance criteria
<Terminal terminalId={id} />renders a div withxtermmounted, no SSR (Tauri webview is always client)onData(data => invokeTerminalsWrite(id, encoder.encode(data)))bytes_base64→ decode →term.write(...)terminal:exitedshows a dismissible overlay "Session exited (code N)" + button to close paneFitAddonrecomputes cols/rows on parent resize viaResizeObserver, debounced 50 ms (delegated to T-236 hook)Ctrl+Shift+C/Ctrl+Shift+Von Linux,Cmdon macOS)@testing-library/react:it("should render an xterm instance after mount")it("should call invokeTerminalsWrite when the user types")it("should display exit overlay when terminal:exited fires")pnpm buildsize diff documented in PRFiles to create/modify
src/features/terminals/Terminal.tsxsrc/features/terminals/Terminal.test.tsxpnpm-lock.yamlviapnpm add @xterm/xterm @xterm/addon-fit @xterm/addon-web-linkssrc/styles/for xterm CSS import (or scoped to component)References
Dependencies
Blocked by T-233.