@termuijs/core 0.1.4 → 0.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +2210 -460
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +698 -187
- package/dist/index.d.ts +698 -187
- package/dist/index.js +2182 -453
- package/dist/index.js.map +1 -1
- package/package.json +14 -10
- package/LICENSE +0 -21
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/style/Color.ts","../src/utils/ansi.ts","../src/terminal/Terminal.ts","../src/terminal/Screen.ts","../src/terminal/Renderer.ts","../src/terminal/LayerManager.ts","../src/terminal/env-caps.ts","../src/terminal/ascii-map.ts","../src/events/types.ts","../src/input/KeyMap.ts","../src/input/MouseParser.ts","../src/events/EventEmitter.ts","../src/input/InputParser.ts","../src/style/Style.ts","../src/style/Border.ts","../src/layout/LayoutEngine.ts","../src/layout/Rect.ts","../src/layout/ConstraintLayout.ts","../src/events/FocusManager.ts","../src/style/symbols.ts","../src/terminal/TestBackend.ts","../src/app/Fallback.ts","../src/app/App.ts","../src/utils/unicode.ts"],"sourcesContent":["// ─────────────────────────────────────────────────────\n// @termuijs/core — Color types and color profile detection\n// ─────────────────────────────────────────────────────\n\n/**\n * Supported color depth levels, ordered from least to most capable.\n */\nexport enum ColorDepth {\n /** No color support (e.g. NO_COLOR env var set) */\n None = 0,\n /** 4-bit, 16 colors (standard ANSI) */\n Basic = 4,\n /** 8-bit, 256 colors */\n Ansi256 = 8,\n /** 24-bit, 16.7 million colors (true color) */\n TrueColor = 24,\n}\n\n/**\n * Represents a color value in the terminal.\n * Supports named ANSI colors, 256-color palette, and RGB true color.\n */\nexport type Color =\n | { type: 'named'; name: NamedColor }\n | { type: 'ansi256'; code: number }\n | { type: 'rgb'; r: number; g: number; b: number }\n | { type: 'hex'; hex: string }\n | { type: 'none' };\n\nexport type NamedColor =\n | 'black' | 'red' | 'green' | 'yellow'\n | 'blue' | 'magenta' | 'cyan' | 'white'\n | 'brightBlack' | 'brightRed' | 'brightGreen' | 'brightYellow'\n | 'brightBlue' | 'brightMagenta' | 'brightCyan' | 'brightWhite';\n\n/** Maps named colors to their ANSI 4-bit foreground code offsets (30-37, 90-97). */\nconst NAMED_TO_ANSI: Record<NamedColor, number> = {\n black: 0, red: 1, green: 2, yellow: 3,\n blue: 4, magenta: 5, cyan: 6, white: 7,\n brightBlack: 8, brightRed: 9, brightGreen: 10, brightYellow: 11,\n brightBlue: 12, brightMagenta: 13, brightCyan: 14, brightWhite: 15,\n};\n\n/** Maps named colors to approximate RGB for downgrading. */\nconst NAMED_TO_RGB: Record<NamedColor, [number, number, number]> = {\n black: [0, 0, 0], red: [170, 0, 0], green: [0, 170, 0], yellow: [170, 170, 0],\n blue: [0, 0, 170], magenta: [170, 0, 170], cyan: [0, 170, 170], white: [170, 170, 170],\n brightBlack: [85, 85, 85], brightRed: [255, 85, 85], brightGreen: [85, 255, 85], brightYellow: [255, 255, 85],\n brightBlue: [85, 85, 255], brightMagenta: [255, 85, 255], brightCyan: [85, 255, 255], brightWhite: [255, 255, 255],\n};\n\n/**\n * Parse a color string into a Color object.\n *\n * Accepts:\n * - Named colors: 'red', 'brightBlue', etc.\n * - Hex: '#ff0000', '#f00'\n * - RGB: 'rgb(255, 0, 0)'\n * - ANSI 256: 'ansi256(196)'\n */\nexport function parseColor(input: string): Color {\n if (input === 'none' || input === '') {\n return { type: 'none' };\n }\n\n // Named color\n if (input in NAMED_TO_ANSI) {\n return { type: 'named', name: input as NamedColor };\n }\n\n // Hex color\n if (input.startsWith('#')) {\n let hex = input.slice(1);\n if (hex.length === 3) {\n hex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2];\n }\n if (hex.length === 6 && /^[0-9a-fA-F]{6}$/.test(hex)) {\n return { type: 'hex', hex: '#' + hex.toLowerCase() };\n }\n // Invalid hex — return none instead of crashing\n return { type: 'none' };\n }\n\n // RGB color\n const rgbMatch = input.match(/^rgb\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*\\)$/);\n if (rgbMatch) {\n const r = Math.min(255, parseInt(rgbMatch[1], 10));\n const g = Math.min(255, parseInt(rgbMatch[2], 10));\n const b = Math.min(255, parseInt(rgbMatch[3], 10));\n return { type: 'rgb', r, g, b };\n }\n\n // ANSI 256\n const ansi256Match = input.match(/^ansi256\\(\\s*(\\d{1,3})\\s*\\)$/);\n if (ansi256Match) {\n const code = Math.min(255, parseInt(ansi256Match[1], 10));\n return { type: 'ansi256', code };\n }\n\n // Unknown format — return none instead of crashing\n return { type: 'none' };\n}\n\n/**\n * Convert any Color to its RGB representation.\n */\nexport function colorToRgb(color: Color): [number, number, number] {\n switch (color.type) {\n case 'none':\n return [0, 0, 0];\n case 'named':\n return NAMED_TO_RGB[color.name];\n case 'rgb':\n return [color.r, color.g, color.b];\n case 'hex': {\n const hex = color.hex.slice(1);\n return [\n parseInt(hex.slice(0, 2), 16),\n parseInt(hex.slice(2, 4), 16),\n parseInt(hex.slice(4, 6), 16),\n ];\n }\n case 'ansi256':\n return ansi256ToRgb(color.code);\n }\n}\n\n/**\n * Convert an ANSI 256 code to approximate RGB.\n */\nfunction ansi256ToRgb(code: number): [number, number, number] {\n // Standard colors (0-15) — use named mapping\n if (code < 16) {\n const names = Object.keys(NAMED_TO_RGB) as NamedColor[];\n return NAMED_TO_RGB[names[code]];\n }\n // Extended 216-color cube (16-231)\n if (code < 232) {\n const idx = code - 16;\n const b = (idx % 6) * 51;\n const g = (Math.floor(idx / 6) % 6) * 51;\n const r = Math.floor(idx / 36) * 51;\n return [r, g, b];\n }\n // Grayscale ramp (232-255)\n const gray = (code - 232) * 10 + 8;\n return [gray, gray, gray];\n}\n\n/**\n * Find the nearest ANSI 256 color code for a given RGB.\n */\nfunction rgbToAnsi256(r: number, g: number, b: number): number {\n // Check if it's a grayscale\n if (r === g && g === b) {\n if (r < 8) return 16;\n if (r > 248) return 231;\n return Math.round((r - 8) / 247 * 24) + 232;\n }\n return 16\n + 36 * Math.round(r / 255 * 5)\n + 6 * Math.round(g / 255 * 5)\n + Math.round(b / 255 * 5);\n}\n\n/**\n * Find the nearest ANSI 4-bit basic color for a given RGB.\n */\nfunction rgbToBasic(r: number, g: number, b: number): number {\n let minDist = Infinity;\n let best = 0;\n const names = Object.keys(NAMED_TO_RGB) as NamedColor[];\n for (let i = 0; i < names.length; i++) {\n const [cr, cg, cb] = NAMED_TO_RGB[names[i]];\n const dist = (r - cr) ** 2 + (g - cg) ** 2 + (b - cb) ** 2;\n if (dist < minDist) {\n minDist = dist;\n best = i;\n }\n }\n return best;\n}\n\n/**\n * Detect the terminal's color depth from environment variables.\n */\nexport function detectColorDepth(): ColorDepth {\n const env = process.env;\n\n // Respect NO_COLOR convention (https://no-color.org/)\n if (env['NO_COLOR'] !== undefined) {\n return ColorDepth.None;\n }\n\n // Force color via FORCE_COLOR\n if (env['FORCE_COLOR'] !== undefined) {\n const level = parseInt(env['FORCE_COLOR'], 10);\n if (level === 0) return ColorDepth.None;\n if (level === 1) return ColorDepth.Basic;\n if (level === 2) return ColorDepth.Ansi256;\n if (level >= 3) return ColorDepth.TrueColor;\n }\n\n // Check COLORTERM for true color\n const colorterm = env['COLORTERM'];\n if (colorterm === 'truecolor' || colorterm === '24bit') {\n return ColorDepth.TrueColor;\n }\n\n // Check TERM for 256 color\n const term = env['TERM'] || '';\n if (term === 'dumb') {\n return ColorDepth.None;\n }\n if (term.includes('256color') || term.includes('256')) {\n return ColorDepth.Ansi256;\n }\n\n // Check for common color-capable terminals\n if (env['TERM_PROGRAM'] === 'iTerm.app' || env['TERM_PROGRAM'] === 'Hyper') {\n return ColorDepth.TrueColor;\n }\n\n // Default to basic if stdout is a TTY\n if (process.stdout?.isTTY) {\n return ColorDepth.Basic;\n }\n\n return ColorDepth.None;\n}\n\n/**\n * Generate the ANSI escape codes for a foreground color at the given depth.\n */\nexport function colorToAnsiFg(color: Color, depth: ColorDepth): string {\n if (color.type === 'none' || depth === ColorDepth.None) return '';\n const [r, g, b] = colorToRgb(color);\n\n switch (depth) {\n case ColorDepth.TrueColor:\n return `\\x1b[38;2;${r};${g};${b}m`;\n case ColorDepth.Ansi256:\n return `\\x1b[38;5;${rgbToAnsi256(r, g, b)}m`;\n case ColorDepth.Basic: {\n const idx = rgbToBasic(r, g, b);\n return idx < 8 ? `\\x1b[${30 + idx}m` : `\\x1b[${90 + idx - 8}m`;\n }\n default:\n return '';\n }\n}\n\n/**\n * Generate the ANSI escape codes for a background color at the given depth.\n */\nexport function colorToAnsiBg(color: Color, depth: ColorDepth): string {\n if (color.type === 'none' || depth === ColorDepth.None) return '';\n const [r, g, b] = colorToRgb(color);\n\n switch (depth) {\n case ColorDepth.TrueColor:\n return `\\x1b[48;2;${r};${g};${b}m`;\n case ColorDepth.Ansi256:\n return `\\x1b[48;5;${rgbToAnsi256(r, g, b)}m`;\n case ColorDepth.Basic: {\n const idx = rgbToBasic(r, g, b);\n return idx < 8 ? `\\x1b[${40 + idx}m` : `\\x1b[${100 + idx - 8}m`;\n }\n default:\n return '';\n }\n}\n\n// ── WCAG Contrast Utilities ──────────────────────────\n\n/**\n * Compute relative luminance per WCAG 2.1.\n * Returns value in [0, 1] where 0 = black, 1 = white.\n */\nexport function relativeLuminance(color: Color): number {\n const [r, g, b] = colorToRgb(color);\n const linearize = (c: number): number => {\n const sRGB = c / 255;\n return sRGB <= 0.03928 ? sRGB / 12.92 : Math.pow((sRGB + 0.055) / 1.055, 2.4);\n };\n return 0.2126 * linearize(r) + 0.7152 * linearize(g) + 0.0722 * linearize(b);\n}\n\n/**\n * Compute WCAG 2.1 contrast ratio between foreground and background colors.\n * Returns value in [1, 21] where 21 is maximum contrast (black on white).\n */\nexport function contrastRatio(fg: Color, bg: Color): number {\n const l1 = relativeLuminance(fg);\n const l2 = relativeLuminance(bg);\n const lighter = Math.max(l1, l2);\n const darker = Math.min(l1, l2);\n return (lighter + 0.05) / (darker + 0.05);\n}\n\n/**\n * Determine WCAG 2.1 conformance level for a contrast ratio.\n * @param ratio Result of contrastRatio()\n * @param large True if text is large (18pt+ regular or 14pt+ bold). Default: false.\n */\nexport function wcagLevel(ratio: number, large = false): 'AAA' | 'AA' | 'A' | 'fail' {\n if (large) {\n if (ratio >= 4.5) return 'AAA';\n if (ratio >= 3.0) return 'AA';\n return 'fail';\n }\n if (ratio >= 7.0) return 'AAA';\n if (ratio >= 4.5) return 'AA';\n if (ratio >= 3.0) return 'A';\n return 'fail';\n}\n\nexport interface ContrastFailure {\n /** Description of the color pair, e.g. 'fg on bg' */\n pair: string;\n ratio: number;\n level: 'A' | 'fail';\n required: 'AA';\n}\n\n/**\n * Validate contrast for key pairs in a theme (hex string map).\n * Checks: fg/bg, primary/bg, error/bg, success/bg, warning/bg, muted/bg.\n * Returns failures (pairs below AA = 4.5:1 for normal text).\n */\nexport function validateThemeContrast(theme: Record<string, string>): ContrastFailure[] {\n const failures: ContrastFailure[] = [];\n const bg = theme['bg'];\n if (!bg) return failures;\n\n const bgColor = parseColor(bg);\n const pairs: Array<[string, string | undefined]> = [\n ['fg on bg', theme['fg']],\n ['primary on bg', theme['primary']],\n ['error on bg', theme['error']],\n ['success on bg', theme['success']],\n ['warning on bg', theme['warning']],\n ['muted on bg', theme['muted']],\n ];\n\n for (const [label, hex] of pairs) {\n if (!hex) continue;\n const fgColor = parseColor(hex);\n const ratio = contrastRatio(fgColor, bgColor);\n const level = wcagLevel(ratio);\n if (level !== 'AAA' && level !== 'AA') {\n failures.push({ pair: label, ratio: Math.round(ratio * 100) / 100, level: level as 'A' | 'fail', required: 'AA' });\n }\n }\n\n return failures;\n}\n","// ─────────────────────────────────────────────────────\n// @termuijs/core — ANSI escape sequence helpers\n// ─────────────────────────────────────────────────────\n\n/** CSI (Control Sequence Introducer) prefix */\nexport const CSI = '\\x1b[';\n/** OSC (Operating System Command) prefix */\nexport const OSC = '\\x1b]';\n/** ESC character */\nexport const ESC = '\\x1b';\n\n// ── Cursor Control ──────────────────────────────────\n\nexport const hideCursor = `${CSI}?25l`;\nexport const showCursor = `${CSI}?25h`;\nexport const saveCursorPosition = `${CSI}s`;\nexport const restoreCursorPosition = `${CSI}u`;\n\nexport function moveTo(col: number, row: number): string {\n return `${CSI}${row + 1};${col + 1}H`;\n}\n\nexport function moveUp(n = 1): string { return `${CSI}${n}A`; }\nexport function moveDown(n = 1): string { return `${CSI}${n}B`; }\nexport function moveRight(n = 1): string { return `${CSI}${n}C`; }\nexport function moveLeft(n = 1): string { return `${CSI}${n}D`; }\n\n// ── Screen Control ──────────────────────────────────\n\nexport const clearScreen = `${CSI}2J`;\nexport const clearLine = `${CSI}2K`;\nexport const clearLineToEnd = `${CSI}0K`;\nexport const clearLineToStart = `${CSI}1K`;\nexport const clearDown = `${CSI}J`;\nexport const clearUp = `${CSI}1J`;\n\n// ── Alternate Screen Buffer ─────────────────────────\n\nexport const enterAltScreen = `${CSI}?1049h`;\nexport const exitAltScreen = `${CSI}?1049l`;\n\n// ── Synchronized Output (CSI 2026) ──────────────────\n\n/** Begin synchronized update — terminal holds display until end marker */\nexport const beginSyncUpdate = `${CSI}?2026h`;\n/** End synchronized update — terminal flushes all pending changes atomically */\nexport const endSyncUpdate = `${CSI}?2026l`;\n\n// ── Mouse Tracking ──────────────────────────────────\n\n/** Enable SGR mouse tracking (most compatible modern mode) */\nexport const enableMouse = `${CSI}?1000h${CSI}?1002h${CSI}?1006h`;\n/** Disable mouse tracking */\nexport const disableMouse = `${CSI}?1000l${CSI}?1002l${CSI}?1006l`;\n\n// ── Bracketed Paste ─────────────────────────────────\n\nexport const enableBracketedPaste = `${CSI}?2004h`;\nexport const disableBracketedPaste = `${CSI}?2004l`;\n\n// ── Text Styling ────────────────────────────────────\n\nexport const reset = `${CSI}0m`;\nexport const bold = `${CSI}1m`;\nexport const dim = `${CSI}2m`;\nexport const italic = `${CSI}3m`;\nexport const underline = `${CSI}4m`;\nexport const blink = `${CSI}5m`;\nexport const inverse = `${CSI}7m`;\nexport const strikethrough = `${CSI}9m`;\n\nexport const resetBold = `${CSI}22m`;\nexport const resetDim = `${CSI}22m`;\nexport const resetItalic = `${CSI}23m`;\nexport const resetUnderline = `${CSI}24m`;\nexport const resetBlink = `${CSI}25m`;\nexport const resetInverse = `${CSI}27m`;\nexport const resetStrikethrough = `${CSI}29m`;\n\n// ── Scrolling Region ────────────────────────────────\n\nexport function setScrollRegion(top: number, bottom: number): string {\n return `${CSI}${top + 1};${bottom + 1}r`;\n}\nexport const resetScrollRegion = `${CSI}r`;\n\n// ── Title ───────────────────────────────────────────\n\nexport function setTitle(title: string): string {\n return `${OSC}0;${title}\\x07`;\n}\n\n// ── Clipboard ───────────────────────────────────────\n\n/**\n * Write text to the system clipboard via OSC 52.\n * Supported by: xterm, iTerm2, Kitty, WezTerm, Alacritty, Windows Terminal.\n * @param text Plain text to copy to clipboard\n * @param stdout Target stream (default: process.stdout)\n */\nexport function writeClipboard(text: string, stdout: NodeJS.WriteStream = process.stdout): void {\n const encoded = Buffer.from(text, 'utf8').toString('base64');\n stdout.write(`${OSC}52;c;${encoded}\\x07`);\n}\n","// ─────────────────────────────────────────────────────\n// @termuijs/core — Terminal adapter\n// ─────────────────────────────────────────────────────\n\nimport { ColorDepth, detectColorDepth } from '../style/Color.js';\nimport * as ansi from '../utils/ansi.js';\n\nexport interface TerminalOptions {\n /** Override stdout stream (useful for testing) */\n stdout?: NodeJS.WriteStream;\n /** Override stdin stream (useful for testing) */\n stdin?: NodeJS.ReadStream;\n /** Force a specific color depth */\n colorDepth?: ColorDepth;\n /** Enable mouse tracking */\n mouse?: boolean;\n /** Use alternate screen buffer for full-screen apps */\n altScreen?: boolean;\n}\n\n/**\n * Terminal adapter — wraps process.stdout/stdin and manages\n * terminal state (raw mode, cursor, mouse, alternate screen).\n */\nexport class Terminal {\n readonly stdout: NodeJS.WriteStream;\n readonly stdin: NodeJS.ReadStream;\n readonly colorDepth: ColorDepth;\n\n private _cols: number;\n private _rows: number;\n private _isRawMode = false;\n private _isAltScreen = false;\n private _isMouseEnabled = false;\n private _resizeHandlers: Array<(cols: number, rows: number) => void> = [];\n private _cleanupHandlers: Array<() => void> = [];\n private _originalRawMode: boolean | undefined;\n\n // Stored handler references for proper cleanup\n private _resizeHandler: (() => void) | null = null;\n private _exitHandler: (() => void) | null = null;\n private _sigintHandler: (() => void) | null = null;\n private _sigtermHandler: (() => void) | null = null;\n private _uncaughtExceptionHandler: ((err: Error) => void) | null = null;\n private _unhandledRejectionHandler: (() => void) | null = null;\n private _restored = false;\n\n constructor(options: TerminalOptions = {}) {\n this.stdout = options.stdout ?? process.stdout;\n this.stdin = options.stdin ?? process.stdin;\n this.colorDepth = options.colorDepth ?? detectColorDepth();\n\n this._cols = this.stdout.columns ?? 80;\n this._rows = this.stdout.rows ?? 24;\n\n // Listen for terminal resize (store ref for cleanup)\n this._resizeHandler = () => {\n this._cols = this.stdout.columns ?? 80;\n this._rows = this.stdout.rows ?? 24;\n for (const handler of this._resizeHandlers) {\n handler(this._cols, this._rows);\n }\n };\n this.stdout.on('resize', this._resizeHandler);\n\n // Set up cleanup on process exit\n this._setupCleanup();\n }\n\n /** Current terminal width in columns */\n get cols(): number { return this._cols; }\n /** Current terminal height in rows */\n get rows(): number { return this._rows; }\n\n /** Whether stdin is a TTY (interactive) */\n isInteractive(): boolean {\n return Boolean(this.stdin.isTTY) && !process.env['CI'];\n }\n\n /** Whether the terminal supports raw mode */\n supportsRawMode(): boolean {\n return Boolean(this.stdin.isTTY && typeof this.stdin.setRawMode === 'function');\n }\n\n // ── Raw Mode ────────────────────────────────────────\n\n enterRawMode(): void {\n if (this._isRawMode || !this.supportsRawMode()) return;\n this._originalRawMode = this.stdin.isRaw;\n this.stdin.setRawMode(true);\n this.stdin.resume();\n this._isRawMode = true;\n }\n\n exitRawMode(): void {\n if (!this._isRawMode) return;\n this.stdin.setRawMode(this._originalRawMode ?? false);\n this.stdin.pause();\n this._isRawMode = false;\n }\n\n // ── Alternate Screen ────────────────────────────────\n\n enterAltScreen(): void {\n if (this._isAltScreen) return;\n this.write(ansi.enterAltScreen);\n this._isAltScreen = true;\n }\n\n exitAltScreen(): void {\n if (!this._isAltScreen) return;\n this.write(ansi.exitAltScreen);\n this._isAltScreen = false;\n }\n\n // ── Mouse ───────────────────────────────────────────\n\n enableMouse(): void {\n if (this._isMouseEnabled) return;\n this.write(ansi.enableMouse);\n this._isMouseEnabled = true;\n }\n\n disableMouse(): void {\n if (!this._isMouseEnabled) return;\n this.write(ansi.disableMouse);\n this._isMouseEnabled = false;\n }\n\n // ── Cursor ──────────────────────────────────────────\n\n hideCursor(): void { this.write(ansi.hideCursor); }\n showCursor(): void { this.write(ansi.showCursor); }\n\n // ── Output ──────────────────────────────────────────\n\n write(data: string): void {\n this.stdout.write(data);\n }\n\n // ── Resize ──────────────────────────────────────────\n\n onResize(handler: (cols: number, rows: number) => void): () => void {\n this._resizeHandlers.push(handler);\n return () => {\n const idx = this._resizeHandlers.indexOf(handler);\n if (idx >= 0) this._resizeHandlers.splice(idx, 1);\n };\n }\n\n // ── Cleanup ─────────────────────────────────────────\n\n /**\n * Restore terminal to its original state.\n * Removes all process signal handlers to prevent leaks.\n * Called automatically on SIGINT, SIGTERM, process exit.\n */\n restore(): void {\n if (this._restored) return; // Prevent double-restore\n this._restored = true;\n\n // Remove process-level signal handlers to prevent leaks\n if (this._exitHandler) process.off('exit', this._exitHandler);\n if (this._sigintHandler) process.off('SIGINT', this._sigintHandler);\n if (this._sigtermHandler) process.off('SIGTERM', this._sigtermHandler);\n if (this._uncaughtExceptionHandler) {\n process.off('uncaughtException', this._uncaughtExceptionHandler);\n this._uncaughtExceptionHandler = null;\n }\n if (this._unhandledRejectionHandler) {\n process.off('unhandledRejection', this._unhandledRejectionHandler);\n this._unhandledRejectionHandler = null;\n }\n\n // Remove resize listener\n if (this._resizeHandler) {\n this.stdout.off('resize', this._resizeHandler);\n }\n\n this.disableMouse();\n this.exitAltScreen();\n this.exitRawMode();\n this.showCursor();\n this.write(ansi.reset);\n }\n\n /**\n * Register a custom cleanup handler that runs on terminal restore.\n */\n onCleanup(handler: () => void): void {\n this._cleanupHandlers.push(handler);\n }\n\n private _setupCleanup(): void {\n const runCleanupHandlers = () => {\n for (const handler of this._cleanupHandlers) {\n try { handler(); } catch { /* swallow */ }\n }\n this.restore();\n };\n\n this._exitHandler = runCleanupHandlers;\n this._sigintHandler = () => { runCleanupHandlers(); process.exit(130); };\n this._sigtermHandler = () => { runCleanupHandlers(); process.exit(143); };\n\n process.on('exit', this._exitHandler);\n process.on('SIGINT', this._sigintHandler);\n process.on('SIGTERM', this._sigtermHandler);\n\n this._uncaughtExceptionHandler = (err: Error) => {\n this.restore();\n process.exit(1);\n };\n this._unhandledRejectionHandler = () => {\n this.restore();\n process.exit(1);\n };\n // Use .on() (not .once()) so restore() can explicitly remove these handlers\n // via process.off(). With .once(), the reference is removed after first fire,\n // making process.off() in restore() a no-op on subsequent exceptions.\n process.on('uncaughtException', this._uncaughtExceptionHandler);\n process.on('unhandledRejection', this._unhandledRejectionHandler);\n }\n}\n","// ─────────────────────────────────────────────────────\n// @termuijs/core — Screen buffer (double-buffered cell grid)\n// ─────────────────────────────────────────────────────\n\nimport type { Color } from '../style/Color.js';\n\nconst EMPTY_COLOR: Color = Object.freeze({ type: 'none' } as const);\n\n/**\n * A single cell in the terminal grid.\n */\nexport interface Cell {\n /** The character displayed (single grapheme cluster) */\n char: string;\n /** Foreground color */\n fg: Color;\n /** Background color */\n bg: Color;\n /** Bold text */\n bold: boolean;\n /** Italic text */\n italic: boolean;\n /** Underline text */\n underline: boolean;\n /** Dim text */\n dim: boolean;\n /** Strikethrough text */\n strikethrough: boolean;\n /** Inverse colors */\n inverse: boolean;\n /**\n * Visual width of this cell.\n * - 1 for normal characters\n * - 2 for wide chars (CJK/emoji) — the next cell is a \"continuation\" cell\n * - 0 for continuation cells (second half of a wide char)\n */\n width: number;\n}\n\n/** Create a blank cell with default attributes */\nexport function emptyCell(): Cell {\n return {\n char: ' ',\n fg: EMPTY_COLOR,\n bg: EMPTY_COLOR,\n bold: false,\n italic: false,\n underline: false,\n dim: false,\n strikethrough: false,\n inverse: false,\n width: 1,\n };\n}\n\n/** Reset a cell in-place to default attributes (avoids allocation). */\nexport function resetCell(cell: Cell): void {\n cell.char = ' ';\n cell.fg = EMPTY_COLOR;\n cell.bg = EMPTY_COLOR;\n cell.bold = false;\n cell.italic = false;\n cell.underline = false;\n cell.dim = false;\n cell.strikethrough = false;\n cell.inverse = false;\n cell.width = 1;\n}\n\n/** Check if two cells are visually identical */\nexport function cellsEqual(a: Cell, b: Cell): boolean {\n return (\n a.char === b.char &&\n a.bold === b.bold &&\n a.italic === b.italic &&\n a.underline === b.underline &&\n a.dim === b.dim &&\n a.strikethrough === b.strikethrough &&\n a.inverse === b.inverse &&\n a.width === b.width &&\n colorsEqual(a.fg, b.fg) &&\n colorsEqual(a.bg, b.bg)\n );\n}\n\nfunction colorsEqual(a: Color, b: Color): boolean {\n if (a.type !== b.type) return false;\n switch (a.type) {\n case 'none': return true;\n case 'named': return a.name === (b as typeof a).name;\n case 'ansi256': return a.code === (b as typeof a).code;\n case 'rgb': return a.r === (b as typeof a).r && a.g === (b as typeof a).g && a.b === (b as typeof a).b;\n case 'hex': return a.hex === (b as typeof a).hex;\n }\n}\n\n/**\n * Double-buffered 2D cell grid for the terminal.\n *\n * - `front` = what's currently displayed on screen\n * - `back` = what we're building for the next frame\n *\n * After rendering, the renderer diffs `front` vs `back` and only emits\n * changes, then swaps the buffers.\n */\nexport class Screen {\n private _cols: number;\n private _rows: number;\n front: Cell[][];\n back: Cell[][];\n\n /**\n * Stack of clipping regions. When non-empty, setCell/writeString\n * only write to cells within the topmost clip rectangle.\n */\n private _clipStack: Array<{ x: number; y: number; width: number; height: number }> = [];\n\n constructor(cols: number, rows: number) {\n this._cols = cols;\n this._rows = rows;\n this.front = this._createGrid(cols, rows);\n this.back = this._createGrid(cols, rows);\n }\n\n get cols(): number { return this._cols; }\n get rows(): number { return this._rows; }\n\n /**\n * Push a clipping region onto the stack.\n * All subsequent setCell/writeString calls will be constrained\n * to cells within this rectangle. Clips are intersected with\n * any parent clip already on the stack (nested clipping).\n */\n pushClip(region: { x: number; y: number; width: number; height: number }): void {\n if (this._clipStack.length > 0) {\n // Intersect with the current clip\n const parent = this._clipStack[this._clipStack.length - 1];\n const x = Math.max(region.x, parent.x);\n const y = Math.max(region.y, parent.y);\n const right = Math.min(region.x + region.width, parent.x + parent.width);\n const bottom = Math.min(region.y + region.height, parent.y + parent.height);\n if (right <= x || bottom <= y) {\n // Fully clipped — push a zero-size region\n this._clipStack.push({ x: 0, y: 0, width: 0, height: 0 });\n } else {\n this._clipStack.push({ x, y, width: right - x, height: bottom - y });\n }\n } else {\n this._clipStack.push({ ...region });\n }\n }\n\n /**\n * Pop the most recent clipping region from the stack.\n */\n popClip(): void {\n this._clipStack.pop();\n }\n\n /**\n * Get the current active clip region, or null if no clip is active.\n */\n get activeClip(): { x: number; y: number; width: number; height: number } | null {\n return this._clipStack.length > 0\n ? this._clipStack[this._clipStack.length - 1]\n : null;\n }\n\n /**\n * Write a cell to the back buffer at position (col, row).\n */\n setCell(col: number, row: number, cell: Partial<Cell>): void {\n // Floor to integers — layout engine may produce fractional values\n col = Math.floor(col);\n row = Math.floor(row);\n // Use positive range check (NaN fails >= 0, preventing NaN indices)\n if (!(col >= 0 && col < this._cols && row >= 0 && row < this._rows)) return;\n\n // Enforce clip region\n if (this._clipStack.length > 0) {\n const clip = this._clipStack[this._clipStack.length - 1];\n if (col < clip.x || col >= clip.x + clip.width ||\n row < clip.y || row >= clip.y + clip.height) {\n return; // Outside active clip — silently discard\n }\n }\n\n const existing = this.back[row][col];\n Object.assign(existing, cell);\n }\n\n /**\n * Write a string to the back buffer starting at (col, row).\n * Applies the provided style attributes to each character.\n */\n writeString(\n col: number,\n row: number,\n str: string,\n style: Partial<Omit<Cell, 'char' | 'width'>> = {},\n ): void {\n row = Math.floor(row);\n col = Math.floor(col);\n if (!(row >= 0 && row < this._rows)) return;\n\n let x = col;\n for (const char of str) {\n if (x >= this._cols) break;\n if (x < 0) { x++; continue; }\n\n const cp = char.codePointAt(0)!;\n const isWide = this._isWideCodePoint(cp);\n const width = isWide ? 2 : 1;\n\n this.setCell(x, row, {\n char,\n width,\n ...style,\n });\n\n // If wide char, mark the next cell as a continuation\n if (isWide && x + 1 < this._cols) {\n this.setCell(x + 1, row, {\n char: '',\n width: 0,\n ...style,\n });\n x += 2;\n } else {\n x += 1;\n }\n }\n }\n\n /**\n * Clear the back buffer to all empty cells.\n */\n clear(): void {\n this._clipStack = [];\n for (let r = 0; r < this._rows; r++) {\n for (let c = 0; c < this._cols; c++) {\n resetCell(this.back[r][c]);\n }\n }\n }\n\n /**\n * Swap front and back buffers. Called after rendering diffs.\n */\n swap(): void {\n const temp = this.front;\n this.front = this.back;\n this.back = temp;\n }\n\n /**\n * Resize the screen. Clears both buffers.\n */\n resize(cols: number, rows: number): void {\n this._cols = cols;\n this._rows = rows;\n this.front = this._createGrid(cols, rows);\n this.back = this._createGrid(cols, rows);\n }\n\n /**\n * Clear the front buffer (marks everything as \"needs redraw\").\n */\n invalidate(): void {\n for (let r = 0; r < this._rows; r++) {\n for (let c = 0; c < this._cols; c++) {\n this.front[r][c] = { ...emptyCell(), char: '\\0' }; // force diff\n }\n }\n }\n\n private _createGrid(cols: number, rows: number): Cell[][] {\n const grid: Cell[][] = [];\n for (let r = 0; r < rows; r++) {\n const row: Cell[] = [];\n for (let c = 0; c < cols; c++) {\n row.push(emptyCell());\n }\n grid.push(row);\n }\n return grid;\n }\n\n private _isWideCodePoint(cp: number): boolean {\n return (\n (cp >= 0x4E00 && cp <= 0x9FFF) ||\n (cp >= 0x3400 && cp <= 0x4DBF) ||\n (cp >= 0xF900 && cp <= 0xFAFF) ||\n (cp >= 0xAC00 && cp <= 0xD7AF) ||\n (cp >= 0x30A0 && cp <= 0x30FF) ||\n (cp >= 0x3000 && cp <= 0x303F) ||\n (cp >= 0x3040 && cp <= 0x309F) ||\n (cp >= 0xFF01 && cp <= 0xFF60) ||\n (cp >= 0xFFE0 && cp <= 0xFFE6) ||\n (cp >= 0x1F600 && cp <= 0x1F64F) ||\n (cp >= 0x1F300 && cp <= 0x1F5FF) ||\n (cp >= 0x1F680 && cp <= 0x1F6FF) ||\n (cp >= 0x1F900 && cp <= 0x1F9FF) ||\n (cp >= 0x20000 && cp <= 0x2A6DF)\n );\n }\n}\n","// ─────────────────────────────────────────────────────\n// @termuijs/core — Differential Renderer\n// ─────────────────────────────────────────────────────\n\nimport type { Terminal } from './Terminal.js';\nimport { type Cell, cellsEqual, type Screen } from './Screen.js';\nimport { type ColorDepth, colorToAnsiFg, colorToAnsiBg } from '../style/Color.js';\nimport { moveTo, beginSyncUpdate, endSyncUpdate, reset as ansiReset } from '../utils/ansi.js';\n\n/**\n * Differential renderer — compares front/back screen buffers and\n * outputs only the changed cells. Uses synchronized output (CSI 2026)\n * for atomic, flicker-free updates.\n */\nexport class Renderer {\n private _terminal: Terminal;\n private _screen: Screen;\n private _fps: number;\n private _frameTimer: ReturnType<typeof setInterval> | null = null;\n private _renderRequested = false;\n private _colorDepth: ColorDepth;\n private _onTick: (() => void) | null = null;\n\n constructor(terminal: Terminal, screen: Screen, fps = 30) {\n this._terminal = terminal;\n this._screen = screen;\n this._fps = fps;\n this._colorDepth = terminal.colorDepth;\n }\n\n /** Change the rendering frame rate cap */\n setFPS(fps: number): void {\n this._fps = fps;\n if (this._frameTimer) {\n this.stop();\n this.start(this._onTick ?? undefined);\n }\n }\n\n /** Start the render loop */\n start(onTick?: () => void): void {\n if (this._frameTimer) return;\n this._onTick = onTick ?? null;\n const interval = Math.floor(1000 / this._fps);\n this._frameTimer = setInterval(() => {\n this._onTick?.();\n if (this._renderRequested) {\n this._renderRequested = false;\n this._flush();\n }\n }, interval);\n }\n\n /** Stop the render loop */\n stop(): void {\n if (this._frameTimer) {\n clearInterval(this._frameTimer);\n this._frameTimer = null;\n }\n }\n\n /** Request a render on the next frame */\n requestFrame(): void {\n this._renderRequested = true;\n }\n\n /** Force an immediate render (bypass frame rate) */\n renderNow(): void {\n this._flush();\n }\n\n /**\n * Full-screen clear and redraw (first render or after resize).\n */\n fullRender(): void {\n this._screen.invalidate();\n this._flush();\n }\n\n /**\n * Core diff and flush: compare front vs back buffer,\n * emit only changed cells.\n */\n private _flush(): void {\n const { front, back, cols, rows } = this._screen;\n let output = beginSyncUpdate;\n let lastRow = -1;\n let lastCol = -1;\n\n for (let r = 0; r < rows; r++) {\n for (let c = 0; c < cols; c++) {\n const frontCell = front[r][c];\n const backCell = back[r][c];\n\n if (cellsEqual(frontCell, backCell)) continue;\n\n // Skip continuation cells (second half of wide chars)\n if (backCell.width === 0) continue;\n\n // Move cursor only if not already at the right position\n if (r !== lastRow || c !== lastCol) {\n output += moveTo(c, r);\n }\n\n output += this._renderCell(backCell);\n lastRow = r;\n lastCol = c + (backCell.width === 2 ? 2 : 1);\n }\n }\n\n output += ansiReset;\n output += endSyncUpdate;\n\n this._terminal.write(output);\n this._screen.swap();\n }\n\n /**\n * Generate the ANSI escape sequence to render a single cell.\n */\n private _renderCell(cell: Cell): string {\n let seq = '';\n\n // Reset before applying new attributes\n seq += ansiReset;\n\n // Apply text decorations\n if (cell.bold) seq += '\\x1b[1m';\n if (cell.dim) seq += '\\x1b[2m';\n if (cell.italic) seq += '\\x1b[3m';\n if (cell.underline) seq += '\\x1b[4m';\n if (cell.strikethrough) seq += '\\x1b[9m';\n if (cell.inverse) seq += '\\x1b[7m';\n\n // Apply colors\n seq += colorToAnsiFg(cell.fg, this._colorDepth);\n seq += colorToAnsiBg(cell.bg, this._colorDepth);\n\n // Write the character\n seq += cell.char || ' ';\n\n return seq;\n }\n}\n","// ─────────────────────────────────────────────────────\n// @termuijs/core — Layer Manager for overlay rendering\n// ─────────────────────────────────────────────────────\n\nimport type { Cell } from './Screen.js';\nimport { emptyCell, type Screen } from './Screen.js';\nimport type { Color } from '../style/Color.js';\nimport type { Rect } from '../layout/Rect.js';\n\n/**\n * A rendering layer. Each layer has its own cell grid and z-index.\n * Higher z-index layers render on top of lower ones during compositing.\n */\nexport interface Layer {\n /** Unique identifier for this layer */\n id: string;\n /** Stacking order — higher renders on top */\n zIndex: number;\n /** Cell grid (same dimensions as Screen) */\n cells: Cell[][];\n /** Whether this layer is visible */\n visible: boolean;\n /** Bounding box of cells written since last clear (null = nothing dirty) */\n dirtyRegion: Rect | null;\n}\n\n/**\n * Check if a cell is \"transparent\" (should show through to the layer below).\n * An empty cell with no explicit colors is considered transparent.\n */\nfunction isCellTransparent(cell: Cell): boolean {\n return (\n cell.char === ' ' &&\n cell.fg.type === 'none' &&\n cell.bg.type === 'none' &&\n !cell.bold &&\n !cell.italic &&\n !cell.underline &&\n !cell.dim &&\n !cell.strikethrough &&\n !cell.inverse\n );\n}\n\n/**\n * Manages multiple rendering layers for overlay support.\n *\n * The base layer (z=0) is the primary widget layer — always opaque.\n * Overlay layers (z>0) support transparency: only cells explicitly\n * written to them overwrite the base layer during compositing.\n *\n * Typical z-index values:\n * - 0: Base widget layer\n * - 10: Dropdown menus\n * - 100: Modal dialogs\n * - 1000: Toasts / notifications\n */\nexport class LayerManager {\n private _layers: Map<string, Layer> = new Map();\n private _cols: number;\n private _rows: number;\n\n constructor(cols: number, rows: number) {\n this._cols = cols;\n this._rows = rows;\n }\n\n get cols(): number { return this._cols; }\n get rows(): number { return this._rows; }\n\n /**\n * Create a new overlay layer.\n * @param id Unique identifier (e.g. 'modal', 'select-dropdown', 'toast')\n * @param zIndex Stacking order (higher = rendered on top)\n */\n createLayer(id: string, zIndex: number): Layer {\n if (this._layers.has(id)) {\n return this._layers.get(id)!;\n }\n\n const layer: Layer = {\n id,\n zIndex,\n cells: this._createGrid(),\n visible: true,\n dirtyRegion: null,\n };\n\n this._layers.set(id, layer);\n return layer;\n }\n\n /**\n * Remove an overlay layer and clean up its resources.\n */\n removeLayer(id: string): void {\n this._layers.delete(id);\n }\n\n /**\n * Get a layer by ID.\n */\n getLayer(id: string): Layer | undefined {\n return this._layers.get(id);\n }\n\n /**\n * Check if a layer exists.\n */\n hasLayer(id: string): boolean {\n return this._layers.has(id);\n }\n\n /**\n * Get all layers sorted by z-index (ascending).\n */\n getSortedLayers(): Layer[] {\n return Array.from(this._layers.values())\n .filter(l => l.visible)\n .sort((a, b) => a.zIndex - b.zIndex);\n }\n\n /**\n * Write a cell to a specific layer.\n */\n setCell(layerId: string, col: number, row: number, cell: Partial<Cell>): void {\n const layer = this._layers.get(layerId);\n if (!layer) return;\n\n col = Math.floor(col);\n row = Math.floor(row);\n if (!(col >= 0 && col < this._cols && row >= 0 && row < this._rows)) return;\n\n const existing = layer.cells[row][col];\n Object.assign(existing, cell);\n\n // Expand dirty region\n this._expandDirty(layer, col, row);\n }\n\n /**\n * Write a string to a specific layer at position (col, row).\n */\n writeString(\n layerId: string,\n col: number,\n row: number,\n str: string,\n style: Partial<Omit<Cell, 'char' | 'width'>> = {},\n ): void {\n const layer = this._layers.get(layerId);\n if (!layer) return;\n\n row = Math.floor(row);\n col = Math.floor(col);\n if (!(row >= 0 && row < this._rows)) return;\n\n let x = col;\n for (const char of str) {\n if (x >= this._cols) break;\n if (x < 0) { x++; continue; }\n\n this.setCell(layerId, x, row, { char, width: 1, ...style });\n x++;\n }\n }\n\n /**\n * Clear all cells in a specific layer.\n */\n clearLayer(id: string): void {\n const layer = this._layers.get(id);\n if (!layer) return;\n\n for (let r = 0; r < this._rows; r++) {\n for (let c = 0; c < this._cols; c++) {\n layer.cells[r][c] = emptyCell();\n }\n }\n layer.dirtyRegion = null;\n }\n\n /**\n * Clear all overlay layers.\n */\n clearAll(): void {\n for (const layer of this._layers.values()) {\n this.clearLayer(layer.id);\n }\n }\n\n /**\n * Composite all overlay layers onto the Screen's back buffer.\n * Layers are applied in z-index order (lowest first).\n * Transparent cells (empty with no colors) are skipped.\n */\n composite(screen: Screen): void {\n const sorted = this.getSortedLayers();\n\n for (const layer of sorted) {\n if (!layer.dirtyRegion) continue; // Nothing to composite\n\n const { x: dx, y: dy, width: dw, height: dh } = layer.dirtyRegion;\n\n for (let r = dy; r < dy + dh && r < this._rows; r++) {\n for (let c = dx; c < dx + dw && c < this._cols; c++) {\n const cell = layer.cells[r][c];\n if (isCellTransparent(cell)) continue;\n\n // Write non-transparent overlay cell to the screen's back buffer\n screen.setCell(c, r, {\n char: cell.char,\n fg: cell.fg,\n bg: cell.bg,\n bold: cell.bold,\n italic: cell.italic,\n underline: cell.underline,\n dim: cell.dim,\n strikethrough: cell.strikethrough,\n inverse: cell.inverse,\n width: cell.width,\n });\n }\n }\n }\n }\n\n /**\n * Resize all layers when the terminal is resized.\n */\n resize(cols: number, rows: number): void {\n this._cols = cols;\n this._rows = rows;\n\n for (const layer of this._layers.values()) {\n layer.cells = this._createGrid();\n layer.dirtyRegion = null;\n }\n }\n\n /**\n * Create an empty cell grid.\n */\n private _createGrid(): Cell[][] {\n const grid: Cell[][] = [];\n for (let r = 0; r < this._rows; r++) {\n const row: Cell[] = [];\n for (let c = 0; c < this._cols; c++) {\n row.push(emptyCell());\n }\n grid.push(row);\n }\n return grid;\n }\n\n /**\n * Expand the dirty region of a layer to include the given cell.\n */\n private _expandDirty(layer: Layer, col: number, row: number): void {\n if (!layer.dirtyRegion) {\n layer.dirtyRegion = { x: col, y: row, width: 1, height: 1 };\n return;\n }\n\n const r = layer.dirtyRegion;\n const newX = Math.min(r.x, col);\n const newY = Math.min(r.y, row);\n const newRight = Math.max(r.x + r.width, col + 1);\n const newBottom = Math.max(r.y + r.height, row + 1);\n r.x = newX;\n r.y = newY;\n r.width = newRight - newX;\n r.height = newBottom - newY;\n }\n}\n","export const caps = {\n color: !process.env.NO_COLOR && process.env.TERM !== 'dumb',\n unicode: !process.env.NO_UNICODE && process.env.TERM !== 'dumb',\n motion: !process.env.NO_MOTION && !process.env.CI,\n ci: !!process.env.CI,\n} as const;\n","// Box-drawing unicode → ASCII fallback map\nexport const BOX: Record<string, string> = {\n '┌': '+', '┐': '+', '└': '+', '┘': '+',\n '─': '-', '│': '|', '├': '+', '┤': '+',\n '┬': '+', '┴': '+', '┼': '+',\n '═': '=', '║': '|', '╔': '+', '╗': '+', '╚': '+', '╝': '+',\n '╠': '+', '╣': '+', '╦': '+', '╩': '+', '╬': '+',\n};\n\n// Spinner fallback frames when unicode not available\nexport const BRAILLE_SPIN = ['|', '/', '-', '\\\\'] as const;\n\n// Block characters for progress bars\nexport const BLOCK = { full: '#', empty: ' ', partial: '-' } as const;\n","// ─────────────────────────────────────────────────────\n// @termuijs/core — Event types\n// ─────────────────────────────────────────────────────\n\n/**\n * Keyboard event emitted when a key is pressed.\n */\nexport interface KeyEvent {\n /** Human-readable key name: 'a', 'enter', 'up', 'f1', 'tab', etc. */\n key: string;\n /** Raw byte sequence from stdin */\n raw: Buffer;\n /** Ctrl modifier held */\n ctrl: boolean;\n /** Alt/Meta modifier held */\n alt: boolean;\n /** Shift modifier held */\n shift: boolean;\n /** The widget ID that currently has focus (target of the event) */\n targetId?: string;\n /** Whether propagation has been stopped */\n _propagationStopped?: boolean;\n /** Whether the default action has been prevented */\n _defaultPrevented?: boolean;\n /** Stop this event from bubbling to parent widgets */\n stopPropagation(): void;\n /** Prevent the default action for this event */\n preventDefault(): void;\n}\n\n/**\n * Create a KeyEvent with propagation control methods attached.\n */\nexport function createKeyEvent(base: {\n key: string;\n raw: Buffer;\n ctrl: boolean;\n alt: boolean;\n shift: boolean;\n targetId?: string;\n}): KeyEvent {\n const event: KeyEvent = {\n ...base,\n _propagationStopped: false,\n _defaultPrevented: false,\n stopPropagation() { this._propagationStopped = true; },\n preventDefault() { this._defaultPrevented = true; },\n };\n return event;\n}\n\n/**\n * Mouse event types.\n */\nexport type MouseEventType = 'mousedown' | 'mouseup' | 'mousemove' | 'scroll';\nexport type MouseButton = 'left' | 'middle' | 'right' | 'none';\n\n/**\n * Mouse event emitted when mouse activity is detected.\n */\nexport interface MouseEvent {\n /** x (column) position, 0-indexed */\n x: number;\n /** y (row) position, 0-indexed */\n y: number;\n /** Which mouse button */\n button: MouseButton;\n /** Type of mouse event */\n type: MouseEventType;\n /** Scroll direction (-1 = up, 1 = down) */\n scrollDelta?: number;\n}\n\n/**\n * Resize event emitted when the terminal is resized.\n */\nexport interface ResizeEvent {\n cols: number;\n rows: number;\n}\n\n/**\n * Focus event emitted when a widget gains or loses focus.\n */\nexport interface FocusEvent {\n /** Widget ID that is gaining or losing focus */\n targetId: string;\n /** Type of focus event */\n type: 'focus' | 'blur';\n}\n\n/**\n * Map of all event types to their data shapes.\n */\nexport interface EventMap {\n 'key': KeyEvent;\n 'mouse': MouseEvent;\n 'resize': ResizeEvent;\n 'focus': FocusEvent;\n 'blur': FocusEvent;\n 'render': void;\n 'mount': void;\n 'unmount': void;\n 'tick': number; // delta ms\n}\n","// ─────────────────────────────────────────────────────\n// @termuijs/core — Key mapping constants\n// ─────────────────────────────────────────────────────\n\n/**\n * Maps raw byte sequences to human-readable key names.\n * These are standard VT100/xterm escape sequences.\n */\nexport const ESCAPE_SEQUENCES: Record<string, string> = {\n // Arrow keys\n '\\x1b[A': 'up',\n '\\x1b[B': 'down',\n '\\x1b[C': 'right',\n '\\x1b[D': 'left',\n\n // Shift+Arrow\n '\\x1b[1;2A': 'shift+up',\n '\\x1b[1;2B': 'shift+down',\n '\\x1b[1;2C': 'shift+right',\n '\\x1b[1;2D': 'shift+left',\n\n // Ctrl+Arrow\n '\\x1b[1;5A': 'ctrl+up',\n '\\x1b[1;5B': 'ctrl+down',\n '\\x1b[1;5C': 'ctrl+right',\n '\\x1b[1;5D': 'ctrl+left',\n\n // Alt+Arrow\n '\\x1b[1;3A': 'alt+up',\n '\\x1b[1;3B': 'alt+down',\n '\\x1b[1;3C': 'alt+right',\n '\\x1b[1;3D': 'alt+left',\n\n // Home/End/Insert/Delete/PageUp/PageDown\n '\\x1b[H': 'home',\n '\\x1b[F': 'end',\n '\\x1b[2~': 'insert',\n '\\x1b[3~': 'delete',\n '\\x1b[5~': 'pageup',\n '\\x1b[6~': 'pagedown',\n\n // Alternate Home/End (some terminals)\n '\\x1b[1~': 'home',\n '\\x1b[4~': 'end',\n '\\x1bOH': 'home',\n '\\x1bOF': 'end',\n\n // Function keys\n '\\x1bOP': 'f1',\n '\\x1bOQ': 'f2',\n '\\x1bOR': 'f3',\n '\\x1bOS': 'f4',\n '\\x1b[15~': 'f5',\n '\\x1b[17~': 'f6',\n '\\x1b[18~': 'f7',\n '\\x1b[19~': 'f8',\n '\\x1b[20~': 'f9',\n '\\x1b[21~': 'f10',\n '\\x1b[23~': 'f11',\n '\\x1b[24~': 'f12',\n\n // Special keys\n '\\x1b[Z': 'shift+tab',\n};\n\n/**\n * Maps control character codes (0x01-0x1A) to key names.\n * Ctrl+A = 0x01, Ctrl+B = 0x02, ... Ctrl+Z = 0x1A\n */\nexport const CTRL_KEYS: Record<number, string> = {\n 0x01: 'a', 0x02: 'b', 0x03: 'c', 0x04: 'd',\n 0x05: 'e', 0x06: 'f', 0x07: 'g', 0x08: 'backspace',\n 0x09: 'tab', 0x0A: 'enter', 0x0B: 'k', 0x0C: 'l',\n 0x0D: 'enter', 0x0E: 'n', 0x0F: 'o', 0x10: 'p',\n 0x11: 'q', 0x12: 'r', 0x13: 's', 0x14: 't',\n 0x15: 'u', 0x16: 'v', 0x17: 'w', 0x18: 'x',\n 0x19: 'y', 0x1A: 'z',\n};\n\n/**\n * Special single-byte key codes.\n */\nexport const SPECIAL_KEYS: Record<number, string> = {\n 0x1B: 'escape',\n 0x7F: 'backspace',\n 0x09: 'tab',\n 0x0D: 'enter',\n 0x0A: 'enter',\n 0x20: 'space',\n};\n","// ─────────────────────────────────────────────────────\n// @termuijs/core — Mouse event parser (SGR mode)\n// ─────────────────────────────────────────────────────\n\nimport type { MouseEvent, MouseButton, MouseEventType } from '../events/types.js';\n\n/**\n * Parse an SGR mouse event escape sequence.\n *\n * SGR format: ESC [ < Cb ; Cx ; Cy M (button press)\n * ESC [ < Cb ; Cx ; Cy m (button release)\n *\n * Where Cb encodes the button and modifiers, Cx/Cy are 1-based coordinates.\n *\n * @returns Parsed MouseEvent or null if not a mouse sequence.\n */\nexport function parseMouseEvent(data: string): MouseEvent | null {\n // SGR mouse: \\x1b[<Cb;Cx;Cy[Mm]\n const match = data.match(/^\\x1b\\[<(\\d+);(\\d+);(\\d+)([Mm])$/);\n if (!match) return null;\n\n const cb = parseInt(match[1], 10);\n const cx = parseInt(match[2], 10) - 1; // Convert to 0-based\n const cy = parseInt(match[3], 10) - 1;\n const isRelease = match[4] === 'm';\n\n let button: MouseButton;\n let type: MouseEventType;\n let scrollDelta: number | undefined;\n\n // Decode button from low 2 bits\n const buttonBits = cb & 0b11;\n const motion = (cb & 0b100000) !== 0;\n const isScroll = (cb & 0b1000000) !== 0;\n\n if (isScroll) {\n button = 'none';\n type = 'scroll';\n scrollDelta = buttonBits === 0 ? -1 : 1; // 0 = scroll up, 1 = scroll down\n } else if (motion) {\n type = 'mousemove';\n button = decodeButton(buttonBits);\n } else if (isRelease) {\n type = 'mouseup';\n button = decodeButton(buttonBits);\n } else {\n type = 'mousedown';\n button = decodeButton(buttonBits);\n }\n\n return {\n x: cx,\n y: cy,\n button,\n type,\n scrollDelta,\n };\n}\n\nfunction decodeButton(bits: number): MouseButton {\n switch (bits) {\n case 0: return 'left';\n case 1: return 'middle';\n case 2: return 'right';\n default: return 'none';\n }\n}\n\n/**\n * Check if a string looks like it could be a mouse sequence.\n */\nexport function isMouseSequence(data: string): boolean {\n return data.startsWith('\\x1b[<');\n}\n","// ─────────────────────────────────────────────────────\n// @termuijs/core — Typed Event Emitter\n// ─────────────────────────────────────────────────────\n\n/**\n * Strongly-typed event emitter using TypeScript generics.\n * Supports `on`, `off`, `once`, `emit` with type-safe event maps.\n */\nexport class EventEmitter<TEventMap extends Record<string, any>> {\n private _handlers: Map<keyof TEventMap, Set<(data: any) => void>> = new Map();\n private _onceHandlers: Map<keyof TEventMap, Set<(data: any) => void>> = new Map();\n\n /**\n * Subscribe to an event.\n * @returns Unsubscribe function.\n */\n on<K extends keyof TEventMap>(event: K, handler: (data: TEventMap[K]) => void): () => void {\n if (!this._handlers.has(event)) {\n this._handlers.set(event, new Set());\n }\n this._handlers.get(event)!.add(handler);\n\n return () => this.off(event, handler);\n }\n\n /**\n * Subscribe to an event, but only fire once.\n */\n once<K extends keyof TEventMap>(event: K, handler: (data: TEventMap[K]) => void): () => void {\n if (!this._onceHandlers.has(event)) {\n this._onceHandlers.set(event, new Set());\n }\n this._onceHandlers.get(event)!.add(handler);\n\n return () => {\n this._onceHandlers.get(event)?.delete(handler);\n };\n }\n\n /**\n * Unsubscribe from an event.\n */\n off<K extends keyof TEventMap>(event: K, handler: (data: TEventMap[K]) => void): void {\n this._handlers.get(event)?.delete(handler);\n this._onceHandlers.get(event)?.delete(handler);\n }\n\n /**\n * Emit an event to all subscribed handlers.\n */\n emit<K extends keyof TEventMap>(event: K, data: TEventMap[K]): void {\n // Regular handlers\n const handlers = this._handlers.get(event);\n if (handlers) {\n for (const handler of handlers) {\n try { handler(data); } catch { /* prevent one handler from breaking others */ }\n }\n }\n\n // Once handlers — fire and remove\n const onceHandlers = this._onceHandlers.get(event);\n if (onceHandlers) {\n for (const handler of onceHandlers) {\n try { handler(data); } catch { /* prevent one handler from breaking others */ }\n }\n onceHandlers.clear();\n }\n }\n\n /**\n * Remove all handlers for a specific event, or all events if no event specified.\n */\n removeAll(event?: keyof TEventMap): void {\n if (event) {\n this._handlers.delete(event);\n this._onceHandlers.delete(event);\n } else {\n this._handlers.clear();\n this._onceHandlers.clear();\n }\n }\n\n /**\n * Check if there are any handlers for an event.\n */\n hasListeners(event: keyof TEventMap): boolean {\n return (\n (this._handlers.get(event)?.size ?? 0) > 0 ||\n (this._onceHandlers.get(event)?.size ?? 0) > 0\n );\n }\n}\n","// ─────────────────────────────────────────────────────\n// @termuijs/core — Input Parser\n// ─────────────────────────────────────────────────────\n\nimport type { KeyEvent, MouseEvent } from '../events/types.js';\nimport { createKeyEvent } from '../events/types.js';\nimport { ESCAPE_SEQUENCES, CTRL_KEYS, SPECIAL_KEYS } from './KeyMap.js';\nimport { parseMouseEvent, isMouseSequence } from './MouseParser.js';\nimport { EventEmitter } from '../events/EventEmitter.js';\n\ninterface InputEvents {\n key: KeyEvent;\n mouse: MouseEvent;\n}\n\n/**\n * Reads raw stdin bytes and parses them into typed KeyEvent / MouseEvent objects.\n * Handles escape sequences, multi-byte keys, ctrl+key, and SGR mouse events.\n */\nexport class InputParser {\n private _events = new EventEmitter<InputEvents>();\n private _stdin: NodeJS.ReadStream;\n private _handler: ((data: Buffer) => void) | null = null;\n private _escapeTimeout: ReturnType<typeof setTimeout> | null = null;\n private _escapeBuffer = '';\n\n constructor(stdin: NodeJS.ReadStream) {\n this._stdin = stdin;\n }\n\n /** Subscribe to key events */\n onKey(handler: (event: KeyEvent) => void): () => void {\n return this._events.on('key', handler);\n }\n\n /** Subscribe to mouse events */\n onMouse(handler: (event: MouseEvent) => void): () => void {\n return this._events.on('mouse', handler);\n }\n\n /** Start listening for input */\n start(): void {\n if (this._handler) return;\n\n this._handler = (data: Buffer) => {\n this._processInput(data);\n };\n\n this._stdin.on('data', this._handler);\n }\n\n /** Stop listening for input */\n stop(): void {\n if (this._handler) {\n this._stdin.off('data', this._handler);\n this._handler = null;\n }\n if (this._escapeTimeout) {\n clearTimeout(this._escapeTimeout);\n this._escapeTimeout = null;\n }\n this._escapeBuffer = '';\n }\n\n /**\n * Process a chunk of raw input bytes.\n */\n private _processInput(data: Buffer): void {\n const str = data.toString('utf8');\n\n // If we're collecting an escape sequence\n if (this._escapeBuffer) {\n this._escapeBuffer += str;\n if (this._escapeTimeout) {\n clearTimeout(this._escapeTimeout);\n this._escapeTimeout = null;\n }\n this._tryParseEscape(data);\n return;\n }\n\n // Check if this starts an escape sequence\n if (str.startsWith('\\x1b') && str.length === 1) {\n // Lone ESC — wait a bit to see if more bytes follow\n this._escapeBuffer = str;\n this._escapeTimeout = setTimeout(() => {\n // Timeout — it was a standalone Escape key\n this._events.emit('key', createKeyEvent({\n key: 'escape',\n raw: Buffer.from(this._escapeBuffer),\n ctrl: false,\n alt: false,\n shift: false,\n }));\n this._escapeBuffer = '';\n this._escapeTimeout = null;\n }, 50); // 50ms debounce for escape sequences\n return;\n }\n\n if (str.startsWith('\\x1b')) {\n this._escapeBuffer = str;\n this._tryParseEscape(data);\n return;\n }\n\n // Process each byte for non-escape input\n for (let i = 0; i < str.length; i++) {\n const ch = str[i];\n const code = str.charCodeAt(i);\n const raw = Buffer.from(ch, 'utf8');\n\n // Ctrl+key (0x01-0x1A, excluding tab/enter/backspace)\n if (code >= 0x01 && code <= 0x1A) {\n const keyName = CTRL_KEYS[code];\n const isCtrl = code !== 0x09 && code !== 0x0D && code !== 0x0A;\n this._events.emit('key', createKeyEvent({\n key: keyName || String.fromCharCode(code + 96),\n raw,\n ctrl: isCtrl,\n alt: false,\n shift: false,\n }));\n continue;\n }\n\n // Special keys\n if (code in SPECIAL_KEYS) {\n this._events.emit('key', createKeyEvent({\n key: SPECIAL_KEYS[code],\n raw,\n ctrl: false,\n alt: false,\n shift: false,\n }));\n continue;\n }\n\n // Regular printable character\n if (code >= 0x20) {\n this._events.emit('key', createKeyEvent({\n key: ch,\n raw,\n ctrl: false,\n alt: false,\n shift: ch !== ch.toLowerCase() && ch === ch.toUpperCase(),\n }));\n }\n }\n }\n\n /**\n * Try to parse buffered escape sequence.\n */\n private _tryParseEscape(rawData: Buffer): void {\n const seq = this._escapeBuffer;\n\n // Check for mouse event first\n if (isMouseSequence(seq)) {\n const mouseEvt = parseMouseEvent(seq);\n if (mouseEvt) {\n this._events.emit('mouse', mouseEvt);\n this._escapeBuffer = '';\n return;\n }\n // Might be incomplete mouse sequence — wait for more data\n if (seq.length < 20) { // safety cap\n if (this._escapeTimeout) {\n clearTimeout(this._escapeTimeout);\n this._escapeTimeout = null;\n }\n this._escapeTimeout = setTimeout(() => {\n this._escapeBuffer = '';\n this._escapeTimeout = null;\n }, 100);\n return;\n }\n }\n\n // Check known escape sequences\n if (seq in ESCAPE_SEQUENCES) {\n const keyName = ESCAPE_SEQUENCES[seq];\n const isShift = keyName.startsWith('shift+');\n const isCtrl = keyName.startsWith('ctrl+');\n const isAlt = keyName.startsWith('alt+');\n const cleanKey = keyName.replace(/^(shift|ctrl|alt)\\+/, '');\n\n this._events.emit('key', createKeyEvent({\n key: cleanKey,\n raw: rawData,\n ctrl: isCtrl,\n alt: isAlt,\n shift: isShift,\n }));\n this._escapeBuffer = '';\n return;\n }\n\n // Alt+key: ESC followed by a regular character\n if (seq.length === 2 && seq[0] === '\\x1b') {\n const ch = seq[1];\n this._events.emit('key', createKeyEvent({\n key: ch,\n raw: rawData,\n ctrl: false,\n alt: true,\n shift: ch !== ch.toLowerCase() && ch === ch.toUpperCase(),\n }));\n this._escapeBuffer = '';\n return;\n }\n\n // If the sequence is getting too long, give up\n if (seq.length > 20) {\n this._escapeBuffer = '';\n return;\n }\n\n // Wait for more bytes (might be an incomplete sequence)\n if (this._escapeTimeout) {\n clearTimeout(this._escapeTimeout);\n this._escapeTimeout = null;\n }\n this._escapeTimeout = setTimeout(() => {\n // Timeout — emit as unknown escape and clear\n this._escapeBuffer = '';\n this._escapeTimeout = null;\n }, 100);\n }\n}\n","// ─────────────────────────────────────────────────────\n// @termuijs/core — Style definition and merging\n// ─────────────────────────────────────────────────────\n\nimport type { Color } from './Color.js';\nimport type { BorderStyle } from './Border.js';\n\n/**\n * Edge values (padding, margin) — top, right, bottom, left.\n */\nexport interface Edges {\n top: number;\n right: number;\n bottom: number;\n left: number;\n}\n\n/**\n * Complete style definition for a widget.\n */\nexport interface Style {\n // ── Colors ──────────────\n fg?: Color;\n bg?: Color;\n\n // ── Text Decoration ─────\n bold?: boolean;\n italic?: boolean;\n underline?: boolean;\n dim?: boolean;\n strikethrough?: boolean;\n inverse?: boolean;\n\n // ── Box Model ───────────\n padding?: Partial<Edges> | number;\n margin?: Partial<Edges> | number;\n border?: BorderStyle;\n borderColor?: Color;\n\n // ── Dimensions ──────────\n width?: number | string; // number = fixed chars, string = '50%'\n height?: number | string;\n minWidth?: number;\n minHeight?: number;\n maxWidth?: number;\n maxHeight?: number;\n\n // ── Flex Layout ─────────\n flexDirection?: 'row' | 'column';\n justifyContent?: 'flex-start' | 'flex-end' | 'center' | 'space-between' | 'space-around';\n alignItems?: 'flex-start' | 'flex-end' | 'center' | 'stretch';\n flexGrow?: number;\n flexShrink?: number;\n flexWrap?: 'nowrap' | 'wrap';\n gap?: number;\n\n // ── Overflow ────────────\n overflow?: 'visible' | 'hidden' | 'scroll';\n\n // ── Stacking ────────────\n /** Z-index for layer ordering. Higher values render on top. */\n zIndex?: number;\n\n // ── Focus ────────────────\n /** Color of the focus ring when this widget has focus */\n focusRingColor?: Color;\n /** Style of the focus ring indicator */\n focusRingStyle?: 'border' | 'corners' | 'glow' | 'none';\n\n // ── Visibility ──────────\n visible?: boolean;\n}\n\n/**\n * Normalize a shorthand edge value (number) into the full Edges object.\n */\nexport function normalizeEdges(value: Partial<Edges> | number | undefined): Edges {\n if (value === undefined) return { top: 0, right: 0, bottom: 0, left: 0 };\n if (typeof value === 'number') {\n return { top: value, right: value, bottom: value, left: value };\n }\n return {\n top: value.top ?? 0,\n right: value.right ?? 0,\n bottom: value.bottom ?? 0,\n left: value.left ?? 0,\n };\n}\n\n/**\n * Merge two styles. `override` values take precedence.\n * Undefined values in override do not overwrite base values.\n */\nexport function mergeStyles(base: Style, override: Style): Style {\n const result: Style = { ...base };\n\n for (const key of Object.keys(override) as Array<keyof Style>) {\n const val = override[key];\n if (val !== undefined) {\n (result as any)[key] = val;\n }\n }\n\n return result;\n}\n\n/**\n * Create a default (empty) style.\n */\nexport function defaultStyle(): Style {\n return {\n visible: true,\n flexDirection: 'column',\n justifyContent: 'flex-start',\n alignItems: 'stretch',\n flexGrow: 0,\n flexShrink: 1,\n flexWrap: 'nowrap',\n overflow: 'hidden',\n gap: 0,\n };\n}\n\n/**\n * Extract the cell-level style attributes from a Style object.\n * Used when rendering text into the screen buffer.\n */\nexport function styleToCellAttrs(style: Style): {\n fg: Color;\n bg: Color;\n bold: boolean;\n italic: boolean;\n underline: boolean;\n dim: boolean;\n strikethrough: boolean;\n inverse: boolean;\n} {\n return {\n fg: style.fg ?? { type: 'none' },\n bg: style.bg ?? { type: 'none' },\n bold: style.bold ?? false,\n italic: style.italic ?? false,\n underline: style.underline ?? false,\n dim: style.dim ?? false,\n strikethrough: style.strikethrough ?? false,\n inverse: style.inverse ?? false,\n };\n}\n","// ─────────────────────────────────────────────────────\n// @termuijs/core — Border styles and rendering\n// ─────────────────────────────────────────────────────\n\n/**\n * Supported border styles.\n */\nexport type BorderStyle =\n | 'none'\n | 'single'\n | 'double'\n | 'round'\n | 'heavy'\n | 'dashed'\n | 'custom';\n\n/**\n * The characters used to draw a border.\n * Layout:\n * ```\n * topLeft ─── top ─── topRight\n * │ │\n * left content right\n * │ │\n * bottomLeft ─ bottom ─ bottomRight\n * ```\n */\nexport interface BorderChars {\n topLeft: string;\n top: string;\n topRight: string;\n right: string;\n bottomRight: string;\n bottom: string;\n bottomLeft: string;\n left: string;\n}\n\n/** Character maps for each border style */\nexport const BORDER_CHARS: Record<Exclude<BorderStyle, 'none' | 'custom'>, BorderChars> = {\n single: {\n topLeft: '┌', top: '─', topRight: '┐',\n right: '│', bottomRight: '┘', bottom: '─',\n bottomLeft: '└', left: '│',\n },\n double: {\n topLeft: '╔', top: '═', topRight: '╗',\n right: '║', bottomRight: '╝', bottom: '═',\n bottomLeft: '╚', left: '║',\n },\n round: {\n topLeft: '╭', top: '─', topRight: '╮',\n right: '│', bottomRight: '╯', bottom: '─',\n bottomLeft: '╰', left: '│',\n },\n heavy: {\n topLeft: '┏', top: '━', topRight: '┓',\n right: '┃', bottomRight: '┛', bottom: '━',\n bottomLeft: '┗', left: '┃',\n },\n dashed: {\n topLeft: '┌', top: '┄', topRight: '┐',\n right: '┆', bottomRight: '┘', bottom: '┄',\n bottomLeft: '└', left: '┆',\n },\n};\n\n/**\n * Get the border characters for a given style.\n */\nexport function getBorderChars(style: BorderStyle, customChars?: Partial<BorderChars>): BorderChars | null {\n if (style === 'none') return null;\n if (style === 'custom') {\n const base = BORDER_CHARS.single;\n return { ...base, ...customChars };\n }\n return BORDER_CHARS[style];\n}\n\n/**\n * Calculate the total space a border takes up.\n * Returns { horizontal, vertical } representing how many columns/rows\n * the border consumes (0 for none, 2 for any visible border — 1 on each side).\n */\nexport function borderSize(style: BorderStyle): { horizontal: number; vertical: number } {\n if (style === 'none') return { horizontal: 0, vertical: 0 };\n return { horizontal: 2, vertical: 2 };\n}\n","// ─────────────────────────────────────────────────────\n// @termuijs/core — Flexbox-like Layout Engine\n// ─────────────────────────────────────────────────────\n\nimport type { Style } from '../style/Style.js';\nimport { normalizeEdges } from '../style/Style.js';\nimport { borderSize } from '../style/Border.js';\nimport type { Rect } from './Rect.js';\n\n/**\n * A node in the layout tree. Each widget produces one LayoutNode.\n */\nexport interface LayoutNode {\n /** Reference back to the widget/element that created this node */\n id: string;\n /** Style properties that affect layout */\n style: Style;\n /** Child nodes */\n children: LayoutNode[];\n /** Computed position and size — filled in by computeLayout() */\n computed: Rect;\n /** Dirty flag — true when this node needs to be re-laid-out. Foundation for layout caching. */\n _dirty: boolean;\n}\n\n/**\n * Create a LayoutNode with default values.\n */\nexport function createLayoutNode(id: string, style: Style, children: LayoutNode[] = []): LayoutNode {\n return {\n id,\n style,\n children,\n computed: { x: 0, y: 0, width: 0, height: 0 },\n _dirty: true,\n };\n}\n\n/**\n * Compute the layout of a tree of LayoutNodes.\n *\n * This is a simplified Flexbox implementation that handles:\n * - flexDirection: row | column\n * - justifyContent: flex-start | flex-end | center | space-between | space-around\n * - alignItems: flex-start | flex-end | center | stretch\n * - flexGrow / flexShrink\n * - padding, margin, border\n * - fixed width/height, percentage width/height\n * - minWidth, maxWidth, minHeight, maxHeight\n * - gap between children\n */\nexport function computeLayout(root: LayoutNode, containerWidth: number, containerHeight: number): void {\n root.computed = { x: 0, y: 0, width: containerWidth, height: containerHeight };\n layoutNode(root, containerWidth, containerHeight);\n}\n\nfunction layoutNode(node: LayoutNode, availWidth: number, availHeight: number, precomputed = false): void {\n const style = node.style;\n const padding = normalizeEdges(style.padding);\n const margin = normalizeEdges(style.margin);\n const border = borderSize(style.border ?? 'none');\n\n if (!precomputed) {\n // Calculate this node's dimensions\n let nodeWidth = resolveSize(style.width, availWidth);\n let nodeHeight = resolveSize(style.height, availHeight);\n\n // Apply constraints\n if (nodeWidth === undefined) nodeWidth = availWidth - margin.left - margin.right;\n if (nodeHeight === undefined) nodeHeight = availHeight - margin.top - margin.bottom;\n\n nodeWidth = clampSize(nodeWidth, style.minWidth, style.maxWidth);\n nodeHeight = clampSize(nodeHeight, style.minHeight, style.maxHeight);\n\n node.computed.width = nodeWidth;\n node.computed.height = nodeHeight;\n }\n\n if (node.children.length === 0) {\n node._dirty = false;\n return;\n }\n\n const nodeWidth = node.computed.width;\n const nodeHeight = node.computed.height;\n\n // Inner content area (after padding + border)\n const innerX = padding.left + (border.horizontal / 2);\n const innerY = padding.top + (border.vertical / 2);\n const innerWidth = Math.max(0, nodeWidth - padding.left - padding.right - border.horizontal);\n const innerHeight = Math.max(0, nodeHeight - padding.top - padding.bottom - border.vertical);\n\n const direction = style.flexDirection ?? 'column';\n const isRow = direction === 'row';\n const gap = style.gap ?? 0;\n\n // ── Phase 1: Measure children's desired sizes ──────\n\n const childInfos: Array<{\n node: LayoutNode;\n mainSize: number;\n crossSize: number;\n flexGrow: number;\n flexShrink: number;\n margin: { top: number; right: number; bottom: number; left: number };\n }> = [];\n\n let totalFixed = 0;\n let totalGrow = 0;\n let totalShrink = 0;\n\n for (const child of node.children) {\n if (child.style.visible === false) continue;\n\n const childMargin = normalizeEdges(child.style.margin);\n const childBorder = borderSize(child.style.border ?? 'none');\n const grow = child.style.flexGrow ?? 0;\n const shrink = child.style.flexShrink ?? 1;\n\n let mainSize: number;\n let crossSize: number;\n\n if (isRow) {\n mainSize = resolveSize(child.style.width, innerWidth) ?? 0;\n crossSize = resolveSize(child.style.height, innerHeight) ?? innerHeight;\n mainSize += childMargin.left + childMargin.right;\n crossSize = clampSize(crossSize, child.style.minHeight, child.style.maxHeight);\n } else {\n mainSize = resolveSize(child.style.height, innerHeight) ?? 0;\n crossSize = resolveSize(child.style.width, innerWidth) ?? innerWidth;\n mainSize += childMargin.top + childMargin.bottom;\n crossSize = clampSize(crossSize, child.style.minWidth, child.style.maxWidth);\n }\n\n totalFixed += mainSize;\n totalGrow += grow;\n totalShrink += shrink;\n\n childInfos.push({ node: child, mainSize, crossSize, flexGrow: grow, flexShrink: shrink, margin: childMargin });\n }\n\n const totalGaps = Math.max(0, childInfos.length - 1) * gap;\n const mainAvail = isRow ? innerWidth : innerHeight;\n const freeSpace = mainAvail - totalFixed - totalGaps;\n\n // ── Phase 2: Distribute free space (grow/shrink) ───\n\n if (freeSpace > 0 && totalGrow > 0) {\n for (const info of childInfos) {\n if (info.flexGrow > 0) {\n info.mainSize += (info.flexGrow / totalGrow) * freeSpace;\n }\n }\n } else if (freeSpace < 0 && totalShrink > 0) {\n for (const info of childInfos) {\n if (info.flexShrink > 0) {\n info.mainSize += (info.flexShrink / totalShrink) * freeSpace;\n info.mainSize = Math.max(0, info.mainSize);\n }\n }\n }\n\n // ── Phase 3: Position children ─────────────────────\n\n const totalMainUsed = childInfos.reduce((sum, i) => sum + i.mainSize, 0) + totalGaps;\n const remainingSpace = Math.max(0, mainAvail - totalMainUsed);\n\n let mainOffset: number;\n let spaceBetween = 0;\n\n const justify = style.justifyContent ?? 'flex-start';\n switch (justify) {\n case 'flex-start':\n mainOffset = 0;\n break;\n case 'flex-end':\n mainOffset = remainingSpace;\n break;\n case 'center':\n mainOffset = remainingSpace / 2;\n break;\n case 'space-between':\n mainOffset = 0;\n spaceBetween = childInfos.length > 1 ? remainingSpace / (childInfos.length - 1) : 0;\n break;\n case 'space-around':\n spaceBetween = childInfos.length > 0 ? remainingSpace / childInfos.length : 0;\n mainOffset = spaceBetween / 2;\n break;\n default:\n mainOffset = 0;\n }\n\n const crossAvail = isRow ? innerHeight : innerWidth;\n const align = style.alignItems ?? 'stretch';\n\n for (const info of childInfos) {\n // Cross axis alignment\n let crossOffset: number;\n let finalCrossSize = info.crossSize;\n\n switch (align) {\n case 'flex-start':\n crossOffset = 0;\n break;\n case 'flex-end':\n crossOffset = crossAvail - finalCrossSize;\n break;\n case 'center':\n crossOffset = (crossAvail - finalCrossSize) / 2;\n break;\n case 'stretch':\n crossOffset = 0;\n finalCrossSize = crossAvail;\n break;\n default:\n crossOffset = 0;\n }\n\n // Set computed rect\n if (isRow) {\n info.node.computed = {\n x: Math.floor(node.computed.x + innerX + mainOffset + info.margin.left),\n y: Math.floor(node.computed.y + innerY + crossOffset + info.margin.top),\n width: Math.round(Math.max(0, info.mainSize - info.margin.left - info.margin.right)),\n height: Math.round(Math.max(0, finalCrossSize - info.margin.top - info.margin.bottom)),\n };\n } else {\n info.node.computed = {\n x: Math.floor(node.computed.x + innerX + crossOffset + info.margin.left),\n y: Math.floor(node.computed.y + innerY + mainOffset + info.margin.top),\n width: Math.round(Math.max(0, finalCrossSize - info.margin.left - info.margin.right)),\n height: Math.round(Math.max(0, info.mainSize - info.margin.top - info.margin.bottom)),\n };\n }\n\n mainOffset += info.mainSize + gap + spaceBetween;\n\n // Recursively layout children — dimensions already set by parent\n layoutNode(info.node, info.node.computed.width, info.node.computed.height, true);\n }\n\n // Mark this node clean after layout is complete (used by future caching logic)\n node._dirty = false;\n}\n\n/**\n * Resolve a size value (fixed number or percentage string) to pixels.\n * Returns undefined if the value is not set.\n */\nfunction resolveSize(value: number | string | undefined, available: number): number | undefined {\n if (value === undefined) return undefined;\n if (typeof value === 'number') return value;\n if (typeof value === 'string' && value.endsWith('%')) {\n const pct = parseFloat(value) / 100;\n return Math.floor(available * pct);\n }\n return undefined;\n}\n\n/**\n * Clamp a size to min/max bounds.\n */\nfunction clampSize(value: number, min?: number, max?: number): number {\n let result = value;\n if (min !== undefined) result = Math.max(result, min);\n if (max !== undefined) result = Math.min(result, max);\n return result;\n}\n","// ─────────────────────────────────────────────────────\n// @termuijs/core — Layout types (Rect, Size, Edges)\n// ─────────────────────────────────────────────────────\n\n/**\n * A computed rectangle with position and size.\n */\nexport interface Rect {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\n/**\n * A 2D size.\n */\nexport interface Size {\n width: number;\n height: number;\n}\n\n/**\n * Create an empty rect at origin.\n */\nexport function emptyRect(): Rect {\n return { x: 0, y: 0, width: 0, height: 0 };\n}\n\n/**\n * Check if a point is inside a rect.\n */\nexport function containsPoint(rect: Rect, x: number, y: number): boolean {\n return x >= rect.x && x < rect.x + rect.width &&\n y >= rect.y && y < rect.y + rect.height;\n}\n\n/**\n * Shrink a rect by the given edges (inset).\n */\nexport function shrinkRect(rect: Rect, top: number, right: number, bottom: number, left: number): Rect {\n return {\n x: rect.x + left,\n y: rect.y + top,\n width: Math.max(0, rect.width - left - right),\n height: Math.max(0, rect.height - top - bottom),\n };\n}\n\n/**\n * Intersect two rects. Returns the overlapping region, or null if disjoint.\n */\nexport function intersectRect(a: Rect, b: Rect): Rect | null {\n const x = Math.max(a.x, b.x);\n const y = Math.max(a.y, b.y);\n const r = Math.min(a.x + a.width, b.x + b.width);\n const bot = Math.min(a.y + a.height, b.y + b.height);\n if (r <= x || bot <= y) return null;\n return { x, y, width: r - x, height: bot - y };\n}\n\n/**\n * Union two rects into the smallest bounding rect that contains both.\n */\nexport function unionRect(a: Rect, b: Rect): Rect {\n const x = Math.min(a.x, b.x);\n const y = Math.min(a.y, b.y);\n const r = Math.max(a.x + a.width, b.x + b.width);\n const bot = Math.max(a.y + a.height, b.y + b.height);\n return { x, y, width: r - x, height: bot - y };\n}\n","// ─────────────────────────────────────────────────────\n// @termuijs/core — Constraint-based Layout\n// Alternative to flexbox for dashboard-style splits.\n// ─────────────────────────────────────────────────────\n\nimport type { Rect } from './Rect.js';\n\n// ── Constraint Types ─────────────────────────────────\n\nexport type Constraint =\n | { type: 'length'; value: number }\n | { type: 'percentage'; value: number }\n | { type: 'ratio'; num: number; den: number }\n | { type: 'min'; value: number }\n | { type: 'max'; value: number }\n | { type: 'fill'; weight: number };\n\n// ── Constraint Factories ─────────────────────────────\n\n/** Exactly n cells. */\nexport const length = (n: number): Constraint => ({ type: 'length', value: n });\n\n/** n% of available space. */\nexport const percentage = (n: number): Constraint => ({ type: 'percentage', value: n });\n\n/** num/den of available space. */\nexport const ratio = (num: number, den: number): Constraint => ({ type: 'ratio', num, den });\n\n/** At least n cells. */\nexport const min = (n: number): Constraint => ({ type: 'min', value: n });\n\n/** At most n cells. */\nexport const max = (n: number): Constraint => ({ type: 'max', value: n });\n\n/** Fill remaining space with the given weight. Default weight: 1. */\nexport const fill = (weight: number = 1): Constraint => ({ type: 'fill', weight });\n\n// ── Solver ───────────────────────────────────────────\n\nfunction resolveSize(constraint: Constraint, available: number): number {\n switch (constraint.type) {\n case 'length': return Math.min(constraint.value, available);\n case 'percentage': return Math.min(Math.floor((available * constraint.value) / 100), available);\n case 'ratio': return constraint.den === 0 ? 0 : Math.min(\n Math.floor((available * constraint.num) / constraint.den), available\n );\n case 'min': return constraint.value;\n case 'max': return Math.min(constraint.value, available);\n case 'fill': return 0; // resolved in second pass\n }\n}\n\n/**\n * Split a rectangle into sub-rectangles using constraints.\n *\n * Example:\n * ```ts\n * const [header, body, footer] = splitRect(\n * area,\n * [length(3), fill(), length(1)],\n * 'vertical',\n * );\n * ```\n */\nexport function splitRect(\n rect: Rect,\n constraints: Constraint[],\n direction: 'horizontal' | 'vertical' = 'vertical',\n gap: number = 0,\n): Rect[] {\n if (constraints.length === 0) return [];\n\n const totalAvailable = direction === 'horizontal' ? rect.width : rect.height;\n const count = constraints.length;\n const totalGaps = count > 1 ? gap * (count - 1) : 0;\n const availableForConstraints = Math.max(0, totalAvailable - totalGaps);\n\n // First pass: resolve non-fill constraints\n const sizes: number[] = [];\n let usedSpace = 0;\n let fillWeightSum = 0;\n\n for (const constraint of constraints) {\n if (constraint.type === 'fill') {\n sizes.push(0);\n fillWeightSum += Math.max(1, constraint.weight);\n } else {\n const size = resolveSize(constraint, availableForConstraints);\n sizes.push(size);\n usedSpace += size;\n }\n }\n\n // Second pass: distribute remaining space to fill constraints\n if (fillWeightSum > 0) {\n const remaining = Math.max(0, availableForConstraints - usedSpace);\n let distributed = 0;\n\n for (let i = 0; i < count; i++) {\n const constraint = constraints[i];\n if (!constraint || constraint.type !== 'fill') continue;\n\n const weight = Math.max(1, constraint.weight);\n const share = Math.floor((remaining * weight) / fillWeightSum);\n sizes[i] = share;\n distributed += share;\n }\n\n // Give leftover pixels to the last fill constraint\n const leftover = remaining - distributed;\n if (leftover > 0) {\n for (let i = count - 1; i >= 0; i--) {\n const constraint = constraints[i];\n if (constraint && constraint.type === 'fill') {\n sizes[i] = (sizes[i] ?? 0) + leftover;\n break;\n }\n }\n }\n }\n\n // Clamp so total doesn't exceed available\n let totalUsed = 0;\n for (let i = 0; i < count; i++) {\n const size = sizes[i] ?? 0;\n const clamped = Math.max(0, Math.min(size, availableForConstraints - totalUsed));\n sizes[i] = clamped;\n totalUsed += clamped;\n }\n\n // Build result rects\n const results: Rect[] = [];\n let offset = 0;\n\n for (let i = 0; i < count; i++) {\n const size = sizes[i] ?? 0;\n\n if (direction === 'horizontal') {\n results.push({ x: rect.x + offset, y: rect.y, width: size, height: rect.height });\n } else {\n results.push({ x: rect.x, y: rect.y + offset, width: rect.width, height: size });\n }\n\n offset += size + gap;\n }\n\n return results;\n}\n","// ─────────────────────────────────────────────────────\n// @termuijs/core — Focus Manager\n// ─────────────────────────────────────────────────────\n\nimport { EventEmitter } from './EventEmitter.js';\nimport type { FocusEvent } from './types.js';\n\nexport interface Focusable {\n id: string;\n tabIndex: number;\n focusable: boolean;\n}\n\n/**\n * Manages tab-order focus cycling between focusable widgets.\n * Dispatches focus/blur events when focus changes.\n *\n * Supports:\n * - Tab-order cycling (focusNext/focusPrev)\n * - Focus trapping (for modals — limits Tab to a container)\n * - Focus groups (for arrow-key navigation within a group)\n */\nexport class FocusManager {\n private _focusables: Focusable[] = [];\n private _currentIndex = -1;\n private _events = new EventEmitter<{ focus: FocusEvent; blur: FocusEvent }>();\n\n /**\n * Stack of trap container IDs. When non-empty, only focusables\n * that belong to the topmost trap container are reachable via Tab.\n */\n private _trapStack: string[] = [];\n\n /**\n * Map of container ID → child widget IDs that belong to it.\n * Used for trap membership lookup.\n */\n private _containerMembers: Map<string, Set<string>> = new Map();\n\n /**\n * Named focus groups. Arrow keys move within a group, Tab moves between groups.\n * Maps groupId → ordered list of widget IDs.\n */\n private _groups: Map<string, string[]> = new Map();\n\n /** Currently focused widget ID, or null if none */\n get currentId(): string | null {\n if (this._currentIndex < 0 || this._currentIndex >= this._focusables.length) {\n return null;\n }\n return this._focusables[this._currentIndex].id;\n }\n\n /** Subscribe to focus/blur events */\n on<K extends 'focus' | 'blur'>(event: K, handler: (data: FocusEvent) => void): () => void {\n return this._events.on(event, handler);\n }\n\n /**\n * Register a focusable widget.\n * Widgets are ordered by tabIndex (ascending), then insertion order.\n */\n register(focusable: Focusable): void {\n this._focusables.push(focusable);\n this._focusables.sort((a, b) => a.tabIndex - b.tabIndex);\n\n // Auto-focus the first widget if nothing is focused\n if (this._currentIndex < 0 && focusable.focusable) {\n this._currentIndex = this._focusables.indexOf(focusable);\n this._events.emit('focus', { targetId: focusable.id, type: 'focus' });\n }\n }\n\n /**\n * Unregister a focusable widget.\n */\n unregister(id: string): void {\n const idx = this._focusables.findIndex(f => f.id === id);\n if (idx < 0) return;\n\n const wasFocused = idx === this._currentIndex;\n this._focusables.splice(idx, 1);\n\n if (wasFocused) {\n this._events.emit('blur', { targetId: id, type: 'blur' });\n // Try to focus the next widget\n if (this._focusables.length > 0) {\n this._currentIndex = Math.min(this._currentIndex, this._focusables.length - 1);\n this._events.emit('focus', {\n targetId: this._focusables[this._currentIndex].id,\n type: 'focus',\n });\n } else {\n this._currentIndex = -1;\n }\n } else if (idx < this._currentIndex) {\n this._currentIndex--;\n }\n }\n\n /**\n * Move focus to the next focusable widget (wraps around).\n * Respects focus traps — if a trap is active, only cycles within it.\n */\n focusNext(): void {\n const candidates = this._getActiveFocusables();\n if (candidates.length === 0) return;\n\n const currentInCandidates = this.currentId\n ? candidates.findIndex(f => f.id === this.currentId)\n : -1;\n\n let next = (currentInCandidates + 1) % candidates.length;\n const start = next;\n\n // Skip non-focusable widgets\n while (!candidates[next].focusable) {\n next = (next + 1) % candidates.length;\n if (next === start) return; // All non-focusable\n }\n\n // Find this candidate's index in the master list\n const masterIdx = this._focusables.findIndex(f => f.id === candidates[next].id);\n if (masterIdx >= 0) this._changeFocus(masterIdx);\n }\n\n /**\n * Move focus to the previous focusable widget (wraps around).\n * Respects focus traps.\n */\n focusPrev(): void {\n const candidates = this._getActiveFocusables();\n if (candidates.length === 0) return;\n\n const currentInCandidates = this.currentId\n ? candidates.findIndex(f => f.id === this.currentId)\n : 0;\n\n let prev = (currentInCandidates - 1 + candidates.length) % candidates.length;\n const start = prev;\n\n while (!candidates[prev].focusable) {\n prev = (prev - 1 + candidates.length) % candidates.length;\n if (prev === start) return;\n }\n\n const masterIdx = this._focusables.findIndex(f => f.id === candidates[prev].id);\n if (masterIdx >= 0) this._changeFocus(masterIdx);\n }\n\n /**\n * Focus a specific widget by ID.\n */\n focusWidget(id: string): void {\n const idx = this._focusables.findIndex(f => f.id === id);\n if (idx < 0 || !this._focusables[idx].focusable) return;\n this._changeFocus(idx);\n }\n\n /**\n * Check if a specific widget currently has focus.\n */\n isFocused(id: string): boolean {\n return this.currentId === id;\n }\n\n // ── Focus Trap ──────────────────────────────────────\n\n /**\n * Register widget IDs as members of a container (for trap lookup).\n */\n registerContainerMembers(containerId: string, memberIds: string[]): void {\n const set = this._containerMembers.get(containerId) ?? new Set();\n for (const id of memberIds) set.add(id);\n this._containerMembers.set(containerId, set);\n }\n\n /**\n * Unregister a container's member list.\n */\n unregisterContainerMembers(containerId: string): void {\n this._containerMembers.delete(containerId);\n }\n\n /**\n * Trap focus within a container. Only focusables inside the\n * container are reachable via Tab. Traps are stacked —\n * nested modals create nested traps.\n */\n trap(containerId: string): void {\n this._trapStack.push(containerId);\n\n // Focus the first focusable inside the trap\n const trapped = this._getActiveFocusables();\n if (trapped.length > 0) {\n const first = trapped.find(f => f.focusable);\n if (first) {\n const idx = this._focusables.findIndex(f => f.id === first.id);\n if (idx >= 0) this._changeFocus(idx);\n }\n }\n }\n\n /**\n * Release the current focus trap. Restores previous trap or free navigation.\n */\n release(): void {\n this._trapStack.pop();\n }\n\n /** Whether a focus trap is currently active */\n get isTrapped(): boolean {\n return this._trapStack.length > 0;\n }\n\n /** ID of the current trap container, or null */\n get currentTrapId(): string | null {\n return this._trapStack.length > 0\n ? this._trapStack[this._trapStack.length - 1]\n : null;\n }\n\n // ── Focus Groups ────────────────────────────────────\n\n /**\n * Register a focus group. Arrow keys move within the group.\n * @param groupId Unique group identifier\n * @param widgetIds Ordered list of widget IDs in the group\n */\n registerGroup(groupId: string, widgetIds: string[]): void {\n this._groups.set(groupId, widgetIds);\n }\n\n /**\n * Unregister a focus group.\n */\n unregisterGroup(groupId: string): void {\n this._groups.delete(groupId);\n }\n\n /**\n * Move focus to the next widget within the same group.\n * Returns true if focus was moved, false if the widget isn't in a group.\n */\n focusNextInGroup(): boolean {\n const currentId = this.currentId;\n if (!currentId) return false;\n\n for (const [, ids] of this._groups) {\n const idx = ids.indexOf(currentId);\n if (idx >= 0) {\n const nextIdx = (idx + 1) % ids.length;\n this.focusWidget(ids[nextIdx]);\n return true;\n }\n }\n return false;\n }\n\n /**\n * Move focus to the previous widget within the same group.\n */\n focusPrevInGroup(): boolean {\n const currentId = this.currentId;\n if (!currentId) return false;\n\n for (const [, ids] of this._groups) {\n const idx = ids.indexOf(currentId);\n if (idx >= 0) {\n const prevIdx = (idx - 1 + ids.length) % ids.length;\n this.focusWidget(ids[prevIdx]);\n return true;\n }\n }\n return false;\n }\n\n // ── Private ──────────────────────────────────────────\n\n /**\n * Get the active focusables, filtered by the current trap if any.\n */\n private _getActiveFocusables(): Focusable[] {\n if (this._trapStack.length === 0) return this._focusables;\n\n const containerId = this._trapStack[this._trapStack.length - 1];\n const members = this._containerMembers.get(containerId);\n if (!members) return this._focusables;\n\n return this._focusables.filter(f => members.has(f.id));\n }\n\n private _changeFocus(newIndex: number): void {\n const oldId = this.currentId;\n if (oldId) {\n this._events.emit('blur', { targetId: oldId, type: 'blur' });\n }\n this._currentIndex = newIndex;\n this._events.emit('focus', {\n targetId: this._focusables[newIndex].id,\n type: 'focus',\n });\n }\n}\n","// ─────────────────────────────────────────────────────\n// @termuijs/core — Unicode Symbol Sets\n// ─────────────────────────────────────────────────────\n\n// ── Border Sets ──────────────────────────────────────\n\nexport interface BorderSet {\n topLeft: string;\n topRight: string;\n bottomLeft: string;\n bottomRight: string;\n horizontal: string;\n vertical: string;\n cross: string;\n}\n\nexport const BorderSets = {\n PLAIN: {\n topLeft: '┌', topRight: '┐', bottomLeft: '└', bottomRight: '┘',\n horizontal: '─', vertical: '│', cross: '┼',\n },\n ROUNDED: {\n topLeft: '╭', topRight: '╮', bottomLeft: '╰', bottomRight: '╯',\n horizontal: '─', vertical: '│', cross: '┼',\n },\n DOUBLE: {\n topLeft: '╔', topRight: '╗', bottomLeft: '╚', bottomRight: '╝',\n horizontal: '═', vertical: '║', cross: '╬',\n },\n THICK: {\n topLeft: '┏', topRight: '┓', bottomLeft: '┗', bottomRight: '┛',\n horizontal: '━', vertical: '┃', cross: '╋',\n },\n QUADRANT_INSIDE: {\n topLeft: '▗', topRight: '▖', bottomLeft: '▝', bottomRight: '▘',\n horizontal: '▀', vertical: '▐', cross: '█',\n },\n QUADRANT_OUTSIDE: {\n topLeft: '▛', topRight: '▜', bottomLeft: '▙', bottomRight: '▟',\n horizontal: '▀', vertical: '▌', cross: '█',\n },\n EMPTY: {\n topLeft: ' ', topRight: ' ', bottomLeft: ' ', bottomRight: ' ',\n horizontal: ' ', vertical: ' ', cross: ' ',\n },\n} as const satisfies Record<string, BorderSet>;\n\n// ── Bar Chart Symbol Sets ────────────────────────────\n\nexport interface BarSet {\n full: string;\n sevenEighths: string;\n threeQuarters: string;\n fiveEighths: string;\n half: string;\n threeEighths: string;\n oneQuarter: string;\n oneEighth: string;\n empty: string;\n}\n\n/**\n * Vertical bar symbols: bottom-up block characters ▁▂▃▄▅▆▇█\n * 9 levels (including empty) for sub-cell precision.\n */\nexport const BarSets = {\n NINE_LEVELS: {\n full: '█', sevenEighths: '▇', threeQuarters: '▆', fiveEighths: '▅',\n half: '▄', threeEighths: '▃', oneQuarter: '▂', oneEighth: '▁', empty: ' ',\n },\n THREE_LEVELS: {\n full: '█', sevenEighths: '░', threeQuarters: '░', fiveEighths: '░',\n half: '▄', threeEighths: '░', oneQuarter: '░', oneEighth: '░', empty: ' ',\n },\n ASCII: {\n full: '#', sevenEighths: '#', threeQuarters: '#', fiveEighths: '#',\n half: '#', threeEighths: '-', oneQuarter: '-', oneEighth: '-', empty: ' ',\n },\n} as const satisfies Record<string, BarSet>;\n\n/** Ordered vertical bar symbols from empty to full (9 levels). */\nexport const VERTICAL_BAR_SYMBOLS: readonly string[] = [\n ' ', '▁', '▂', '▃', '▄', '▅', '▆', '▇', '█',\n];\n\n/** Ordered horizontal bar symbols from empty to full (9 levels). */\nexport const HORIZONTAL_BAR_SYMBOLS: readonly string[] = [\n ' ', '\\u258F', '\\u258E', '\\u258D', '\\u258C', '\\u258B', '\\u258A', '\\u2589', '\\u2588',\n];\n\n// ── Scrollbar Symbol Sets ────────────────────────────\n\nexport interface ScrollbarSet {\n track: string;\n thumb: string;\n begin: string;\n end: string;\n}\n\nexport const ScrollbarSets = {\n VERTICAL: { track: '│', thumb: '█', begin: '↑', end: '↓' },\n HORIZONTAL: { track: '─', thumb: '█', begin: '←', end: '→' },\n DOUBLE_VERTICAL: { track: '║', thumb: '▐', begin: '▲', end: '▼' },\n DOUBLE_HORIZONTAL: { track: '═', thumb: '▌', begin: '◄', end: '►' },\n} as const satisfies Record<string, ScrollbarSet>;\n\n// ── Line Symbol Sets ─────────────────────────────────\n\nexport interface LineSet {\n horizontal: string;\n vertical: string;\n cross: string;\n}\n\nexport const LineSets = {\n NORMAL: { horizontal: '─', vertical: '│', cross: '┼' },\n THICK: { horizontal: '━', vertical: '┃', cross: '╋' },\n DOUBLE: { horizontal: '═', vertical: '║', cross: '╬' },\n} as const satisfies Record<string, LineSet>;\n\n// ── Shade Symbols ────────────────────────────────────\n\nexport const Shade = {\n FULL: '█',\n DARK: '▓',\n MEDIUM: '▒',\n LIGHT: '░',\n EMPTY: ' ',\n} as const;\n\n// ── Braille Constants ────────────────────────────────\n\n/** Unicode braille range offset (U+2800). */\nexport const BRAILLE_OFFSET = 0x2800;\n\n/**\n * Braille dot bit positions.\n * Each row is [leftBit, rightBit] for a 2-wide, 4-tall braille cell.\n */\nexport const BRAILLE_DOTS: readonly (readonly [number, number])[] = [\n [0x01, 0x08],\n [0x02, 0x10],\n [0x04, 0x20],\n [0x40, 0x80],\n] as const;\n","// ─────────────────────────────────────────────────────\n// @termuijs/core — Test Backend\n// In-memory rendering for snapshot testing.\n// ─────────────────────────────────────────────────────\n\nimport type { Cell } from './Screen.js';\nimport { emptyCell } from './Screen.js';\n\n/**\n * In-memory grid that captures rendered output.\n * Use `createTestScreen()` to create one, render widgets into it,\n * then call `testScreenToString()` to get a plain-text snapshot.\n */\nexport interface TestScreen {\n readonly width: number;\n readonly height: number;\n cells: Cell[][];\n}\n\n/**\n * Create an in-memory test screen of the given dimensions.\n * Every cell starts as empty (space character, default colors).\n */\nexport function createTestScreen(width: number, height: number): TestScreen {\n const cells: Cell[][] = [];\n for (let row = 0; row < height; row++) {\n const rowCells: Cell[] = [];\n for (let col = 0; col < width; col++) {\n rowCells.push(emptyCell());\n }\n cells.push(rowCells);\n }\n return { width, height, cells };\n}\n\n/**\n * Set a cell in the test screen at (x, y).\n * Out-of-bounds writes are silently ignored.\n */\nexport function testScreenSetCell(screen: TestScreen, x: number, y: number, cell: Cell): void {\n if (x < 0 || x >= screen.width || y < 0 || y >= screen.height) {\n return;\n }\n const row = screen.cells[y];\n if (row) {\n row[x] = cell;\n }\n}\n\n/**\n * Get the cell at (x, y) in the test screen.\n * Returns undefined for out-of-bounds coordinates.\n */\nexport function testScreenGetCell(screen: TestScreen, x: number, y: number): Cell | undefined {\n if (x < 0 || x >= screen.width || y < 0 || y >= screen.height) {\n return undefined;\n }\n const row = screen.cells[y];\n return row ? row[x] : undefined;\n}\n\n/**\n * Convert the test screen to a plain-text string.\n * Each row becomes a line. Trailing spaces on each line are preserved.\n *\n * Example output:\n * ```\n * ┌Hello──┐\n * │World │\n * └───────┘\n * ```\n */\nexport function testScreenToString(screen: TestScreen): string {\n return screen.cells\n .map(row => row.map(cell => cell.char).join(''))\n .join('\\n');\n}\n\n/**\n * Clear the test screen, resetting all cells to empty.\n */\nexport function testScreenClear(screen: TestScreen): void {\n for (let y = 0; y < screen.height; y++) {\n const row = screen.cells[y];\n if (row) {\n for (let x = 0; x < screen.width; x++) {\n row[x] = emptyCell();\n }\n }\n }\n}\n\n/**\n * Write a string into the test screen starting at (x, y).\n * Characters that fall outside the screen bounds are clipped.\n */\nexport function testScreenSetString(\n screen: TestScreen,\n x: number,\n y: number,\n str: string,\n): void {\n let cx = x;\n for (const ch of str) {\n if (cx >= screen.width) break;\n if (cx >= 0 && y >= 0 && y < screen.height) {\n const row = screen.cells[y];\n if (row) {\n const cell = emptyCell();\n cell.char = ch;\n row[cx] = cell;\n }\n }\n cx++;\n }\n}\n","// ─────────────────────────────────────────────────────\n// @termuijs/core — Fallback (static) renderer for CI/pipes\n// ─────────────────────────────────────────────────────\n\nimport type { Screen } from '../terminal/Screen.js';\nimport { stripAnsi } from '../utils/unicode.js';\n\n/**\n * Detect if the terminal should use fallback (non-interactive) rendering.\n *\n * Returns true when:\n * - stdout is not a TTY (piped)\n * - CI environment variable is set\n * - TERM is 'dumb'\n * - NO_COLOR is set\n */\nexport function shouldUseFallback(): boolean {\n if (!process.stdout.isTTY) return true;\n if (process.env['CI']) return true;\n if (process.env['TERM'] === 'dumb') return true;\n return false;\n}\n\n/**\n * Render a Screen buffer as plain text (no ANSI, no interactivity).\n *\n * Reads all cells from the screen and produces a simple text representation.\n * Strips trailing whitespace from each line and removes empty trailing lines.\n */\nexport function renderFallback(screen: Screen): string {\n const lines: string[] = [];\n\n for (let r = 0; r < screen.rows; r++) {\n let line = '';\n for (let c = 0; c < screen.cols; c++) {\n const cell = screen.back[r][c];\n if (cell.width === 0) continue; // Skip continuation cells\n line += cell.char || ' ';\n }\n lines.push(line.trimEnd());\n }\n\n // Remove empty trailing lines\n while (lines.length > 0 && lines[lines.length - 1] === '') {\n lines.pop();\n }\n\n return lines.join('\\n');\n}\n","// ─────────────────────────────────────────────────────\n// @termuijs/core — Application lifecycle manager\n// ─────────────────────────────────────────────────────\n\nimport { Terminal, type TerminalOptions } from '../terminal/Terminal.js';\nimport { Screen } from '../terminal/Screen.js';\nimport { Renderer } from '../terminal/Renderer.js';\nimport { LayerManager } from '../terminal/LayerManager.js';\nimport { InputParser } from '../input/InputParser.js';\nimport { FocusManager } from '../events/FocusManager.js';\nimport { EventEmitter } from '../events/EventEmitter.js';\nimport { computeLayout, type LayoutNode } from '../layout/LayoutEngine.js';\nimport type { EventMap } from '../events/types.js';\nimport { createKeyEvent } from '../events/types.js';\nimport { renderFallback, shouldUseFallback } from './Fallback.js';\n\nexport interface AppOptions extends TerminalOptions {\n /** Frames per second for the render loop */\n fps?: number;\n /** Use alternate screen (full-screen mode). Default: true */\n fullscreen?: boolean;\n /** Enable mouse support. Default: false */\n mouse?: boolean;\n /** Force fallback (static) rendering */\n forceFallback?: boolean;\n /** Skip fallback detection — always run interactively. Default: false */\n skipFallback?: boolean;\n /** Title to set on the terminal window */\n title?: string;\n}\n\n/**\n * Widget interface that App expects for the root widget.\n * This is the minimum contract — the full Widget class in @termuijs/widgets extends this.\n */\nexport interface RootWidget {\n id: string;\n getLayoutNode(): LayoutNode;\n syncLayout?(): void;\n render(screen: Screen): void;\n mount?(): void;\n unmount?(): void;\n /** Check if this widget needs re-rendering (dirty flag) */\n isDirty?: boolean;\n /** Clear the dirty flag after rendering */\n clearDirty?(): void;\n}\n\n/**\n * Application lifecycle manager.\n *\n * Manages:\n * - Terminal setup/teardown (alt screen, raw mode, cursor, mouse)\n * - Screen buffer and renderer initialization\n * - Input parsing and event dispatch\n * - Layout computation and rect sync\n * - Render loop\n * - Graceful shutdown\n */\nexport class App {\n readonly terminal: Terminal;\n readonly screen: Screen;\n readonly renderer: Renderer;\n readonly input: InputParser;\n readonly focus: FocusManager;\n readonly events: EventEmitter<EventMap>;\n readonly layers: LayerManager;\n\n private _rootWidget: RootWidget;\n private _options: AppOptions;\n private _mounted = false;\n private _exitResolve: ((code: number) => void) | null = null;\n private _unsubKey: (() => void) | null = null;\n private _unsubMouse: (() => void) | null = null;\n private _widgetById = new Map<string, any>();\n\n constructor(rootWidget: RootWidget, options: AppOptions = {}) {\n this._rootWidget = rootWidget;\n this._options = {\n fullscreen: true,\n mouse: false,\n fps: 30,\n ...options,\n };\n\n this.terminal = new Terminal(options);\n this.screen = new Screen(this.terminal.cols, this.terminal.rows);\n this.renderer = new Renderer(this.terminal, this.screen, this._options.fps);\n this.input = new InputParser(this.terminal.stdin);\n this.focus = new FocusManager();\n this.events = new EventEmitter();\n this.layers = new LayerManager(this.terminal.cols, this.terminal.rows);\n }\n\n /**\n * Start the application.\n * Sets up the terminal, starts the render loop, and mounts the root widget.\n * Returns a promise that resolves when exit() is called.\n */\n async mount(): Promise<number> {\n if (this._mounted) return 0;\n\n // Check if we should use fallback mode\n if (this._options.forceFallback || (!this._options.skipFallback && shouldUseFallback())) {\n this._renderFallback();\n return 0;\n }\n\n this._mounted = true;\n\n // Set up terminal\n this.terminal.enterRawMode();\n if (this._options.fullscreen) {\n this.terminal.enterAltScreen();\n }\n this.terminal.hideCursor();\n\n if (this._options.mouse) {\n this.terminal.enableMouse();\n }\n\n if (this._options.title) {\n this.terminal.write(`\\x1b]0;${this._options.title}\\x07`);\n }\n\n // Handle resize\n this.terminal.onResize((cols, rows) => {\n this.screen.resize(cols, rows);\n this.screen.invalidate();\n this.layers.resize(cols, rows);\n this.events.emit('resize', { cols, rows });\n (this._rootWidget as any).markDirty?.();\n this.requestRender();\n });\n\n // Set up input handling\n this.input.start();\n\n // Forward key events with bubble dispatch\n this._unsubKey = this.input.onKey((rawEvent) => {\n const event = createKeyEvent({\n ...rawEvent,\n targetId: this.focus.currentId ?? undefined,\n });\n\n // Phase 1: Bubble dispatch — focused widget → parent → root\n const focusedId = this.focus.currentId;\n if (focusedId) {\n const chain = this._buildBubbleChain(focusedId);\n for (const widget of chain) {\n widget.events.emit('key', event);\n if (event._propagationStopped) break;\n }\n }\n\n // Phase 2: Default actions (Tab for focus cycling)\n if (!event._defaultPrevented) {\n if (event.key === 'tab' && !event.ctrl && !event.alt) {\n if (event.shift) {\n this.focus.focusPrev();\n } else {\n this.focus.focusNext();\n }\n }\n }\n\n // Phase 3: App-level broadcast (always fires unless stopped)\n if (!event._propagationStopped) {\n this.events.emit('key', event);\n }\n });\n\n // Forward mouse events\n this._unsubMouse = this.input.onMouse((event) => {\n this.events.emit('mouse', event);\n });\n\n // Start render loop — tick drives requestRender() so dirty widgets\n // (motion, timers) get redrawn without a separate setInterval.\n this.renderer.start(() => this.requestRender());\n\n // Mount root widget\n this._rootWidget.mount?.();\n this.events.emit('mount', undefined as any);\n\n // Initial render — invalidate front buffer to force full redraw\n this.screen.invalidate();\n this.requestRender();\n\n // Block until exit() is called\n return new Promise<number>((resolve) => {\n this._exitResolve = resolve;\n });\n }\n\n /**\n * Stop the application and restore terminal state.\n */\n unmount(): void {\n if (!this._mounted) return;\n this._mounted = false;\n\n this._rootWidget.unmount?.();\n this.events.emit('unmount', undefined as any);\n\n this._unsubKey?.();\n this._unsubKey = null;\n this._unsubMouse?.();\n this._unsubMouse = null;\n\n this.renderer.stop();\n this.input.stop();\n this.terminal.restore();\n this.events.removeAll();\n }\n\n /**\n * Create an overlay layer for rendering above normal widgets.\n * @param id Unique layer identifier (e.g. 'modal', 'select-dropdown', 'toast')\n * @param zIndex Stacking order (higher = rendered on top). Default: 100\n */\n addOverlay(id: string, zIndex = 100): void {\n this.layers.createLayer(id, zIndex);\n }\n\n /**\n * Remove an overlay layer.\n */\n removeOverlay(id: string): void {\n this.layers.removeLayer(id);\n }\n\n /**\n * Request a re-render on the next frame.\n * Skips layout + render pass when the root widget reports no dirty state.\n */\n requestRender(): void {\n if (!this._mounted) return;\n\n // Skip full layout pass if widget tree reports nothing has changed.\n // isDirty propagates upward via markDirty(), so the root being clean\n // means no descendant needs re-rendering either.\n // Do NOT call requestFrame() here — back buffer is stale after swap()\n // and flushing it would write old content over the current display.\n if (this._rootWidget.isDirty === false) {\n return;\n }\n\n // Compute layout\n const layoutRoot = this._rootWidget.getLayoutNode();\n computeLayout(layoutRoot, this.terminal.cols, this.terminal.rows);\n\n // Sync computed rects from layout tree back to widgets\n this._rootWidget.syncLayout?.();\n\n // Rebuild the widget ID cache so _buildBubbleChain can do O(1) lookups\n this._buildWidgetMap(this._rootWidget);\n\n // Clear the back buffer and render widgets into it\n this.screen.clear();\n this._rootWidget.render(this.screen);\n\n // Clear dirty flags now that we've rendered — future requestRender()\n // calls will skip layout until markDirty() is called again.\n this._rootWidget.clearDirty?.();\n\n // Composite overlay layers on top of the base rendering\n this.layers.composite(this.screen);\n\n this.renderer.requestFrame();\n }\n\n /**\n * Exit the app (convenience method).\n */\n exit(code = 0): void {\n this.unmount();\n if (this._exitResolve) {\n this._exitResolve(code);\n this._exitResolve = null;\n }\n }\n\n /**\n * Render in fallback (static) mode for non-interactive environments.\n */\n private _renderFallback(): void {\n const layoutRoot = this._rootWidget.getLayoutNode();\n computeLayout(layoutRoot, this.terminal.cols, this.terminal.rows);\n\n this._rootWidget.syncLayout?.();\n\n this.screen.clear();\n this._rootWidget.render(this.screen);\n\n const output = renderFallback(this.screen);\n this.terminal.write(output + '\\n');\n }\n\n /**\n * Build the bubble chain for keyboard events.\n * Returns an array: [focused widget, parent, grandparent, ..., root]\n * Uses the cached _widgetById map for O(1) lookup instead of DFS.\n */\n private _buildBubbleChain(widgetId: string): Array<{ events: { emit: (event: string, data: any) => void } }> {\n const chain: Array<{ events: { emit: (event: string, data: any) => void } }> = [];\n const widget = this._widgetById.get(widgetId); // O(1) lookup\n if (!widget) return chain;\n\n let current: any = widget;\n while (current) {\n if (current.events) {\n chain.push(current);\n }\n current = current.parent ?? null;\n }\n return chain;\n }\n\n /**\n * Rebuild the widget ID cache by walking the entire widget tree.\n * Called after syncLayout() so the map stays current.\n */\n private _buildWidgetMap(root: any): void {\n this._widgetById.clear();\n this._walkWidget(root);\n }\n\n private _walkWidget(widget: any): void {\n if (!widget) return;\n if (widget.id) this._widgetById.set(widget.id, widget);\n const children = widget._children ?? widget.children ?? [];\n if (Array.isArray(children)) {\n for (const child of children) {\n this._walkWidget(child);\n }\n }\n }\n}\n","// ─────────────────────────────────────────────────────\n// @termuijs/core — Unicode string width utilities\n// ─────────────────────────────────────────────────────\n\n/**\n * Check if a code point is a CJK (East Asian Wide/Fullwidth) character.\n * These characters occupy 2 terminal columns.\n *\n * Covers: CJK Unified Ideographs, Hangul Syllables, Katakana, Fullwidth Latin, etc.\n */\nfunction isWideChar(codePoint: number): boolean {\n return (\n // CJK Unified Ideographs (common Chinese/Japanese/Korean)\n (codePoint >= 0x4E00 && codePoint <= 0x9FFF) ||\n // CJK Unified Ideographs Extension A\n (codePoint >= 0x3400 && codePoint <= 0x4DBF) ||\n // CJK Compatibility Ideographs\n (codePoint >= 0xF900 && codePoint <= 0xFAFF) ||\n // Hangul Syllables\n (codePoint >= 0xAC00 && codePoint <= 0xD7AF) ||\n // Katakana\n (codePoint >= 0x30A0 && codePoint <= 0x30FF) ||\n // CJK Symbols and Punctuation\n (codePoint >= 0x3000 && codePoint <= 0x303F) ||\n // Hiragana\n (codePoint >= 0x3040 && codePoint <= 0x309F) ||\n // Fullwidth Forms\n (codePoint >= 0xFF01 && codePoint <= 0xFF60) ||\n (codePoint >= 0xFFE0 && codePoint <= 0xFFE6) ||\n // CJK Unified Ideographs Extension B\n (codePoint >= 0x20000 && codePoint <= 0x2A6DF) ||\n // CJK Unified Ideographs Extension C,D,E,F\n (codePoint >= 0x2A700 && codePoint <= 0x2EBEF) ||\n // CJK Compatibility Ideographs Supplement\n (codePoint >= 0x2F800 && codePoint <= 0x2FA1F)\n );\n}\n\n/**\n * Check if a code point is a combining character (zero-width).\n * These characters do not occupy any terminal column by themselves.\n */\nfunction isCombining(codePoint: number): boolean {\n return (\n // Combining Diacritical Marks\n (codePoint >= 0x0300 && codePoint <= 0x036F) ||\n // Combining Diacritical Marks Extended\n (codePoint >= 0x1AB0 && codePoint <= 0x1AFF) ||\n // Combining Diacritical Marks Supplement\n (codePoint >= 0x1DC0 && codePoint <= 0x1DFF) ||\n // Combining Diacritical Marks for Symbols\n (codePoint >= 0x20D0 && codePoint <= 0x20FF) ||\n // Combining Half Marks\n (codePoint >= 0xFE20 && codePoint <= 0xFE2F) ||\n // Variation selectors\n (codePoint >= 0xFE00 && codePoint <= 0xFE0F) ||\n // Zero-width joiner / non-joiner\n codePoint === 0x200B || codePoint === 0x200C || codePoint === 0x200D ||\n codePoint === 0xFEFF\n );\n}\n\n/**\n * Check if a character is an emoji that typically occupies 2 columns.\n * Simplified heuristic covering common emoji ranges.\n */\nfunction isEmoji(codePoint: number): boolean {\n return (\n // Emoticons\n (codePoint >= 0x1F600 && codePoint <= 0x1F64F) ||\n // Misc Symbols and Pictographs\n (codePoint >= 0x1F300 && codePoint <= 0x1F5FF) ||\n // Transport and Map\n (codePoint >= 0x1F680 && codePoint <= 0x1F6FF) ||\n // Supplemental Symbols\n (codePoint >= 0x1F900 && codePoint <= 0x1F9FF) ||\n // Misc symbols\n (codePoint >= 0x2600 && codePoint <= 0x26FF) ||\n // Dingbats\n (codePoint >= 0x2700 && codePoint <= 0x27BF) ||\n // Flags\n (codePoint >= 0x1F1E0 && codePoint <= 0x1F1FF)\n );\n}\n\n/**\n * Calculate the visual width of a string in terminal columns.\n *\n * - CJK characters count as 2 columns\n * - Emoji count as 2 columns\n * - Combining/zero-width characters count as 0\n * - ANSI escape sequences count as 0\n * - Regular characters count as 1\n */\nexport function stringWidth(str: string): number {\n let width = 0;\n let inEscape = false;\n\n for (const char of str) {\n const cp = char.codePointAt(0)!;\n\n // Skip ANSI escape sequences\n if (cp === 0x1B) { // ESC\n inEscape = true;\n continue;\n }\n if (inEscape) {\n // End of CSI sequence (letter after ESC[...m)\n if ((cp >= 0x40 && cp <= 0x7E) && cp !== 0x5B) {\n inEscape = false;\n }\n continue;\n }\n\n // Skip control characters\n if (cp < 0x20 || (cp >= 0x7F && cp < 0xA0)) {\n continue;\n }\n\n // Zero-width\n if (isCombining(cp)) {\n continue;\n }\n\n // Double-width\n if (isWideChar(cp) || isEmoji(cp)) {\n width += 2;\n continue;\n }\n\n width += 1;\n }\n\n return width;\n}\n\n/**\n * Truncate a string to the given visual width, preserving ANSI codes.\n * Appends an ellipsis character if truncated.\n */\nexport function truncate(str: string, maxWidth: number, ellipsis = '…'): string {\n if (maxWidth <= 0) return '';\n const strW = stringWidth(str);\n if (strW <= maxWidth) return str;\n\n const ellipsisW = stringWidth(ellipsis);\n const targetW = maxWidth - ellipsisW;\n if (targetW <= 0) return ellipsis.slice(0, maxWidth);\n\n let width = 0;\n let result = '';\n let inEscape = false;\n let escapeBuffer = '';\n\n for (const char of str) {\n const cp = char.codePointAt(0)!;\n\n if (cp === 0x1B) {\n inEscape = true;\n escapeBuffer += char;\n continue;\n }\n if (inEscape) {\n escapeBuffer += char;\n if ((cp >= 0x40 && cp <= 0x7E) && cp !== 0x5B) {\n inEscape = false;\n result += escapeBuffer;\n escapeBuffer = '';\n }\n continue;\n }\n\n let charW = 1;\n if (isCombining(cp)) {\n charW = 0;\n } else if (isWideChar(cp) || isEmoji(cp)) {\n charW = 2;\n } else if (cp < 0x20 || (cp >= 0x7F && cp < 0xA0)) {\n charW = 0;\n }\n\n if (width + charW > targetW) break;\n width += charW;\n result += char;\n }\n\n return result + ellipsis;\n}\n\n/**\n * Strip all ANSI escape sequences from a string.\n */\nexport function stripAnsi(str: string): string {\n // eslint-disable-next-line no-control-regex\n return str.replace(/\\x1b\\[[0-9;]*[a-zA-Z]/g, '');\n}\n\n/**\n * Word-wrap text to a given width, respecting existing newlines.\n * Does not handle ANSI codes within words (wraps at the character level).\n */\nexport function wordWrap(str: string, width: number): string {\n if (width <= 0) return str;\n\n const lines = str.split('\\n');\n const result: string[] = [];\n\n for (const line of lines) {\n if (stringWidth(line) <= width) {\n result.push(line);\n continue;\n }\n\n let currentLine = '';\n let currentWidth = 0;\n const words = line.split(/(\\s+)/);\n\n for (const word of words) {\n const wordW = stringWidth(word);\n\n if (currentWidth + wordW <= width) {\n currentLine += word;\n currentWidth += wordW;\n } else if (wordW > width) {\n // Word is longer than width — break it\n if (currentLine) {\n result.push(currentLine);\n currentLine = '';\n currentWidth = 0;\n }\n for (const char of word) {\n const cp = char.codePointAt(0)!;\n const charW = (isWideChar(cp) || isEmoji(cp)) ? 2 : (isCombining(cp) ? 0 : 1);\n if (currentWidth + charW > width) {\n result.push(currentLine);\n currentLine = '';\n currentWidth = 0;\n }\n currentLine += char;\n currentWidth += charW;\n }\n } else {\n result.push(currentLine);\n currentLine = word.trimStart();\n currentWidth = stringWidth(currentLine);\n }\n }\n\n if (currentLine) {\n result.push(currentLine);\n }\n }\n\n return result.join('\\n');\n}\n"],"mappings":"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","names":["ColorDepth","ratio","nodeWidth","nodeHeight","min","max","resolveSize"]}
|
|
1
|
+
{"version":3,"sources":["../src/style/Color.ts","../src/utils/ansi.ts","../src/terminal/Terminal.ts","../src/utils/unicode.ts","../src/terminal/env-caps.ts","../src/terminal/Screen.ts","../src/renderer/render-hook.ts","../src/terminal/Renderer.ts","../src/terminal/LayerManager.ts","../src/terminal/ascii-map.ts","../src/terminal/bell.ts","../src/renderer/border-merge.ts","../src/input/InputParser.ts","../src/events/types.ts","../src/input/KeyMap.ts","../src/input/MouseParser.ts","../src/events/EventEmitter.ts","../src/input/MouseGestures.ts","../src/input/ChordMatcher.ts","../src/renderer/live-render.ts","../src/style/Style.ts","../src/style/Border.ts","../src/layout/pos.ts","../src/layout/dim.ts","../src/layout/constraint.ts","../src/layout/LayoutEngine.ts","../src/layout/Rect.ts","../src/events/FocusManager.ts","../src/style/symbols.ts","../src/terminal/TestBackend.ts","../src/app/Fallback.ts","../src/inline-viewport.ts","../src/app/App.ts","../src/utils/debounce.ts"],"sourcesContent":["// ─────────────────────────────────────────────────────\n// @termuijs/core — Color types and color profile detection\n// ─────────────────────────────────────────────────────\n\n/**\n * Supported color depth levels, ordered from least to most capable.\n */\nexport enum ColorDepth {\n /** No color support (e.g. NO_COLOR env var set) */\n None = 0,\n /** 4-bit, 16 colors (standard ANSI) */\n Basic = 4,\n /** 8-bit, 256 colors */\n Ansi256 = 8,\n /** 24-bit, 16.7 million colors (true color) */\n TrueColor = 24,\n}\n\n/**\n * Represents a color value in the terminal.\n * Supports named ANSI colors, 256-color palette, and RGB true color.\n */\nexport type Color =\n | { type: 'named'; name: NamedColor }\n | { type: 'ansi256'; code: number }\n | { type: 'rgb'; r: number; g: number; b: number }\n | { type: 'hex'; hex: string }\n | { type: 'none' };\n\nexport type NamedColor =\n | 'black' | 'red' | 'green' | 'yellow'\n | 'blue' | 'magenta' | 'cyan' | 'white'\n | 'brightBlack' | 'brightRed' | 'brightGreen' | 'brightYellow'\n | 'brightBlue' | 'brightMagenta' | 'brightCyan' | 'brightWhite';\n\n/** Maps named colors to their ANSI 4-bit foreground code offsets (30-37, 90-97). */\nconst NAMED_TO_ANSI: Record<NamedColor, number> = {\n black: 0, red: 1, green: 2, yellow: 3,\n blue: 4, magenta: 5, cyan: 6, white: 7,\n brightBlack: 8, brightRed: 9, brightGreen: 10, brightYellow: 11,\n brightBlue: 12, brightMagenta: 13, brightCyan: 14, brightWhite: 15,\n};\n\n/** Maps named colors to approximate RGB for downgrading. */\nconst NAMED_TO_RGB: Record<NamedColor, [number, number, number]> = {\n black: [0, 0, 0], red: [170, 0, 0], green: [0, 170, 0], yellow: [170, 170, 0],\n blue: [0, 0, 170], magenta: [170, 0, 170], cyan: [0, 170, 170], white: [170, 170, 170],\n brightBlack: [85, 85, 85], brightRed: [255, 85, 85], brightGreen: [85, 255, 85], brightYellow: [255, 255, 85],\n brightBlue: [85, 85, 255], brightMagenta: [255, 85, 255], brightCyan: [85, 255, 255], brightWhite: [255, 255, 255],\n};\n\n/**\n * Parse a color string into a Color object.\n *\n * Accepts:\n * - Named colors: 'red', 'brightBlue', etc.\n * - Hex: '#ff0000', '#f00'\n * - RGB: 'rgb(255, 0, 0)'\n * - ANSI 256: 'ansi256(196)'\n */\nexport function parseColor(input: string): Color {\n if (input === 'none' || input === '') {\n return { type: 'none' };\n }\n\n // Named color\n if (input in NAMED_TO_ANSI) {\n return { type: 'named', name: input as NamedColor };\n }\n\n // Hex color\n if (input.startsWith('#')) {\n let hex = input.slice(1);\n if (hex.length === 3) {\n hex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2];\n }\n if (hex.length === 6 && /^[0-9a-fA-F]{6}$/.test(hex)) {\n return { type: 'hex', hex: '#' + hex.toLowerCase() };\n }\n // Invalid hex — return none instead of crashing\n return { type: 'none' };\n }\n\n // RGB color\n const rgbMatch = input.match(/^rgb\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*\\)$/);\n if (rgbMatch) {\n const r = Math.min(255, parseInt(rgbMatch[1], 10));\n const g = Math.min(255, parseInt(rgbMatch[2], 10));\n const b = Math.min(255, parseInt(rgbMatch[3], 10));\n return { type: 'rgb', r, g, b };\n }\n\n // ANSI 256\n const ansi256Match = input.match(/^ansi256\\(\\s*(\\d{1,3})\\s*\\)$/);\n if (ansi256Match) {\n const code = Math.min(255, parseInt(ansi256Match[1], 10));\n return { type: 'ansi256', code };\n }\n\n // Unknown format — return none instead of crashing\n return { type: 'none' };\n}\n\n/**\n * Convert any Color to its RGB representation.\n */\nexport function colorToRgb(color: Color): [number, number, number] {\n switch (color.type) {\n case 'none':\n return [0, 0, 0];\n case 'named':\n return NAMED_TO_RGB[color.name];\n case 'rgb':\n return [color.r, color.g, color.b];\n case 'hex': {\n const hex = color.hex.slice(1);\n return [\n parseInt(hex.slice(0, 2), 16),\n parseInt(hex.slice(2, 4), 16),\n parseInt(hex.slice(4, 6), 16),\n ];\n }\n case 'ansi256':\n return ansi256ToRgb(color.code);\n }\n}\n\n/**\n * Convert an ANSI 256 code to approximate RGB.\n */\nfunction ansi256ToRgb(code: number): [number, number, number] {\n // Standard colors (0-15) — use named mapping\n if (code < 16) {\n const names = Object.keys(NAMED_TO_RGB) as NamedColor[];\n return NAMED_TO_RGB[names[code]];\n }\n // Extended 216-color cube (16-231)\n if (code < 232) {\n const idx = code - 16;\n const b = (idx % 6) * 51;\n const g = (Math.floor(idx / 6) % 6) * 51;\n const r = Math.floor(idx / 36) * 51;\n return [r, g, b];\n }\n // Grayscale ramp (232-255)\n const gray = (code - 232) * 10 + 8;\n return [gray, gray, gray];\n}\n\n/**\n * Find the nearest ANSI 256 color code for a given RGB.\n */\nfunction rgbToAnsi256(r: number, g: number, b: number): number {\n // Check if it's a grayscale\n if (r === g && g === b) {\n if (r < 8) return 16;\n if (r > 248) return 231;\n return Math.round((r - 8) / 247 * 24) + 232;\n }\n return 16\n + 36 * Math.round(r / 255 * 5)\n + 6 * Math.round(g / 255 * 5)\n + Math.round(b / 255 * 5);\n}\n\n/**\n * Find the nearest ANSI 4-bit basic color for a given RGB.\n */\nfunction rgbToBasic(r: number, g: number, b: number): number {\n let minDist = Infinity;\n let best = 0;\n const names = Object.keys(NAMED_TO_RGB) as NamedColor[];\n for (let i = 0; i < names.length; i++) {\n const [cr, cg, cb] = NAMED_TO_RGB[names[i]];\n const dist = (r - cr) ** 2 + (g - cg) ** 2 + (b - cb) ** 2;\n if (dist < minDist) {\n minDist = dist;\n best = i;\n }\n }\n return best;\n}\n\n/**\n * Detect the terminal's color depth from environment variables.\n */\nexport function detectColorDepth(): ColorDepth {\n const env = process.env;\n\n // Respect NO_COLOR convention (https://no-color.org/)\n if (env['NO_COLOR'] !== undefined) {\n return ColorDepth.None;\n }\n\n // Force color via FORCE_COLOR\n if (env['FORCE_COLOR'] !== undefined) {\n const level = parseInt(env['FORCE_COLOR'], 10);\n if (level === 0) return ColorDepth.None;\n if (level === 1) return ColorDepth.Basic;\n if (level === 2) return ColorDepth.Ansi256;\n if (level >= 3) return ColorDepth.TrueColor;\n }\n\n // Check COLORTERM for true color\n const colorterm = env['COLORTERM'];\n if (colorterm === 'truecolor' || colorterm === '24bit') {\n return ColorDepth.TrueColor;\n }\n\n // Check TERM for 256 color\n const term = env['TERM'] || '';\n if (term === 'dumb') {\n return ColorDepth.None;\n }\n if (term.includes('256color') || term.includes('256')) {\n return ColorDepth.Ansi256;\n }\n\n // Check for common color-capable terminals\n if (env['TERM_PROGRAM'] === 'iTerm.app' || env['TERM_PROGRAM'] === 'Hyper') {\n return ColorDepth.TrueColor;\n }\n\n // Default to basic if stdout is a TTY\n if (process.stdout?.isTTY) {\n return ColorDepth.Basic;\n }\n\n return ColorDepth.None;\n}\n\n/**\n * Generate the ANSI escape codes for a foreground color at the given depth.\n */\nexport function colorToAnsiFg(color: Color, depth: ColorDepth): string {\n if (color.type === 'none' || depth === ColorDepth.None) return '';\n const [r, g, b] = colorToRgb(color);\n\n switch (depth) {\n case ColorDepth.TrueColor:\n return `\\x1b[38;2;${r};${g};${b}m`;\n case ColorDepth.Ansi256:\n return `\\x1b[38;5;${rgbToAnsi256(r, g, b)}m`;\n case ColorDepth.Basic: {\n const idx = rgbToBasic(r, g, b);\n return idx < 8 ? `\\x1b[${30 + idx}m` : `\\x1b[${90 + idx - 8}m`;\n }\n default:\n return '';\n }\n}\n\n/**\n * Generate the ANSI escape codes for a background color at the given depth.\n */\nexport function colorToAnsiBg(color: Color, depth: ColorDepth): string {\n if (color.type === 'none' || depth === ColorDepth.None) return '';\n const [r, g, b] = colorToRgb(color);\n\n switch (depth) {\n case ColorDepth.TrueColor:\n return `\\x1b[48;2;${r};${g};${b}m`;\n case ColorDepth.Ansi256:\n return `\\x1b[48;5;${rgbToAnsi256(r, g, b)}m`;\n case ColorDepth.Basic: {\n const idx = rgbToBasic(r, g, b);\n return idx < 8 ? `\\x1b[${40 + idx}m` : `\\x1b[${100 + idx - 8}m`;\n }\n default:\n return '';\n }\n}\n\n// ── WCAG Contrast Utilities ──────────────────────────\n\n/**\n * Compute relative luminance per WCAG 2.1.\n * Returns value in [0, 1] where 0 = black, 1 = white.\n */\nexport function relativeLuminance(color: Color): number {\n const [r, g, b] = colorToRgb(color);\n const linearize = (c: number): number => {\n const sRGB = c / 255;\n return sRGB <= 0.03928 ? sRGB / 12.92 : Math.pow((sRGB + 0.055) / 1.055, 2.4);\n };\n return 0.2126 * linearize(r) + 0.7152 * linearize(g) + 0.0722 * linearize(b);\n}\n\n/**\n * Compute WCAG 2.1 contrast ratio between foreground and background colors.\n * Returns value in [1, 21] where 21 is maximum contrast (black on white).\n */\nexport function contrastRatio(fg: Color, bg: Color): number {\n const l1 = relativeLuminance(fg);\n const l2 = relativeLuminance(bg);\n const lighter = Math.max(l1, l2);\n const darker = Math.min(l1, l2);\n return (lighter + 0.05) / (darker + 0.05);\n}\n\n/**\n * Determine WCAG 2.1 conformance level for a contrast ratio.\n * @param ratio Result of contrastRatio()\n * @param large True if text is large (18pt+ regular or 14pt+ bold). Default: false.\n */\nexport function wcagLevel(ratio: number, large = false): 'AAA' | 'AA' | 'A' | 'fail' {\n if (large) {\n if (ratio >= 4.5) return 'AAA';\n if (ratio >= 3.0) return 'AA';\n return 'fail';\n }\n if (ratio >= 7.0) return 'AAA';\n if (ratio >= 4.5) return 'AA';\n if (ratio >= 3.0) return 'A';\n return 'fail';\n}\n\nexport interface ContrastFailure {\n /** Description of the color pair, e.g. 'fg on bg' */\n pair: string;\n ratio: number;\n level: 'A' | 'fail';\n required: 'AA';\n}\n\n/**\n * Validate contrast for key pairs in a theme (hex string map).\n * Checks: fg/bg, primary/bg, error/bg, success/bg, warning/bg, muted/bg.\n * Returns failures (pairs below AA = 4.5:1 for normal text).\n */\nexport function validateThemeContrast(theme: Record<string, string>): ContrastFailure[] {\n const failures: ContrastFailure[] = [];\n const bg = theme['bg'];\n if (!bg) return failures;\n\n const bgColor = parseColor(bg);\n const pairs: Array<[string, string | undefined]> = [\n ['fg on bg', theme['fg']],\n ['primary on bg', theme['primary']],\n ['error on bg', theme['error']],\n ['success on bg', theme['success']],\n ['warning on bg', theme['warning']],\n ['muted on bg', theme['muted']],\n ];\n\n for (const [label, hex] of pairs) {\n if (!hex) continue;\n const fgColor = parseColor(hex);\n const ratio = contrastRatio(fgColor, bgColor);\n const level = wcagLevel(ratio);\n if (level !== 'AAA' && level !== 'AA') {\n failures.push({ pair: label, ratio: Math.round(ratio * 100) / 100, level: level as 'A' | 'fail', required: 'AA' });\n }\n }\n\n return failures;\n}\n","/**\n * Core terminal utility functions for ANSI escape sequences.\n * Handles layout formatting, terminal bells, and notification configurations.\n */\n\n// ─────────────────────────────────────────────────────\n// @termuijs/core — ANSI escape sequence helpers\n// ─────────────────────────────────────────────────────\n\n/** CSI (Control Sequence Introducer) prefix */\nexport const CSI = '\\x1b[';\n/** OSC (Operating System Command) prefix */\nexport const OSC = '\\x1b]';\n/** ESC character */\nexport const ESC = '\\x1b';\n\n// ── Cursor Control ──────────────────────────────────\n\nexport const hideCursor = `${CSI}?25l`;\nexport const showCursor = `${CSI}?25h`;\nexport const saveCursorPosition = `${CSI}s`;\nexport const restoreCursorPosition = `${CSI}u`;\n\nexport type CursorShape = 'block' | 'bar' | 'underline';\n\n/** DECSCUSR: CSI Ps SP q. blink toggles steady vs blinking. */\nexport function cursorShape(shape: CursorShape, blink = true): string {\n const codes: Record<CursorShape, number> = {\n block: 1,\n underline: 3,\n bar: 5,\n };\n const code = codes[shape] + (blink ? 0 : 1);\n return `${CSI}${code} q`;\n}\n\nexport function moveTo(col: number, row: number): string {\n return `${CSI}${row + 1};${col + 1}H`;\n}\n\nexport function moveUp(n = 1): string { return `${CSI}${n}A`; }\nexport function moveDown(n = 1): string { return `${CSI}${n}B`; }\nexport function moveRight(n = 1): string { return `${CSI}${n}C`; }\nexport function moveLeft(n = 1): string { return `${CSI}${n}D`; }\n\nexport const requestCursorPosition = `${CSI}6n`;\n\n// ── Screen Control ──────────────────────────────────\n\nexport const clearScreen = `${CSI}2J`;\nexport const clearLine = `${CSI}2K`;\nexport const clearLineToEnd = `${CSI}0K`;\nexport const clearLineToStart = `${CSI}1K`;\nexport const clearDown = `${CSI}J`;\nexport const clearUp = `${CSI}1J`;\n\n// ── Alternate Screen Buffer ─────────────────────────\n\nexport const enterAltScreen = `${CSI}?1049h`;\nexport const exitAltScreen = `${CSI}?1049l`;\n\n// ── Synchronized Output (CSI 2026) ──────────────────\n\n/** Begin synchronized update — terminal holds display until end marker */\nexport const beginSyncUpdate = `${CSI}?2026h`;\n/** End synchronized update — terminal flushes all pending changes atomically */\nexport const endSyncUpdate = `${CSI}?2026l`;\n\n// ── Mouse Tracking ──────────────────────────────────\n\n/** Enable SGR mouse tracking (most compatible modern mode) */\nexport const enableMouse = `${CSI}?1000h${CSI}?1002h${CSI}?1006h`;\n/** Disable mouse tracking */\nexport const disableMouse = `${CSI}?1000l${CSI}?1002l${CSI}?1006l`;\n\n// ── Bracketed Paste ─────────────────────────────────\n\nexport const enableBracketedPaste = `${CSI}?2004h`;\nexport const disableBracketedPaste = `${CSI}?2004l`;\n\n// ── Focus Tracking ──────────────────────────────────\n\nexport const enableFocusTracking = `${CSI}?1004h`;\nexport const disableFocusTracking = `${CSI}?1004l`;\n\n// ── Text Styling ────────────────────────────────────\n\nexport const reset = `${CSI}0m`;\nexport const bold = `${CSI}1m`;\nexport const dim = `${CSI}2m`;\nexport const italic = `${CSI}3m`;\nexport const underline = `${CSI}4m`;\nexport const blink = `${CSI}5m`;\nexport const inverse = `${CSI}7m`;\nexport const strikethrough = `${CSI}9m`;\n\nexport const resetBold = `${CSI}22m`;\nexport const resetDim = `${CSI}22m`;\nexport const resetItalic = `${CSI}23m`;\nexport const resetUnderline = `${CSI}24m`;\nexport const resetBlink = `${CSI}25m`;\nexport const resetInverse = `${CSI}27m`;\nexport const resetStrikethrough = `${CSI}29m`;\n\n// ── Scrolling Region ────────────────────────────────\n\nexport function setScrollRegion(top: number, bottom: number): string {\n return `${CSI}${top + 1};${bottom + 1}r`;\n}\nexport const resetScrollRegion = `${CSI}r`;\n\n// ── Title ───────────────────────────────────────────\n\nexport function setTitle(title: string): string {\n return `${OSC}0;${title}\\x07`;\n}\n\n// ── Hyperlinks (OSC 8) ──────────────────────────────\n\n/** OSC 8 open: ESC ] 8 ; ; <url> ST. */\nexport function hyperlinkOpen(url: string): string {\n // Block non-http/https/file schemes (e.g. javascript:, data:).\n if (!/^(https?|file):\\/\\//i.test(url)) return '';\n // Strip C0/C1 controls and ESC to prevent terminal escape injection.\n const safeUrl = url.replace(/[\\u0000-\\u001F\\u007F-\\u009F\\u001B]/g, '');\n return `\\x1b]8;;${safeUrl}\\x1b\\\\`;\n}\n\n/** OSC 8 close: ESC ] 8 ; ; ST. */\nexport const hyperlinkClose: string = '\\x1b]8;;\\x1b\\\\';\n\n/** The BEL control byte. */\nexport const bell = '\\x07';\n\n/** OSC 9 desktop notification: ESC ] 9 ; <text> BEL. */\nexport function notify(text: string): string {\n // Strip C0/C1 controls and ESC to prevent terminal escape injection.\n const safeText = text.replace(/[\\u0000-\\u001F\\u007F-\\u009F\\u001B]/g, '');\n return `${OSC}9;${safeText}${bell}`;\n}\n\n// ── Security: ANSI/control stripping ────────────────\n\n/**\n * Strip ANSI escape sequences and dangerous C0/C1 control characters from a\n * string, while keeping printable Unicode intact.\n *\n * Removes:\n * - All ESC-introduced sequences (CSI, OSC, DCS, PM, APC, SS2/SS3, etc.)\n * - Bare C0 controls (0x00-0x1F) except TAB (0x09) and LF (0x0A)\n * - C1 controls / DEL (0x7F-0x9F)\n *\n * Safe for use on user-supplied or file-read strings before they are rendered\n * to the terminal.\n */\nexport function stripAnsiControl(str: string): string {\n // Remove all ESC-introduced sequences (CSI, OSC, DCS, SS2/SS3, etc.)\n // eslint-disable-next-line no-control-regex\n let out = str.replace(\n /\\x1b(?:[@-Z\\\\-_]|\\[[0-9;]*[a-zA-Z]|\\][^\\x07\\x1b]*(?:\\x07|\\x1b\\\\)|[PX^_][^\\x1b]*\\x1b\\\\|.)/g,\n ''\n );\n // Remove remaining bare C0 controls (keep TAB=0x09, LF=0x0A) and C1/DEL\n // eslint-disable-next-line no-control-regex\n out = out.replace(/[\\x00-\\x08\\x0B-\\x1F\\x7F-\\x9F]/g, '');\n return out;\n}\n\n// ── Clipboard ───────────────────────────────────────\n\n/**\n * Write text to the system clipboard via OSC 52.\n * Supported by: xterm, iTerm2, Kitty, WezTerm, Alacritty, Windows Terminal.\n * @param text Plain text to copy to clipboard\n * @param stdout Target stream (default: process.stdout)\n */\nexport function writeClipboard(text: string, stdout: NodeJS.WriteStream = process.stdout): void {\n const encoded = Buffer.from(text, 'utf8').toString('base64');\n stdout.write(`${OSC}52;c;${encoded}\\x07`);\n}\nexport function readClipboard(\n stdin: NodeJS.ReadStream = process.stdin,\n stdout: NodeJS.WriteStream = process.stdout\n): Promise<string> {\n return new Promise((resolve, reject) => {\n const handler = (data: Buffer) => {\n const str = data.toString('utf8');\n\n const match = str.match(/\\x1b\\]52;c;([^\\x07]+)\\x07/);\n\n if (!match) return;\n\n stdin.off('data', handler);\n\n try {\n resolve(\n Buffer.from(match[1], 'base64').toString('utf8')\n );\n } catch (err) {\n reject(err);\n }\n };\n\n stdin.on('data', handler);\n\n stdout.write(`${OSC}52;c;?\\x07`);\n });\n}\n\nexport const clipboard = {\n write: writeClipboard,\n read: readClipboard,\n};\n","// ─────────────────────────────────────────────────────\n// @termuijs/core — Terminal adapter\n// ─────────────────────────────────────────────────────\n\nimport { ColorDepth, detectColorDepth } from '../style/Color.js';\nimport * as ansi from '../utils/ansi.js';\n\nexport interface TerminalOptions {\n /** Override stdout stream (useful for testing) */\n stdout?: NodeJS.WriteStream;\n /** Override stdin stream (useful for testing) */\n stdin?: NodeJS.ReadStream;\n /** Force a specific color depth */\n colorDepth?: ColorDepth;\n /** Enable mouse tracking */\n mouse?: boolean;\n /** Use alternate screen buffer for full-screen apps */\n altScreen?: boolean;\n /** Enable bracketed-paste mode so InputParser receives paste events. */\n bracketedPaste?: boolean;\n /** Debounce window in ms for resize dispatch. Default 16. */\n resizeDebounceMs?: number;\n}\n\n/**\n * Terminal adapter — wraps process.stdout/stdin and manages\n * terminal state (raw mode, cursor, mouse, alternate screen).\n */\nexport class Terminal {\n readonly stdout: NodeJS.WriteStream;\n readonly stdin: NodeJS.ReadStream;\n readonly colorDepth: ColorDepth;\n\n private _cols: number;\n private _rows: number;\n private _isRawMode = false;\n private _isAltScreen = false;\n private _isMouseEnabled = false;\n private _isBracketedPasteEnabled = false;\n private _resizeHandlers: Array<(cols: number, rows: number) => void> = [];\n private _cleanupHandlers: Array<() => void> = [];\n private _originalRawMode: boolean | undefined;\n\n // Debounce state properties\n private _resizeDebounceMs: number;\n private _resizeTimer: ReturnType<typeof setTimeout> | null = null;\n private _lastDispatchedCols: number;\n private _lastDispatchedRows: number;\n\n // Stored handler references for proper cleanup\n private _resizeHandler: (() => void) | null = null;\n private _exitHandler: (() => void) | null = null;\n private _restored = false;\n private _restoring = false;\n\n // Stream write queue state to prevent interleaving backpressure fragmentation\n private _writeQueue: string[] = [];\n private _isWriting = false;\n\n constructor(options: TerminalOptions = {}) {\n this.stdout = options.stdout ?? process.stdout;\n this.stdin = options.stdin ?? process.stdin;\n this.colorDepth = options.colorDepth ?? detectColorDepth();\n\n this._cols = this.stdout.columns ?? 80;\n this._rows = this.stdout.rows ?? 24;\n\n this._resizeDebounceMs = options.resizeDebounceMs ?? 16;\n this._lastDispatchedCols = this._cols;\n this._lastDispatchedRows = this._rows;\n\n // Listen for terminal resize (store ref for cleanup)\n this._resizeHandler = () => {\n // Update immediately so getters are fresh\n this._cols = this.stdout.columns ?? 80;\n this._rows = this.stdout.rows ?? 24;\n\n // Clear existing debounce timer\n if (this._resizeTimer) {\n clearTimeout(this._resizeTimer);\n }\n\n // Schedule debounced dispatch\n this._resizeTimer = setTimeout(() => {\n this._resizeTimer = null;\n\n // Dedup check: skip if dims match the last dispatched dims\n if (this._cols !== this._lastDispatchedCols || this._rows !== this._lastDispatchedRows) {\n this._lastDispatchedCols = this._cols;\n this._lastDispatchedRows = this._rows;\n\n const handlers = [...this._resizeHandlers];\n for (const handler of handlers) {\n handler(this._cols, this._rows);\n }\n }\n }, this._resizeDebounceMs);\n };\n this.stdout.on('resize', this._resizeHandler);\n\n // Set up cleanup on process exit\n this._setupCleanup();\n if (options.bracketedPaste) {\n this.enableBracketedPaste();\n }\n }\n\n /** Current terminal width in columns */\n get cols(): number { return this._cols; }\n /** Current terminal height in rows */\n get rows(): number { return this._rows; }\n\n /** Whether stdin is a TTY (interactive) */\n isInteractive(): boolean {\n return Boolean(this.stdin.isTTY) && !process.env['CI'];\n }\n\n /** Whether the terminal supports raw mode */\n supportsRawMode(): boolean {\n return Boolean(this.stdin.isTTY && typeof this.stdin.setRawMode === 'function');\n }\n\n // ── Raw Mode ────────────────────────────────────────\n\n enterRawMode(): void {\n if (this._isRawMode || !this.supportsRawMode()) return;\n this._originalRawMode = this.stdin.isRaw;\n this.stdin.setRawMode(true);\n this.stdin.resume();\n this._isRawMode = true;\n }\n\n exitRawMode(): void {\n if (!this._isRawMode) return;\n this.stdin.setRawMode(this._originalRawMode ?? false);\n this.stdin.pause();\n this._isRawMode = false;\n }\n\n // ── Alternate Screen ────────────────────────────────\n\n enterAltScreen(): void {\n if (this._isAltScreen) return;\n this.write(ansi.enterAltScreen);\n this._isAltScreen = true;\n }\n\n exitAltScreen(): void {\n if (!this._isAltScreen) return;\n this.write(ansi.exitAltScreen);\n this._isAltScreen = false;\n }\n\n // ── Mouse ───────────────────────────────────────────\n\n enableMouse(): void {\n if (this._isMouseEnabled) return;\n this.write(ansi.enableMouse);\n this._isMouseEnabled = true;\n }\n\n disableMouse(): void {\n if (!this._isMouseEnabled) return;\n this.write(ansi.disableMouse);\n this._isMouseEnabled = false;\n }\n\n /** Emit the enable sequence (CSI ?2004h). Idempotent. */\n enableBracketedPaste(): void {\n if (this._isBracketedPasteEnabled) return;\n this.write(ansi.enableBracketedPaste);\n this._isBracketedPasteEnabled = true;\n }\n\n /** Emit the disable sequence (CSI ?2004l). Idempotent. */\n disableBracketedPaste(): void {\n if (!this._isBracketedPasteEnabled) return;\n this.write(ansi.disableBracketedPaste);\n this._isBracketedPasteEnabled = false;\n }\n\n // ── Cursor ──────────────────────────────────────────\n\n hideCursor(): void { this.write(ansi.hideCursor); }\n showCursor(): void { this.write(ansi.showCursor); }\n\n /** Set the cursor shape via DECSCUSR. Default blink = true. */\n setCursorShape(shape: ansi.CursorShape, blink?: boolean): void {\n this.write(ansi.cursorShape(shape, blink));\n }\n\n /** Ring the terminal bell (BEL). */\n bell(): void { this.write(ansi.bell); }\n\n /** Send an OSC 9 desktop notification. Body is appended after a separator. */\n notify(title: string, body?: string): void {\n const payload = body === undefined ? title : `${title}: ${body}`;\n this.write(ansi.notify(payload));\n }\n\n // ── Output ──────────────────────────────────────────\n\n /**\n * Writes chunked string data to stdout.\n * Enforces queue serialization to ensure atomic ANSI escape execution.\n */\n write(data: string): void {\n if (!data) return;\n \n this._writeQueue.push(data);\n if (this._isWriting) return;\n\n this._processWriteQueue();\n }\n\n /**\n * Writes data to stdout synchronously, bypassing the write queue.\n * Used by the renderer during frame flush to avoid races with the\n * async queue lifecycle. Only use for render-path output.\n */\n writeSync(data: string): void {\n if (!data) return;\n this.stdout.write(data);\n }\n\n /**\n * Sequentially unshifts and drains string frames to stdout safely.\n */\n private _processWriteQueue(): void {\n if (this._writeQueue.length === 0) {\n this._isWriting = false;\n return;\n }\n\n this._isWriting = true;\n const chunk = this._writeQueue.shift()!;\n\n // Execute write operation\n const canContinue = this.stdout.write(chunk);\n\n if (!canContinue) {\n // Buffer saturation hit; halt processing until kernel drains stream cache\n this.stdout.once('drain', () => {\n this._processWriteQueue();\n });\n } else {\n // Proceed instantly via synchronous event-loop cycle\n this._processWriteQueue();\n }\n }\n\n // ── Clipboard ───────────────────────────────────────\n\n /**\n * Read text from the system clipboard via OSC 52.\n */\n readClipboard(): Promise<string> {\n return ansi.readClipboard(this.stdin, this.stdout);\n }\n\n /**\n * Write text to the system clipboard via OSC 52.\n */\n writeClipboard(text: string): void {\n ansi.writeClipboard(text, this.stdout);\n }\n\n // ── Resize ──────────────────────────────────────────\n\n onResize(handler: (cols: number, rows: number) => void): () => void {\n this._resizeHandlers.push(handler);\n return () => {\n const idx = this._resizeHandlers.indexOf(handler);\n if (idx >= 0) this._resizeHandlers.splice(idx, 1);\n };\n }\n\n // ── Cleanup ─────────────────────────────────────────\n\n /**\n * Restore terminal to its original state.\n * Removes all process signal handlers to prevent leaks.\n * Called automatically on SIGINT, SIGTERM, process exit.\n */\n restore(): void {\n if (this._restored || this._restoring) return;\n this._restoring = true;\n\n if (this._resizeTimer) {\n clearTimeout(this._resizeTimer);\n this._resizeTimer = null;\n }\n\n // Clear hanging buffer data states\n this._writeQueue = [];\n this._isWriting = false;\n\n // Remove process-level handlers to prevent leaks\n if (this._exitHandler) process.off('exit', this._exitHandler);\n\n // Remove resize listener\n if (this._resizeHandler) {\n this.stdout.off('resize', this._resizeHandler);\n }\n\n // Capture direct stdout.write to bypass any RenderHook hijack\n const directWrite = this.stdout.write.bind(this.stdout);\n const savedWrite = this.write;\n this.write = (s: string) => { directWrite(s); };\n\n try {\n this.disableBracketedPaste();\n this.disableMouse();\n this.exitAltScreen();\n this.exitRawMode();\n this.showCursor();\n this.write(ansi.reset);\n this._restored = true;\n } finally {\n this.write = savedWrite;\n this._restoring = false;\n }\n }\n\n /**\n * Register a custom cleanup handler that runs on terminal restore.\n */\n onCleanup(handler: () => void): void {\n this._cleanupHandlers.push(handler);\n }\n\n private _setupCleanup(): void {\n const runCleanupHandlers = () => {\n const handlers = [...this._cleanupHandlers];\n for (const handler of handlers) {\n try { handler(); } catch { /* swallow */ }\n }\n this.restore();\n };\n\n this._exitHandler = runCleanupHandlers;\n\n process.on('exit', this._exitHandler);\n }\n}","// ─────────────────────────────────────────────────────\n// @termuijs/core — Unicode string width utilities\n// ─────────────────────────────────────────────────────\n\n\n/**\n * Check if a code point is a CJK (East Asian Wide/Fullwidth) character.\n * These characters occupy 2 terminal columns.\n *\n * Covers: CJK Unified Ideographs, Hangul Syllables, Katakana, Fullwidth Latin, etc.\n */\nfunction isWideChar(codePoint: number): boolean {\n return (\n // CJK Unified Ideographs (common Chinese/Japanese/Korean)\n (codePoint >= 0x4E00 && codePoint <= 0x9FFF) ||\n // CJK Unified Ideographs Extension A\n (codePoint >= 0x3400 && codePoint <= 0x4DBF) ||\n // CJK Compatibility Ideographs\n (codePoint >= 0xF900 && codePoint <= 0xFAFF) ||\n // Hangul Syllables\n (codePoint >= 0xAC00 && codePoint <= 0xD7AF) ||\n // Katakana\n (codePoint >= 0x30A0 && codePoint <= 0x30FF) ||\n // CJK Symbols and Punctuation\n (codePoint >= 0x3000 && codePoint <= 0x303F) ||\n // Hiragana\n (codePoint >= 0x3040 && codePoint <= 0x309F) ||\n // Fullwidth Forms\n (codePoint >= 0xFF01 && codePoint <= 0xFF60) ||\n (codePoint >= 0xFFE0 && codePoint <= 0xFFE6) ||\n // CJK Unified Ideographs Extension B\n (codePoint >= 0x20000 && codePoint <= 0x2A6DF) ||\n // CJK Unified Ideographs Extension C,D,E,F\n (codePoint >= 0x2A700 && codePoint <= 0x2EBEF) ||\n // CJK Compatibility Ideographs Supplement\n (codePoint >= 0x2F800 && codePoint <= 0x2FA1F)\n );\n}\n\n/**\n * Check if a code point is a combining character (zero-width).\n * These characters do not occupy any terminal column by themselves.\n */\nfunction isCombining(codePoint: number): boolean {\n return (\n // Combining Diacritical Marks\n (codePoint >= 0x0300 && codePoint <= 0x036F) ||\n // Combining Diacritical Marks Extended\n (codePoint >= 0x1AB0 && codePoint <= 0x1AFF) ||\n // Combining Diacritical Marks Supplement\n (codePoint >= 0x1DC0 && codePoint <= 0x1DFF) ||\n // Combining Diacritical Marks for Symbols\n (codePoint >= 0x20D0 && codePoint <= 0x20FF) ||\n // Combining Half Marks\n (codePoint >= 0xFE20 && codePoint <= 0xFE2F) ||\n // Variation selectors\n (codePoint >= 0xFE00 && codePoint <= 0xFE0F) ||\n // Zero-width joiner / non-joiner\n codePoint === 0x200B || codePoint === 0x200C || codePoint === 0x200D ||\n codePoint === 0xFEFF\n );\n}\n\n/**\n * Check if a character is an emoji that typically occupies 2 columns.\n * Simplified heuristic covering common emoji ranges.\n */\nfunction isEmoji(codePoint: number): boolean {\n return (\n // Emoticons\n (codePoint >= 0x1F600 && codePoint <= 0x1F64F) ||\n // Misc Symbols and Pictographs\n (codePoint >= 0x1F300 && codePoint <= 0x1F5FF) ||\n // Transport and Map\n (codePoint >= 0x1F680 && codePoint <= 0x1F6FF) ||\n // Supplemental Symbols\n (codePoint >= 0x1F900 && codePoint <= 0x1F9FF) ||\n // Misc symbols\n (codePoint >= 0x2600 && codePoint <= 0x26FF) ||\n // Dingbats\n (codePoint >= 0x2700 && codePoint <= 0x27BF) ||\n // Flags\n (codePoint >= 0x1F1E0 && codePoint <= 0x1F1FF)\n );\n}\n\n/**\n * Calculate the visual width of a string in terminal columns.\n *\n * - CJK characters count as 2 columns\n * - Emoji count as 2 columns\n * - Combining/zero-width characters count as 0\n * - ANSI escape sequences count as 0\n * - Regular characters count as 1\n */\nexport const segmenter = new Intl.Segmenter();\n\nexport function segmentWidth(segment: string): number {\n const cp = segment.codePointAt(0)!;\n if (cp < 0x20 || (cp >= 0x7F && cp < 0xA0)) {\n return 0; // Control characters\n }\n if (isCombining(cp)) {\n return 0; // Combining\n }\n \n const charCount = [...segment].length;\n let isMultiCpWide = false;\n if (charCount > 1) {\n const cps = [...segment].map(c => c.codePointAt(0)!);\n isMultiCpWide = cps.slice(1).some(c => !isCombining(c));\n }\n\n if (isWideChar(cp) || isEmoji(cp) || isMultiCpWide) {\n return 2;\n }\n return 1;\n}\n\nexport function stringWidth(str: string): number {\n let width = 0;\n let inEscape = false;\n\n const segments = segmenter.segment(str);\n for (const { segment } of segments) {\n const cp = segment.codePointAt(0)!;\n\n // Skip ANSI escape sequences\n if (cp === 0x1B) { // ESC\n inEscape = true;\n continue;\n }\n if (inEscape) {\n // End of CSI sequence (letter after ESC[...m)\n if ((cp >= 0x40 && cp <= 0x7E) && cp !== 0x5B) {\n inEscape = false;\n }\n continue;\n }\n\n width += segmentWidth(segment);\n }\n\n return width;\n}\n\n/**\n * Truncate a string to the given visual width, preserving ANSI codes.\n * Appends an ellipsis character if truncated.\n */\nexport function truncate(str: string, maxWidth: number, ellipsis = '…'): string {\n if (maxWidth <= 0) return '';\n const strW = stringWidth(str);\n if (strW <= maxWidth) return str;\n\n const ellipsisW = stringWidth(ellipsis);\n const targetW = maxWidth - ellipsisW;\n if (targetW <= 0) return ellipsis.slice(0, maxWidth);\n\n let width = 0;\n let result = '';\n let inEscape = false;\n let escapeBuffer = '';\n\n const segments = segmenter.segment(str);\n for (const { segment } of segments) {\n const cp = segment.codePointAt(0)!;\n\n if (cp === 0x1B) {\n inEscape = true;\n escapeBuffer += segment;\n continue;\n }\n if (inEscape) {\n escapeBuffer += segment;\n if ((cp >= 0x40 && cp <= 0x7E) && cp !== 0x5B) {\n inEscape = false;\n result += escapeBuffer;\n escapeBuffer = '';\n }\n continue;\n }\n\n let charW = segmentWidth(segment);\n\n if (width + charW > targetW) break;\n width += charW;\n result += segment;\n }\n\n return result + ellipsis;\n}\n\n/**\n * Strip all ANSI escape sequences from a string.\n */\nexport function stripAnsi(str: string): string {\n // eslint-disable-next-line no-control-regex\n return str.replace(/\\x1b\\[[0-9;]*[a-zA-Z]/g, '');\n}\n\n/**\n * Word-wrap text to a given width, respecting existing newlines.\n * Does not handle ANSI codes within words (wraps at the character level).\n */\nexport function wordWrap(str: string, width: number): string {\n if (width <= 0) return str;\n\n const lines = str.split('\\n');\n const result: string[] = [];\n\n for (const line of lines) {\n if (stringWidth(line) <= width) {\n result.push(line);\n continue;\n }\n\n let currentLine = '';\n let currentWidth = 0;\n const words = line.split(/(\\s+)/);\n\n for (const word of words) {\n const wordW = stringWidth(word);\n\n if (currentWidth + wordW <= width) {\n currentLine += word;\n currentWidth += wordW;\n } else if (wordW > width) {\n // Word is longer than width — break it\n if (currentLine) {\n result.push(currentLine);\n currentLine = '';\n currentWidth = 0;\n }\n const wordSegments = segmenter.segment(word);\n for (const { segment } of wordSegments) {\n const charW = segmentWidth(segment);\n if (currentWidth + charW > width) {\n result.push(currentLine);\n currentLine = '';\n currentWidth = 0;\n }\n currentLine += segment;\n currentWidth += charW;\n }\n } else {\n result.push(currentLine);\n currentLine = word.trimStart();\n currentWidth = stringWidth(currentLine);\n }\n }\n\n if (currentLine) {\n result.push(currentLine);\n }\n }\n\n return result.join('\\n');\n}\n","export const caps = {\n color: !process.env.NO_COLOR && process.env.TERM !== 'dumb',\n unicode: !process.env.NO_UNICODE && process.env.TERM !== 'dumb',\n motion: !process.env.NO_MOTION && !process.env.CI,\n ci: !!process.env.CI,\n get background(): 'light' | 'dark' {\n // Explicit override takes priority over terminal heuristics.\n if (process.env.TERM_BACKGROUND === 'light') return 'light';\n if (process.env.TERM_BACKGROUND === 'dark') return 'dark';\n\n const colorfgbg = process.env.COLORFGBG;\n if (colorfgbg) {\n const parts = colorfgbg.split(';');\n const bg = parseInt(parts[parts.length - 1], 10);\n if (!Number.isNaN(bg)) return bg < 8 ? 'dark' : 'light';\n }\n\n return 'dark';\n },\n get keybindingMode(): 'vim' | 'emacs' | 'default' {\n const mode = process.env.TERMUI_KEYBINDINGS;\n if (mode === 'vim' || mode === 'emacs') return mode;\n return 'default';\n },\n} as const;\n\n/**\n * Returns `true` when animation should be suppressed.\n *\n * True when `caps.motion` is `false` — i.e. when `NO_MOTION=1` is set\n * or when running in a CI environment (`CI=1`).\n *\n * Animated widgets **must** check this function and render their static\n * end-state (a single final frame) when it returns `true`, rather than\n * playing through intermediate animation frames.\n *\n * @example\n * if (prefersReducedMotion()) {\n * renderStaticFrame();\n * } else {\n * startAnimation();\n * }\n */\nexport function prefersReducedMotion(): boolean {\n return !caps.motion;\n}\n\n/**\n * Returns `true` when color output should be used.\n *\n * Returns `false` when `NO_COLOR=1` is set or `TERM=dumb`,\n * as per <https://no-color.org>.\n *\n * All widgets that emit ANSI color codes **must** check this function\n * and emit plain text (no escape sequences) when it returns `false`.\n *\n * @example\n * if (shouldUseColor()) {\n * output += colorToAnsiFg(cell.fg, depth);\n * }\n */\nexport function shouldUseColor(): boolean {\n return caps.color;\n}\n\n/**\n * Returns `true` when the user prefers high-contrast output.\n *\n * Widgets that render text on colored backgrounds **may** check this\n * to use more distinct color combinations.\n */\nexport function prefersHighContrast(): boolean {\n return process.env.HIGH_CONTRAST === '1';\n}\n","// ─────────────────────────────────────────────────────\n// @termuijs/core — Screen buffer (double-buffered cell grid)\n// ─────────────────────────────────────────────────────\n\nimport type { Color } from '../style/Color.js';\nimport { stringWidth, segmenter } from '../utils/unicode.js';\nimport { stripAnsiControl } from '../utils/ansi.js';\nimport { caps } from './env-caps.js';\n\nconst EMPTY_COLOR: Color = Object.freeze({ type: 'none' } as const);\n\n/**\n * A single cell in the terminal grid.\n */\nexport interface Cell {\n /** The character displayed (single grapheme cluster) */\n char: string;\n /** Foreground color */\n fg: Color;\n /** Background color */\n bg: Color;\n /** Bold text */\n bold: boolean;\n /** Italic text */\n italic: boolean;\n /** Underline text */\n underline: boolean;\n /** Dim text */\n dim: boolean;\n /** Strikethrough text */\n strikethrough: boolean;\n /** Inverse colors */\n inverse: boolean;\n /**\n * Visual width of this cell.\n * - 1 for normal characters\n * - 2 for wide chars (CJK/emoji) — the next cell is a \"continuation\" cell\n * - 0 for continuation cells (second half of a wide char)\n */\n width: number;\n /** Optional OSC 8 hyperlink target for this cell. */\n link?: string;\n}\n\n/** Create a blank cell with default attributes */\nexport function emptyCell(): Cell {\n return {\n char: ' ',\n fg: EMPTY_COLOR,\n bg: EMPTY_COLOR,\n bold: false,\n italic: false,\n underline: false,\n dim: false,\n strikethrough: false,\n inverse: false,\n width: 1,\n link: undefined,\n };\n}\n\n/** Reset a cell in-place to default attributes (avoids allocation). */\nexport function resetCell(cell: Cell): void {\n cell.char = ' ';\n cell.fg = EMPTY_COLOR;\n cell.bg = EMPTY_COLOR;\n cell.bold = false;\n cell.italic = false;\n cell.underline = false;\n cell.dim = false;\n cell.strikethrough = false;\n cell.inverse = false;\n cell.width = 1;\n cell.link = undefined;\n}\n\n/** Check if two cells are visually identical */\nexport function cellsEqual(a: Cell, b: Cell): boolean {\n return (\n a.char === b.char &&\n a.bold === b.bold &&\n a.italic === b.italic &&\n a.underline === b.underline &&\n a.dim === b.dim &&\n a.strikethrough === b.strikethrough &&\n a.inverse === b.inverse &&\n a.width === b.width &&\n a.link === b.link &&\n colorsEqual(a.fg, b.fg) &&\n colorsEqual(a.bg, b.bg)\n );\n}\n\nfunction colorsEqual(a: Color, b: Color): boolean {\n if (a.type !== b.type) return false;\n switch (a.type) {\n case 'none': return true;\n case 'named': return a.name === (b as typeof a).name;\n case 'ansi256': return a.code === (b as typeof a).code;\n case 'rgb': return a.r === (b as typeof a).r && a.g === (b as typeof a).g && a.b === (b as typeof a).b;\n case 'hex': return a.hex.toLowerCase() === (b as typeof a).hex.toLowerCase();\n }\n}\n\n/**\n * Double-buffered 2D cell grid for the terminal.\n *\n * - `front` = what's currently displayed on screen\n * - `back` = what we're building for the next frame\n *\n * After rendering, the renderer diffs `front` vs `back` and only emits\n * changes, then swaps the buffers.\n */\nexport class Screen {\n private _cols: number;\n private _rows: number;\n private _previousLines: string[] = [];\n private _lastRenderedHeight = 0;\n\n get lastRenderedHeight(): number {\n return this._lastRenderedHeight;\n }\n set lastRenderedHeight(value: number) {\n this._lastRenderedHeight = value;\n }\n private _previousStyleLines: string[] = [];\n front: Cell[][];\n back: Cell[][];\n\n /**\n * Render epoch counter. Incremented on every swap so downstream consumers\n * (e.g. Renderer._flush) can detect and skip stale frames from a previous\n * epoch, preventing double-swap corruption.\n */\n private _epoch = 0;\n\n /** True while swap() is executing to prevent re-entrant double-swap corruption. */\n private _swapping = false;\n\n /** The epoch captured at the start of the current flush cycle. */\n private _flushEpoch = -1;\n\n /**\n * Stack of clipping regions. When non-empty, setCell/writeString\n * only write to cells within the topmost clip rectangle.\n */\n private _clipStack: Array<{ x: number; y: number; width: number; height: number }> = [];\n\n private _translateYStack: number[] = [];\n private _translateY = 0;\n\n constructor(cols: number, rows: number) {\n this._cols = cols;\n this._rows = rows;\n this.front = this._createGrid(cols, rows);\n this.back = this._createGrid(cols, rows);\n }\n\n /** Retrieve a read-only copy of the cell at (x, y) from the back buffer. */\n getCell(x: number, y: number): Readonly<Cell> | undefined {\n x = Math.floor(x);\n y = Math.floor(y);\n if (!(x >= 0 && x < this._cols && y >= 0 && y < this._rows)) return undefined;\n return this.back[y][x];\n }\n\n /** Serialize a back-buffer row to a plain string (skips continuation cells). */\n getLine(row: number): string {\n if (row < 0 || row >= this._rows) return '';\n return this.back[row]\n .filter(cell => cell.width !== 0)\n .map(cell => cell.char || ' ')\n .join('');\n }\n\n /**\n * Serialize the style attributes of a back-buffer row into a\n * fingerprint string. When the characters are identical but the\n * styles differ (color, bold, italic, etc.), this fingerprint\n * changes, allowing the diff renderer to detect style-only updates.\n */\n getStyleLine(row: number): string {\n if (row < 0 || row >= this._rows) return '';\n let hash = 0;\n for (const cell of this.back[row]) {\n if (cell.width === 0) continue;\n const fg = cell.fg.type;\n const bg = cell.bg.type;\n const bits =\n (cell.bold ? 1 : 0) |\n (cell.italic ? 2 : 0) |\n (cell.underline ? 4 : 0) |\n (cell.dim ? 8 : 0) |\n (cell.strikethrough ? 16 : 0) |\n (cell.inverse ? 32 : 0);\n const seed = fg.charCodeAt(0) * 65536 + bg.charCodeAt(0) * 4096 + bits;\n hash = ((hash << 7) - hash + seed) | 0;\n if (cell.link) {\n for (let i = 0; i < cell.link.length; i++)\n hash = ((hash << 5) - hash + cell.link.charCodeAt(i)) | 0;\n }\n }\n return String(hash);\n }\n\n /** Return the saved line string for the given row (empty before first saveLines call). */\n getPreviousLine(row: number): string {\n return this._previousLines[row] ?? '';\n }\n\n /** Return the saved style fingerprint for the given row. */\n getPreviousStyleLine(row: number): string {\n return this._previousStyleLines[row] ?? '';\n }\n\n /** Snapshot the current back-buffer line strings for use by diffRenderer. */\n saveLines(): void {\n this._previousLines = [];\n this._previousStyleLines = [];\n for (let r = 0; r < this._rows; r++) {\n this._previousLines.push(this.getLine(r));\n this._previousStyleLines.push(this.getStyleLine(r));\n }\n }\n\n get cols(): number { return this._cols; }\n get rows(): number { return this._rows; }\n\n /**\n * Push a clipping region onto the stack.\n * All subsequent setCell/writeString calls will be constrained\n * to cells within this rectangle. Clips are intersected with\n * any parent clip already on the stack (nested clipping).\n */\n pushClip(region: { x: number; y: number; width: number; height: number }): void {\n if (this._clipStack.length > 0) {\n // Intersect with the current clip\n const parent = this._clipStack[this._clipStack.length - 1];\n const x = Math.max(region.x, parent.x);\n const y = Math.max(region.y, parent.y);\n const right = Math.min(region.x + region.width, parent.x + parent.width);\n const bottom = Math.min(region.y + region.height, parent.y + parent.height);\n if (right <= x || bottom <= y) {\n // Fully clipped — push a zero-size region\n this._clipStack.push({ x: 0, y: 0, width: 0, height: 0 });\n } else {\n this._clipStack.push({ x, y, width: right - x, height: bottom - y });\n }\n } else {\n this._clipStack.push({ ...region });\n }\n }\n\n /**\n * Pop the most recent clipping region from the stack.\n */\n popClip(): void {\n this._clipStack.pop();\n }\n\n /**\n * Get the current active clip region, or null if no clip is active.\n */\n get activeClip(): { x: number; y: number; width: number; height: number } | null {\n return this._clipStack.length > 0\n ? this._clipStack[this._clipStack.length - 1]\n : null;\n }\n\n pushTranslateY(offset: number): void {\n this._translateYStack.push(offset);\n this._translateY += offset;\n }\n\n popTranslateY(): void {\n const offset = this._translateYStack.pop() ?? 0;\n this._translateY -= offset;\n }\n\n /**\n * Write a cell to the back buffer at position (col, row).\n */\n setCell(col: number, row: number, cell: Partial<Cell>): void {\n // Floor to integers — layout engine may produce fractional values\n col = Math.floor(col);\n row = Math.floor(row);\n // Apply Y translation before bounds/clip checks\n row += this._translateY;\n // Use positive range check (NaN fails >= 0, preventing NaN indices)\n if (!(col >= 0 && col < this._cols && row >= 0 && row < this._rows)) return;\n\n // Enforce clip region\n if (this._clipStack.length > 0) {\n const clip = this._clipStack[this._clipStack.length - 1];\n if (col < clip.x || col >= clip.x + clip.width ||\n row < clip.y || row >= clip.y + clip.height) {\n return; // Outside active clip — silently discard\n }\n }\n\n const existing = this.back[row][col];\n if (cell.char !== undefined) {\n cell = { ...cell, char: stripAnsiControl(cell.char) };\n }\n Object.assign(existing, cell);\n }\n\n /**\n * Write a string to the back buffer starting at (col, row).\n * Applies the provided style attributes to each character.\n */\n writeString(\n col: number,\n row: number,\n str: string,\n style: Partial<Omit<Cell, 'char' | 'width'>> = {},\n ): void {\n row = Math.floor(row);\n col = Math.floor(col);\n if (!(row >= 0 && row < this._rows)) return;\n\n // Strip ANSI control sequences from user-supplied content to prevent escape injection\n const safeStr = stripAnsiControl(str);\n let x = col;\n \n const segments = segmenter.segment(safeStr);\n for (const { segment } of segments) {\n if (x >= this._cols) break;\n\n let finalChar = segment;\n // Measure the visual width with the shared unicode utility\n let width = stringWidth(segment);\n\n // Advance past off-screen-left cells by the real width\n if (x < 0) { x += width; continue; }\n\n // Fallback for terminals without wide-character support\n if (width > 1 && !caps.unicode) {\n finalChar = '*'; // safe single-cell substitute\n width = 1;\n }\n\n // Skip zero-width characters (combining marks) so they do not overwrite\n if (width === 0) continue;\n\n this.setCell(x, row, {\n char: finalChar,\n width,\n ...style,\n });\n\n // Mark continuation cells for wide characters\n for (let i = 1; i < width; i++) {\n if (x + i < this._cols) {\n this.setCell(x + i, row, {\n char: '',\n width: 0,\n ...style,\n });\n }\n }\n\n x += width;\n }\n }\n\n /**\n * Clear the back buffer to all empty cells.\n */\n clear(): void {\n this._clipStack = [];\n for (let r = 0; r < this._rows; r++) {\n for (let c = 0; c < this._cols; c++) {\n resetCell(this.back[r][c]);\n }\n }\n }\n\n /** Current render epoch — incremented after each swap. */\n get epoch(): number {\n return this._epoch;\n }\n\n /** The epoch captured at the start of the current flush cycle. */\n get flushEpoch(): number {\n return this._flushEpoch;\n }\n set flushEpoch(value: number) {\n this._flushEpoch = value;\n }\n\n /**\n * Swap front and back buffers. Called after rendering diffs.\n * Uses mutual exclusion to prevent double-swap corruption when\n * _flush() is called concurrently (e.g. from duplicate setImmediate\n * callbacks).\n */\n swap(): void {\n if (this._swapping) return;\n this._swapping = true;\n try {\n const temp = this.front;\n this.front = this.back;\n this.back = temp;\n this._epoch++;\n } finally {\n this._swapping = false;\n }\n }\n\n /**\n * Resize the screen. Clears both buffers.\n */\n resize(cols: number, rows: number): void {\n this._cols = cols;\n this._rows = rows;\n this.front = this._createGrid(cols, rows);\n this.back = this._createGrid(cols, rows);\n this._previousLines = [];\n }\n\n /**\n * Clear the front buffer (marks everything as \"needs redraw\").\n * Mutates cells in-place to avoid GC pressure from object allocation.\n */\n invalidate(): void {\n for (let r = 0; r < this._rows; r++) {\n for (let c = 0; c < this._cols; c++) {\n resetCell(this.front[r][c]);\n this.front[r][c].char = '\\0'; // force diff\n }\n }\n }\n\n /**\n * Export current screen as ANSI snapshot text.\n */\n exportANSI(): string {\n const lines: string[] = [];\n\n for (let r = 0; r < this._rows; r++) {\n lines.push(this.getLine(r));\n }\n\n return lines.join('\\n');\n }\n\n /**\n * Export current screen as SVG.\n */\n exportSVG(): string {\n return `\n<svg xmlns=\"http://www.w3.org/2000/svg\"\n width=\"${this._cols * 8}\"\n height=\"${this._rows * 16}\">\n <text x=\"10\" y=\"20\">\n Terminal Export\n </text>\n</svg>`;\n }\n\n private _createGrid(cols: number, rows: number): Cell[][] {\n const grid: Cell[][] = [];\n for (let r = 0; r < rows; r++) {\n const row: Cell[] = [];\n for (let c = 0; c < cols; c++) {\n row.push(emptyCell());\n }\n grid.push(row);\n }\n return grid;\n }\n}","// ─────────────────────────────────────────────────────\n// @termuijs/core — Renderer Hook & Batching Scheduler\n// ─────────────────────────────────────────────────────\n\ntype ConsoleMethod = 'log' | 'warn' | 'error';\n\nexport class RenderHook {\n private _buffer: string[] = [];\n private _isActive = false;\n private _originalConsole: Partial<Record<ConsoleMethod, (...args: any[]) => void>> = {}; // any[]: console methods accept arbitrary argument shapes\n\n /** Check if the hook is currently intercepting console output */\n get isActive(): boolean {\n return this._isActive;\n }\n\n /** Wrap console.log/warn/error to buffer external logs instead of writing to stdout */\n start(): void {\n if (this._isActive) return;\n this._isActive = true;\n\n const methods: ConsoleMethod[] = ['log', 'warn', 'error'];\n for (const method of methods) {\n this._originalConsole[method] = console[method];\n const hook = this;\n console[method] = function (...args: any[]): void { // any[]: console methods accept arbitrary argument shapes\n const text = args.map(a => typeof a === 'string' ? a : String(a)).join(' ');\n hook._buffer.push(text + '\\n');\n };\n }\n }\n\n /** Restore original console methods */\n stop(): void {\n if (!this._isActive) return;\n this._isActive = false;\n\n for (const [method, original] of Object.entries(this._originalConsole)) {\n console[method as ConsoleMethod] = original as (...args: any[]) => void; // any[]: console methods accept arbitrary argument shapes\n }\n this._originalConsole = {};\n }\n\n /** Retrieve and clear the buffered logs */\n flush(): string {\n if (this._buffer.length === 0) return '';\n const out = this._buffer.join('');\n this._buffer = [];\n return out;\n }\n\n /** Write directly to process.stdout, bypassing any buffering */\n writeRaw(text: string): void {\n process.stdout.write(text);\n }\n}\n\n/**\n * Queues a render pass for the next event loop tick.\n * Ensures high-frequency mutations are batched together.\n * * Using .call() or .bind() from the application context invokes this safely.\n */\nexport function queueUpdate(this: any) { // any: this is bound dynamically via .call() at render time\n setImmediate(() => {\n if (this && typeof this.render === 'function') {\n this.render();\n }\n if (this && typeof this.clearDirty === 'function') {\n this.clearDirty();\n }\n });\n}","// ─────────────────────────────────────────────────────\n// @termuijs/core — Differential Renderer\n// ─────────────────────────────────────────────────────\n\nimport type { Terminal } from './Terminal.js';\nimport { type Cell, cellsEqual, type Screen } from './Screen.js';\nimport { type ColorDepth, colorToAnsiFg, colorToAnsiBg } from '../style/Color.js';\nimport { moveTo, beginSyncUpdate, endSyncUpdate, reset as ansiReset, stripAnsiControl } from '../utils/ansi.js';\nimport { RenderHook } from '../renderer/render-hook.js';\n\n/**\n * Render frame statistics.\n */\nexport interface FrameStats {\n /** Number of cells that differed and were redrawn this frame. */\n cellsChanged: number;\n /** Total bytes written to the terminal this frame. */\n bytesWritten: number;\n /** Wall-clock duration of the flush in milliseconds. */\n durationMs: number;\n}\n\n/**\n * Differential renderer — compares front/back screen buffers and\n * outputs only the changed cells. Uses synchronized output (CSI 2026)\n * for atomic, flicker-free updates.\n */\nexport class Renderer {\n private _terminal: Terminal;\n private _screen: Screen;\n private _fps: number;\n private _frameTimer: ReturnType<typeof setInterval> | null = null;\n private _renderRequested = false;\n private _colorDepth: ColorDepth;\n private _diffRenderer: boolean;\n private _onTick: (() => void) | null = null;\n private _callbacks = new Set<(stats: FrameStats) => void>();\n \n /** The stdout interceptor hook for buffering external logs */\n public readonly hook: RenderHook;\n\n constructor(terminal: Terminal, screen: Screen, fps = 30, diffRenderer = true) {\n this._terminal = terminal;\n this._screen = screen;\n this._fps = fps;\n this._colorDepth = terminal.colorDepth;\n this._diffRenderer = diffRenderer;\n this.hook = new RenderHook();\n }\n\n /** Change the rendering frame rate cap */\n setFPS(fps: number): void {\n this._fps = fps;\n if (this._frameTimer) {\n this.stop();\n this.start(this._onTick ?? undefined);\n }\n }\n\n /** Start the render loop */\n start(onTick?: () => void): void {\n if (this._frameTimer) return;\n this._onTick = onTick ?? null;\n const interval = Math.floor(1000 / this._fps);\n this._frameTimer = setInterval(() => {\n this._onTick?.();\n }, interval);\n }\n\n /** Stop the render loop */\n stop(): void {\n if (this._frameTimer) {\n clearInterval(this._frameTimer);\n this._frameTimer = null;\n }\n }\n\n /** Request a render on the next frame */\n requestFrame(): void {\n this._renderRequested = true;\n }\n\n /** Force an immediate render (bypass frame rate) */\n renderNow(): void {\n this._flush();\n }\n\n /** Register a per-frame profiling callback. Returns an unsubscribe function. */\n onFrame(cb: (stats: FrameStats) => void): () => void {\n this._callbacks.add(cb);\n return () => {\n this._callbacks.delete(cb);\n };\n }\n\n /**\n * Full-screen clear and redraw (first render or after resize).\n */\n fullRender(): void {\n this._screen.invalidate();\n this._flush();\n }\n\n /** ANSI sequence to save cursor position */\n private static _CURSOR_SAVE = '\\x1b[s';\n /** ANSI sequence to restore cursor position */\n private static _CURSOR_RESTORE = '\\x1b[u';\n\n /**\n * Core diff and flush: compare front vs back buffer,\n * emit only changed cells.\n */\n private _flush(): void {\n // Capture the current epoch; if swap() has already been called by a\n // duplicate callback, skip this flush to prevent buffer corruption.\n const epoch = this._screen.epoch;\n if (this._screen.flushEpoch === epoch) return;\n this._screen.flushEpoch = epoch;\n\n const start = this._callbacks.size > 0 ? performance.now() : 0;\n\n // 1. Grab any logs that console.log() caught while we were rendering\n const bufferedLogs = this.hook.flush();\n \n if (bufferedLogs) {\n // Force a full redraw of the UI underneath the new logs so it doesn't get corrupted\n this._screen.invalidate();\n }\n\n try {\n const { front, back, cols, rows } = this._screen;\n let output = beginSyncUpdate;\n\n if (this._diffRenderer) {\n this._lastStyleFingerprint = null;\n for (let r = 0; r < rows; r++) {\n output += this._renderDiffLine(r, front, back, cols);\n }\n\n output += ansiReset;\n output += endSyncUpdate;\n\n // Write buffered logs wrapped in cursor save/restore so they\n // don't shift the frame's expected cursor position\n if (bufferedLogs) {\n this._terminal.writeSync(Renderer._CURSOR_SAVE + bufferedLogs + Renderer._CURSOR_RESTORE);\n }\n this._terminal.writeSync(output);\n\n this._screen.saveLines();\n this._emitStats(start, bufferedLogs, output);\n this._screen.swap();\n return;\n }\n\n for (let r = 0; r < rows; r++) {\n if (this._screen.getLine(r) === this._screen.getPreviousLine(r)\n && this._screen.getStyleLine(r) === this._screen.getPreviousStyleLine(r)) continue;\n output += moveTo(0, r);\n output += this._renderLine(r);\n }\n\n output += ansiReset;\n output += endSyncUpdate;\n\n if (bufferedLogs) {\n this._terminal.writeSync(Renderer._CURSOR_SAVE + bufferedLogs + Renderer._CURSOR_RESTORE);\n }\n this._terminal.writeSync(output);\n\n this._emitStats(start, bufferedLogs, output);\n this._screen.saveLines();\n this._screen.swap();\n } catch (_err) {\n // Re-request render so the next frame tick retries.\n this._renderRequested = true;\n // Reset style fingerprint to prevent color bleed on retry.\n this._lastStyleFingerprint = null;\n }\n }\n\n /** Style fingerprint of the last rendered cell (to suppress redundant ANSI reset/apply). */\n private _lastStyleFingerprint: string | null = null;\n\n /** Build a stable style fingerprint string for a cell (avoids allocation-heavy object comparison). */\n private _styleFingerprint(cell: Cell): string {\n const fg = cell.fg;\n const bg = cell.bg;\n let fgKey: string;\n switch (fg.type) {\n case 'none': fgKey = 'n'; break;\n case 'named': fgKey = `N:${fg.name}`; break;\n case 'ansi256': fgKey = `A:${fg.code}`; break;\n case 'rgb': fgKey = `R:${fg.r},${fg.g},${fg.b}`; break;\n case 'hex': fgKey = `H:${fg.hex.toLowerCase()}`; break;\n default: fgKey = 'n';\n }\n let bgKey: string;\n switch (bg.type) {\n case 'none': bgKey = 'n'; break;\n case 'named': bgKey = `N:${bg.name}`; break;\n case 'ansi256': bgKey = `A:${bg.code}`; break;\n case 'rgb': bgKey = `R:${bg.r},${bg.g},${bg.b}`; break;\n case 'hex': bgKey = `H:${bg.hex.toLowerCase()}`; break;\n default: bgKey = 'n';\n }\n return `${cell.bold ? 'B' : ''}${cell.dim ? 'D' : ''}${cell.italic ? 'I' : ''}${cell.underline ? 'U' : ''}${cell.strikethrough ? 'S' : ''}${cell.inverse ? 'V' : ''}|${fgKey}|${bgKey}`;\n }\n\n /**\n * Generate the ANSI escape sequence to render a single cell.\n * Skips ansiReset + re-apply when the adjacent cell has identical style.\n */\n private _renderCell(cell: Cell): string {\n let seq = '';\n const fp = this._styleFingerprint(cell);\n\n if (fp !== this._lastStyleFingerprint) {\n seq += ansiReset;\n if (cell.bold) seq += '\\x1b[1m';\n if (cell.dim) seq += '\\x1b[2m';\n if (cell.italic) seq += '\\x1b[3m';\n if (cell.underline) seq += '\\x1b[4m';\n if (cell.strikethrough) seq += '\\x1b[9m';\n if (cell.inverse) seq += '\\x1b[7m';\n seq += colorToAnsiFg(cell.fg, this._colorDepth);\n seq += colorToAnsiBg(cell.bg, this._colorDepth);\n this._lastStyleFingerprint = fp;\n }\n\n // Write the character (sanitized to prevent escape injection)\n seq += stripAnsiControl(cell.char) || ' ';\n return seq;\n }\n\n /**\n * If a span starts at a width-0 continuation cell (the second half of a\n * wide character), adjust backward to the preceding cell so the cursor\n * is placed at a valid column boundary.\n */\n private static _adjustSpanStart(col: number, row: Cell[]): number {\n while (col > 0 && row[col].width === 0) {\n col--;\n }\n return col;\n }\n\n /**\n * Render only the changed spans within a single row (cell-level granularity).\n * Uses moveTo to position the cursor at the start of each changed span.\n */\n private _renderDiffLine(row: number, front: Cell[][], back: Cell[][], cols: number): string {\n let output = '';\n let spanStart = -1;\n\n for (let c = 0; c < cols; c++) {\n // Skip continuation cells (right half of wide chars) - they are not\n // independently renderable and their primary cell handles the output.\n if (back[row][c].width === 0) continue;\n \n const changed = !cellsEqual(front[row][c], back[row][c]);\n if (changed && spanStart === -1) {\n spanStart = c; // start a new changed span\n } else if (!changed && spanStart !== -1) {\n // flush the span\n const adjustedStart = Renderer._adjustSpanStart(spanStart, back[row]);\n output += moveTo(adjustedStart, row);\n for (let sc = spanStart; sc < c; sc++) {\n const cell = back[row][sc];\n if (cell.width === 0) continue;\n output += this._renderCell(cell);\n }\n spanStart = -1;\n }\n }\n\n // flush trailing span\n if (spanStart !== -1) {\n const adjustedStart = Renderer._adjustSpanStart(spanStart, back[row]);\n output += moveTo(adjustedStart, row);\n for (let sc = spanStart; sc < cols; sc++) {\n const cell = back[row][sc];\n if (cell.width === 0) continue;\n output += this._renderCell(cell);\n }\n }\n\n return output;\n }\n\n private _renderLine(row: number): string {\n let output = '';\n for (let c = 0; c < this._screen.cols; c++) {\n const cell = this._screen.back[row][c];\n if (cell.width === 0) continue;\n output += this._renderCell(cell);\n }\n return output;\n }\n\n private _emitStats(start: number, bufferedLogs: string | null, output: string): void {\n if (this._callbacks.size === 0) return;\n\n const durationMs = performance.now() - start;\n const { front, back, cols, rows } = this._screen;\n let cellsChanged = 0;\n for (let r = 0; r < rows; r++) {\n for (let c = 0; c < cols; c++) {\n if (!cellsEqual(front[r][c], back[r][c])) {\n cellsChanged++;\n }\n }\n }\n\n const bytesWritten = (bufferedLogs ? Buffer.byteLength(bufferedLogs) : 0) + Buffer.byteLength(output);\n\n const stats: FrameStats = {\n cellsChanged,\n bytesWritten,\n durationMs: Math.max(0, durationMs),\n };\n\n for (const cb of this._callbacks) {\n try {\n cb(stats);\n } catch {\n // Callback errors must not break rendering\n }\n }\n }\n}\n","// ─────────────────────────────────────────────────────\n// @termuijs/core — Layer Manager for overlay rendering\n// ─────────────────────────────────────────────────────\n\nimport type { Cell } from './Screen.js';\nimport { emptyCell, type Screen } from './Screen.js';\nimport type { Color } from '../style/Color.js';\nimport type { Rect } from '../layout/Rect.js';\nimport { segmenter, segmentWidth } from '../utils/unicode.js';\n\n/**\n * A rendering layer. Each layer has its own cell grid and z-index.\n * Higher z-index layers render on top of lower ones during compositing.\n */\nexport interface Layer {\n /** Unique identifier for this layer */\n id: string;\n /** Stacking order — higher renders on top */\n zIndex: number;\n /** Cell grid (same dimensions as Screen) */\n cells: Cell[][];\n /** Whether this layer is visible */\n visible: boolean;\n /** Bounding box of cells written since last clear (null = nothing dirty) */\n dirtyRegion: Rect | null;\n}\n\n/**\n * Check if a cell is \"transparent\" (should show through to the layer below).\n * An empty cell with no explicit colors is considered transparent.\n */\nfunction isCellTransparent(cell: Cell): boolean {\n return (\n cell.char === ' ' &&\n cell.fg.type === 'none' &&\n cell.bg.type === 'none' &&\n !cell.bold &&\n !cell.italic &&\n !cell.underline &&\n !cell.dim &&\n !cell.strikethrough &&\n !cell.inverse\n );\n}\n\n/**\n * Manages multiple rendering layers for overlay support.\n *\n * The base layer (z=0) is the primary widget layer — always opaque.\n * Overlay layers (z>0) support transparency: only cells explicitly\n * written to them overwrite the base layer during compositing.\n *\n * Typical z-index values:\n * - 0: Base widget layer\n * - 10: Dropdown menus\n * - 100: Modal dialogs\n * - 1000: Toasts / notifications\n */\nexport class LayerManager {\n private _layers: Map<string, Layer> = new Map();\n private _cols: number;\n private _rows: number;\n private _hitWidgetGrid!: (string | null)[][];\n private _hitZGrid!: number[][];\n\n constructor(cols: number, rows: number) {\n this._cols = cols;\n this._rows = rows;\n this._allocateHitGrids();\n }\n\n get cols(): number { return this._cols; }\n get rows(): number { return this._rows; }\n\n /**\n * Create a new overlay layer.\n * @param id Unique identifier (e.g. 'modal', 'select-dropdown', 'toast')\n * @param zIndex Stacking order (higher = rendered on top)\n */\n createLayer(id: string, zIndex: number): Layer {\n if (this._layers.has(id)) {\n return this._layers.get(id)!;\n }\n\n const layer: Layer = {\n id,\n zIndex,\n cells: this._createGrid(),\n visible: true,\n dirtyRegion: null,\n };\n\n this._layers.set(id, layer);\n return layer;\n }\n\n /**\n * Remove an overlay layer and clean up its resources.\n */\n removeLayer(id: string): void {\n this._layers.delete(id);\n }\n\n /**\n * Get a layer by ID.\n */\n getLayer(id: string): Layer | undefined {\n return this._layers.get(id);\n }\n\n /**\n * Check if a layer exists.\n */\n hasLayer(id: string): boolean {\n return this._layers.has(id);\n }\n\n /**\n * Get all layers sorted by z-index (ascending).\n */\n getSortedLayers(): Layer[] {\n return Array.from(this._layers.values())\n .filter(l => l.visible)\n .sort((a, b) => a.zIndex - b.zIndex);\n }\n\n /**\n * Write a cell to a specific layer.\n */\n setCell(layerId: string, col: number, row: number, cell: Partial<Cell>): void {\n const layer = this._layers.get(layerId);\n if (!layer) return;\n\n col = Math.floor(col);\n row = Math.floor(row);\n if (!(col >= 0 && col < this._cols && row >= 0 && row < this._rows)) return;\n\n const existing = layer.cells[row][col];\n Object.assign(existing, cell);\n\n // Expand dirty region\n this._expandDirty(layer, col, row);\n }\n\n /**\n * Write a string to a specific layer at position (col, row).\n */\n writeString(\n layerId: string,\n col: number,\n row: number,\n str: string,\n style: Partial<Omit<Cell, 'char' | 'width'>> = {},\n ): void {\n const layer = this._layers.get(layerId);\n if (!layer) return;\n\n row = Math.floor(row);\n col = Math.floor(col);\n if (!(row >= 0 && row < this._rows)) return;\n\n let x = col;\n for (const { segment: char } of segmenter.segment(str)) {\n if (x >= this._cols) break;\n const charWidth = segmentWidth(char);\n if (x < 0) { x += charWidth; continue; }\n\n this.setCell(layerId, x, row, { char, width: charWidth, ...style });\n // For wide characters, fill the next cell with a placeholder space\n // so the grid stays coherent (no stale character bleeds through).\n if (charWidth === 2 && x + 1 < this._cols) {\n this.setCell(layerId, x + 1, row, { char: ' ', width: 1, ...style });\n }\n x += charWidth;\n }\n }\n\n /**\n * Check whether any visible layer has pending dirty changes.\n */\n hasDirtyLayers(): boolean {\n for (const layer of this._layers.values()) {\n if (layer.visible && layer.dirtyRegion) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Clear all cells in a specific layer.\n */\n clearLayer(id: string): void {\n const layer = this._layers.get(id);\n if (!layer) return;\n\n for (let r = 0; r < this._rows; r++) {\n for (let c = 0; c < this._cols; c++) {\n layer.cells[r][c] = emptyCell();\n }\n }\n layer.dirtyRegion = { x: 0, y: 0, width: this._cols, height: this._rows };\n }\n\n /**\n * Clear all overlay layers.\n */\n clearAll(): void {\n for (const layer of this._layers.values()) {\n this.clearLayer(layer.id);\n }\n }\n\n /**\n * Composite all overlay layers onto the Screen's back buffer.\n * Layers are applied in z-index order (lowest first).\n * Transparent cells (empty with no colors) are skipped.\n * Writes directly to screen.back to avoid setCell overhead\n * (bounds/clip checks are already satisfied by dirtyRegion).\n */\n composite(screen: Screen): void {\n const sorted = this.getSortedLayers();\n\n for (const layer of sorted) {\n if (!layer.dirtyRegion) continue;\n\n const { x: dx, y: dy, width: dw, height: dh } = layer.dirtyRegion;\n const maxRow = Math.min(dy + dh, this._rows);\n const maxCol = Math.min(dx + dw, this._cols);\n\n for (let r = dy; r < maxRow; r++) {\n const backRow = screen.back[r];\n const layerRow = layer.cells[r];\n if (!backRow || !layerRow) continue;\n\n let c = dx;\n while (c < maxCol) {\n const cell = layerRow[c];\n if (isCellTransparent(cell)) {\n c++;\n continue;\n }\n Object.assign(backRow[c], cell);\n c++;\n }\n }\n }\n }\n\n /**\n * Resize all layers when the terminal is resized.\n */\n resize(cols: number, rows: number): void {\n this._cols = cols;\n this._rows = rows;\n\n for (const layer of this._layers.values()) {\n layer.cells = this._createGrid();\n layer.dirtyRegion = null;\n }\n\n this._allocateHitGrids();\n }\n\n /** Reset the hit grid. Call once at the start of each frame. */\n clearHitGrid(): void {\n this._allocateHitGrids();\n }\n\n /**\n * Mark a rectangular region as owned by a widget at a given z-index.\n * Higher z wins when regions overlap.\n */\n setHitRegion(widgetId: string, x: number, y: number, w: number, h: number, z?: number): void {\n const zVal = z ?? 0;\n const startX = Math.floor(x);\n const startY = Math.floor(y);\n const width = Math.floor(w);\n const height = Math.floor(h);\n\n for (let r = startY; r < startY + height; r++) {\n if (r < 0 || r >= this._rows) continue;\n for (let c = startX; c < startX + width; c++) {\n if (c < 0 || c >= this._cols) continue;\n\n if (zVal >= this._hitZGrid[r][c]) {\n this._hitWidgetGrid[r][c] = widgetId;\n this._hitZGrid[r][c] = zVal;\n }\n }\n }\n }\n\n /** Return the topmost widget id at a cell, or null. */\n hitTest(col: number, row: number): string | null {\n const c = Math.floor(col);\n const r = Math.floor(row);\n if (c < 0 || c >= this._cols || r < 0 || r >= this._rows) {\n return null;\n }\n return this._hitWidgetGrid[r][c];\n }\n\n /**\n * Create an empty cell grid.\n */\n private _createGrid(): Cell[][] {\n const grid: Cell[][] = [];\n for (let r = 0; r < this._rows; r++) {\n const row: Cell[] = [];\n for (let c = 0; c < this._cols; c++) {\n row.push(emptyCell());\n }\n grid.push(row);\n }\n return grid;\n }\n\n /**\n * Allocate parallel hit grid and z-index grid.\n */\n private _allocateHitGrids(): void {\n this._hitWidgetGrid = [];\n this._hitZGrid = [];\n for (let r = 0; r < this._rows; r++) {\n const widgetRow: (string | null)[] = [];\n const zRow: number[] = [];\n for (let c = 0; c < this._cols; c++) {\n widgetRow.push(null);\n zRow.push(-Infinity);\n }\n this._hitWidgetGrid.push(widgetRow);\n this._hitZGrid.push(zRow);\n }\n }\n\n /**\n * Expand the dirty region of a layer to include the given cell.\n */\n private _expandDirty(layer: Layer, col: number, row: number): void {\n if (!layer.dirtyRegion) {\n layer.dirtyRegion = { x: col, y: row, width: 1, height: 1 };\n return;\n }\n\n const r = layer.dirtyRegion;\n const newX = Math.min(r.x, col);\n const newY = Math.min(r.y, row);\n const newRight = Math.max(r.x + r.width, col + 1);\n const newBottom = Math.max(r.y + r.height, row + 1);\n r.x = newX;\n r.y = newY;\n r.width = newRight - newX;\n r.height = newBottom - newY;\n }\n}\n","// Box-drawing unicode → ASCII fallback map\nexport const BOX: Record<string, string> = {\n '┌': '+', '┐': '+', '└': '+', '┘': '+',\n '─': '-', '│': '|', '├': '+', '┤': '+',\n '┬': '+', '┴': '+', '┼': '+',\n '═': '=', '║': '|', '╔': '+', '╗': '+', '╚': '+', '╝': '+',\n '╠': '+', '╣': '+', '╦': '+', '╩': '+', '╬': '+',\n};\n\n// Spinner fallback frames when unicode not available\nexport const BRAILLE_SPIN = ['|', '/', '-', '\\\\'] as const;\n\n// Block characters for progress bars\nexport const BLOCK = { full: '#', empty: ' ', partial: '-' } as const;\n","/**\n * Triggers the terminal bell using the BEL control character (\\x07).\n * This will usually cause a system beep or a visual flash depending on\n * the terminal emulator's configuration.\n */\nexport function bell(): void {\n if (typeof process !== 'undefined' && process.stdout && process.stdout.write) {\n process.stdout.write('\\x07');\n }\n}\n","import type { Screen } from '../terminal/Screen.js';\nimport { caps } from '../terminal/env-caps.js';\n\nconst VERTICAL = new Set(['│', '|']);\nconst HORIZONTAL = new Set(['─', '-']);\n\nfunction isVertical(char: string): boolean {\n return VERTICAL.has(char);\n}\n\nfunction isHorizontal(char: string): boolean {\n return HORIZONTAL.has(char);\n}\n\n export const UNICODE_JUNCTIONS =\n {\n LRTB: '┼',\n RTB: '├',\n LTB: '┤',\n LRB: '┬',\n LRT: '┴',\n\n RB: '┌',\n LB: '┐',\n RT: '└',\n LT: '┘',\n\n TB: '│',\n LR: '─',\n\n R: '─',\n L: '─',\n T: '│',\n B: '│',\n };\n export const ASCII_JUNCTIONS = {\n LRTB: '+',\n RTB: '+',\n LTB: '+',\n LRB: '+',\n LRT: '+',\n\n RB: '+',\n LB: '+',\n RT: '+',\n LT: '+',\n\n TB: '|',\n LR: '-',\n\n R: '-',\n L: '-',\n T: '|',\n B: '|',\n };\n\n // Choose junction set based on terminal capabilities\n function getJunctions() {\n return caps.unicode\n ? UNICODE_JUNCTIONS\n : ASCII_JUNCTIONS;\n }\n\nexport function mergeBorders(screen: Screen): void {\n const grid = screen.back;\n const junctions = getJunctions();\n\n const updates: Array<{\n row: number;\n col: number;\n char: string;\n }> = [];\n\n for (let row = 0; row < screen.rows; row++) {\n for (let col = 0; col < screen.cols; col++) {\n const cell = grid[row][col];\n\n const top = row > 0 ? grid[row - 1][col].char : '';\n const bottom = row < screen.rows - 1 ? grid[row + 1][col].char : '';\n const left = col > 0 ? grid[row][col - 1].char : '';\n const right = col < screen.cols - 1 ? grid[row][col + 1].char : '';\n\n const hasTop = isVertical(top);\n const hasBottom = isVertical(bottom);\n const hasLeft = isHorizontal(left);\n const hasRight = isHorizontal(right);\n\n const key =\n (hasLeft ? 'L' : '') +\n (hasRight ? 'R' : '') +\n (hasTop ? 'T' : '') +\n (hasBottom ? 'B' : '');\n\n const merged = junctions[key as keyof typeof junctions];\n\n if (merged) {\n updates.push({\n row,\n col,\n char: merged,\n }); \n } \n }\n }\n for (const update of updates) {\n grid[update.row][update.col].char = update.char;\n }\n}","// ─────────────────────────────────────────────────────\n// @termuijs/core — Input Parser\n// ─────────────────────────────────────────────────────\n\nimport { Buffer } from 'node:buffer';\nimport type { KeyEvent, MouseEvent } from '../events/types.js';\nimport { createKeyEvent } from '../events/types.js';\nimport { ESCAPE_SEQUENCES, CTRL_KEYS, SPECIAL_KEYS } from './KeyMap.js';\nimport { parseMouseEvent, isMouseSequence } from './MouseParser.js';\nimport { EventEmitter } from '../events/EventEmitter.js';\n\nexport interface CursorPosition {\n row: number;\n col: number;\n}\n\ninterface InputEvents {\n key: KeyEvent;\n mouse: MouseEvent;\n focuschange: boolean;\n paste: string;\n}\n\n/**\n * Reads raw stdin bytes and parses them into typed KeyEvent / MouseEvent objects.\n * Handles escape sequences, multi-byte keys, ctrl+key, and SGR mouse events.\n */\nexport class InputParser {\n private _events = new EventEmitter<InputEvents>();\n private _stdin: NodeJS.ReadStream;\n private _handler: ((data: Buffer) => void) | null = null;\n private _escapeTimeout: ReturnType<typeof setTimeout> | null = null;\n private _escapeBuffer: Buffer = Buffer.alloc(0);\n private _isPasting = false;\n private _pasteBuffer = '';\n private _cursorRequests: Array<{\n resolve: (position: CursorPosition) => void;\n reject: (error: Error) => void;\n timeout: ReturnType<typeof setTimeout>;\n }> = [];\n\n constructor(stdin: NodeJS.ReadStream) {\n this._stdin = stdin;\n }\n\n /** Subscribe to key events */\n onKey(handler: (event: KeyEvent) => void): () => void {\n return this._events.on('key', handler);\n }\n\n /** Subscribe to mouse events */\n onMouse(handler: (event: MouseEvent) => void): () => void {\n return this._events.on('mouse', handler);\n }\n\n /** Subscribe to terminal focus-in (true) / focus-out (false) reports. */\n onFocusChange(handler: (focused: boolean) => void): () => void {\n return this._events.on('focuschange', handler);\n }\n\n onPaste(handler: (text: string) => void): () => void {\n return this._events.on('paste', handler);\n }\n\n requestCursorPosition(timeoutMs = 200): Promise<CursorPosition> {\n return new Promise<CursorPosition>((resolve, reject) => {\n const timeout = setTimeout(() => {\n const idx = this._cursorRequests.findIndex((item) => item.reject === reject);\n if (idx !== -1) {\n this._cursorRequests.splice(idx, 1);\n }\n reject(new Error('Cursor position request timed out'));\n }, timeoutMs);\n\n this._cursorRequests.push({ resolve, reject, timeout });\n });\n }\n\n /** Start listening for input */\n start(): void {\n if (this._handler) return;\n\n this._handler = (data: Buffer) => {\n this._processInput(data);\n };\n\n this._stdin.on('data', this._handler);\n }\n\n /** Stop listening for input */\n stop(): void {\n if (this._handler) {\n this._stdin.off('data', this._handler);\n this._handler = null;\n }\n if (this._escapeTimeout) {\n clearTimeout(this._escapeTimeout);\n this._escapeTimeout = null;\n }\n this._escapeBuffer = Buffer.alloc(0);\n for (const req of this._cursorRequests) {\n clearTimeout(req.timeout);\n req.reject(new Error('InputParser stopped'));\n }\n this._cursorRequests = [];\n }\n\n /**\n * Process a chunk of raw input bytes.\n */\n private _processInput(data: Buffer): void {\n const str = data.toString('utf8');\n const PASTE_START = '\\x1b[200~';\n const PASTE_END = '\\x1b[201~';\n\n if (str.includes(PASTE_START) && str.includes(PASTE_END)) {\n const pastedText = str\n .replace(PASTE_START, '')\n .replace(PASTE_END, '');\n\n this._events.emit('paste', pastedText);\n return;\n }\n // If we're collecting an escape sequence\n if (this._escapeBuffer.length > 0) {\n this._escapeBuffer = Buffer.concat([this._escapeBuffer, data]);\n if (this._escapeTimeout) {\n clearTimeout(this._escapeTimeout);\n this._escapeTimeout = null;\n }\n this._tryParseEscape();\n return;\n }\n\n // Check if this starts an escape sequence\n if (str.startsWith('\\x1b') && str.length === 1) {\n // Lone ESC — wait a bit to see if more bytes follow\n this._escapeBuffer = data;\n this._escapeTimeout = setTimeout(() => {\n // Timeout — it was a standalone Escape key\n this._events.emit('key', createKeyEvent({\n key: 'escape',\n raw: this._escapeBuffer,\n ctrl: false,\n alt: false,\n shift: false,\n }));\n this._escapeBuffer = Buffer.alloc(0);\n this._escapeTimeout = null;\n }, 50); // 50ms debounce for escape sequences\n return;\n }\n\n if (str.startsWith('\\x1b')) {\n this._escapeBuffer = data;\n this._tryParseEscape();\n return;\n }\n\n // Process each code point for non-escape input\n for (const ch of str) {\n const code = ch.codePointAt(0)!;\n const raw = Buffer.from(ch, 'utf8');\n\n // Ctrl+key (0x01-0x1A, excluding tab/enter/backspace)\n if (code >= 0x01 && code <= 0x1A) {\n const keyName = CTRL_KEYS[code];\n const isCtrl = code !== 0x09 && code !== 0x0D && code !== 0x0A;\n this._events.emit('key', createKeyEvent({\n key: keyName || String.fromCharCode(code + 96),\n raw,\n ctrl: isCtrl,\n alt: false,\n shift: false,\n }));\n continue;\n }\n\n // Special keys\n if (code in SPECIAL_KEYS) {\n this._events.emit('key', createKeyEvent({\n key: SPECIAL_KEYS[code],\n raw,\n ctrl: false,\n alt: false,\n shift: false,\n }));\n continue;\n }\n\n // Regular printable character\n if (code >= 0x20) {\n this._events.emit('key', createKeyEvent({\n key: ch,\n raw,\n ctrl: false,\n alt: false,\n shift: ch !== ch.toLowerCase() && ch === ch.toUpperCase(),\n }));\n }\n }\n }\n\n /**\n * Try to parse buffered escape sequence.\n */\n private _tryParseEscape(): void {\n const seq = this._escapeBuffer.toString('utf8');\n\n // Check for mouse event first\n if (isMouseSequence(seq)) {\n const mouseEvt = parseMouseEvent(seq);\n if (mouseEvt) {\n this._events.emit('mouse', mouseEvt);\n this._escapeBuffer = Buffer.alloc(0);\n return;\n }\n // Might be incomplete mouse sequence — wait for more data\n if (seq.length < 20) { // safety cap\n if (this._escapeTimeout) {\n clearTimeout(this._escapeTimeout);\n this._escapeTimeout = null;\n }\n this._escapeTimeout = setTimeout(() => {\n this._escapeBuffer = Buffer.alloc(0);\n this._escapeTimeout = null;\n }, 100);\n return;\n }\n }\n\n // Cursor position report\n const cursorMatch = seq.match(/^\\x1b\\[(\\d+);(\\d+)R$/);\n if (cursorMatch) {\n const row = parseInt(cursorMatch[1], 10);\n const col = parseInt(cursorMatch[2], 10);\n const position = { row, col };\n\n for (const request of this._cursorRequests) {\n clearTimeout(request.timeout);\n request.resolve(position);\n }\n this._cursorRequests = [];\n this._escapeBuffer = Buffer.alloc(0);\n return;\n }\n\n // Focus tracking sequences\n if (seq === '\\x1b[I') {\n this._events.emit('focuschange', true);\n this._escapeBuffer = Buffer.alloc(0);\n return;\n }\n\n if (seq === '\\x1b[O') {\n this._events.emit('focuschange', false);\n this._escapeBuffer = Buffer.alloc(0);\n return;\n }\n\n // Check known escape sequences\n if (seq in ESCAPE_SEQUENCES) {\n const keyName = ESCAPE_SEQUENCES[seq];\n const isShift = keyName.startsWith('shift+');\n const isCtrl = keyName.startsWith('ctrl+');\n const isAlt = keyName.startsWith('alt+');\n const cleanKey = keyName.replace(/^(shift|ctrl|alt)\\+/, '');\n\n this._events.emit('key', createKeyEvent({\n key: cleanKey,\n raw: this._escapeBuffer,\n ctrl: isCtrl,\n alt: isAlt,\n shift: isShift,\n }));\n this._escapeBuffer = Buffer.alloc(0);\n return;\n }\n\n // Alt+key: ESC followed by a regular character\n if (\n seq.length === 2 &&\n seq[0] === '\\x1b' &&\n seq[1] !== '[' &&\n seq[1] !== 'O'\n ) {\n const ch = seq[1];\n this._events.emit('key', createKeyEvent({\n key: ch,\n raw: this._escapeBuffer,\n ctrl: false,\n alt: true,\n shift: ch !== ch.toLowerCase() && ch === ch.toUpperCase(),\n }));\n this._escapeBuffer = Buffer.alloc(0);\n return;\n }\n\n // If the sequence is getting too long, give up\n if (seq.length > 20) {\n this._escapeBuffer = Buffer.alloc(0);\n return;\n }\n\n // Wait for more bytes (might be an incomplete sequence)\n if (this._escapeTimeout) {\n clearTimeout(this._escapeTimeout);\n this._escapeTimeout = null;\n }\n this._escapeTimeout = setTimeout(() => {\n // Timeout — emit as unknown escape and clear\n this._escapeBuffer = Buffer.alloc(0);\n this._escapeTimeout = null;\n }, 100);\n }\n}\n","// ─────────────────────────────────────────────────────\n// @termuijs/core — Event types\n// ─────────────────────────────────────────────────────\n\n/**\n * Keyboard event emitted when a key is pressed.\n */\nexport interface KeyEvent {\n /** Human-readable key name: 'a', 'enter', 'up', 'f1', 'tab', etc. */\n key: string;\n /** Raw byte sequence from stdin */\n raw: Buffer;\n /** Ctrl modifier held */\n ctrl: boolean;\n /** Alt/Meta modifier held */\n alt: boolean;\n /** Shift modifier held */\n shift: boolean;\n /** The widget ID that currently has focus (target of the event) */\n targetId?: string;\n /** Whether propagation has been stopped */\n _propagationStopped?: boolean;\n /** Whether the default action has been prevented */\n _defaultPrevented?: boolean;\n /** Stop this event from bubbling to parent widgets */\n stopPropagation(): void;\n /** Prevent the default action for this event */\n preventDefault(): void;\n}\n\n/**\n * Create a KeyEvent with propagation control methods attached.\n */\nexport function createKeyEvent(base: {\n key: string;\n raw: Buffer;\n ctrl: boolean;\n alt: boolean;\n shift: boolean;\n targetId?: string;\n}): KeyEvent {\n const event: KeyEvent = {\n ...base,\n _propagationStopped: false,\n _defaultPrevented: false,\n stopPropagation() { this._propagationStopped = true; },\n preventDefault() { this._defaultPrevented = true; },\n };\n return event;\n}\n\n/**\n * Mouse event types.\n */\nexport type MouseEventType =\n | 'mousedown' | 'mouseup' | 'mousemove' | 'scroll'\n | 'dblclick' | 'drag' | 'dragend';\nexport type MouseButton = 'left' | 'middle' | 'right' | 'none';\n\n/**\n * Mouse event emitted when mouse activity is detected.\n */\nexport interface MouseEvent {\n /** x (column) position, 0-indexed */\n x: number;\n /** y (row) position, 0-indexed */\n y: number;\n /** Which mouse button */\n button: MouseButton;\n /** Type of mouse event */\n type: MouseEventType;\n /** Vertical scroll delta: -1 = up, 1 = down. Set for vertical wheel events. */\n scrollDelta?: number;\n /** Horizontal scroll delta: -1 = left, 1 = right. Set for horizontal wheel events. */\n scrollDeltaX?: number;\n /** Which axis a scroll event used. Set only for type 'scroll'. */\n scrollAxis?: 'vertical' | 'horizontal';\n /** Ctrl modifier held during the mouse event. SGR bit 0b10000. */\n ctrl?: boolean;\n /** Alt/Meta modifier held during the mouse event. SGR bit 0b1000. */\n alt?: boolean;\n /** Shift modifier held during the mouse event. SGR bit 0b100. */\n shift?: boolean;\n}\n\n/**\n * Resize event emitted when the terminal is resized.\n */\nexport interface ResizeEvent {\n cols: number;\n rows: number;\n}\n\n/**\n * Focus event emitted when a widget gains or loses focus.\n */\nexport interface FocusEvent {\n /** Widget ID that is gaining or losing focus */\n targetId: string;\n /** Type of focus event */\n type: 'focus' | 'blur';\n /** Monotonically increasing sequence number for ordering / staleness detection */\n epoch?: number;\n}\n\n/**\n * Map of all event types to their data shapes.\n */\nexport interface EventMap {\n 'key': KeyEvent;\n 'mouse': MouseEvent;\n 'resize': ResizeEvent;\n 'focus': FocusEvent;\n 'blur': FocusEvent;\n 'render': void;\n 'mount': void;\n 'unmount': void;\n 'tick': number; // delta ms\n 'paste': string;\n}\n","// ─────────────────────────────────────────────────────\n// @termuijs/core — Key mapping constants\n// ─────────────────────────────────────────────────────\n\nimport { caps } from '../terminal/env-caps.js';\n\n/**\n * Maps raw byte sequences to human-readable key names.\n * These are standard VT100/xterm escape sequences.\n */\nexport const ESCAPE_SEQUENCES: Record<string, string> = {\n // Arrow keys\n '\\x1b[A': 'up',\n '\\x1b[B': 'down',\n '\\x1b[C': 'right',\n '\\x1b[D': 'left',\n\n // Shift+Arrow\n '\\x1b[1;2A': 'shift+up',\n '\\x1b[1;2B': 'shift+down',\n '\\x1b[1;2C': 'shift+right',\n '\\x1b[1;2D': 'shift+left',\n\n // Ctrl+Arrow\n '\\x1b[1;5A': 'ctrl+up',\n '\\x1b[1;5B': 'ctrl+down',\n '\\x1b[1;5C': 'ctrl+right',\n '\\x1b[1;5D': 'ctrl+left',\n\n // Alt+Arrow\n '\\x1b[1;3A': 'alt+up',\n '\\x1b[1;3B': 'alt+down',\n '\\x1b[1;3C': 'alt+right',\n '\\x1b[1;3D': 'alt+left',\n\n // Home/End/Insert/Delete/PageUp/PageDown\n '\\x1b[H': 'home',\n '\\x1b[F': 'end',\n '\\x1b[2~': 'insert',\n '\\x1b[3~': 'delete',\n '\\x1b[5~': 'pageup',\n '\\x1b[6~': 'pagedown',\n\n // Alternate Home/End (some terminals)\n '\\x1b[1~': 'home',\n '\\x1b[4~': 'end',\n '\\x1bOH': 'home',\n '\\x1bOF': 'end',\n\n // Function keys\n '\\x1bOP': 'f1',\n '\\x1bOQ': 'f2',\n '\\x1bOR': 'f3',\n '\\x1bOS': 'f4',\n '\\x1b[15~': 'f5',\n '\\x1b[17~': 'f6',\n '\\x1b[18~': 'f7',\n '\\x1b[19~': 'f8',\n '\\x1b[20~': 'f9',\n '\\x1b[21~': 'f10',\n '\\x1b[23~': 'f11',\n '\\x1b[24~': 'f12',\n\n // Special keys\n '\\x1b[Z': 'shift+tab',\n};\n\n/**\n * Maps control character codes (0x01-0x1A) to key names.\n * Ctrl+A = 0x01, Ctrl+B = 0x02, ... Ctrl+Z = 0x1A\n */\nexport const CTRL_KEYS: Record<number, string> = {\n 0x01: 'a', 0x02: 'b', 0x03: 'c', 0x04: 'd',\n 0x05: 'e', 0x06: 'f', 0x07: 'g', 0x08: 'backspace',\n 0x09: 'tab', 0x0A: 'enter', 0x0B: 'k', 0x0C: 'l',\n 0x0D: 'enter', 0x0E: 'n', 0x0F: 'o', 0x10: 'p',\n 0x11: 'q', 0x12: 'r', 0x13: 's', 0x14: 't',\n 0x15: 'u', 0x16: 'v', 0x17: 'w', 0x18: 'x',\n 0x19: 'y', 0x1A: 'z',\n};\n\n/**\n * Special single-byte key codes.\n */\nexport const SPECIAL_KEYS: Record<number, string> = {\n 0x1B: 'escape',\n 0x7F: 'backspace',\n 0x09: 'tab',\n 0x0D: 'enter',\n 0x0A: 'enter',\n 0x20: 'space',\n};\n\n/**\n * Normalizes navigation key names based on the active keybinding mode.\n * Useful for mapping vim (j/k/h/l) or emacs (ctrl+n/ctrl+p) keys to standard\n * arrow key intents (up/down/left/right).\n * \n * @param keyName The raw key name from KeyEvent.name\n * @returns The normalized directional key name, or the original key name\n */\nexport function normalizeNavigationKey(keyName: string): string {\n const mode = caps.keybindingMode;\n \n if (mode === 'vim') {\n if (keyName === 'k') return 'up';\n if (keyName === 'j') return 'down';\n if (keyName === 'h') return 'left';\n if (keyName === 'l') return 'right';\n } else if (mode === 'emacs') {\n if (keyName === 'ctrl+p') return 'up';\n if (keyName === 'ctrl+n') return 'down';\n }\n \n return keyName;\n}\n","// ─────────────────────────────────────────────────────\n// @termuijs/core — Mouse event parser (SGR mode)\n// ─────────────────────────────────────────────────────\n\nimport type { MouseEvent, MouseButton, MouseEventType } from '../events/types.js';\n\n/**\n * Parse an SGR mouse event escape sequence.\n *\n * SGR format: ESC [ < Cb ; Cx ; Cy M (button press)\n * ESC [ < Cb ; Cx ; Cy m (button release)\n *\n * Where Cb encodes the button and modifiers, Cx/Cy are 1-based coordinates.\n *\n * @returns Parsed MouseEvent or null if not a mouse sequence.\n */\nexport function parseMouseEvent(data: string): MouseEvent | null {\n // SGR mouse: \\x1b[<Cb;Cx;Cy[Mm]\n const match = data.match(/^\\x1b\\[<(\\d+);(\\d+);(\\d+)([Mm])$/);\n if (!match) return null;\n\n const cb = parseInt(match[1], 10);\n const cx = parseInt(match[2], 10) - 1; // Convert to 0-based\n const cy = parseInt(match[3], 10) - 1;\n const isRelease = match[4] === 'm';\n\n let button: MouseButton;\n let type: MouseEventType;\n let scrollDelta: number | undefined;\n let scrollDeltaX: number | undefined;\n let scrollAxis: 'vertical' | 'horizontal' | undefined;\n\n // Decode button from low 2 bits\n const buttonBits = cb & 0b11;\n const motion = (cb & 0b100000) !== 0;\n const isScroll = (cb & 0b1000000) !== 0;\n\n const shift = (cb & 0b100) !== 0;\n const alt = (cb & 0b1000) !== 0;\n const ctrl = (cb & 0b10000) !== 0;\n\n if (isScroll) {\n button = 'none';\n type = 'scroll';\n const lowBits = cb & 0b111;\n if (lowBits === 6) {\n scrollAxis = 'horizontal';\n scrollDeltaX = -1;\n } else if (lowBits === 7) {\n scrollAxis = 'horizontal';\n scrollDeltaX = 1;\n } else {\n scrollAxis = 'vertical';\n scrollDelta = buttonBits === 0 ? -1 : 1;\n }\n } else if (motion) {\n type = 'mousemove';\n button = decodeButton(buttonBits);\n } else if (isRelease) {\n type = 'mouseup';\n button = decodeButton(buttonBits);\n } else {\n type = 'mousedown';\n button = decodeButton(buttonBits);\n }\n\n return {\n x: cx,\n y: cy,\n button,\n type,\n ...(scrollDelta !== undefined && { scrollDelta }),\n ...(scrollDeltaX !== undefined && { scrollDeltaX }),\n ...(scrollAxis !== undefined && { scrollAxis }),\n shift,\n alt,\n ctrl,\n };\n}\n\nfunction decodeButton(bits: number): MouseButton {\n switch (bits) {\n case 0: return 'left';\n case 1: return 'middle';\n case 2: return 'right';\n default: return 'none';\n }\n}\n\n/**\n * Check if a string looks like it could be a mouse sequence.\n */\nexport function isMouseSequence(data: string): boolean {\n return data.startsWith('\\x1b[<');\n}\n","// ─────────────────────────────────────────────────────\n// @termuijs/core — Typed Event Emitter\n// ─────────────────────────────────────────────────────\n\n/**\n * Strongly-typed event emitter using TypeScript generics.\n * Supports `on`, `off`, `once`, `emit` with type-safe event maps.\n */\nexport class EventEmitter<TEventMap extends Record<string, any>> {\n private _handlers: Map<keyof TEventMap, Set<(data: any) => void>> = new Map(); // any: handler type erased here; callers constrain via generics\n private _onceHandlers: Map<keyof TEventMap, Set<(data: any) => void>> = new Map(); // any: handler type erased here; callers constrain via generics\n\n /**\n * Subscribe to an event.\n * @returns Unsubscribe function.\n */\n on<K extends keyof TEventMap>(event: K, handler: (data: TEventMap[K]) => void): () => void {\n if (!this._handlers.has(event)) {\n this._handlers.set(event, new Set());\n }\n this._handlers.get(event)!.add(handler);\n\n return () => this.off(event, handler);\n }\n\n /**\n * Subscribe to an event, but only fire once.\n */\n once<K extends keyof TEventMap>(event: K, handler: (data: TEventMap[K]) => void): () => void {\n if (!this._onceHandlers.has(event)) {\n this._onceHandlers.set(event, new Set());\n }\n this._onceHandlers.get(event)!.add(handler);\n\n return () => {\n this._onceHandlers.get(event)?.delete(handler);\n };\n }\n\n /**\n * Unsubscribe from an event.\n */\n off<K extends keyof TEventMap>(event: K, handler: (data: TEventMap[K]) => void): void {\n this._handlers.get(event)?.delete(handler);\n this._onceHandlers.get(event)?.delete(handler);\n }\n\n /**\n * Emit an event to all subscribed handlers.\n */\n emit<K extends keyof TEventMap>(event: K, data: TEventMap[K]): void {\n // Regular handlers\n const handlers = this._handlers.get(event);\n if (handlers) {\n for (const handler of handlers) {\n try { handler(data); } catch (_err) {\n // handler errors are silently ignored to prevent crash during rendering\n }\n }\n }\n\n // Once handlers — fire and remove\n const onceHandlers = this._onceHandlers.get(event);\n if (onceHandlers) {\n for (const handler of onceHandlers) {\n try { handler(data); } catch (_err) {\n // handler errors are silently ignored to prevent crash during rendering\n }\n }\n onceHandlers.clear();\n }\n }\n\n /**\n * Remove all handlers for a specific event, or all events if no event specified.\n */\n removeAll(event?: keyof TEventMap): void {\n if (event) {\n this._handlers.delete(event);\n this._onceHandlers.delete(event);\n } else {\n this._handlers.clear();\n this._onceHandlers.clear();\n }\n }\n\n /**\n * Check if there are any handlers for an event.\n */\n hasListeners(event: keyof TEventMap): boolean {\n return (\n (this._handlers.get(event)?.size ?? 0) > 0 ||\n (this._onceHandlers.get(event)?.size ?? 0) > 0\n );\n }\n}\n","// ─────────────────────────────────────────────────────\n// @termuijs/core — Mouse gestures synthesizer\n// ─────────────────────────────────────────────────────\n\nimport type { MouseEvent, MouseButton } from '../events/types.js';\n\nexport interface MouseGesturesOptions {\n /** Max ms between two clicks to count as a double-click. Default 300. */\n doubleClickMs?: number;\n}\n\nexport class MouseGestures {\n private doubleClickMs: number;\n private lastMouseDown: { x: number; y: number; button: MouseButton; time: number } | null = null;\n private activeDragButton: MouseButton | null = null;\n private wasDragging = false;\n\n constructor(opts?: MouseGesturesOptions) {\n this.doubleClickMs = opts?.doubleClickMs ?? 300;\n }\n\n /**\n * Feed a raw MouseEvent. Returns synthesized events to emit\n * (may be empty). Does not mutate the input event.\n */\n feed(event: MouseEvent): MouseEvent[] {\n const synthesized: MouseEvent[] = [];\n\n if (event.type === 'mousedown') {\n const now = Date.now();\n if (\n this.lastMouseDown &&\n this.lastMouseDown.x === event.x &&\n this.lastMouseDown.y === event.y &&\n this.lastMouseDown.button === event.button &&\n now - this.lastMouseDown.time <= this.doubleClickMs\n ) {\n synthesized.push({\n x: event.x,\n y: event.y,\n button: event.button,\n type: 'dblclick',\n });\n // Reset so a third consecutive fast click doesn't trigger another double click\n this.lastMouseDown = null;\n } else {\n this.lastMouseDown = {\n x: event.x,\n y: event.y,\n button: event.button,\n time: now,\n };\n }\n\n this.activeDragButton = event.button;\n this.wasDragging = false;\n } else if (event.type === 'mousemove') {\n if (this.activeDragButton !== null) {\n this.wasDragging = true;\n synthesized.push({\n x: event.x,\n y: event.y,\n button: this.activeDragButton,\n type: 'drag',\n });\n }\n } else if (event.type === 'mouseup') {\n if (this.activeDragButton !== null) {\n if (this.wasDragging) {\n synthesized.push({\n x: event.x,\n y: event.y,\n button: event.button,\n type: 'dragend',\n });\n }\n this.activeDragButton = null;\n this.wasDragging = false;\n }\n }\n\n return synthesized;\n }\n}\n","// ─────────────────────────────────────────────────────\n// @termuijs/core — Chord Matcher\n// ─────────────────────────────────────────────────────\n\nimport type { KeyEvent } from '../events/types.js';\n\nexport interface Chord {\n keys: string[];\n handler: () => void;\n}\n\nexport interface ChordMatcherOptions {\n timeoutMs?: number;\n}\n\nfunction getKeyEventToken(event: KeyEvent): string {\n let token = '';\n if (event.ctrl) token += 'ctrl+';\n if (event.alt) token += 'alt+';\n if (event.shift) token += 'shift+';\n token += event.key.toLowerCase();\n return token;\n}\n\nexport class ChordMatcher {\n private _bindings: { keys: string[]; handler: () => void; id: number }[] = [];\n private _nextId = 0;\n private _buffer: string[] = [];\n private _timeoutMs: number;\n private _timer: ReturnType<typeof setTimeout> | null = null;\n\n constructor(opts?: ChordMatcherOptions) {\n this._timeoutMs = opts?.timeoutMs ?? 800;\n }\n\n bind(keys: string[], handler: () => void): () => void {\n const id = this._nextId++;\n this._bindings.push({ keys, handler, id });\n return () => {\n this._bindings = this._bindings.filter(b => b.id !== id);\n };\n }\n\n feed(event: KeyEvent): boolean {\n if (this._timer) {\n clearTimeout(this._timer);\n this._timer = null;\n }\n\n const token = getKeyEventToken(event);\n let candidate = [...this._buffer, token];\n let matchingBindings = this._getMatchingBindings(candidate);\n\n if (matchingBindings.length === 0) {\n // Wrong key resets the buffer\n this._buffer = [];\n // Attempt to match the token as the start of a new sequence\n candidate = [token];\n matchingBindings = this._getMatchingBindings(candidate);\n if (matchingBindings.length === 0) {\n return false;\n }\n }\n\n this._buffer = candidate;\n\n const completedBindings = matchingBindings.filter(\n binding => binding.keys.length === candidate.length\n );\n\n if (completedBindings.length > 0) {\n // Completed chord: fires handler, clears buffer\n for (const binding of completedBindings) {\n binding.handler();\n }\n this._buffer = [];\n return true;\n }\n\n // If it advanced but did not complete, set the timeout to reset the buffer\n this._timer = setTimeout(() => {\n this._buffer = [];\n this._timer = null;\n }, this._timeoutMs);\n\n return true;\n }\n\n private _getMatchingBindings(candidate: string[]) {\n return this._bindings.filter(binding => {\n if (binding.keys.length < candidate.length) return false;\n for (let i = 0; i < candidate.length; i++) {\n if (binding.keys[i] !== candidate[i]) return false;\n }\n return true;\n });\n }\n}\n","import type { Terminal } from \"../terminal/Terminal.js\";\nimport { moveUp, clearLine } from \"../utils/ansi.js\";\nimport type { Screen } from \"../terminal/Screen.js\";\n\nexport class LiveRender {\n constructor(\n private readonly terminal: Terminal,\n private readonly screen: Screen,\n ) {}\n\n private getHeight(frame: string): number {\n if (frame.length === 0) {\n return 0;\n }\n\n return frame.split(\"\\n\").length;\n }\n\n /**\n * Renders a serialized screen buffer.\n *\n * Widgets render into a Screen object first.\n * Callers should serialize the Screen contents into a string\n * before passing it to LiveRender.render().\n */\n\n render(frame: string): void {\n let output = \"\";\n\n const previousHeight = this.screen.lastRenderedHeight;\n\n if (previousHeight > 0) {\n output += moveUp(previousHeight);\n\n for (let i = 0; i < previousHeight; i++) {\n output += clearLine;\n\n if (i < previousHeight - 1) {\n output += \"\\n\";\n }\n }\n output += \"\\r\";\n }\n\n output += frame;\n\n this.terminal.write(output);\n\n this.screen.lastRenderedHeight = this.getHeight(frame);\n }\n}\n","// ─────────────────────────────────────────────────────\n// @termuijs/core — Style definition and merging\n// ─────────────────────────────────────────────────────\n\nimport type { Color } from './Color.js';\nimport type { BorderStyle } from './Border.js';\nimport type { Pos } from '../layout/pos.js';\nimport type { Dim } from '../layout/dim.js';\nimport type { Constraint } from '../layout/constraint.js';\n\n/**\n * Edge values (padding, margin) — top, right, bottom, left.\n */\nexport interface Edges {\n top: number;\n right: number;\n bottom: number;\n left: number;\n}\n\n/**\n * Complete style definition for a widget.\n */\nexport interface Style {\n // ── Colors ──────────────\n fg?: Color;\n bg?: Color;\n\n // ── Text Decoration ─────\n bold?: boolean;\n italic?: boolean;\n underline?: boolean;\n dim?: boolean;\n strikethrough?: boolean;\n inverse?: boolean;\n\n // ── Box Model ───────────\n padding?: Partial<Edges> | number;\n margin?: Partial<Edges> | number;\n border?: BorderStyle;\n asciiOnly?: boolean; \n borderColor?: Color;\n\n // ── Dimensions ──────────\n width?: number | string | Dim; // number = fixed chars, string = '50%', Dim = Dimension constraint\n height?: number | string | Dim;\n minWidth?: number;\n minHeight?: number;\n maxWidth?: number;\n maxHeight?: number;\n \n // ── Positional Constraints ─\n x?: number | Pos;\n y?: number | Pos;\n groupId?: string;\n \n // ── 1D Layout Constraints ──\n constraints?: Constraint[];\n\n // ── Flex Layout ─────────\n flexDirection?: 'row' | 'column';\n justifyContent?: 'flex-start' | 'flex-end' | 'center' | 'space-between' | 'space-around';\n alignItems?: 'flex-start' | 'flex-end' | 'center' | 'stretch';\n flexGrow?: number;\n flexShrink?: number;\n flexWrap?: 'nowrap' | 'wrap';\n gap?: number;\n\n // ── Overflow ────────────\n overflow?: 'visible' | 'hidden' | 'scroll';\n\n // ── Stacking ────────────\n /** Z-index for layer ordering. Higher values render on top. */\n zIndex?: number;\n\n // ── Focus ────────────────\n /** Color of the focus ring when this widget has focus */\n focusRingColor?: Color;\n /** Style of the focus ring indicator */\n focusRingStyle?: 'border' | 'corners' | 'glow' | 'none';\n\n // ── Visibility ──────────\n visible?: boolean;\n}\n\n/**\n * Normalize a shorthand edge value (number) into the full Edges object.\n */\nexport function normalizeEdges(value: Partial<Edges> | number | undefined): Edges {\n if (value === undefined) return { top: 0, right: 0, bottom: 0, left: 0 };\n if (typeof value === 'number') {\n return { top: value, right: value, bottom: value, left: value };\n }\n return {\n top: value.top ?? 0,\n right: value.right ?? 0,\n bottom: value.bottom ?? 0,\n left: value.left ?? 0,\n };\n}\n\n/**\n * Merge two styles. `override` values take precedence.\n * Undefined values in override do not overwrite base values.\n */\nexport function mergeStyles(base: Style, override: Style): Style {\n const result: Style = { ...base };\n\n for (const key of Object.keys(override) as Array<keyof Style>) {\n const val = override[key];\n if (val !== undefined) {\n (result as any)[key] = val; // as any: keyof Style index write not supported without escape\n }\n }\n\n return result;\n}\n\n/**\n * Create a default (empty) style.\n */\nexport function defaultStyle(): Style {\n return {\n visible: true,\n flexDirection: 'column',\n justifyContent: 'flex-start',\n alignItems: 'stretch',\n flexGrow: 0,\n flexShrink: 1,\n flexWrap: 'nowrap',\n overflow: 'hidden',\n gap: 0,\n };\n}\n\n/**\n * Set of style property keys that affect layout.\n * When only non-layout props change, the layout tree can be reused.\n */\nexport const LAYOUT_PROPS: ReadonlySet<keyof Style> = new Set<keyof Style>([\n 'width', 'height', 'minWidth', 'minHeight', 'maxWidth', 'maxHeight',\n 'padding', 'margin', 'border',\n 'flexDirection', 'justifyContent', 'alignItems', 'flexGrow', 'flexShrink', 'flexWrap', 'gap',\n 'overflow', 'visible',\n]);\n\n/**\n * Returns true when any layout-affecting property differs between old and new style.\n */\nexport function hasLayoutChanges(oldStyle: Style, newStyle: Style): boolean {\n for (const key of LAYOUT_PROPS) {\n if (oldStyle[key as keyof Style] !== newStyle[key as keyof Style]) return true;\n }\n return false;\n}\n\n/**\n * Extract the cell-level style attributes from a Style object.\n * Used when rendering text into the screen buffer.\n */\nexport function styleToCellAttrs(style: Style): {\n fg: Color;\n bg: Color;\n bold: boolean;\n italic: boolean;\n underline: boolean;\n dim: boolean;\n strikethrough: boolean;\n inverse: boolean;\n} {\n return {\n fg: style.fg ?? { type: 'none' },\n bg: style.bg ?? { type: 'none' },\n bold: style.bold ?? false,\n italic: style.italic ?? false,\n underline: style.underline ?? false,\n dim: style.dim ?? false,\n strikethrough: style.strikethrough ?? false,\n inverse: style.inverse ?? false,\n };\n}\n","// ─────────────────────────────────────────────────────\n// @termuijs/core — Border styles and rendering\n// ─────────────────────────────────────────────────────\n\n/**\n * Supported border styles.\n */\nexport type BorderStyle =\n | 'none'\n | 'single'\n | 'double'\n | 'round'\n | 'heavy'\n | 'dashed'\n | 'custom';\n\n/**\n * The characters used to draw a border.\n * Layout:\n * ```\n * topLeft ─── top ─── topRight\n * │ │\n * left content right\n * │ │\n * bottomLeft ─ bottom ─ bottomRight\n * ```\n */\nexport interface BorderChars {\n topLeft: string;\n top: string;\n topRight: string;\n right: string;\n bottomRight: string;\n bottom: string;\n bottomLeft: string;\n left: string;\n}\n\n/** Character maps for each border style */\nexport const BORDER_CHARS: Record<Exclude<BorderStyle, 'none' | 'custom'>, BorderChars> = {\n single: {\n topLeft: '┌', top: '─', topRight: '┐',\n right: '│', bottomRight: '┘', bottom: '─',\n bottomLeft: '└', left: '│',\n },\n double: {\n topLeft: '╔', top: '═', topRight: '╗',\n right: '║', bottomRight: '╝', bottom: '═',\n bottomLeft: '╚', left: '║',\n },\n round: {\n topLeft: '╭', top: '─', topRight: '╮',\n right: '│', bottomRight: '╯', bottom: '─',\n bottomLeft: '╰', left: '│',\n },\n heavy: {\n topLeft: '┏', top: '━', topRight: '┓',\n right: '┃', bottomRight: '┛', bottom: '━',\n bottomLeft: '┗', left: '┃',\n },\n dashed: {\n topLeft: '┌', top: '┄', topRight: '┐',\n right: '┆', bottomRight: '┘', bottom: '┄',\n bottomLeft: '└', left: '┆',\n },\n};\n\nexport const ASCII_BORDER_CHARS: BorderChars = {\n topLeft: '+',\n top: '-',\n topRight: '+',\n right: '|',\n bottomRight: '+',\n bottom: '-',\n bottomLeft: '+',\n left: '|',\n};\n\n/**\n * Get the border characters for a given style.\n */\nexport function getBorderChars(\n style: BorderStyle,\n customChars?: Partial<BorderChars>,\n asciiOnly = false,\n): BorderChars | null {\n\n if (style === 'none') return null;\n\n if (asciiOnly) return ASCII_BORDER_CHARS;\n\n if (style === 'custom') {\n const base = BORDER_CHARS.single;\n return { ...base, ...customChars };\n }\n\n return BORDER_CHARS[style];\n}\n\n/**\n * Calculate the total space a border takes up.\n * Returns { horizontal, vertical } representing how many columns/rows\n * the border consumes (0 for none, 2 for any visible border — 1 on each side).\n */\nexport function borderSize(style: BorderStyle): { horizontal: number; vertical: number } {\n if (style === 'none') return { horizontal: 0, vertical: 0 };\n return { horizontal: 2, vertical: 2 };\n}\n","// ─────────────────────────────────────────────────────\n// @termuijs/core — Position Algebra\n// ─────────────────────────────────────────────────────\n\nimport type { LayoutContext } from './LayoutContext.js';\n\nexport abstract class Pos {\n /** List of variables this Pos depends on, e.g. ['elementSize', 'parentSize'] */\n abstract dependencies(): string[];\n \n /** Computes the final numeric coordinate */\n abstract evaluate(ctx: LayoutContext): number;\n\n /** Center the element within its parent */\n static center(): Pos {\n return new PosCenter();\n }\n\n /** Anchor the element `margin` units away from the end (right/bottom) */\n static anchorEnd(margin: number = 0): Pos {\n return new PosAnchorEnd(margin);\n }\n\n /** Align multiple siblings as a group */\n static align(alignment: 'start' | 'center' | 'end', groupId: string): Pos {\n return new PosAlign(alignment, groupId);\n }\n}\n\nclass PosCenter extends Pos {\n dependencies() {\n return ['parentSize', 'elementSize'];\n }\n evaluate(ctx: LayoutContext) {\n const pSize = ctx.axis === 'horizontal' ? ctx.parentWidth : ctx.parentHeight;\n const eSize = ctx.axis === 'horizontal' ? ctx.elementWidth : ctx.elementHeight;\n return Math.floor((pSize - eSize) / 2);\n }\n}\n\nclass PosAnchorEnd extends Pos {\n constructor(public margin: number) { super(); }\n\n dependencies() {\n return ['parentSize', 'elementSize'];\n }\n evaluate(ctx: LayoutContext) {\n const pSize = ctx.axis === 'horizontal' ? ctx.parentWidth : ctx.parentHeight;\n const eSize = ctx.axis === 'horizontal' ? ctx.elementWidth : ctx.elementHeight;\n return pSize - eSize - this.margin;\n }\n}\n\nclass PosAlign extends Pos {\n constructor(public alignment: 'start' | 'center' | 'end', public groupId: string) { super(); }\n\n dependencies() {\n // Depends on siblings in the same group being evaluated.\n // Handled specially by the resolver.\n return ['group:' + this.groupId, 'elementSize'];\n }\n \n evaluate(ctx: LayoutContext) {\n // Group alignment means we find the max size of elements in the group,\n // compute group bounding box, and place this element inside it.\n const groupSize = ctx.getGroupSize(this.groupId);\n if (groupSize === 0) return 0;\n \n const pSize = ctx.axis === 'horizontal' ? ctx.parentWidth : ctx.parentHeight;\n const eSize = ctx.axis === 'horizontal' ? ctx.elementWidth : ctx.elementHeight;\n \n // Let's say the group as a whole is placed based on alignment\n let groupOffset = 0;\n if (this.alignment === 'center') {\n groupOffset = Math.floor((pSize - groupSize) / 2);\n } else if (this.alignment === 'end') {\n groupOffset = pSize - groupSize;\n }\n\n // Within the group, element aligns differently depending on orientation?\n // Usually `align` centers the element within the group's bounding box.\n const localOffset = Math.floor((groupSize - eSize) / 2);\n return groupOffset + localOffset;\n }\n}\n","// ─────────────────────────────────────────────────────\n// @termuijs/core — Dimension Algebra\n// ─────────────────────────────────────────────────────\n\nimport type { LayoutContext } from './LayoutContext.js';\n\nexport abstract class Dim {\n /** List of variables this Dim depends on, e.g. ['contentWidth'] */\n abstract dependencies(): string[];\n \n /** Computes the final numeric size */\n abstract evaluate(ctx: LayoutContext): number;\n\n /** Size to the intrinsic content of the element */\n static auto(): Dim {\n return new DimAuto();\n }\n\n /** Fill remaining space in the parent, minus an optional margin */\n static fill(margin: number = 0): Dim {\n return new DimFill(margin);\n }\n\n /** Custom function to determine size */\n static func(fn: (ctx: LayoutContext) => number): Dim {\n return new DimFunc(fn);\n }\n}\n\nclass DimAuto extends Dim {\n dependencies() {\n return ['contentSize'];\n }\n evaluate(ctx: LayoutContext) {\n return ctx.axis === 'horizontal' ? ctx.contentWidth : ctx.contentHeight;\n }\n}\n\nclass DimFill extends Dim {\n constructor(public margin: number) { super(); }\n \n dependencies() {\n return ['parentSize'];\n }\n evaluate(ctx: LayoutContext) {\n const avail = ctx.axis === 'horizontal' ? ctx.parentWidth : ctx.parentHeight;\n return Math.max(0, avail - this.margin);\n }\n}\n\nclass DimFunc extends Dim {\n constructor(public fn: (ctx: LayoutContext) => number) { super(); }\n \n dependencies() {\n // Can't statically know, assume it might need anything except its own result\n return [];\n }\n evaluate(ctx: LayoutContext) {\n return this.fn(ctx);\n }\n}\n","// ─────────────────────────────────────────────────────\n// @termuijs/core — Constraints for splits\n// ─────────────────────────────────────────────────────\n\nexport enum Flex {\n Start = 'start',\n Center = 'center',\n End = 'end',\n SpaceBetween = 'space-between',\n SpaceAround = 'space-around',\n}\n\nexport abstract class Constraint {\n /** Fixed length in columns/rows */\n static Length(n: number): Constraint {\n return new LengthConstraint(n);\n }\n \n /** Percentage of available space (0-100) */\n static Percentage(n: number): Constraint {\n return new PercentageConstraint(n);\n }\n \n /** Minimum length */\n static Min(n: number): Constraint {\n return new MinConstraint(n);\n }\n \n /** Maximum length */\n static Max(n: number): Constraint {\n return new MaxConstraint(n);\n }\n \n /** Fills remaining space, with a flex weight */\n static Fill(weight: number = 1): Constraint {\n return new FillConstraint(weight);\n }\n}\n\nexport class LengthConstraint extends Constraint {\n constructor(public value: number) { super(); }\n}\n\nexport class PercentageConstraint extends Constraint {\n constructor(public value: number) { super(); }\n}\n\nexport class MinConstraint extends Constraint {\n constructor(public value: number) { super(); }\n}\n\nexport class MaxConstraint extends Constraint {\n constructor(public value: number) { super(); }\n}\n\nexport class FillConstraint extends Constraint {\n constructor(public weight: number) { super(); }\n}\n\n// Resolver\nexport function resolveConstraints(\n available: number,\n constraints: Constraint[],\n flex: Flex = Flex.Start,\n gap: number = 0\n): { offset: number; size: number }[] {\n const n = constraints.length;\n if (n === 0) return [];\n\n const sizes = new Array(n).fill(0);\n const minSizes = new Array(n).fill(0);\n const maxSizes = new Array(n).fill(Infinity);\n \n let totalFixed = 0;\n let fillWeightSum = 0;\n\n // 1. Initial pass: resolve absolutes\n for (let i = 0; i < n; i++) {\n const c = constraints[i];\n if (c instanceof LengthConstraint) {\n sizes[i] = c.value;\n totalFixed += c.value;\n } else if (c instanceof PercentageConstraint) {\n sizes[i] = Math.floor((available * c.value) / 100);\n totalFixed += sizes[i];\n } else if (c instanceof MinConstraint) {\n minSizes[i] = c.value;\n } else if (c instanceof MaxConstraint) {\n maxSizes[i] = c.value;\n } else if (c instanceof FillConstraint) {\n fillWeightSum += c.weight;\n }\n }\n\n // 2. Resolve Min/Max\n // For Min, we must reserve at least that much space\n for (let i = 0; i < n; i++) {\n if (constraints[i] instanceof MinConstraint) {\n sizes[i] = minSizes[i];\n totalFixed += sizes[i];\n }\n }\n\n // Gaps\n const totalGaps = gap * (n - 1);\n let remaining = Math.max(0, available - totalFixed - totalGaps);\n\n // 3. Resolve Fill\n if (fillWeightSum > 0) {\n let distributed = 0;\n for (let i = 0; i < n; i++) {\n const c = constraints[i];\n if (c instanceof FillConstraint) {\n const share = Math.floor((remaining * c.weight) / fillWeightSum);\n sizes[i] = share;\n distributed += share;\n }\n }\n \n // leftover to last fill\n let leftover = remaining - distributed;\n if (leftover > 0) {\n for (let i = n - 1; i >= 0; i--) {\n if (constraints[i] instanceof FillConstraint) {\n sizes[i] += leftover;\n break;\n }\n }\n }\n }\n\n // 4. Position according to Flex\n const totalUsed = sizes.reduce((a, b) => a + b, 0) + totalGaps;\n const freeSpace = Math.max(0, available - totalUsed);\n\n const results: { offset: number; size: number }[] = [];\n let offset = 0;\n let spaceBetween = 0;\n\n switch (flex) {\n case Flex.Start:\n break;\n case Flex.End:\n offset = freeSpace;\n break;\n case Flex.Center:\n offset = freeSpace / 2;\n break;\n case Flex.SpaceBetween:\n if (n > 1) spaceBetween = freeSpace / (n - 1);\n break;\n case Flex.SpaceAround:\n if (n > 0) {\n spaceBetween = freeSpace / n;\n offset = spaceBetween / 2;\n }\n break;\n }\n\n for (let i = 0; i < n; i++) {\n results.push({ offset: Math.floor(offset), size: sizes[i] });\n offset += sizes[i] + gap + spaceBetween;\n }\n\n return results;\n}\n\n// ─────────────────────────────────────────────────────\n// Topological Layout Solver (Pos & Dim Algebra)\n// ─────────────────────────────────────────────────────\n\nimport { Pos } from './pos.js';\nimport { Dim } from './dim.js';\nimport type { LayoutContext } from './LayoutContext.js';\n\nexport interface ResolvableNode {\n id: string;\n x?: number | Pos;\n y?: number | Pos;\n width?: number | Dim;\n height?: number | Dim;\n \n // Intrinsic / measured content size (auto)\n contentWidth: number;\n contentHeight: number;\n \n // Result\n computed: {\n x: number;\n y: number;\n width: number;\n height: number;\n };\n \n // For Pos.align\n groupId?: string;\n}\n\nexport function resolveLayoutVariables(\n nodes: ResolvableNode[],\n parentWidth: number,\n parentHeight: number\n) {\n const state = new Map<string, number | 'computing'>();\n\n function evaluateVariable(node: ResolvableNode, varName: 'x' | 'y' | 'width' | 'height'): number {\n const key = `${node.id}:${varName}`;\n const existing = state.get(key);\n if (existing === 'computing') {\n throw new Error(`Cycle detected resolving ${key}`);\n }\n if (typeof existing === 'number') {\n return existing;\n }\n\n state.set(key, 'computing');\n\n let result = 0;\n const val = node[varName];\n\n const ctx: LayoutContext = {\n parentWidth,\n parentHeight,\n axis: (varName === 'x' || varName === 'width') ? 'horizontal' : 'vertical',\n contentWidth: node.contentWidth,\n contentHeight: node.contentHeight,\n \n get elementWidth() { return evaluateVariable(node, 'width'); },\n get elementHeight() { return evaluateVariable(node, 'height'); },\n get elementX() { return evaluateVariable(node, 'x'); },\n get elementY() { return evaluateVariable(node, 'y'); },\n \n getGroupSize(groupId: string) {\n const groupNodes = nodes.filter(n => n.groupId === groupId);\n let maxSize = 0;\n for (const gNode of groupNodes) {\n const size = evaluateVariable(gNode, this.axis === 'horizontal' ? 'width' : 'height');\n maxSize = Math.max(maxSize, size);\n }\n return maxSize;\n }\n };\n\n if (val instanceof Pos) {\n result = val.evaluate(ctx);\n } else if (val instanceof Dim) {\n result = val.evaluate(ctx);\n } else if (typeof val === 'number') {\n result = val;\n }\n\n state.set(key, result);\n node.computed[varName] = result;\n return result;\n }\n\n for (const node of nodes) {\n evaluateVariable(node, 'width');\n evaluateVariable(node, 'height');\n evaluateVariable(node, 'x');\n evaluateVariable(node, 'y');\n }\n}\n\n","// ─────────────────────────────────────────────────────\n// @termuijs/core — Flexbox-like Layout Engine\n// ─────────────────────────────────────────────────────\n\nimport type { Style } from '../style/Style.js';\nimport { normalizeEdges } from '../style/Style.js';\nimport { borderSize } from '../style/Border.js';\nimport type { Rect } from './Rect.js';\nimport { Pos } from './pos.js';\nimport { Dim } from './dim.js';\nimport { resolveLayoutVariables, resolveConstraints, Flex } from './constraint.js';\nimport type { ResolvableNode } from './constraint.js';\n\n/**\n * A node in the layout tree. Each widget produces one LayoutNode.\n */\nexport interface LayoutNode {\n /** Reference back to the widget/element that created this node */\n id: string;\n /** Style properties that affect layout */\n style: Style;\n /** Child nodes */\n children: LayoutNode[];\n /** Computed position and size — filled in by computeLayout() */\n computed: Rect;\n /** Dirty flag — true when this node needs to be re-laid-out. Foundation for layout caching. */\n _dirty: boolean;\n /** Last container dimensions used — separate from computed so manual computed edits don't confuse sizeChanged detection */\n _lastContainerWidth: number;\n _lastContainerHeight: number;\n /** Last computed dimensions — used to detect size changes in non-dirty nodes\n * so grandchildren are re-laid out when a parent recomputes this node's rect. */\n _lastComputedWidth: number;\n _lastComputedHeight: number;\n /** Drag and drop support */\n _draggable?: boolean;\n _dragging?: boolean;\n}\n\n/**\n * Create a LayoutNode with default values.\n */\nexport function createLayoutNode(id: string, style: Style, children: LayoutNode[] = []): LayoutNode {\n return {\n id,\n style,\n children,\n computed: { x: 0, y: 0, width: 0, height: 0 },\n _dirty: true,\n _lastContainerWidth: 0,\n _lastContainerHeight: 0,\n _lastComputedWidth: 0,\n _lastComputedHeight: 0,\n _draggable: false,\n _dragging: false,\n };\n}\n\n/**\n * Compute the layout of a tree of LayoutNodes.\n *\n * This is a simplified Flexbox implementation that handles:\n * - flexDirection: row | column\n * - justifyContent: flex-start | flex-end | center | space-between | space-around\n * - alignItems: flex-start | flex-end | center | stretch\n * - flexGrow / flexShrink\n * - padding, margin, border\n * - fixed width/height, percentage width/height\n * - minWidth, maxWidth, minHeight, maxHeight\n * - gap between children\n */\nexport function computeLayout(root: LayoutNode, containerWidth: number, containerHeight: number): void {\n const sizeChanged = root._lastContainerWidth !== containerWidth || root._lastContainerHeight !== containerHeight;\n if (!sizeChanged && !root._dirty && !hasDirtyChild(root)) {\n return;\n }\n root._lastContainerWidth = containerWidth;\n root._lastContainerHeight = containerHeight;\n root.computed = { x: 0, y: 0, width: containerWidth, height: containerHeight };\n layoutNode(root, containerWidth, containerHeight);\n\n root.computed.width = containerWidth;\n root.computed.height = containerHeight;\n}\nexport function invalidateLayout(node: LayoutNode): void {\n node._dirty = true;\n for (const child of node.children) {\n invalidateLayout(child);\n }\n}\nfunction hasDirtyChild(node: LayoutNode): boolean {\n if (node._dirty) return true;\n for (const child of node.children) {\n if (hasDirtyChild(child)) return true;\n }\n return false;\n}\nfunction layoutNode(node: LayoutNode, availWidth: number, availHeight: number, precomputed = false): void {\n // Skip only if not dirty AND dimensions are unchanged since last layout pass.\n // Note: node.computed.width/height are written by the parent before this call,\n // so comparing against them detects non-dirty nodes whose allocated size changed.\n if (!node._dirty &&\n node._lastComputedWidth === node.computed.width &&\n node._lastComputedHeight === node.computed.height) {\n return;\n }\n\n const style = node.style;\n const padding = normalizeEdges(style.padding);\n const margin = normalizeEdges(style.margin);\n const border = borderSize(style.border ?? 'none');\n\n if (!precomputed) {\n // Calculate this node's dimensions\n let nodeWidth = resolveSize(style.width, availWidth);\n let nodeHeight = resolveSize(style.height, availHeight);\n\n // Apply constraints\n if (nodeWidth === undefined) nodeWidth = availWidth - margin.left - margin.right;\n if (nodeHeight === undefined) nodeHeight = availHeight - margin.top - margin.bottom;\n\n // Validate dimensions — prevent NaN/Infinity propagation\n if (!Number.isFinite(nodeWidth)) nodeWidth = 0;\n if (!Number.isFinite(nodeHeight)) nodeHeight = 0;\n\n nodeWidth = clampSize(nodeWidth, style.minWidth, style.maxWidth);\n nodeHeight = clampSize(nodeHeight, style.minHeight, style.maxHeight);\n\n node.computed.width = nodeWidth;\n node.computed.height = nodeHeight;\n }\n\n if (node.children.length === 0) {\n node._dirty = false;\n node._lastComputedWidth = node.computed.width;\n node._lastComputedHeight = node.computed.height;\n return;\n }\n\n const nodeWidth = node.computed.width;\n const nodeHeight = node.computed.height;\n\n // Inner content area (after padding + border)\n // border.horizontal/vertical equals 2 (both sides), but the offset into content\n // only needs 1 (left/top border). The width/height reduction still uses the full 2.\n const innerX = padding.left + (border.horizontal > 0 ? 1 : 0);\n const innerY = padding.top + (border.vertical > 0 ? 1 : 0);\n const innerWidth = Math.max(0, nodeWidth - padding.left - padding.right - border.horizontal);\n const innerHeight = Math.max(0, nodeHeight - padding.top - padding.bottom - border.vertical);\n\n const direction = style.flexDirection ?? 'column';\n const isRow = direction === 'row';\n const gap = style.gap ?? 0;\n\n // ── Phase 0.1: 1D Layout Constraints (Overrides Flexbox) ──\n if (style.constraints && style.constraints.length > 0) {\n const mainAvail = isRow ? innerWidth : innerHeight;\n \n let flexJustify = Flex.Start;\n if (style.justifyContent === 'space-between') flexJustify = Flex.SpaceBetween;\n else if (style.justifyContent === 'space-around') flexJustify = Flex.SpaceAround;\n else if (style.justifyContent === 'center') flexJustify = Flex.Center;\n else if (style.justifyContent === 'flex-end') flexJustify = Flex.End;\n \n const results = resolveConstraints(mainAvail, style.constraints, flexJustify);\n \n let visibleIndex = 0;\n for (let i = 0; i < node.children.length; i++) {\n const child = node.children[i];\n if (visibleIndex >= results.length) break; // Ignore extra children\n if (child.style.visible === false) continue;\n\n const res = results[visibleIndex];\n const childMargin = normalizeEdges(child.style.margin);\n \n if (isRow) {\n child.computed = {\n x: Math.floor(node.computed.x + innerX + res.offset + childMargin.left),\n y: Math.floor(node.computed.y + innerY + childMargin.top),\n width: Math.round(Math.max(0, res.size - childMargin.left - childMargin.right)),\n height: Math.round(Math.max(0, innerHeight - childMargin.top - childMargin.bottom))\n };\n } else {\n child.computed = {\n x: Math.floor(node.computed.x + innerX + childMargin.left),\n y: Math.floor(node.computed.y + innerY + res.offset + childMargin.top),\n width: Math.round(Math.max(0, innerWidth - childMargin.left - childMargin.right)),\n height: Math.round(Math.max(0, res.size - childMargin.top - childMargin.bottom))\n };\n }\n layoutNode(child, child.computed.width, child.computed.height, true);\n visibleIndex++;\n }\n node._dirty = false;\n node._lastComputedWidth = node.computed.width;\n node._lastComputedHeight = node.computed.height;\n return;\n }\n\n // ── Phase 0.2: Topological Layout (Absolute positioned elements) ──\n const topologicalChildren = [];\n const flexChildren = [];\n\n for (const child of node.children) {\n if (child.style.visible === false) continue;\n const s = child.style;\n if (s.x instanceof Pos || s.y instanceof Pos || s.width instanceof Dim || s.height instanceof Dim || s.groupId != null) {\n topologicalChildren.push(child);\n } else {\n flexChildren.push(child);\n }\n }\n\n if (topologicalChildren.length > 0) {\n const resolvableNodes: ResolvableNode[] = topologicalChildren.map(child => {\n const s = child.style;\n // Provide a rough contentSize based on style or 0 if unknown\n let cw = 0, ch = 0;\n if (typeof s.width === 'number') cw = s.width;\n if (typeof s.height === 'number') ch = s.height;\n\n return {\n id: child.id,\n x: s.x,\n y: s.y,\n width: typeof s.width === 'string' ? undefined : s.width,\n height: typeof s.height === 'string' ? undefined : s.height,\n contentWidth: cw,\n contentHeight: ch,\n groupId: s.groupId,\n computed: { x: 0, y: 0, width: 0, height: 0 },\n _originalNode: child // keep reference\n } as ResolvableNode & { _originalNode: LayoutNode }; // we attach _originalNode during resolution to map back later\n });\n\n resolveLayoutVariables(resolvableNodes, innerWidth, innerHeight);\n\n for (const rNode of resolvableNodes) {\n const child = (rNode as ResolvableNode & { _originalNode: LayoutNode })._originalNode; // rNode is guaranteed to have _originalNode because we attached it during mapping\n child.computed = {\n x: Math.floor(node.computed.x + innerX + rNode.computed.x),\n y: Math.floor(node.computed.y + innerY + rNode.computed.y),\n width: Math.round(Math.max(0, rNode.computed.width)),\n height: Math.round(Math.max(0, rNode.computed.height))\n };\n layoutNode(child, child.computed.width, child.computed.height, true);\n }\n }\n\n // ── Phase 1: Measure children's desired sizes ──────\n\n const childInfos: Array<{\n node: LayoutNode;\n mainSize: number;\n crossSize: number;\n flexGrow: number;\n flexShrink: number;\n margin: { top: number; right: number; bottom: number; left: number };\n }> = [];\n\n let totalFixed = 0;\n let totalGrow = 0;\n let totalShrink = 0;\n\n for (const child of flexChildren) {\n const childMargin = normalizeEdges(child.style.margin);\n const childBorder = borderSize(child.style.border ?? 'none');\n const grow = child.style.flexGrow ?? 0;\n const shrink = child.style.flexShrink ?? 1;\n\n let mainSize: number;\n let crossSize: number;\n\n if (isRow) {\n mainSize = resolveSize(child.style.width, innerWidth) ?? 0;\n crossSize = resolveSize(child.style.height, innerHeight) ?? innerHeight;\n mainSize += childMargin.left + childMargin.right;\n crossSize = clampSize(crossSize, child.style.minHeight, child.style.maxHeight);\n } else {\n mainSize = resolveSize(child.style.height, innerHeight) ?? 0;\n crossSize = resolveSize(child.style.width, innerWidth) ?? innerWidth;\n mainSize += childMargin.top + childMargin.bottom;\n crossSize = clampSize(crossSize, child.style.minWidth, child.style.maxWidth);\n }\n\n totalFixed += mainSize;\n totalGrow += grow;\n totalShrink += shrink;\n\n childInfos.push({ node: child, mainSize, crossSize, flexGrow: grow, flexShrink: shrink, margin: childMargin });\n }\n\n const totalGaps = Math.max(0, childInfos.length - 1) * gap;\n const mainAvail = isRow ? innerWidth : innerHeight;\n const freeSpace = mainAvail - totalFixed - totalGaps;\n\n // ── Phase 2: Distribute free space (grow/shrink) ───\n\n if (freeSpace > 0 && totalGrow > 0) {\n for (const info of childInfos) {\n if (info.flexGrow > 0) {\n info.mainSize += (info.flexGrow / totalGrow) * freeSpace;\n }\n }\n } else if (freeSpace < 0 && totalShrink > 0) {\n for (const info of childInfos) {\n if (info.flexShrink > 0) {\n info.mainSize += (info.flexShrink / totalShrink) * freeSpace;\n info.mainSize = Math.max(0, info.mainSize);\n }\n }\n }\n\n // ── Phase 3: Position children ─────────────────────\n\n const totalMainUsed = childInfos.reduce((sum, i) => sum + i.mainSize, 0) + totalGaps;\n const remainingSpace = Math.max(0, mainAvail - totalMainUsed);\n\n let mainOffset: number;\n let spaceBetween = 0;\n\n const justify = style.justifyContent ?? 'flex-start';\n switch (justify) {\n case 'flex-start':\n mainOffset = 0;\n break;\n case 'flex-end':\n mainOffset = remainingSpace;\n break;\n case 'center':\n mainOffset = remainingSpace / 2;\n break;\n case 'space-between':\n mainOffset = 0;\n spaceBetween = childInfos.length > 1 ? remainingSpace / (childInfos.length - 1) : 0;\n break;\n case 'space-around':\n spaceBetween = childInfos.length > 0 ? remainingSpace / childInfos.length : 0;\n mainOffset = spaceBetween / 2;\n break;\n default:\n mainOffset = 0;\n }\n\n const crossAvail = isRow ? innerHeight : innerWidth;\n const align = style.alignItems ?? 'stretch';\n\n for (const info of childInfos) {\n // Cross axis alignment\n let crossOffset: number;\n let finalCrossSize = info.crossSize;\n\n switch (align) {\n case 'flex-start':\n crossOffset = 0;\n break;\n case 'flex-end':\n crossOffset = crossAvail - finalCrossSize;\n break;\n case 'center':\n crossOffset = (crossAvail - finalCrossSize) / 2;\n break;\n case 'stretch':\n crossOffset = 0;\n finalCrossSize = crossAvail;\n break;\n default:\n crossOffset = 0;\n }\n\n // Set computed rect\n if (isRow) {\n info.node.computed = {\n x: Math.floor(node.computed.x + innerX + mainOffset + info.margin.left),\n y: Math.floor(node.computed.y + innerY + crossOffset + info.margin.top),\n width: Math.round(Math.max(0, info.mainSize - info.margin.left - info.margin.right)),\n height: Math.round(Math.max(0, finalCrossSize - info.margin.top - info.margin.bottom)),\n };\n } else {\n info.node.computed = {\n x: Math.floor(node.computed.x + innerX + crossOffset + info.margin.left),\n y: Math.floor(node.computed.y + innerY + mainOffset + info.margin.top),\n width: Math.round(Math.max(0, finalCrossSize - info.margin.left - info.margin.right)),\n height: Math.round(Math.max(0, info.mainSize - info.margin.top - info.margin.bottom)),\n };\n }\n\n mainOffset += info.mainSize + gap + spaceBetween;\n\n // Recursively layout children — dimensions already set by parent\n layoutNode(info.node, info.node.computed.width, info.node.computed.height, true);\n }\n\n // Mark this node clean after layout is complete (used by future caching logic)\n node._dirty = false;\n node._lastComputedWidth = node.computed.width;\n node._lastComputedHeight = node.computed.height;\n}\n\n/**\n * Resolve a size value (fixed number or percentage string) to pixels.\n * Returns undefined if the value is not set.\n */\nfunction resolveSize(value: number | string | undefined | Dim, available: number): number | undefined {\n if (value === undefined) return undefined;\n if (typeof value === 'number') {\n if (!Number.isFinite(value) || value < 0) return 0;\n return value;\n }\n if (typeof value === 'string' && value.endsWith('%')) {\n const pct = parseFloat(value) / 100;\n if (!Number.isFinite(pct)) return 0;\n return Math.floor(available * pct);\n }\n return undefined;\n}\n\n/**\n * Clamp a size to min/max bounds.\n */\nfunction clampSize(value: number, min?: number, max?: number): number {\n let result = value;\n if (min !== undefined) result = Math.max(result, min);\n if (max !== undefined) result = Math.min(result, max);\n return result;\n}\n","// ─────────────────────────────────────────────────────\n// @termuijs/core — Layout types (Rect, Size, Edges)\n// ─────────────────────────────────────────────────────\n\n/**\n * A computed rectangle with position and size.\n */\nexport interface Rect {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\n/**\n * A 2D size.\n */\nexport interface Size {\n width: number;\n height: number;\n}\n\n/**\n * Create an empty rect at origin.\n */\nexport function emptyRect(): Rect {\n return { x: 0, y: 0, width: 0, height: 0 };\n}\n\n/**\n * Check if a point is inside a rect.\n */\nexport function containsPoint(rect: Rect, x: number, y: number): boolean {\n return x >= rect.x && x < rect.x + rect.width &&\n y >= rect.y && y < rect.y + rect.height;\n}\n\n/**\n * Shrink a rect by the given edges (inset).\n */\nexport function shrinkRect(rect: Rect, top: number, right: number, bottom: number, left: number): Rect {\n return {\n x: rect.x + left,\n y: rect.y + top,\n width: Math.max(0, rect.width - left - right),\n height: Math.max(0, rect.height - top - bottom),\n };\n}\n\n/**\n * Intersect two rects. Returns the overlapping region, or null if disjoint.\n */\nexport function intersectRect(a: Rect, b: Rect): Rect | null {\n const x = Math.max(a.x, b.x);\n const y = Math.max(a.y, b.y);\n const r = Math.min(a.x + a.width, b.x + b.width);\n const bot = Math.min(a.y + a.height, b.y + b.height);\n if (r <= x || bot <= y) return null;\n return { x, y, width: r - x, height: bot - y };\n}\n\n/**\n * Union two rects into the smallest bounding rect that contains both.\n */\nexport function unionRect(a: Rect, b: Rect): Rect {\n const x = Math.min(a.x, b.x);\n const y = Math.min(a.y, b.y);\n const r = Math.max(a.x + a.width, b.x + b.width);\n const bot = Math.max(a.y + a.height, b.y + b.height);\n return { x, y, width: r - x, height: bot - y };\n}\n","// ─────────────────────────────────────────────────────\n// @termuijs/core — Focus Manager\n// ─────────────────────────────────────────────────────\n\nimport { EventEmitter } from './EventEmitter.js';\nimport type { FocusEvent } from './types.js';\nimport type { Rect } from '../layout/Rect.js';\n\nexport interface Focusable {\n id: string;\n tabIndex: number;\n focusable: boolean;\n}\n\n/**\n * Manages tab-order focus cycling between focusable widgets.\n * Dispatches focus/blur events when focus changes.\n *\n * Supports:\n * - Tab-order cycling (focusNext/focusPrev)\n * - Focus trapping (for modals — limits Tab to a container)\n * - Focus groups (for arrow-key navigation within a group)\n * - 2D Spatial navigation (focusUp/Down/Left/Right)\n */\nexport class FocusManager {\n private _focusables: Focusable[] = [];\n private _currentIndex = -1;\n private _events = new EventEmitter<{ focus: FocusEvent; blur: FocusEvent }>();\n\n /**\n * Stack of trap container IDs. When non-empty, only focusables\n * that belong to the topmost trap container are reachable via Tab.\n */\n private _trapStack: string[] = [];\n\n /**\n * Map of container ID → child widget IDs that belong to it.\n * Used for trap membership lookup.\n */\n private _containerMembers: Map<string, Set<string>> = new Map();\n\n /**\n * Named focus groups. Arrow keys move within a group, Tab moves between groups.\n * Maps groupId → ordered list of widget IDs.\n */\n private _groups: Map<string, string[]> = new Map();\n\n /**\n * Record of on-screen rects for widgets, used for spatial navigation.\n */\n private _rects: Map<string, Rect> = new Map();\n\n /** Monotonically increasing epoch for ordered event sequencing */\n private _epoch = 0;\n\n /** Queue of focus state changes accumulated before start() is called */\n private _pendingQueue: Array<FocusEvent> = [];\n\n /** True once start() has been called — enables event emission */\n private _started = false;\n\n /** Currently focused widget ID, or null if none */\n get currentId(): string | null {\n if (this._currentIndex < 0 || this._currentIndex >= this._focusables.length) {\n return null;\n }\n return this._focusables[this._currentIndex].id;\n }\n\n /** Subscribe to focus/blur events */\n on<K extends 'focus' | 'blur'>(event: K, handler: (data: FocusEvent) => void): () => void {\n return this._events.on(event, handler);\n }\n\n /**\n * Enable event emission and replay any queued focus events.\n * Call this from App.mount() after _subscribeFocusEvents().\n */\n start(): void {\n if (this._started) return;\n this._started = true;\n // Replay queued focus events\n for (const evt of this._pendingQueue) {\n this._events.emit(evt.type, evt);\n }\n this._pendingQueue = [];\n }\n\n /**\n * Register a focusable widget.\n * Widgets are ordered by tabIndex (ascending), then insertion order.\n * Before start() is called, events are queued rather than emitted so\n * they are not lost when App has not yet subscribed to them.\n */\n register(focusable: Focusable): void {\n this._focusables.push(focusable);\n this._focusables.sort((a, b) => a.tabIndex - b.tabIndex);\n\n // Auto-focus the first widget if nothing is focused\n if (this._currentIndex < 0 && focusable.focusable) {\n this._currentIndex = this._focusables.indexOf(focusable);\n const event: FocusEvent = { targetId: focusable.id, type: 'focus', epoch: this._epoch++ };\n if (this._started) {\n this._events.emit('focus', event);\n } else {\n this._pendingQueue.push(event);\n }\n }\n }\n\n /**\n * Unregister a focusable widget.\n */\n unregister(id: string): void {\n const idx = this._focusables.findIndex(f => f.id === id);\n if (idx < 0) return;\n\n // Clean up spatial rect to prevent memory leaks\n this._rects.delete(id);\n\n const wasFocused = idx === this._currentIndex;\n this._focusables.splice(idx, 1);\n\n if (wasFocused) {\n this._events.emit('blur', { targetId: id, type: 'blur', epoch: this._epoch++ });\n // Try to focus the next widget\n if (this._focusables.length > 0) {\n this._currentIndex = Math.min(this._currentIndex, this._focusables.length - 1);\n this._events.emit('focus', {\n targetId: this._focusables[this._currentIndex].id,\n type: 'focus',\n epoch: this._epoch++,\n });\n } else {\n this._currentIndex = -1;\n }\n } else if (idx < this._currentIndex) {\n // Silent focus shift: the widget that preceded the removed item\n // now occupies the focused position. Emit blur + focus to notify\n // downstream so the visual focus state stays in sync.\n this._currentIndex--;\n this._events.emit('blur', { targetId: id, type: 'blur', epoch: this._epoch++ });\n if (this._currentIndex >= 0 && this._currentIndex < this._focusables.length) {\n this._events.emit('focus', {\n targetId: this._focusables[this._currentIndex].id,\n type: 'focus',\n epoch: this._epoch++,\n });\n }\n }\n }\n\n /**\n * Move focus to the next focusable widget (wraps around).\n * Respects focus traps — if a trap is active, only cycles within it.\n */\n focusNext(): void {\n const candidates = this._getActiveFocusables();\n if (candidates.length === 0) return;\n\n const currentInCandidates = this.currentId\n ? candidates.findIndex(f => f.id === this.currentId)\n : -1;\n\n let next = (currentInCandidates + 1) % candidates.length;\n const start = next;\n\n // Skip non-focusable widgets\n while (!candidates[next].focusable) {\n next = (next + 1) % candidates.length;\n if (next === start) return; // All non-focusable\n }\n\n // Find this candidate's index in the master list\n const masterIdx = this._focusables.findIndex(f => f.id === candidates[next].id);\n if (masterIdx >= 0) this._changeFocus(masterIdx);\n }\n\n /**\n * Move focus to the previous focusable widget (wraps around).\n * Respects focus traps.\n */\n focusPrev(): void {\n const candidates = this._getActiveFocusables();\n if (candidates.length === 0) return;\n\n const currentInCandidates = this.currentId\n ? candidates.findIndex(f => f.id === this.currentId)\n : 0;\n\n let prev = (currentInCandidates - 1 + candidates.length) % candidates.length;\n const start = prev;\n\n while (!candidates[prev].focusable) {\n prev = (prev - 1 + candidates.length) % candidates.length;\n if (prev === start) return;\n }\n\n const masterIdx = this._focusables.findIndex(f => f.id === candidates[prev].id);\n if (masterIdx >= 0) this._changeFocus(masterIdx);\n }\n\n /**\n * Focus a specific widget by ID.\n */\n focusWidget(id: string): void {\n const idx = this._focusables.findIndex(f => f.id === id);\n if (idx < 0 || !this._focusables[idx].focusable) return;\n this._changeFocus(idx);\n }\n\n /**\n * Check if a specific widget currently has focus.\n */\n isFocused(id: string): boolean {\n return this.currentId === id;\n }\n\n // ── Focus Trap ──────────────────────────────────────\n\n /**\n * Register widget IDs as members of a container (for trap lookup).\n */\n registerContainerMembers(containerId: string, memberIds: string[]): void {\n const set = this._containerMembers.get(containerId) ?? new Set();\n for (const id of memberIds) set.add(id);\n this._containerMembers.set(containerId, set);\n }\n\n /**\n * Unregister a container's member list.\n */\n unregisterContainerMembers(containerId: string): void {\n this._containerMembers.delete(containerId);\n }\n\n /**\n * Trap focus within a container. Only focusables inside the\n * container are reachable via Tab. Traps are stacked —\n * nested modals create nested traps.\n */\n trap(containerId: string): void {\n this._trapStack.push(containerId);\n\n // Focus the first focusable inside the trap\n const trapped = this._getActiveFocusables();\n if (trapped.length > 0) {\n const first = trapped.find(f => f.focusable);\n if (first) {\n const idx = this._focusables.findIndex(f => f.id === first.id);\n if (idx >= 0) this._changeFocus(idx);\n }\n }\n }\n\n /**\n * Release the current focus trap. Restores previous trap or free navigation.\n */\n release(): void {\n this._trapStack.pop();\n }\n\n /** Whether a focus trap is currently active */\n get isTrapped(): boolean {\n return this._trapStack.length > 0;\n }\n\n /** ID of the current trap container, or null */\n get currentTrapId(): string | null {\n return this._trapStack.length > 0\n ? this._trapStack[this._trapStack.length - 1]\n : null;\n }\n\n // ── Focus Groups ────────────────────────────────────\n\n /**\n * Register a focus group. Arrow keys move within the group.\n * @param groupId Unique group identifier\n * @param widgetIds Ordered list of widget IDs in the group\n */\n registerGroup(groupId: string, widgetIds: string[]): void {\n this._groups.set(groupId, widgetIds);\n }\n\n /**\n * Unregister a focus group.\n */\n unregisterGroup(groupId: string): void {\n this._groups.delete(groupId);\n }\n\n /**\n * Move focus to the next widget within the same group.\n * Returns true if focus was moved, false if the widget isn't in a group.\n */\n focusNextInGroup(): boolean {\n const currentId = this.currentId;\n if (!currentId) return false;\n\n for (const [, ids] of this._groups) {\n const idx = ids.indexOf(currentId);\n if (idx >= 0) {\n const nextIdx = (idx + 1) % ids.length;\n this.focusWidget(ids[nextIdx]);\n return true;\n }\n }\n return false;\n }\n\n /**\n * Move focus to the previous widget within the same group.\n */\n focusPrevInGroup(): boolean {\n const currentId = this.currentId;\n if (!currentId) return false;\n\n for (const [, ids] of this._groups) {\n const idx = ids.indexOf(currentId);\n if (idx >= 0) {\n const prevIdx = (idx - 1 + ids.length) % ids.length;\n this.focusWidget(ids[prevIdx]);\n return true;\n }\n }\n return false;\n }\n\n // ── Spatial Navigation ──────────────────────────────\n\n /** Record the on-screen rect for a widget, used for spatial navigation. */\n setRect(id: string, rect: Rect): void {\n this._rects.set(id, rect);\n }\n\n private _spatialFocus(\n isValid: (cx: number, cy: number, tx: number, ty: number) => boolean,\n calcDistance: (cx: number, cy: number, tx: number, ty: number) => number\n ): boolean {\n const currentId = this.currentId;\n if (!currentId) return false;\n\n const currentRect = this._rects.get(currentId);\n if (!currentRect) return false;\n\n const cx = currentRect.x + currentRect.width / 2;\n const cy = currentRect.y + currentRect.height / 2;\n\n let bestId: string | null = null;\n let minDistance = Infinity;\n\n // Iterate over active focusables to respect traps\n const candidates = this._getActiveFocusables();\n\n for (const node of candidates) {\n if (!node.focusable || node.id === currentId) continue;\n \n const targetRect = this._rects.get(node.id);\n if (!targetRect) continue;\n\n const tx = targetRect.x + targetRect.width / 2;\n const ty = targetRect.y + targetRect.height / 2;\n\n if (isValid(cx, cy, tx, ty)) {\n const dist = calcDistance(cx, cy, tx, ty);\n if (dist < minDistance) {\n minDistance = dist;\n bestId = node.id;\n }\n }\n }\n\n if (bestId) {\n this.focusWidget(bestId);\n return true;\n }\n return false;\n }\n\n /** Move focus to the nearest focusable widget above the current one. */\n focusUp(): boolean {\n return this._spatialFocus(\n (cx, cy, tx, ty) => ty < cy,\n (cx, cy, tx, ty) => (cy - ty) + Math.abs(tx - cx)\n );\n }\n\n /** Move focus to the nearest focusable widget below the current one. */\n focusDown(): boolean {\n return this._spatialFocus(\n (cx, cy, tx, ty) => ty > cy,\n (cx, cy, tx, ty) => (ty - cy) + Math.abs(tx - cx)\n );\n }\n\n /** Move focus to the nearest focusable widget to the left of the current one. */\n focusLeft(): boolean {\n return this._spatialFocus(\n (cx, cy, tx, ty) => tx < cx,\n (cx, cy, tx, ty) => (cx - tx) + Math.abs(ty - cy)\n );\n }\n\n /** Move focus to the nearest focusable widget to the right of the current one. */\n focusRight(): boolean {\n return this._spatialFocus(\n (cx, cy, tx, ty) => tx > cx,\n (cx, cy, tx, ty) => (tx - cx) + Math.abs(ty - cy)\n );\n }\n\n // ── Private ──────────────────────────────────────────\n\n /**\n * Get the active focusables, filtered by the current trap if any.\n */\n private _getActiveFocusables(): Focusable[] {\n if (this._trapStack.length === 0) return this._focusables;\n\n const containerId = this._trapStack[this._trapStack.length - 1];\n const members = this._containerMembers.get(containerId);\n if (!members) return this._focusables;\n\n return this._focusables.filter(f => members.has(f.id));\n }\n\n private _changeFocus(newIndex: number): void {\n const oldId = this.currentId;\n if (oldId) {\n this._events.emit('blur', { targetId: oldId, type: 'blur', epoch: this._epoch++ });\n }\n this._currentIndex = newIndex;\n this._events.emit('focus', {\n targetId: this._focusables[newIndex].id,\n type: 'focus',\n epoch: this._epoch++,\n });\n }\n}","// ─────────────────────────────────────────────────────\n// @termuijs/core — Unicode Symbol Sets\n// ─────────────────────────────────────────────────────\n\n// ── Border Sets ──────────────────────────────────────\n\nexport interface BorderSet {\n topLeft: string;\n topRight: string;\n bottomLeft: string;\n bottomRight: string;\n horizontal: string;\n vertical: string;\n cross: string;\n}\n\nexport const BorderSets = {\n PLAIN: {\n topLeft: '┌', topRight: '┐', bottomLeft: '└', bottomRight: '┘',\n horizontal: '─', vertical: '│', cross: '┼',\n },\n ROUNDED: {\n topLeft: '╭', topRight: '╮', bottomLeft: '╰', bottomRight: '╯',\n horizontal: '─', vertical: '│', cross: '┼',\n },\n DOUBLE: {\n topLeft: '╔', topRight: '╗', bottomLeft: '╚', bottomRight: '╝',\n horizontal: '═', vertical: '║', cross: '╬',\n },\n THICK: {\n topLeft: '┏', topRight: '┓', bottomLeft: '┗', bottomRight: '┛',\n horizontal: '━', vertical: '┃', cross: '╋',\n },\n QUADRANT_INSIDE: {\n topLeft: '▗', topRight: '▖', bottomLeft: '▝', bottomRight: '▘',\n horizontal: '▀', vertical: '▐', cross: '█',\n },\n QUADRANT_OUTSIDE: {\n topLeft: '▛', topRight: '▜', bottomLeft: '▙', bottomRight: '▟',\n horizontal: '▀', vertical: '▌', cross: '█',\n },\n EMPTY: {\n topLeft: ' ', topRight: ' ', bottomLeft: ' ', bottomRight: ' ',\n horizontal: ' ', vertical: ' ', cross: ' ',\n },\n} as const satisfies Record<string, BorderSet>;\n\n// ── Bar Chart Symbol Sets ────────────────────────────\n\nexport interface BarSet {\n full: string;\n sevenEighths: string;\n threeQuarters: string;\n fiveEighths: string;\n half: string;\n threeEighths: string;\n oneQuarter: string;\n oneEighth: string;\n empty: string;\n}\n\n/**\n * Vertical bar symbols: bottom-up block characters ▁▂▃▄▅▆▇█\n * 9 levels (including empty) for sub-cell precision.\n */\nexport const BarSets = {\n NINE_LEVELS: {\n full: '█', sevenEighths: '▇', threeQuarters: '▆', fiveEighths: '▅',\n half: '▄', threeEighths: '▃', oneQuarter: '▂', oneEighth: '▁', empty: ' ',\n },\n THREE_LEVELS: {\n full: '█', sevenEighths: '░', threeQuarters: '░', fiveEighths: '░',\n half: '▄', threeEighths: '░', oneQuarter: '░', oneEighth: '░', empty: ' ',\n },\n ASCII: {\n full: '#', sevenEighths: '#', threeQuarters: '#', fiveEighths: '#',\n half: '#', threeEighths: '-', oneQuarter: '-', oneEighth: '-', empty: ' ',\n },\n} as const satisfies Record<string, BarSet>;\n\n/** Ordered vertical bar symbols from empty to full (9 levels). */\nexport const VERTICAL_BAR_SYMBOLS: readonly string[] = [\n ' ', '▁', '▂', '▃', '▄', '▅', '▆', '▇', '█',\n];\n\n/** Ordered horizontal bar symbols from empty to full (9 levels). */\nexport const HORIZONTAL_BAR_SYMBOLS: readonly string[] = [\n ' ', '\\u258F', '\\u258E', '\\u258D', '\\u258C', '\\u258B', '\\u258A', '\\u2589', '\\u2588',\n];\n\n// ── Scrollbar Symbol Sets ────────────────────────────\n\nexport interface ScrollbarSet {\n track: string;\n thumb: string;\n begin: string;\n end: string;\n}\n\nexport const ScrollbarSets = {\n VERTICAL: { track: '│', thumb: '█', begin: '↑', end: '↓' },\n HORIZONTAL: { track: '─', thumb: '█', begin: '←', end: '→' },\n DOUBLE_VERTICAL: { track: '║', thumb: '▐', begin: '▲', end: '▼' },\n DOUBLE_HORIZONTAL: { track: '═', thumb: '▌', begin: '◄', end: '►' },\n} as const satisfies Record<string, ScrollbarSet>;\n\n// ── Line Symbol Sets ─────────────────────────────────\n\nexport interface LineSet {\n horizontal: string;\n vertical: string;\n cross: string;\n}\n\nexport const LineSets = {\n NORMAL: { horizontal: '─', vertical: '│', cross: '┼' },\n THICK: { horizontal: '━', vertical: '┃', cross: '╋' },\n DOUBLE: { horizontal: '═', vertical: '║', cross: '╬' },\n} as const satisfies Record<string, LineSet>;\n\n// ── Shade Symbols ────────────────────────────────────\n\nexport const Shade = {\n FULL: '█',\n DARK: '▓',\n MEDIUM: '▒',\n LIGHT: '░',\n EMPTY: ' ',\n} as const;\n\n// ── Braille Constants ────────────────────────────────\n\n/** Unicode braille range offset (U+2800). */\nexport const BRAILLE_OFFSET = 0x2800;\n\n/**\n * Braille dot bit positions.\n * Each row is [leftBit, rightBit] for a 2-wide, 4-tall braille cell.\n */\nexport const BRAILLE_DOTS: readonly (readonly [number, number])[] = [\n [0x01, 0x08],\n [0x02, 0x10],\n [0x04, 0x20],\n [0x40, 0x80],\n] as const;\n","// ─────────────────────────────────────────────────────\n// @termuijs/core — Test Backend\n// In-memory rendering for snapshot testing.\n// ─────────────────────────────────────────────────────\n\nimport type { Cell } from './Screen.js';\nimport { emptyCell } from './Screen.js';\n\n/**\n * In-memory grid that captures rendered output.\n * Use `createTestScreen()` to create one, render widgets into it,\n * then call `testScreenToString()` to get a plain-text snapshot.\n */\nexport interface TestScreen {\n readonly width: number;\n readonly height: number;\n cells: Cell[][];\n}\n\n/**\n * Create an in-memory test screen of the given dimensions.\n * Every cell starts as empty (space character, default colors).\n */\nexport function createTestScreen(width: number, height: number): TestScreen {\n const cells: Cell[][] = [];\n for (let row = 0; row < height; row++) {\n const rowCells: Cell[] = [];\n for (let col = 0; col < width; col++) {\n rowCells.push(emptyCell());\n }\n cells.push(rowCells);\n }\n return { width, height, cells };\n}\n\n/**\n * Set a cell in the test screen at (x, y).\n * Out-of-bounds writes are silently ignored.\n */\nexport function testScreenSetCell(screen: TestScreen, x: number, y: number, cell: Cell): void {\n if (x < 0 || x >= screen.width || y < 0 || y >= screen.height) {\n return;\n }\n const row = screen.cells[y];\n if (row) {\n row[x] = cell;\n }\n}\n\n/**\n * Get the cell at (x, y) in the test screen.\n * Returns undefined for out-of-bounds coordinates.\n */\nexport function testScreenGetCell(screen: TestScreen, x: number, y: number): Cell | undefined {\n if (x < 0 || x >= screen.width || y < 0 || y >= screen.height) {\n return undefined;\n }\n const row = screen.cells[y];\n return row ? row[x] : undefined;\n}\n\n/**\n * Convert the test screen to a plain-text string.\n * Each row becomes a line. Trailing spaces on each line are preserved.\n *\n * Example output:\n * ```\n * ┌Hello──┐\n * │World │\n * └───────┘\n * ```\n */\nexport function testScreenToString(screen: TestScreen): string {\n return screen.cells\n .map(row => row.map(cell => cell.char).join(''))\n .join('\\n');\n}\n\n/**\n * Clear the test screen, resetting all cells to empty.\n */\nexport function testScreenClear(screen: TestScreen): void {\n for (let y = 0; y < screen.height; y++) {\n const row = screen.cells[y];\n if (row) {\n for (let x = 0; x < screen.width; x++) {\n row[x] = emptyCell();\n }\n }\n }\n}\n\n/**\n * Write a string into the test screen starting at (x, y).\n * Characters that fall outside the screen bounds are clipped.\n */\nexport function testScreenSetString(\n screen: TestScreen,\n x: number,\n y: number,\n str: string,\n): void {\n let cx = x;\n for (const ch of str) {\n if (cx >= screen.width) break;\n if (cx >= 0 && y >= 0 && y < screen.height) {\n const row = screen.cells[y];\n if (row) {\n const cell = emptyCell();\n cell.char = ch;\n row[cx] = cell;\n }\n }\n cx++;\n }\n}\n","// ─────────────────────────────────────────────────────\n// @termuijs/core — Fallback (static) renderer for CI/pipes\n// ─────────────────────────────────────────────────────\n\nimport type { Screen } from '../terminal/Screen.js';\nimport { stripAnsi } from '../utils/unicode.js';\n\n/**\n * Detect if the terminal should use fallback (non-interactive) rendering.\n *\n * Returns true when:\n * - stdout is not a TTY (piped)\n * - CI environment variable is set\n * - TERM is 'dumb'\n * - NO_COLOR is set\n */\nexport function shouldUseFallback(): boolean {\n if (!process.stdout.isTTY) return true;\n if (process.env['CI']) return true;\n if (process.env['TERM'] === 'dumb') return true;\n return false;\n}\n\n/**\n * Render a Screen buffer as plain text (no ANSI, no interactivity).\n *\n * Reads all cells from the screen and produces a simple text representation.\n * Strips trailing whitespace from each line and removes empty trailing lines.\n */\nexport function renderFallback(screen: Screen): string {\n const lines: string[] = [];\n\n for (let r = 0; r < screen.rows; r++) {\n let line = '';\n for (let c = 0; c < screen.cols; c++) {\n const cell = screen.back[r][c];\n if (cell.width === 0) continue; // Skip continuation cells\n line += cell.char || ' ';\n }\n lines.push(line.trimEnd());\n }\n\n // Remove empty trailing lines\n while (lines.length > 0 && lines[lines.length - 1] === '') {\n lines.pop();\n }\n\n return lines.join('\\n');\n}\n","// Minimal Inline Viewport helper — renders a subset of rows from a Screen\nimport type { Screen } from './terminal/Screen.js';\nimport type { Terminal } from './terminal/Terminal.js';\n\nexport interface InlineViewportOptions {\n rows: number;\n}\n\n/**\n * Render the bottom `rows` of the provided `screen` to the terminal using plain text.\n * Preserves scrollback by writing lines to stdout rather than taking over the alternate screen.\n */\nexport function renderInlineToTerminal(terminal: Terminal, screen: Screen, rows: number): void {\n const totalRows = screen.rows;\n const start = Math.max(0, totalRows - rows);\n const lines: string[] = [];\n for (let r = start; r < totalRows; r++) {\n const row = screen.back[r];\n if (!row) continue;\n lines.push(row.map(c => c.char || ' ').join(''));\n }\n if (lines.length === 0) return;\n // Ensure we end with newline to push content into scrollback\n terminal.write(lines.join('\\n') + '\\n');\n}\n\nexport function createInlineViewport(opts: InlineViewportOptions) {\n return { rows: opts.rows };\n}\n","// ─────────────────────────────────────────────────────\n// @termuijs/core — Application lifecycle manager\n// ─────────────────────────────────────────────────────\n\nimport { Terminal, type TerminalOptions } from '../terminal/Terminal.js';\nimport { Screen } from '../terminal/Screen.js';\nimport { Renderer } from '../terminal/Renderer.js';\nimport { LayerManager } from '../terminal/LayerManager.js';\nimport { InputParser } from '../input/InputParser.js';\nimport { FocusManager } from '../events/FocusManager.js';\nimport { EventEmitter } from '../events/EventEmitter.js';\nimport { computeLayout, type LayoutNode } from '../layout/LayoutEngine.js';\nimport type { EventMap, FocusEvent } from '../events/types.js';\nimport { createKeyEvent } from '../events/types.js';\nimport { renderFallback, shouldUseFallback } from './Fallback.js';\nimport { mergeBorders } from '../renderer/border-merge.js';\nimport { renderInlineToTerminal } from '../inline-viewport.js';\n\nexport interface AppOptions extends TerminalOptions {\n /** Frames per second for the render loop */\n fps?: number;\n /** Use alternate screen (full-screen mode). Default: true */\n fullscreen?: boolean;\n /** Merge adjacent borders into junction characters */\n dockBorders?: boolean;\n /** Screen mode: 'alternate' = alt screen (default), 'main' = render to main screen, 'inline' = render N rows at cursor */\n screenMode?: 'alternate' | 'main' | 'inline';\n /** Number of rows to render in inline mode (only used when screenMode='inline') */\n inlineRows?: number;\n /** Enable mouse support. Default: false */\n mouse?: boolean;\n /** Force fallback (static) rendering */\n forceFallback?: boolean;\n /** Skip fallback detection — always run interactively. Default: false */\n skipFallback?: boolean;\n /** Title to set on the terminal window */\n title?: string;\n diffRenderer?: boolean;\n}\n\n/**\n * Widget interface that App expects for the root widget.\n * This is the minimum contract — the full Widget class in @termuijs/widgets extends this.\n */\nexport interface RootWidget {\n id: string;\n getLayoutNode(): LayoutNode;\n syncLayout?(): void;\n render(screen: Screen): void;\n mount?(): void;\n unmount?(): void;\n /** Check if this widget needs re-rendering (dirty flag) */\n isDirty?: boolean;\n /** Clear the dirty flag after rendering */\n clearDirty?(): void;\n}\n\ninterface FocusAwareWidget {\n id: string;\n isFocused: boolean;\n markDirty?: () => void;\n}\n\n/**\n * Application lifecycle manager.\n */\nexport class App {\n readonly terminal: Terminal;\n readonly screen: Screen;\n readonly renderer: Renderer;\n readonly input: InputParser;\n readonly focus: FocusManager;\n readonly events: EventEmitter<EventMap>;\n readonly layers: LayerManager;\n\n private _rootWidget: RootWidget;\n private _options: AppOptions;\n private _mounted = false;\n private _exitResolve: ((code: number) => void) | null = null;\n private _unsubKey: (() => void) | null = null;\n private _unsubMouse: (() => void) | null = null;\n private _unsubPaste: (() => void) | null = null;\n private _unsubFocus: (() => void) | null = null;\n private _unsubBlur: (() => void) | null = null;\n private _unsubSigInt: (() => void) | null = null;\n private _unsubSigTerm: (() => void) | null = null;\n private _unsubUncaughtException: (() => void) | null = null;\n private _unsubUnhandledRejection: (() => void) | null = null;\n private _widgetById = new Map<string, any>(); // any: Widget shape varies; narrowed at retrieval\n private _pendingFocusState = new Map<string, boolean>();\n\n private _consecutiveRenderFailures = 0;\n private static readonly MAX_RENDER_FAILURES = 5;\n\n // Lines to insert before inline viewport output. Each entry: { id: symbol, text: string }\n private _insertBefore: Array<{ id: symbol; text: string }> = [];\n\n // Core fix patch: Track if a paint task has been queued for the next event loop tick\n private _isRenderPending = false;\n\n constructor(rootWidget: RootWidget, options: AppOptions = {}) {\n this._rootWidget = rootWidget;\n this._options = {\n fullscreen: true,\n mouse: false,\n fps: 30,\n dockBorders: false,\n diffRenderer: true,\n // Default screenMode: if fullscreen explicitly disabled, treat as 'main', otherwise 'alternate'\n screenMode: options.fullscreen === false ? 'main' : 'alternate',\n inlineRows: 0,\n ...options,\n };\n\n this.terminal = new Terminal(options);\n this.screen = new Screen(this.terminal.cols, this.terminal.rows);\n this.renderer = new Renderer(this.terminal, this.screen, this._options.fps, this._options.diffRenderer);\n this.input = new InputParser(this.terminal.stdin);\n this.focus = new FocusManager();\n this.events = new EventEmitter();\n this.layers = new LayerManager(this.terminal.cols, this.terminal.rows);\n }\n\n /**\n * Start the application.\n */\n async mount(): Promise<number> {\n if (this._mounted) return 0;\n\n // Check if we should use fallback mode\n if (this._options.forceFallback || (!this._options.skipFallback && shouldUseFallback())) {\n this._renderFallback();\n return 0;\n }\n\n this._mounted = true;\n // Focus subscriptions are interactive-only; fallback mount returns\n // without unmount(), so constructor subscriptions would leak there.\n this._subscribeFocusEvents();\n\n // Enable focus event emission and replay any queued auto-focus events\n this.focus.start();\n\n const focusedId = this.focus.currentId;\n if (focusedId) {\n // Focusables may register before mount and auto-focus before the\n // widget map exists. Replay that state after the first map rebuild.\n this._pendingFocusState.set(focusedId, true);\n }\n\n // Start the stdout interceptor right before UI rendering begins\n this.renderer.hook.start();\n\n // Set up terminal\n this.terminal.enterRawMode();\n // Enter alternate screen only when requested via screenMode === 'alternate'\n if (this._options.screenMode === 'alternate') {\n this.terminal.enterAltScreen();\n }\n this.terminal.hideCursor();\n\n if (this._options.mouse) {\n this.terminal.enableMouse();\n }\n\n if (this._options.title) {\n this.terminal.write(`\\x1b]0;${this._options.title}\\x07`);\n }\n\n // Handle resize\n this.terminal.onResize((cols, rows) => {\n this.screen.resize(cols, rows);\n this.screen.invalidate();\n this.layers.resize(cols, rows);\n this.events.emit('resize', { cols, rows });\n (this._rootWidget as any).markDirty?.(); // as any: RootWidget.markDirty may be absent in some configs\n this.requestRender();\n });\n\n // Set up input handling\n this.input.start();\n\n // Forward key events with bubble dispatch\n this._unsubKey = this.input.onKey((rawEvent) => {\n const event = createKeyEvent({\n ...rawEvent,\n targetId: this.focus.currentId ?? undefined,\n });\n\n // Phase 1: Bubble dispatch — focused widget → parent → root\n const focusedId = this.focus.currentId;\n if (focusedId) {\n const chain = this._buildBubbleChain(focusedId);\n for (const widget of chain) {\n widget.events.emit('key', event);\n if (event._propagationStopped) break;\n }\n }\n\n // Phase 2: Default actions (Tab for focus cycling)\n if (!event._defaultPrevented) {\n if (event.key === 'tab' && !event.ctrl && !event.alt) {\n if (event.shift) {\n this.focus.focusPrev();\n } else {\n this.focus.focusNext();\n }\n }\n }\n\n // Phase 3: App-level broadcast (always fires unless stopped)\n if (!event._propagationStopped) {\n this.events.emit('key', event);\n }\n });\n\n // Forward mouse events\n this._unsubMouse = this.input.onMouse((event) => {\n this.events.emit('mouse', event);\n });\n\n // Forward paste events\n this._unsubPaste = this.input.onPaste((text) => {\n this.events.emit('paste', text);\n });\n\n // Handle signals to ensure hook cleanup on forced exit\n const onSigInt = (): void => { this.exit(130); };\n const onSigTerm = (): void => { this.exit(143); };\n process.on('SIGINT', onSigInt);\n process.on('SIGTERM', onSigTerm);\n this._unsubSigInt = () => process.off('SIGINT', onSigInt);\n this._unsubSigTerm = () => process.off('SIGTERM', onSigTerm);\n\n // Register terminal cleanup to stop render hook on process exit\n this.terminal.onCleanup(() => {\n this.renderer.hook.stop();\n });\n\n // Handle uncaught exceptions — stop hook first so console works, then restore terminal\n const onUncaughtException = (err: Error) => {\n this.renderer.hook.stop();\n this.renderer.hook.writeRaw(this.renderer.hook.flush());\n this.renderer.hook.writeRaw(`Uncaught exception: ${err.message}\\n${err.stack}\\n`);\n this.terminal.restore();\n process.exit(1);\n };\n process.on('uncaughtException', onUncaughtException);\n this._unsubUncaughtException = () => process.off('uncaughtException', onUncaughtException);\n\n const onUnhandledRejection = (reason: any) => { // any: Node unhandledRejection passes unknown reason\n this.renderer.hook.stop();\n this.renderer.hook.writeRaw(this.renderer.hook.flush());\n this.renderer.hook.writeRaw(`Unhandled rejection: ${reason}\\n`);\n this.terminal.restore();\n process.exit(1);\n };\n process.on('unhandledRejection', onUnhandledRejection);\n this._unsubUnhandledRejection = () => process.off('unhandledRejection', onUnhandledRejection);\n\n // Start render loop — tick drives requestRender() so dirty widgets\n // (motion, timers) get redrawn without a separate setInterval.\n this.renderer.start(() => this.requestRender());\n\n // Mount root widget\n this._rootWidget.mount?.();\n this.events.emit('mount', undefined as any); // as any: EventEmitter generic requires a value; payload is intentionally void\n\n // Initial render — invalidate front buffer to force full redraw\n this.screen.invalidate();\n this.requestRender();\n\n // Block until exit() is called\n return new Promise<number>((resolve) => {\n this._exitResolve = resolve;\n });\n }\n\n /**\n * Stop the application and restore terminal state.\n */\n unmount(exitCode: number = 0): void {\n if (!this._mounted) return;\n this._mounted = false;\n\n this._rootWidget.unmount?.();\n this.events.emit('unmount', undefined as any); // as any: EventEmitter generic requires a value; payload is intentionally void\n\n this._unsubSigInt?.();\n this._unsubSigInt = null;\n this._unsubSigTerm?.();\n this._unsubSigTerm = null;\n this._unsubKey?.();\n this._unsubKey = null;\n this._unsubMouse?.();\n this._unsubMouse = null;\n\n this._unsubFocus?.();\n this._unsubFocus = null;\n this._unsubBlur?.();\n this._unsubBlur = null;\n this._unsubPaste?.();\n this._unsubPaste = null;\n this._unsubUncaughtException?.();\n this._unsubUncaughtException = null;\n this._unsubUnhandledRejection?.();\n this._unsubUnhandledRejection = null;\n\n\n // Stop the stdout interceptor to restore native console.log behavior\n this.renderer.hook.stop();\n\n this.renderer.stop();\n this.input.stop();\n this.terminal.restore();\n this.events.removeAll();\n\n if (this._exitResolve) {\n this._exitResolve(exitCode);\n this._exitResolve = null;\n }\n }\n\n /**\n * Create an overlay layer for rendering above normal widgets.\n */\n addOverlay(id: string, zIndex = 100): void {\n this.layers.createLayer(id, zIndex);\n }\n\n /**\n * Remove an overlay layer.\n */\n removeOverlay(id: string): void {\n this.layers.removeLayer(id);\n }\n\n /**\n * Request a re-render on the next frame.\n * Batches rapid structural updates via setImmediate scheduling so that\n * multiple synchronous state mutations collapse into a single render frame.\n */\n requestRender(): void {\n if (!this._mounted) return;\n\n // If a render is already queued for this tick, bail out — it will\n // pick up all dirty state when it eventually runs.\n if (this._isRenderPending) return;\n\n this._isRenderPending = true;\n\n // Defer rendering to the end of the current macro-task poll pool.\n // This guarantees that multiple state updates called synchronously\n // collapse into a single render frame. The dirty check is performed\n // INSIDE the deferred callback, eliminating the race window between\n // the check and the guard flag being set.\n setImmediate(() => {\n if (!this._mounted) {\n this._isRenderPending = false;\n return;\n }\n\n try {\n // Skip full render pass if neither the widget tree nor overlay\n // layers have reported any changes. Done inside the deferred\n // callback so the dirty check and the _isRenderPending guard\n // are never racy with concurrent requestRender() calls.\n if (this._rootWidget.isDirty === false && !this.layers.hasDirtyLayers()) {\n return;\n }\n\n if (this._rootWidget.isDirty !== false) {\n // Compute layout\n const layoutRoot = this._rootWidget.getLayoutNode();\n computeLayout(layoutRoot, this.terminal.cols, this.terminal.rows);\n\n // Sync computed rects from layout tree back to widgets\n this._rootWidget.syncLayout?.();\n\n // Rebuild the widget ID cache so _buildBubbleChain can do O(1) lookups\n this._buildWidgetMap(this._rootWidget);\n\n // Clear the back buffer and render widgets into it\n this.screen.clear();\n this._rootWidget.render(this.screen);\n\n // Merge adjacent borders into junction characters for a cleaner look\n if (this._options.dockBorders) {\n mergeBorders(this.screen);\n }\n\n // Clear dirty flags on the widget tree\n this._rootWidget.clearDirty?.();\n }\n\n // Composite overlay layers on top of the base rendering.\n // Runs even when only layers are dirty (root widget is clean).\n this.layers.composite(this.screen);\n\n // Inline rendering bypasses the differential renderer and writes\n // the bottom N rows directly into the main buffer so scrollback is preserved.\n if (this._options.screenMode === 'inline') {\n for (const item of this._insertBefore) {\n this.terminal.write(item.text + '\\n');\n }\n renderInlineToTerminal(this.terminal, this.screen as any, this._options.inlineRows ?? 0);\n } else {\n this.renderer.requestFrame();\n }\n } finally {\n // Unlock the queue flag so subsequent frames can be scheduled\n this._isRenderPending = false;\n // Re-schedule if a widget became dirty during the render cycle —\n // the previous early-return on _isRenderPending would have silently\n // dropped that state change. This mirrors browser rAF semantics:\n // a widget that marks itself dirty during its own render gets\n // exactly one additional frame, not an unbounded loop.\n if (this._rootWidget.isDirty === true) {\n this.requestRender();\n }\n }\n });\n }\n\n /**\n * Exit the app (convenience method).\n */\n exit(code = 0): void {\n this.unmount(code);\n if (this._exitResolve) {\n this._exitResolve(code);\n this._exitResolve = null;\n }\n }\n\n /**\n * Read from the system clipboard.\n */\n readClipboard(): Promise<string> {\n return this.terminal.readClipboard();\n }\n\n /**\n * Write to the system clipboard.\n */\n writeClipboard(text: string): void {\n this.terminal.writeClipboard(text);\n }\n\n /**\n * Register a persistent line to be written above inline viewport output.\n */\n insertBefore(line: string): () => void {\n const id = Symbol();\n this._insertBefore.push({ id, text: line });\n return () => {\n const idx = this._insertBefore.findIndex(x => x.id === id);\n if (idx >= 0) this._insertBefore.splice(idx, 1);\n };\n }\n\n /**\n * Render in fallback (static) mode for non-interactive environments.\n */\n private _renderFallback(): void {\n const layoutRoot = this._rootWidget.getLayoutNode();\n computeLayout(layoutRoot, this.terminal.cols, this.terminal.rows);\n\n this._rootWidget.syncLayout?.();\n\n this.screen.clear();\n this._rootWidget.render(this.screen);\n\n const output = renderFallback(this.screen);\n this.terminal.write(output + '\\n');\n }\n\n /**\n * Build the bubble chain for keyboard events.\n */\n private _buildBubbleChain(widgetId: string): Array<{ events: { emit: (event: string, data: any) => void } }> {\n const chain: Array<{ events: { emit: (event: string, data: any) => void } }> = [];\n const widget = this._widgetById.get(widgetId);\n if (!widget) return chain;\n\n let current: any = widget; // any: WidgetNode shape varies; no shared interface at traversal level\n while (current) {\n if (current.events) {\n chain.push(current);\n }\n current = current.parent ?? null;\n }\n return chain;\n }\n\n /**\n * Rebuild the widget ID cache by walking the entire widget tree.\n */\n private _buildWidgetMap(root: any): void { // any: Widget tree shape not statically known at traversal\n this._widgetById.clear();\n this._walkWidget(root);\n // Pending focus events are safe to apply once widget IDs are registered.\n this._applyPendingFocusState();\n }\n\n private _walkWidget(widget: any): void { // any: Widget tree shape not statically known at traversal\n if (!widget) return;\n if (widget.id) {\n this._widgetById.set(widget.id, widget);\n }\n const children = widget._children ?? widget.children ?? [];\n if (Array.isArray(children)) {\n for (const child of children) {\n this._walkWidget(child);\n }\n }\n }\n\n private _handleFocusEvent(event: FocusEvent): void {\n const focused = event.type === 'focus';\n const changed = this._setWidgetFocused(event.targetId, focused);\n if (changed === null) {\n // The first focus event can arrive before requestRender() builds\n // _widgetById, so hold it until the next completed map rebuild.\n this._pendingFocusState.set(event.targetId, focused);\n return;\n }\n if (changed) {\n this.requestRender();\n }\n }\n\n private _setWidgetFocused(id: string, focused: boolean): boolean | null {\n const widget = this._widgetById.get(id);\n if (!widget) {\n return null;\n }\n if (!this._isFocusAwareWidget(widget) || widget.isFocused === focused) {\n return false;\n }\n\n widget.isFocused = focused;\n widget.markDirty?.();\n return true;\n }\n\n private _subscribeFocusEvents(): void {\n if (!this._unsubFocus) {\n this._unsubFocus = this.focus.on('focus', event => this._handleFocusEvent(event));\n }\n if (!this._unsubBlur) {\n this._unsubBlur = this.focus.on('blur', event => this._handleFocusEvent(event));\n }\n }\n\n private _applyPendingFocusState(): void {\n for (const [id, focused] of this._pendingFocusState) {\n // FocusManager emits blur before focus, and both events run before\n // rendering rebuilds the map, so the old widget is still available.\n const stateChanged = this._setWidgetFocused(id, focused);\n if (stateChanged !== null) {\n this._pendingFocusState.delete(id);\n }\n }\n }\n\n private _isFocusAwareWidget(widget: unknown): widget is FocusAwareWidget {\n return typeof widget === 'object'\n && widget !== null\n && 'id' in widget\n && typeof widget.id === 'string'\n && 'isFocused' in widget\n && typeof widget.isFocused === 'boolean';\n }\n}\n","// ─────────────────────────────────────────────────────\n// @termuijs/core — Debounce utility\n// ─────────────────────────────────────────────────────\n\nexport interface DebounceOptions {\n /** Invoke on the leading edge of the timeout */\n leading?: boolean;\n /** Invoke on the trailing edge of the timeout */\n trailing?: boolean;\n}\n\n/**\n * Creates a debounced function that delays invoking `func` until after\n * `wait` milliseconds have elapsed since the last time it was invoked.\n *\n * @param func The function to debounce\n * @param wait The number of milliseconds to delay\n * @param options.leading Invoke on the leading edge\n * @param options.trailing Invoke on the trailing edge (default: true)\n * @returns The debounced function with a `cancel()` method\n *\n * @example\n * ```ts\n * const search = debounce((query: string) => {\n * performSearch(query);\n * }, 300);\n *\n * search('term'); // will execute 300ms after last call\n * search.cancel(); // cancel pending execution\n * ```\n */\nexport function debounce<T extends (...args: unknown[]) => unknown>(\n func: T,\n wait: number,\n options: DebounceOptions = {},\n): T & { cancel: () => void } {\n const { leading = false, trailing = true } = options;\n\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n let lastArgs: Parameters<T> | null = null;\n let lastCallTime: number | null = null;\n let lastInvokeTime = 0;\n\n function invokeFunc(time: number): ReturnType<T> | undefined {\n const args = lastArgs!;\n lastArgs = null;\n lastInvokeTime = time;\n return func(...args) as ReturnType<T>;\n }\n\n function shouldInvoke(time: number): boolean {\n const timeSinceLastCall = time - (lastCallTime ?? 0);\n const timeSinceLastInvoke = time - lastInvokeTime;\n\n return (\n lastCallTime === null ||\n timeSinceLastCall >= wait ||\n timeSinceLastCall < 0 ||\n timeSinceLastInvoke >= wait\n );\n }\n\n function trailingEdge(): ReturnType<T> | undefined {\n timeoutId = null;\n if (trailing && lastArgs) {\n return invokeFunc(Date.now());\n }\n lastArgs = null;\n return undefined;\n }\n\n function timerExpired(): void {\n const time = Date.now();\n if (shouldInvoke(time)) {\n trailingEdge();\n } else {\n const timeSinceLastCall = time - (lastCallTime ?? 0);\n const timeWaiting = wait - timeSinceLastCall;\n timeoutId = setTimeout(timerExpired, timeWaiting);\n }\n }\n\n const debounced = function (this: unknown, ...args: Parameters<T>): ReturnType<T> | undefined {\n const time = Date.now();\n const isInvoking = shouldInvoke(time);\n\n lastArgs = args;\n lastCallTime = time;\n\n if (isInvoking) {\n if (timeoutId === null) {\n if (leading) {\n return invokeFunc(time);\n }\n timeoutId = setTimeout(timerExpired, wait);\n } else {\n clearTimeout(timeoutId!);\n timeoutId = setTimeout(timerExpired, wait);\n }\n } else if (timeoutId === null && trailing) {\n timeoutId = setTimeout(timerExpired, wait);\n }\n\n return undefined;\n } as T & { cancel: () => void };\n\n debounced.cancel = () => {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n }\n lastInvokeTime = 0;\n lastArgs = null;\n lastCallTime = null;\n timeoutId = null;\n };\n\n return debounced;\n}"],"mappings":"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","names":["ColorDepth","blink","blink","bell","Buffer","Buffer","Flex","nodeWidth","nodeHeight","mainAvail","focusedId"]}
|