From 40b2bbef3431d45833ee527c81827d5fb2833e89 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Wed, 24 Dec 2025 16:43:35 -0800 Subject: [PATCH] Improve demo by making full screen, add control bar --- demo/client.ts | 11 +++ demo/components/controlBar.ts | 43 ++++++++++++ demo/index.html | 48 +++++++++---- demo/style.css | 126 ++++++++++++++++++++++++++-------- 4 files changed, 184 insertions(+), 44 deletions(-) create mode 100644 demo/components/controlBar.ts diff --git a/demo/client.ts b/demo/client.ts index d211c885..e26a0e7d 100644 --- a/demo/client.ts +++ b/demo/client.ts @@ -19,6 +19,7 @@ if ('WebAssembly' in window) { import { Terminal, ITerminalOptions, type IDisposable, type ITheme } from '@xterm/xterm'; import { AttachAddon } from '@xterm/addon-attach'; +import { initControlBar } from './components/controlBar'; import { ClipboardAddon } from '@xterm/addon-clipboard'; import { FitAddon } from '@xterm/addon-fit'; import { LigaturesAddon } from '@xterm/addon-ligatures'; @@ -231,6 +232,7 @@ if (document.location.pathname === '/test') { window.WebglAddon = WebglAddon; } else { createTerminal(); + initControlBar(); document.getElementById('dispose').addEventListener('click', disposeRecreateButtonHandler); document.getElementById('create-new-window').addEventListener('click', createNewWindowButtonHandler); document.getElementById('serialize').addEventListener('click', serializeButtonHandler); @@ -337,6 +339,7 @@ function createTerminal(): void { } term.focus(); + updateTerminalContainerBackground(); const resizeObserver = new ResizeObserver(entries => { if (autoResize) { @@ -611,10 +614,18 @@ function initOptions(term: Terminal): void { } } term.options[o] = value; + if (o === 'theme') { + updateTerminalContainerBackground(); + } }); }); } +function updateTerminalContainerBackground(): void { + const bg = term.options.theme?.background ?? '#000000'; + terminalContainer.style.backgroundColor = bg; +} + function initAddons(term: Terminal): void { const fragment = document.createDocumentFragment(); diff --git a/demo/components/controlBar.ts b/demo/components/controlBar.ts new file mode 100644 index 00000000..fb4d08e7 --- /dev/null +++ b/demo/components/controlBar.ts @@ -0,0 +1,43 @@ +/** + * Copyright (c) 2018 The xterm.js authors. All rights reserved. + * @license MIT + */ + +export function initControlBar(): void { + // Sidebar resize handling + const sidebar = document.getElementById('sidebar'); + const resizeHandleH = document.getElementById('sidebar-resize-handle-horizontal'); + const resizeHandleV = document.getElementById('sidebar-resize-handle-vertical'); + const resizeHandleCorner = document.getElementById('sidebar-resize-handle-corner'); + let resizeMode: 'none' | 'horizontal' | 'vertical' | 'corner' = 'none'; + + function startResize(mode: 'horizontal' | 'vertical' | 'corner', e: MouseEvent): void { + resizeMode = mode; + document.body.style.cursor = mode === 'horizontal' ? 'ew-resize' : mode === 'vertical' ? 'ns-resize' : 'nesw-resize'; + document.body.style.userSelect = 'none'; + e.preventDefault(); + } + + resizeHandleH.addEventListener('mousedown', (e: MouseEvent) => startResize('horizontal', e)); + resizeHandleV.addEventListener('mousedown', (e: MouseEvent) => startResize('vertical', e)); + resizeHandleCorner.addEventListener('mousedown', (e: MouseEvent) => startResize('corner', e)); + + document.addEventListener('mousemove', (e: MouseEvent) => { + if (resizeMode === 'none') return; + if (resizeMode === 'horizontal' || resizeMode === 'corner') { + const newWidth = window.innerWidth - e.clientX - 10; + sidebar.style.width = `${Math.max(200, newWidth)}px`; + } + if (resizeMode === 'vertical' || resizeMode === 'corner') { + const rect = sidebar.getBoundingClientRect(); + const newHeight = e.clientY - rect.top; + sidebar.style.height = `${Math.max(100, newHeight)}px`; + } + }); + + document.addEventListener('mouseup', () => { + resizeMode = 'none'; + document.body.style.cursor = ''; + document.body.style.userSelect = ''; + }); +} diff --git a/demo/index.html b/demo/index.html index 99ed7e9f..b943a7ae 100644 --- a/demo/index.html +++ b/demo/index.html @@ -12,19 +12,25 @@ -

xterm.js: A terminal for the web

+
-
-
- - - - - -
+ -
-
- - -