@termuijs/widgets 0.1.1 → 0.1.3
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/LICENSE +21 -0
- package/README.md +62 -29
- package/dist/index.cjs +511 -21
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +157 -2
- package/dist/index.d.ts +157 -2
- package/dist/index.js +514 -21
- package/dist/index.js.map +1 -1
- package/package.json +8 -3
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/base/Widget.ts","../src/display/Box.ts","../src/display/Text.ts","../src/display/LogView.ts","../src/input/List.ts","../src/input/TextInput.ts","../src/data/Table.ts","../src/data/Gauge.ts","../src/data/Sparkline.ts","../src/data/StatusIndicator.ts","../src/feedback/ProgressBar.ts","../src/feedback/Spinner.ts"],"sourcesContent":["// ─────────────────────────────────────────────────────\n// @termuijs/widgets — Public API\n// ─────────────────────────────────────────────────────\n\n// ── Base ──────────────────────────────────────────────\nexport { Widget } from './base/Widget.js';\nexport type { WidgetEvents } from './base/Widget.js';\n\n// ── Display Widgets ───────────────────────────────────\nexport { Box } from './display/Box.js';\nexport { Text } from './display/Text.js';\nexport type { TextProps } from './display/Text.js';\nexport { LogView } from './display/LogView.js';\nexport type { LogViewOptions } from './display/LogView.js';\n\n// ── Input Widgets ─────────────────────────────────────\nexport { List } from './input/List.js';\nexport type { ListItem } from './input/List.js';\nexport { TextInput } from './input/TextInput.js';\n\n// ── Data Widgets ──────────────────────────────────────\nexport { Table } from './data/Table.js';\nexport type { TableColumn, TableRow, TableOptions } from './data/Table.js';\nexport { Gauge } from './data/Gauge.js';\nexport type { GaugeOptions } from './data/Gauge.js';\nexport { Sparkline } from './data/Sparkline.js';\nexport type { SparklineOptions } from './data/Sparkline.js';\nexport { StatusIndicator } from './data/StatusIndicator.js';\nexport type { StatusIndicatorOptions } from './data/StatusIndicator.js';\n\n// ── Feedback Widgets ──────────────────────────────────\nexport { ProgressBar } from './feedback/ProgressBar.js';\nexport type { ProgressBarOptions } from './feedback/ProgressBar.js';\nexport { Spinner, SPINNER_FRAMES } from './feedback/Spinner.js';\nexport type { SpinnerOptions } from './feedback/Spinner.js';\n","// ─────────────────────────────────────────────────────\n// @termuijs/widgets — Base Widget class\n// ─────────────────────────────────────────────────────\n\nimport {\n type Screen,\n type Style,\n type LayoutNode,\n type Rect,\n type KeyEvent,\n type MouseEvent as TermMouseEvent,\n defaultStyle,\n mergeStyles,\n createLayoutNode,\n EventEmitter,\n normalizeEdges,\n getBorderChars,\n styleToCellAttrs,\n containsPoint,\n} from '@termuijs/core';\n\n/**\n * Event map for widgets.\n */\nexport interface WidgetEvents {\n key: KeyEvent;\n mouse: TermMouseEvent;\n focus: void;\n blur: void;\n mount: void;\n unmount: void;\n}\n\nlet _widgetIdCounter = 0;\n\n/**\n * Base class for all TermUI widgets.\n *\n * Provides:\n * - Unique ID generation\n * - Style management and merging\n * - Layout node generation with rect sync\n * - Border/padding rendering into the screen buffer\n * - Child management\n * - Focus support\n * - Event emission\n */\nexport abstract class Widget {\n /** Unique widget identifier */\n readonly id: string;\n\n /** Widget's style */\n protected _style: Style;\n\n /** Child widgets */\n protected _children: Widget[] = [];\n\n /** Parent widget (null for root) */\n parent: Widget | null = null;\n\n /** Computed layout rectangle */\n protected _rect: Rect = { x: 0, y: 0, width: 0, height: 0 };\n\n /** Reference to the layout node (set during getLayoutNode) */\n private _layoutNode: LayoutNode | null = null;\n\n /** Whether this widget can receive focus */\n focusable = false;\n\n /** Tab index for focus ordering */\n tabIndex = 0;\n\n /** Event emitter for this widget */\n readonly events = new EventEmitter<WidgetEvents>();\n\n /** Whether the widget is currently focused */\n isFocused = false;\n\n /**\n * Dirty flag — true when this widget needs re-rendering.\n * Newly created widgets start dirty.\n */\n protected _dirty = true;\n\n constructor(style: Partial<Style> = {}) {\n this.id = `widget_${++_widgetIdCounter}`;\n this._style = mergeStyles(defaultStyle(), style);\n }\n\n /** Get the current style */\n get style(): Style { return this._style; }\n\n /** Update the style (merge with existing) */\n setStyle(style: Partial<Style>): void {\n this._style = mergeStyles(this._style, style);\n this.markDirty();\n }\n\n /** Get the computed rect after layout */\n get rect(): Rect { return this._rect; }\n\n /** Add a child widget */\n addChild(child: Widget): void {\n child.parent = this;\n this._children.push(child);\n }\n\n /** Remove a child widget */\n removeChild(child: Widget): void {\n const idx = this._children.indexOf(child);\n if (idx >= 0) {\n this._children.splice(idx, 1);\n child.parent = null;\n }\n }\n\n /** Remove all children */\n clearChildren(): void {\n for (const child of this._children) {\n child.parent = null;\n }\n this._children = [];\n }\n\n /** Get all children */\n get children(): ReadonlyArray<Widget> { return this._children; }\n\n /**\n * Build the LayoutNode tree for this widget.\n * Stores a reference so we can sync computed rects back via syncLayout().\n */\n getLayoutNode(): LayoutNode {\n const childNodes = this._children\n .filter(c => c.style.visible !== false)\n .map(c => c.getLayoutNode());\n\n this._layoutNode = createLayoutNode(this.id, this._style, childNodes);\n return this._layoutNode;\n }\n\n /**\n * After computeLayout() has been called, sync the computed rects\n * from the layout tree back into widget `_rect` fields.\n * This MUST be called after computeLayout() and before render().\n */\n syncLayout(): void {\n if (this._layoutNode) {\n this._rect = { ...this._layoutNode.computed };\n }\n\n // Sync children (match visible children to layout node children)\n const visibleChildren = this._children.filter(c => c.style.visible !== false);\n for (let i = 0; i < visibleChildren.length; i++) {\n visibleChildren[i].syncLayout();\n }\n }\n\n /**\n * Render this widget (and children) into the screen buffer.\n * Automatically pushes a clip region if overflow is hidden (default).\n */\n render(screen: Screen): void {\n if (this._style.visible === false) return;\n\n // Push clip region if overflow is hidden (default style)\n const shouldClip = this._style.overflow !== 'visible';\n if (shouldClip) {\n screen.pushClip(this._rect);\n }\n\n // Render own content\n this._renderSelf(screen);\n\n // Render border\n this._renderBorder(screen);\n\n // Render children\n for (const child of this._children) {\n child.render(screen);\n }\n\n // Pop clip region\n if (shouldClip) {\n screen.popClip();\n }\n }\n\n /**\n * Override this to render the widget's own content.\n * The rect is available as `this._rect`.\n */\n protected abstract _renderSelf(screen: Screen): void;\n\n /**\n * Update the computed rect from layout results.\n */\n updateRect(rect: Rect): void {\n this._rect = rect;\n }\n\n /**\n * Mark this widget as needing re-render.\n * Propagates up to parent so the render loop can detect changes.\n */\n markDirty(): void {\n if (this._dirty) return; // Already dirty\n this._dirty = true;\n this.parent?.markDirty();\n }\n\n /**\n * Clear the dirty flag after rendering.\n */\n clearDirty(): void {\n this._dirty = false;\n for (const child of this._children) {\n child.clearDirty();\n }\n }\n\n /** Check if this widget (or any child) needs re-rendering */\n get isDirty(): boolean { return this._dirty; }\n\n /**\n * Render the border around this widget, including focus ring if focused.\n */\n protected _renderBorder(screen: Screen): void {\n const border = this._style.border;\n const hasBorder = border && border !== 'none';\n const showFocusRing = this.isFocused && this.focusable\n && this._style.focusRingStyle !== 'none';\n\n if (!hasBorder && !showFocusRing) return;\n\n const { x, y, width, height } = this._rect;\n if (width < 2 || height < 2) return;\n\n if (hasBorder) {\n const chars = getBorderChars(border);\n if (!chars) return;\n\n const attrs = styleToCellAttrs(this._style);\n const borderFg = this._style.borderColor ?? attrs.fg;\n\n // Use focus ring color when focused, otherwise normal border color\n const fg = showFocusRing\n ? (this._style.focusRingColor ?? { type: 'named' as const, name: 'cyan' as const })\n : borderFg;\n const cellStyle = { fg };\n\n // Top edge\n screen.setCell(x, y, { char: chars.topLeft, ...cellStyle });\n for (let c = 1; c < width - 1; c++) {\n screen.setCell(x + c, y, { char: chars.top, ...cellStyle });\n }\n screen.setCell(x + width - 1, y, { char: chars.topRight, ...cellStyle });\n\n // Bottom edge\n screen.setCell(x, y + height - 1, { char: chars.bottomLeft, ...cellStyle });\n for (let c = 1; c < width - 1; c++) {\n screen.setCell(x + c, y + height - 1, { char: chars.bottom, ...cellStyle });\n }\n screen.setCell(x + width - 1, y + height - 1, { char: chars.bottomRight, ...cellStyle });\n\n // Left and right edges\n for (let r = 1; r < height - 1; r++) {\n screen.setCell(x, y + r, { char: chars.left, ...cellStyle });\n screen.setCell(x + width - 1, y + r, { char: chars.right, ...cellStyle });\n }\n } else if (showFocusRing) {\n // No border — render corner bracket focus indicators\n const fg = this._style.focusRingColor ?? { type: 'named' as const, name: 'cyan' as const };\n const cellStyle = { fg, bold: true };\n\n // Top-left corner\n screen.setCell(x, y, { char: '┌', ...cellStyle });\n if (width > 2) screen.setCell(x + 1, y, { char: '─', ...cellStyle });\n\n // Top-right corner\n screen.setCell(x + width - 1, y, { char: '┐', ...cellStyle });\n if (width > 2) screen.setCell(x + width - 2, y, { char: '─', ...cellStyle });\n\n // Bottom-left corner\n screen.setCell(x, y + height - 1, { char: '└', ...cellStyle });\n if (width > 2) screen.setCell(x + 1, y + height - 1, { char: '─', ...cellStyle });\n\n // Bottom-right corner\n screen.setCell(x + width - 1, y + height - 1, { char: '┘', ...cellStyle });\n if (width > 2) screen.setCell(x + width - 2, y + height - 1, { char: '─', ...cellStyle });\n\n // Short vertical marks if tall enough\n if (height > 2) {\n screen.setCell(x, y + 1, { char: '│', ...cellStyle });\n screen.setCell(x + width - 1, y + 1, { char: '│', ...cellStyle });\n screen.setCell(x, y + height - 2, { char: '│', ...cellStyle });\n screen.setCell(x + width - 1, y + height - 2, { char: '│', ...cellStyle });\n }\n }\n }\n\n /**\n * Get the inner content area (after border + padding).\n */\n protected _getContentRect(): Rect {\n const padding = normalizeEdges(this._style.padding);\n const border = this._style.border && this._style.border !== 'none' ? 1 : 0;\n\n return {\n x: this._rect.x + padding.left + border,\n y: this._rect.y + padding.top + border,\n width: Math.max(0, this._rect.width - padding.left - padding.right - border * 2),\n height: Math.max(0, this._rect.height - padding.top - padding.bottom - border * 2),\n };\n }\n\n /**\n * Check if a point hits this widget.\n */\n hitTest(x: number, y: number): boolean {\n return containsPoint(this._rect, x, y);\n }\n\n /** Lifecycle: called when the widget is mounted */\n mount(): void {\n this.events.emit('mount', undefined as any);\n for (const child of this._children) {\n child.mount();\n }\n }\n\n /** Lifecycle: called when the widget is unmounted */\n unmount(): void {\n for (const child of this._children) {\n child.unmount();\n }\n this.events.emit('unmount', undefined as any);\n }\n}\n","// ─────────────────────────────────────────────────────\n// @termuijs/widgets — Box widget\n// ─────────────────────────────────────────────────────\n\nimport type { Screen, Style } from '@termuijs/core';\nimport { styleToCellAttrs } from '@termuijs/core';\nimport { Widget } from '../base/Widget.js';\n\n/**\n * Box — the fundamental container widget, similar to a `<div>`.\n *\n * Supports:\n * - Flexbox layout (row/column)\n * - Border styles (single/double/round/heavy/dashed)\n * - Padding and margin\n * - Background color\n */\nexport class Box extends Widget {\n constructor(style: Partial<Style> = {}) {\n super(style);\n }\n\n protected _renderSelf(screen: Screen): void {\n const { bg } = styleToCellAttrs(this._style);\n if (bg.type === 'none') return;\n\n const { x, y, width, height } = this._rect;\n const border = this._style.border && this._style.border !== 'none' ? 1 : 0;\n\n // Fill background\n for (let r = border; r < height - border; r++) {\n for (let c = border; c < width - border; c++) {\n screen.setCell(x + c, y + r, { char: ' ', bg });\n }\n }\n }\n}\n","// ─────────────────────────────────────────────────────\n// @termuijs/widgets — Text widget\n// ─────────────────────────────────────────────────────\n\nimport { type Screen, type Style, styleToCellAttrs, wordWrap, stringWidth } from '@termuijs/core';\nimport { Widget } from '../base/Widget.js';\n\nexport interface TextProps {\n content: string;\n wrap?: boolean;\n align?: 'left' | 'center' | 'right';\n}\n\n/**\n * Text — renders a string of text with word-wrapping and alignment.\n */\nexport class Text extends Widget {\n private _content: string;\n private _wrap: boolean;\n private _align: 'left' | 'center' | 'right';\n\n constructor(content: string, style: Partial<Style> = {}, props: Partial<TextProps> = {}) {\n super(style);\n this._content = content;\n this._wrap = props.wrap ?? true;\n this._align = props.align ?? 'left';\n }\n\n /** Update the text content */\n setContent(content: string): void {\n this._content = content;\n }\n\n /** Get current text content */\n getContent(): string {\n return this._content;\n }\n\n protected _renderSelf(screen: Screen): void {\n const contentRect = this._getContentRect();\n const { x, y, width, height } = contentRect;\n if (width <= 0 || height <= 0) return;\n\n const attrs = styleToCellAttrs(this._style);\n\n // Word-wrap if enabled\n let text = this._wrap ? wordWrap(this._content, width) : this._content;\n const lines = text.split('\\n');\n\n for (let i = 0; i < Math.min(lines.length, height); i++) {\n let line = lines[i];\n const lineWidth = stringWidth(line);\n\n // Apply alignment\n let offsetX = 0;\n if (this._align === 'center') {\n offsetX = Math.floor((width - lineWidth) / 2);\n } else if (this._align === 'right') {\n offsetX = width - lineWidth;\n }\n\n screen.writeString(x + Math.max(0, offsetX), y + i, line, attrs);\n }\n }\n}\n","// ─────────────────────────────────────────────────────\n// @termuijs/widgets — LogView widget (scrollable log)\n// ─────────────────────────────────────────────────────\n\nimport { type Screen, type Style, type Color, styleToCellAttrs, truncate } from '@termuijs/core';\nimport { Widget } from '../base/Widget.js';\n\nexport interface LogViewOptions {\n /** Highlight rules: keyword → color */\n highlight?: Record<string, Color>;\n /** Auto-scroll to bottom */\n autoScroll?: boolean;\n}\n\n/**\n * LogView — scrollable, highlighted log output.\n *\n * Supports keyword-based color highlighting (ERROR → red, WARN → yellow, etc.)\n */\nexport class LogView extends Widget {\n private _lines: string[] = [];\n private _scrollOffset = 0;\n private _highlight: Record<string, Color>;\n private _autoScroll: boolean;\n\n constructor(style: Partial<Style> = {}, opts: LogViewOptions = {}) {\n super(style);\n this._highlight = opts.highlight ?? {\n ERROR: { type: 'named', name: 'red' },\n WARN: { type: 'named', name: 'yellow' },\n INFO: { type: 'named', name: 'green' },\n DEBUG: { type: 'named', name: 'brightBlack' },\n };\n this._autoScroll = opts.autoScroll ?? true;\n }\n\n setLines(lines: string[]): void {\n this._lines = lines;\n if (this._autoScroll) {\n this._scrollToBottom();\n }\n }\n\n appendLine(line: string): void {\n this._lines.push(line);\n if (this._autoScroll) {\n this._scrollToBottom();\n }\n }\n\n scrollUp(n = 1): void {\n this._scrollOffset = Math.max(0, this._scrollOffset - n);\n }\n\n scrollDown(n = 1): void {\n this._scrollOffset = Math.min(\n Math.max(0, this._lines.length - 1),\n this._scrollOffset + n,\n );\n }\n\n private _scrollToBottom(): void {\n const rect = this._getContentRect();\n const visibleLines = Math.max(1, rect.height);\n this._scrollOffset = Math.max(0, this._lines.length - visibleLines);\n }\n\n protected _renderSelf(screen: Screen): void {\n const rect = this._getContentRect();\n const { x, y, width, height } = rect;\n if (width <= 0 || height <= 0) return;\n\n const attrs = styleToCellAttrs(this._style);\n const visibleLines = this._lines.slice(this._scrollOffset, this._scrollOffset + height);\n\n for (let i = 0; i < Math.min(visibleLines.length, height); i++) {\n const line = truncate(visibleLines[i], width);\n const lineColor = this._getLineColor(line);\n\n screen.writeString(x, y + i, line, {\n ...attrs,\n ...(lineColor ? { fg: lineColor } : {}),\n });\n }\n }\n\n private _getLineColor(line: string): Color | null {\n for (const [keyword, color] of Object.entries(this._highlight)) {\n if (line.includes(keyword)) return color;\n }\n return null;\n }\n}\n","// ─────────────────────────────────────────────────────\n// @termuijs/widgets — List widget (selectable)\n// ─────────────────────────────────────────────────────\n\nimport { type Screen, type Style, styleToCellAttrs, stringWidth, truncate } from '@termuijs/core';\nimport { Widget } from '../base/Widget.js';\n\nexport interface ListItem {\n label: string;\n value: string;\n disabled?: boolean;\n}\n\n/**\n * List — a scrollable, selectable list of items.\n *\n * Supports:\n * - Keyboard navigation (up/down/Home/End)\n * - Scrolling when items exceed visible height\n * - Custom item styling\n * - Disabled items\n */\nexport class List extends Widget {\n private _items: ListItem[];\n private _selectedIndex = 0;\n private _scrollOffset = 0;\n private _onSelect?: (item: ListItem, index: number) => void;\n\n constructor(\n items: ListItem[],\n style: Partial<Style> = {},\n onSelect?: (item: ListItem, index: number) => void,\n ) {\n super({ border: 'single', ...style });\n this._items = items;\n this._onSelect = onSelect;\n this.focusable = true;\n }\n\n get selectedIndex(): number { return this._selectedIndex; }\n get selectedItem(): ListItem | undefined { return this._items[this._selectedIndex]; }\n\n setItems(items: ListItem[]): void {\n this._items = items;\n this._selectedIndex = Math.min(this._selectedIndex, items.length - 1);\n this._clampScroll();\n }\n\n /** Move selection up */\n selectPrev(): void {\n let next = this._selectedIndex - 1;\n while (next >= 0 && this._items[next].disabled) next--;\n if (next >= 0) {\n this._selectedIndex = next;\n this._clampScroll();\n }\n }\n\n /** Move selection down */\n selectNext(): void {\n let next = this._selectedIndex + 1;\n while (next < this._items.length && this._items[next].disabled) next++;\n if (next < this._items.length) {\n this._selectedIndex = next;\n this._clampScroll();\n }\n }\n\n /** Confirm the current selection */\n confirm(): void {\n const item = this._items[this._selectedIndex];\n if (item && !item.disabled) {\n this._onSelect?.(item, this._selectedIndex);\n }\n }\n\n protected _renderSelf(screen: Screen): void {\n const rect = this._getContentRect();\n const { x, y, width, height } = rect;\n if (width <= 0 || height <= 0) return;\n\n const attrs = styleToCellAttrs(this._style);\n const visibleCount = Math.min(this._items.length - this._scrollOffset, height);\n\n for (let i = 0; i < visibleCount; i++) {\n const itemIdx = this._scrollOffset + i;\n const item = this._items[itemIdx];\n const isSelected = itemIdx === this._selectedIndex;\n\n // Compose the line\n const prefix = isSelected ? '▸ ' : ' ';\n let line = prefix + item.label;\n line = truncate(line, width);\n\n // Style\n const cellStyle = {\n ...attrs,\n bold: isSelected,\n dim: item.disabled ?? false,\n inverse: isSelected && this.isFocused,\n };\n\n screen.writeString(x, y + i, line, cellStyle);\n\n // Fill rest of line for inverse highlight\n if (isSelected && this.isFocused) {\n const remaining = width - stringWidth(line);\n for (let c = 0; c < remaining; c++) {\n screen.setCell(x + stringWidth(line) + c, y + i, { char: ' ', ...cellStyle });\n }\n }\n }\n\n // Scrollbar indicator\n if (this._items.length > height) {\n const scrollRatio = this._scrollOffset / (this._items.length - height);\n const scrollPos = Math.floor(scrollRatio * (height - 1));\n for (let r = 0; r < height; r++) {\n const scrollChar = r === scrollPos ? '█' : '░';\n screen.setCell(x + width - 1, y + r, { char: scrollChar, ...attrs, dim: true });\n }\n }\n }\n\n private _clampScroll(): void {\n const rect = this._getContentRect();\n const visibleHeight = rect.height;\n if (visibleHeight <= 0) return;\n\n if (this._selectedIndex < this._scrollOffset) {\n this._scrollOffset = this._selectedIndex;\n }\n if (this._selectedIndex >= this._scrollOffset + visibleHeight) {\n this._scrollOffset = this._selectedIndex - visibleHeight + 1;\n }\n }\n}\n","// ─────────────────────────────────────────────────────\n// @termuijs/widgets — TextInput widget\n// ─────────────────────────────────────────────────────\n\nimport { type Screen, type Style, styleToCellAttrs, stringWidth, truncate } from '@termuijs/core';\nimport { Widget } from '../base/Widget.js';\n\n/**\n * TextInput — a single-line text input field.\n *\n * Supports:\n * - Cursor movement (left/right/Home/End)\n * - Character insertion and deletion\n * - Placeholder text\n * - Password masking\n * - Max length constraint\n */\nexport class TextInput extends Widget {\n private _value = '';\n private _cursorPos = 0;\n private _placeholder: string;\n private _mask: string | null;\n private _maxLength: number;\n private _onChange?: (value: string) => void;\n private _onSubmit?: (value: string) => void;\n\n constructor(\n style: Partial<Style> = {},\n options: {\n placeholder?: string;\n mask?: string;\n maxLength?: number;\n onChange?: (value: string) => void;\n onSubmit?: (value: string) => void;\n } = {},\n ) {\n super({ border: 'single', height: 3, ...style });\n this._placeholder = options.placeholder ?? '';\n this._mask = options.mask ?? null;\n this._maxLength = options.maxLength ?? Infinity;\n this._onChange = options.onChange;\n this._onSubmit = options.onSubmit;\n this.focusable = true;\n }\n\n get value(): string { return this._value; }\n set value(v: string) {\n this._value = v.slice(0, this._maxLength);\n this._cursorPos = Math.min(this._cursorPos, this._value.length);\n }\n\n /**\n * Handle a typed character.\n */\n insertChar(char: string): void {\n if (this._value.length >= this._maxLength) return;\n this._value =\n this._value.slice(0, this._cursorPos) +\n char +\n this._value.slice(this._cursorPos);\n this._cursorPos++;\n this._onChange?.(this._value);\n }\n\n /**\n * Delete the character before the cursor.\n */\n deleteBack(): void {\n if (this._cursorPos > 0) {\n this._value =\n this._value.slice(0, this._cursorPos - 1) +\n this._value.slice(this._cursorPos);\n this._cursorPos--;\n this._onChange?.(this._value);\n }\n }\n\n /**\n * Delete the character after the cursor.\n */\n deleteForward(): void {\n if (this._cursorPos < this._value.length) {\n this._value =\n this._value.slice(0, this._cursorPos) +\n this._value.slice(this._cursorPos + 1);\n this._onChange?.(this._value);\n }\n }\n\n moveCursorLeft(): void { this._cursorPos = Math.max(0, this._cursorPos - 1); }\n moveCursorRight(): void { this._cursorPos = Math.min(this._value.length, this._cursorPos + 1); }\n moveCursorHome(): void { this._cursorPos = 0; }\n moveCursorEnd(): void { this._cursorPos = this._value.length; }\n submit(): void { this._onSubmit?.(this._value); }\n clear(): void { this._value = ''; this._cursorPos = 0; this._onChange?.(''); }\n\n protected _renderSelf(screen: Screen): void {\n const rect = this._getContentRect();\n const { x, y, width, height } = rect;\n if (width <= 0 || height <= 0) return;\n\n const attrs = styleToCellAttrs(this._style);\n\n if (this._value.length === 0 && !this.isFocused) {\n // Show placeholder\n screen.writeString(x, y, truncate(this._placeholder, width), { ...attrs, dim: true });\n return;\n }\n\n // Display value (optionally masked)\n const displayValue = this._mask\n ? this._mask.repeat(this._value.length)\n : this._value;\n\n // Scroll the view if cursor is beyond visible area\n const visibleWidth = width - 1; // Leave room for cursor\n let scrollX = 0;\n if (this._cursorPos > visibleWidth) {\n scrollX = this._cursorPos - visibleWidth;\n }\n\n const visibleText = displayValue.slice(scrollX, scrollX + visibleWidth);\n screen.writeString(x, y, visibleText, attrs);\n\n // Draw cursor when focused\n if (this.isFocused) {\n const cursorScreenPos = x + this._cursorPos - scrollX;\n if (cursorScreenPos >= x && cursorScreenPos < x + width) {\n const cursorChar = this._cursorPos < displayValue.length\n ? displayValue[this._cursorPos]\n : ' ';\n screen.setCell(cursorScreenPos, y, {\n char: cursorChar,\n ...attrs,\n inverse: true,\n });\n }\n }\n }\n}\n","// ─────────────────────────────────────────────────────\n// @termuijs/widgets — Table widget\n// ─────────────────────────────────────────────────────\n\nimport { type Screen, type Style, type Color, styleToCellAttrs, stringWidth, truncate } from '@termuijs/core';\nimport { Widget } from '../base/Widget.js';\n\nexport interface TableColumn {\n /** Column header label */\n header: string;\n /** Key to pull data from row objects */\n key: string;\n /** Fixed width (chars). If omitted, auto-distributes. */\n width?: number;\n /** Text alignment within the column */\n align?: 'left' | 'center' | 'right';\n}\n\nexport type TableRow = Record<string, string | number>;\n\nexport interface TableOptions {\n /** Whether to show the header row */\n showHeader?: boolean;\n /** Color for the header row */\n headerColor?: Color;\n /** Whether rows are zebra-striped */\n stripe?: boolean;\n /** Stripe color */\n stripeColor?: Color;\n /** Column separator character */\n separator?: string;\n}\n\n/**\n * Table — renders tabular data with columns, headers, and optional zebra-striping.\n *\n * Supports:\n * - Auto-width column distribution\n * - Fixed and percentage widths\n * - Header styling\n * - Zebra striping\n * - Text alignment per column\n * - Truncation for overflow\n */\nexport class Table extends Widget {\n private _columns: TableColumn[];\n private _rows: TableRow[];\n private _showHeader: boolean;\n private _headerColor: Color;\n private _stripe: boolean;\n private _stripeColor: Color;\n private _separator: string;\n\n constructor(\n columns: TableColumn[],\n rows: TableRow[],\n style: Partial<Style> = {},\n options: TableOptions = {},\n ) {\n super(style);\n this._columns = columns;\n this._rows = rows;\n this._showHeader = options.showHeader ?? true;\n this._headerColor = options.headerColor ?? { type: 'named', name: 'cyan' };\n this._stripe = options.stripe ?? true;\n this._stripeColor = options.stripeColor ?? { type: 'named', name: 'brightBlack' };\n this._separator = options.separator ?? ' │ ';\n }\n\n setRows(rows: TableRow[]): void {\n this._rows = rows;\n }\n\n protected _renderSelf(screen: Screen): void {\n const rect = this._getContentRect();\n const { x, y, width, height } = rect;\n if (width <= 0 || height <= 0) return;\n\n const attrs = styleToCellAttrs(this._style);\n const sepWidth = stringWidth(this._separator);\n\n // Calculate column widths\n const colWidths = this._computeColumnWidths(\n width - (this._columns.length - 1) * sepWidth,\n );\n\n let row = 0;\n\n // Render header\n if (this._showHeader && row < height) {\n let cx = x;\n for (let c = 0; c < this._columns.length; c++) {\n const col = this._columns[c];\n const cellText = this._alignText(col.header, colWidths[c], col.align ?? 'left');\n screen.writeString(cx, y + row, cellText, {\n ...attrs,\n fg: this._headerColor,\n bold: true,\n });\n cx += colWidths[c];\n if (c < this._columns.length - 1) {\n screen.writeString(cx, y + row, this._separator, { ...attrs, dim: true });\n cx += sepWidth;\n }\n }\n row++;\n\n // Header separator line\n if (row < height) {\n const sepLine = '─'.repeat(width);\n screen.writeString(x, y + row, sepLine, { ...attrs, dim: true });\n row++;\n }\n }\n\n // Render data rows\n for (let r = 0; r < this._rows.length && row < height; r++) {\n const dataRow = this._rows[r];\n const isStripe = this._stripe && r % 2 === 1;\n let cx = x;\n\n for (let c = 0; c < this._columns.length; c++) {\n const col = this._columns[c];\n const rawValue = String(dataRow[col.key] ?? '');\n const cellText = this._alignText(rawValue, colWidths[c], col.align ?? 'left');\n\n screen.writeString(cx, y + row, cellText, {\n ...attrs,\n bg: isStripe ? this._stripeColor : attrs.bg,\n });\n cx += colWidths[c];\n if (c < this._columns.length - 1) {\n screen.writeString(cx, y + row, this._separator, {\n ...attrs,\n dim: true,\n bg: isStripe ? this._stripeColor : attrs.bg,\n });\n cx += sepWidth;\n }\n }\n\n // Fill remaining width for stripe\n if (isStripe) {\n for (let fx = cx; fx < x + width; fx++) {\n screen.setCell(fx, y + row, { char: ' ', bg: this._stripeColor });\n }\n }\n\n row++;\n }\n }\n\n private _computeColumnWidths(totalWidth: number): number[] {\n const fixedCols = this._columns.filter(c => c.width !== undefined);\n const flexCols = this._columns.filter(c => c.width === undefined);\n\n let usedWidth = fixedCols.reduce((sum, c) => sum + (c.width ?? 0), 0);\n const remainingWidth = Math.max(0, totalWidth - usedWidth);\n const flexWidth = flexCols.length > 0 ? Math.floor(remainingWidth / flexCols.length) : 0;\n\n return this._columns.map(c => c.width ?? flexWidth);\n }\n\n private _alignText(text: string, width: number, align: 'left' | 'center' | 'right'): string {\n const truncated = truncate(text, width);\n const textWidth = stringWidth(truncated);\n const pad = Math.max(0, width - textWidth);\n\n switch (align) {\n case 'right':\n return ' '.repeat(pad) + truncated;\n case 'center': {\n const left = Math.floor(pad / 2);\n const right = pad - left;\n return ' '.repeat(left) + truncated + ' '.repeat(right);\n }\n case 'left':\n default:\n return truncated + ' '.repeat(pad);\n }\n }\n}\n","// ─────────────────────────────────────────────────────\n// @termuijs/widgets — Gauge widget (label + bar + value)\n// ─────────────────────────────────────────────────────\n\nimport { type Screen, type Style, type Color, styleToCellAttrs, stringWidth } from '@termuijs/core';\nimport { Widget } from '../base/Widget.js';\n\nexport interface GaugeOptions {\n /** Color of the filled portion */\n color?: Color;\n /** Show percentage label */\n showLabel?: boolean;\n}\n\n/**\n * Gauge — a self-contained metric display with label, bar, and value.\n *\n * Example:\n * CPU ████████░░░░ 65%\n */\nexport class Gauge extends Widget {\n private _label: string;\n private _value: number = 0;\n private _color: Color;\n private _showLabel: boolean;\n\n constructor(label: string, style: Partial<Style> = {}, opts: GaugeOptions = {}) {\n super(style);\n this._label = label;\n this._color = opts.color ?? { type: 'named', name: 'green' };\n this._showLabel = opts.showLabel ?? true;\n }\n\n setValue(value: number): void {\n this._value = Math.max(0, Math.min(1, value));\n }\n\n getValue(): number {\n return this._value;\n }\n\n setLabel(label: string): void {\n this._label = label;\n }\n\n protected _renderSelf(screen: Screen): void {\n const rect = this._getContentRect();\n const { x, y, width, height } = rect;\n if (width <= 0 || height <= 0) return;\n\n const attrs = styleToCellAttrs(this._style);\n\n // Layout: \"Label ████████░░░░ XX%\"\n const labelStr = this._label + ' ';\n const percentStr = this._showLabel ? ` ${Math.round(this._value * 100)}%` : '';\n const labelWidth = stringWidth(labelStr);\n const percentWidth = stringWidth(percentStr);\n const barWidth = Math.max(0, width - labelWidth - percentWidth);\n\n // Render label\n screen.writeString(x, y, labelStr, { ...attrs, bold: true });\n\n // Render bar\n const filled = Math.round(barWidth * this._value);\n const barX = x + labelWidth;\n for (let i = 0; i < barWidth; i++) {\n const char = i < filled ? '█' : '░';\n screen.setCell(barX + i, y, {\n char,\n fg: i < filled ? this._color : { type: 'named', name: 'brightBlack' },\n });\n }\n\n // Render percentage\n if (this._showLabel) {\n screen.writeString(barX + barWidth, y, percentStr, {\n ...attrs,\n bold: true,\n });\n }\n }\n}\n","// ─────────────────────────────────────────────────────\n// @termuijs/widgets — Sparkline widget (braille chart)\n// ─────────────────────────────────────────────────────\n\nimport { type Screen, type Style, type Color, styleToCellAttrs } from '@termuijs/core';\nimport { Widget } from '../base/Widget.js';\n\nexport interface SparklineOptions {\n /** Color of the sparkline */\n color?: Color;\n /** Show min/max labels */\n showRange?: boolean;\n}\n\n// Braille sparkline characters (8 levels per cell, bottom to top)\nconst SPARK_CHARS = ['▁', '▂', '▃', '▄', '▅', '▆', '▇', '█'];\n\n/**\n * Sparkline — a compact inline chart showing a data trend.\n *\n * Example:\n * Latency ▂▃▅▇▅▃▂▁▃▅█▅▃\n */\nexport class Sparkline extends Widget {\n private _label: string;\n private _data: number[] = [];\n private _color: Color;\n private _showRange: boolean;\n\n constructor(label: string, style: Partial<Style> = {}, opts: SparklineOptions = {}) {\n super(style);\n this._label = label;\n this._color = opts.color ?? { type: 'named', name: 'cyan' };\n this._showRange = opts.showRange ?? false;\n }\n\n setData(data: number[]): void {\n this._data = data;\n }\n\n pushValue(value: number): void {\n this._data.push(value);\n }\n\n protected _renderSelf(screen: Screen): void {\n const rect = this._getContentRect();\n const { x, y, width, height } = rect;\n if (width <= 0 || height <= 0) return;\n\n const attrs = styleToCellAttrs(this._style);\n const labelStr = this._label + ' ';\n const labelWidth = labelStr.length;\n\n // Render label\n screen.writeString(x, y, labelStr, { ...attrs, bold: true });\n\n // Available sparkline width\n const sparkWidth = width - labelWidth;\n if (sparkWidth <= 0 || this._data.length === 0) return;\n\n // Take the most recent data points that fit\n const data = this._data.slice(-sparkWidth);\n\n // Normalize data to 0–7 range\n const min = Math.min(...data);\n const max = Math.max(...data);\n const range = max - min || 1;\n\n for (let i = 0; i < data.length; i++) {\n const normalized = (data[i] - min) / range;\n const charIdx = Math.min(7, Math.floor(normalized * 8));\n screen.setCell(x + labelWidth + i, y, {\n char: SPARK_CHARS[charIdx],\n fg: this._color,\n });\n }\n\n // Optional range labels on second line\n if (this._showRange && height > 1) {\n const rangeStr = `${min.toFixed(0)}–${max.toFixed(0)}`;\n screen.writeString(x + labelWidth, y + 1, rangeStr, {\n ...attrs,\n dim: true,\n });\n }\n }\n}\n","// ─────────────────────────────────────────────────────\n// @termuijs/widgets — StatusIndicator widget\n// ─────────────────────────────────────────────────────\n\nimport { type Screen, type Style, type Color, styleToCellAttrs } from '@termuijs/core';\nimport { Widget } from '../base/Widget.js';\n\nexport interface StatusIndicatorOptions {\n /** Color when up/active */\n upColor?: Color;\n /** Color when down/inactive */\n downColor?: Color;\n}\n\n/**\n * StatusIndicator — simple up/down indicator with label.\n *\n * Example:\n * ● API Server — Online\n * ○ Worker — Offline\n */\nexport class StatusIndicator extends Widget {\n private _label: string;\n private _isUp: boolean;\n private _upColor: Color;\n private _downColor: Color;\n\n constructor(label: string, isUp: boolean, style: Partial<Style> = {}, opts: StatusIndicatorOptions = {}) {\n super(style);\n this._label = label;\n this._isUp = isUp;\n this._upColor = opts.upColor ?? { type: 'named', name: 'green' };\n this._downColor = opts.downColor ?? { type: 'named', name: 'red' };\n }\n\n setStatus(isUp: boolean): void {\n this._isUp = isUp;\n }\n\n getStatus(): boolean {\n return this._isUp;\n }\n\n setLabel(label: string): void {\n this._label = label;\n }\n\n protected _renderSelf(screen: Screen): void {\n const rect = this._getContentRect();\n const { x, y, width, height } = rect;\n if (width <= 0 || height <= 0) return;\n\n const attrs = styleToCellAttrs(this._style);\n const dot = this._isUp ? '●' : '○';\n const statusText = this._isUp ? 'Online' : 'Offline';\n const color = this._isUp ? this._upColor : this._downColor;\n\n screen.setCell(x, y, { char: dot, fg: color });\n screen.writeString(x + 2, y, `${this._label} — ${statusText}`, {\n ...attrs,\n fg: color,\n });\n }\n}\n","// ─────────────────────────────────────────────────────\n// @termuijs/widgets — ProgressBar widget\n// ─────────────────────────────────────────────────────\n\nimport { type Screen, type Style, styleToCellAttrs, type Color } from '@termuijs/core';\nimport { Widget } from '../base/Widget.js';\n\nexport interface ProgressBarOptions {\n /** Current value (0–1) */\n value?: number;\n /** Character for the filled portion */\n fillChar?: string;\n /** Character for the empty portion */\n emptyChar?: string;\n /** Color of the filled portion */\n fillColor?: Color;\n /** Show percentage label */\n showLabel?: boolean;\n /** Label format: 'percent' | 'fraction' | 'custom' */\n labelFormat?: 'percent' | 'fraction';\n /** Total for fraction display */\n total?: number;\n}\n\n/**\n * ProgressBar — horizontal progress indicator.\n *\n * Supports:\n * - Configurable fill/empty characters\n * - Custom fill color\n * - Percentage or fraction label\n * - Smooth animation-ready value changes\n */\nexport class ProgressBar extends Widget {\n private _value: number;\n private _fillChar: string;\n private _emptyChar: string;\n private _fillColor: Color;\n private _showLabel: boolean;\n private _labelFormat: 'percent' | 'fraction';\n private _total: number;\n\n constructor(style: Partial<Style> = {}, options: ProgressBarOptions = {}) {\n super({ height: 1, ...style });\n this._value = Math.max(0, Math.min(1, options.value ?? 0));\n this._fillChar = options.fillChar ?? '█';\n this._emptyChar = options.emptyChar ?? '░';\n this._fillColor = options.fillColor ?? { type: 'named', name: 'green' };\n this._showLabel = options.showLabel ?? true;\n this._labelFormat = options.labelFormat ?? 'percent';\n this._total = options.total ?? 100;\n }\n\n /** Set progress value (0–1) */\n setValue(value: number): void {\n this._value = Math.max(0, Math.min(1, value));\n }\n\n get value(): number { return this._value; }\n\n protected _renderSelf(screen: Screen): void {\n const rect = this._getContentRect();\n const { x, y, width } = rect;\n if (width <= 0) return;\n\n const attrs = styleToCellAttrs(this._style);\n\n // Label\n let label = '';\n if (this._showLabel) {\n if (this._labelFormat === 'percent') {\n label = ` ${Math.round(this._value * 100)}%`;\n } else {\n label = ` ${Math.round(this._value * this._total)}/${this._total}`;\n }\n }\n\n const barWidth = Math.max(0, width - label.length);\n const filled = Math.round(barWidth * this._value);\n const empty = barWidth - filled;\n\n // Render bar\n for (let i = 0; i < filled; i++) {\n screen.setCell(x + i, y, { char: this._fillChar, ...attrs, fg: this._fillColor });\n }\n for (let i = 0; i < empty; i++) {\n screen.setCell(x + filled + i, y, { char: this._emptyChar, ...attrs, dim: true });\n }\n\n // Render label\n if (label) {\n screen.writeString(x + barWidth, y, label, { ...attrs, bold: true });\n }\n }\n}\n","// ─────────────────────────────────────────────────────\n// @termuijs/widgets — Spinner widget\n// ─────────────────────────────────────────────────────\n\nimport { type Screen, type Style, styleToCellAttrs, type Color } from '@termuijs/core';\nimport { Widget } from '../base/Widget.js';\n\n/**\n * Built-in spinner frame sets.\n */\nexport const SPINNER_FRAMES: Record<string, { frames: string[]; interval: number }> = {\n dots: {\n frames: ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'],\n interval: 80,\n },\n line: {\n frames: ['-', '\\\\', '|', '/'],\n interval: 130,\n },\n star: {\n frames: ['✶', '✸', '✹', '✺', '✹', '✷'],\n interval: 70,\n },\n arc: {\n frames: ['◜', '◠', '◝', '◞', '◡', '◟'],\n interval: 100,\n },\n circle: {\n frames: ['◐', '◓', '◑', '◒'],\n interval: 120,\n },\n bounce: {\n frames: ['⠁', '⠂', '⠄', '⠂'],\n interval: 120,\n },\n arrow: {\n frames: ['←', '↖', '↑', '↗', '→', '↘', '↓', '↙'],\n interval: 100,\n },\n clock: {\n frames: ['🕐', '🕑', '🕒', '🕓', '🕔', '🕕', '🕖', '🕗', '🕘', '🕙', '🕚', '🕛'],\n interval: 100,\n },\n};\n\nexport interface SpinnerOptions {\n /** Spinner preset name or custom frames */\n spinner?: string | { frames: string[]; interval: number };\n /** Text label displayed after the spinner */\n label?: string;\n /** Color for the spinner frames */\n color?: Color;\n}\n\n/**\n * Spinner — animated loading indicator.\n *\n * Supports:\n * - 8 built-in spinner presets\n * - Custom frame sequences\n * - Configurable color and label\n * - Automatic frame advancement via tick()\n */\nexport class Spinner extends Widget {\n private _frames: string[];\n private _interval: number;\n private _frameIndex = 0;\n private _label: string;\n private _color: Color;\n private _lastTick = 0;\n private _elapsed = 0;\n\n constructor(style: Partial<Style> = {}, options: SpinnerOptions = {}) {\n super({ height: 1, ...style });\n\n const spinnerDef = typeof options.spinner === 'string'\n ? (SPINNER_FRAMES[options.spinner] ?? SPINNER_FRAMES.dots)\n : (options.spinner ?? SPINNER_FRAMES.dots);\n\n this._frames = spinnerDef.frames;\n this._interval = spinnerDef.interval;\n this._label = options.label ?? '';\n this._color = options.color ?? { type: 'named', name: 'cyan' };\n }\n\n /** Update the spinner label */\n setLabel(label: string): void {\n this._label = label;\n }\n\n /**\n * Advance the spinner frame based on elapsed time.\n * Call this with a delta (ms) from the render loop.\n */\n tick(deltaMs: number): void {\n this._elapsed += deltaMs;\n if (this._elapsed >= this._interval) {\n this._frameIndex = (this._frameIndex + 1) % this._frames.length;\n this._elapsed = 0;\n }\n }\n\n protected _renderSelf(screen: Screen): void {\n const rect = this._getContentRect();\n const { x, y, width } = rect;\n if (width <= 0) return;\n\n const attrs = styleToCellAttrs(this._style);\n const frame = this._frames[this._frameIndex];\n\n // Render spinner character\n screen.writeString(x, y, frame, { ...attrs, fg: this._color });\n\n // Render label\n if (this._label) {\n screen.writeString(x + 2, y, this._label, attrs);\n }\n }\n}\n"],"mappings":"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","names":["import_core","import_core","import_core","import_core","import_core","import_core","import_core","import_core","import_core","import_core","import_core"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/base/Widget.ts","../src/display/Box.ts","../src/display/Text.ts","../src/display/LogView.ts","../src/input/List.ts","../src/input/TextInput.ts","../src/input/VirtualList.ts","../src/data/Table.ts","../src/data/Gauge.ts","../src/data/Sparkline.ts","../src/data/StatusIndicator.ts","../src/data/BarChart.ts","../src/feedback/ProgressBar.ts","../src/feedback/Spinner.ts","../src/feedback/Scrollbar.ts"],"sourcesContent":["// ─────────────────────────────────────────────────────\n// @termuijs/widgets — Public API\n// ─────────────────────────────────────────────────────\n\n// ── Base ──────────────────────────────────────────────\nexport { Widget } from './base/Widget.js';\nexport type { WidgetEvents } from './base/Widget.js';\n\n// ── Display Widgets ───────────────────────────────────\nexport { Box } from './display/Box.js';\nexport { Text } from './display/Text.js';\nexport type { TextProps } from './display/Text.js';\nexport { LogView } from './display/LogView.js';\nexport type { LogViewOptions } from './display/LogView.js';\n\n// ── Input Widgets ─────────────────────────────────────\nexport { List } from './input/List.js';\nexport type { ListItem } from './input/List.js';\nexport { TextInput } from './input/TextInput.js';\nexport { VirtualList } from './input/VirtualList.js';\nexport type { VirtualListOptions } from './input/VirtualList.js';\n\n// ── Data Widgets ──────────────────────────────────────\nexport { Table } from './data/Table.js';\nexport type { TableColumn, TableRow, TableOptions } from './data/Table.js';\nexport { Gauge } from './data/Gauge.js';\nexport type { GaugeOptions } from './data/Gauge.js';\nexport { Sparkline } from './data/Sparkline.js';\nexport type { SparklineOptions } from './data/Sparkline.js';\nexport { StatusIndicator } from './data/StatusIndicator.js';\nexport type { StatusIndicatorOptions } from './data/StatusIndicator.js';\nexport { BarChart } from './data/BarChart.js';\nexport type { Bar, BarGroup, BarChartDirection, BarChartOptions } from './data/BarChart.js';\n\n// ── Feedback Widgets ──────────────────────────────────\nexport { ProgressBar } from './feedback/ProgressBar.js';\nexport type { ProgressBarOptions } from './feedback/ProgressBar.js';\nexport { Spinner, SPINNER_FRAMES } from './feedback/Spinner.js';\nexport type { SpinnerOptions } from './feedback/Spinner.js';\nexport { Scrollbar } from './feedback/Scrollbar.js';\nexport type { ScrollbarOrientation, ScrollbarOptions } from './feedback/Scrollbar.js';\n","// ─────────────────────────────────────────────────────\n// @termuijs/widgets — Base Widget class\n// ─────────────────────────────────────────────────────\n\nimport {\n type Screen,\n type Style,\n type LayoutNode,\n type Rect,\n type KeyEvent,\n type MouseEvent as TermMouseEvent,\n defaultStyle,\n mergeStyles,\n createLayoutNode,\n EventEmitter,\n normalizeEdges,\n getBorderChars,\n styleToCellAttrs,\n containsPoint,\n} from '@termuijs/core';\n\n/**\n * Event map for widgets.\n */\nexport interface WidgetEvents {\n key: KeyEvent;\n mouse: TermMouseEvent;\n focus: void;\n blur: void;\n mount: void;\n unmount: void;\n}\n\nlet _widgetIdCounter = 0;\n\n/** Reset the widget ID counter (for testing only). */\nexport function _resetWidgetIdCounter(): void {\n _widgetIdCounter = 0;\n}\n\n/**\n * Base class for all TermUI widgets.\n *\n * Provides:\n * - Unique ID generation\n * - Style management and merging\n * - Layout node generation with rect sync\n * - Border/padding rendering into the screen buffer\n * - Child management\n * - Focus support\n * - Event emission\n */\nexport abstract class Widget {\n /** Unique widget identifier */\n readonly id: string;\n\n /** Widget's style */\n protected _style: Style;\n\n /** Child widgets */\n protected _children: Widget[] = [];\n\n /** Parent widget (null for root) */\n parent: Widget | null = null;\n\n /** Computed layout rectangle */\n protected _rect: Rect = { x: 0, y: 0, width: 0, height: 0 };\n\n /** Reference to the layout node (set during getLayoutNode) */\n private _layoutNode: LayoutNode | null = null;\n\n /** Whether this widget can receive focus */\n focusable = false;\n\n /** Tab index for focus ordering */\n tabIndex = 0;\n\n /** Event emitter for this widget */\n readonly events = new EventEmitter<WidgetEvents>();\n\n /** Whether the widget is currently focused */\n isFocused = false;\n\n /**\n * Dirty flag — true when this widget needs re-rendering.\n * Newly created widgets start dirty.\n */\n protected _dirty = true;\n\n constructor(style: Partial<Style> = {}) {\n this.id = `widget_${++_widgetIdCounter}`;\n this._style = mergeStyles(defaultStyle(), style);\n }\n\n /** Get the current style */\n get style(): Style { return this._style; }\n\n /** Update the style (merge with existing) */\n setStyle(style: Partial<Style>): void {\n this._style = mergeStyles(this._style, style);\n this.markDirty();\n }\n\n /** Get the computed rect after layout */\n get rect(): Rect { return this._rect; }\n\n /** Add a child widget */\n addChild(child: Widget): void {\n child.parent = this;\n this._children.push(child);\n }\n\n /** Remove a child widget */\n removeChild(child: Widget): void {\n const idx = this._children.indexOf(child);\n if (idx >= 0) {\n this._children.splice(idx, 1);\n child.parent = null;\n }\n }\n\n /** Remove all children */\n clearChildren(): void {\n for (const child of this._children) {\n child.parent = null;\n }\n this._children = [];\n }\n\n /** Get all children */\n get children(): ReadonlyArray<Widget> { return this._children; }\n\n /**\n * Build the LayoutNode tree for this widget.\n * Stores a reference so we can sync computed rects back via syncLayout().\n */\n getLayoutNode(): LayoutNode {\n const childNodes = this._children\n .filter(c => c.style.visible !== false)\n .map(c => c.getLayoutNode());\n\n this._layoutNode = createLayoutNode(this.id, this._style, childNodes);\n return this._layoutNode;\n }\n\n /**\n * After computeLayout() has been called, sync the computed rects\n * from the layout tree back into widget `_rect` fields.\n * This MUST be called after computeLayout() and before render().\n */\n syncLayout(): void {\n if (this._layoutNode) {\n this._rect = { ...this._layoutNode.computed };\n }\n\n // Sync children (match visible children to layout node children)\n const visibleChildren = this._children.filter(c => c.style.visible !== false);\n for (let i = 0; i < visibleChildren.length; i++) {\n visibleChildren[i].syncLayout();\n }\n }\n\n /**\n * Render this widget (and children) into the screen buffer.\n * Automatically pushes a clip region if overflow is hidden (default).\n */\n render(screen: Screen): void {\n if (this._style.visible === false) return;\n\n // Push clip region if overflow is hidden (default style)\n const shouldClip = this._style.overflow !== 'visible';\n if (shouldClip) {\n screen.pushClip(this._rect);\n }\n\n // Render own content\n this._renderSelf(screen);\n\n // Render border\n this._renderBorder(screen);\n\n // Render children\n for (const child of this._children) {\n child.render(screen);\n }\n\n // Pop clip region\n if (shouldClip) {\n screen.popClip();\n }\n }\n\n /**\n * Override this to render the widget's own content.\n * The rect is available as `this._rect`.\n */\n protected abstract _renderSelf(screen: Screen): void;\n\n /**\n * Update the computed rect from layout results.\n */\n updateRect(rect: Rect): void {\n this._rect = rect;\n }\n\n /**\n * Mark this widget as needing re-render.\n * Propagates up to parent so the render loop can detect changes.\n */\n markDirty(): void {\n if (this._dirty) return; // Already dirty\n this._dirty = true;\n this.parent?.markDirty();\n }\n\n /**\n * Clear the dirty flag after rendering.\n */\n clearDirty(): void {\n this._dirty = false;\n for (const child of this._children) {\n child.clearDirty();\n }\n }\n\n /** Check if this widget (or any child) needs re-rendering */\n get isDirty(): boolean { return this._dirty; }\n\n /**\n * Render the border around this widget, including focus ring if focused.\n */\n protected _renderBorder(screen: Screen): void {\n const border = this._style.border;\n const hasBorder = border && border !== 'none';\n const showFocusRing = this.isFocused && this.focusable\n && this._style.focusRingStyle !== 'none';\n\n if (!hasBorder && !showFocusRing) return;\n\n const { x, y, width, height } = this._rect;\n if (width < 2 || height < 2) return;\n\n if (hasBorder) {\n const chars = getBorderChars(border);\n if (!chars) return;\n\n const attrs = styleToCellAttrs(this._style);\n const borderFg = this._style.borderColor ?? attrs.fg;\n\n // Use focus ring color when focused, otherwise normal border color\n const fg = showFocusRing\n ? (this._style.focusRingColor ?? { type: 'named' as const, name: 'cyan' as const })\n : borderFg;\n const cellStyle = { fg };\n\n // Top edge\n screen.setCell(x, y, { char: chars.topLeft, ...cellStyle });\n for (let c = 1; c < width - 1; c++) {\n screen.setCell(x + c, y, { char: chars.top, ...cellStyle });\n }\n screen.setCell(x + width - 1, y, { char: chars.topRight, ...cellStyle });\n\n // Bottom edge\n screen.setCell(x, y + height - 1, { char: chars.bottomLeft, ...cellStyle });\n for (let c = 1; c < width - 1; c++) {\n screen.setCell(x + c, y + height - 1, { char: chars.bottom, ...cellStyle });\n }\n screen.setCell(x + width - 1, y + height - 1, { char: chars.bottomRight, ...cellStyle });\n\n // Left and right edges\n for (let r = 1; r < height - 1; r++) {\n screen.setCell(x, y + r, { char: chars.left, ...cellStyle });\n screen.setCell(x + width - 1, y + r, { char: chars.right, ...cellStyle });\n }\n } else if (showFocusRing) {\n // No border — render corner bracket focus indicators\n const fg = this._style.focusRingColor ?? { type: 'named' as const, name: 'cyan' as const };\n const cellStyle = { fg, bold: true };\n\n // Top-left corner\n screen.setCell(x, y, { char: '┌', ...cellStyle });\n if (width > 2) screen.setCell(x + 1, y, { char: '─', ...cellStyle });\n\n // Top-right corner\n screen.setCell(x + width - 1, y, { char: '┐', ...cellStyle });\n if (width > 2) screen.setCell(x + width - 2, y, { char: '─', ...cellStyle });\n\n // Bottom-left corner\n screen.setCell(x, y + height - 1, { char: '└', ...cellStyle });\n if (width > 2) screen.setCell(x + 1, y + height - 1, { char: '─', ...cellStyle });\n\n // Bottom-right corner\n screen.setCell(x + width - 1, y + height - 1, { char: '┘', ...cellStyle });\n if (width > 2) screen.setCell(x + width - 2, y + height - 1, { char: '─', ...cellStyle });\n\n // Short vertical marks if tall enough\n if (height > 2) {\n screen.setCell(x, y + 1, { char: '│', ...cellStyle });\n screen.setCell(x + width - 1, y + 1, { char: '│', ...cellStyle });\n screen.setCell(x, y + height - 2, { char: '│', ...cellStyle });\n screen.setCell(x + width - 1, y + height - 2, { char: '│', ...cellStyle });\n }\n }\n }\n\n /**\n * Get the inner content area (after border + padding).\n */\n protected _getContentRect(): Rect {\n const padding = normalizeEdges(this._style.padding);\n const border = this._style.border && this._style.border !== 'none' ? 1 : 0;\n\n return {\n x: this._rect.x + padding.left + border,\n y: this._rect.y + padding.top + border,\n width: Math.max(0, this._rect.width - padding.left - padding.right - border * 2),\n height: Math.max(0, this._rect.height - padding.top - padding.bottom - border * 2),\n };\n }\n\n /**\n * Check if a point hits this widget.\n */\n hitTest(x: number, y: number): boolean {\n return containsPoint(this._rect, x, y);\n }\n\n /** Lifecycle: called when the widget is mounted */\n mount(): void {\n this.events.emit('mount', undefined as any);\n for (const child of this._children) {\n child.mount();\n }\n }\n\n /** Lifecycle: called when the widget is unmounted */\n unmount(): void {\n for (const child of this._children) {\n child.unmount();\n }\n this.events.emit('unmount', undefined as any);\n }\n}\n","// ─────────────────────────────────────────────────────\n// @termuijs/widgets — Box widget\n// ─────────────────────────────────────────────────────\n\nimport type { Screen, Style } from '@termuijs/core';\nimport { styleToCellAttrs } from '@termuijs/core';\nimport { Widget } from '../base/Widget.js';\n\n/**\n * Box — the fundamental container widget, similar to a `<div>`.\n *\n * Supports:\n * - Flexbox layout (row/column)\n * - Border styles (single/double/round/heavy/dashed)\n * - Padding and margin\n * - Background color\n */\nexport class Box extends Widget {\n constructor(style: Partial<Style> = {}) {\n super(style);\n }\n\n protected _renderSelf(screen: Screen): void {\n const { bg } = styleToCellAttrs(this._style);\n if (bg.type === 'none') return;\n\n const { x, y, width, height } = this._rect;\n const border = this._style.border && this._style.border !== 'none' ? 1 : 0;\n\n // Fill background\n for (let r = border; r < height - border; r++) {\n for (let c = border; c < width - border; c++) {\n screen.setCell(x + c, y + r, { char: ' ', bg });\n }\n }\n }\n}\n","// ─────────────────────────────────────────────────────\n// @termuijs/widgets — Text widget\n// ─────────────────────────────────────────────────────\n\nimport { type Screen, type Style, styleToCellAttrs, wordWrap, stringWidth } from '@termuijs/core';\nimport { Widget } from '../base/Widget.js';\n\nexport interface TextProps {\n content: string;\n wrap?: boolean;\n align?: 'left' | 'center' | 'right';\n /** Vertical scroll offset (lines to skip from top). Default: 0. */\n scrollY?: number;\n /** Horizontal scroll offset (columns to skip from left). Default: 0. */\n scrollX?: number;\n}\n\n/**\n * Text — renders a string of text with word-wrapping, alignment, and scrolling.\n */\nexport class Text extends Widget {\n private _content: string;\n private _wrap: boolean;\n private _align: 'left' | 'center' | 'right';\n private _scrollY: number;\n private _scrollX: number;\n\n constructor(content: string, style: Partial<Style> = {}, props: Partial<TextProps> = {}) {\n super(style);\n this._content = content;\n this._wrap = props.wrap ?? true;\n this._align = props.align ?? 'left';\n this._scrollY = props.scrollY ?? 0;\n this._scrollX = props.scrollX ?? 0;\n }\n\n /** Update the text content */\n setContent(content: string): void {\n this._content = content;\n this.markDirty();\n }\n\n /** Get current text content */\n getContent(): string {\n return this._content;\n }\n\n /** Set vertical scroll offset (lines to skip). */\n setScrollY(offset: number): void {\n this._scrollY = Math.max(0, offset);\n this.markDirty();\n }\n\n /** Set horizontal scroll offset (columns to skip). */\n setScrollX(offset: number): void {\n this._scrollX = Math.max(0, offset);\n this.markDirty();\n }\n\n /** Get the total number of lines after wrapping. */\n getLineCount(): number {\n const contentRect = this._getContentRect();\n const text = this._wrap ? wordWrap(this._content, contentRect.width) : this._content;\n return text.split('\\n').length;\n }\n\n protected _renderSelf(screen: Screen): void {\n const contentRect = this._getContentRect();\n const { x, y, width, height } = contentRect;\n if (width <= 0 || height <= 0) return;\n\n const attrs = styleToCellAttrs(this._style);\n\n // Word-wrap if enabled\n let text = this._wrap ? wordWrap(this._content, width) : this._content;\n const allLines = text.split('\\n');\n\n // Apply vertical scroll\n const startLine = Math.min(this._scrollY, allLines.length);\n const visibleLines = allLines.slice(startLine, startLine + height);\n\n for (let i = 0; i < Math.min(visibleLines.length, height); i++) {\n let line = visibleLines[i];\n if (line === undefined) continue;\n\n // Apply horizontal scroll\n if (this._scrollX > 0) {\n // Skip scrollX characters\n let skipped = 0;\n let charIndex = 0;\n for (const ch of line) {\n if (skipped >= this._scrollX) break;\n skipped++;\n charIndex += ch.length;\n }\n line = line.slice(charIndex);\n }\n\n const lineWidth = stringWidth(line);\n\n // Apply alignment\n let offsetX = 0;\n if (this._align === 'center') {\n offsetX = Math.floor((width - lineWidth) / 2);\n } else if (this._align === 'right') {\n offsetX = width - lineWidth;\n }\n\n screen.writeString(x + Math.max(0, offsetX), y + i, line, attrs);\n }\n }\n}\n\n","// ─────────────────────────────────────────────────────\n// @termuijs/widgets — LogView widget (scrollable log)\n// ─────────────────────────────────────────────────────\n\nimport { type Screen, type Style, type Color, styleToCellAttrs, truncate } from '@termuijs/core';\nimport { Widget } from '../base/Widget.js';\n\nexport interface LogViewOptions {\n /** Highlight rules: keyword → color */\n highlight?: Record<string, Color>;\n /** Auto-scroll to bottom */\n autoScroll?: boolean;\n}\n\n/**\n * LogView — scrollable, highlighted log output.\n *\n * Supports keyword-based color highlighting (ERROR → red, WARN → yellow, etc.)\n */\nexport class LogView extends Widget {\n private _lines: string[] = [];\n private _scrollOffset = 0;\n private _highlight: Record<string, Color>;\n private _autoScroll: boolean;\n\n constructor(style: Partial<Style> = {}, opts: LogViewOptions = {}) {\n super(style);\n this._highlight = opts.highlight ?? {\n ERROR: { type: 'named', name: 'red' },\n WARN: { type: 'named', name: 'yellow' },\n INFO: { type: 'named', name: 'green' },\n DEBUG: { type: 'named', name: 'brightBlack' },\n };\n this._autoScroll = opts.autoScroll ?? true;\n }\n\n setLines(lines: string[]): void {\n this._lines = lines;\n if (this._autoScroll) {\n this._scrollToBottom();\n }\n this.markDirty();\n }\n\n appendLine(line: string): void {\n this._lines.push(line);\n if (this._autoScroll) {\n this._scrollToBottom();\n }\n this.markDirty();\n }\n\n scrollUp(n = 1): void {\n this._scrollOffset = Math.max(0, this._scrollOffset - n);\n }\n\n scrollDown(n = 1): void {\n this._scrollOffset = Math.min(\n Math.max(0, this._lines.length - 1),\n this._scrollOffset + n,\n );\n }\n\n private _scrollToBottom(): void {\n const rect = this._getContentRect();\n const visibleLines = Math.max(1, rect.height);\n this._scrollOffset = Math.max(0, this._lines.length - visibleLines);\n }\n\n protected _renderSelf(screen: Screen): void {\n const rect = this._getContentRect();\n const { x, y, width, height } = rect;\n if (width <= 0 || height <= 0) return;\n\n const attrs = styleToCellAttrs(this._style);\n const visibleLines = this._lines.slice(this._scrollOffset, this._scrollOffset + height);\n\n for (let i = 0; i < Math.min(visibleLines.length, height); i++) {\n const line = truncate(visibleLines[i], width);\n const lineColor = this._getLineColor(line);\n\n screen.writeString(x, y + i, line, {\n ...attrs,\n ...(lineColor ? { fg: lineColor } : {}),\n });\n }\n }\n\n private _getLineColor(line: string): Color | null {\n for (const [keyword, color] of Object.entries(this._highlight)) {\n if (line.includes(keyword)) return color;\n }\n return null;\n }\n}\n","// ─────────────────────────────────────────────────────\n// @termuijs/widgets — List widget (selectable)\n// ─────────────────────────────────────────────────────\n\nimport { type Screen, type Style, styleToCellAttrs, stringWidth, truncate } from '@termuijs/core';\nimport { Widget } from '../base/Widget.js';\n\nexport interface ListItem {\n label: string;\n value: string;\n disabled?: boolean;\n}\n\n/**\n * List — a scrollable, selectable list of items.\n *\n * Supports:\n * - Keyboard navigation (up/down/Home/End)\n * - Scrolling when items exceed visible height\n * - Custom item styling\n * - Disabled items\n */\nexport class List extends Widget {\n private _items: ListItem[];\n private _selectedIndex = 0;\n private _scrollOffset = 0;\n private _onSelect?: (item: ListItem, index: number) => void;\n\n constructor(\n items: ListItem[],\n style: Partial<Style> = {},\n onSelect?: (item: ListItem, index: number) => void,\n ) {\n super({ border: 'single', ...style });\n this._items = items;\n this._onSelect = onSelect;\n this.focusable = true;\n }\n\n get selectedIndex(): number { return this._selectedIndex; }\n get selectedItem(): ListItem | undefined { return this._items[this._selectedIndex]; }\n\n setItems(items: ListItem[]): void {\n this._items = items;\n this._selectedIndex = Math.min(this._selectedIndex, items.length - 1);\n this._clampScroll();\n this.markDirty();\n }\n\n /** Move selection up */\n selectPrev(): void {\n let next = this._selectedIndex - 1;\n while (next >= 0 && this._items[next].disabled) next--;\n if (next >= 0) {\n this._selectedIndex = next;\n this._clampScroll();\n this.markDirty();\n }\n }\n\n /** Move selection down */\n selectNext(): void {\n let next = this._selectedIndex + 1;\n while (next < this._items.length && this._items[next].disabled) next++;\n if (next < this._items.length) {\n this._selectedIndex = next;\n this._clampScroll();\n this.markDirty();\n }\n }\n\n /** Confirm the current selection */\n confirm(): void {\n const item = this._items[this._selectedIndex];\n if (item && !item.disabled) {\n this._onSelect?.(item, this._selectedIndex);\n }\n }\n\n protected _renderSelf(screen: Screen): void {\n const rect = this._getContentRect();\n const { x, y, width, height } = rect;\n if (width <= 0 || height <= 0) return;\n\n const attrs = styleToCellAttrs(this._style);\n const visibleCount = Math.min(this._items.length - this._scrollOffset, height);\n\n for (let i = 0; i < visibleCount; i++) {\n const itemIdx = this._scrollOffset + i;\n const item = this._items[itemIdx];\n const isSelected = itemIdx === this._selectedIndex;\n\n // Compose the line\n const prefix = isSelected ? '▸ ' : ' ';\n let line = prefix + item.label;\n line = truncate(line, width);\n\n // Style\n const cellStyle = {\n ...attrs,\n bold: isSelected,\n dim: item.disabled ?? false,\n inverse: isSelected && this.isFocused,\n };\n\n screen.writeString(x, y + i, line, cellStyle);\n\n // Fill rest of line for inverse highlight\n if (isSelected && this.isFocused) {\n const remaining = width - stringWidth(line);\n for (let c = 0; c < remaining; c++) {\n screen.setCell(x + stringWidth(line) + c, y + i, { char: ' ', ...cellStyle });\n }\n }\n }\n\n // Scrollbar indicator\n if (this._items.length > height) {\n const scrollRatio = this._scrollOffset / (this._items.length - height);\n const scrollPos = Math.floor(scrollRatio * (height - 1));\n for (let r = 0; r < height; r++) {\n const scrollChar = r === scrollPos ? '█' : '░';\n screen.setCell(x + width - 1, y + r, { char: scrollChar, ...attrs, dim: true });\n }\n }\n }\n\n private _clampScroll(): void {\n const rect = this._getContentRect();\n const visibleHeight = rect.height;\n if (visibleHeight <= 0) { this._scrollOffset = 0; return; }\n\n if (this._selectedIndex < this._scrollOffset) {\n this._scrollOffset = this._selectedIndex;\n }\n if (this._selectedIndex >= this._scrollOffset + visibleHeight) {\n this._scrollOffset = this._selectedIndex - visibleHeight + 1;\n }\n }\n}\n","// ─────────────────────────────────────────────────────\n// @termuijs/widgets — TextInput widget\n// ─────────────────────────────────────────────────────\n\nimport { type Screen, type Style, styleToCellAttrs, stringWidth, truncate } from '@termuijs/core';\nimport { Widget } from '../base/Widget.js';\n\n/**\n * TextInput — a single-line text input field.\n *\n * Supports:\n * - Cursor movement (left/right/Home/End)\n * - Character insertion and deletion\n * - Placeholder text\n * - Password masking\n * - Max length constraint\n */\nexport class TextInput extends Widget {\n private _value = '';\n private _cursorPos = 0;\n private _placeholder: string;\n private _mask: string | null;\n private _maxLength: number;\n private _onChange?: (value: string) => void;\n private _onSubmit?: (value: string) => void;\n\n constructor(\n style: Partial<Style> = {},\n options: {\n placeholder?: string;\n mask?: string;\n maxLength?: number;\n onChange?: (value: string) => void;\n onSubmit?: (value: string) => void;\n } = {},\n ) {\n super({ border: 'single', height: 3, ...style });\n this._placeholder = options.placeholder ?? '';\n this._mask = options.mask ?? null;\n this._maxLength = options.maxLength ?? Infinity;\n this._onChange = options.onChange;\n this._onSubmit = options.onSubmit;\n this.focusable = true;\n }\n\n get value(): string { return this._value; }\n set value(v: string) {\n this._value = v.slice(0, this._maxLength);\n this._cursorPos = Math.min(this._cursorPos, this._value.length);\n }\n\n /**\n * Handle a typed character.\n */\n insertChar(char: string): void {\n if (this._value.length >= this._maxLength) return;\n this._value =\n this._value.slice(0, this._cursorPos) +\n char +\n this._value.slice(this._cursorPos);\n this._cursorPos++;\n this._onChange?.(this._value);\n }\n\n /**\n * Delete the character before the cursor.\n */\n deleteBack(): void {\n if (this._cursorPos > 0) {\n this._value =\n this._value.slice(0, this._cursorPos - 1) +\n this._value.slice(this._cursorPos);\n this._cursorPos--;\n this._onChange?.(this._value);\n }\n }\n\n /**\n * Delete the character after the cursor.\n */\n deleteForward(): void {\n if (this._cursorPos < this._value.length) {\n this._value =\n this._value.slice(0, this._cursorPos) +\n this._value.slice(this._cursorPos + 1);\n this._onChange?.(this._value);\n }\n }\n\n moveCursorLeft(): void { this._cursorPos = Math.max(0, this._cursorPos - 1); }\n moveCursorRight(): void { this._cursorPos = Math.min(this._value.length, this._cursorPos + 1); }\n moveCursorHome(): void { this._cursorPos = 0; }\n moveCursorEnd(): void { this._cursorPos = this._value.length; }\n submit(): void { this._onSubmit?.(this._value); }\n clear(): void { this._value = ''; this._cursorPos = 0; this._onChange?.(''); }\n\n protected _renderSelf(screen: Screen): void {\n const rect = this._getContentRect();\n const { x, y, width, height } = rect;\n if (width <= 0 || height <= 0) return;\n\n const attrs = styleToCellAttrs(this._style);\n\n if (this._value.length === 0 && !this.isFocused) {\n // Show placeholder\n screen.writeString(x, y, truncate(this._placeholder, width), { ...attrs, dim: true });\n return;\n }\n\n // Display value (optionally masked)\n const displayValue = this._mask\n ? this._mask.repeat(this._value.length)\n : this._value;\n\n // Scroll the view if cursor is beyond visible area\n const visibleWidth = width - 1; // Leave room for cursor\n let scrollX = 0;\n if (this._cursorPos > visibleWidth) {\n scrollX = this._cursorPos - visibleWidth;\n }\n\n const visibleText = displayValue.slice(scrollX, scrollX + visibleWidth);\n screen.writeString(x, y, visibleText, attrs);\n\n // Draw cursor when focused\n if (this.isFocused) {\n const cursorScreenPos = x + this._cursorPos - scrollX;\n if (cursorScreenPos >= x && cursorScreenPos < x + width) {\n const cursorChar = this._cursorPos < displayValue.length\n ? displayValue[this._cursorPos]\n : ' ';\n screen.setCell(cursorScreenPos, y, {\n char: cursorChar,\n ...attrs,\n inverse: true,\n });\n }\n }\n }\n}\n","// ─────────────────────────────────────────────────────\n// @termuijs/widgets — VirtualList (scroll virtualization)\n//\n// Renders only the visible rows of a large dataset.\n// Supports keyboard navigation, custom item rendering,\n// and variable-height items.\n//\n// Usage:\n// const list = new VirtualList({\n// totalItems: 100_000,\n// itemHeight: 1,\n// renderItem: (index) => `Row #${index}`,\n// });\n// ─────────────────────────────────────────────────────\n\nimport { type Screen, type Style, styleToCellAttrs, truncate, stringWidth } from '@termuijs/core';\nimport { Widget } from '../base/Widget.js';\n\nexport interface VirtualListOptions {\n /** Total number of items (the full dataset size) */\n totalItems: number;\n /** Height of each item in rows (default: 1) */\n itemHeight?: number;\n /** Render function: returns the string content for an item at a given index */\n renderItem: (index: number) => string;\n /** Style overrides */\n style?: Partial<Style>;\n /** Callback when an item is selected (Enter key) */\n onSelect?: (index: number) => void;\n /** Number of overscan rows to render above/below the viewport (default: 2) */\n overscan?: number;\n /** Show scrollbar (default: true) */\n showScrollbar?: boolean;\n}\n\n/**\n * VirtualList — a scroll-virtualized list widget.\n *\n * Only renders the items visible in the viewport plus\n * a small overscan buffer, enabling smooth scrolling\n * through datasets of any size.\n *\n * Performance:\n * - 100 items → renders ~26 rows\n * - 1,000,000 items → still renders only ~26 rows\n */\nexport class VirtualList extends Widget {\n private _totalItems: number;\n private _itemHeight: number;\n private _renderItem: (index: number) => string;\n private _onSelect?: (index: number) => void;\n private _selectedIndex = 0;\n private _scrollOffset = 0;\n private _overscan: number;\n private _showScrollbar: boolean;\n\n constructor(options: VirtualListOptions) {\n super({ border: 'single', ...options.style });\n this._totalItems = options.totalItems;\n this._itemHeight = options.itemHeight ?? 1;\n this._renderItem = options.renderItem;\n this._onSelect = options.onSelect;\n this._overscan = options.overscan ?? 2;\n this._showScrollbar = options.showScrollbar ?? true;\n this.focusable = true;\n }\n\n // ── Getters ──\n\n get totalItems(): number { return this._totalItems; }\n get selectedIndex(): number { return this._selectedIndex; }\n get scrollOffset(): number { return this._scrollOffset; }\n\n // ── Public API ──\n\n /** Update the total item count (e.g., after data refresh) */\n setTotalItems(count: number): void {\n this._totalItems = count;\n this._selectedIndex = Math.min(this._selectedIndex, Math.max(0, count - 1));\n this._clampScroll();\n this.markDirty();\n }\n\n /** Update the render function (e.g., when data changes) */\n setRenderItem(fn: (index: number) => string): void {\n this._renderItem = fn;\n this.markDirty();\n }\n\n /** Move selection up by one */\n selectPrev(): void {\n if (this._selectedIndex > 0) {\n this._selectedIndex--;\n this._clampScroll();\n this.markDirty();\n }\n }\n\n /** Move selection down by one */\n selectNext(): void {\n if (this._selectedIndex < this._totalItems - 1) {\n this._selectedIndex++;\n this._clampScroll();\n this.markDirty();\n }\n }\n\n /** Jump to the first item */\n selectFirst(): void {\n this._selectedIndex = 0;\n this._clampScroll();\n this.markDirty();\n }\n\n /** Jump to the last item */\n selectLast(): void {\n this._selectedIndex = Math.max(0, this._totalItems - 1);\n this._clampScroll();\n this.markDirty();\n }\n\n /** Page up — move by viewport height */\n pageUp(): void {\n const rect = this._getContentRect();\n const pageSize = Math.floor(rect.height / this._itemHeight);\n this._selectedIndex = Math.max(0, this._selectedIndex - pageSize);\n this._clampScroll();\n this.markDirty();\n }\n\n /** Page down — move by viewport height */\n pageDown(): void {\n const rect = this._getContentRect();\n const pageSize = Math.floor(rect.height / this._itemHeight);\n this._selectedIndex = Math.min(this._totalItems - 1, this._selectedIndex + pageSize);\n this._clampScroll();\n this.markDirty();\n }\n\n /** Scroll to a specific index */\n scrollTo(index: number): void {\n this._selectedIndex = Math.max(0, Math.min(index, this._totalItems - 1));\n this._clampScroll();\n this.markDirty();\n }\n\n /** Confirm the current selection */\n confirm(): void {\n if (this._totalItems > 0) {\n this._onSelect?.(this._selectedIndex);\n }\n }\n\n // ── Rendering ──\n\n protected _renderSelf(screen: Screen): void {\n const rect = this._getContentRect();\n const { x, y, width, height } = rect;\n if (width <= 0 || height <= 0 || this._totalItems === 0) return;\n\n const attrs = styleToCellAttrs(this._style);\n const visibleItemCount = Math.floor(height / this._itemHeight);\n\n // Calculate the visible window with overscan\n const startIdx = Math.max(0, this._scrollOffset - this._overscan);\n const endIdx = Math.min(this._totalItems, this._scrollOffset + visibleItemCount + this._overscan);\n\n // Content width (leave room for scrollbar)\n const contentWidth = this._showScrollbar && this._totalItems > visibleItemCount\n ? width - 1\n : width;\n\n // Only render items in the visible window\n for (let idx = startIdx; idx < endIdx; idx++) {\n const rowY = y + (idx - this._scrollOffset) * this._itemHeight;\n\n // Skip if outside the visible rect\n if (rowY < y || rowY >= y + height) continue;\n\n const isSelected = idx === this._selectedIndex;\n\n // Get the item content\n let content: string;\n try {\n content = this._renderItem(idx);\n } catch {\n content = `[Error: item ${idx}]`;\n }\n\n // Add selection prefix\n const prefix = isSelected ? '▸ ' : ' ';\n let line = prefix + content;\n line = truncate(line, contentWidth);\n\n // Style\n const cellStyle = {\n ...attrs,\n bold: isSelected,\n inverse: isSelected && this.isFocused,\n };\n\n screen.writeString(x, rowY, line, cellStyle);\n\n // Fill rest of line for inverse highlight\n if (isSelected && this.isFocused) {\n const remaining = contentWidth - stringWidth(line);\n for (let c = 0; c < remaining; c++) {\n screen.setCell(x + stringWidth(line) + c, rowY, { char: ' ', ...cellStyle });\n }\n }\n }\n\n // Scrollbar\n if (this._showScrollbar && this._totalItems > visibleItemCount) {\n const scrollbarX = x + width - 1;\n const totalPages = this._totalItems - visibleItemCount;\n const scrollRatio = totalPages > 0 ? this._scrollOffset / totalPages : 0;\n const thumbPos = Math.floor(scrollRatio * (height - 1));\n\n for (let r = 0; r < height; r++) {\n const scrollChar = r === thumbPos ? '█' : '░';\n screen.setCell(scrollbarX, y + r, { char: scrollChar, ...attrs, dim: r !== thumbPos });\n }\n }\n }\n\n // ── Internal ──\n\n private _clampScroll(): void {\n const rect = this._getContentRect();\n const visibleHeight = Math.floor(rect.height / this._itemHeight);\n if (visibleHeight <= 0) { this._scrollOffset = 0; return; }\n\n // Keep selected item visible\n if (this._selectedIndex < this._scrollOffset) {\n this._scrollOffset = this._selectedIndex;\n }\n if (this._selectedIndex >= this._scrollOffset + visibleHeight) {\n this._scrollOffset = this._selectedIndex - visibleHeight + 1;\n }\n\n // Clamp scroll offset\n this._scrollOffset = Math.max(0, Math.min(this._scrollOffset, this._totalItems - visibleHeight));\n }\n}\n","// ─────────────────────────────────────────────────────\n// @termuijs/widgets — Table widget\n// ─────────────────────────────────────────────────────\n\nimport { type Screen, type Style, type Color, styleToCellAttrs, stringWidth, truncate } from '@termuijs/core';\nimport { Widget } from '../base/Widget.js';\n\nexport interface TableColumn {\n /** Column header label */\n header: string;\n /** Key to pull data from row objects */\n key: string;\n /** Fixed width (chars). If omitted, auto-distributes. */\n width?: number;\n /** Text alignment within the column */\n align?: 'left' | 'center' | 'right';\n}\n\nexport type TableRow = Record<string, string | number>;\n\nexport interface TableOptions {\n /** Whether to show the header row */\n showHeader?: boolean;\n /** Color for the header row */\n headerColor?: Color;\n /** Whether rows are zebra-striped */\n stripe?: boolean;\n /** Stripe color */\n stripeColor?: Color;\n /** Column separator character */\n separator?: string;\n}\n\n/**\n * Table — renders tabular data with columns, headers, and optional zebra-striping.\n *\n * Supports:\n * - Auto-width column distribution\n * - Fixed and percentage widths\n * - Header styling\n * - Zebra striping\n * - Text alignment per column\n * - Truncation for overflow\n */\nexport class Table extends Widget {\n private _columns: TableColumn[];\n private _rows: TableRow[];\n private _showHeader: boolean;\n private _headerColor: Color;\n private _stripe: boolean;\n private _stripeColor: Color;\n private _separator: string;\n\n constructor(\n columns: TableColumn[],\n rows: TableRow[],\n style: Partial<Style> = {},\n options: TableOptions = {},\n ) {\n super(style);\n this._columns = columns;\n this._rows = rows;\n this._showHeader = options.showHeader ?? true;\n this._headerColor = options.headerColor ?? { type: 'named', name: 'cyan' };\n this._stripe = options.stripe ?? true;\n this._stripeColor = options.stripeColor ?? { type: 'named', name: 'brightBlack' };\n this._separator = options.separator ?? ' │ ';\n }\n\n setRows(rows: TableRow[]): void {\n this._rows = rows;\n this.markDirty();\n }\n\n protected _renderSelf(screen: Screen): void {\n const rect = this._getContentRect();\n const { x, y, width, height } = rect;\n if (width <= 0 || height <= 0) return;\n\n const attrs = styleToCellAttrs(this._style);\n const sepWidth = stringWidth(this._separator);\n\n // Calculate column widths\n const colWidths = this._computeColumnWidths(\n width - (this._columns.length - 1) * sepWidth,\n );\n\n let row = 0;\n\n // Render header\n if (this._showHeader && row < height) {\n let cx = x;\n for (let c = 0; c < this._columns.length; c++) {\n const col = this._columns[c];\n const cellText = this._alignText(col.header, colWidths[c], col.align ?? 'left');\n screen.writeString(cx, y + row, cellText, {\n ...attrs,\n fg: this._headerColor,\n bold: true,\n });\n cx += colWidths[c];\n if (c < this._columns.length - 1) {\n screen.writeString(cx, y + row, this._separator, { ...attrs, dim: true });\n cx += sepWidth;\n }\n }\n row++;\n\n // Header separator line\n if (row < height) {\n const sepLine = '─'.repeat(width);\n screen.writeString(x, y + row, sepLine, { ...attrs, dim: true });\n row++;\n }\n }\n\n // Render data rows\n for (let r = 0; r < this._rows.length && row < height; r++) {\n const dataRow = this._rows[r];\n const isStripe = this._stripe && r % 2 === 1;\n let cx = x;\n\n for (let c = 0; c < this._columns.length; c++) {\n const col = this._columns[c];\n const rawValue = String(dataRow[col.key] ?? '');\n const cellText = this._alignText(rawValue, colWidths[c], col.align ?? 'left');\n\n screen.writeString(cx, y + row, cellText, {\n ...attrs,\n bg: isStripe ? this._stripeColor : attrs.bg,\n });\n cx += colWidths[c];\n if (c < this._columns.length - 1) {\n screen.writeString(cx, y + row, this._separator, {\n ...attrs,\n dim: true,\n bg: isStripe ? this._stripeColor : attrs.bg,\n });\n cx += sepWidth;\n }\n }\n\n // Fill remaining width for stripe\n if (isStripe) {\n for (let fx = cx; fx < x + width; fx++) {\n screen.setCell(fx, y + row, { char: ' ', bg: this._stripeColor });\n }\n }\n\n row++;\n }\n }\n\n private _computeColumnWidths(totalWidth: number): number[] {\n const fixedCols = this._columns.filter(c => c.width !== undefined);\n const flexCols = this._columns.filter(c => c.width === undefined);\n\n let usedWidth = fixedCols.reduce((sum, c) => sum + (c.width ?? 0), 0);\n const remainingWidth = Math.max(0, totalWidth - usedWidth);\n const flexWidth = flexCols.length > 0 ? Math.floor(remainingWidth / flexCols.length) : 0;\n\n return this._columns.map(c => c.width ?? flexWidth);\n }\n\n private _alignText(text: string, width: number, align: 'left' | 'center' | 'right'): string {\n const truncated = truncate(text, width);\n const textWidth = stringWidth(truncated);\n const pad = Math.max(0, width - textWidth);\n\n switch (align) {\n case 'right':\n return ' '.repeat(pad) + truncated;\n case 'center': {\n const left = Math.floor(pad / 2);\n const right = pad - left;\n return ' '.repeat(left) + truncated + ' '.repeat(right);\n }\n case 'left':\n default:\n return truncated + ' '.repeat(pad);\n }\n }\n}\n","// ─────────────────────────────────────────────────────\n// @termuijs/widgets — Gauge widget (label + bar + value)\n// ─────────────────────────────────────────────────────\n\nimport { type Screen, type Style, type Color, styleToCellAttrs, stringWidth } from '@termuijs/core';\nimport { Widget } from '../base/Widget.js';\n\nexport interface GaugeOptions {\n /** Color of the filled portion */\n color?: Color;\n /** Show percentage label */\n showLabel?: boolean;\n}\n\n/**\n * Gauge — a self-contained metric display with label, bar, and value.\n *\n * Example:\n * CPU ████████░░░░ 65%\n */\nexport class Gauge extends Widget {\n private _label: string;\n private _value: number = 0;\n private _color: Color;\n private _showLabel: boolean;\n\n constructor(label: string, style: Partial<Style> = {}, opts: GaugeOptions = {}) {\n super(style);\n this._label = label;\n this._color = opts.color ?? { type: 'named', name: 'green' };\n this._showLabel = opts.showLabel ?? true;\n }\n\n setValue(value: number): void {\n this._value = Math.max(0, Math.min(1, value));\n this.markDirty();\n }\n\n getValue(): number {\n return this._value;\n }\n\n setLabel(label: string): void {\n this._label = label;\n this.markDirty();\n }\n\n protected _renderSelf(screen: Screen): void {\n const rect = this._getContentRect();\n const { x, y, width, height } = rect;\n if (width <= 0 || height <= 0) return;\n\n const attrs = styleToCellAttrs(this._style);\n\n // Layout: \"Label ████████░░░░ XX%\"\n const labelStr = this._label + ' ';\n const percentStr = this._showLabel ? ` ${Math.round(this._value * 100)}%` : '';\n const labelWidth = stringWidth(labelStr);\n const percentWidth = stringWidth(percentStr);\n const barWidth = Math.max(0, width - labelWidth - percentWidth);\n\n // Render label\n screen.writeString(x, y, labelStr, { ...attrs, bold: true });\n\n // Render bar\n const filled = Math.round(barWidth * this._value);\n const barX = x + labelWidth;\n for (let i = 0; i < barWidth; i++) {\n const char = i < filled ? '█' : '░';\n screen.setCell(barX + i, y, {\n char,\n fg: i < filled ? this._color : { type: 'named', name: 'brightBlack' },\n });\n }\n\n // Render percentage\n if (this._showLabel) {\n screen.writeString(barX + barWidth, y, percentStr, {\n ...attrs,\n bold: true,\n });\n }\n }\n}\n","// ─────────────────────────────────────────────────────\n// @termuijs/widgets — Sparkline widget (braille chart)\n// ─────────────────────────────────────────────────────\n\nimport { type Screen, type Style, type Color, styleToCellAttrs } from '@termuijs/core';\nimport { Widget } from '../base/Widget.js';\n\nexport interface SparklineOptions {\n /** Color of the sparkline */\n color?: Color;\n /** Show min/max labels */\n showRange?: boolean;\n}\n\n// Braille sparkline characters (8 levels per cell, bottom to top)\nconst SPARK_CHARS = ['▁', '▂', '▃', '▄', '▅', '▆', '▇', '█'];\n\n/**\n * Sparkline — a compact inline chart showing a data trend.\n *\n * Example:\n * Latency ▂▃▅▇▅▃▂▁▃▅█▅▃\n */\nexport class Sparkline extends Widget {\n private _label: string;\n private _data: number[] = [];\n private _color: Color;\n private _showRange: boolean;\n\n constructor(label: string, style: Partial<Style> = {}, opts: SparklineOptions = {}) {\n super(style);\n this._label = label;\n this._color = opts.color ?? { type: 'named', name: 'cyan' };\n this._showRange = opts.showRange ?? false;\n }\n\n setData(data: number[]): void {\n this._data = data;\n this.markDirty();\n }\n\n pushValue(value: number): void {\n this._data.push(value);\n this.markDirty();\n }\n\n protected _renderSelf(screen: Screen): void {\n const rect = this._getContentRect();\n const { x, y, width, height } = rect;\n if (width <= 0 || height <= 0) return;\n\n const attrs = styleToCellAttrs(this._style);\n const labelStr = this._label + ' ';\n const labelWidth = labelStr.length;\n\n // Render label\n screen.writeString(x, y, labelStr, { ...attrs, bold: true });\n\n // Available sparkline width\n const sparkWidth = width - labelWidth;\n if (sparkWidth <= 0 || this._data.length === 0) return;\n\n // Take the most recent data points that fit\n const data = this._data.slice(-sparkWidth);\n\n // Normalize data to 0–7 range\n const min = Math.min(...data);\n const max = Math.max(...data);\n const range = max - min || 1;\n\n for (let i = 0; i < data.length; i++) {\n const normalized = (data[i] - min) / range;\n const charIdx = Math.min(7, Math.floor(normalized * 8));\n screen.setCell(x + labelWidth + i, y, {\n char: SPARK_CHARS[charIdx],\n fg: this._color,\n });\n }\n\n // Optional range labels on second line\n if (this._showRange && height > 1) {\n const rangeStr = `${min.toFixed(0)}–${max.toFixed(0)}`;\n screen.writeString(x + labelWidth, y + 1, rangeStr, {\n ...attrs,\n dim: true,\n });\n }\n }\n}\n","// ─────────────────────────────────────────────────────\n// @termuijs/widgets — StatusIndicator widget\n// ─────────────────────────────────────────────────────\n\nimport { type Screen, type Style, type Color, styleToCellAttrs } from '@termuijs/core';\nimport { Widget } from '../base/Widget.js';\n\nexport interface StatusIndicatorOptions {\n /** Color when up/active */\n upColor?: Color;\n /** Color when down/inactive */\n downColor?: Color;\n}\n\n/**\n * StatusIndicator — simple up/down indicator with label.\n *\n * Example:\n * ● API Server — Online\n * ○ Worker — Offline\n */\nexport class StatusIndicator extends Widget {\n private _label: string;\n private _isUp: boolean;\n private _upColor: Color;\n private _downColor: Color;\n\n constructor(label: string, isUp: boolean, style: Partial<Style> = {}, opts: StatusIndicatorOptions = {}) {\n super(style);\n this._label = label;\n this._isUp = isUp;\n this._upColor = opts.upColor ?? { type: 'named', name: 'green' };\n this._downColor = opts.downColor ?? { type: 'named', name: 'red' };\n }\n\n setStatus(isUp: boolean): void {\n this._isUp = isUp;\n }\n\n getStatus(): boolean {\n return this._isUp;\n }\n\n setLabel(label: string): void {\n this._label = label;\n }\n\n protected _renderSelf(screen: Screen): void {\n const rect = this._getContentRect();\n const { x, y, width, height } = rect;\n if (width <= 0 || height <= 0) return;\n\n const attrs = styleToCellAttrs(this._style);\n const dot = this._isUp ? '●' : '○';\n const statusText = this._isUp ? 'Online' : 'Offline';\n const color = this._isUp ? this._upColor : this._downColor;\n\n screen.setCell(x, y, { char: dot, fg: color });\n screen.writeString(x + 2, y, `${this._label} — ${statusText}`, {\n ...attrs,\n fg: color,\n });\n }\n}\n","// ─────────────────────────────────────────────────────\n// @termuijs/widgets — BarChart widget\n// Grouped bar chart with vertical and horizontal modes.\n// ─────────────────────────────────────────────────────\n\nimport {\n type Screen, type Style, type Color,\n styleToCellAttrs, stringWidth,\n VERTICAL_BAR_SYMBOLS, HORIZONTAL_BAR_SYMBOLS,\n} from '@termuijs/core';\nimport { Widget } from '../base/Widget.js';\n\n// ── Types ────────────────────────────────────────────\n\nexport interface Bar {\n value: number;\n label?: string;\n color?: Color;\n}\n\nexport interface BarGroup {\n label?: string;\n bars: Bar[];\n}\n\nexport type BarChartDirection = 'vertical' | 'horizontal';\n\nexport interface BarChartOptions {\n /** Direction bars grow. Default: 'vertical'. */\n direction?: BarChartDirection;\n /** Width of each bar in cells. Default: 1. */\n barWidth?: number;\n /** Gap between bars in a group. Default: 1. */\n barGap?: number;\n /** Gap between groups. Default: 2. */\n groupGap?: number;\n /** Max value for scaling. Auto-detected if not set. */\n max?: number;\n /** Color for bars without a per-bar color. */\n barColor?: Color;\n /** Color for value labels. */\n valueColor?: Color;\n /** Color for text labels. */\n labelColor?: Color;\n}\n\n// ── Widget ───────────────────────────────────────────\n\nexport class BarChart extends Widget {\n private _data: BarGroup[] = [];\n private _direction: BarChartDirection;\n private _barWidth: number;\n private _barGap: number;\n private _groupGap: number;\n private _max?: number;\n private _barColor: Color;\n private _valueColor: Color;\n private _labelColor: Color;\n\n constructor(data: BarGroup[], style: Partial<Style> = {}, opts: BarChartOptions = {}) {\n super(style);\n this._data = data;\n this._direction = opts.direction ?? 'vertical';\n this._barWidth = opts.barWidth ?? 1;\n this._barGap = opts.barGap ?? 1;\n this._groupGap = opts.groupGap ?? 2;\n this._max = opts.max;\n this._barColor = opts.barColor ?? { type: 'named', name: 'cyan' };\n this._valueColor = opts.valueColor ?? { type: 'named', name: 'white' };\n this._labelColor = opts.labelColor ?? { type: 'named', name: 'brightBlack' };\n }\n\n setData(data: BarGroup[]): void {\n this._data = data;\n this.markDirty();\n }\n\n setMax(max: number | undefined): void {\n this._max = max;\n this.markDirty();\n }\n\n protected _renderSelf(screen: Screen): void {\n const rect = this._getContentRect();\n const { x, y, width, height } = rect;\n if (width <= 0 || height <= 0 || this._data.length === 0) return;\n\n const maxVal = this._computeMax();\n if (maxVal === 0) return;\n\n if (this._direction === 'vertical') {\n this._renderVertical(screen, x, y, width, height, maxVal);\n } else {\n this._renderHorizontal(screen, x, y, width, height, maxVal);\n }\n }\n\n private _computeMax(): number {\n if (this._max !== undefined) return this._max;\n let max = 0;\n for (const group of this._data) {\n for (const bar of group.bars) {\n if (bar.value > max) max = bar.value;\n }\n }\n return max;\n }\n\n // ── Vertical Rendering ───────────────────────────\n\n private _renderVertical(\n screen: Screen, ox: number, oy: number,\n width: number, height: number, maxVal: number,\n ): void {\n const valueRows = 1;\n const hasLabels = this._data.some(g =>\n g.bars.some(b => b.label !== undefined)\n );\n const labelRows = hasLabels ? 1 : 0;\n const hasGroupLabels = this._data.some(g => g.label !== undefined);\n const groupLabelRows = hasGroupLabels ? 1 : 0;\n const reservedRows = valueRows + labelRows + groupLabelRows;\n\n if (height <= reservedRows) return;\n\n const barAreaHeight = height - reservedRows;\n let cx = ox;\n\n for (let gi = 0; gi < this._data.length; gi++) {\n const group = this._data[gi];\n if (!group) continue;\n const groupStartX = cx;\n\n for (let bi = 0; bi < group.bars.length; bi++) {\n const bar = group.bars[bi];\n if (!bar) continue;\n if (cx + this._barWidth > ox + width) break;\n\n const color = bar.color ?? this._barColor;\n\n // Draw bar from bottom up using sub-cell symbols (8 levels per cell)\n const scaledHeight = (bar.value / maxVal) * (barAreaHeight * 8);\n let remaining = Math.round(scaledHeight);\n\n for (let row = barAreaHeight - 1; row >= 0; row--) {\n if (remaining <= 0) break;\n const level = Math.min(remaining, 8);\n const symbol = VERTICAL_BAR_SYMBOLS[level] ?? ' ';\n const cellY = oy + row;\n\n for (let col = 0; col < this._barWidth; col++) {\n const cellX = cx + col;\n if (cellX < ox + width) {\n screen.setCell(cellX, cellY, { char: symbol, fg: color });\n }\n }\n remaining -= 8;\n }\n\n // Value text below bar\n const valStr = Math.round(bar.value).toString();\n const valX = cx + Math.floor((this._barWidth - stringWidth(valStr)) / 2);\n screen.writeString(\n Math.max(cx, valX), oy + barAreaHeight,\n valStr.slice(0, this._barWidth),\n { fg: this._valueColor },\n );\n\n // Bar label below value\n if (hasLabels && bar.label) {\n const label = bar.label.slice(0, this._barWidth);\n const labelX = cx + Math.floor((this._barWidth - stringWidth(label)) / 2);\n screen.writeString(\n Math.max(cx, labelX), oy + barAreaHeight + valueRows,\n label,\n { fg: this._labelColor },\n );\n }\n\n cx += this._barWidth;\n if (bi < group.bars.length - 1) cx += this._barGap;\n }\n\n // Group label at bottom\n if (hasGroupLabels && group.label) {\n const groupWidth = cx - groupStartX;\n const label = group.label.slice(0, groupWidth);\n const labelX = groupStartX + Math.floor((groupWidth - stringWidth(label)) / 2);\n screen.writeString(\n Math.max(groupStartX, labelX), oy + height - 1,\n label,\n { fg: this._labelColor },\n );\n }\n\n if (gi < this._data.length - 1) cx += this._groupGap;\n }\n }\n\n // ── Horizontal Rendering ─────────────────────────\n\n private _renderHorizontal(\n screen: Screen, ox: number, oy: number,\n width: number, height: number, maxVal: number,\n ): void {\n // Compute label column width\n let maxLabelWidth = 0;\n let maxValueWidth = 0;\n for (const group of this._data) {\n for (const bar of group.bars) {\n if (bar.label) {\n const w = stringWidth(bar.label);\n if (w > maxLabelWidth) maxLabelWidth = w;\n }\n const vw = Math.round(bar.value).toString().length;\n if (vw > maxValueWidth) maxValueWidth = vw;\n }\n }\n\n const labelColWidth = maxLabelWidth > 0 ? maxLabelWidth + 1 : 0;\n const valueColWidth = maxValueWidth > 0 ? maxValueWidth + 1 : 0;\n const barAreaWidth = width - labelColWidth - valueColWidth;\n\n if (barAreaWidth <= 0) return;\n\n let cy = oy;\n\n for (let gi = 0; gi < this._data.length; gi++) {\n const group = this._data[gi];\n if (!group) continue;\n\n for (let bi = 0; bi < group.bars.length; bi++) {\n const bar = group.bars[bi];\n if (!bar) continue;\n\n for (let row = 0; row < this._barWidth; row++) {\n const cellY = cy + row;\n if (cellY >= oy + height) break;\n\n // Label on first row\n if (row === 0 && bar.label) {\n const label = bar.label.slice(0, maxLabelWidth);\n const padded = label.padStart(maxLabelWidth);\n screen.writeString(ox, cellY, padded, { fg: this._labelColor });\n }\n\n // Draw horizontal bar using sub-cell symbols\n const color = bar.color ?? this._barColor;\n const scaledWidth = (bar.value / maxVal) * (barAreaWidth * 8);\n let remaining = Math.round(scaledWidth);\n const barStartX = ox + labelColWidth;\n\n for (let col = 0; col < barAreaWidth; col++) {\n if (remaining <= 0) break;\n const level = Math.min(remaining, 8);\n const symbol = HORIZONTAL_BAR_SYMBOLS[level] ?? ' ';\n screen.setCell(barStartX + col, cellY, { char: symbol, fg: color });\n remaining -= 8;\n }\n\n // Value text on first row\n if (row === 0) {\n const valStr = Math.round(bar.value).toString();\n screen.writeString(\n ox + labelColWidth + barAreaWidth, cellY,\n ` ${valStr}`,\n { fg: this._valueColor },\n );\n }\n }\n\n cy += this._barWidth;\n if (bi < group.bars.length - 1) cy += this._barGap;\n }\n\n if (gi < this._data.length - 1) cy += this._groupGap;\n }\n }\n}\n","// ─────────────────────────────────────────────────────\n// @termuijs/widgets — ProgressBar widget\n// ─────────────────────────────────────────────────────\n\nimport { type Screen, type Style, styleToCellAttrs, type Color } from '@termuijs/core';\nimport { Widget } from '../base/Widget.js';\n\nexport interface ProgressBarOptions {\n /** Current value (0–1) */\n value?: number;\n /** Character for the filled portion */\n fillChar?: string;\n /** Character for the empty portion */\n emptyChar?: string;\n /** Color of the filled portion */\n fillColor?: Color;\n /** Show percentage label */\n showLabel?: boolean;\n /** Label format: 'percent' | 'fraction' | 'custom' */\n labelFormat?: 'percent' | 'fraction';\n /** Total for fraction display */\n total?: number;\n}\n\n/**\n * ProgressBar — horizontal progress indicator.\n *\n * Supports:\n * - Configurable fill/empty characters\n * - Custom fill color\n * - Percentage or fraction label\n * - Smooth animation-ready value changes\n */\nexport class ProgressBar extends Widget {\n private _value: number;\n private _fillChar: string;\n private _emptyChar: string;\n private _fillColor: Color;\n private _showLabel: boolean;\n private _labelFormat: 'percent' | 'fraction';\n private _total: number;\n\n constructor(style: Partial<Style> = {}, options: ProgressBarOptions = {}) {\n super({ height: 1, ...style });\n this._value = Math.max(0, Math.min(1, options.value ?? 0));\n this._fillChar = options.fillChar ?? '█';\n this._emptyChar = options.emptyChar ?? '░';\n this._fillColor = options.fillColor ?? { type: 'named', name: 'green' };\n this._showLabel = options.showLabel ?? true;\n this._labelFormat = options.labelFormat ?? 'percent';\n this._total = options.total ?? 100;\n }\n\n /** Set progress value (0–1) */\n setValue(value: number): void {\n this._value = Math.max(0, Math.min(1, value));\n this.markDirty();\n }\n\n get value(): number { return this._value; }\n\n protected _renderSelf(screen: Screen): void {\n const rect = this._getContentRect();\n const { x, y, width } = rect;\n if (width <= 0) return;\n\n const attrs = styleToCellAttrs(this._style);\n\n // Label\n let label = '';\n if (this._showLabel) {\n if (this._labelFormat === 'percent') {\n label = ` ${Math.round(this._value * 100)}%`;\n } else {\n label = ` ${Math.round(this._value * this._total)}/${this._total}`;\n }\n }\n\n const barWidth = Math.max(0, width - label.length);\n const filled = Math.round(barWidth * this._value);\n const empty = barWidth - filled;\n\n // Render bar\n for (let i = 0; i < filled; i++) {\n screen.setCell(x + i, y, { char: this._fillChar, ...attrs, fg: this._fillColor });\n }\n for (let i = 0; i < empty; i++) {\n screen.setCell(x + filled + i, y, { char: this._emptyChar, ...attrs, dim: true });\n }\n\n // Render label\n if (label) {\n screen.writeString(x + barWidth, y, label, { ...attrs, bold: true });\n }\n }\n}\n","// ─────────────────────────────────────────────────────\n// @termuijs/widgets — Spinner widget\n// ─────────────────────────────────────────────────────\n\nimport { type Screen, type Style, styleToCellAttrs, type Color } from '@termuijs/core';\nimport { Widget } from '../base/Widget.js';\n\n/**\n * Built-in spinner frame sets.\n */\nexport const SPINNER_FRAMES: Record<string, { frames: string[]; interval: number }> = {\n dots: {\n frames: ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'],\n interval: 80,\n },\n line: {\n frames: ['-', '\\\\', '|', '/'],\n interval: 130,\n },\n star: {\n frames: ['✶', '✸', '✹', '✺', '✹', '✷'],\n interval: 70,\n },\n arc: {\n frames: ['◜', '◠', '◝', '◞', '◡', '◟'],\n interval: 100,\n },\n circle: {\n frames: ['◐', '◓', '◑', '◒'],\n interval: 120,\n },\n bounce: {\n frames: ['⠁', '⠂', '⠄', '⠂'],\n interval: 120,\n },\n arrow: {\n frames: ['←', '↖', '↑', '↗', '→', '↘', '↓', '↙'],\n interval: 100,\n },\n clock: {\n frames: ['🕐', '🕑', '🕒', '🕓', '🕔', '🕕', '🕖', '🕗', '🕘', '🕙', '🕚', '🕛'],\n interval: 100,\n },\n};\n\nexport interface SpinnerOptions {\n /** Spinner preset name or custom frames */\n spinner?: string | { frames: string[]; interval: number };\n /** Text label displayed after the spinner */\n label?: string;\n /** Color for the spinner frames */\n color?: Color;\n}\n\n/**\n * Spinner — animated loading indicator.\n *\n * Supports:\n * - 8 built-in spinner presets\n * - Custom frame sequences\n * - Configurable color and label\n * - Automatic frame advancement via tick()\n */\nexport class Spinner extends Widget {\n private _frames: string[];\n private _interval: number;\n private _frameIndex = 0;\n private _label: string;\n private _color: Color;\n private _lastTick = 0;\n private _elapsed = 0;\n\n constructor(style: Partial<Style> = {}, options: SpinnerOptions = {}) {\n super({ height: 1, ...style });\n\n const spinnerDef = typeof options.spinner === 'string'\n ? (SPINNER_FRAMES[options.spinner] ?? SPINNER_FRAMES.dots)\n : (options.spinner ?? SPINNER_FRAMES.dots);\n\n this._frames = spinnerDef.frames;\n this._interval = spinnerDef.interval;\n this._label = options.label ?? '';\n this._color = options.color ?? { type: 'named', name: 'cyan' };\n }\n\n /** Update the spinner label */\n setLabel(label: string): void {\n this._label = label;\n }\n\n /**\n * Advance the spinner frame based on elapsed time.\n * Call this with a delta (ms) from the render loop.\n */\n tick(deltaMs: number): void {\n this._elapsed += deltaMs;\n if (this._elapsed >= this._interval) {\n this._frameIndex = (this._frameIndex + 1) % this._frames.length;\n this._elapsed = 0;\n }\n }\n\n protected _renderSelf(screen: Screen): void {\n const rect = this._getContentRect();\n const { x, y, width } = rect;\n if (width <= 0) return;\n\n const attrs = styleToCellAttrs(this._style);\n const frame = this._frames[this._frameIndex];\n\n // Render spinner character\n screen.writeString(x, y, frame, { ...attrs, fg: this._color });\n\n // Render label\n if (this._label) {\n screen.writeString(x + 2, y, this._label, attrs);\n }\n }\n}\n","// ─────────────────────────────────────────────────────\n// @termuijs/widgets — Scrollbar widget\n// Proportional scrollbar with 4 orientation modes.\n// ─────────────────────────────────────────────────────\n\nimport {\n type Screen, type Style, type Color,\n ScrollbarSets,\n} from '@termuijs/core';\nimport { Widget } from '../base/Widget.js';\n\n// ── Types ────────────────────────────────────────────\n\nexport type ScrollbarOrientation =\n | 'verticalRight'\n | 'verticalLeft'\n | 'horizontalBottom'\n | 'horizontalTop';\n\nexport interface ScrollbarOptions {\n /** Total number of content items. */\n contentLength: number;\n /** Number of items visible in the viewport. */\n viewportLength: number;\n /** Current scroll position (0-based). */\n position?: number;\n /** Scrollbar orientation. Default: 'verticalRight'. */\n orientation?: ScrollbarOrientation;\n /** Color of the thumb. */\n thumbColor?: Color;\n /** Color of the track. */\n trackColor?: Color;\n /** Show begin/end arrow symbols. Default: true. */\n showArrows?: boolean;\n}\n\n// ── Widget ───────────────────────────────────────────\n\nexport class Scrollbar extends Widget {\n private _contentLength: number;\n private _viewportLength: number;\n private _position: number;\n private _orientation: ScrollbarOrientation;\n private _thumbColor: Color;\n private _trackColor: Color;\n private _showArrows: boolean;\n\n constructor(style: Partial<Style> = {}, opts: ScrollbarOptions) {\n super(style);\n this._contentLength = opts.contentLength;\n this._viewportLength = opts.viewportLength;\n this._position = opts.position ?? 0;\n this._orientation = opts.orientation ?? 'verticalRight';\n this._thumbColor = opts.thumbColor ?? { type: 'named', name: 'white' };\n this._trackColor = opts.trackColor ?? { type: 'named', name: 'brightBlack' };\n this._showArrows = opts.showArrows ?? true;\n }\n\n setPosition(position: number): void {\n this._position = position;\n this.markDirty();\n }\n\n setContentLength(length: number): void {\n this._contentLength = length;\n this.markDirty();\n }\n\n setViewportLength(length: number): void {\n this._viewportLength = length;\n this.markDirty();\n }\n\n protected _renderSelf(screen: Screen): void {\n const rect = this._getContentRect();\n const { x, y, width, height } = rect;\n if (width <= 0 || height <= 0 || this._contentLength <= 0) return;\n if (this._contentLength <= this._viewportLength) return;\n\n const vertical = this._orientation === 'verticalRight'\n || this._orientation === 'verticalLeft';\n\n const symbols = vertical\n ? ScrollbarSets.VERTICAL\n : ScrollbarSets.HORIZONTAL;\n\n // Determine track position\n const trackX = this._orientation === 'verticalLeft' ? x\n : this._orientation === 'verticalRight' ? x + width - 1\n : x;\n const trackY = this._orientation === 'horizontalTop' ? y\n : this._orientation === 'horizontalBottom' ? y + height - 1\n : y;\n\n const totalLength = vertical ? height : width;\n if (totalLength <= 0) return;\n\n let trackStart = 0;\n let trackLength = totalLength;\n\n // Draw arrow symbols\n if (this._showArrows && totalLength > 2) {\n const beginX = vertical ? trackX : x;\n const beginY = vertical ? y : trackY;\n screen.setCell(beginX, beginY, {\n char: symbols.begin,\n fg: this._trackColor,\n });\n\n const endX = vertical ? trackX : x + totalLength - 1;\n const endY = vertical ? y + totalLength - 1 : trackY;\n screen.setCell(endX, endY, {\n char: symbols.end,\n fg: this._trackColor,\n });\n\n trackStart = 1;\n trackLength -= 2;\n }\n\n if (trackLength <= 0) return;\n\n // Compute thumb size and position\n const thumbSize = Math.max(1, Math.floor(\n (trackLength * this._viewportLength) / this._contentLength\n ));\n const maxScroll = Math.max(1, this._contentLength - this._viewportLength);\n const thumbOffset = Math.min(\n trackLength - thumbSize,\n Math.floor((this._position * (trackLength - thumbSize)) / maxScroll),\n );\n\n // Draw track and thumb\n for (let i = 0; i < trackLength; i++) {\n const pos = trackStart + i;\n const cellX = vertical ? trackX : x + pos;\n const cellY = vertical ? y + pos : trackY;\n\n const isThumb = i >= thumbOffset && i < thumbOffset + thumbSize;\n\n screen.setCell(cellX, cellY, {\n char: isThumb ? symbols.thumb : symbols.track,\n fg: isThumb ? this._thumbColor : this._trackColor,\n });\n }\n }\n}\n"],"mappings":"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","names":["import_core","import_core","import_core","import_core","import_core","import_core","import_core","import_core","import_core","import_core","import_core","import_core","import_core","import_core"]}
|