SessionViewScreen constructor
SessionViewScreen(
- AppContext ctx,
- String nodeId,
- String sessionRef, {
- TerminalView terminalFactory(
- HTMLElement host
- Future<
ShellSessionPort> opener()?, - ClipboardReader? clipboardRead,
- ClipboardWriter? clipboardWrite,
Builds the screen. Production callers omit the injected hooks.
Implementation
SessionViewScreen(
this.ctx,
this.nodeId,
this.sessionRef, {
TerminalView Function(web.HTMLElement host)? terminalFactory,
Future<ShellSessionPort> Function(int cols, int rows)? opener,
ClipboardReader? clipboardRead,
ClipboardWriter? clipboardWrite,
}) : terminalFactory = terminalFactory ?? ((host) => XtermTerminalView(host)),
opener = opener ?? _defaultOpener(ctx, nodeId, sessionRef),
clipboardRead = clipboardRead ?? defaultClipboardRead,
clipboardWrite = clipboardWrite ?? defaultClipboardWrite {
_host = el(
'div',
classes: 'terminal-host',
role: 'group',
ariaLabel: 'Terminal',
);
_status = div(classes: 'row');
_accessory = div();
_fsToggle = button(
'⤢ Fullscreen',
className: 'ghost',
ariaLabel: 'Enter fullscreen',
onClick: _toggleFullscreen,
);
element = el(
'div',
classes: 'stack terminal-screen',
children: [
el(
'div',
classes: 'toolbar',
children: [
button(
'← Sessions',
className: 'ghost',
onClick: () => ctx.router.go(
'/nodes/${Uri.encodeComponent(nodeId)}/sessions',
),
),
el('div', classes: 'grow'),
_status,
_fsToggle,
button('Detach', onClick: _detach),
button('Terminate', className: 'danger', onClick: _terminate),
],
),
el('div', classes: 'card terminal-card', children: [_host]),
_accessory,
// Floating exit button, hidden by CSS unless fullscreen is active.
button(
'⤡',
className: 'icon ghost term-exit-fullscreen',
ariaLabel: 'Exit fullscreen',
onClick: _toggleFullscreen,
),
],
);
_status.appendChild(loadingRow('Connecting…'));
// Lock the page to the viewport so only the terminal content scrolls (no
// body/rubber-band scroll); removed again on dispose.
web.document.documentElement?.classList.add('terminal-active');
// Defer until mounted so the host has layout for the terminal fit.
scheduleMicrotask(_start);
}