@termuijs/ui 0.1.4 → 0.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -4
- package/dist/index.cjs +7420 -1175
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1594 -5
- package/dist/index.d.ts +1594 -5
- package/dist/index.js +7483 -1160
- package/dist/index.js.map +1 -1
- package/package.json +17 -9
- package/LICENSE +0 -21
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/Divider.ts","../src/Spacer.ts","../src/Tabs.ts","../src/Modal.ts","../src/Select.ts","../src/MultiSelect.ts","../src/Tree.ts","../src/Toast.ts","../src/ConfirmDialog.ts","../src/Form.ts","../src/CommandPalette.ts","../src/prompts.ts","../src/NotificationCenter.ts","../src/PasswordInput.ts","../src/NumberInput.ts","../src/PathInput.ts","../src/KeyboardShortcuts.ts"],"sourcesContent":["// ─────────────────────────────────────────────────────\n// @termuijs/ui — Rich Component Library\n//\n// The shadcn/ui for terminals — 16+ production-ready\n// components for building beautiful CLI apps.\n// ─────────────────────────────────────────────────────\n\n// ── Re-exports from @termuijs/widgets (base components) ──\nexport {\n Box,\n Text,\n Table,\n List,\n TextInput,\n Gauge,\n Sparkline,\n StatusIndicator,\n LogView,\n ProgressBar,\n Spinner,\n Widget,\n} from '@termuijs/widgets';\n\n// ── New components ──\nexport { Divider } from './Divider.js';\nexport type { DividerOptions } from './Divider.js';\n\nexport { Spacer } from './Spacer.js';\n\nexport { Tabs } from './Tabs.js';\nexport type { Tab, TabsOptions } from './Tabs.js';\n\nexport { Modal } from './Modal.js';\nexport type { ModalOptions } from './Modal.js';\n\nexport { Select } from './Select.js';\nexport type { SelectOption, SelectOptions } from './Select.js';\n\nexport { MultiSelect } from './MultiSelect.js';\nexport type { MultiSelectOption, MultiSelectOptions } from './MultiSelect.js';\n\nexport { Tree } from './Tree.js';\nexport type { TreeNode, TreeOptions } from './Tree.js';\n\nexport { Toast } from './Toast.js';\nexport type { ToastType, ToastMessage, ToastOptions } from './Toast.js';\n\nexport { ConfirmDialog } from './ConfirmDialog.js';\nexport type { ConfirmDialogOptions } from './ConfirmDialog.js';\n\nexport { Form } from './Form.js';\nexport type { FormField, FormOptions } from './Form.js';\n\nexport { CommandPalette } from './CommandPalette.js';\nexport type { Command, CommandPaletteOptions } from './CommandPalette.js';\n\nexport { prompt, NonInteractiveError } from './prompts.js';\nexport type { TextPromptOptions, ConfirmPromptOptions, SelectPromptOptions } from './prompts.js';\n\nexport { NotificationCenter, NotificationStore, notifications, useNotifications } from './NotificationCenter.js';\nexport type { Notification, NotificationCenterOptions } from './NotificationCenter.js';\n\nexport { PasswordInput } from './PasswordInput.js';\nexport type { PasswordInputOptions } from './PasswordInput.js';\n\nexport { NumberInput } from './NumberInput.js';\nexport type { NumberInputOptions } from './NumberInput.js';\n\nexport { PathInput } from './PathInput.js';\nexport type { PathInputOptions } from './PathInput.js';\n\nexport { KeyboardShortcuts } from './KeyboardShortcuts.js';\nexport type { ShortcutBinding, KeyboardShortcutsOptions } from './KeyboardShortcuts.js';\n","// Divider — horizontal separator line\nimport { Widget } from '@termuijs/widgets';\nimport { type Style, type Screen, mergeStyles, defaultStyle, styleToCellAttrs } from '@termuijs/core';\n\nexport interface DividerOptions {\n char?: string;\n color?: Style['fg'];\n title?: string;\n}\n\nexport class Divider extends Widget {\n private _char: string;\n private _color: Style['fg'];\n private _title: string;\n\n constructor(options: DividerOptions = {}) {\n super(mergeStyles(defaultStyle(), { height: 1 }));\n this._char = options.char ?? '─';\n this._color = options.color;\n this._title = options.title ?? '';\n }\n\n protected _renderSelf(screen: Screen): void {\n const { x, y, width } = this._rect;\n if (width <= 0) return;\n const attrs = styleToCellAttrs(this.style);\n if (this._color) attrs.fg = this._color;\n attrs.dim = true;\n if (this._title) {\n const titleStr = ` ${this._title} `;\n const padLeft = Math.max(0, Math.floor((width - titleStr.length) / 2));\n const padRight = Math.max(0, width - padLeft - titleStr.length);\n const line = this._char.repeat(padLeft) + titleStr + this._char.repeat(padRight);\n screen.writeString(x, y, line.slice(0, width), attrs);\n } else {\n screen.writeString(x, y, this._char.repeat(width), attrs);\n }\n }\n}\n","// Spacer — flexible empty space\nimport { Widget } from '@termuijs/widgets';\nimport { type Screen, mergeStyles, defaultStyle } from '@termuijs/core';\n\nexport class Spacer extends Widget {\n constructor(grow: number = 1) {\n super(mergeStyles(defaultStyle(), { flexGrow: grow }));\n }\n protected _renderSelf(_screen: Screen): void { /* empty */ }\n}\n","// Tabs — tabbed container with keyboard switching\nimport { Widget } from '@termuijs/widgets';\nimport { type Style, type Screen, mergeStyles, defaultStyle, styleToCellAttrs, caps } from '@termuijs/core';\n\nexport interface Tab { label: string; content: Widget; }\nexport interface TabsOptions {\n activeColor?: Style['fg'];\n inactiveColor?: Style['fg'];\n border?: Style['border'];\n}\n\nexport class Tabs extends Widget {\n private _tabs: Tab[] = [];\n private _activeIndex = 0;\n private _activeColor: Style['fg'];\n private _inactiveColor: Style['fg'];\n focusable = true;\n\n constructor(tabs: Tab[], options: TabsOptions = {}) {\n super(mergeStyles(defaultStyle(), { flexGrow: 1, border: options.border ?? 'single' }));\n this._tabs = tabs;\n this._activeColor = options.activeColor ?? { type: 'named', name: 'cyan' };\n this._inactiveColor = options.inactiveColor ?? { type: 'named', name: 'brightBlack' };\n }\n\n get activeIndex(): number { return this._activeIndex; }\n selectTab(i: number): void { if (i >= 0 && i < this._tabs.length) { this._activeIndex = i; this.markDirty(); } }\n nextTab(): void { this._activeIndex = (this._activeIndex + 1) % this._tabs.length; this.markDirty(); }\n prevTab(): void { this._activeIndex = (this._activeIndex - 1 + this._tabs.length) % this._tabs.length; this.markDirty(); }\n get activeContent(): Widget | undefined { return this._tabs[this._activeIndex]?.content; }\n\n protected _renderSelf(screen: Screen): void {\n const { x, y, width, height } = this._rect;\n if (width <= 0 || height <= 0) return;\n const attrs = styleToCellAttrs(this.style);\n let col = x;\n for (let i = 0; i < this._tabs.length; i++) {\n const tab = this._tabs[i];\n const isActive = i === this._activeIndex;\n const label = isActive ? ` ${caps.unicode ? '●' : '*'} ${tab.label} ` : ` ${tab.label} `;\n screen.writeString(col, y, label, {\n ...attrs,\n fg: isActive ? this._activeColor : this._inactiveColor,\n bold: isActive, dim: !isActive,\n });\n col += label.length;\n if (i < this._tabs.length - 1) { screen.writeString(col, y, caps.unicode ? '│' : '|', { ...attrs, dim: true }); col++; }\n }\n if (height > 1) screen.writeString(x, y + 1, '─'.repeat(width), { ...attrs, dim: true });\n }\n}\n","// Modal — overlay dialog with backdrop\nimport { Widget } from '@termuijs/widgets';\nimport { type Style, type Screen, mergeStyles, defaultStyle, styleToCellAttrs, getBorderChars, caps } from '@termuijs/core';\n\nexport interface ModalOptions {\n title?: string;\n width?: number;\n height?: number;\n borderColor?: Style['fg'];\n backdropChar?: string;\n}\n\nexport class Modal extends Widget {\n private _title: string;\n private _modalWidth: number;\n private _modalHeight: number;\n private _borderColor: Style['fg'];\n private _backdropChar: string;\n private _visible = false;\n private _content: Widget | null = null;\n\n constructor(options: ModalOptions = {}) {\n super(mergeStyles(defaultStyle(), {}));\n this._title = options.title ?? '';\n this._modalWidth = options.width ?? 50;\n this._modalHeight = options.height ?? 15;\n this._borderColor = options.borderColor ?? { type: 'named', name: 'cyan' };\n this._backdropChar = options.backdropChar ?? (caps.unicode ? '░' : ' ');\n }\n\n get visible(): boolean { return this._visible; }\n show(): void { this._visible = true; this.markDirty(); }\n hide(): void { this._visible = false; this.markDirty(); }\n toggle(): void { this._visible = !this._visible; this.markDirty(); }\n setContent(content: Widget): void { this._content = content; this.markDirty(); }\n\n protected _renderSelf(screen: Screen): void {\n if (!this._visible) return;\n const { x, y, width, height } = this._rect;\n const attrs = styleToCellAttrs(this.style);\n // Backdrop\n for (let r = 0; r < height; r++) {\n screen.writeString(x, y + r, this._backdropChar.repeat(width), { ...attrs, dim: true });\n }\n // Centered modal\n const mw = Math.min(this._modalWidth, width - 4);\n const mh = Math.min(this._modalHeight, height - 2);\n const mx = x + Math.floor((width - mw) / 2);\n const my = y + Math.floor((height - mh) / 2);\n const border = getBorderChars('single');\n if (!border) return;\n const bAttrs = { ...attrs, fg: this._borderColor };\n // Title bar\n const titleStr = this._title ? ` ${this._title} ` : '';\n const topFill = mw - 2 - titleStr.length;\n const tl = Math.floor(topFill / 2);\n const tr = topFill - tl;\n screen.writeString(mx, my, border.topLeft + border.top.repeat(tl) + titleStr + border.top.repeat(Math.max(0, tr)) + border.topRight, bAttrs);\n // Sides\n const clr = styleToCellAttrs(this.style);\n for (let r = 1; r < mh - 1; r++) {\n screen.writeString(mx, my + r, border.left, bAttrs);\n screen.writeString(mx + 1, my + r, ' '.repeat(mw - 2), clr);\n screen.writeString(mx + mw - 1, my + r, border.right, bAttrs);\n }\n // Bottom\n screen.writeString(mx, my + mh - 1, border.bottomLeft + border.bottom.repeat(mw - 2) + border.bottomRight, bAttrs);\n // Content\n if (this._content) {\n const cr = { x: mx + 2, y: my + 1, width: mw - 4, height: mh - 2 };\n (this._content as any)._rect = cr;\n (this._content as any)._renderSelf(screen);\n }\n }\n}\n","// Select — single-item dropdown selector\nimport { Widget } from '@termuijs/widgets';\nimport { type Style, type Screen, mergeStyles, defaultStyle, styleToCellAttrs, caps } from '@termuijs/core';\n\nexport interface SelectOption { label: string; value: string; disabled?: boolean; }\nexport interface SelectOptions {\n placeholder?: string;\n activeColor?: Style['fg'];\n onSelect?: (option: SelectOption, index: number) => void;\n}\n\nexport class Select extends Widget {\n private _options: SelectOption[];\n private _selectedIndex = 0;\n private _isOpen = false;\n private _placeholder: string;\n private _activeColor: Style['fg'];\n private _onSelect?: (option: SelectOption, index: number) => void;\n focusable = true;\n\n constructor(options: SelectOption[], config: SelectOptions = {}) {\n super(mergeStyles(defaultStyle(), { height: 1 }));\n this._options = options;\n this._placeholder = config.placeholder ?? 'Select...';\n this._activeColor = config.activeColor ?? { type: 'named', name: 'cyan' };\n this._onSelect = config.onSelect;\n }\n\n get selectedOption(): SelectOption | undefined { return this._options[this._selectedIndex]; }\n get selectedIndex(): number { return this._selectedIndex; }\n get isOpen(): boolean { return this._isOpen; }\n open(): void { this._isOpen = true; this.markDirty(); }\n close(): void { this._isOpen = false; this.markDirty(); }\n toggle(): void { this._isOpen = !this._isOpen; this.markDirty(); }\n\n selectNext(): void {\n let n = this._selectedIndex + 1;\n while (n < this._options.length && this._options[n].disabled) n++;\n if (n < this._options.length) { this._selectedIndex = n; this.markDirty(); }\n }\n selectPrev(): void {\n let n = this._selectedIndex - 1;\n while (n >= 0 && this._options[n].disabled) n--;\n if (n >= 0) { this._selectedIndex = n; this.markDirty(); }\n }\n confirm(): void {\n const opt = this._options[this._selectedIndex];\n if (opt && !opt.disabled) { this._onSelect?.(opt, this._selectedIndex); this._isOpen = false; this.markDirty(); }\n }\n\n protected _renderSelf(screen: Screen): void {\n const { x, y, width } = this._rect;\n if (width <= 0) return;\n const attrs = styleToCellAttrs(this.style);\n const sel = this._options[this._selectedIndex];\n const label = sel ? sel.label : this._placeholder;\n const prefix = this._isOpen ? (caps.unicode ? '▼ ' : 'v ') : (caps.unicode ? '▶ ' : '> ');\n screen.writeString(x, y, prefix + label.slice(0, width - 2), { ...attrs, fg: this._activeColor });\n if (this._isOpen) {\n for (let i = 0; i < this._options.length; i++) {\n const o = this._options[i];\n const isSel = i === this._selectedIndex;\n const m = isSel ? (caps.unicode ? '● ' : '* ') : ' ';\n screen.writeString(x, y + 1 + i, m + o.label.slice(0, width - 2), {\n ...attrs,\n fg: o.disabled ? { type: 'named' as const, name: 'brightBlack' as const } : isSel ? this._activeColor : attrs.fg,\n bold: isSel, dim: o.disabled,\n });\n }\n }\n }\n}\n","// MultiSelect — checkbox-style multi-item selector\nimport { Widget } from '@termuijs/widgets';\nimport { type Style, type Screen, mergeStyles, defaultStyle, styleToCellAttrs, caps } from '@termuijs/core';\n\nexport interface MultiSelectOption { label: string; value: string; disabled?: boolean; }\nexport interface MultiSelectOptions {\n activeColor?: Style['fg'];\n checkChar?: string;\n uncheckChar?: string;\n onSubmit?: (selected: MultiSelectOption[]) => void;\n}\n\nexport class MultiSelect extends Widget {\n private _options: MultiSelectOption[];\n private _cursorIndex = 0;\n private _checked: Set<number> = new Set();\n private _activeColor: Style['fg'];\n private _checkChar: string;\n private _uncheckChar: string;\n private _onSubmit?: (selected: MultiSelectOption[]) => void;\n focusable = true;\n\n constructor(options: MultiSelectOption[], config: MultiSelectOptions = {}) {\n super(mergeStyles(defaultStyle(), { height: Math.max(options.length, 1) }));\n this._options = options;\n this._activeColor = config.activeColor ?? { type: 'named', name: 'cyan' };\n this._checkChar = config.checkChar ?? (caps.unicode ? '◼' : '[x]');\n this._uncheckChar = config.uncheckChar ?? (caps.unicode ? '◻' : '[ ]');\n this._onSubmit = config.onSubmit;\n }\n\n get selectedOptions(): MultiSelectOption[] {\n return [...this._checked].sort().map(i => this._options[i]);\n }\n selectNext(): void { let n = this._cursorIndex + 1; while (n < this._options.length && this._options[n].disabled) n++; if (n < this._options.length) { this._cursorIndex = n; this.markDirty(); } }\n selectPrev(): void { let n = this._cursorIndex - 1; while (n >= 0 && this._options[n].disabled) n--; if (n >= 0) { this._cursorIndex = n; this.markDirty(); } }\n toggleCurrent(): void {\n const o = this._options[this._cursorIndex];\n if (o && !o.disabled) { this._checked.has(this._cursorIndex) ? this._checked.delete(this._cursorIndex) : this._checked.add(this._cursorIndex); this.markDirty(); }\n }\n submit(): void { this._onSubmit?.(this.selectedOptions); }\n\n protected _renderSelf(screen: Screen): void {\n const { x, y, width, height } = this._rect;\n if (width <= 0 || height <= 0) return;\n const attrs = styleToCellAttrs(this.style);\n for (let i = 0; i < this._options.length && i < height; i++) {\n const o = this._options[i];\n const active = i === this._cursorIndex;\n const checked = this._checked.has(i);\n const label = `${active ? (caps.unicode ? '❯ ' : '> ') : ' '}${checked ? this._checkChar : this._uncheckChar} ${o.label}`;\n screen.writeString(x, y + i, label.slice(0, width), {\n ...attrs,\n fg: o.disabled ? { type: 'named' as const, name: 'brightBlack' as const } : active ? this._activeColor : attrs.fg,\n bold: active, dim: o.disabled,\n });\n }\n }\n}\n","// Tree — expandable/collapsible tree view\nimport { Widget } from '@termuijs/widgets';\nimport { type Style, type Screen, mergeStyles, defaultStyle, styleToCellAttrs, caps } from '@termuijs/core';\n\nexport interface TreeNode { label: string; children?: TreeNode[]; expanded?: boolean; icon?: string; }\nexport interface TreeOptions { activeColor?: Style['fg']; onSelect?: (node: TreeNode, path: number[]) => void; }\n\nexport class Tree extends Widget {\n private _roots: TreeNode[];\n private _cursorIndex = 0;\n private _activeColor: Style['fg'];\n private _onSelect?: (node: TreeNode, path: number[]) => void;\n focusable = true;\n\n constructor(roots: TreeNode[], options: TreeOptions = {}) {\n super(mergeStyles(defaultStyle(), { flexGrow: 1 }));\n this._roots = roots;\n this._activeColor = options.activeColor ?? { type: 'named', name: 'cyan' };\n this._onSelect = options.onSelect;\n }\n\n private _flatten(): { node: TreeNode; depth: number; path: number[]; hasChildren: boolean }[] {\n const result: { node: TreeNode; depth: number; path: number[]; hasChildren: boolean }[] = [];\n const walk = (nodes: TreeNode[], depth: number, path: number[]) => {\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i];\n const hasChildren = (node.children?.length ?? 0) > 0;\n result.push({ node, depth, path: [...path, i], hasChildren });\n if (hasChildren && node.expanded) walk(node.children!, depth + 1, [...path, i]);\n }\n };\n walk(this._roots, 0, []);\n return result;\n }\n\n selectNext(): void { const f = this._flatten(); if (this._cursorIndex < f.length - 1) { this._cursorIndex++; this.markDirty(); } }\n selectPrev(): void { if (this._cursorIndex > 0) { this._cursorIndex--; this.markDirty(); } }\n toggleExpand(): void { const f = this._flatten(); const it = f[this._cursorIndex]; if (it?.hasChildren) { it.node.expanded = !it.node.expanded; this.markDirty(); } }\n confirm(): void {\n const f = this._flatten(); const it = f[this._cursorIndex];\n if (it) { it.hasChildren ? this.toggleExpand() : this._onSelect?.(it.node, it.path); }\n }\n\n protected _renderSelf(screen: Screen): void {\n const { x, y, width, height } = this._rect;\n if (width <= 0 || height <= 0) return;\n const attrs = styleToCellAttrs(this.style);\n const flat = this._flatten();\n for (let i = 0; i < flat.length && i < height; i++) {\n const it = flat[i];\n const active = i === this._cursorIndex;\n const indent = ' '.repeat(it.depth);\n const icon = it.hasChildren ? (it.node.expanded ? (caps.unicode ? '▼ ' : 'v ') : (caps.unicode ? '▶ ' : '> ')) : ' ';\n const nodeIcon = it.node.icon ? `${it.node.icon} ` : '';\n const line = `${indent}${icon}${nodeIcon}${it.node.label}`;\n screen.writeString(x, y + i, line.slice(0, width), { ...attrs, fg: active ? this._activeColor : attrs.fg, bold: active });\n }\n }\n}\n","// Toast — auto-dismiss notification\nimport { Widget } from '@termuijs/widgets';\nimport { type Screen, mergeStyles, defaultStyle, styleToCellAttrs, caps } from '@termuijs/core';\n\nexport type ToastType = 'info' | 'success' | 'warning' | 'error';\nexport interface ToastMessage { text: string; type: ToastType; expireAt: number; }\nexport interface ToastOptions { position?: 'top-right' | 'bottom-right' | 'top-left' | 'bottom-left'; durationMs?: number; maxVisible?: number; }\n\nconst ICONS_UNICODE: Record<ToastType, string> = { info: 'ℹ', success: '✓', warning: '⚠', error: '✗' };\nconst ICONS_ASCII: Record<ToastType, string> = { info: 'i', success: '+', warning: '!', error: 'x' };\nconst COLORS: Record<ToastType, string> = { info: 'cyan', success: 'green', warning: 'yellow', error: 'red' };\n\nexport class Toast extends Widget {\n private _messages: ToastMessage[] = [];\n private _position: string;\n private _durationMs: number;\n private _maxVisible: number;\n\n constructor(options: ToastOptions = {}) {\n super(mergeStyles(defaultStyle(), {}));\n this._position = options.position ?? 'top-right';\n this._durationMs = options.durationMs ?? 3000;\n this._maxVisible = options.maxVisible ?? 5;\n }\n\n push(text: string, type: ToastType = 'info'): void { this._messages.push({ text, type, expireAt: Date.now() + this._durationMs }); this.markDirty(); }\n info(text: string): void { this.push(text, 'info'); }\n success(text: string): void { this.push(text, 'success'); }\n warning(text: string): void { this.push(text, 'warning'); }\n error(text: string): void { this.push(text, 'error'); }\n\n protected _renderSelf(screen: Screen): void {\n const now = Date.now();\n this._messages = this._messages.filter(m => m.expireAt > now);\n if (this._messages.length === 0) return;\n const { x, y, width, height } = this._rect;\n const visible = this._messages.slice(-this._maxVisible);\n const tw = Math.min(40, width - 2);\n const isRight = this._position.includes('right');\n const isBottom = this._position.includes('bottom');\n const sx = isRight ? x + width - tw - 1 : x + 1;\n const sy = isBottom ? y + height - visible.length - 1 : y + 1;\n const icons = caps.unicode ? ICONS_UNICODE : ICONS_ASCII;\n const attrs = styleToCellAttrs(this.style);\n for (let i = 0; i < visible.length; i++) {\n const m = visible[i];\n const label = ` ${icons[m.type]} ${m.text} `.slice(0, tw).padEnd(tw);\n screen.writeString(sx, sy + i, label, { ...attrs, fg: { type: 'named', name: COLORS[m.type] as any }, bold: true });\n }\n }\n}\n","// ConfirmDialog — yes/no prompt overlay\nimport { Widget } from '@termuijs/widgets';\nimport { type Style, type Screen, mergeStyles, defaultStyle, styleToCellAttrs, getBorderChars } from '@termuijs/core';\n\nexport interface ConfirmDialogOptions {\n message: string;\n confirmLabel?: string;\n cancelLabel?: string;\n borderColor?: Style['fg'];\n onConfirm?: () => void;\n onCancel?: () => void;\n}\n\nexport class ConfirmDialog extends Widget {\n private _message: string;\n private _confirmLabel: string;\n private _cancelLabel: string;\n private _borderColor: Style['fg'];\n private _selected: 'confirm' | 'cancel' = 'confirm';\n private _visible = false;\n private _onConfirm?: () => void;\n private _onCancel?: () => void;\n focusable = true;\n\n constructor(options: ConfirmDialogOptions) {\n super(mergeStyles(defaultStyle(), {}));\n this._message = options.message;\n this._confirmLabel = options.confirmLabel ?? 'Yes';\n this._cancelLabel = options.cancelLabel ?? 'No';\n this._borderColor = options.borderColor ?? { type: 'named', name: 'yellow' };\n this._onConfirm = options.onConfirm;\n this._onCancel = options.onCancel;\n }\n\n get visible(): boolean { return this._visible; }\n show(): void { this._visible = true; this._selected = 'confirm'; this.markDirty(); }\n hide(): void { this._visible = false; this.markDirty(); }\n selectConfirm(): void { this._selected = 'confirm'; this.markDirty(); }\n selectCancel(): void { this._selected = 'cancel'; this.markDirty(); }\n toggleSelection(): void { this._selected = this._selected === 'confirm' ? 'cancel' : 'confirm'; this.markDirty(); }\n confirm(): void {\n (this._selected === 'confirm' ? this._onConfirm : this._onCancel)?.();\n this._visible = false;\n this.markDirty();\n }\n\n protected _renderSelf(screen: Screen): void {\n if (!this._visible) return;\n const { x, y, width, height } = this._rect;\n const attrs = styleToCellAttrs(this.style);\n for (let r = 0; r < height; r++) screen.writeString(x, y + r, '░'.repeat(width), { ...attrs, dim: true });\n const bw = Math.min(40, width - 4);\n const bh = 5;\n const bx = x + Math.floor((width - bw) / 2);\n const by = y + Math.floor((height - bh) / 2);\n const border = getBorderChars('single');\n if (!border) return;\n const ba = { ...attrs, fg: this._borderColor };\n screen.writeString(bx, by, border.topLeft + border.top.repeat(bw - 2) + border.topRight, ba);\n for (let r = 1; r < bh - 1; r++) {\n screen.writeString(bx, by + r, border.left, ba);\n screen.writeString(bx + 1, by + r, ' '.repeat(bw - 2), attrs);\n screen.writeString(bx + bw - 1, by + r, border.right, ba);\n }\n screen.writeString(bx, by + bh - 1, border.bottomLeft + border.bottom.repeat(bw - 2) + border.bottomRight, ba);\n screen.writeString(bx + 2, by + 1, this._message.slice(0, bw - 4), { ...attrs, bold: true });\n const yesStr = this._selected === 'confirm' ? ` [${this._confirmLabel}] ` : ` ${this._confirmLabel} `;\n const noStr = this._selected === 'cancel' ? ` [${this._cancelLabel}] ` : ` ${this._cancelLabel} `;\n screen.writeString(bx + 2, by + 3, yesStr, { ...attrs, fg: this._selected === 'confirm' ? { type: 'named', name: 'green' } : attrs.fg, bold: this._selected === 'confirm' });\n screen.writeString(bx + 2 + yesStr.length + 2, by + 3, noStr, { ...attrs, fg: this._selected === 'cancel' ? { type: 'named', name: 'red' } : attrs.fg, bold: this._selected === 'cancel' });\n }\n}\n","// Form — compound input container with validation\nimport { Widget } from '@termuijs/widgets';\nimport { type Style, type Screen, mergeStyles, defaultStyle, styleToCellAttrs } from '@termuijs/core';\n\nexport interface FormField {\n name: string; label: string; type: 'text' | 'select' | 'checkbox';\n placeholder?: string; required?: boolean; options?: string[];\n validate?: (value: string) => string | null;\n}\nexport interface FormOptions {\n labelColor?: Style['fg']; errorColor?: Style['fg']; activeColor?: Style['fg'];\n onSubmit?: (values: Record<string, string>) => void;\n}\n\nexport class Form extends Widget {\n private _fields: FormField[];\n private _values: Map<string, string> = new Map();\n private _errors: Map<string, string> = new Map();\n private _activeField = 0;\n private _cursorPos = 0;\n private _labelColor: Style['fg'];\n private _errorColor: Style['fg'];\n private _activeColor: Style['fg'];\n private _onSubmit?: (values: Record<string, string>) => void;\n focusable = true;\n\n constructor(fields: FormField[], options: FormOptions = {}) {\n super(mergeStyles(defaultStyle(), { height: fields.length * 2 + 1, flexGrow: 1 }));\n this._fields = fields;\n this._labelColor = options.labelColor ?? { type: 'named', name: 'cyan' };\n this._errorColor = options.errorColor ?? { type: 'named', name: 'red' };\n this._activeColor = options.activeColor ?? { type: 'named', name: 'cyan' };\n this._onSubmit = options.onSubmit;\n for (const f of fields) this._values.set(f.name, '');\n }\n\n get values(): Record<string, string> { const r: Record<string, string> = {}; for (const [k, v] of this._values) r[k] = v; return r; }\n nextField(): void { if (this._activeField < this._fields.length) { this._activeField++; this._cursorPos = 0; this.markDirty(); } }\n prevField(): void { if (this._activeField > 0) { this._activeField--; this._cursorPos = (this._values.get(this._fields[this._activeField].name) ?? '').length; this.markDirty(); } }\n insertChar(ch: string): void {\n if (this._activeField >= this._fields.length) return;\n const f = this._fields[this._activeField]; const cur = this._values.get(f.name) ?? '';\n this._values.set(f.name, cur.slice(0, this._cursorPos) + ch + cur.slice(this._cursorPos));\n this._cursorPos++; this._errors.delete(f.name); this.markDirty();\n }\n deleteBack(): void {\n if (this._activeField >= this._fields.length) return;\n const f = this._fields[this._activeField]; const cur = this._values.get(f.name) ?? '';\n if (this._cursorPos > 0) { this._values.set(f.name, cur.slice(0, this._cursorPos - 1) + cur.slice(this._cursorPos)); this._cursorPos--; this.markDirty(); }\n }\n submit(): void {\n this._errors.clear(); let hasErr = false;\n for (const f of this._fields) {\n const v = this._values.get(f.name) ?? '';\n if (f.required && !v.trim()) { this._errors.set(f.name, `${f.label} is required`); hasErr = true; }\n if (f.validate) { const e = f.validate(v); if (e) { this._errors.set(f.name, e); hasErr = true; } }\n }\n if (!hasErr) this._onSubmit?.(this.values);\n this.markDirty();\n }\n\n protected _renderSelf(screen: Screen): void {\n const { x, y, width, height } = this._rect;\n if (width <= 0 || height <= 0) return;\n const attrs = styleToCellAttrs(this.style);\n let row = 0;\n for (let i = 0; i < this._fields.length && row < height - 1; i++) {\n const f = this._fields[i]; const active = i === this._activeField;\n const val = this._values.get(f.name) ?? ''; const err = this._errors.get(f.name);\n screen.writeString(x, y + row, `${f.label}${f.required ? ' *' : ''}:`.slice(0, width), { ...attrs, fg: err ? this._errorColor : this._labelColor, bold: active }); row++;\n if (row >= height) break;\n const display = val || (f.placeholder ?? '');\n screen.writeString(x, y + row, `${active ? '❯ ' : ' '}${display}`.slice(0, width), { ...attrs, fg: active ? this._activeColor : attrs.fg, dim: !val && !!f.placeholder }); row++;\n }\n if (row < height) {\n const isSub = this._activeField >= this._fields.length;\n screen.writeString(x, y + row, isSub ? ' [ Submit ]' : ' Submit ', { ...attrs, fg: isSub ? { type: 'named', name: 'green' } : attrs.fg, bold: isSub });\n }\n }\n}\n","// CommandPalette — fuzzy-search command launcher\nimport { Widget } from '@termuijs/widgets';\nimport { type Style, type Screen, mergeStyles, defaultStyle, styleToCellAttrs, getBorderChars, caps } from '@termuijs/core';\n\nexport interface Command { id: string; label: string; shortcut?: string; action: () => void; category?: string; }\nexport interface CommandPaletteOptions { placeholder?: string; borderColor?: Style['fg']; activeColor?: Style['fg']; maxVisible?: number; }\n\nexport class CommandPalette extends Widget {\n private _commands: Command[];\n private _filtered: Command[] = [];\n private _query = '';\n private _cursorPos = 0;\n private _selectedIndex = 0;\n private _visible = false;\n private _placeholder: string;\n private _borderColor: Style['fg'];\n private _activeColor: Style['fg'];\n private _maxVisible: number;\n focusable = true;\n\n constructor(commands: Command[], options: CommandPaletteOptions = {}) {\n super(mergeStyles(defaultStyle(), {}));\n this._commands = commands;\n this._filtered = [...commands];\n this._placeholder = options.placeholder ?? 'Type a command...';\n this._borderColor = options.borderColor ?? { type: 'named', name: 'cyan' };\n this._activeColor = options.activeColor ?? { type: 'named', name: 'cyan' };\n this._maxVisible = options.maxVisible ?? 10;\n }\n\n get visible(): boolean { return this._visible; }\n show(): void { this._visible = true; this._query = ''; this._cursorPos = 0; this._selectedIndex = 0; this._filtered = [...this._commands]; this.markDirty(); }\n hide(): void { this._visible = false; this.markDirty(); }\n toggle(): void { this._visible ? this.hide() : this.show(); }\n insertChar(ch: string): void { this._query = this._query.slice(0, this._cursorPos) + ch + this._query.slice(this._cursorPos); this._cursorPos++; this._filter(); this.markDirty(); }\n deleteBack(): void { if (this._cursorPos > 0) { this._query = this._query.slice(0, this._cursorPos - 1) + this._query.slice(this._cursorPos); this._cursorPos--; this._filter(); this.markDirty(); } }\n selectNext(): void { if (this._selectedIndex < this._filtered.length - 1) { this._selectedIndex++; this.markDirty(); } }\n selectPrev(): void { if (this._selectedIndex > 0) { this._selectedIndex--; this.markDirty(); } }\n confirm(): void { const c = this._filtered[this._selectedIndex]; if (c) { this.hide(); c.action(); } }\n\n private _filter(): void {\n const q = this._query.toLowerCase();\n if (!q) { this._filtered = [...this._commands]; } else {\n this._filtered = this._commands.filter(c => { const l = c.label.toLowerCase(); let qi = 0; for (let i = 0; i < l.length && qi < q.length; i++) { if (l[i] === q[qi]) qi++; } return qi === q.length; });\n }\n this._selectedIndex = 0;\n }\n\n protected _renderSelf(screen: Screen): void {\n if (!this._visible) return;\n const { x, y, width, height } = this._rect;\n const attrs = styleToCellAttrs(this.style);\n // Backdrop\n const backdropCh = caps.unicode ? '░' : ' ';\n for (let r = 0; r < height; r++) screen.writeString(x, y + r, backdropCh.repeat(width), { ...attrs, dim: true });\n // Box\n const vis = this._filtered.slice(0, this._maxVisible);\n const bw = Math.min(60, width - 4);\n const bh = Math.min(vis.length + 3, height - 2);\n const bx = x + Math.floor((width - bw) / 2);\n const by = y + 2;\n const border = getBorderChars('single');\n if (!border) return;\n const ba = { ...attrs, fg: this._borderColor };\n // Top\n screen.writeString(bx, by, border.topLeft + border.top.repeat(bw - 2) + border.topRight, ba);\n // Input row\n screen.writeString(bx, by + 1, border.left, ba);\n const input = this._query || this._placeholder;\n screen.writeString(bx + 1, by + 1, (` ${caps.unicode ? '🔍' : '[?]'} ` + input).slice(0, bw - 2).padEnd(bw - 2), { ...attrs, dim: !this._query });\n screen.writeString(bx + bw - 1, by + 1, border.right, ba);\n // Separator\n screen.writeString(bx, by + 2, border.left + '─'.repeat(bw - 2) + border.right, ba);\n // Items\n for (let i = 0; i < vis.length && i + 3 < bh - 1; i++) {\n const c = vis[i]; const active = i === this._selectedIndex;\n const label = (active ? (caps.unicode ? '❯ ' : '> ') : ' ') + c.label;\n const sc = c.shortcut ?? '';\n screen.writeString(bx, by + 3 + i, border.left, ba);\n screen.writeString(bx + 1, by + 3 + i, (' ' + label).slice(0, bw - sc.length - 3).padEnd(bw - sc.length - 3), { ...attrs, fg: active ? this._activeColor : attrs.fg, bold: active });\n if (sc) screen.writeString(bx + bw - sc.length - 2, by + 3 + i, sc, { ...attrs, dim: true });\n screen.writeString(bx + bw - 1, by + 3 + i, border.right, ba);\n }\n // Bottom\n const last = Math.min(by + 3 + vis.length, by + bh - 1);\n screen.writeString(bx, last, border.bottomLeft + border.bottom.repeat(bw - 2) + border.bottomRight, ba);\n }\n}\n","// ─────────────────────────────────────────────────────\n// @termuijs/ui — Imperative Prompts\n//\n// Pure Node.js readline-based prompts for CLI scripts\n// that don't need a full TUI app. Zero dependency on\n// @termuijs/core, @termuijs/widgets, or @termuijs/jsx.\n// ─────────────────────────────────────────────────────\n\nimport * as readline from 'readline';\n\nexport class NonInteractiveError extends Error {\n constructor() {\n super('Prompts require an interactive TTY. stdin is not a TTY.');\n this.name = 'NonInteractiveError';\n }\n}\n\nexport interface TextPromptOptions {\n message: string;\n placeholder?: string;\n validate?: (value: string) => string | null;\n default?: string;\n}\n\nexport interface ConfirmPromptOptions {\n message: string;\n default?: boolean;\n}\n\nexport interface SelectPromptOptions<T = string> {\n message: string;\n options: Array<{ label: string; value: T }>;\n default?: T;\n}\n\nasync function promptText(options: TextPromptOptions): Promise<string> {\n if (!process.stdin.isTTY) throw new NonInteractiveError();\n\n const defaultHint = options.default ? ` (${options.default})` : '';\n const placeholder = options.placeholder ? ` [${options.placeholder}]` : '';\n\n return new Promise((resolve) => {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n const ask = () => {\n rl.question(`${options.message}${defaultHint}${placeholder}: `, (answer) => {\n const value = answer.trim() || options.default || '';\n if (options.validate) {\n const error = options.validate(value);\n if (error) {\n process.stdout.write(` ${error}\\n`);\n ask();\n return;\n }\n }\n rl.close();\n resolve(value);\n });\n };\n\n ask();\n });\n}\n\nasync function promptConfirm(options: ConfirmPromptOptions): Promise<boolean> {\n if (!process.stdin.isTTY) throw new NonInteractiveError();\n\n const hint = options.default === true ? 'Y/n' : options.default === false ? 'y/N' : 'y/n';\n\n return new Promise((resolve) => {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n rl.question(`${options.message} [${hint}]: `, (answer) => {\n rl.close();\n const a = answer.trim().toLowerCase();\n if (a === 'y' || a === 'yes') { resolve(true); return; }\n if (a === 'n' || a === 'no') { resolve(false); return; }\n if (a === '' && options.default !== undefined) { resolve(options.default); return; }\n resolve(false);\n });\n });\n}\n\nasync function promptSelect<T = string>(options: SelectPromptOptions<T>): Promise<T> {\n if (!process.stdin.isTTY) throw new NonInteractiveError();\n\n const { options: choices, default: defaultValue } = options;\n process.stdout.write(`${options.message}\\n`);\n choices.forEach((opt, i) => {\n const isDefault = opt.value === defaultValue;\n process.stdout.write(` ${i + 1}. ${opt.label}${isDefault ? ' (default)' : ''}\\n`);\n });\n\n return new Promise((resolve) => {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n const ask = () => {\n rl.question(`Enter number (1-${choices.length}): `, (answer) => {\n const trimmed = answer.trim();\n if (trimmed === '' && defaultValue !== undefined) {\n rl.close();\n resolve(defaultValue);\n return;\n }\n const n = parseInt(trimmed, 10);\n if (!isNaN(n) && n >= 1 && n <= choices.length) {\n rl.close();\n resolve(choices[n - 1].value);\n return;\n }\n process.stdout.write(` Invalid choice. Enter a number 1-${choices.length}.\\n`);\n ask();\n });\n };\n\n ask();\n });\n}\n\n/**\n * Imperative prompts for CLI scripts — no widget stack required.\n *\n * ```ts\n * const name = await prompt.text({ message: 'Project name:', default: 'my-app' });\n * const ok = await prompt.confirm({ message: 'Continue?', default: true });\n * const pkg = await prompt.select({ message: 'Package manager:', options: [\n * { label: 'pnpm', value: 'pnpm' },\n * { label: 'npm', value: 'npm' },\n * ]});\n * ```\n *\n * Throws `NonInteractiveError` when stdin is not a TTY.\n */\nexport const prompt = {\n text: promptText,\n confirm: promptConfirm,\n select: promptSelect,\n} as const;\n","// ─────────────────────────────────────────────────────\n// @termuijs/ui — NotificationCenter\n// Provides: NotificationStore (singleton), useNotifications (JSX hook),\n// and NotificationCenter (class-based widget).\n// ─────────────────────────────────────────────────────\n\nimport { Widget } from '@termuijs/widgets';\nimport { useState, useEffect } from '@termuijs/jsx';\nimport { caps, type Screen } from '@termuijs/core';\nimport type { Color } from '@termuijs/core';\n\n// ── Types ──────────────────────────────────────────────────────────────────\n\nexport interface Notification {\n id: string;\n message: string;\n type: 'info' | 'success' | 'warning' | 'error';\n durationMs?: number;\n createdAt: number;\n}\n\n// ── NotificationStore (singleton) ──────────────────────────────────────────\n\nexport class NotificationStore {\n private static _instance: NotificationStore;\n private _notifications: Notification[] = [];\n private _subs: Set<(notifications: Notification[]) => void> = new Set();\n\n static getInstance(): NotificationStore {\n if (!NotificationStore._instance) {\n NotificationStore._instance = new NotificationStore();\n }\n return NotificationStore._instance;\n }\n\n push(message: string, type: Notification['type'] = 'info', durationMs?: number): string {\n const id = Date.now().toString(36) + Math.random().toString(36).slice(2);\n const notification: Notification = { id, message, type, durationMs, createdAt: Date.now() };\n this._notifications = [...this._notifications, notification];\n this._emit();\n\n if (durationMs && durationMs > 0) {\n setTimeout(() => this.dismiss(id), durationMs);\n }\n return id;\n }\n\n dismiss(id: string): void {\n const prev = this._notifications;\n this._notifications = this._notifications.filter(n => n.id !== id);\n if (this._notifications.length !== prev.length) {\n this._emit();\n }\n }\n\n dismissAll(): void {\n if (this._notifications.length > 0) {\n this._notifications = [];\n this._emit();\n }\n }\n\n subscribe(fn: (notifications: Notification[]) => void): () => void {\n this._subs.add(fn);\n return () => this._subs.delete(fn);\n }\n\n get notifications(): Notification[] {\n return this._notifications;\n }\n\n private _emit(): void {\n for (const fn of this._subs) fn(this._notifications);\n }\n}\n\n/** Global singleton accessor */\nexport const notifications: NotificationStore = NotificationStore.getInstance();\n\n// ── useNotifications JSX hook ───────────────────────────────────────────────\n\nexport function useNotifications(): {\n notifications: Notification[];\n push: (message: string, type?: Notification['type'], durationMs?: number) => string;\n dismiss: (id: string) => void;\n dismissAll: () => void;\n} {\n const store = NotificationStore.getInstance();\n const [current, setCurrent] = useState<Notification[]>(store.notifications);\n\n useEffect(() => {\n const unsub = store.subscribe((ns) => setCurrent([...ns]));\n return unsub;\n }, []);\n\n return {\n notifications: current,\n push: (msg, type, dur) => store.push(msg, type, dur),\n dismiss: (id) => store.dismiss(id),\n dismissAll: () => store.dismissAll(),\n };\n}\n\n// ── NotificationCenter Widget ───────────────────────────────────────────────\n\nexport interface NotificationCenterOptions {\n position?: 'top-right' | 'bottom-right' | 'top-left' | 'bottom-left';\n maxVisible?: number;\n width?: number;\n}\n\nconst TYPE_ICONS: Record<Notification['type'], { unicode: string; ascii: string }> = {\n info: { unicode: 'ℹ', ascii: 'i' },\n success: { unicode: '✓', ascii: '+' },\n warning: { unicode: '⚠', ascii: '!' },\n error: { unicode: '✗', ascii: 'x' },\n};\n\nconst TYPE_COLORS: Record<Notification['type'], Color> = {\n info: { type: 'named', name: 'cyan' },\n success: { type: 'named', name: 'green' },\n warning: { type: 'named', name: 'yellow' },\n error: { type: 'named', name: 'red' },\n};\n\nexport class NotificationCenter extends Widget {\n private _position: NonNullable<NotificationCenterOptions['position']>;\n private _maxVisible: number;\n private _notifWidth: number;\n private _unsub?: () => void;\n private _current: Notification[] = [];\n\n constructor(options: NotificationCenterOptions = {}) {\n super();\n this._position = options.position ?? 'top-right';\n this._maxVisible = options.maxVisible ?? 5;\n this._notifWidth = options.width ?? 40;\n\n const store = NotificationStore.getInstance();\n this._current = store.notifications;\n this._unsub = store.subscribe((ns) => {\n this._current = ns;\n this.markDirty();\n });\n }\n\n override unmount(): void {\n this._unsub?.();\n this._unsub = undefined;\n super.unmount();\n }\n\n protected override _renderSelf(screen: Screen): void {\n const visible = this._current.slice(-this._maxVisible);\n if (visible.length === 0) return;\n\n const { x, y, width, height } = this._rect;\n const tw = Math.min(this._notifWidth, width - 2);\n if (tw <= 0) return;\n\n const isRight = this._position.includes('right');\n const isBottom = this._position.includes('bottom');\n\n const sx = isRight ? x + width - tw - 1 : x + 1;\n const sy = isBottom ? y + height - visible.length - 1 : y + 1;\n\n for (let i = 0; i < visible.length; i++) {\n const notif = visible[i];\n const icon = caps.unicode\n ? TYPE_ICONS[notif.type].unicode\n : TYPE_ICONS[notif.type].ascii;\n\n const raw = `${icon} ${notif.message}`;\n const label = ` ${raw} `.slice(0, tw).padEnd(tw);\n\n screen.writeString(sx, sy + i, label, {\n fg: TYPE_COLORS[notif.type],\n bold: true,\n });\n }\n }\n}\n","// ─────────────────────────────────────────────────────\n// @termuijs/ui — PasswordInput widget\n//\n// A TextInput with character masking. Shows '●' (or '*'\n// in ASCII terminals) per character instead of actual\n// chars. Alt+V toggles visibility of the actual text.\n// ─────────────────────────────────────────────────────\n\nimport { Widget } from '@termuijs/widgets';\nimport { type Style, type Screen, type KeyEvent, styleToCellAttrs, truncate, caps } from '@termuijs/core';\n\nexport interface PasswordInputOptions {\n placeholder?: string;\n maxLength?: number;\n onChange?: (value: string) => void;\n onSubmit?: (value: string) => void;\n}\n\nexport class PasswordInput extends Widget {\n private _value = '';\n private _cursorPos = 0;\n private _placeholder: string;\n private _maxLength: number;\n private _showText = false;\n private _onChange?: (value: string) => void;\n private _onSubmit?: (value: string) => void;\n focusable = true;\n\n // '●' in unicode terminals, '*' in ASCII fallback\n private get _maskChar(): string {\n return caps.unicode ? '●' : '*';\n }\n\n constructor(\n style: Partial<Style> = {},\n options: PasswordInputOptions = {},\n ) {\n super({ border: 'single', height: 3, ...style });\n this._placeholder = options.placeholder ?? '';\n this._maxLength = options.maxLength ?? Infinity;\n this._onChange = options.onChange;\n this._onSubmit = options.onSubmit;\n }\n\n /** The actual (unmasked) value. */\n get value(): string { return this._value; }\n\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 /** Whether the text is currently visible (unmaksed). */\n get showText(): boolean { return this._showText; }\n\n /** Toggle visibility of the actual text (Alt+V). */\n toggleVisibility(): void {\n this._showText = !this._showText;\n this.markDirty();\n }\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 this.markDirty();\n }\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 this.markDirty();\n }\n }\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 this.markDirty();\n }\n }\n\n moveCursorLeft(): void { this._cursorPos = Math.max(0, this._cursorPos - 1); this.markDirty(); }\n moveCursorRight(): void { this._cursorPos = Math.min(this._value.length, this._cursorPos + 1); this.markDirty(); }\n moveCursorHome(): void { this._cursorPos = 0; this.markDirty(); }\n moveCursorEnd(): void { this._cursorPos = this._value.length; this.markDirty(); }\n submit(): void { this._onSubmit?.(this._value); }\n clear(): void { this._value = ''; this._cursorPos = 0; this._onChange?.(''); this.markDirty(); }\n\n /**\n * Handle key events. Call this from your input loop.\n * Alt+V — toggle visibility\n * Other — standard text editing\n */\n handleKey(event: KeyEvent): void {\n if (event.alt && event.key === 'v') {\n this.toggleVisibility();\n return;\n }\n switch (event.key) {\n case 'backspace': this.deleteBack(); break;\n case 'delete': this.deleteForward(); break;\n case 'left': this.moveCursorLeft(); break;\n case 'right': this.moveCursorRight(); break;\n case 'home': this.moveCursorHome(); break;\n case 'end': this.moveCursorEnd(); break;\n case 'return':\n case 'enter': this.submit(); break;\n default:\n if (event.key && event.key.length === 1 && !event.ctrl && !event.alt) {\n this.insertChar(event.key);\n }\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\n if (this._value.length === 0 && !this.isFocused) {\n screen.writeString(x, y, truncate(this._placeholder, width), { ...attrs, dim: true });\n return;\n }\n\n // Show actual text when toggled, masked chars otherwise\n const displayValue = this._showText\n ? this._value\n : this._maskChar.repeat(this._value.length);\n\n const visibleWidth = width - 1;\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 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 // Show a small indicator when text is visible\n if (this._showText && width > 4) {\n const indicator = caps.unicode ? ' 👁' : '[v]';\n screen.writeString(x + width - indicator.length, y, indicator, { ...attrs, dim: true });\n }\n }\n}\n","// ─────────────────────────────────────────────────────\n// @termuijs/ui — NumberInput widget\n//\n// A TextInput restricted to numeric values.\n// - Only accepts digit keys and one decimal point\n// - ↑ arrow increments value by step (default 1)\n// - ↓ arrow decrements value by step\n// - min/max clamping\n// ─────────────────────────────────────────────────────\n\nimport { Widget } from '@termuijs/widgets';\nimport { type Style, type Screen, type KeyEvent, styleToCellAttrs, truncate } from '@termuijs/core';\n\nexport interface NumberInputOptions {\n placeholder?: string;\n step?: number;\n min?: number;\n max?: number;\n allowDecimal?: boolean;\n onChange?: (value: number | null) => void;\n onSubmit?: (value: number | null) => void;\n}\n\nexport class NumberInput extends Widget {\n private _raw = ''; // raw string the user typed\n private _cursorPos = 0;\n private _placeholder: string;\n private _step: number;\n private _min: number;\n private _max: number;\n private _allowDecimal: boolean;\n private _onChange?: (value: number | null) => void;\n private _onSubmit?: (value: number | null) => void;\n focusable = true;\n\n constructor(\n style: Partial<Style> = {},\n options: NumberInputOptions = {},\n ) {\n super({ border: 'single', height: 3, ...style });\n this._placeholder = options.placeholder ?? '';\n this._step = options.step ?? 1;\n this._min = options.min ?? -Infinity;\n this._max = options.max ?? Infinity;\n this._allowDecimal = options.allowDecimal ?? true;\n this._onChange = options.onChange;\n this._onSubmit = options.onSubmit;\n }\n\n /** The numeric value, or null if the field is empty / invalid. */\n get numericValue(): number | null {\n if (this._raw === '' || this._raw === '-') return null;\n const n = parseFloat(this._raw);\n return isNaN(n) ? null : n;\n }\n\n /** Raw text string (what the user typed). */\n get rawValue(): string { return this._raw; }\n\n set rawValue(v: string) {\n this._raw = v;\n this._cursorPos = Math.min(this._cursorPos, this._raw.length);\n }\n\n private _clamp(n: number): number {\n return Math.min(this._max, Math.max(this._min, n));\n }\n\n private _notify(): void {\n this._onChange?.(this.numericValue);\n this.markDirty();\n }\n\n /** Accept only digits, '-' at position 0 (if min < 0), and (optionally) one '.'. */\n private _isAllowed(char: string): boolean {\n // Only allow '-' at position 0 if min is negative\n if (char === '-' && this._cursorPos === 0 && !this._raw.includes('-')) {\n return this._min < 0;\n }\n if (char === '.' && this._allowDecimal && !this._raw.includes('.')) return true;\n return /^\\d$/.test(char);\n }\n\n insertChar(char: string): void {\n if (!this._isAllowed(char)) return;\n this._raw =\n this._raw.slice(0, this._cursorPos) +\n char +\n this._raw.slice(this._cursorPos);\n this._cursorPos++;\n this._notify();\n }\n\n deleteBack(): void {\n if (this._cursorPos > 0) {\n this._raw =\n this._raw.slice(0, this._cursorPos - 1) +\n this._raw.slice(this._cursorPos);\n this._cursorPos--;\n this._notify();\n }\n }\n\n deleteForward(): void {\n if (this._cursorPos < this._raw.length) {\n this._raw =\n this._raw.slice(0, this._cursorPos) +\n this._raw.slice(this._cursorPos + 1);\n this._notify();\n }\n }\n\n moveCursorLeft(): void { this._cursorPos = Math.max(0, this._cursorPos - 1); this.markDirty(); }\n moveCursorRight(): void { this._cursorPos = Math.min(this._raw.length, this._cursorPos + 1); this.markDirty(); }\n moveCursorHome(): void { this._cursorPos = 0; this.markDirty(); }\n moveCursorEnd(): void { this._cursorPos = this._raw.length; this.markDirty(); }\n\n /** Increment value by step (↑ arrow). */\n increment(): void {\n const current = this.numericValue ?? 0;\n const next = this._clamp(current + this._step);\n this._raw = String(next);\n this._cursorPos = this._raw.length;\n this._notify();\n }\n\n /** Decrement value by step (↓ arrow). */\n decrement(): void {\n const current = this.numericValue ?? 0;\n const next = this._clamp(current - this._step);\n this._raw = String(next);\n this._cursorPos = this._raw.length;\n this._notify();\n }\n\n submit(): void { this._onSubmit?.(this.numericValue); }\n clear(): void { this._raw = ''; this._cursorPos = 0; this._notify(); }\n\n /**\n * Handle key events. Call this from your input loop.\n */\n handleKey(event: KeyEvent): void {\n switch (event.key) {\n case 'up': this.increment(); break;\n case 'down': this.decrement(); break;\n case 'backspace': this.deleteBack(); break;\n case 'delete': this.deleteForward(); break;\n case 'left': this.moveCursorLeft(); break;\n case 'right': this.moveCursorRight(); break;\n case 'home': this.moveCursorHome(); break;\n case 'end': this.moveCursorEnd(); break;\n case 'return':\n case 'enter': this.submit(); break;\n default:\n if (event.key && event.key.length === 1 && !event.ctrl && !event.alt) {\n this.insertChar(event.key);\n }\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\n if (this._raw.length === 0 && !this.isFocused) {\n screen.writeString(x, y, truncate(this._placeholder, width), { ...attrs, dim: true });\n return;\n }\n\n const display = this._raw;\n const visibleWidth = width - 1;\n let scrollX = 0;\n if (this._cursorPos > visibleWidth) {\n scrollX = this._cursorPos - visibleWidth;\n }\n\n const visibleText = display.slice(scrollX, scrollX + visibleWidth);\n screen.writeString(x, y, visibleText, attrs);\n\n if (this.isFocused) {\n const cursorScreenPos = x + this._cursorPos - scrollX;\n if (cursorScreenPos >= x && cursorScreenPos < x + width) {\n const cursorChar = this._cursorPos < display.length\n ? display[this._cursorPos]\n : ' ';\n screen.setCell(cursorScreenPos, y, {\n char: cursorChar,\n ...attrs,\n inverse: true,\n });\n }\n }\n\n // Show step hint if focused and there's room\n if (this.isFocused && width > 8) {\n const hint = `±${this._step}`;\n screen.writeString(x + width - hint.length, y, hint, { ...attrs, dim: true });\n }\n }\n}\n","// ─────────────────────────────────────────────────────\n// @termuijs/ui — PathInput widget\n//\n// A TextInput with Tab-completion for filesystem paths.\n// - Tab triggers completion: reads dir entries via readdirSync\n// - Shows completion options below the input\n// - Tab cycles through completions\n// - Enter accepts current value\n// - Handles relative and absolute paths gracefully\n// ─────────────────────────────────────────────────────\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { Widget } from '@termuijs/widgets';\nimport { type Style, type Screen, type KeyEvent, styleToCellAttrs, truncate, caps } from '@termuijs/core';\n\nexport interface PathInputOptions {\n placeholder?: string;\n maxLength?: number;\n cwd?: string; // base directory for relative paths\n maxCompletions?: number; // max completions shown (default 5)\n onChange?: (value: string) => void;\n onSubmit?: (value: string) => void;\n}\n\n/**\n * PathInput — filesystem path input with Tab-completion.\n *\n * @note height must be at least (maxCompletions + 2) to show completions.\n * Default height of 3 shows up to 1 completion. If height is insufficient,\n * the input line is still rendered but completions are hidden.\n */\nexport class PathInput extends Widget {\n private _value = '';\n private _cursorPos = 0;\n private _placeholder: string;\n private _maxLength: number;\n private _cwd: string;\n private _maxCompletions: number;\n private _completions: string[] = [];\n private _completionIndex = -1; // -1 = original value, 0..n = cycling\n private _preCompletionValue = ''; // value before Tab was pressed\n private _showCompletions = false;\n private _onChange?: (value: string) => void;\n private _onSubmit?: (value: string) => void;\n focusable = true;\n\n constructor(\n style: Partial<Style> = {},\n options: PathInputOptions = {},\n ) {\n super({ border: 'single', height: 3, ...style });\n this._placeholder = options.placeholder ?? '';\n this._maxLength = options.maxLength ?? 4096;\n this._cwd = options.cwd ?? process.cwd();\n this._maxCompletions = options.maxCompletions ?? 5;\n this._onChange = options.onChange;\n this._onSubmit = options.onSubmit;\n }\n\n get value(): string { return this._value; }\n\n set value(v: string) {\n this._value = v.slice(0, this._maxLength);\n this._cursorPos = Math.min(this._cursorPos, this._value.length);\n this._dismissCompletions();\n }\n\n get completions(): string[] { return this._completions; }\n get isShowingCompletions(): boolean { return this._showCompletions && this._completions.length > 0; }\n\n private _dismissCompletions(): void {\n this._completions = [];\n this._completionIndex = -1;\n this._showCompletions = false;\n }\n\n /** Compute completions for the current value. Does NOT throw. */\n private _computeCompletions(): string[] {\n try {\n const raw = this._value;\n const isAbs = path.isAbsolute(raw);\n const base = isAbs ? raw : path.join(this._cwd, raw);\n\n // Determine the directory to list and the prefix to filter by\n let dir: string;\n let prefix: string;\n\n // If raw ends with separator or is empty, list the dir itself\n if (raw === '' || raw.endsWith('/') || raw.endsWith(path.sep)) {\n dir = isAbs ? raw || '/' : path.join(this._cwd, raw || '.');\n prefix = '';\n } else {\n dir = path.dirname(base);\n prefix = path.basename(base).toLowerCase();\n }\n\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n const matches = entries\n .filter((e) => e.name.toLowerCase().startsWith(prefix))\n .slice(0, this._maxCompletions)\n .map((e) => {\n const full = path.join(dir, e.name);\n // Return path relative to cwd or absolute depending on input style\n const candidate = isAbs\n ? full + (e.isDirectory() ? path.sep : '')\n : path.relative(this._cwd, full) + (e.isDirectory() ? path.sep : '');\n return candidate;\n });\n\n return matches;\n } catch {\n return [];\n }\n }\n\n /** Trigger tab-completion. */\n triggerCompletion(): void {\n if (!this._showCompletions || this._completions.length === 0) {\n // First Tab press — compute completions\n this._preCompletionValue = this._value;\n this._completions = this._computeCompletions();\n if (this._completions.length === 0) {\n this._showCompletions = false;\n return;\n }\n this._showCompletions = true;\n this._completionIndex = 0;\n } else {\n // Subsequent Tab presses — cycle\n this._completionIndex = (this._completionIndex + 1) % this._completions.length;\n }\n\n this._value = this._completions[this._completionIndex];\n this._cursorPos = this._value.length;\n this._onChange?.(this._value);\n this.markDirty();\n }\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._dismissCompletions();\n this._onChange?.(this._value);\n this.markDirty();\n }\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._dismissCompletions();\n this._onChange?.(this._value);\n this.markDirty();\n }\n }\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._dismissCompletions();\n this._onChange?.(this._value);\n this.markDirty();\n }\n }\n\n moveCursorLeft(): void { this._cursorPos = Math.max(0, this._cursorPos - 1); this.markDirty(); }\n moveCursorRight(): void { this._cursorPos = Math.min(this._value.length, this._cursorPos + 1); this.markDirty(); }\n moveCursorHome(): void { this._cursorPos = 0; this.markDirty(); }\n moveCursorEnd(): void { this._cursorPos = this._value.length; this.markDirty(); }\n submit(): void { this._dismissCompletions(); this._onSubmit?.(this._value); }\n clear(): void { this._value = ''; this._cursorPos = 0; this._dismissCompletions(); this._onChange?.(''); this.markDirty(); }\n\n /**\n * Handle key events. Call this from your input loop.\n * Tab — trigger/cycle completions\n * Esc — dismiss completions\n * Enter — submit current value\n */\n handleKey(event: KeyEvent): void {\n switch (event.key) {\n case 'tab': this.triggerCompletion(); break;\n case 'escape': this._dismissCompletions(); this.markDirty(); break;\n case 'backspace': this.deleteBack(); break;\n case 'delete': this.deleteForward(); break;\n case 'left': this.moveCursorLeft(); break;\n case 'right': this.moveCursorRight(); break;\n case 'home': this.moveCursorHome(); break;\n case 'end': this.moveCursorEnd(); break;\n case 'return':\n case 'enter': this.submit(); break;\n default:\n if (event.key && event.key.length === 1 && !event.ctrl && !event.alt) {\n this.insertChar(event.key);\n }\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\n // ── Defensive: if height insufficient for completions, hide them ──\n if (height <= 1 && this._showCompletions) {\n this._showCompletions = false;\n }\n\n // ── Input line ──\n if (this._value.length === 0 && !this.isFocused) {\n screen.writeString(x, y, truncate(this._placeholder, width), { ...attrs, dim: true });\n } else {\n const visibleWidth = width - 1;\n let scrollX = 0;\n if (this._cursorPos > visibleWidth) {\n scrollX = this._cursorPos - visibleWidth;\n }\n const visibleText = this._value.slice(scrollX, scrollX + visibleWidth);\n screen.writeString(x, y, visibleText, attrs);\n\n if (this.isFocused) {\n const cursorScreenPos = x + this._cursorPos - scrollX;\n if (cursorScreenPos >= x && cursorScreenPos < x + width) {\n const cursorChar = this._cursorPos < this._value.length\n ? this._value[this._cursorPos]\n : ' ';\n screen.setCell(cursorScreenPos, y, {\n char: cursorChar,\n ...attrs,\n inverse: true,\n });\n }\n }\n }\n\n // ── Completion list (rendered below the input line) ──\n // Requires height >= maxCompletions + 2 (input line + separator).\n // Default height=3 shows up to 1 completion.\n if (this._showCompletions && this._completions.length > 0 && height > 1) {\n const maxRows = Math.min(this._completions.length, height - 1);\n for (let i = 0; i < maxRows; i++) {\n const row = y + 1 + i;\n const isSelected = i === this._completionIndex;\n const prefix = isSelected ? (caps.unicode ? '▶ ' : '> ') : ' ';\n const entry = this._completions[i];\n screen.writeString(x, row, truncate(prefix + entry, width), {\n ...attrs,\n bold: isSelected,\n inverse: isSelected,\n });\n }\n }\n }\n}\n","// ─────────────────────────────────────────────────────\n// @termuijs/ui — KeyboardShortcuts display widget\n//\n// Renders a grid of keyboard shortcut bindings.\n// Groups by category if provided.\n//\n// Layout (2-column):\n// [key] description [key] description\n// ─────────────────────────────────────────────────────\n\nimport { Widget } from '@termuijs/widgets';\nimport { type Style, type Screen, styleToCellAttrs, caps } from '@termuijs/core';\n\nexport interface ShortcutBinding {\n key: string;\n description: string;\n category?: string;\n}\n\nexport interface KeyboardShortcutsOptions {\n /** Color for the key label boxes */\n keyColor?: Style['fg'];\n /** Color for category headings */\n categoryColor?: Style['fg'];\n /** Number of columns (default 2) */\n columns?: number;\n /** Show category headings (default true) */\n showCategories?: boolean;\n}\n\n/** A group of bindings belonging to the same category. */\ninterface BindingGroup {\n category: string | undefined;\n bindings: ShortcutBinding[];\n}\n\nexport class KeyboardShortcuts extends Widget {\n private _bindings: ShortcutBinding[];\n private _keyColor: Style['fg'];\n private _categoryColor: Style['fg'];\n private _columns: number;\n private _showCategories: boolean;\n\n constructor(bindings: ShortcutBinding[], options: KeyboardShortcutsOptions = {}) {\n super({});\n this._bindings = bindings;\n this._keyColor = options.keyColor ?? { type: 'named', name: 'cyan' };\n this._categoryColor = options.categoryColor ?? { type: 'named', name: 'yellow' };\n this._columns = Math.max(1, options.columns ?? 2);\n this._showCategories = options.showCategories ?? true;\n }\n\n /** Replace all bindings and trigger a re-render. */\n setBindings(bindings: ShortcutBinding[]): void {\n this._bindings = bindings;\n this.markDirty();\n }\n\n /** Group bindings by category, preserving insertion order. */\n private _groupBindings(): BindingGroup[] {\n const groups: BindingGroup[] = [];\n const indexMap = new Map<string, number>();\n\n for (const b of this._bindings) {\n const cat = b.category ?? '';\n const key = cat;\n if (!indexMap.has(key)) {\n indexMap.set(key, groups.length);\n groups.push({ category: b.category, bindings: [] });\n }\n groups[indexMap.get(key)!].bindings.push(b);\n }\n return groups;\n }\n\n /**\n * Render a key label in a bordered box style:\n * ┌─────┐\n * │ key │\n * └─────┘\n *\n * We fit it on one line: [ key ] — box drawing characters or ASCII fallback.\n */\n private _renderKeyLabel(screen: Screen, kx: number, ky: number, key: string, attrs: ReturnType<typeof styleToCellAttrs>): number {\n if (caps.unicode) {\n const label = `[${key}]`;\n screen.writeString(kx, ky, label, { ...attrs, fg: this._keyColor, bold: true });\n return label.length;\n } else {\n const label = `[${key}]`;\n screen.writeString(kx, ky, label, { ...attrs, fg: this._keyColor, bold: true });\n return label.length;\n }\n }\n\n protected _renderSelf(screen: Screen): void {\n const { x, y, width, height } = this._rect;\n if (width <= 0 || height <= 0) return;\n\n const attrs = styleToCellAttrs(this._style);\n const groups = this._groupBindings();\n\n let row = y;\n const colWidth = Math.floor(width / this._columns);\n\n for (const group of groups) {\n if (row >= y + height) break;\n\n // Category heading\n if (this._showCategories && group.category) {\n const heading = group.category.toUpperCase();\n const divider = caps.unicode ? '─' : '-';\n const line = heading + ' ' + divider.repeat(Math.max(0, width - heading.length - 1));\n screen.writeString(x, row, line.slice(0, width), {\n ...attrs,\n fg: this._categoryColor,\n bold: true,\n });\n row++;\n if (row >= y + height) break;\n }\n\n // Render bindings in a grid of _columns\n for (let i = 0; i < group.bindings.length; i += this._columns) {\n if (row >= y + height) break;\n\n for (let col = 0; col < this._columns; col++) {\n const binding = group.bindings[i + col];\n if (!binding) continue;\n\n const cx = x + col * colWidth;\n const availWidth = colWidth - 1; // 1 char gap between columns\n\n if (availWidth <= 0) continue;\n\n // Render key label\n const labelLen = this._renderKeyLabel(screen, cx, row, binding.key, attrs);\n\n // Render description after the label (with a space gap)\n const descX = cx + labelLen + 1;\n const descWidth = availWidth - labelLen - 1;\n if (descWidth > 0) {\n const desc = binding.description.slice(0, descWidth);\n screen.writeString(descX, row, desc, attrs);\n }\n }\n row++;\n }\n\n // Blank line between groups\n if (this._showCategories && group.category) {\n row++;\n }\n }\n }\n}\n"],"mappings":"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","names":["import_widgets","import_widgets","import_core","import_widgets","import_core","import_widgets","import_core","import_widgets","import_core","import_widgets","import_core","import_widgets","import_core","path","import_widgets","import_core","import_widgets","import_core","import_widgets","import_core","import_widgets","import_core","import_widgets","import_core","import_widgets","import_core","import_widgets","import_core","import_widgets","import_core","import_widgets","import_core"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/Slider.ts","../src/Divider.ts","../src/Spacer.ts","../src/Tabs.ts","../src/MenuBar.ts","../src/Menu.ts","../src/Carousel.ts","../src/Modal.ts","../src/Drawer.ts","../src/Select.ts","../src/Combobox.ts","../src/LinearPrompt.ts","../src/Pages.ts","../src/ContentSwitcher.ts","../src/SnippetPrompt.ts","../src/MultiSelect.ts","../src/Transfer.ts","../src/Tree.ts","../src/SortPrompt.ts","../src/Toast.ts","../src/ConfirmDialog.ts","../src/Form.ts","../src/validation.ts","../src/CommandPalette.ts","../src/hooks/useCommandPalette.ts","../src/prompts.ts","../src/NotificationCenter.ts","../src/PasswordInput.ts","../src/NumberInput.ts","../src/TagInput.ts","../src/MaskedInput.ts","../src/PathInput.ts","../src/KeyboardShortcuts.ts","../src/FilePicker.ts","../src/DatePicker.ts","../src/TimePicker.ts","../src/DateRangePicker.ts","../src/ColorPicker.ts","../src/Accordion.ts","../src/AppShell.ts","../src/Pagination.ts","../src/ScalePrompt.ts","../src/SegmentedControl.ts","../src/SearchableSelect.ts","../src/Autocomplete.ts","../src/Toggle.ts","../src/Switch.ts","../src/Checkbox.ts","../src/CheckboxGroup.ts","../src/ButtonGroup.ts","../src/Wizard.ts","../src/MultilineTextInput.ts","../src/BasicAuthPrompt.ts","../src/TextArea.ts","../src/Stepper.ts","../src/components/ShortcutHelpOverlay.tsx","../src/RadioGroup.ts","../src/Rating.ts","../src/ThemeSwitcher.ts","../src/TreeSelect.ts","../src/EmailInput.ts","../src/QuizPrompt.ts","../src/EditablePrompt.ts","../src/SurveyPrompt.ts","../src/Breadcrumb.ts","../src/Disclosure.ts","../src/Listbar.ts","../src/Popover.ts","../src/components/FormBuilder.ts","../src/SearchInput.ts"],"sourcesContent":["// ─────────────────────────────────────────────────────\n// @termuijs/ui — Rich Component Library\n//\n// The shadcn/ui for terminals — 16+ production-ready\n// components for building beautiful CLI apps.\n// ─────────────────────────────────────────────────────\n\n// ── Re-exports from @termuijs/widgets (base components) ──\n// Note: do not augment '@termuijs/widgets' here — it resolves to an untyped module.\nexport {\n Box,\n Text,\n Table,\n List,\n TextInput,\n Gauge,\n Sparkline,\n StatusIndicator,\n LogView,\n ProgressBar,\n Spinner,\n Widget,\n} from '@termuijs/widgets';\n\n// ── New components ──\nexport { Slider, RangeInput } from './Slider.js';\nexport { Divider } from './Divider.js';\nexport type { DividerOptions } from './Divider.js';\n\nexport { Spacer } from './Spacer.js';\n\nexport { Tabs } from './Tabs.js';\nexport type { Tab, TabsOptions } from './Tabs.js';\n\nexport { MenuBar } from './MenuBar.js';\nexport type { MenuBarOptions, MenuBarItem, MenuItem as MenuBarItemType } from './MenuBar.js';\n\nexport { Menu } from './Menu.js';\nexport type { MenuItem, MenuOptions } from './Menu.js';\n\nexport { Carousel } from './Carousel.js';\nexport type { CarouselOptions } from './Carousel.js';\n\nexport { Modal } from './Modal.js';\nexport type { ModalOptions } from './Modal.js';\n\nexport { Drawer } from './Drawer.js';\nexport type { DrawerOptions, DrawerPosition } from './Drawer.js';\n\nexport { Select } from './Select.js';\nexport type { SelectOption, SelectOptions } from './Select.js';\n\nexport { Combobox } from './Combobox.js';\nexport type { ComboboxOption, ComboboxOptions } from './Combobox.js';\n\nexport { LinearPrompt } from './LinearPrompt.js';\nexport type { LinearPromptOption, LinearPromptOptions } from './LinearPrompt.js';\n\nexport { Pages } from './Pages.js';\nexport type { Page, PagesOptions } from './Pages.js';\n\nexport { ContentSwitcher } from './ContentSwitcher.js';\n\nexport { SnippetPrompt } from './SnippetPrompt.js';\nexport type { SnippetPromptOptions } from './SnippetPrompt.js';\n\nexport { MultiSelect } from './MultiSelect.js';\nexport type { MultiSelectOption, MultiSelectOptions } from './MultiSelect.js';\n\nexport { Transfer } from './Transfer.js';\nexport type { TransferItem, TransferOptions } from './Transfer.js';\n\nexport { Tree } from './Tree.js';\nexport type { TreeNode, TreeOptions } from './Tree.js';\n\nexport { SortPrompt } from './SortPrompt.js';\nexport type { SortPromptOptions } from './SortPrompt.js';\n\nexport { Toast } from './Toast.js';\nexport type { ToastType, ToastMessage, ToastOptions } from './Toast.js';\n\nexport { ConfirmDialog } from './ConfirmDialog.js';\nexport type { ConfirmDialogOptions } from './ConfirmDialog.js';\n\nexport { Form } from './Form.js';\nexport type { FormField, FormOptions } from './Form.js';\n\nexport { CommandPalette } from './CommandPalette.js';\nexport type { Command, CommandPaletteOptions } from './CommandPalette.js';\n\nexport { useCommandPalette } from './hooks/useCommandPalette.js';\nexport type { UseCommandPaletteOptions, UseCommandPaletteReturn } from './hooks/useCommandPalette.js';\n\nexport { prompt, NonInteractiveError } from './prompts.js';\nexport type { TextPromptOptions, ConfirmPromptOptions, SelectPromptOptions } from './prompts.js';\n\nexport { NotificationCenter, NotificationStore, notifications, useNotifications } from './NotificationCenter.js';\nexport type { Notification, NotificationCenterOptions } from './NotificationCenter.js';\n\nexport { PasswordInput } from './PasswordInput.js';\nexport type { PasswordInputOptions } from './PasswordInput.js';\n\nexport { NumberInput } from './NumberInput.js';\nexport type { NumberInputOptions } from './NumberInput.js';\n\nexport { TagInput } from './TagInput.js';\nexport type { TagInputOptions } from './TagInput.js';\n\nexport { MaskedInput } from './MaskedInput.js';\nexport type { MaskedInputOptions } from './MaskedInput.js';\n\nexport { PathInput } from './PathInput.js';\nexport type { PathInputOptions } from './PathInput.js';\n\nexport { KeyboardShortcuts } from './KeyboardShortcuts.js';\nexport type { ShortcutBinding, KeyboardShortcutsOptions } from './KeyboardShortcuts.js';\n\nexport { FilePicker } from './FilePicker.js';\nexport type { FilePickerOptions, FileEntry } from './FilePicker.js';\n\nexport { DatePicker } from './DatePicker.js';\nexport type { DatePickerOptions } from './DatePicker.js';\n\nexport { TimePicker } from './TimePicker.js';\nexport type { TimePickerOptions } from './TimePicker.js';\n\nexport { DateRangePicker } from './DateRangePicker.js';\nexport type { DateRange, DateRangePickerOptions } from './DateRangePicker.js';\n\nexport { ColorPicker } from './ColorPicker.js';\nexport type { ColorPickerOptions } from './ColorPicker.js';\n\nexport { Accordion } from './Accordion.js';\nexport type { AccordionOptions, AccordionItem } from './Accordion.js';\n\nexport { AppShell } from './AppShell.js';\nexport type { AppShellOptions } from './AppShell.js';\nexport { Pagination } from './Pagination.js';\nexport type { PaginationOptions } from './Pagination.js';\n\nexport { ScalePrompt } from './ScalePrompt.js';\nexport type { ScalePromptOptions } from './ScalePrompt.js';\n\nexport { SegmentedControl } from './SegmentedControl.js';\nexport type { SegmentedControlOptions } from './SegmentedControl.js';\n\nexport { SearchableSelect } from './SearchableSelect.js';\nexport { Autocomplete, type AutocompleteOptions } from './Autocomplete.js';\nexport { Toggle } from './Toggle.js';\nexport type { ToggleOptions } from './Toggle.js';\nexport { Switch } from './Switch.js';\nexport type { SwitchOptions } from './Switch.js';\nexport { Checkbox } from './Checkbox.js';\nexport type { CheckboxOptions } from './Checkbox.js';\n\nexport { CheckboxGroup } from './CheckboxGroup.js';\nexport type {\n CheckboxGroupOption,\n CheckboxGroupOptions,\n} from './CheckboxGroup.js';\n\n\nexport { ButtonGroup } from './ButtonGroup.js';\nexport type { ButtonGroupOptions, ButtonGroupItem } from './ButtonGroup.js';\nexport { Wizard } from './Wizard.js';\nexport type { WizardStep, WizardOptions } from './Wizard.js';\nexport { MultilineTextInput } from './MultilineTextInput.js';\nexport type { MultilineTextInputOptions } from './MultilineTextInput.js';\nexport { BasicAuthPrompt } from './BasicAuthPrompt.js';\nexport type { BasicAuthCredentials, BasicAuthPromptOptions } from './BasicAuthPrompt.js';\n\nexport { TextArea } from './TextArea.js';\nexport type { TextAreaOptions } from './TextArea.js';\n\nexport { Stepper } from './Stepper.js';\nexport type { StepperOptions } from './Stepper.js';\n\nexport { ShortcutHelpOverlay } from './components/ShortcutHelpOverlay.js';\nexport type { Shortcut, ShortcutHelpOverlayProps } from './components/ShortcutHelpOverlay.js';\n\nexport { RadioGroup } from './RadioGroup.js';\nexport type { RadioGroupOption, RadioGroupOptions } from './RadioGroup.js';\n\nexport { Rating } from './Rating.js';\nexport type { RatingOptions } from './Rating.js';\nexport { ThemeSwitcher } from './ThemeSwitcher.js';\nexport type { ThemeSwitcherOptions } from './ThemeSwitcher.js';\n\nexport { TreeSelect } from './TreeSelect.js';\nexport type { TreeSelectNode, TreeSelectOptions } from './TreeSelect.js';\nexport { EmailInput } from './EmailInput.js';\nexport type { EmailInputOptions } from './EmailInput.js';\n\nexport { QuizPrompt } from './QuizPrompt.js';\nexport type { QuizPromptOptions, QuizQuestion, QuizResult } from './QuizPrompt.js';\n\nexport { EditablePrompt } from './EditablePrompt.js';\nexport type {\n EditablePromptChoice,\n EditablePromptResult,\n EditablePromptOptions,\n} from './EditablePrompt.js';\n\n\nexport { SurveyPrompt } from './SurveyPrompt.js';\nexport type { SurveyPromptOptions, SurveyQuestion } from './SurveyPrompt.js';\n\nexport { Breadcrumb } from './Breadcrumb.js';\nexport type { BreadcrumbItem, BreadcrumbOptions } from './Breadcrumb.js';\n\n\nexport { Disclosure } from './Disclosure.js';\nexport type { DisclosureOptions } from './Disclosure.js';\n\nexport { Listbar } from './Listbar.js';\nexport type { ListbarOptions, ListbarItem } from './Listbar.js';\n\nexport { validateInput } from './validation.js';\nexport type { InputValidator } from './validation.js';\n\nexport { Popover } from './Popover.js';\nexport type { PopoverOptions, PopoverPlacement } from './Popover.js'\n\nexport { FormBuilder, useForm } from './components/FormBuilder.js';\nexport type { FormBuilderProps } from './components/FormBuilder.js';\n\nexport { SearchInput } from './SearchInput.js';\nexport type { SearchInputOptions } from './SearchInput.js';\n\n// -- External Theme / Stylesheet Engine --\nexport * from '@termuijs/tss';\n","import { Widget } from '@termuijs/widgets';\nimport {\n type Screen,\n type Style,\n type KeyEvent,\n mergeStyles,\n defaultStyle,\n styleToCellAttrs,\n caps,\n} from '@termuijs/core';\n\nexport interface SliderOptions {\n min: number;\n max: number;\n step?: number;\n value?: number;\n onChange?: (value: number) => void;\n}\n\nexport interface RangeInputOptions {\n min: number;\n max: number;\n step?: number;\n low?: number;\n high?: number;\n onChange?: (low: number, high: number) => void;\n}\n\nexport class Slider extends Widget {\n private _value: number;\n private _min: number;\n private _max: number;\n private _step: number;\n\n onChange?: (value: number) => void;\n\n focusable = true;\n\n constructor(\n style: Partial<Style> = {},\n opts: SliderOptions,\n ) {\n super(\n mergeStyles(\n defaultStyle(),\n { height: 1, ...style },\n ),\n );\n\n this._min = opts.min;\n this._max = opts.max;\n this._step = opts.step ?? 1;\n this._value = this._clamp(opts.value ?? opts.min);\n this.onChange = opts.onChange;\n }\n\n private _clamp(value: number): number {\n return Math.min(\n this._max,\n Math.max(this._min, value),\n );\n }\n\n getValue(): number {\n return this._value;\n }\n\n setValue(value: number): void {\n const clamped = this._clamp(value);\n\n if (clamped === this._value) return;\n\n this._value = clamped;\n this.onChange?.(this._value);\n this.markDirty();\n }\n\n increment(): void {\n this.setValue(this._value + this._step);\n }\n\n decrement(): void {\n this.setValue(this._value - this._step);\n }\n\n handleKey(event: KeyEvent): void {\n switch (event.key) {\n case 'right':\n this.increment();\n break;\n\n case 'left':\n this.decrement();\n break;\n }\n }\n\n protected _renderSelf(screen: Screen): void {\n const { x, y, width } = this._rect;\n\n if (width <= 0) return;\n\n const attrs = styleToCellAttrs(this.style);\n\n const trackChar = caps.unicode ? '\\u2500' : '-';\nconst handleChar = caps.unicode ? '\\u25CF' : 'O';\n const ratio =\n (this._value - this._min) /\n (this._max - this._min || 1);\n\n const handlePos =\n Math.round(ratio * (width - 1));\n\n let track = trackChar.repeat(width);\n\n track =\n track.slice(0, handlePos) +\n handleChar +\n track.slice(handlePos + 1);\n\n screen.writeString(x, y, track, attrs);\n }\n}\n\nexport class RangeInput extends Widget {\n private _low: number;\n private _high: number;\n private _min: number;\n private _max: number;\n private _step: number;\n\n onChange?: (low: number, high: number) => void;\n\n focusable = true;\n\n constructor(\n style: Partial<Style> = {},\n opts: RangeInputOptions,\n ) {\n super(\n mergeStyles(\n defaultStyle(),\n { height: 1, ...style },\n ),\n );\n\n this._min = opts.min;\n this._max = opts.max;\n this._step = opts.step ?? 1;\n\n this.onChange = opts.onChange;\n\nthis._low = this._min;\nthis._high = this._max;\n\nthis.setRange(\n opts.low ?? this._min,\n opts.high ?? this._max,\n);\n }\n\n getLow(): number {\n return this._low;\n }\n\n getHigh(): number {\n return this._high;\n }\n\n setRange(low: number, high: number): void {\n const nextLow = Math.max(\n this._min,\n Math.min(this._max, low),\n );\n\n const nextHigh = Math.max(\n this._min,\n Math.min(this._max, high),\n );\n\n const normalizedLow = Math.min(\n nextLow,\n nextHigh,\n );\n\n const normalizedHigh = Math.max(\n nextLow,\n nextHigh,\n );\n\n if (\n normalizedLow === this._low &&\n normalizedHigh === this._high\n ) {\n return;\n }\n\n this._low = normalizedLow;\n this._high = normalizedHigh;\n\n this.onChange?.(this._low, this._high);\n this.markDirty();\n}\n\n protected _renderSelf(screen: Screen): void {\n const { x, y, width } = this._rect;\n\n if (width <= 0) return;\n\n const attrs = styleToCellAttrs(this.style);\n\n const trackChar = caps.unicode ? '\\u2500' : '-';\n const handleChar = caps.unicode ? '\\u25CF' : 'O';\n\n const range = this._max - this._min || 1;\n\n const lowPos = Math.round(\n ((this._low - this._min) / range) * (width - 1),\n );\n\n const highPos = Math.round(\n ((this._high - this._min) / range) * (width - 1),\n );\n\n const chars = trackChar.repeat(width).split('');\n\n if (lowPos >= 0 && lowPos < chars.length) {\n chars[lowPos] = handleChar;\n }\n\n if (highPos >= 0 && highPos < chars.length) {\n chars[highPos] = handleChar;\n }\n\n screen.writeString(\n x,\n y,\n chars.join(''),\n attrs,\n );\n }\n}","// Divider — horizontal separator line\nimport { Widget } from '@termuijs/widgets';\nimport { type Style, type Screen, mergeStyles, defaultStyle, styleToCellAttrs } from '@termuijs/core';\n\nexport interface DividerOptions {\n char?: string;\n color?: Style['fg'];\n title?: string;\n}\n\nexport class Divider extends Widget {\n private _char: string;\n private _color: Style['fg'];\n private _title: string;\n\n constructor(options: DividerOptions = {}) {\n super(mergeStyles(defaultStyle(), { height: 1 }));\n this._char = options.char ?? '─';\n this._color = options.color;\n this._title = options.title ?? '';\n }\n\n protected _renderSelf(screen: Screen): void {\n const { x, y, width } = this._rect;\n if (width <= 0) return;\n const attrs = styleToCellAttrs(this.style);\n if (this._color) attrs.fg = this._color;\n attrs.dim = true;\n if (this._title) {\n const titleStr = ` ${this._title} `;\n const padLeft = Math.max(0, Math.floor((width - titleStr.length) / 2));\n const padRight = Math.max(0, width - padLeft - titleStr.length);\n const line = this._char.repeat(padLeft) + titleStr + this._char.repeat(padRight);\n screen.writeString(x, y, line.slice(0, width), attrs);\n } else {\n screen.writeString(x, y, this._char.repeat(width), attrs);\n }\n }\n}\n","// Spacer — flexible empty space\nimport { Widget } from '@termuijs/widgets';\nimport { type Screen, mergeStyles, defaultStyle } from '@termuijs/core';\n\nexport class Spacer extends Widget {\n constructor(grow: number = 1) {\n super(mergeStyles(defaultStyle(), { flexGrow: grow }));\n }\n protected _renderSelf(_screen: Screen): void { /* empty */ }\n}\n","// Tabs — tabbed container with keyboard switching\nimport { Widget } from '@termuijs/widgets';\nimport { type Style, type Screen, mergeStyles, defaultStyle, styleToCellAttrs, caps } from '@termuijs/core';\n\nexport interface Tab { label: string; content: Widget; }\nexport interface TabsOptions {\n activeColor?: Style['fg'];\n inactiveColor?: Style['fg'];\n border?: Style['border'];\n}\n\nexport class Tabs extends Widget {\n private _tabs: Tab[] = [];\n private _activeIndex = 0;\n private _activeColor: Style['fg'];\n private _inactiveColor: Style['fg'];\n focusable = true;\n\n constructor(tabs: Tab[], options: TabsOptions = {}) {\n super(mergeStyles(defaultStyle(), { flexGrow: 1, border: options.border ?? 'single' }));\n this._tabs = tabs;\n this._activeColor = options.activeColor ?? { type: 'named', name: 'cyan' };\n this._inactiveColor = options.inactiveColor ?? { type: 'named', name: 'brightBlack' };\n }\n\n get activeIndex(): number { return this._activeIndex; }\n selectTab(i: number): void {\n if (i >= 0 && i < this._tabs.length) { this._activeIndex = i; this.markDirty(); }\n }\n nextTab(): void {\n if (this._tabs.length === 0) return;\n this._activeIndex = (this._activeIndex + 1) % this._tabs.length;\n this.markDirty();\n }\n prevTab(): void {\n if (this._tabs.length === 0) return;\n this._activeIndex = (this._activeIndex - 1 + this._tabs.length) % this._tabs.length;\n this.markDirty();\n }\n get activeContent(): Widget | undefined { return this._tabs[this._activeIndex]?.content; }\n\n protected _renderSelf(screen: Screen): void {\n const { x, y, width, height } = this._rect;\n if (width <= 0 || height <= 0) return;\n const attrs = styleToCellAttrs(this.style);\n let col = x;\n for (let i = 0; i < this._tabs.length; i++) {\n const tab = this._tabs[i];\n const isActive = i === this._activeIndex;\n const label = isActive ? ` ${caps.unicode ? '●' : '*'} ${tab.label} ` : ` ${tab.label} `;\n screen.writeString(col, y, label, {\n ...attrs,\n fg: isActive ? this._activeColor : this._inactiveColor,\n bold: isActive, dim: !isActive,\n });\n col += label.length;\n if (i < this._tabs.length - 1) { screen.writeString(col, y, caps.unicode ? '│' : '|', { ...attrs, dim: true }); col++; }\n }\n if (height > 1) screen.writeString(x, y + 1, '─'.repeat(width), { ...attrs, dim: true });\n }\n}\n","// MenuBar — horizontal menu bar with dropdown menus\nimport { Widget } from '@termuijs/widgets';\nimport { type Style, type Color, type KeyEvent, type Screen, mergeStyles, defaultStyle, styleToCellAttrs, caps } from '@termuijs/core';\n\nexport interface MenuItem {\n label: string;\n action?: () => void;\n disabled?: boolean;\n}\n\nexport interface MenuBarItem {\n label: string;\n items: MenuItem[];\n}\n\nexport interface MenuBarOptions {\n activeColor?: Color;\n}\n\nexport class MenuBar extends Widget {\n private _menus: MenuBarItem[] = [];\n private _activeMenu = 0;\n private _isOpen = false;\n private _activeItem = -1;\n private _activeColor: Color;\n focusable = true;\n\n constructor(menus: MenuBarItem[], style?: Partial<Style>, opts?: MenuBarOptions) {\n super(mergeStyles(defaultStyle(), { height: 1, ...style }));\n this._menus = menus;\n this._activeColor = opts?.activeColor ?? { type: 'named', name: 'cyan' };\n }\n\n get activeMenu(): number {\n return this._activeMenu;\n }\n\n get isOpen(): boolean {\n return this._isOpen;\n }\n\n get activeItem(): number {\n return this._activeItem;\n }\n\n get menus(): MenuBarItem[] {\n return this._menus;\n }\n\n setMenus(menus: MenuBarItem[]): void {\n this._menus = menus;\n this._activeMenu = 0;\n this._isOpen = false;\n this._activeItem = -1;\n this.markDirty();\n }\n\n private _initActiveItem(): void {\n const items = this._menus[this._activeMenu]?.items ?? [];\n let firstEnabled = -1;\n for (let i = 0; i < items.length; i++) {\n if (!items[i].disabled) {\n firstEnabled = i;\n break;\n }\n }\n this._activeItem = firstEnabled;\n }\n\n private _selectNextItem(): void {\n const items = this._menus[this._activeMenu]?.items ?? [];\n if (items.length === 0) return;\n let n = this._activeItem;\n const start = n;\n do {\n n = (n + 1) % items.length;\n if (!items[n].disabled) {\n this._activeItem = n;\n this.markDirty();\n return;\n }\n } while (n !== start);\n }\n\n private _selectPrevItem(): void {\n const items = this._menus[this._activeMenu]?.items ?? [];\n if (items.length === 0) return;\n let n = this._activeItem;\n const start = n;\n do {\n n = (n - 1 + items.length) % items.length;\n if (!items[n].disabled) {\n this._activeItem = n;\n this.markDirty();\n return;\n }\n } while (n !== start);\n }\n\n private _openMenu(): void {\n this._initActiveItem();\n this._isOpen = true;\n this.markDirty();\n }\n\n private _closeMenu(): void {\n this._isOpen = false;\n this.markDirty();\n }\n\n selectNextMenu(): void {\n if (this._menus.length === 0) return;\n this._activeMenu = (this._activeMenu + 1) % this._menus.length;\n if (this._isOpen) {\n this._initActiveItem();\n }\n this.markDirty();\n }\n\n selectPrevMenu(): void {\n if (this._menus.length === 0) return;\n this._activeMenu = (this._activeMenu - 1 + this._menus.length) % this._menus.length;\n if (this._isOpen) {\n this._initActiveItem();\n }\n this.markDirty();\n }\n\n handleKey(event: KeyEvent): void {\n const key = event.key.toLowerCase();\n\n if (this._isOpen) {\n if (key === 'escape') {\n this._closeMenu();\n } else if (key === 'up') {\n this._selectPrevItem();\n } else if (key === 'down') {\n this._selectNextItem();\n } else if (key === 'enter') {\n const items = this._menus[this._activeMenu]?.items ?? [];\n const activeItem = items[this._activeItem];\n if (activeItem && !activeItem.disabled) {\n if (activeItem.action) {\n activeItem.action();\n }\n this._closeMenu();\n }\n } else if (key === 'left') {\n this.selectPrevMenu();\n } else if (key === 'right') {\n this.selectNextMenu();\n }\n } else {\n if (key === 'left') {\n this.selectPrevMenu();\n } else if (key === 'right') {\n this.selectNextMenu();\n } else if (key === 'enter') {\n this._openMenu();\n }\n }\n }\n\n protected _renderSelf(screen: Screen): void {\n const { x, y, width, height } = this._rect;\n if (width <= 0 || height <= 0) return;\n\n const attrs = styleToCellAttrs(this.style);\n let col = x;\n const menuPositions: number[] = [];\n\n for (let i = 0; i < this._menus.length; i++) {\n const menu = this._menus[i];\n const isActive = i === this._activeMenu;\n const label = ` ${menu.label} `;\n menuPositions.push(col);\n\n if (col < x + width) {\n const visibleLabel = label.slice(0, x + width - col);\n screen.writeString(col, y, visibleLabel, {\n ...attrs,\n fg: isActive ? this._activeColor : attrs.fg,\n bold: isActive,\n });\n }\n col += label.length;\n }\n\n if (this._isOpen) {\n const menu = this._menus[this._activeMenu];\n if (menu) {\n const items = menu.items;\n const menuX = menuPositions[this._activeMenu];\n const maxItemLabelLength = items.reduce((max, item) => Math.max(max, item.label.length), 0);\n const dropdownWidth = Math.max(\n ` ${menu.label} `.length,\n maxItemLabelLength + 4\n );\n\n for (let k = 0; k < items.length; k++) {\n const item = items[k];\n const isSel = k === this._activeItem;\n const prefix = isSel ? (caps.unicode ? '● ' : '* ') : ' ';\n const itemText = prefix + item.label;\n const paddedText = itemText.padEnd(dropdownWidth);\n\n if (menuX < x + width) {\n const visibleText = paddedText.slice(0, x + width - menuX);\n screen.writeString(menuX, y + 1 + k, visibleText, {\n ...attrs,\n fg: item.disabled\n ? { type: 'named', name: 'brightBlack' }\n : isSel\n ? this._activeColor\n : attrs.fg,\n bold: isSel,\n dim: item.disabled,\n });\n }\n }\n }\n }\n }\n}\n","import { Widget } from '@termuijs/widgets';\nimport {\n type Style,\n type Screen,\n type KeyEvent,\n mergeStyles,\n defaultStyle,\n styleToCellAttrs,\n stringWidth,\n truncate,\n} from '@termuijs/core';\n\nexport interface MenuItem {\n label: string;\n shortcut?: string;\n disabled?: boolean;\n onSelect?: () => void;\n}\n\nexport interface MenuOptions {\n items: MenuItem[];\n onClose?: () => void;\n style?: Partial<Style>;\n}\n\n/**\n * Menu — a vertical list of interactive items supporting keyboard navigation,\n * shortcuts, and disabled states.\n */\nexport class Menu extends Widget {\n private _items: MenuItem[];\n private _selectedIndex = 0;\n private _onClose?: () => void;\n\n constructor(options: MenuOptions) {\n super(mergeStyles(defaultStyle(), {\n padding: 0,\n ...options.style\n }));\n this._items = options.items;\n this._onClose = options.onClose;\n this.focusable = true;\n\n // Initialize selection to the first enabled item\n this._initSelection();\n }\n\n private _initSelection(): void {\n for (let i = 0; i < this._items.length; i++) {\n if (!this._items[i].disabled) {\n this._selectedIndex = i;\n break;\n }\n }\n }\n\n private _selectNext(): void {\n const start = this._selectedIndex;\n let next = (this._selectedIndex + 1) % this._items.length;\n \n while (next !== start && this._items[next].disabled) {\n next = (next + 1) % this._items.length;\n }\n\n if (next !== start && !this._items[next].disabled) {\n this._selectedIndex = next;\n this.markDirty();\n }\n }\n\n private _selectPrev(): void {\n const start = this._selectedIndex;\n let next = (this._selectedIndex - 1 + this._items.length) % this._items.length;\n \n while (next !== start && this._items[next].disabled) {\n next = (next - 1 + this._items.length) % this._items.length;\n }\n\n if (next !== start && !this._items[next].disabled) {\n this._selectedIndex = next;\n this.markDirty();\n }\n }\n\n private _confirm(): void {\n const item = this._items[this._selectedIndex];\n if (item && !item.disabled) {\n item.onSelect?.();\n // No markDirty — selection did not change\n }\n }\n\n handleKey(event: KeyEvent): boolean {\n switch (event.key) {\n case 'up':\n this._selectPrev();\n return true;\n case 'down':\n this._selectNext();\n return true;\n case 'enter':\n case 'space':\n this._confirm();\n return true;\n case 'escape':\n this._onClose?.();\n // No markDirty — widget is being closed\n return true;\n }\n return false;\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 baseAttrs = styleToCellAttrs(this.style);\n\n for (let i = 0; i < this._items.length; i++) {\n if (i >= height) break;\n\n const item = this._items[i];\n const isSelected = i === this._selectedIndex;\n \n // Highlight selected row\n const rowStyle = {\n ...baseAttrs,\n fg: item.disabled ? { type: 'named' as const, name: 'brightBlack' as const } : baseAttrs.fg,\n bg: isSelected ? { type: 'named' as const, name: 'cyan' as const } : baseAttrs.bg,\n bold: isSelected,\n dim: item.disabled,\n };\n\n // Clear row\n screen.writeString(x, y + i, ' '.repeat(width), rowStyle);\n\n // Render label\n const label = truncate(item.label, width - 2);\n screen.writeString(x + 1, y + i, label, rowStyle);\n\n // Render shortcut if space allows\n if (item.shortcut) {\n const shortcut = item.shortcut;\n const shortcutWidth = stringWidth(shortcut);\n if (width > stringWidth(label) + shortcutWidth + 4) {\n screen.writeString(x + width - shortcutWidth - 1, y + i, shortcut, {\n ...rowStyle,\n fg: isSelected ? rowStyle.fg : { type: 'named', name: 'brightBlack' }\n });\n }\n }\n }\n }\n}\n","// Carousel — slide navigator with indicator dots and keyboard controls\nimport { Widget } from '@termuijs/widgets';\nimport { type Style, type Screen, type KeyEvent, mergeStyles, defaultStyle, styleToCellAttrs, caps } from '@termuijs/core';\n\nexport interface CarouselOptions {\n showDots?: boolean;\n onChange?: (index: number) => void;\n}\n\nexport class Carousel extends Widget {\n private _slides: string[];\n private _activeIndex = 0;\n private _showDots: boolean;\n private _onChange?: (index: number) => void;\n focusable = true;\n\n constructor(slides: string[], options: CarouselOptions = {}) {\n super(mergeStyles(defaultStyle(), { flexGrow: 1 }));\n this._slides = slides.length > 0 ? [...slides] : [''];\n this._showDots = options.showDots ?? false;\n this._onChange = options.onChange;\n }\n\n get activeIndex(): number { return this._activeIndex; }\n get currentSlide(): string { return this._slides[this._activeIndex] ?? ''; }\n get slides(): string[] { return [...this._slides]; }\n get showDots(): boolean { return this._showDots; }\n\n setIndex(index: number): void {\n const normalized = this._normalizeIndex(index);\n if (normalized === this._activeIndex) return;\n this._activeIndex = normalized;\n this._onChange?.(this._activeIndex);\n this.markDirty();\n }\n\n next(): void {\n if (this._slides.length === 0) return;\n this.setIndex(this._activeIndex + 1);\n }\n\n prev(): void {\n if (this._slides.length === 0) return;\n this.setIndex(this._activeIndex - 1);\n }\n\n handleKey(event: KeyEvent): void {\n switch (event.key) {\n case 'left':\n this.prev();\n break;\n case 'right':\n this.next();\n break;\n case 'h':\n if (!event.ctrl && !event.alt) this.prev();\n break;\n case 'l':\n if (!event.ctrl && !event.alt) this.next();\n break;\n }\n }\n\n protected _renderSelf(screen: Screen): void {\n const { x, y, width, height } = this._rect;\n if (width <= 0 || height <= 0) return;\n\n const attrs = styleToCellAttrs(this.style);\n const slideLines = this.currentSlide.split('\\n');\n const indicatorHeight = this._showDots ? 1 : 0;\n const contentHeight = Math.max(0, height - indicatorHeight);\n\n for (let row = 0; row < contentHeight; row++) {\n const line = slideLines[row] ?? '';\n screen.writeString(x, y + row, line.slice(0, width).padEnd(width), attrs);\n }\n\n if (this._showDots && height > 0) {\n const activeDot = caps.unicode ? '●' : '(*)';\n const inactiveDot = caps.unicode ? '○' : '( )';\n const indicators = this._slides\n .map((_, index) => index === this._activeIndex ? activeDot : inactiveDot)\n .join(' ');\n screen.writeString(x, y + height - 1, indicators.slice(0, width).padEnd(width), attrs);\n }\n }\n\n private _normalizeIndex(index: number): number {\n const count = Math.max(1, this._slides.length);\n return ((index % count) + count) % count;\n }\n}\n","// Modal — overlay dialog with backdrop\nimport { Widget } from '@termuijs/widgets';\nimport { type Style, type Screen, mergeStyles, defaultStyle, styleToCellAttrs, getBorderChars, caps } from '@termuijs/core';\n\nexport interface ModalOptions {\n title?: string;\n width?: number;\n height?: number;\n borderColor?: Style['fg'];\n backdropChar?: string;\n}\n\nexport class Modal extends Widget {\n private _title: string;\n private _modalWidth: number;\n private _modalHeight: number;\n private _borderColor: Style['fg'];\n private _backdropChar: string;\n private _visible = false;\n private _content: Widget | null = null;\n\n constructor(options: ModalOptions = {}, style?: Partial<Style>) {\n super(mergeStyles(defaultStyle(), style ?? {}));\n this._title = options.title ?? '';\n this._modalWidth = options.width ?? 50;\n this._modalHeight = options.height ?? 15;\n this._borderColor = options.borderColor ?? { type: 'named', name: 'cyan' };\n this._backdropChar = options.backdropChar ?? (caps.unicode ? '░' : ' ');\n }\n\n get visible(): boolean { return this._visible; }\n show(): void { this._visible = true; this.markDirty(); }\n hide(): void { this._visible = false; this.markDirty(); }\n toggle(): void { this._visible = !this._visible; this.markDirty(); }\n setContent(content: Widget): void { this._content = content; this.markDirty(); }\n\n protected _renderSelf(screen: Screen): void {\n if (!this._visible) return;\n const { x, y, width, height } = this._rect;\n const attrs = styleToCellAttrs(this.style);\n // Backdrop\n for (let r = 0; r < height; r++) {\n screen.writeString(x, y + r, this._backdropChar.repeat(width), { ...attrs, dim: true });\n }\n // Centered modal\n const mw = Math.min(this._modalWidth, width - 4);\n const mh = Math.min(this._modalHeight, height - 2);\n const mx = x + Math.floor((width - mw) / 2);\n const my = y + Math.floor((height - mh) / 2);\n const border = getBorderChars('single');\n if (!border) return;\n const bAttrs = { ...attrs, fg: this._borderColor };\n // Title bar\n const titleStr = this._title ? ` ${this._title} ` : '';\n const topFill = mw - 2 - titleStr.length;\n const tl = Math.floor(topFill / 2);\n const tr = topFill - tl;\n screen.writeString(mx, my, border.topLeft + border.top.repeat(tl) + titleStr + border.top.repeat(Math.max(0, tr)) + border.topRight, bAttrs);\n // Sides\n const clr = styleToCellAttrs(this.style);\n for (let r = 1; r < mh - 1; r++) {\n screen.writeString(mx, my + r, border.left, bAttrs);\n screen.writeString(mx + 1, my + r, ' '.repeat(mw - 2), clr);\n screen.writeString(mx + mw - 1, my + r, border.right, bAttrs);\n }\n // Bottom\n screen.writeString(mx, my + mh - 1, border.bottomLeft + border.bottom.repeat(mw - 2) + border.bottomRight, bAttrs);\n // Content\n if (this._content) {\n const cr = { x: mx + 2, y: my + 1, width: mw - 4, height: mh - 2 };\n this._content.updateRect(cr);\n this._content.render(screen);\n }\n }\n}\n","// ─────────────────────────────────────────────────────\n// @termuijs/ui — Drawer widget\n//\n// A side panel that slides in from an edge of the terminal.\n// It overlays existing content when open and dims the rest\n// of the screen behind it.\n//\n// Keyboard behaviour:\n// Escape Fire onClose\n// Tab Cycle focus forward through focusable children\n// Shift+Tab Cycle focus backward through focusable children\n// ─────────────────────────────────────────────────────\n\nimport { Widget } from '@termuijs/widgets';\nimport {\n type Style,\n type Screen,\n type KeyEvent,\n mergeStyles,\n defaultStyle,\n styleToCellAttrs,\n getBorderChars,\n caps,\n} from '@termuijs/core';\n\n// ── Types ────────────────────────────────────────────\n\n/** The edge from which the drawer slides into view. */\nexport type DrawerPosition = 'left' | 'right' | 'top' | 'bottom';\n\nexport interface DrawerOptions {\n /** Edge the drawer appears from. */\n position: DrawerPosition;\n /**\n * Panel width in columns.\n * Applies to 'left' and 'right' positions only.\n * Defaults to 30.\n */\n width?: number;\n /**\n * Panel height in rows.\n * Applies to 'top' and 'bottom' positions only.\n * Defaults to 10.\n */\n height?: number;\n /** Optional title shown in the drawer's top border. */\n title?: string;\n /** Called when the user presses Escape or explicitly closes the drawer. */\n onClose: () => void;\n /** Character used for the dimmed backdrop. Defaults to '░' (unicode) or ' '. */\n backdropChar?: string;\n /** Border colour. Defaults to cyan. */\n borderColor?: Style['fg'];\n}\n\n// ── Widget ───────────────────────────────────────────\n\n/**\n * Drawer — a side panel that slides in from any edge.\n *\n * Usage:\n * ```ts\n * const drawer = new Drawer({\n * position: 'right',\n * width: 30,\n * title: 'Settings',\n * onClose: () => closeDrawer(),\n * });\n * drawer.addChild(new Form({ fields: settingsFields }));\n * drawer.open();\n * ```\n *\n * Wire keyboard events via `handleKey(event)`.\n */\nexport class Drawer extends Widget {\n private _position: DrawerPosition;\n private _panelWidth: number;\n private _panelHeight: number;\n private _title: string;\n private _onClose: () => void;\n private _backdropChar: string;\n private _borderColor: Style['fg'];\n private _open = false;\n\n /**\n * Index into the flat list of focusable children that currently\n * holds the \"focused\" slot inside the focus trap.\n * Starts at -1 so the first Tab press naturally lands on index 0.\n */\n private _focusIndex = -1;\n\n focusable = true;\n\n constructor(options: DrawerOptions) {\n super(mergeStyles(defaultStyle(), {}));\n this._position = options.position;\n this._panelWidth = options.width ?? 30;\n this._panelHeight = options.height ?? 10;\n this._title = options.title ?? '';\n this._onClose = options.onClose;\n this._backdropChar = options.backdropChar ?? (caps.unicode ? '░' : ' ');\n this._borderColor = options.borderColor ?? { type: 'named', name: 'cyan' };\n }\n\n // ── Public API ───────────────────────────────────\n\n /** Whether the drawer is currently open. */\n get isOpen(): boolean {\n return this._open;\n }\n\n /** Open the drawer and mark dirty. */\n open(): void {\n this._open = true;\n this._focusIndex = -1;\n this.markDirty();\n }\n\n /** Close the drawer and mark dirty. */\n close(): void {\n this._open = false;\n this.markDirty();\n }\n\n /** Toggle open/close state. */\n toggle(): void {\n this._open ? this.close() : this.open();\n }\n\n /**\n * Handle keyboard input.\n *\n * | Key | Action |\n * |--------------|---------------------------------|\n * | `Escape` | Fire `onClose` |\n * | `Tab` | Move focus to next child |\n * | `Shift+Tab` | Move focus to previous child |\n */\n handleKey(event: KeyEvent): void {\n if (!this._open) return;\n\n switch (event.key) {\n case 'escape':\n this._onClose();\n break;\n case 'tab':\n if (event.shift) {\n this._focusPrev();\n } else {\n this._focusNext();\n }\n event.preventDefault?.();\n event.stopPropagation?.();\n break;\n }\n }\n\n // ── Focus trap ───────────────────────────────────\n\n /**\n * Return a flat list of all focusable descendants in tree order.\n * Used to implement the focus trap.\n */\n private _focusableChildren(): Widget[] {\n const result: Widget[] = [];\n const collect = (widget: Widget): void => {\n for (const child of widget.children) {\n if (child.focusable) result.push(child);\n collect(child);\n }\n };\n collect(this);\n return result;\n }\n\n private _focusNext(): void {\n const focusable = this._focusableChildren();\n if (focusable.length === 0) return;\n // _focusIndex starts at -1 so the first +1 lands on index 0.\n this._focusIndex = (this._focusIndex + 1) % focusable.length;\n this._applyFocus(focusable);\n this.markDirty();\n }\n\n private _focusPrev(): void {\n const focusable = this._focusableChildren();\n if (focusable.length === 0) return;\n // When _focusIndex is -1 (no prior Tab), wrap to the last child.\n const base = this._focusIndex < 0 ? 0 : this._focusIndex;\n this._focusIndex = (base - 1 + focusable.length) % focusable.length;\n this._applyFocus(focusable);\n this.markDirty();\n }\n\n private _applyFocus(focusable: Widget[]): void {\n for (let i = 0; i < focusable.length; i++) {\n focusable[i].isFocused = i === this._focusIndex;\n }\n }\n\n // ── Geometry helpers ─────────────────────────────\n\n /**\n * Compute the panel rect (position + dimensions) relative to the\n * full widget rect.\n */\n private _panelRect(\n x: number,\n y: number,\n totalWidth: number,\n totalHeight: number,\n ): { px: number; py: number; pw: number; ph: number } {\n const pw =\n this._position === 'left' || this._position === 'right'\n ? Math.min(this._panelWidth, totalWidth)\n : totalWidth;\n\n const ph =\n this._position === 'top' || this._position === 'bottom'\n ? Math.min(this._panelHeight, totalHeight)\n : totalHeight;\n\n let px: number;\n let py: number;\n\n switch (this._position) {\n case 'left':\n px = x;\n py = y;\n break;\n case 'right':\n px = x + totalWidth - pw;\n py = y;\n break;\n case 'top':\n px = x;\n py = y;\n break;\n case 'bottom':\n px = x;\n py = y + totalHeight - ph;\n break;\n }\n\n return { px, py, pw, ph };\n }\n\n // ── Rendering ────────────────────────────────────\n\n protected _renderSelf(screen: Screen): void {\n if (!this._open) return;\n\n const { x, y, width, height } = this._rect;\n if (width <= 0 || height <= 0) return;\n\n const attrs = styleToCellAttrs(this.style);\n\n // ── 1. Backdrop (dim the whole area) ─────────\n for (let r = 0; r < height; r++) {\n screen.writeString(\n x,\n y + r,\n this._backdropChar.repeat(width),\n { ...attrs, dim: true },\n );\n }\n\n // ── 2. Panel ─────────────────────────────────\n const { px, py, pw, ph } = this._panelRect(x, y, width, height);\n\n const border = getBorderChars('single');\n if (!border) return;\n\n const bAttrs = { ...attrs, fg: this._borderColor };\n\n // Clear panel interior (overwrite backdrop characters)\n for (let r = 1; r < ph - 1; r++) {\n screen.writeString(px, py + r, border.left, bAttrs);\n screen.writeString(px + 1, py + r, ' '.repeat(Math.max(0, pw - 2)), attrs);\n screen.writeString(px + pw - 1, py + r, border.right, bAttrs);\n }\n\n // ── Top border with optional title ────────────\n const titleStr = this._title ? ` ${this._title} ` : '';\n const innerWidth = Math.max(0, pw - 2);\n const fill = Math.max(0, innerWidth - titleStr.length);\n const leftFill = Math.floor(fill / 2);\n const rightFill = fill - leftFill;\n\n screen.writeString(\n px,\n py,\n border.topLeft\n + border.top.repeat(leftFill)\n + titleStr\n + border.top.repeat(rightFill)\n + border.topRight,\n bAttrs,\n );\n\n // ── Bottom border ─────────────────────────────\n if (ph >= 2) {\n screen.writeString(\n px,\n py + ph - 1,\n border.bottomLeft + border.bottom.repeat(Math.max(0, pw - 2)) + border.bottomRight,\n bAttrs,\n );\n }\n\n // ── 3. Render children inside the content area ──\n const contentX = px + 1;\n const contentY = py + 1;\n const contentW = Math.max(0, pw - 2);\n const contentH = Math.max(0, ph - 2);\n\n if (contentW > 0 && contentH > 0) {\n for (const child of this._children) {\n const originalRect = { ...child.rect };\n child.updateRect({\n x: contentX,\n y: contentY,\n width: contentW,\n height: contentH,\n });\n screen.pushClip({ x: contentX, y: contentY, width: contentW, height: contentH });\n try {\n child.render(screen);\n } finally {\n screen.popClip();\n child.updateRect(originalRect);\n }\n }\n }\n }\n}\n","// Select — single-item dropdown selector\nimport { Widget } from '@termuijs/widgets';\nimport { type Style, type Screen, mergeStyles, defaultStyle, styleToCellAttrs, caps } from '@termuijs/core';\n\nexport interface SelectOption { label: string; value: string; disabled?: boolean; }\nexport interface SelectOptions {\n placeholder?: string;\n activeColor?: Style['fg'];\n onSelect?: (option: SelectOption, index: number) => void;\n}\n\nexport class Select extends Widget {\n private _options: SelectOption[];\n private _selectedIndex = 0;\n private _isOpen = false;\n private _placeholder: string;\n private _activeColor: Style['fg'];\n private _onSelect?: (option: SelectOption, index: number) => void;\n focusable = true;\n\n constructor(options: SelectOption[], config: SelectOptions = {}, style?: Partial<Style>) {\n super(mergeStyles(mergeStyles(defaultStyle(), { height: 1 }), style ?? {}));\n this._options = options;\n this._placeholder = config.placeholder ?? 'Select...';\n this._activeColor = config.activeColor ?? { type: 'named', name: 'cyan' };\n this._onSelect = config.onSelect;\n }\n\n get selectedOption(): SelectOption | undefined { return this._options[this._selectedIndex]; }\n get selectedIndex(): number { return this._selectedIndex; }\n get isOpen(): boolean { return this._isOpen; }\n open(): void { this._isOpen = true; this.markDirty(); }\n close(): void { this._isOpen = false; this.markDirty(); }\n toggle(): void { this._isOpen = !this._isOpen; this.markDirty(); }\n\n selectNext(): void {\n let n = this._selectedIndex + 1;\n while (n < this._options.length && this._options[n].disabled) n++;\n if (n < this._options.length) { this._selectedIndex = n; this.markDirty(); }\n }\n selectPrev(): void {\n let n = this._selectedIndex - 1;\n while (n >= 0 && this._options[n].disabled) n--;\n if (n >= 0) { this._selectedIndex = n; this.markDirty(); }\n }\n confirm(): void {\n const opt = this._options[this._selectedIndex];\n if (opt && !opt.disabled) { this._onSelect?.(opt, this._selectedIndex); this._isOpen = false; this.markDirty(); }\n }\n\n protected _renderSelf(screen: Screen): void {\n const { x, y, width } = this._rect;\n if (width <= 0) return;\n const attrs = styleToCellAttrs(this.style);\n const sel = this._options[this._selectedIndex];\n const label = sel ? sel.label : this._placeholder;\n const prefix = this._isOpen ? (caps.unicode ? '▼ ' : 'v ') : (caps.unicode ? '▶ ' : '> ');\n screen.writeString(x, y, prefix + label.slice(0, width - 2), { ...attrs, fg: this._activeColor });\n if (this._isOpen) {\n for (let i = 0; i < this._options.length; i++) {\n const o = this._options[i];\n const isSel = i === this._selectedIndex;\n const m = isSel ? (caps.unicode ? '● ' : '* ') : ' ';\n screen.writeString(x, y + 1 + i, m + o.label.slice(0, width - 2), {\n ...attrs,\n fg: o.disabled ? { type: 'named' as const, name: 'brightBlack' as const } : isSel ? this._activeColor : attrs.fg,\n bold: isSel, dim: o.disabled,\n });\n }\n }\n }\n}\n","// Combobox — text input with inline filtered dropdown\nimport { Widget } from '@termuijs/widgets';\nimport {\n type Style,\n type Screen,\n type KeyEvent,\n mergeStyles,\n defaultStyle,\n styleToCellAttrs,\n caps,\n stringWidth,\n truncate\n} from '@termuijs/core';\n\nexport interface ComboboxOption {\n label: string;\n value: string;\n}\n\nexport interface ComboboxOptions {\n placeholder?: string;\n activeColor?: Style['fg'];\n onSelect?: (value: string) => void;\n}\n\nexport class Combobox extends Widget {\n private _options: ComboboxOption[];\n private _placeholder: string;\n private _activeColor: Style['fg'];\n private _onSelect?: (value: string) => void;\n\n private _inputValue = '';\n private _committedValue = '';\n private _isOpen = false;\n private _selectedIndex = -1;\n focusable = true;\n\n constructor(options: ComboboxOption[], config?: ComboboxOptions) {\n super(mergeStyles(defaultStyle(), { height: 6, focusRingStyle: 'none' }));\n this._options = options;\n this._placeholder = config?.placeholder ?? '';\n this._activeColor = config?.activeColor ?? { type: 'named', name: 'cyan' };\n this._onSelect = config?.onSelect;\n }\n\n get value(): string {\n return this._committedValue;\n }\n\n get filtered(): ComboboxOption[] {\n const query = this._inputValue.toLowerCase();\n return this._options.filter(option =>\n option.label.toLowerCase().includes(query)\n );\n }\n\n handleKey(event: KeyEvent): void {\n const key = event.key;\n const filtered = this.filtered;\n\n if (key === 'down') {\n this._isOpen = true;\n if (filtered.length > 0) {\n this._selectedIndex = (this._selectedIndex + 1) % filtered.length;\n }\n this.markDirty();\n return;\n }\n\n if (key === 'up') {\n this._isOpen = true;\n if (filtered.length > 0) {\n if (this._selectedIndex <= 0) {\n this._selectedIndex = filtered.length - 1;\n } else {\n this._selectedIndex--;\n }\n }\n this.markDirty();\n return;\n }\n\n if (key === 'escape') {\n if (!this._isOpen && this._selectedIndex === -1) {\n return;\n }\n \n this._isOpen = false;\n this._selectedIndex = -1;\n this.markDirty();\n return;\n }\n\n if (key === 'enter') {\n if (this._isOpen && this._selectedIndex >= 0 && this._selectedIndex < filtered.length) {\n const selected = filtered[this._selectedIndex];\n this._committedValue = selected.value;\n this._inputValue = selected.label;\n this._onSelect?.(selected.value);\n } else {\n this._committedValue = this._inputValue;\n this._onSelect?.(this._inputValue);\n }\n this._isOpen = false;\n this._selectedIndex = -1;\n this.markDirty();\n return;\n }\n\n if (key === 'backspace') {\n if (this._inputValue.length === 0) {\n return;\n }\n \n this._inputValue = this._inputValue.slice(0, -1);\n this._isOpen = true;\n this._selectedIndex = -1;\n this.markDirty();\n return;\n }\n\n if (key.length === 1 && !event.ctrl && !event.alt) {\n this._inputValue += key;\n this._isOpen = true;\n this._selectedIndex = -1;\n this.markDirty();\n return;\n }\n }\n\n protected _renderSelf(screen: Screen): void {\n const { x, y, width, height } = this._getContentRect();\n if (width <= 0 || height <= 0) return;\n\n const attrs = styleToCellAttrs(this.style);\n const prefix = this._isOpen ? (caps.unicode ? '▼ ' : 'v ') : (caps.unicode ? '▶ ' : '> ');\n const prefixWidth = stringWidth(prefix);\n\n const isPlaceholder = this._inputValue === '' && !this.isFocused;\n const displayText = this._inputValue !== '' ? this._inputValue : (this.isFocused ? '' : this._placeholder);\n\n screen.writeString(x, y, prefix + truncate(displayText, width - prefixWidth), {\n ...attrs,\n fg: isPlaceholder ? { type: 'named', name: 'brightBlack' } : attrs.fg,\n });\n\n if (this.isFocused) {\n const cursorX = x + prefixWidth + stringWidth(truncate(this._inputValue, width - prefixWidth));\n if (cursorX < x + width) {\n screen.setCell(cursorX, y, {\n char: ' ',\n ...attrs,\n inverse: true,\n });\n }\n }\n\n const filtered = this.filtered;\n if (this._isOpen && this.isFocused && filtered.length > 0) {\n const renderCount = Math.min(filtered.length, height - 1);\n for (let i = 0; i < renderCount; i++) {\n const option = filtered[i];\n const isSelected = i === this._selectedIndex;\n const rowY = y + 1 + i;\n if (rowY >= y + height) break;\n\n const marker = isSelected ? (caps.unicode ? '● ' : '* ') : ' ';\n const itemText = truncate(option.label, width - stringWidth(marker));\n\n screen.writeString(x, rowY, marker + itemText, {\n ...attrs,\n fg: isSelected ? this._activeColor : attrs.fg,\n bold: isSelected,\n });\n }\n }\n }\n}\n","// LinearPrompt — screen-reader-friendly linear prompt rendering\nimport { Widget } from '@termuijs/widgets';\nimport { type Style, type Screen, type KeyEvent, mergeStyles, defaultStyle, styleToCellAttrs } from '@termuijs/core';\n\nexport interface LinearPromptOption {\n label: string;\n value: string;\n disabled?: boolean;\n}\n\nexport interface LinearPromptOptions {\n question: string;\n activeColor?: Style['fg'];\n onSelect?: (option: LinearPromptOption, index: number) => void;\n}\n\nexport class LinearPrompt extends Widget {\n private _options: LinearPromptOption[];\n private _selectedIndex = 0;\n private _question: string;\n private _activeColor: Style['fg'];\n private _onSelect?: (option: LinearPromptOption, index: number) => void;\n focusable = true;\n\n constructor(options: LinearPromptOption[], config: LinearPromptOptions) {\n super(mergeStyles(defaultStyle(), { height: options.length + 2 }));\n this._options = options;\n this._question = config.question;\n this._activeColor = config.activeColor ?? { type: 'named', name: 'cyan' };\n this._onSelect = config.onSelect;\n }\n\n get selectedOption(): LinearPromptOption | undefined {\n return this._options[this._selectedIndex];\n }\n\n get selectedIndex(): number {\n return this._selectedIndex;\n }\n\n selectNext(): void {\n let n = this._selectedIndex + 1;\n while (n < this._options.length && this._options[n].disabled) n++;\n if (n < this._options.length) {\n this._selectedIndex = n;\n this.markDirty();\n }\n }\n\n selectPrev(): void {\n let n = this._selectedIndex - 1;\n while (n >= 0 && this._options[n].disabled) n--;\n if (n >= 0) {\n this._selectedIndex = n;\n this.markDirty();\n }\n }\n\n confirm(): void {\n const opt = this._options[this._selectedIndex];\n if (opt && !opt.disabled) {\n this._onSelect?.(opt, this._selectedIndex);\n this.markDirty();\n }\n }\n\n handleKey(event: KeyEvent): void {\n switch (event.key) {\n case 'down':\n this.selectNext();\n break;\n\n case 'up':\n this.selectPrev();\n break;\n\n case 'enter':\n this.confirm();\n break;\n\n case 'tab':\n this.selectNext();\n break;\n\n case 'shift+tab':\n // Note: shift+tab is not directly supported in most terminals,\n // but we handle it for completeness if the platform provides it\n this.selectPrev();\n break;\n }\n }\n\n protected _renderSelf(screen: Screen): void {\n const { x, y, width } = this._rect;\n if (width <= 0) return;\n\n const attrs = styleToCellAttrs(this.style);\n let currentY = y;\n\n // Render question\n screen.writeString(x, currentY, this._question.slice(0, width), attrs);\n currentY++;\n\n // Render options sequentially without positioning codes\n for (let i = 0; i < this._options.length; i++) {\n const opt = this._options[i];\n const isSel = i === this._selectedIndex;\n const marker = isSel ? '> ' : ' ';\n const label = opt.label.slice(0, width - 2);\n\n screen.writeString(\n x,\n currentY,\n marker + label,\n {\n ...attrs,\n fg: opt.disabled\n ? { type: 'named', name: 'brightBlack' }\n : isSel\n ? this._activeColor\n : attrs.fg,\n bold: isSel,\n dim: opt.disabled,\n }\n );\n\n currentY++;\n }\n }\n}\n","// Pages — named page container with optional overlay behavior\nimport { Widget } from '@termuijs/widgets';\nimport { type Style, type Screen, mergeStyles, defaultStyle } from '@termuijs/core';\n\nexport interface Page {\n name: string;\n content: Widget;\n overlay?: boolean;\n}\n\nexport interface PagesOptions {\n style?: Partial<Style>;\n}\n\nexport class Pages extends Widget {\n private _pages: Page[];\n private _activePageName?: string;\n\n constructor(pages: Page[], options: PagesOptions = {}) {\n super(mergeStyles(defaultStyle(), options.style ?? { flexGrow: 1 }));\n this._pages = pages;\n for (const page of pages) {\n this.addChild(page.content);\n }\n this._activePageName = pages[0]?.name;\n this._updatePageVisibility();\n }\n\n get activePage(): string | undefined {\n return this._activePageName;\n }\n\n switchTo(name: string): void {\n const page = this._pages.find((item) => item.name === name);\n if (!page || page.name === this._activePageName) return;\n this._activePageName = page.name;\n this._updatePageVisibility();\n this.markDirty();\n }\n\n protected _renderSelf(_screen: Screen): void {\n // Container only\n }\n\n private _updatePageVisibility(): void {\n const active = this._pages.find((item) => item.name === this._activePageName) ?? this._pages[0];\n const base = this._pages[0];\n\n for (const page of this._pages) {\n const shouldShow = page === active || (active?.overlay === true && page === base && page !== active);\n page.content.setStyle({ visible: shouldShow });\n }\n }\n}\n","// ContentSwitcher — show a single active child widget\nimport { Widget } from '@termuijs/widgets';\nimport { type Style, type Screen, mergeStyles, defaultStyle } from '@termuijs/core';\n\nexport class ContentSwitcher extends Widget {\n private _activeId?: string;\n\n constructor(style: Partial<Style> = {}) {\n super(mergeStyles(defaultStyle(), style));\n }\n\n get activeId(): string | undefined {\n return this._activeId;\n }\n\n override addChild(child: Widget): void {\n super.addChild(child);\n if (this._activeId === undefined) {\n this._activeId = child.id;\n }\n this._updateChildVisibility();\n }\n\n setActive(id: string): void {\n if (id === this._activeId) return;\n const child = this._children.find((c) => c.id === id);\n if (!child) return;\n this._activeId = id;\n this._updateChildVisibility();\n this.markDirty();\n }\n\n protected _renderSelf(_screen: Screen): void {\n // Container only\n }\n\n private _updateChildVisibility(): void {\n for (const child of this._children) {\n child.setStyle({ visible: child.id === this._activeId });\n }\n }\n}\n","// SnippetPrompt — parse template placeholders and manage prompt values\nimport { Widget } from '@termuijs/widgets';\nimport { type Screen, mergeStyles, defaultStyle } from '@termuijs/core';\n\nexport interface SnippetPromptOptions {\n validate?: Record<string, (value: string) => string | null>;\n}\n\nexport class SnippetPrompt extends Widget {\n private _placeholders: string[];\n private _values: Map<string, string>;\n private _errors: Map<string, string> = new Map();\n private _validators: Map<string, (value: string) => string | null>;\n private _activeIndex = 0;\n\n constructor(template: string, options: SnippetPromptOptions = {}) {\n super(mergeStyles(defaultStyle(), { height: 1 }));\n this._placeholders = this._parsePlaceholders(template);\n this._values = new Map(this._placeholders.map((key) => [key, '']));\n this._validators = new Map(Object.entries(options.validate ?? {}));\n this.template = template;\n }\n\n readonly template: string;\n\n get placeholders(): string[] {\n return [...this._placeholders];\n }\n\n get activeField(): string | undefined {\n return this._placeholders[this._activeIndex];\n }\n\n get values(): Record<string, string> {\n const record: Record<string, string> = {};\n for (const [key, value] of this._values) record[key] = value;\n return record;\n }\n\n get errors(): Record<string, string> {\n const record: Record<string, string> = {};\n for (const [key, value] of this._errors) record[key] = value;\n return record;\n }\n\n setValue(field: string, value: string): void {\n if (!this._values.has(field)) return;\n this._values.set(field, value);\n this._errors.delete(field);\n this.markDirty();\n }\n\n nextField(): void {\n if (this._activeIndex < this._placeholders.length - 1) {\n this._activeIndex++;\n this.markDirty();\n }\n }\n\n prevField(): void {\n if (this._activeIndex > 0) {\n this._activeIndex--;\n this.markDirty();\n }\n }\n\n validate(): boolean {\n this._errors.clear();\n\n for (const field of this._placeholders) {\n const validator = this._validators.get(field);\n if (!validator) continue;\n const value = this._values.get(field) ?? '';\n const error = validator(value);\n if (error) {\n this._errors.set(field, error);\n }\n }\n\n this.markDirty();\n return this._errors.size === 0;\n }\n\n buildResult(): string {\n return this.template.replace(/{{\\s*([^}]+?)\\s*}}/g, (_match, name) => {\n return this._values.get(name) ?? '';\n });\n }\n\n protected _renderSelf(_screen: Screen): void {\n // Container only\n }\n\n private _parsePlaceholders(template: string): string[] {\n const placeholders: string[] = [];\n const seen = new Set<string>();\n const matcher = /{{\\s*([^}]+?)\\s*}}/g;\n let match: RegExpExecArray | null;\n\n while ((match = matcher.exec(template)) !== null) {\n const key = match[1].trim();\n if (!seen.has(key)) {\n seen.add(key);\n placeholders.push(key);\n }\n }\n\n return placeholders;\n }\n}\n","// MultiSelect — checkbox-style multi-item selector\nimport { Widget } from '@termuijs/widgets';\nimport { type Style, type Screen, mergeStyles, defaultStyle, styleToCellAttrs, caps } from '@termuijs/core';\n\nexport interface MultiSelectOption { label: string; value: string; disabled?: boolean; }\nexport interface MultiSelectOptions {\n activeColor?: Style['fg'];\n checkChar?: string;\n uncheckChar?: string;\n onSubmit?: (selected: MultiSelectOption[]) => void;\n}\n\nexport class MultiSelect extends Widget {\n private _options: MultiSelectOption[];\n private _cursorIndex = 0;\n private _checked: Set<number> = new Set();\n private _activeColor: Style['fg'];\n private _checkChar: string;\n private _uncheckChar: string;\n private _onSubmit?: (selected: MultiSelectOption[]) => void;\n focusable = true;\n\n constructor(options: MultiSelectOption[], config: MultiSelectOptions = {}) {\n super(mergeStyles(defaultStyle(), { height: Math.max(options.length, 1) }));\n this._options = options;\n this._activeColor = config.activeColor ?? { type: 'named', name: 'cyan' };\n this._checkChar = config.checkChar ?? (caps.unicode ? '◼' : '[x]');\n this._uncheckChar = config.uncheckChar ?? (caps.unicode ? '◻' : '[ ]');\n this._onSubmit = config.onSubmit;\n }\n\n get selectedOptions(): MultiSelectOption[] {\n return [...this._checked].sort().map(i => this._options[i]);\n }\n selectNext(): void { let n = this._cursorIndex + 1; while (n < this._options.length && this._options[n].disabled) n++; if (n < this._options.length) { this._cursorIndex = n; this.markDirty(); } }\n selectPrev(): void { let n = this._cursorIndex - 1; while (n >= 0 && this._options[n].disabled) n--; if (n >= 0) { this._cursorIndex = n; this.markDirty(); } }\n toggleCurrent(): void {\n const o = this._options[this._cursorIndex];\n if (o && !o.disabled) { this._checked.has(this._cursorIndex) ? this._checked.delete(this._cursorIndex) : this._checked.add(this._cursorIndex); this.markDirty(); }\n }\n submit(): void { this._onSubmit?.(this.selectedOptions); }\n\n protected _renderSelf(screen: Screen): void {\n const { x, y, width, height } = this._rect;\n if (width <= 0 || height <= 0) return;\n const attrs = styleToCellAttrs(this.style);\n for (let i = 0; i < this._options.length && i < height; i++) {\n const o = this._options[i];\n const active = i === this._cursorIndex;\n const checked = this._checked.has(i);\n const label = `${active ? (caps.unicode ? '❯ ' : '> ') : ' '}${checked ? this._checkChar : this._uncheckChar} ${o.label}`;\n screen.writeString(x, y + i, label.slice(0, width), {\n ...attrs,\n fg: o.disabled ? { type: 'named' as const, name: 'brightBlack' as const } : active ? this._activeColor : attrs.fg,\n bold: active, dim: o.disabled,\n });\n }\n }\n}\n","// Transfer — dual-list shuttle selector widget\nimport { Widget } from '@termuijs/widgets';\nimport {\n type Style,\n type Screen,\n type KeyEvent,\n mergeStyles,\n defaultStyle,\n styleToCellAttrs,\n caps,\n} from '@termuijs/core';\n\nexport interface TransferItem {\n label: string;\n value: string;\n disabled?: boolean;\n}\n\nexport interface TransferOptions {\n activeColor?: Style['fg'];\n onChange?: (targetValues: string[]) => void;\n}\n\nexport class Transfer extends Widget {\n private _sourceItems: TransferItem[];\n private _targetItems: TransferItem[] = [];\n private _sourceCursorIndex = 0;\n private _targetCursorIndex = 0;\n private _activePane: 'source' | 'target' = 'source';\n private _activeColor: Style['fg'];\n private _onChange?: (targetValues: string[]) => void;\n focusable = true;\n\n constructor(items: TransferItem[], config: TransferOptions = {}) {\n super(mergeStyles(defaultStyle(), { height: Math.max(items.length, 1) }));\n this._sourceItems = [...items];\n this._activeColor = config.activeColor ?? { type: 'named', name: 'cyan' };\n this._onChange = config.onChange;\n this._clampCursors();\n }\n\n get targetValues(): string[] {\n return this._targetItems.map(item => item.value);\n }\n\n get sourceValues(): string[] {\n return this._sourceItems.map(item => item.value);\n }\n\n get targetItems(): TransferItem[] {\n return [...this._targetItems];\n }\n\n get sourceItems(): TransferItem[] {\n return [...this._sourceItems];\n }\n\n get activePane(): 'source' | 'target' {\n return this._activePane;\n }\n\n get sourceCursorIndex(): number {\n return this._sourceCursorIndex;\n }\n\n get targetCursorIndex(): number {\n return this._targetCursorIndex;\n }\n\n toggleActivePane(): void {\n this._activePane = this._activePane === 'source' ? 'target' : 'source';\n this.markDirty();\n }\n\n private _clampCursors(): void {\n if (this._sourceItems.length === 0) {\n this._sourceCursorIndex = 0;\n } else {\n this._sourceCursorIndex = Math.max(0, Math.min(this._sourceCursorIndex, this._sourceItems.length - 1));\n }\n\n if (this._targetItems.length === 0) {\n this._targetCursorIndex = 0;\n } else {\n this._targetCursorIndex = Math.max(0, Math.min(this._targetCursorIndex, this._targetItems.length - 1));\n }\n }\n\n selectNext(): void {\n if (this._activePane === 'source') {\n let n = this._sourceCursorIndex + 1;\n while (n < this._sourceItems.length && this._sourceItems[n].disabled) n++;\n if (n < this._sourceItems.length) {\n this._sourceCursorIndex = n;\n this.markDirty();\n }\n } else {\n let n = this._targetCursorIndex + 1;\n while (n < this._targetItems.length && this._targetItems[n].disabled) n++;\n if (n < this._targetItems.length) {\n this._targetCursorIndex = n;\n this.markDirty();\n }\n }\n }\n\n selectPrev(): void {\n if (this._activePane === 'source') {\n let n = this._sourceCursorIndex - 1;\n while (n >= 0 && this._sourceItems[n].disabled) n--;\n if (n >= 0) {\n this._sourceCursorIndex = n;\n this.markDirty();\n }\n } else {\n let n = this._targetCursorIndex - 1;\n while (n >= 0 && this._targetItems[n].disabled) n--;\n if (n >= 0) {\n this._targetCursorIndex = n;\n this.markDirty();\n }\n }\n }\n\n transferToTarget(): void {\n if (this._sourceItems.length === 0) return;\n const item = this._sourceItems[this._sourceCursorIndex];\n if (item.disabled) return;\n\n this._sourceItems.splice(this._sourceCursorIndex, 1);\n this._targetItems.push(item);\n\n this._clampCursors();\n this.markDirty();\n this._onChange?.(this.targetValues);\n }\n\n transferToSource(): void {\n if (this._targetItems.length === 0) return;\n const item = this._targetItems[this._targetCursorIndex];\n if (item.disabled) return;\n\n this._targetItems.splice(this._targetCursorIndex, 1);\n this._sourceItems.push(item);\n\n this._clampCursors();\n this.markDirty();\n this._onChange?.(this.targetValues);\n }\n\n handleKey(event: KeyEvent): void {\n switch (event.key) {\n case 'up':\n this.selectPrev();\n break;\n case 'down':\n this.selectNext();\n break;\n case 'tab':\n this.toggleActivePane();\n break;\n case 'right':\n if (this._activePane === 'source') {\n this.transferToTarget();\n }\n break;\n case 'left':\n if (this._activePane === 'target') {\n this.transferToSource();\n }\n break;\n }\n }\n\n protected _renderSelf(screen: Screen): void {\n const { x, y, width, height } = this._rect;\n if (width <= 0 || height <= 0) return;\n\n const attrs = styleToCellAttrs(this.style);\n\n const leftPaneWidth = Math.floor((width - 1) / 2);\n const rightPaneWidth = width - 1 - leftPaneWidth;\n if (leftPaneWidth < 0 || rightPaneWidth < 0) return;\n\n const dividerX = x + leftPaneWidth;\n const dividerChar = caps.unicode ? '│' : '|';\n const indicator = caps.unicode ? '❯ ' : '> ';\n const noIndicator = ' '.repeat(indicator.length);\n\n for (let i = 0; i < height; i++) {\n // 1. Left pane (source)\n if (i < this._sourceItems.length) {\n const o = this._sourceItems[i];\n const active = this._activePane === 'source' && i === this._sourceCursorIndex;\n const text = (active ? indicator : noIndicator) + o.label;\n const truncatedText = text.slice(0, leftPaneWidth).padEnd(leftPaneWidth, ' ');\n screen.writeString(x, y + i, truncatedText, {\n ...attrs,\n fg: o.disabled ? { type: 'named' as const, name: 'brightBlack' as const } : active ? this._activeColor : attrs.fg,\n bold: active,\n dim: o.disabled,\n });\n } else {\n screen.writeString(x, y + i, ' '.repeat(leftPaneWidth), attrs);\n }\n\n // 2. Divider\n screen.setCell(dividerX, y + i, {\n char: dividerChar,\n ...attrs,\n });\n\n // 3. Right pane (target)\n if (i < this._targetItems.length) {\n const o = this._targetItems[i];\n const active = this._activePane === 'target' && i === this._targetCursorIndex;\n const text = (active ? indicator : noIndicator) + o.label;\n const truncatedText = text.slice(0, rightPaneWidth).padEnd(rightPaneWidth, ' ');\n screen.writeString(dividerX + 1, y + i, truncatedText, {\n ...attrs,\n fg: o.disabled ? { type: 'named' as const, name: 'brightBlack' as const } : active ? this._activeColor : attrs.fg,\n bold: active,\n dim: o.disabled,\n });\n } else {\n screen.writeString(dividerX + 1, y + i, ' '.repeat(rightPaneWidth), attrs);\n }\n }\n }\n}\n","// Tree — expandable/collapsible tree view\nimport { Widget } from '@termuijs/widgets';\nimport { type Style, type Screen, mergeStyles, defaultStyle, styleToCellAttrs, caps } from '@termuijs/core';\n\nexport interface TreeNode { label: string; children?: TreeNode[]; expanded?: boolean; icon?: string; }\nexport interface TreeOptions { activeColor?: Style['fg']; onSelect?: (node: TreeNode, path: number[]) => void; }\n\nexport class Tree extends Widget {\n private _roots: TreeNode[];\n private _cursorIndex = 0;\n private _activeColor: Style['fg'];\n private _onSelect?: (node: TreeNode, path: number[]) => void;\n focusable = true;\n\n constructor(roots: TreeNode[], options: TreeOptions = {}) {\n super(mergeStyles(defaultStyle(), { flexGrow: 1 }));\n this._roots = roots;\n this._activeColor = options.activeColor ?? { type: 'named', name: 'cyan' };\n this._onSelect = options.onSelect;\n }\n\n private _flatten(): { node: TreeNode; depth: number; path: number[]; hasChildren: boolean }[] {\n const result: { node: TreeNode; depth: number; path: number[]; hasChildren: boolean }[] = [];\n const walk = (nodes: TreeNode[], depth: number, path: number[]) => {\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i];\n const hasChildren = (node.children?.length ?? 0) > 0;\n result.push({ node, depth, path: [...path, i], hasChildren });\n if (hasChildren && node.expanded) walk(node.children!, depth + 1, [...path, i]);\n }\n };\n walk(this._roots, 0, []);\n return result;\n }\n\n selectNext(): void { const f = this._flatten(); if (this._cursorIndex < f.length - 1) { this._cursorIndex++; this.markDirty(); } }\n selectPrev(): void { if (this._cursorIndex > 0) { this._cursorIndex--; this.markDirty(); } }\n toggleExpand(): void { const f = this._flatten(); const it = f[this._cursorIndex]; if (it?.hasChildren) { it.node.expanded = !it.node.expanded; this.markDirty(); } }\n confirm(): void {\n const f = this._flatten(); const it = f[this._cursorIndex];\n if (it) { it.hasChildren ? this.toggleExpand() : this._onSelect?.(it.node, it.path); }\n }\n\n protected _renderSelf(screen: Screen): void {\n const { x, y, width, height } = this._rect;\n if (width <= 0 || height <= 0) return;\n const attrs = styleToCellAttrs(this.style);\n const flat = this._flatten();\n for (let i = 0; i < flat.length && i < height; i++) {\n const it = flat[i];\n const active = i === this._cursorIndex;\n const indent = ' '.repeat(it.depth);\n const icon = it.hasChildren ? (it.node.expanded ? (caps.unicode ? '▼ ' : 'v ') : (caps.unicode ? '▶ ' : '> ')) : ' ';\n const nodeIcon = it.node.icon ? `${it.node.icon} ` : '';\n const line = `${indent}${icon}${nodeIcon}${it.node.label}`;\n screen.writeString(x, y + i, line.slice(0, width), { ...attrs, fg: active ? this._activeColor : attrs.fg, bold: active });\n }\n }\n}\n","// SortPrompt — sortable item list\nimport { Widget } from '@termuijs/widgets';\nimport { type Style, type Screen, type KeyEvent, mergeStyles, defaultStyle, styleToCellAttrs, caps } from '@termuijs/core';\n\nexport interface SortPromptOptions {\n activeColor?: Style['fg'];\n onSubmit?: (items: string[]) => void;\n}\n\nexport class SortPrompt extends Widget {\n private _items: string[];\n private _cursorIndex = 0;\n private _activeColor: Style['fg'];\n private _onSubmit?: (items: string[]) => void;\n focusable = true;\n\n constructor(items: string[], options: SortPromptOptions = {}) {\n super(mergeStyles(defaultStyle(), { flexGrow: 1 }));\n this._items = [...items];\n this._activeColor = options.activeColor ?? { type: 'named', name: 'cyan' };\n this._onSubmit = options.onSubmit;\n }\n\n selectNext(): void {\n if (this._cursorIndex < this._items.length - 1) {\n this._cursorIndex++;\n this.markDirty();\n }\n }\n\n selectPrev(): void {\n if (this._cursorIndex > 0) {\n this._cursorIndex--;\n this.markDirty();\n }\n }\n\n moveItemUp(): void {\n if (this._cursorIndex > 0) {\n const temp = this._items[this._cursorIndex];\n this._items[this._cursorIndex] = this._items[this._cursorIndex - 1];\n this._items[this._cursorIndex - 1] = temp;\n this._cursorIndex--;\n this.markDirty();\n }\n }\n\n moveItemDown(): void {\n if (this._cursorIndex < this._items.length - 1) {\n const temp = this._items[this._cursorIndex];\n this._items[this._cursorIndex] = this._items[this._cursorIndex + 1];\n this._items[this._cursorIndex + 1] = temp;\n this._cursorIndex++;\n this.markDirty();\n }\n }\n\n submit(): void {\n this._onSubmit?.(this._items);\n }\n\n handleKey(event: KeyEvent): void {\n switch (event.key) {\n case 'shift+up':\n this.moveItemUp();\n break;\n\n case 'shift+down':\n this.moveItemDown();\n break;\n\n case 'enter':\n this.submit();\n break;\n }\n }\n\n protected _renderSelf(screen: Screen): void {\n const { x, y, width, height } = this._rect;\n if (width <= 0 || height <= 0) return;\n\n const attrs = styleToCellAttrs(this.style);\n\n for (let i = 0; i < this._items.length && i < height; i++) {\n const active = i === this._cursorIndex;\n const indicator = active ? (caps.unicode ? '◉ ' : '> ') : ' ';\n const line = `${indicator}${this._items[i]}`;\n\n screen.writeString(\n x,\n y + i,\n line.slice(0, width),\n {\n ...attrs,\n fg: active ? this._activeColor : attrs.fg,\n bold: active,\n },\n );\n }\n }\n}","// Toast — auto-dismiss notification\nimport { Widget } from '@termuijs/widgets';\nimport { type Screen, mergeStyles, defaultStyle, styleToCellAttrs, caps } from '@termuijs/core';\n\nexport type ToastType = 'info' | 'success' | 'warning' | 'error';\nexport interface ToastMessage { text: string; type: ToastType; expireAt: number; }\nexport interface ToastOptions {\n position?: 'top-right' | 'bottom-right' | 'top-left' | 'bottom-left';\n durationMs?: number;\n maxVisible?: number;\n /** Enable screen reader announcements (default: true) */\n announce?: boolean;\n}\n\nconst ICONS_UNICODE: Record<ToastType, string> = { info: 'ℹ', success: '✓', warning: '⚠', error: '✗' };\nconst ICONS_ASCII: Record<ToastType, string> = { info: 'i', success: '+', warning: '!', error: 'x' };\nconst COLORS: Record<ToastType, string> = { info: 'cyan', success: 'green', warning: 'yellow', error: 'red' };\n\nexport class Toast extends Widget {\n private _messages: ToastMessage[] = [];\n private _position: string;\n private _durationMs: number;\n private _maxVisible: number;\n private _announce: boolean;\n\n constructor(options: ToastOptions = {}) {\n super(mergeStyles(defaultStyle(), {}));\n this._position = options.position ?? 'top-right';\n this._durationMs = options.durationMs ?? 3000;\n this._maxVisible = options.maxVisible ?? 5;\n this._announce = options.announce ?? true;\n }\n\n push(text: string, type: ToastType = 'info'): void {\n this._messages.push({ text, type, expireAt: Date.now() + this._durationMs });\n this.markDirty();\n if (this._announce) {\n this._announceToScreenReader(text, type);\n }\n }\n info(text: string): void { this.push(text, 'info'); }\n success(text: string): void { this.push(text, 'success'); }\n warning(text: string): void { this.push(text, 'warning'); }\n error(text: string): void { this.push(text, 'error'); }\n\n private _announceToScreenReader(text: string, _type: ToastType): void {\n try {\n const announcement = `[${text}]`;\n const oscSequence = `\\x1b]777;notify;TermUI;${announcement}\\x07`;\n process.stderr.write(oscSequence);\n } catch {\n // Silently fail if stderr is not writable\n }\n }\n protected _renderSelf(screen: Screen): void {\n const now = Date.now();\n this._messages = this._messages.filter(m => m.expireAt > now);\n if (this._messages.length === 0) return;\n const { x, y, width, height } = this._rect;\n const visible = this._messages.slice(-this._maxVisible);\n const tw = Math.min(40, width - 2);\n const isRight = this._position.includes('right');\n const isBottom = this._position.includes('bottom');\n const sx = isRight ? x + width - tw - 1 : x + 1;\n const sy = isBottom ? y + height - visible.length - 1 : y + 1;\n const icons = caps.unicode ? ICONS_UNICODE : ICONS_ASCII;\n const attrs = styleToCellAttrs(this.style);\n for (let i = 0; i < visible.length; i++) {\n const m = visible[i];\n const label = ` ${icons[m.type]} ${m.text} `.slice(0, tw).padEnd(tw);\n screen.writeString(sx, sy + i, label, { ...attrs, fg: { type: 'named', name: COLORS[m.type] as any }, bold: true }); // as any: COLORS values are string but Style.name expects NamedColor; types need aligning\n }\n }\n}\n","// ConfirmDialog — yes/no prompt overlay\nimport { Widget } from '@termuijs/widgets';\nimport { type Style, type Screen, type KeyEvent, mergeStyles, defaultStyle, styleToCellAttrs, getBorderChars } from '@termuijs/core';\n\nexport interface ConfirmDialogOptions {\n message: string;\n confirmLabel?: string;\n cancelLabel?: string;\n borderColor?: Style['fg'];\n onConfirm?: () => void;\n onCancel?: () => void;\n}\n\nexport class ConfirmDialog extends Widget {\n private _message: string;\n private _confirmLabel: string;\n private _cancelLabel: string;\n private _borderColor: Style['fg'];\n private _selected: 'confirm' | 'cancel' = 'confirm';\n private _visible = false;\n private _onConfirm?: () => void;\n private _onCancel?: () => void;\n focusable = true;\n\n constructor(options: ConfirmDialogOptions) {\n super(mergeStyles(defaultStyle(), {}));\n this._message = options.message;\n this._confirmLabel = options.confirmLabel ?? 'Yes';\n this._cancelLabel = options.cancelLabel ?? 'No';\n this._borderColor = options.borderColor ?? { type: 'named', name: 'yellow' };\n this._onConfirm = options.onConfirm;\n this._onCancel = options.onCancel;\n this.events.on('key', (event) => this.handleKey(event));\n }\n\n get visible(): boolean { return this._visible; }\n show(): void { this._visible = true; this._selected = 'confirm'; this.markDirty(); }\n hide(): void { this._visible = false; this.markDirty(); }\n selectConfirm(): void { this._selected = 'confirm'; this.markDirty(); }\n selectCancel(): void { this._selected = 'cancel'; this.markDirty(); }\n toggleSelection(): void { this._selected = this._selected === 'confirm' ? 'cancel' : 'confirm'; this.markDirty(); }\n confirm(): void {\n (this._selected === 'confirm' ? this._onConfirm : this._onCancel)?.();\n this._visible = false;\n this.markDirty();\n }\n\n private handleKey(event: KeyEvent): void {\n if (!this._visible) return;\n if (event.key === 'escape') {\n this.selectCancel();\n this.confirm();\n event.preventDefault();\n event.stopPropagation();\n }\n }\n\n protected _renderSelf(screen: Screen): void {\n if (!this._visible) return;\n const { x, y, width, height } = this._rect;\n if (width <= 0 || height <= 0) return;\n const attrs = styleToCellAttrs(this.style);\n for (let r = 0; r < height; r++) screen.writeString(x, y + r, '░'.repeat(width), { ...attrs, dim: true });\n const bw = Math.min(40, width - 4);\n const bh = 5;\n if (bw < 2 || height < bh) return;\n const bx = x + Math.floor((width - bw) / 2);\n const by = y + Math.floor((height - bh) / 2);\n const border = getBorderChars('single');\n if (!border) return;\n const ba = { ...attrs, fg: this._borderColor };\n screen.writeString(bx, by, border.topLeft + border.top.repeat(bw - 2) + border.topRight, ba);\n for (let r = 1; r < bh - 1; r++) {\n screen.writeString(bx, by + r, border.left, ba);\n screen.writeString(bx + 1, by + r, ' '.repeat(bw - 2), attrs);\n screen.writeString(bx + bw - 1, by + r, border.right, ba);\n }\n screen.writeString(bx, by + bh - 1, border.bottomLeft + border.bottom.repeat(bw - 2) + border.bottomRight, ba);\n screen.writeString(bx + 2, by + 1, this._message.slice(0, bw - 4), { ...attrs, bold: true });\n const yesStr = this._selected === 'confirm' ? ` [${this._confirmLabel}] ` : ` ${this._confirmLabel} `;\n const noStr = this._selected === 'cancel' ? ` [${this._cancelLabel}] ` : ` ${this._cancelLabel} `;\n screen.writeString(bx + 2, by + 3, yesStr, { ...attrs, fg: this._selected === 'confirm' ? { type: 'named', name: 'green' } : attrs.fg, bold: this._selected === 'confirm' });\n screen.writeString(bx + 2 + yesStr.length + 2, by + 3, noStr, { ...attrs, fg: this._selected === 'cancel' ? { type: 'named', name: 'red' } : attrs.fg, bold: this._selected === 'cancel' });\n }\n}\n","// Form — compound input container with validation\nimport { Widget } from '@termuijs/widgets';\nimport { type Style, type Screen, type KeyEvent, mergeStyles, defaultStyle, styleToCellAttrs } from '@termuijs/core';\nimport { validateInput, type InputValidator } from './validation.js';\n\nexport interface FormField {\n name: string; label: string; type: 'text' | 'select' | 'checkbox';\n placeholder?: string; required?: boolean; options?: string[];\n validate?: InputValidator;\n}\nexport interface FormOptions {\n labelColor?: Style['fg']; errorColor?: Style['fg']; activeColor?: Style['fg'];\n onSubmit?: (values: Record<string, string>) => void;\n}\n\nexport class Form extends Widget {\n private _fields: FormField[];\n private _values: Map<string, string> = new Map();\n private _errors: Map<string, string> = new Map();\n private _activeField = 0;\n private _cursorPos = 0;\n private _labelColor: Style['fg'];\n private _errorColor: Style['fg'];\n private _activeColor: Style['fg'];\n private _onSubmit?: (values: Record<string, string>) => void;\n focusable = true;\n\n constructor(fields: FormField[], options: FormOptions = {}) {\n super(mergeStyles(defaultStyle(), { height: fields.length * 2 + 1, flexGrow: 1 }));\n this._fields = fields;\n this._labelColor = options.labelColor ?? { type: 'named', name: 'cyan' };\n this._errorColor = options.errorColor ?? { type: 'named', name: 'red' };\n this._activeColor = options.activeColor ?? { type: 'named', name: 'cyan' };\n this._onSubmit = options.onSubmit;\n for (const f of fields) this._values.set(f.name, '');\n // Wire key events from the App/event system into this widget's handlers.\n // Minimal: only route printable chars and backspace to existing methods.\n this.events.on('key', (event: KeyEvent) => this.handleKey(event));\n }\n\n get values(): Record<string, string> { const r: Record<string, string> = {}; for (const [k, v] of this._values) r[k] = v; return r; }\n nextField(): void { if (this._activeField < this._fields.length) { this._activeField++; this._cursorPos = 0; this.markDirty(); } }\n prevField(): void { if (this._activeField > 0) { this._activeField--; this._cursorPos = (this._values.get(this._fields[this._activeField].name) ?? '').length; this.markDirty(); } }\n insertChar(ch: string): void {\n if (this._activeField >= this._fields.length) return;\n const f = this._fields[this._activeField]; const cur = this._values.get(f.name) ?? '';\n this._values.set(f.name, cur.slice(0, this._cursorPos) + ch + cur.slice(this._cursorPos));\n this._cursorPos++; this._errors.delete(f.name); this.markDirty();\n }\n deleteBack(): void {\n if (this._activeField >= this._fields.length) return;\n const f = this._fields[this._activeField]; const cur = this._values.get(f.name) ?? '';\n if (this._cursorPos > 0) { this._values.set(f.name, cur.slice(0, this._cursorPos - 1) + cur.slice(this._cursorPos)); this._cursorPos--; this.markDirty(); }\n }\n submit(): void {\n this._errors.clear(); let hasErr = false;\n for (const f of this._fields) {\n const v = this._values.get(f.name) ?? '';\n if (f.required && !v.trim()) { this._errors.set(f.name, `${f.label} is required`); hasErr = true; }\n const e = validateInput(f.validate, v);\n if (e) {\n this._errors.set(f.name, e);\n hasErr = true;}\n }\n if (!hasErr) this._onSubmit?.(this.values);\n this.markDirty();\n }\n\n /** Minimal key router — printable chars -> insertChar, backspace -> deleteBack */\n handleKey(event: KeyEvent): void {\n if (event.key === 'backspace') {\n this.deleteBack();\n return;\n }\n\n if (event.key && event.key.length === 1 && !event.ctrl && !event.alt) {\n this.insertChar(event.key);\n }\n }\n\n protected _renderSelf(screen: Screen): void {\n const { x, y, width, height } = this._rect;\n if (width <= 0 || height <= 0) return;\n const attrs = styleToCellAttrs(this.style);\n let row = 0;\n for (let i = 0; i < this._fields.length && row < height - 1; i++) {\n const f = this._fields[i]; const active = i === this._activeField;\n const val = this._values.get(f.name) ?? ''; const err = this._errors.get(f.name);\n screen.writeString(x, y + row, `${f.label}${f.required ? ' *' : ''}:`.slice(0, width), { ...attrs, fg: err ? this._errorColor : this._labelColor, bold: active }); row++;\n if (row >= height) break;\n const display = val || (f.placeholder ?? '');\n const msg = err ? ` - ${err}` : '';\n const displayText = `${active ? '❯ ' : ' '}${display}${msg}`;\n screen.writeString(x, y + row, displayText.slice(0, width), { ...attrs, fg: active ? this._activeColor : attrs.fg, dim: !val && !!f.placeholder }); row++;\n }\n if (row < height) {\n const isSub = this._activeField >= this._fields.length;\n screen.writeString(x, y + row, isSub ? ' [ Submit ]' : ' Submit ', { ...attrs, fg: isSub ? { type: 'named', name: 'green' } : attrs.fg, bold: isSub });\n }\n }\n}\n","import type { StandardSchemaV1 } from '@standard-schema/spec';\n\nexport type InputValidator =\n | StandardSchemaV1\n | ((v: unknown) => string | undefined | null);\n\nexport function validateInput(\n validator: InputValidator | undefined,\n value: unknown,\n): string | undefined {\n if (!validator) {\n return undefined;\n }\n\n if (typeof validator === 'function') {\n return validator(value) ?? undefined;\n }\n\n const result = validator['~standard'].validate(value);\n\n if (result instanceof Promise) {\n throw new Error('Async validators are not supported');\n }\n\n if (!result.issues?.length) {\n return undefined;\n }\n\n return result.issues[0]?.message ?? 'Validation failed';\n}","// CommandPalette — fuzzy-search command launcher\nimport { Widget } from '@termuijs/widgets';\nimport { type Style, type Screen, type KeyEvent, mergeStyles, defaultStyle, styleToCellAttrs, getBorderChars, caps } from '@termuijs/core';\n\nexport interface Command { id: string; label: string; shortcut?: string; action: () => void; category?: string; }\nexport interface CommandPaletteOptions { placeholder?: string; borderColor?: Style['fg']; activeColor?: Style['fg']; maxVisible?: number; }\n\nexport class CommandPalette extends Widget {\n private _commands: Command[];\n private _filtered: Command[] = [];\n private _query = '';\n private _cursorPos = 0;\n private _selectedIndex = 0;\n private _visible = false;\n private _placeholder: string;\n private _borderColor: Style['fg'];\n private _activeColor: Style['fg'];\n private _maxVisible: number;\n focusable = true;\n\n constructor(commands: Command[], options: CommandPaletteOptions = {}) {\n super(mergeStyles(defaultStyle(), {}));\n this._commands = commands;\n this._filtered = [...commands];\n this._placeholder = options.placeholder ?? 'Type a command...';\n this._borderColor = options.borderColor ?? { type: 'named', name: 'cyan' };\n this._activeColor = options.activeColor ?? { type: 'named', name: 'cyan' };\n this._maxVisible = options.maxVisible ?? 10;\n }\n\n get visible(): boolean { return this._visible; }\n show(): void { this._visible = true; this._query = ''; this._cursorPos = 0; this._selectedIndex = 0; this._filtered = [...this._commands]; this.markDirty(); }\n hide(): void { this._visible = false; this.markDirty(); }\n toggle(): void { this._visible ? this.hide() : this.show(); }\n insertChar(ch: string): void { this._query = this._query.slice(0, this._cursorPos) + ch + this._query.slice(this._cursorPos); this._cursorPos++; this._filter(); this.markDirty(); }\n deleteBack(): void { if (this._cursorPos > 0) { this._query = this._query.slice(0, this._cursorPos - 1) + this._query.slice(this._cursorPos); this._cursorPos--; this._filter(); this.markDirty(); } }\n selectNext(): void { if (this._selectedIndex < this._filtered.length - 1) { this._selectedIndex++; this.markDirty(); } }\n selectPrev(): void { if (this._selectedIndex > 0) { this._selectedIndex--; this.markDirty(); } }\n confirm(): void { const c = this._filtered[this._selectedIndex]; if (c) { this.hide(); c.action(); } }\n\n /**\n * Handle a KeyEvent from @termuijs/core.\n *\n * Wires all palette interactions to a single entry point so callers\n * only need:\n * app.on('key', e => palette.handleKey(e))\n *\n * Built-in bindings (only active while the palette is visible):\n * Ctrl+P — open / close (toggle)\n * ArrowUp / k — move selection up\n * ArrowDown / j — move selection down\n * Enter — confirm selected command\n * Escape — close\n * Backspace — delete last character\n * any printable — append character to query\n *\n * Ctrl+P is also handled while hidden so the palette can be opened.\n * All handled events have stopPropagation() called automatically.\n */\n handleKey(event: KeyEvent): void {\n // Ctrl+P toggles the palette regardless of current visibility\n if (event.ctrl && event.key === 'p') {\n event.stopPropagation();\n this.toggle();\n return;\n }\n\n // Remaining bindings only apply while the palette is open\n if (!this._visible) return;\n\n const { key, ctrl } = event;\n\n if (key === 'escape' || (ctrl && key === 'c')) {\n event.stopPropagation();\n this.hide();\n return;\n }\n\n if (key === 'up') {\n event.stopPropagation();\n this.selectPrev();\n return;\n }\n\n if (key === 'down') {\n event.stopPropagation();\n this.selectNext();\n return;\n }\n\n if (key === 'return' || key === 'enter') {\n event.stopPropagation();\n this.confirm();\n return;\n }\n\n if (key === 'backspace' || key === 'delete') {\n event.stopPropagation();\n this.deleteBack();\n return;\n }\n\n // Printable character — append to query\n // Ignore control sequences (key.length > 1 means special key name)\n if (!ctrl && !event.alt && key.length === 1) {\n event.stopPropagation();\n this.insertChar(key);\n }\n }\n\n private _filter(): void {\n const q = this._query.toLowerCase();\n if (!q) { this._filtered = [...this._commands]; } else {\n this._filtered = this._commands.filter(c => { \n const l =\n `${c.label} ${c.category ?? ''}`.toLowerCase(); let qi = 0; for (let i = 0; i < l.length && qi < q.length; i++) { if (l[i] === q[qi]) qi++; } return qi === q.length; });\n }\n this._selectedIndex = 0;\n }\n\n protected _renderSelf(screen: Screen): void {\n if (!this._visible) return;\n const { x, y, width, height } = this._rect;\n const attrs = styleToCellAttrs(this.style);\n // Backdrop\n const backdropCh = caps.unicode ? '░' : ' ';\n for (let r = 0; r < height; r++) screen.writeString(x, y + r, backdropCh.repeat(width), { ...attrs, dim: true });\n // Box\n const vis = this._filtered.slice(0, this._maxVisible);\n const grouped = new Map<string, Command[]>();\n for (const cmd of vis) {\n const category = cmd.category ?? 'General';\n if (!grouped.has(category)) {\n grouped.set(category, []);\n }\n grouped.get(category)!.push(cmd);\n }\n const bw = Math.min(60, width - 4);\n const totalVisRows = grouped.size + vis.length;\n const bh = Math.min(totalVisRows + 3, height - 2);\n const bx = x + Math.floor((width - bw) / 2);\n const by = y + 2;\n const border = getBorderChars('single');\n if (!border) return;\n const ba = { ...attrs, fg: this._borderColor };\n // Top\n screen.writeString(bx, by, border.topLeft + border.top.repeat(bw - 2) + border.topRight, ba);\n // Input row\n screen.writeString(bx, by + 1, border.left, ba);\n const input = this._query || this._placeholder;\n screen.writeString(bx + 1, by + 1, (` ${caps.unicode ? '🔍' : '[?]'} ` + input).slice(0, bw - 2).padEnd(bw - 2), { ...attrs, dim: !this._query });\n screen.writeString(bx + bw - 1, by + 1, border.right, ba);\n // Separator\n screen.writeString(bx, by + 2, border.left + '─'.repeat(bw - 2) + border.right, ba);\n // Items\n let rowOffset = 0;\n\nfor (const [category, commands] of grouped) {\n screen.writeString(\n bx + 1,\n by + 3 + rowOffset,\n `[${category}]`,\n { ...attrs, bold: true }\n );\n\n rowOffset++;\n\n for (const c of commands) {\n const active = rowOffset - 1 === this._selectedIndex;\n\n const prefix = active ? (caps.unicode ? '❯ ' : '> ') : ' ';\n const shortcutStr = c.shortcut ? ` ${c.shortcut}` : '';\n const labelFull = prefix + c.label + shortcutStr;\n const label = labelFull.slice(0, bw - 4).padEnd(bw - 4);\n\n screen.writeString(\n bx + 1,\n by + 3 + rowOffset,\n label,\n {\n ...attrs,\n fg: active ? this._activeColor : attrs.fg,\n bold: active,\n }\n );\n\n rowOffset++;\n }\n}\n // Bottom\n const last = Math.min(by + 3 + totalVisRows, by + bh - 1);\n screen.writeString(bx, last, border.bottomLeft + border.bottom.repeat(bw - 2) + border.bottomRight, ba);\n }\n}\n","// useCommandPalette — convenience hook for wiring CommandPalette to an App\nimport type { KeyEvent } from '@termuijs/core';\nimport { CommandPalette, type Command, type CommandPaletteOptions } from '../CommandPalette.js';\n\nexport interface UseCommandPaletteOptions extends CommandPaletteOptions {\n /** Initial command list */\n commands: Command[];\n}\n\nexport interface UseCommandPaletteReturn {\n /** The CommandPalette widget instance — add it to your layout */\n palette: CommandPalette;\n /**\n * Pass this directly to your app's key event listener.\n *\n * @example\n * ```ts\n * const { palette, handleKey } = useCommandPalette({ commands })\n * app.on('key', handleKey)\n * layout.add(palette)\n * ```\n */\n handleKey: (event: KeyEvent) => void;\n}\n\n/**\n * Create a CommandPalette and return the widget plus a bound key handler.\n *\n * The handler automatically wires Ctrl+P (open/close), arrow navigation,\n * Enter, Escape, Backspace, and character input — no manual binding needed.\n *\n * @example\n * ```ts\n * import { useCommandPalette } from '@termuijs/ui'\n *\n * const { palette, handleKey } = useCommandPalette({\n * commands: [\n * { id: 'save', label: 'Save File', shortcut: 'Ctrl+S', action: () => save() },\n * { id: 'quit', label: 'Quit', category: 'App', action: () => process.exit(0) },\n * ],\n * })\n *\n * app.on('key', handleKey)\n * rootLayout.add(palette)\n * ```\n */\nexport function useCommandPalette(options: UseCommandPaletteOptions): UseCommandPaletteReturn {\n const { commands, ...paletteOptions } = options;\n const palette = new CommandPalette(commands, paletteOptions);\n const handleKey = (event: KeyEvent) => palette.handleKey(event);\n return { palette, handleKey };\n}","// ─────────────────────────────────────────────────────\n// @termuijs/ui — Imperative Prompts\n//\n// Pure Node.js readline-based prompts for CLI scripts\n// that don't need a full TUI app. Zero dependency on\n// @termuijs/core, @termuijs/widgets, or @termuijs/jsx.\n// ─────────────────────────────────────────────────────\n\nimport * as readline from 'readline';\n\nexport class NonInteractiveError extends Error {\n constructor() {\n super('Prompts require an interactive TTY. stdin is not a TTY.');\n this.name = 'NonInteractiveError';\n }\n}\n\nexport interface TextPromptOptions {\n message: string;\n placeholder?: string;\n validate?: (value: string) => string | null;\n default?: string;\n}\n\nexport interface ConfirmPromptOptions {\n message: string;\n default?: boolean;\n}\n\nexport interface SelectPromptOptions<T = string> {\n message: string;\n options: Array<{ label: string; value: T }>;\n default?: T;\n}\n\nasync function promptText(options: TextPromptOptions): Promise<string> {\n if (!process.stdin.isTTY) throw new NonInteractiveError();\n\n const defaultHint = options.default ? ` (${options.default})` : '';\n const placeholder = options.placeholder ? ` [${options.placeholder}]` : '';\n\n return new Promise((resolve) => {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n const ask = () => {\n rl.question(`${options.message}${defaultHint}${placeholder}: `, (answer) => {\n const value = answer.trim() || options.default || '';\n if (options.validate) {\n const error = options.validate(value);\n if (error) {\n process.stdout.write(` ${error}\\n`);\n ask();\n return;\n }\n }\n rl.close();\n resolve(value);\n });\n };\n\n ask();\n });\n}\n\nasync function promptConfirm(options: ConfirmPromptOptions): Promise<boolean> {\n if (!process.stdin.isTTY) throw new NonInteractiveError();\n\n const hint = options.default === true ? 'Y/n' : options.default === false ? 'y/N' : 'y/n';\n\n return new Promise((resolve) => {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n rl.question(`${options.message} [${hint}]: `, (answer) => {\n rl.close();\n const a = answer.trim().toLowerCase();\n if (a === 'y' || a === 'yes') { resolve(true); return; }\n if (a === 'n' || a === 'no') { resolve(false); return; }\n if (a === '' && options.default !== undefined) { resolve(options.default); return; }\n resolve(false);\n });\n });\n}\n\nasync function promptSelect<T = string>(options: SelectPromptOptions<T>): Promise<T> {\n if (!process.stdin.isTTY) throw new NonInteractiveError();\n\n const { options: choices, default: defaultValue } = options;\n process.stdout.write(`${options.message}\\n`);\n choices.forEach((opt, i) => {\n const isDefault = opt.value === defaultValue;\n process.stdout.write(` ${i + 1}. ${opt.label}${isDefault ? ' (default)' : ''}\\n`);\n });\n\n return new Promise((resolve) => {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n const ask = () => {\n rl.question(`Enter number (1-${choices.length}): `, (answer) => {\n const trimmed = answer.trim();\n if (trimmed === '' && defaultValue !== undefined) {\n rl.close();\n resolve(defaultValue);\n return;\n }\n const n = parseInt(trimmed, 10);\n if (!isNaN(n) && n >= 1 && n <= choices.length) {\n rl.close();\n resolve(choices[n - 1].value);\n return;\n }\n process.stdout.write(` Invalid choice. Enter a number 1-${choices.length}.\\n`);\n ask();\n });\n };\n\n ask();\n });\n}\n\n/**\n * Imperative prompts for CLI scripts — no widget stack required.\n *\n * ```ts\n * const name = await prompt.text({ message: 'Project name:', default: 'my-app' });\n * const ok = await prompt.confirm({ message: 'Continue?', default: true });\n * const pkg = await prompt.select({ message: 'Package manager:', options: [\n * { label: 'pnpm', value: 'pnpm' },\n * { label: 'npm', value: 'npm' },\n * ]});\n * ```\n *\n * Throws `NonInteractiveError` when stdin is not a TTY.\n */\nexport const prompt = {\n text: promptText,\n confirm: promptConfirm,\n select: promptSelect,\n} as const;\n","// ─────────────────────────────────────────────────────\n// @termuijs/ui — NotificationCenter\n// Provides: NotificationStore (singleton), useNotifications (JSX hook),\n// and NotificationCenter (class-based widget).\n// ─────────────────────────────────────────────────────\n\nimport { Widget } from '@termuijs/widgets';\nimport { useState, useEffect, registerCleanup } from '@termuijs/jsx';\nimport { caps, type Screen } from '@termuijs/core';\nimport type { Color } from '@termuijs/core';\n\n// Auto-register cleanup for test isolation\nregisterCleanup(() => {\n NotificationStore.getInstance().reset();\n});\n\n// ── Types ──────────────────────────────────────────────────────────────────\n\nexport interface Notification {\n id: string;\n message: string;\n type: 'info' | 'success' | 'warning' | 'error';\n durationMs?: number;\n createdAt: number;\n}\n\n// ── NotificationStore (singleton) ──────────────────────────────────────────\n\nexport class NotificationStore {\n private static _instance: NotificationStore;\n private _notifications: Notification[] = [];\n private _subs: Set<(notifications: Notification[]) => void> = new Set();\n\n static getInstance(): NotificationStore {\n if (!NotificationStore._instance) {\n NotificationStore._instance = new NotificationStore();\n }\n return NotificationStore._instance;\n }\n\n push(message: string, type: Notification['type'] = 'info', durationMs?: number): string {\n const id = Date.now().toString(36) + Math.random().toString(36).slice(2);\n const notification: Notification = { id, message, type, durationMs, createdAt: Date.now() };\n this._notifications = [...this._notifications, notification];\n this._emit();\n\n if (durationMs && durationMs > 0) {\n setTimeout(() => this.dismiss(id), durationMs);\n }\n return id;\n }\n\n dismiss(id: string): void {\n const prev = this._notifications;\n this._notifications = this._notifications.filter(n => n.id !== id);\n if (this._notifications.length !== prev.length) {\n this._emit();\n }\n }\n\n dismissAll(): void {\n if (this._notifications.length > 0) {\n this._notifications = [];\n this._emit();\n }\n }\n\n reset(): void {\n this._notifications = [];\n this._subs.clear();\n }\n\n subscribe(fn: (notifications: Notification[]) => void): () => void {\n this._subs.add(fn);\n return () => this._subs.delete(fn);\n }\n\n get notifications(): Notification[] {\n return this._notifications;\n }\n\n private _emit(): void {\n for (const fn of this._subs) fn(this._notifications);\n }\n}\n\n/** Global singleton accessor */\nexport const notifications: NotificationStore = NotificationStore.getInstance();\n\n// ── useNotifications JSX hook ───────────────────────────────────────────────\n\nexport function useNotifications(): {\n notifications: Notification[];\n push: (message: string, type?: Notification['type'], durationMs?: number) => string;\n dismiss: (id: string) => void;\n dismissAll: () => void;\n} {\n const store = NotificationStore.getInstance();\n const [current, setCurrent] = useState<Notification[]>(store.notifications);\n\n useEffect(() => {\n const unsub = store.subscribe((ns) => setCurrent([...ns]));\n return unsub;\n }, []);\n\n return {\n notifications: current,\n push: (msg, type, dur) => store.push(msg, type, dur),\n dismiss: (id) => store.dismiss(id),\n dismissAll: () => store.dismissAll(),\n };\n}\n\n// ── NotificationCenter Widget ───────────────────────────────────────────────\n\nexport interface NotificationCenterOptions {\n position?: 'top-right' | 'bottom-right' | 'top-left' | 'bottom-left';\n maxVisible?: number;\n width?: number;\n}\n\nconst TYPE_ICONS: Record<Notification['type'], { unicode: string; ascii: string }> = {\n info: { unicode: 'ℹ', ascii: 'i' },\n success: { unicode: '✓', ascii: '+' },\n warning: { unicode: '⚠', ascii: '!' },\n error: { unicode: '✗', ascii: 'x' },\n};\n\nconst TYPE_COLORS: Record<Notification['type'], Color> = {\n info: { type: 'named', name: 'cyan' },\n success: { type: 'named', name: 'green' },\n warning: { type: 'named', name: 'yellow' },\n error: { type: 'named', name: 'red' },\n};\n\nexport class NotificationCenter extends Widget {\n private _position: NonNullable<NotificationCenterOptions['position']>;\n private _maxVisible: number;\n private _notifWidth: number;\n private _unsub?: () => void;\n private _current: Notification[] = [];\n\n constructor(options: NotificationCenterOptions = {}) {\n super();\n this._position = options.position ?? 'top-right';\n this._maxVisible = options.maxVisible ?? 5;\n this._notifWidth = options.width ?? 40;\n\n const store = NotificationStore.getInstance();\n this._current = store.notifications;\n this._unsub = store.subscribe((ns) => {\n this._current = ns;\n this.markDirty();\n });\n }\n\n override unmount(): void {\n this._unsub?.();\n this._unsub = undefined;\n this._current = [];\n super.unmount();\n }\n\n protected override _renderSelf(screen: Screen): void {\n if (this._maxVisible <= 0) return;\n\n const { x, y, width, height } = this._rect;\n if (width <= 2 || height <= 1) return;\n\n const visible = this._current.slice(-this._maxVisible).slice(-(height - 1));\n if (visible.length === 0) return;\n\n const tw = Math.min(this._notifWidth, width - 2);\n if (tw <= 0) return;\n\n const isRight = this._position.includes('right');\n const isBottom = this._position.includes('bottom');\n\n const sx = isRight ? x + width - tw - 1 : x + 1;\n const sy = isBottom ? y + height - visible.length - 1 : y + 1;\n\n for (let i = 0; i < visible.length; i++) {\n const notif = visible[i];\n const icon = caps.unicode\n ? TYPE_ICONS[notif.type].unicode\n : TYPE_ICONS[notif.type].ascii;\n\n const raw = `${icon} ${notif.message}`;\n const label = ` ${raw} `.slice(0, tw).padEnd(tw);\n\n screen.writeString(sx, sy + i, label, {\n fg: TYPE_COLORS[notif.type],\n bold: true,\n });\n }\n }\n}\n","// ─────────────────────────────────────────────────────\n// @termuijs/ui — PasswordInput widget\n//\n// A TextInput with character masking. Shows '●' (or '*'\n// in ASCII terminals) per character instead of actual\n// chars. Alt+V toggles visibility of the actual text.\n// ─────────────────────────────────────────────────────\n\nimport { Widget } from '@termuijs/widgets';\nimport { type Style, type Screen, type KeyEvent, styleToCellAttrs, truncate, caps } from '@termuijs/core';\n\nexport interface PasswordInputOptions {\n placeholder?: string;\n maxLength?: number;\n onChange?: (value: string) => void;\n onSubmit?: (value: string) => void;\n}\n\nexport class PasswordInput extends Widget {\n private _value = '';\n private _cursorPos = 0;\n private _placeholder: string;\n private _maxLength: number;\n private _showText = false;\n private _onChange?: (value: string) => void;\n private _onSubmit?: (value: string) => void;\n focusable = true;\n\n // '●' in unicode terminals, '*' in ASCII fallback\n private get _maskChar(): string {\n return caps.unicode ? '●' : '*';\n }\n\n constructor(\n style: Partial<Style> = {},\n options: PasswordInputOptions = {},\n ) {\n super({ border: 'single', height: 3, ...style });\n this._placeholder = options.placeholder ?? '';\n this._maxLength = options.maxLength ?? Infinity;\n this._onChange = options.onChange;\n this._onSubmit = options.onSubmit;\n }\n\n /** The actual (unmasked) value. */\n get value(): string { return this._value; }\n\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 /** Whether the text is currently visible (unmaksed). */\n get showText(): boolean { return this._showText; }\n\n /** Toggle visibility of the actual text (Alt+V). */\n toggleVisibility(): void {\n this._showText = !this._showText;\n this.markDirty();\n }\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 this.markDirty();\n }\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 this.markDirty();\n }\n }\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 this.markDirty();\n }\n }\n\n moveCursorLeft(): void { this._cursorPos = Math.max(0, this._cursorPos - 1); this.markDirty(); }\n moveCursorRight(): void { this._cursorPos = Math.min(this._value.length, this._cursorPos + 1); this.markDirty(); }\n moveCursorHome(): void { this._cursorPos = 0; this.markDirty(); }\n moveCursorEnd(): void { this._cursorPos = this._value.length; this.markDirty(); }\n submit(): void { this._onSubmit?.(this._value); }\n clear(): void { this._value = ''; this._cursorPos = 0; this._onChange?.(''); this.markDirty(); }\n\n /**\n * Handle key events. Call this from your input loop.\n * Alt+V — toggle visibility\n * Other — standard text editing\n */\n handleKey(event: KeyEvent): void {\n if (event.alt && event.key === 'v') {\n this.toggleVisibility();\n return;\n }\n switch (event.key) {\n case 'backspace': this.deleteBack(); break;\n case 'delete': this.deleteForward(); break;\n case 'left': this.moveCursorLeft(); break;\n case 'right': this.moveCursorRight(); break;\n case 'home': this.moveCursorHome(); break;\n case 'end': this.moveCursorEnd(); break;\n case 'return':\n case 'enter': this.submit(); break;\n default:\n if (event.key && event.key.length === 1 && !event.ctrl && !event.alt) {\n this.insertChar(event.key);\n }\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\n if (this._value.length === 0 && !this.isFocused) {\n screen.writeString(x, y, truncate(this._placeholder, width), { ...attrs, dim: true });\n return;\n }\n\n // Show actual text when toggled, masked chars otherwise\n const displayValue = this._showText\n ? this._value\n : this._maskChar.repeat(this._value.length);\n\n const visibleWidth = width - 1;\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 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 // Show a small indicator when text is visible\n if (this._showText && width > 4) {\n const indicator = caps.unicode ? ' 👁' : '[v]';\n screen.writeString(x + width - indicator.length, y, indicator, { ...attrs, dim: true });\n }\n }\n}\n","// ─────────────────────────────────────────────────────\n// @termuijs/ui — NumberInput widget\n//\n// A TextInput restricted to numeric values.\n// - Only accepts digit keys and one decimal point\n// - ↑ arrow increments value by step (default 1)\n// - ↓ arrow decrements value by step\n// - min/max clamping\n// ─────────────────────────────────────────────────────\n\nimport { Widget } from '@termuijs/widgets';\nimport { type Style, type Screen, type KeyEvent, styleToCellAttrs, truncate } from '@termuijs/core';\n\nexport interface NumberInputOptions {\n placeholder?: string;\n step?: number;\n min?: number;\n max?: number;\n allowDecimal?: boolean;\n onChange?: (value: number | null) => void;\n onSubmit?: (value: number | null) => void;\n}\n\nexport class NumberInput extends Widget {\n private _raw = ''; // raw string the user typed\n private _cursorPos = 0;\n private _placeholder: string;\n private _step: number;\n private _min: number;\n private _max: number;\n private _allowDecimal: boolean;\n private _onChange?: (value: number | null) => void;\n private _onSubmit?: (value: number | null) => void;\n focusable = true;\n\n constructor(\n style: Partial<Style> = {},\n options: NumberInputOptions = {},\n ) {\n super({ border: 'single', height: 3, ...style });\n this._placeholder = options.placeholder ?? '';\n this._step = options.step ?? 1;\n this._min = options.min ?? -Infinity;\n this._max = options.max ?? Infinity;\n this._allowDecimal = options.allowDecimal ?? true;\n this._onChange = options.onChange;\n this._onSubmit = options.onSubmit;\n }\n\n /** The numeric value, or null if the field is empty / invalid. */\n get numericValue(): number | null {\n if (this._raw === '' || this._raw === '-') return null;\n const n = parseFloat(this._raw);\n return isNaN(n) ? null : n;\n }\n\n /** Raw text string (what the user typed). */\n get rawValue(): string { return this._raw; }\n\n set rawValue(v: string) {\n this._raw = v;\n this._cursorPos = Math.min(this._cursorPos, this._raw.length);\n }\n\n private _clamp(n: number): number {\n return Math.min(this._max, Math.max(this._min, n));\n }\n\n private _notify(): void {\n this._onChange?.(this.numericValue);\n this.markDirty();\n }\n\n /** Accept only digits, '-' at position 0 (if min < 0), and (optionally) one '.'. */\n private _isAllowed(char: string): boolean {\n // Only allow '-' at position 0 if min is negative\n if (char === '-' && this._cursorPos === 0 && !this._raw.includes('-')) {\n return this._min < 0;\n }\n if (char === '.' && this._allowDecimal && !this._raw.includes('.')) return true;\n return /^\\d$/.test(char);\n }\n\n insertChar(char: string): void {\n if (!this._isAllowed(char)) return;\n this._raw =\n this._raw.slice(0, this._cursorPos) +\n char +\n this._raw.slice(this._cursorPos);\n this._cursorPos++;\n this._notify();\n }\n\n deleteBack(): void {\n if (this._cursorPos > 0) {\n this._raw =\n this._raw.slice(0, this._cursorPos - 1) +\n this._raw.slice(this._cursorPos);\n this._cursorPos--;\n this._notify();\n }\n }\n\n deleteForward(): void {\n if (this._cursorPos < this._raw.length) {\n this._raw =\n this._raw.slice(0, this._cursorPos) +\n this._raw.slice(this._cursorPos + 1);\n this._notify();\n }\n }\n\n moveCursorLeft(): void { this._cursorPos = Math.max(0, this._cursorPos - 1); this.markDirty(); }\n moveCursorRight(): void { this._cursorPos = Math.min(this._raw.length, this._cursorPos + 1); this.markDirty(); }\n moveCursorHome(): void { this._cursorPos = 0; this.markDirty(); }\n moveCursorEnd(): void { this._cursorPos = this._raw.length; this.markDirty(); }\n\n /** Increment value by step (↑ arrow). */\n increment(): void {\n const current = this.numericValue ?? 0;\n const next = this._clamp(current + this._step);\n this._raw = String(next);\n this._cursorPos = this._raw.length;\n this._notify();\n }\n\n /** Decrement value by step (↓ arrow). */\n decrement(): void {\n const current = this.numericValue ?? 0;\n const next = this._clamp(current - this._step);\n this._raw = String(next);\n this._cursorPos = this._raw.length;\n this._notify();\n }\n\n submit(): void { this._onSubmit?.(this.numericValue); }\n clear(): void { this._raw = ''; this._cursorPos = 0; this._notify(); }\n\n /**\n * Handle key events. Call this from your input loop.\n */\n handleKey(event: KeyEvent): void {\n switch (event.key) {\n case 'up': this.increment(); break;\n case 'down': this.decrement(); break;\n case 'backspace': this.deleteBack(); break;\n case 'delete': this.deleteForward(); break;\n case 'left': this.moveCursorLeft(); break;\n case 'right': this.moveCursorRight(); break;\n case 'home': this.moveCursorHome(); break;\n case 'end': this.moveCursorEnd(); break;\n case 'return':\n case 'enter': this.submit(); break;\n default:\n if (event.key && event.key.length === 1 && !event.ctrl && !event.alt) {\n this.insertChar(event.key);\n }\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\n if (this._raw.length === 0 && !this.isFocused) {\n screen.writeString(x, y, truncate(this._placeholder, width), { ...attrs, dim: true });\n return;\n }\n\n const display = this._raw;\n const visibleWidth = width - 1;\n let scrollX = 0;\n if (this._cursorPos > visibleWidth) {\n scrollX = this._cursorPos - visibleWidth;\n }\n\n const visibleText = display.slice(scrollX, scrollX + visibleWidth);\n screen.writeString(x, y, visibleText, attrs);\n\n if (this.isFocused) {\n const cursorScreenPos = x + this._cursorPos - scrollX;\n if (cursorScreenPos >= x && cursorScreenPos < x + width) {\n const cursorChar = this._cursorPos < display.length\n ? display[this._cursorPos]\n : ' ';\n screen.setCell(cursorScreenPos, y, {\n char: cursorChar,\n ...attrs,\n inverse: true,\n });\n }\n }\n\n // Show step hint if focused and there's room\n if (this.isFocused && width > 8) {\n const hint = `±${this._step}`;\n screen.writeString(x + width - hint.length, y, hint, { ...attrs, dim: true });\n }\n }\n}\n","// ─────────────────────────────────────────────────────\n// @termuijs/ui — TagInput widget\n//\n// A text input that tokenizes typed entries into removable\n// chips (tags).\n// - Typing characters appends to the pending draft text\n// - enter commits the draft as a chip and clears the draft\n// - backspace on an empty draft removes the last chip\n// - Committed chips render as bracketed tokens before the\n// draft text\n// ─────────────────────────────────────────────────────\n\nimport { Widget } from '@termuijs/widgets';\nimport { type Style, type Screen, type KeyEvent, mergeStyles, defaultStyle, styleToCellAttrs, stringWidth, truncate, caps } from '@termuijs/core';\n\nexport interface TagInputOptions {\n placeholder?: string;\n defaultTags?: string[];\n onChange?: (tags: string[]) => void;\n}\n\nexport class TagInput extends Widget {\n private _tags: string[] = [];\n private _draft = '';\n private _placeholder: string;\n private _onChange?: (tags: string[]) => void;\n\n focusable = true;\n\n constructor(\n style: Partial<Style> = {},\n options: TagInputOptions = {},\n ) {\n super(mergeStyles(defaultStyle(), { border: 'single', height: 3, ...style }));\n this._placeholder = options.placeholder ?? '';\n if (options.defaultTags) {\n this._tags = [...options.defaultTags];\n }\n this._onChange = options.onChange;\n }\n\n /** The current list of committed tags. */\n get tags(): string[] {\n return [...this._tags];\n }\n\n /** Add a tag to the list. Empty/whitespace-only strings are ignored. */\n addTag(tag: string): void {\n const trimmed = tag.trim();\n if (trimmed.length === 0) return;\n this._tags.push(trimmed);\n this._onChange?.(this.tags);\n this.markDirty();\n }\n\n /** Remove the last tag from the list. No-op if the list is empty. */\n removeLast(): void {\n if (this._tags.length === 0) return;\n this._tags.pop();\n this._onChange?.(this.tags);\n this.markDirty();\n }\n\n /**\n * Handle key events. Call this from your input loop.\n */\n handleKey(event: KeyEvent): void {\n switch (event.key) {\n case 'return':\n case 'enter':\n if (this._draft.trim().length > 0) {\n this.addTag(this._draft);\n this._draft = '';\n this.markDirty();\n }\n break;\n\n case 'backspace':\n if (this._draft.length > 0) {\n this._draft = this._draft.slice(0, -1);\n this.markDirty();\n } else {\n this.removeLast();\n }\n break;\n\n default:\n if (event.key && event.key.length === 1 && !event.ctrl && !event.alt) {\n this._draft += event.key;\n this.markDirty();\n }\n }\n }\n\n /** Format a single chip token using caps.unicode for glyph choice. */\n private _formatChip(tag: string): string {\n if (caps.unicode) {\n return ` \\u2039${tag}\\u203a `;\n }\n return ` [${tag}] `;\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 // Show placeholder when empty\n if (this._tags.length === 0 && this._draft.length === 0) {\n screen.writeString(x, y, truncate(this._placeholder, width), { ...attrs, dim: true });\n return;\n }\n\n // Build the display string: chips followed by draft\n let display = '';\n for (const tag of this._tags) {\n display += this._formatChip(tag);\n }\n display += this._draft;\n\n // Handle horizontal scrolling if content exceeds width\n const displayWidth = stringWidth(display);\n const visibleWidth = width;\n let scrollCols = 0;\n if (displayWidth > visibleWidth) {\n scrollCols = displayWidth - visibleWidth;\n }\n\n // Width-aware slice: iterate graphemes and accumulate until\n // we have skipped scrollCols columns and collected visibleWidth columns.\n const segmenter = new Intl.Segmenter(undefined, { granularity: 'grapheme' });\n let skipped = 0;\n let accumulated = 0;\n let visibleText = '';\n for (const { segment } of segmenter.segment(display)) {\n const w = stringWidth(segment);\n if (skipped < scrollCols) {\n skipped += w;\n continue;\n }\n if (accumulated + w > visibleWidth) break;\n visibleText += segment;\n accumulated += w;\n }\n\n screen.writeString(x, y, visibleText, attrs);\n\n // Show cursor at draft position when focused\n if (this.isFocused) {\n const cursorPos = x + displayWidth - scrollCols;\n if (cursorPos >= x && cursorPos < x + width) {\n screen.setCell(cursorPos, y, {\n char: ' ',\n ...attrs,\n inverse: true,\n });\n }\n }\n }\n}\n","// ─────────────────────────────────────────────────────\n// @termuijs/ui — MaskedInput widget\n//\n// Text input constrained to a mask template.\n// '_' = editable slot. Other chars are fixed.\n// Examples: date '__/__/____', phone '(___) ___-____'\n// ─────────────────────────────────────────────────────\n\nimport { Widget } from '@termuijs/widgets';\nimport { type Style, type Screen, type KeyEvent, type Color, styleToCellAttrs, truncate } from '@termuijs/core';\n\nexport interface MaskedInputOptions {\n /** Mask template. '_' = editable slot. Other chars are fixed. Example: '__/__/____' */\n mask: string;\n /** Character shown in empty slots. Default: '_' */\n placeholder?: string;\n /** Callback when all slots are filled */\n onComplete?: (value: string) => void;\n /** Callback on every change */\n onChange?: (value: string) => void;\n /** Color for the text */\n color?: Color;\n}\n\nexport class MaskedInput extends Widget {\n private _mask: string;\n private _slots: (string | null)[] = []; // null = empty slot, string = filled\n private _cursorSlotIndex = 0; // index into _slots array\n private _placeholder: string;\n private _onComplete?: (value: string) => void;\n private _onChange?: (value: string) => void;\n private _color?: Color;\n focusable = true;\n\n constructor(\n style: Partial<Style> = {},\n options: MaskedInputOptions,\n ) {\n super({ border: 'single', height: 3, ...style });\n this._mask = options.mask;\n this._placeholder = options.placeholder ?? '_';\n this._onComplete = options.onComplete;\n this._onChange = options.onChange;\n this._color = options.color;\n\n // Initialize slots array with one entry per '_' in mask\n const slots: (string | null)[] = [];\n for (const char of this._mask) {\n if (char === '_') {\n slots.push(null);\n }\n }\n this._slots = slots;\n }\n\n /** Get the complete masked string with current values filled in. */\n getValue(): string {\n let result = '';\n let slotIndex = 0;\n\n for (const char of this._mask) {\n if (char === '_') {\n const val = this._slots[slotIndex];\n result += val ?? this._placeholder;\n slotIndex++;\n } else {\n result += char;\n }\n }\n\n return result;\n }\n\n /** Reset all slots to empty and position cursor at first slot. */\n reset(): void {\n this._slots = this._slots.map(() => null);\n this._cursorSlotIndex = 0;\n this._onChange?.(this.getValue());\n this.markDirty();\n }\n\n /** Check if all slots are filled. */\n private _isComplete(): boolean {\n return this._slots.every((slot) => slot !== null);\n }\n\n /** Move cursor to the next empty slot, skipping filled ones. Auto-advance on input. */\n private _advanceToNextEmpty(): void {\n while (this._cursorSlotIndex < this._slots.length && this._slots[this._cursorSlotIndex] !== null) {\n this._cursorSlotIndex++;\n }\n }\n\n /** Move cursor right to the next slot. */\n private _moveCursorRight(): void {\n if (this._cursorSlotIndex < this._slots.length - 1) {\n this._cursorSlotIndex++;\n }\n }\n\n /** Move cursor to the previous slot. */\n private _moveCursorLeft(): void {\n if (this._cursorSlotIndex > 0) {\n this._cursorSlotIndex--;\n }\n }\n\n /** Insert a digit character at the current slot. Auto-advance past filled chars. */\n private _insertDigit(char: string): void {\n if (!/^\\d$/.test(char)) return; // Only accept digits\n if (this._cursorSlotIndex >= this._slots.length) return; // Already at end\n\n this._slots[this._cursorSlotIndex] = char;\n this._advanceToNextEmpty();\n this._onChange?.(this.getValue());\n\n if (this._isComplete()) {\n this._onComplete?.(this.getValue());\n }\n\n this.markDirty();\n }\n\n /** Clear the previous slot and move cursor back. */\n private _deleteBack(): void {\n if (this._cursorSlotIndex > 0) {\n this._cursorSlotIndex--;\n this._slots[this._cursorSlotIndex] = null;\n this._onChange?.(this.getValue());\n this.markDirty();\n }\n }\n\n /**\n * Handle key events. Call this from your input loop.\n */\n handleKey(event: KeyEvent): void {\n switch (event.key) {\n case 'backspace':\n this._deleteBack();\n break;\n\n case 'left':\n this._moveCursorLeft();\n this.markDirty();\n break;\n\n case 'right':\n this._moveCursorRight();\n this.markDirty();\n break;\n\n case 'home':\n this._cursorSlotIndex = 0;\n this.markDirty();\n break;\n\n case 'end':\n this._cursorSlotIndex = this._slots.length - 1;\n this.markDirty();\n break;\n\n default:\n // Single character input (digits)\n if (event.key?.length === 1) {\n this._insertDigit(event.key);\n }\n break;\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 if (this._color) {\n attrs.fg = this._color;\n }\n const value = this.getValue();\n const display = truncate(value, width);\n\n screen.writeString(x, y, display, attrs);\n\n // Render cursor at current slot position if focused\n if (this.isFocused) {\n const cursorX = x + this._getCursorDisplayPos();\n if (cursorX >= x && cursorX < x + width) {\n const cellIndex = cursorX - x;\n if (cellIndex >= 0 && cellIndex < display.length) {\n const cell = screen.back[y]?.[cursorX];\n if (cell) {\n cell.inverse = true;\n }\n }\n }\n }\n }\n\n /** Calculate the display position of the cursor (account for fixed chars before it). */\n private _getCursorDisplayPos(): number {\n let displayPos = 0;\n let slotCount = 0;\n\n for (const char of this._mask) {\n if (char === '_') {\n if (slotCount === this._cursorSlotIndex) {\n return displayPos;\n }\n slotCount++;\n }\n displayPos++;\n }\n\n return displayPos;\n }\n}\n","// ─────────────────────────────────────────────────────\n// @termuijs/ui — PathInput widget\n//\n// A TextInput with Tab-completion for filesystem paths.\n// - Tab triggers completion: reads dir entries via readdirSync\n// - Shows completion options below the input\n// - Tab cycles through completions\n// - Enter accepts current value\n// - Handles relative and absolute paths gracefully\n// ─────────────────────────────────────────────────────\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { Widget } from '@termuijs/widgets';\nimport { type Style, type Screen, type KeyEvent, styleToCellAttrs, truncate, caps } from '@termuijs/core';\n\nexport interface PathInputOptions {\n placeholder?: string;\n maxLength?: number;\n cwd?: string; // base directory for relative paths\n maxCompletions?: number; // max completions shown (default 5)\n onChange?: (value: string) => void;\n onSubmit?: (value: string) => void;\n}\n\n/**\n * PathInput — filesystem path input with Tab-completion.\n *\n * @note height must be at least (maxCompletions + 2) to show completions.\n * Default height of 3 shows up to 1 completion. If height is insufficient,\n * the input line is still rendered but completions are hidden.\n */\nexport class PathInput extends Widget {\n private _value = '';\n private _cursorPos = 0;\n private _placeholder: string;\n private _maxLength: number;\n private _cwd: string;\n private _maxCompletions: number;\n private _completions: string[] = [];\n private _completionIndex = -1; // -1 = original value, 0..n = cycling\n private _preCompletionValue = ''; // value before Tab was pressed\n private _showCompletions = false;\n private _onChange?: (value: string) => void;\n private _onSubmit?: (value: string) => void;\n focusable = true;\n\n constructor(\n style: Partial<Style> = {},\n options: PathInputOptions = {},\n ) {\n super({ border: 'single', height: 3, ...style });\n this._placeholder = options.placeholder ?? '';\n this._maxLength = options.maxLength ?? 4096;\n this._cwd = options.cwd ?? process.cwd();\n this._maxCompletions = options.maxCompletions ?? 5;\n this._onChange = options.onChange;\n this._onSubmit = options.onSubmit;\n }\n\n get value(): string { return this._value; }\n\n set value(v: string) {\n this._value = v.slice(0, this._maxLength);\n this._cursorPos = Math.min(this._cursorPos, this._value.length);\n this._dismissCompletions();\n }\n\n get completions(): string[] { return this._completions; }\n get isShowingCompletions(): boolean { return this._showCompletions && this._completions.length > 0; }\n\n private _dismissCompletions(): void {\n this._completions = [];\n this._completionIndex = -1;\n this._showCompletions = false;\n }\n\n /** Compute completions for the current value. Does NOT throw. */\n private _computeCompletions(): string[] {\n try {\n const raw = this._value;\n const isAbs = path.isAbsolute(raw);\n const base = isAbs ? raw : path.join(this._cwd, raw);\n\n // Determine the directory to list and the prefix to filter by\n let dir: string;\n let prefix: string;\n\n // If raw ends with separator or is empty, list the dir itself\n if (raw === '' || raw.endsWith('/') || raw.endsWith(path.sep)) {\n dir = isAbs ? raw || '/' : path.join(this._cwd, raw || '.');\n prefix = '';\n } else {\n dir = path.dirname(base);\n prefix = path.basename(base).toLowerCase();\n }\n\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n const matches = entries\n .filter((e) => e.name.toLowerCase().startsWith(prefix))\n .slice(0, this._maxCompletions)\n .map((e) => {\n const full = path.join(dir, e.name);\n // Return path relative to cwd or absolute depending on input style\n const candidate = isAbs\n ? full + (e.isDirectory() ? path.sep : '')\n : path.relative(this._cwd, full) + (e.isDirectory() ? path.sep : '');\n return candidate;\n });\n\n return matches;\n } catch {\n return [];\n }\n }\n\n /** Trigger tab-completion. */\n triggerCompletion(): void {\n if (!this._showCompletions || this._completions.length === 0) {\n // First Tab press — compute completions\n this._preCompletionValue = this._value;\n this._completions = this._computeCompletions();\n if (this._completions.length === 0) {\n this._showCompletions = false;\n return;\n }\n this._showCompletions = true;\n this._completionIndex = 0;\n } else {\n // Subsequent Tab presses — cycle\n this._completionIndex = (this._completionIndex + 1) % this._completions.length;\n }\n\n this._value = this._completions[this._completionIndex];\n this._cursorPos = this._value.length;\n this._onChange?.(this._value);\n this.markDirty();\n }\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._dismissCompletions();\n this._onChange?.(this._value);\n this.markDirty();\n }\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._dismissCompletions();\n this._onChange?.(this._value);\n this.markDirty();\n }\n }\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._dismissCompletions();\n this._onChange?.(this._value);\n this.markDirty();\n }\n }\n\n moveCursorLeft(): void { this._cursorPos = Math.max(0, this._cursorPos - 1); this.markDirty(); }\n moveCursorRight(): void { this._cursorPos = Math.min(this._value.length, this._cursorPos + 1); this.markDirty(); }\n moveCursorHome(): void { this._cursorPos = 0; this.markDirty(); }\n moveCursorEnd(): void { this._cursorPos = this._value.length; this.markDirty(); }\n submit(): void { this._dismissCompletions(); this._onSubmit?.(this._value); }\n clear(): void { this._value = ''; this._cursorPos = 0; this._dismissCompletions(); this._onChange?.(''); this.markDirty(); }\n\n /**\n * Handle key events. Call this from your input loop.\n * Tab — trigger/cycle completions\n * Esc — dismiss completions\n * Enter — submit current value\n */\n handleKey(event: KeyEvent): void {\n switch (event.key) {\n case 'tab':\n this.triggerCompletion();\n event.preventDefault();\n event.stopPropagation();\n break;\n case 'escape': this._dismissCompletions(); this.markDirty(); break;\n case 'backspace': this.deleteBack(); break;\n case 'delete': this.deleteForward(); break;\n case 'left': this.moveCursorLeft(); break;\n case 'right': this.moveCursorRight(); break;\n case 'home': this.moveCursorHome(); break;\n case 'end': this.moveCursorEnd(); break;\n case 'return':\n case 'enter': this.submit(); break;\n default:\n if (event.key && event.key.length === 1 && !event.ctrl && !event.alt) {\n this.insertChar(event.key);\n }\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\n // ── Defensive: if height insufficient for completions, hide them ──\n if (height <= 1 && this._showCompletions) {\n this._showCompletions = false;\n }\n\n // ── Input line ──\n if (this._value.length === 0 && !this.isFocused) {\n screen.writeString(x, y, truncate(this._placeholder, width), { ...attrs, dim: true });\n } else {\n const visibleWidth = width - 1;\n let scrollX = 0;\n if (this._cursorPos > visibleWidth) {\n scrollX = this._cursorPos - visibleWidth;\n }\n const visibleText = this._value.slice(scrollX, scrollX + visibleWidth);\n screen.writeString(x, y, visibleText, attrs);\n\n if (this.isFocused) {\n const cursorScreenPos = x + this._cursorPos - scrollX;\n if (cursorScreenPos >= x && cursorScreenPos < x + width) {\n const cursorChar = this._cursorPos < this._value.length\n ? this._value[this._cursorPos]\n : ' ';\n screen.setCell(cursorScreenPos, y, {\n char: cursorChar,\n ...attrs,\n inverse: true,\n });\n }\n }\n }\n\n // ── Completion list (rendered below the input line) ──\n // Requires height >= maxCompletions + 2 (input line + separator).\n // Default height=3 shows up to 1 completion.\n if (this._showCompletions && this._completions.length > 0 && height > 1) {\n const maxRows = Math.min(this._completions.length, height - 1);\n for (let i = 0; i < maxRows; i++) {\n const row = y + 1 + i;\n const isSelected = i === this._completionIndex;\n const prefix = isSelected ? (caps.unicode ? '▶ ' : '> ') : ' ';\n const entry = this._completions[i];\n screen.writeString(x, row, truncate(prefix + entry, width), {\n ...attrs,\n bold: isSelected,\n inverse: isSelected,\n });\n }\n }\n }\n}\n","// ─────────────────────────────────────────────────────\n// @termuijs/ui — KeyboardShortcuts display widget\n//\n// Renders a grid of keyboard shortcut bindings.\n// Groups by category if provided.\n//\n// Layout (2-column):\n// [key] description [key] description\n// ─────────────────────────────────────────────────────\n\nimport { Widget } from '@termuijs/widgets';\nimport { type Style, type Screen, styleToCellAttrs, caps } from '@termuijs/core';\n\nexport interface ShortcutBinding {\n key: string;\n description: string;\n category?: string;\n}\n\nexport interface KeyboardShortcutsOptions {\n /** Color for the key label boxes */\n keyColor?: Style['fg'];\n /** Color for category headings */\n categoryColor?: Style['fg'];\n /** Number of columns (default 2) */\n columns?: number;\n /** Show category headings (default true) */\n showCategories?: boolean;\n}\n\n/** A group of bindings belonging to the same category. */\ninterface BindingGroup {\n category: string | undefined;\n bindings: ShortcutBinding[];\n}\n\nexport class KeyboardShortcuts extends Widget {\n private _bindings: ShortcutBinding[];\n private _keyColor: Style['fg'];\n private _categoryColor: Style['fg'];\n private _columns: number;\n private _showCategories: boolean;\n\n constructor(bindings: ShortcutBinding[], options: KeyboardShortcutsOptions = {}) {\n super({});\n this._bindings = bindings;\n this._keyColor = options.keyColor ?? { type: 'named', name: 'cyan' };\n this._categoryColor = options.categoryColor ?? { type: 'named', name: 'yellow' };\n this._columns = Math.max(1, options.columns ?? 2);\n this._showCategories = options.showCategories ?? true;\n }\n\n /** Replace all bindings and trigger a re-render. */\n setBindings(bindings: ShortcutBinding[]): void {\n this._bindings = bindings;\n this.markDirty();\n }\n\n /** Group bindings by category, preserving insertion order. */\n private _groupBindings(): BindingGroup[] {\n const groups: BindingGroup[] = [];\n const indexMap = new Map<string, number>();\n\n for (const b of this._bindings) {\n const cat = b.category ?? '';\n const key = cat;\n if (!indexMap.has(key)) {\n indexMap.set(key, groups.length);\n groups.push({ category: b.category, bindings: [] });\n }\n groups[indexMap.get(key)!].bindings.push(b);\n }\n return groups;\n }\n\n /**\n * Render a key label in a bordered box style:\n * ┌─────┐\n * │ key │\n * └─────┘\n *\n * We fit it on one line: [ key ] — box drawing characters or ASCII fallback.\n */\n private _renderKeyLabel(screen: Screen, kx: number, ky: number, key: string, attrs: ReturnType<typeof styleToCellAttrs>): number {\n if (caps.unicode) {\n const label = `[${key}]`;\n screen.writeString(kx, ky, label, { ...attrs, fg: this._keyColor, bold: true });\n return label.length;\n } else {\n const label = `[${key}]`;\n screen.writeString(kx, ky, label, { ...attrs, fg: this._keyColor, bold: true });\n return label.length;\n }\n }\n\n protected _renderSelf(screen: Screen): void {\n const { x, y, width, height } = this._rect;\n if (width <= 0 || height <= 0) return;\n\n const attrs = styleToCellAttrs(this._style);\n const groups = this._groupBindings();\n\n let row = y;\n const colWidth = Math.floor(width / this._columns);\n\n for (const group of groups) {\n if (row >= y + height) break;\n\n // Category heading\n if (this._showCategories && group.category) {\n const heading = group.category.toUpperCase();\n const divider = caps.unicode ? '─' : '-';\n const line = heading + ' ' + divider.repeat(Math.max(0, width - heading.length - 1));\n screen.writeString(x, row, line.slice(0, width), {\n ...attrs,\n fg: this._categoryColor,\n bold: true,\n });\n row++;\n if (row >= y + height) break;\n }\n\n // Render bindings in a grid of _columns\n for (let i = 0; i < group.bindings.length; i += this._columns) {\n if (row >= y + height) break;\n\n for (let col = 0; col < this._columns; col++) {\n const binding = group.bindings[i + col];\n if (!binding) continue;\n\n const cx = x + col * colWidth;\n const availWidth = colWidth - 1; // 1 char gap between columns\n\n if (availWidth <= 0) continue;\n\n // Render key label\n const labelLen = this._renderKeyLabel(screen, cx, row, binding.key, attrs);\n\n // Render description after the label (with a space gap)\n const descX = cx + labelLen + 1;\n const descWidth = availWidth - labelLen - 1;\n if (descWidth > 0) {\n const desc = binding.description.slice(0, descWidth);\n screen.writeString(descX, row, desc, attrs);\n }\n }\n row++;\n }\n\n // Blank line between groups\n if (this._showCategories && group.category) {\n row++;\n }\n }\n }\n}\n","// ─────────────────────────────────────────────────────\n// @termuijs/ui — FilePicker widget\n//\n// Interactive file browser:\n// ↑ / ↓ Move selection\n// Enter Open directory | fire onSelect for file\n// Backspace Navigate to parent directory\n// Escape Fire onCancel\n// ─────────────────────────────────────────────────────\n\nimport * as fs from 'node:fs';\nimport * as nodePath from 'node:path';\nimport { Widget } from '@termuijs/widgets';\nimport {\n type Style,\n type Screen,\n type KeyEvent,\n mergeStyles,\n defaultStyle,\n styleToCellAttrs,\n caps,\n truncate,\n} from '@termuijs/core';\n\n// ── Types ────────────────────────────────────────────\n\n/** A single entry shown in the file picker list. */\nexport interface FileEntry {\n /** Basename only (never a full path). */\n name: string;\n /** True when the entry is a directory. */\n isDir: boolean;\n /** Resolved absolute path. */\n fullPath: string;\n}\n\nexport interface FilePickerOptions {\n /** Initial directory. Defaults to `process.cwd()`. */\n startPath?: string;\n /**\n * Extension filter (e.g. `['.ts', '.tsx']`).\n * When provided, only files whose extension matches are shown.\n * Directories are always shown regardless of this filter.\n */\n filter?: string[];\n /** Show dot-files / dot-directories. Default: `false`. */\n showHidden?: boolean;\n /** Foreground colour for directory entries. Default: cyan. */\n dirColor?: Style['fg'];\n /** Foreground colour for file entries. Default: white. */\n fileColor?: Style['fg'];\n /** Foreground colour for the highlighted (active) row. Default: yellow. */\n activeColor?: Style['fg'];\n /** Called with the absolute path when the user selects a file. */\n onSelect?: (path: string) => void;\n /** Called when the user presses Escape. */\n onCancel?: () => void;\n}\n\n// ── Widget ───────────────────────────────────────────\n\n/**\n * FilePicker — an interactive file browser widget.\n *\n * Wire keyboard events via `handleKey(event)`.\n * The widget is self-contained: it reads the filesystem on construction\n * and every time the directory changes.\n */\nexport class FilePicker extends Widget {\n private _cwd: string;\n private _filter: string[];\n private _showHidden: boolean;\n private _entries: FileEntry[] = [];\n private _cursor = 0;\n private _scrollTop = 0;\n\n private _dirColor: Style['fg'];\n private _fileColor: Style['fg'];\n private _activeColor: Style['fg'];\n\n private _onSelect?: (path: string) => void;\n private _onCancel?: () => void;\n\n focusable = true;\n\n constructor(options: FilePickerOptions = {}) {\n super(mergeStyles(defaultStyle(), { flexGrow: 1 }));\n this._cwd = nodePath.resolve(options.startPath ?? process.cwd());\n this._filter = options.filter ?? [];\n this._showHidden = options.showHidden ?? false;\n this._dirColor = options.dirColor ?? { type: 'named', name: 'cyan' };\n this._fileColor = options.fileColor ?? { type: 'named', name: 'white' };\n this._activeColor = options.activeColor ?? { type: 'named', name: 'yellow' };\n this._onSelect = options.onSelect;\n this._onCancel = options.onCancel;\n\n this._loadEntries();\n }\n\n // ── Public accessors ─────────────────────────────\n\n /** The absolute path of the directory currently being displayed. */\n get currentPath(): string { return this._cwd; }\n\n /** The `FileEntry` the cursor is currently on, or `undefined` if the list is empty. */\n get selectedEntry(): FileEntry | undefined { return this._entries[this._cursor]; }\n\n /** Read-only snapshot of the currently visible entries. */\n get entries(): readonly FileEntry[] { return this._entries; }\n\n /** Current cursor index within `entries`. */\n get cursorIndex(): number { return this._cursor; }\n\n // ── Navigation ───────────────────────────────────\n\n /** Move the cursor one row down. Clamps at the last entry. */\n selectNext(): void {\n if (this._cursor < this._entries.length - 1) {\n this._cursor++;\n this.markDirty();\n }\n }\n\n /** Move the cursor one row up. Clamps at the first entry. */\n selectPrev(): void {\n if (this._cursor > 0) {\n this._cursor--;\n this.markDirty();\n }\n }\n\n /**\n * Confirm the current selection:\n * - If the entry is a directory (including `..`), navigate into it.\n * - If the entry is a file, fire `onSelect(fullPath)`.\n */\n confirm(): void {\n const entry = this._entries[this._cursor];\n if (!entry) return;\n\n if (entry.isDir) {\n this._navigateTo(entry.fullPath);\n } else {\n this._onSelect?.(entry.fullPath);\n }\n }\n\n /**\n * Navigate to the parent directory.\n * No-ops when already at the filesystem root.\n */\n goUp(): void {\n const parent = nodePath.dirname(this._cwd);\n if (parent !== this._cwd) { // at root dirname(root) === root\n this._navigateTo(parent);\n }\n }\n\n /** Fire `onCancel`. */\n cancel(): void {\n this._onCancel?.();\n }\n\n /**\n * Convenience key handler. Wire this to your app's input loop.\n *\n * | Key | Action |\n * |-------------------|----------------|\n * | `up` / `k` | `selectPrev()` |\n * | `down` / `j` | `selectNext()` |\n * | `enter`/`return` | `confirm()` |\n * | `backspace` | `goUp()` |\n * | `escape` | `cancel()` |\n */\n handleKey(event: KeyEvent): void {\n switch (event.key) {\n case 'up': this.selectPrev(); break;\n case 'k': if (!event.ctrl && !event.alt) this.selectPrev(); break;\n case 'down': this.selectNext(); break;\n case 'j': if (!event.ctrl && !event.alt) this.selectNext(); break;\n case 'enter':\n case 'return': this.confirm(); break;\n case 'backspace': this.goUp(); break;\n case 'escape': this.cancel(); break;\n }\n }\n\n // ── Filesystem ───────────────────────────────────\n\n /**\n * Navigate to an absolute directory path.\n * Reloads the entry list and resets cursor / scroll.\n */\n private _navigateTo(absPath: string): void {\n this._cwd = absPath;\n this._loadEntries();\n // _loadEntries resets cursor and calls markDirty\n }\n\n /**\n * Read `this._cwd` and populate `this._entries`.\n *\n * Layout:\n * 1. `..` parent entry (omitted at root)\n * 2. Directories — alpha-sorted\n * 3. Files — alpha-sorted, filtered by `this._filter`\n */\n private _loadEntries(): void {\n const entries: FileEntry[] = [];\n\n // Parent entry (unless at root)\n const parent = nodePath.dirname(this._cwd);\n if (parent !== this._cwd) {\n entries.push({ name: '..', isDir: true, fullPath: parent });\n }\n\n try {\n const dirents = fs.readdirSync(this._cwd, { withFileTypes: true });\n\n const dirs: FileEntry[] = [];\n const files: FileEntry[] = [];\n\n for (const dirent of dirents) {\n // Skip hidden entries unless explicitly shown\n if (!this._showHidden && dirent.name.startsWith('.')) continue;\n\n const fullPath = nodePath.join(this._cwd, dirent.name);\n const isDir = dirent.isDirectory() || dirent.isSymbolicLink() && this._isDir(fullPath);\n\n if (isDir) {\n dirs.push({ name: dirent.name, isDir: true, fullPath });\n } else {\n // Apply extension filter to files only\n if (this._filter.length > 0) {\n const ext = nodePath.extname(dirent.name);\n if (!this._filter.includes(ext)) continue;\n }\n files.push({ name: dirent.name, isDir: false, fullPath });\n }\n }\n\n // Sort each group alphabetically (case-insensitive)\n const alpha = (a: FileEntry, b: FileEntry) =>\n a.name.toLowerCase().localeCompare(b.name.toLowerCase());\n\n dirs.sort(alpha);\n files.sort(alpha);\n\n entries.push(...dirs, ...files);\n } catch {\n // Permission denied or directory removed — show only the `..` entry\n }\n\n this._entries = entries;\n this._cursor = 0;\n this._scrollTop = 0;\n this.markDirty();\n }\n\n /** Safe stat to check if a symlink target is a directory. Never throws. */\n private _isDir(p: string): boolean {\n try { return fs.statSync(p).isDirectory(); } catch { return false; }\n }\n\n // ── Rendering ────────────────────────────────────\n\n protected _renderSelf(screen: Screen): void {\n const { x, y, width, height } = this._rect;\n if (width <= 0 || height <= 0) return;\n\n const attrs = styleToCellAttrs(this._style);\n\n // ── Row 0: path header ────────────────────────\n const headerIcon = caps.unicode ? '📁 ' : '> ';\n const headerText = truncate(headerIcon + this._cwd, width);\n screen.writeString(x, y, headerText, {\n ...attrs,\n fg: this._dirColor,\n bold: true,\n });\n\n if (height < 2) return;\n\n // ── Row 1: separator ─────────────────────────\n const sep = caps.unicode ? '─'.repeat(width) : '-'.repeat(width);\n screen.writeString(x, y + 1, sep, { ...attrs, dim: true });\n\n // ── Rows 2+: entries ─────────────────────────\n const listTop = y + 2;\n const listHeight = height - 2;\n if (listHeight <= 0) return;\n\n // Scroll the viewport so the cursor stays visible\n if (this._cursor < this._scrollTop) {\n this._scrollTop = this._cursor;\n } else if (this._cursor >= this._scrollTop + listHeight) {\n this._scrollTop = this._cursor - listHeight + 1;\n }\n\n for (let i = 0; i < listHeight; i++) {\n const entryIdx = this._scrollTop + i;\n const entry = this._entries[entryIdx];\n const row = listTop + i;\n\n if (!entry) {\n // Blank the row so stale characters don't linger\n screen.writeString(x, row, ' '.repeat(width), attrs);\n continue;\n }\n\n const isActive = entryIdx === this._cursor;\n\n const icon = entry.isDir\n ? (caps.unicode ? (entry.name === '..' ? '↩ ' : '📂 ') : (entry.name === '..' ? '.. ' : 'd '))\n : (caps.unicode ? ' ' : ' ');\n\n const label = truncate(icon + entry.name, width);\n\n const fg = isActive\n ? this._activeColor\n : entry.isDir\n ? this._dirColor\n : this._fileColor;\n\n screen.writeString(x, row, label.padEnd(width), {\n ...attrs,\n fg,\n bold: isActive,\n inverse: isActive,\n });\n }\n }\n}\n","// DatePicker — calendar date selector widget\nimport { Widget } from '@termuijs/widgets';\nimport { type Style, type Screen, type KeyEvent, mergeStyles, defaultStyle, styleToCellAttrs, caps } from '@termuijs/core';\n\nexport interface DatePickerOptions {\n value?: Date;\n onChange?: (date: Date) => void;\n}\n\nconst MONTH_NAMES = [\n 'January', 'February', 'March', 'April', 'May', 'June',\n 'July', 'August', 'September', 'October', 'November', 'December'\n];\n\nexport class DatePicker extends Widget {\n private _selectedDate: Date;\n private _currentMonth: Date;\n private _onChange?: (date: Date) => void;\n focusable = true;\n\n constructor(options: DatePickerOptions = {}) {\n super(mergeStyles(defaultStyle(), { border: 'single', height: 10 }));\n this._selectedDate = options.value ? new Date(options.value) : new Date();\n this._selectedDate.setHours(0, 0, 0, 0);\n\n this._currentMonth = new Date(this._selectedDate.getFullYear(), this._selectedDate.getMonth(), 1);\n this._onChange = options.onChange;\n }\n\n get value(): Date {\n return this._selectedDate;\n }\n\n set value(date: Date) {\n this._selectedDate = new Date(date);\n this._selectedDate.setHours(0, 0, 0, 0);\n this._currentMonth = new Date(this._selectedDate.getFullYear(), this._selectedDate.getMonth(), 1);\n this.markDirty();\n }\n\n moveSelection(days: number): void {\n const newDate = new Date(this._selectedDate);\n newDate.setDate(newDate.getDate() + days);\n this._selectedDate = newDate;\n\n if (newDate.getMonth() !== this._currentMonth.getMonth() || newDate.getFullYear() !== this._currentMonth.getFullYear()) {\n this._currentMonth = new Date(newDate.getFullYear(), newDate.getMonth(), 1);\n }\n this.markDirty();\n }\n\n changeMonth(months: number): void {\n const targetMonth = this._selectedDate.getMonth() + months;\n const targetYear = this._selectedDate.getFullYear();\n const lastDayOfTarget = new Date(targetYear, targetMonth + 1, 0).getDate();\n const clampedDay = Math.min(this._selectedDate.getDate(), lastDayOfTarget);\n const newDate = new Date(targetYear, targetMonth, clampedDay);\n this._selectedDate = newDate;\n this._currentMonth = new Date(newDate.getFullYear(), newDate.getMonth(), 1);\n this.markDirty();\n }\n\n confirm(): void {\n this._onChange?.(this._selectedDate);\n }\n\n handleKey(event: KeyEvent): void {\n switch (event.key) {\n case 'left':\n case 'h':\n if (event.key === 'left' || (!event.ctrl && !event.alt)) {\n this.moveSelection(-1);\n }\n break;\n case 'right':\n case 'l':\n if (event.key === 'right' || (!event.ctrl && !event.alt)) {\n this.moveSelection(1);\n }\n break;\n case 'up':\n case 'k':\n if (event.key === 'up' || (!event.ctrl && !event.alt)) {\n this.moveSelection(-7);\n }\n break;\n case 'down':\n case 'j':\n if (event.key === 'down' || (!event.ctrl && !event.alt)) {\n this.moveSelection(7);\n }\n break;\n case 'pageup':\n this.changeMonth(-1);\n break;\n case 'pagedown':\n this.changeMonth(1);\n break;\n case 'enter':\n case 'return':\n this.confirm();\n break;\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\n // 1. Render Month Header (◀ Month Year ▶)\n const prevArrow = caps.unicode ? '◀' : '<';\n const nextArrow = caps.unicode ? '▶' : '>';\n const monthName = MONTH_NAMES[this._currentMonth.getMonth()];\n const year = this._currentMonth.getFullYear();\n const title = `${prevArrow} ${monthName} ${year} ${nextArrow}`;\n const titleX = x + Math.floor((width - title.length) / 2);\n screen.writeString(Math.max(x, titleX), y, title, { ...attrs, bold: true });\n\n if (height < 2) return;\n\n // 2. Render Weekdays Header\n const weekdays = 'Su Mo Tu We Th Fr Sa';\n const weekdayX = x + Math.floor((width - weekdays.length) / 2);\n screen.writeString(Math.max(x, weekdayX), y + 1, weekdays, { ...attrs, dim: true });\n\n // 3. Render Calendar Grid (Days)\n const daysInMonth = new Date(year, this._currentMonth.getMonth() + 1, 0).getDate();\n const firstDay = new Date(year, this._currentMonth.getMonth(), 1).getDay();\n\n const gridStartY = y + 2;\n const maxWeeks = 6;\n\n for (let w = 0; w < maxWeeks; w++) {\n const rowY = gridStartY + w;\n if (rowY >= y + height) break;\n\n for (let d = 0; d < 7; d++) {\n const colX = Math.max(x, weekdayX) + d * 3;\n if (colX >= x + width) continue;\n\n const dayVal = w * 7 + d - firstDay + 1;\n\n if (dayVal >= 1 && dayVal <= daysInMonth) {\n const label = String(dayVal).padStart(2, ' ');\n const isSelected = this._selectedDate.getDate() === dayVal &&\n this._selectedDate.getMonth() === this._currentMonth.getMonth() &&\n this._selectedDate.getFullYear() === this._currentMonth.getFullYear();\n\n if (isSelected) {\n screen.writeString(colX, rowY, label, {\n ...attrs,\n bold: true,\n inverse: this.isFocused,\n underline: !this.isFocused\n });\n } else {\n screen.writeString(colX, rowY, label, attrs);\n }\n } else {\n // Blank spacer for out-of-bounds days\n screen.writeString(colX, rowY, ' ', attrs);\n }\n }\n }\n }\n}\n","import { Widget } from '@termuijs/widgets';\nimport { type Style, type Screen, type KeyEvent, mergeStyles, defaultStyle, styleToCellAttrs } from '@termuijs/core';\n\nexport interface TimePickerOptions {\n value?: Date;\n onChange?: (date: Date) => void;\n use24Hour?: boolean;\n}\n\nexport class TimePicker extends Widget {\n private _date: Date;\n private _use24Hour: boolean;\n private _activeSegment: number = 0; // 0: Hours, 1: Minutes, 2: AM/PM\n private _onChange?: (date: Date) => void;\n focusable = true;\n\n constructor(options: TimePickerOptions = {}) {\n super(mergeStyles(defaultStyle(), { border: 'single', height: 3 }));\n this._date = options.value ? new Date(options.value) : new Date();\n this._use24Hour = options.use24Hour ?? false;\n this._onChange = options.onChange;\n }\n\n get value(): Date {\n return this._date;\n }\n\n set value(val: Date) {\n this._date = new Date(val);\n this.markDirty();\n }\n\n private _updateSegment(delta: number): void {\n const d = new Date(this._date);\n if (this._activeSegment === 0) {\n d.setHours(d.getHours() + delta);\n } else if (this._activeSegment === 1) {\n d.setMinutes(d.getMinutes() + delta);\n } else if (this._activeSegment === 2) {\n const h = d.getHours();\n if (h >= 12) {\n d.setHours(h - 12);\n } else {\n d.setHours(h + 12);\n }\n }\n this._date = d;\n this.markDirty();\n this._onChange?.(this._date);\n }\n\n private _nextSegment(delta: number): void {\n this._activeSegment += delta;\n const max = this._use24Hour ? 1 : 2;\n if (this._activeSegment < 0) this._activeSegment = 0;\n if (this._activeSegment > max) this._activeSegment = max;\n this.markDirty();\n }\n\n handleKey(event: KeyEvent): void {\n switch (event.key) {\n case 'left':\n case 'h':\n this._nextSegment(-1);\n break;\n case 'right':\n case 'l':\n this._nextSegment(1);\n break;\n case 'up':\n case 'k':\n this._updateSegment(1);\n break;\n case 'down':\n case 'j':\n this._updateSegment(-1);\n break;\n case 'enter':\n case 'return':\n this._onChange?.(this._date);\n break;\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\n let h = this._date.getHours();\n const m = this._date.getMinutes();\n const isPM = h >= 12;\n\n let ampmStr = \"\";\n if (!this._use24Hour) {\n if (h === 0) h = 12;\n else if (h > 12) h -= 12;\n ampmStr = isPM ? \" PM\" : \" AM\";\n }\n\n const hStr = String(h).padStart(2, '0');\n const mStr = String(m).padStart(2, '0');\n\n const totalWidth = 2 + 1 + 2 + (this._use24Hour ? 0 : 3);\n const startX = x + Math.max(0, Math.floor((width - totalWidth) / 2));\n const centerY = y + Math.floor(height / 2);\n\n screen.writeString(startX, centerY, hStr, {\n ...attrs,\n inverse: this.isFocused && this._activeSegment === 0\n });\n\n screen.writeString(startX + 2, centerY, \":\", attrs);\n\n screen.writeString(startX + 3, centerY, mStr, {\n ...attrs,\n inverse: this.isFocused && this._activeSegment === 1\n });\n\n if (!this._use24Hour) {\n screen.writeString(startX + 5, centerY, ampmStr, {\n ...attrs,\n inverse: this.isFocused && this._activeSegment === 2\n });\n }\n }\n}\n","// DateRangePicker — calendar date range selector widget\nimport { Widget } from '@termuijs/widgets';\nimport {\n type Style,\n type Screen,\n type KeyEvent,\n mergeStyles,\n defaultStyle,\n styleToCellAttrs,\n caps,\n} from '@termuijs/core';\n\nexport interface DateRange {\n start: Date;\n end: Date;\n}\n\nexport interface DateRangePickerOptions {\n value?: Partial<DateRange>;\n onChange?: (range: Partial<DateRange>) => void;\n}\n\nconst MONTH_NAMES = [\n 'January', 'February', 'March', 'April', 'May', 'June',\n 'July', 'August', 'September', 'October', 'November', 'December'\n];\n\nexport class DateRangePicker extends Widget {\n private _cursorDate: Date;\n private _currentMonth: Date;\n private _rangeStart: Date | null = null;\n private _rangeEnd: Date | null = null;\n private _selectionState: 'none' | 'start-set' | 'end-set' = 'none';\n private _onChange?: (range: Partial<DateRange>) => void;\n focusable = true;\n\n constructor(options: DateRangePickerOptions = {}) {\n super(mergeStyles(defaultStyle(), { border: 'single', height: 10 }));\n\n this._rangeStart = options.value?.start ? this._zeroTime(options.value.start) : null;\n this._rangeEnd = options.value?.end ? this._zeroTime(options.value.end) : null;\n\n if (this._rangeStart && this._rangeEnd) {\n this._selectionState = 'end-set';\n } else if (this._rangeStart) {\n this._selectionState = 'start-set';\n } else {\n this._selectionState = 'none';\n }\n\n const baseDate = this._rangeStart || this._rangeEnd || new Date();\n this._cursorDate = this._zeroTime(baseDate);\n\n this._currentMonth = new Date(this._cursorDate.getFullYear(), this._cursorDate.getMonth(), 1);\n this._onChange = options.onChange;\n }\n\n private _zeroTime(d: Date): Date {\n const res = new Date(d);\n res.setHours(0, 0, 0, 0);\n return res;\n }\n\n get range(): Partial<DateRange> {\n const res: Partial<DateRange> = {};\n if (this._rangeStart) res.start = new Date(this._rangeStart);\n if (this._rangeEnd) res.end = new Date(this._rangeEnd);\n return res;\n }\n\n moveSelection(days: number): void {\n const newDate = new Date(this._cursorDate);\n newDate.setDate(newDate.getDate() + days);\n this._cursorDate = newDate;\n\n if (newDate.getMonth() !== this._currentMonth.getMonth() || newDate.getFullYear() !== this._currentMonth.getFullYear()) {\n this._currentMonth = new Date(newDate.getFullYear(), newDate.getMonth(), 1);\n }\n this.markDirty();\n }\n\n changeMonth(months: number): void {\n const targetMonth = this._cursorDate.getMonth() + months;\n const targetYear = this._cursorDate.getFullYear();\n const lastDayOfTarget = new Date(targetYear, targetMonth + 1, 0).getDate();\n const clampedDay = Math.min(this._cursorDate.getDate(), lastDayOfTarget);\n const newDate = new Date(targetYear, targetMonth, clampedDay);\n this._cursorDate = newDate;\n this._currentMonth = new Date(newDate.getFullYear(), newDate.getMonth(), 1);\n this.markDirty();\n }\n\n confirm(): void {\n const cur = new Date(this._cursorDate);\n if (this._selectionState === 'none' || this._selectionState === 'end-set') {\n this._rangeStart = cur;\n this._rangeEnd = null;\n this._selectionState = 'start-set';\n } else if (this._selectionState === 'start-set') {\n const start = this._rangeStart!;\n if (cur < start) {\n // Swap start and end\n this._rangeEnd = start;\n this._rangeStart = cur;\n } else {\n this._rangeEnd = cur;\n }\n this._selectionState = 'end-set';\n }\n this.markDirty();\n this._onChange?.(this.range);\n }\n\n handleKey(event: KeyEvent): void {\n switch (event.key) {\n case 'left':\n case 'h':\n if (event.key === 'left' || (!event.ctrl && !event.alt)) {\n this.moveSelection(-1);\n }\n break;\n case 'right':\n case 'l':\n if (event.key === 'right' || (!event.ctrl && !event.alt)) {\n this.moveSelection(1);\n }\n break;\n case 'up':\n case 'k':\n if (event.key === 'up' || (!event.ctrl && !event.alt)) {\n this.moveSelection(-7);\n }\n break;\n case 'down':\n case 'j':\n if (event.key === 'down' || (!event.ctrl && !event.alt)) {\n this.moveSelection(7);\n }\n break;\n case 'pageup':\n this.changeMonth(-1);\n break;\n case 'pagedown':\n this.changeMonth(1);\n break;\n case 'enter':\n case 'return':\n this.confirm();\n break;\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\n // 1. Render Month Header (◀ Month Year ▶)\n const prevArrow = caps.unicode ? '◀' : '<';\n const nextArrow = caps.unicode ? '▶' : '>';\n const monthName = MONTH_NAMES[this._currentMonth.getMonth()];\n const year = this._currentMonth.getFullYear();\n const title = `${prevArrow} ${monthName} ${year} ${nextArrow}`;\n const titleX = x + Math.floor((width - title.length) / 2);\n screen.writeString(Math.max(x, titleX), y, title, { ...attrs, bold: true });\n\n if (height < 2) return;\n\n // 2. Render Weekdays Header\n const weekdays = 'Su Mo Tu We Th Fr Sa';\n const weekdayX = x + Math.floor((width - weekdays.length) / 2);\n screen.writeString(Math.max(x, weekdayX), y + 1, weekdays, { ...attrs, dim: true });\n\n // 3. Render Calendar Grid (Days)\n const daysInMonth = new Date(year, this._currentMonth.getMonth() + 1, 0).getDate();\n const firstDay = new Date(year, this._currentMonth.getMonth(), 1).getDay();\n\n const gridStartY = y + 2;\n const maxWeeks = 6;\n\n for (let w = 0; w < maxWeeks; w++) {\n const rowY = gridStartY + w;\n if (rowY >= y + height) break;\n\n for (let d = 0; d < 7; d++) {\n const colX = Math.max(x, weekdayX) + d * 3;\n if (colX >= x + width) continue;\n\n const dayVal = w * 7 + d - firstDay + 1;\n\n if (dayVal >= 1 && dayVal <= daysInMonth) {\n const label = String(dayVal).padStart(2, ' ');\n const dayDate = new Date(year, this._currentMonth.getMonth(), dayVal);\n dayDate.setHours(0, 0, 0, 0);\n const dayTime = dayDate.getTime();\n\n const isCursor = this._cursorDate.getTime() === dayTime;\n const isStart = this._rangeStart !== null && this._rangeStart.getTime() === dayTime;\n const isEnd = this._rangeEnd !== null && this._rangeEnd.getTime() === dayTime;\n const isBetween = this._rangeStart !== null && this._rangeEnd !== null &&\n dayTime > this._rangeStart.getTime() && dayTime < this._rangeEnd.getTime();\n\n if (isCursor) {\n screen.writeString(colX, rowY, label, {\n ...attrs,\n bold: true,\n inverse: this.isFocused,\n underline: !this.isFocused\n });\n } else if (isStart || isEnd) {\n screen.writeString(colX, rowY, label, {\n ...attrs,\n bold: true,\n fg: { type: 'named', name: 'cyan' },\n underline: true\n });\n } else if (isBetween) {\n screen.writeString(colX, rowY, label, {\n ...attrs,\n fg: { type: 'named', name: 'black' },\n bg: { type: 'named', name: 'cyan' }\n });\n } else {\n screen.writeString(colX, rowY, label, attrs);\n }\n } else {\n // Blank spacer for out-of-bounds days\n screen.writeString(colX, rowY, ' ', attrs);\n }\n }\n }\n }\n}\n","// ─────────────────────────────────────────────────────\n// @termuijs/ui — ColorPicker widget\n//\n// A keyboard-navigable and text-editable ColorPicker.\n// - Arrow keys (or hjkl) navigate a 16-color preset grid palette\n// - Alphanumeric entry directly edits the hex value input\n// - Shows a live swatch preview of the current color\n// - Fires onChange(color) when the selection changes\n// ─────────────────────────────────────────────────────\n\nimport { Widget } from '@termuijs/widgets';\nimport {\n type Style,\n type Screen,\n type KeyEvent,\n mergeStyles,\n defaultStyle,\n styleToCellAttrs,\n caps,\n parseColor,\n colorToRgb,\n Color,\n NamedColor\n} from '@termuijs/core';\n\nexport interface ColorPickerOptions {\n value?: string | Color;\n onChange?: (color: Color) => void;\n}\n\nconst DEFAULT_PALETTE: NamedColor[] = [\n 'black', 'red', 'green', 'yellow', 'blue', 'magenta', 'cyan', 'white',\n 'brightBlack', 'brightRed', 'brightGreen', 'brightYellow', 'brightBlue', 'brightMagenta', 'brightCyan', 'brightWhite'\n];\n\nconst PALETTE_COLORS: Color[] = DEFAULT_PALETTE.map(name => parseColor(name));\n\nexport class ColorPicker extends Widget {\n private _selectedColor: Color;\n private _hexValue = 'ffffff'; // hex digits without '#'\n private _paletteIndex: number | null = null;\n private _onChange?: (color: Color) => void;\n focusable = true;\n\n constructor(options: ColorPickerOptions = {}) {\n super(mergeStyles(defaultStyle(), { border: 'single', height: 7 }));\n \n const initialValue = options.value ?? '#ffffff';\n if (typeof initialValue === 'string') {\n const parsed = parseColor(initialValue);\n this._selectedColor = parsed.type !== 'none' ? parsed : parseColor('#ffffff');\n } else {\n this._selectedColor = initialValue.type !== 'none' ? initialValue : parseColor('#ffffff');\n }\n\n this._hexValue = this._colorToHexStr(this._selectedColor);\n this._onChange = options.onChange;\n\n // Determine if initial color is in the palette\n const matchIdx = PALETTE_COLORS.findIndex(c => this._colorsEqual(c, this._selectedColor));\n this._paletteIndex = matchIdx !== -1 ? matchIdx : null;\n }\n\n get value(): Color {\n return this._selectedColor;\n }\n\n set value(val: string | Color) {\n let newColor: Color;\n if (typeof val === 'string') {\n const parsed = parseColor(val);\n newColor = parsed.type !== 'none' ? parsed : parseColor('#ffffff');\n } else {\n newColor = val.type !== 'none' ? val : parseColor('#ffffff');\n }\n\n this._selectedColor = newColor;\n this._hexValue = this._colorToHexStr(newColor);\n\n const matchIdx = PALETTE_COLORS.findIndex(c => this._colorsEqual(c, newColor));\n this._paletteIndex = matchIdx !== -1 ? matchIdx : null;\n\n this.markDirty();\n }\n\n private _colorToHexStr(color: Color): string {\n const [r, g, b] = colorToRgb(color);\n return ((r << 16) | (g << 8) | b).toString(16).padStart(6, '0');\n }\n\n private _colorsEqual(c1: Color, c2: Color): boolean {\n const rgb1 = colorToRgb(c1);\n const rgb2 = colorToRgb(c2);\n return rgb1[0] === rgb2[0] && rgb1[1] === rgb2[1] && rgb1[2] === rgb2[2];\n }\n\n private _updateFromHexInput(): void {\n const fullHex = '#' + this._hexValue;\n const parsed = parseColor(fullHex);\n if (parsed.type !== 'none') {\n this._selectedColor = parsed;\n const matchIdx = PALETTE_COLORS.findIndex(c => this._colorsEqual(c, parsed));\n this._paletteIndex = matchIdx !== -1 ? matchIdx : null;\n this._onChange?.(parsed);\n }\n this.markDirty();\n }\n\n handleKey(event: KeyEvent): void {\n let index = this._paletteIndex ?? 0;\n let paletteChanged = false;\n\n switch (event.key) {\n case 'left':\n case 'h':\n if (event.key === 'left' || (!event.ctrl && !event.alt)) {\n if (index > 0) {\n index--;\n paletteChanged = true;\n }\n }\n break;\n\n case 'right':\n case 'l':\n if (event.key === 'right' || (!event.ctrl && !event.alt)) {\n if (index < 15) {\n index++;\n paletteChanged = true;\n }\n }\n break;\n\n case 'up':\n case 'k':\n if (event.key === 'up' || (!event.ctrl && !event.alt)) {\n if (index >= 8) {\n index -= 8;\n paletteChanged = true;\n }\n }\n break;\n\n case 'down':\n case 'j':\n if (event.key === 'down' || (!event.ctrl && !event.alt)) {\n if (index < 8) {\n index += 8;\n paletteChanged = true;\n }\n }\n break;\n\n case 'backspace':\n if (this._hexValue.length > 0) {\n this._hexValue = this._hexValue.slice(0, -1);\n this._updateFromHexInput();\n }\n break;\n\n default:\n if (event.key && event.key.length === 1 && !event.ctrl && !event.alt) {\n const char = event.key.toLowerCase();\n if (/^[0-9a-f]$/.test(char) && this._hexValue.length < 6) {\n this._hexValue += char;\n this._updateFromHexInput();\n }\n }\n break;\n }\n\n if (paletteChanged) {\n this._paletteIndex = index;\n const newColor = PALETTE_COLORS[index];\n this._selectedColor = newColor;\n this._hexValue = this._colorToHexStr(newColor);\n this._onChange?.(newColor);\n this.markDirty();\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\n // 1. Render Palette Grid (Row 0 and 1)\n const symbol = caps.unicode ? '■' : 'o';\n\n for (let r = 0; r < 2; r++) {\n const rowY = y + r;\n if (rowY >= y + height) break;\n\n for (let c = 0; c < 8; c++) {\n const index = r * 8 + c;\n const cellX = x + c * 4;\n if (cellX >= x + width) continue;\n\n const color = PALETTE_COLORS[index];\n const isSelected = this._paletteIndex === index;\n\n if (isSelected) {\n screen.writeString(cellX, rowY, '[', attrs);\n screen.writeString(cellX + 1, rowY, symbol, { ...attrs, fg: color, bold: true });\n screen.writeString(cellX + 2, rowY, ']', attrs);\n } else {\n screen.writeString(cellX + 1, rowY, symbol, { ...attrs, fg: color });\n }\n }\n }\n\n if (height < 4) return;\n\n // 2. Render Hex Input & Live Swatch Line (Row 3)\n const hexPrefix = 'Hex: #';\n const hexFull = hexPrefix + this._hexValue;\n screen.writeString(x, y + 3, hexFull, attrs);\n\n // Render input cursor if focused\n if (this.isFocused) {\n const cursorX = x + hexFull.length;\n if (cursorX < x + width) {\n screen.setCell(cursorX, y + 3, {\n char: ' ',\n ...attrs,\n inverse: true\n });\n }\n }\n\n // Render Swatch next to it (starting at col 20 to give plenty of space for \"Hex: #ffffff \")\n const swatchX = x + 20;\n if (swatchX < x + width) {\n const swatchLabel = 'Swatch: ';\n screen.writeString(swatchX, y + 3, swatchLabel, attrs);\n\n const swatchTextX = swatchX + swatchLabel.length;\n if (swatchTextX < x + width) {\n const swatchBlocks = caps.unicode ? '████' : '####';\n screen.writeString(swatchTextX, y + 3, swatchBlocks, {\n ...attrs,\n fg: this._selectedColor,\n bg: this._selectedColor\n });\n }\n }\n }\n}\n","// ─────────────────────────────────────────────────────\n// @termuijs/ui — Accordion widget\n//\n// A collapsible vertical section widget with keyboard focus,\n// support for single/multi-open modes, and toggle event fires.\n// ─────────────────────────────────────────────────────\n\nimport { Widget } from '@termuijs/widgets';\nimport {\n type Style,\n type Screen,\n type KeyEvent,\n mergeStyles,\n defaultStyle,\n styleToCellAttrs,\n caps\n} from '@termuijs/core';\n\nexport interface AccordionItem {\n title: string;\n body: string;\n}\n\nexport interface AccordionOptions {\n /** Allow multiple sections open at once. Default: false (one at a time) */\n multi?: boolean;\n onToggle?: (index: number, open: boolean) => void;\n}\n\nexport class Accordion extends Widget {\n private _items: AccordionItem[] = [];\n private _multi = false;\n private _onToggle?: (index: number, open: boolean) => void;\n private _focusIndex = 0;\n private _openSet: Set<number> = new Set();\n\n focusable = true;\n\n constructor(items: AccordionItem[], style: Partial<Style> = {}, opts: AccordionOptions = {}) {\n super(mergeStyles(defaultStyle(), style));\n this._items = items;\n this._multi = opts?.multi ?? false;\n this._onToggle = opts?.onToggle;\n }\n\n setItems(items: AccordionItem[]): void {\n this._items = items;\n this._focusIndex = Math.min(this._focusIndex, Math.max(0, items.length - 1));\n const keysToDelete: number[] = [];\n for (const idx of this._openSet) {\n if (idx >= items.length) {\n keysToDelete.push(idx);\n }\n }\n for (const key of keysToDelete) {\n this._openSet.delete(key);\n }\n this.markDirty();\n }\n\n openSection(index: number): void {\n if (index < 0 || index >= this._items.length) return;\n if (this._openSet.has(index)) return;\n\n if (!this._multi) {\n for (const openIdx of Array.from(this._openSet)) {\n this._openSet.delete(openIdx);\n this._onToggle?.(openIdx, false);\n }\n }\n\n this._openSet.add(index);\n this._onToggle?.(index, true);\n this.markDirty();\n }\n\n closeSection(index: number): void {\n if (index < 0 || index >= this._items.length) return;\n if (!this._openSet.has(index)) return;\n\n this._openSet.delete(index);\n this._onToggle?.(index, false);\n this.markDirty();\n }\n\n handleKey(event: KeyEvent): void {\n if (this._items.length === 0) return;\n const key = event.key?.toLowerCase();\n\n switch (key) {\n case 'up':\n if (this._focusIndex > 0) {\n this._focusIndex--;\n this.markDirty();\n }\n break;\n case 'down':\n if (this._focusIndex < this._items.length - 1) {\n this._focusIndex++;\n this.markDirty();\n }\n break;\n case 'enter':\n case 'space': {\n const isOpened = this._openSet.has(this._focusIndex);\n if (isOpened) {\n this.closeSection(this._focusIndex);\n } else {\n this.openSection(this._focusIndex);\n }\n break;\n }\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 let currentY = y;\n\n for (let i = 0; i < this._items.length; i++) {\n if (currentY >= y + height) break;\n\n const item = this._items[i];\n const isOpen = this._openSet.has(i);\n const isFocused = i === this._focusIndex;\n\n // 1. Render Title Bar\n const indicator = isOpen ? (caps.unicode ? '▼ ' : 'v ') : (caps.unicode ? '▶ ' : '> ');\n const titleText = `${indicator}${item.title}`;\n const titleAttrs = {\n ...attrs,\n fg: isFocused ? ({ type: 'named' as const, name: 'cyan' as const }) : attrs.fg,\n bold: isFocused\n };\n\n const paddedTitle = titleText.padEnd(width).slice(0, width);\n screen.writeString(x, currentY, paddedTitle, titleAttrs);\n currentY++;\n\n // 2. Render Body content if open\n if (isOpen) {\n const bodyLines = item.body.split('\\n');\n for (const line of bodyLines) {\n if (currentY >= y + height) break;\n\n const indentedLine = ` ${line}`;\n screen.writeString(x, currentY, indentedLine.padEnd(width).slice(0, width), attrs);\n currentY++;\n }\n }\n }\n }\n}\n","// AppShell — full-screen application layout\nimport { Widget } from '@termuijs/widgets';\nimport { type Screen, type Rect, type LayoutNode, type KeyEvent, createLayoutNode, mergeStyles, defaultStyle } from '@termuijs/core';\n\nexport interface AppShellOptions {\n header?: Widget;\n footer?: Widget;\n sidebar?: Widget;\n main: Widget;\n sidebarWidth?: number;\n}\n\nexport class AppShell extends Widget {\n private _header?: Widget;\n private _footer?: Widget;\n private _sidebar?: Widget;\n private _main: Widget;\n private _sidebarWidth: number;\n private _sidebarVisible = true;\n private _mainScrollOffset = 0;\n\n constructor(options: AppShellOptions) {\n super(mergeStyles(defaultStyle(), { width: '100%', height: '100%', overflow: 'hidden' }));\n this._header = options.header;\n this._footer = options.footer;\n this._sidebar = options.sidebar;\n this._main = options.main;\n this._sidebarWidth = Math.max(0, Math.floor(options.sidebarWidth ?? 20));\n }\n\n get sidebarVisible(): boolean {\n return this._sidebarVisible;\n }\n\n override getLayoutNode(): LayoutNode {\n return createLayoutNode(this.id, this.style, []);\n }\n\n override updateRect(rect: Rect): void {\n const changed =\n rect.x !== this.rect.x ||\n rect.y !== this.rect.y ||\n rect.width !== this.rect.width ||\n rect.height !== this.rect.height;\n super.updateRect(rect);\n if (changed) this.markDirty();\n }\n\n handleResize(cols: number, rows: number): void {\n this.updateRect({ x: 0, y: 0, width: cols, height: rows });\n this.markDirty();\n }\n\n scrollUp(lines = 1): void {\n this._mainScrollOffset = Math.max(0, this._mainScrollOffset - lines);\n this.markDirty();\n }\n\n scrollDown(lines = 1): void {\n this._mainScrollOffset += lines;\n this._clampMainScroll();\n this.markDirty();\n }\n\n handleKey(event: KeyEvent): void {\n switch (event.key) {\n case 'up':\n this.scrollUp();\n break;\n case 'down':\n this.scrollDown();\n break;\n }\n }\n\n toggleSidebar(): void {\n this._sidebarVisible = !this._sidebarVisible;\n this._clampMainScroll();\n this.markDirty();\n }\n\n protected _renderSelf(_screen: Screen): void {\n // Container only\n }\n\n override render(screen: Screen): void {\n if (this.style.visible === false) return;\n\n const nextRect = { x: 0, y: 0, width: screen.cols, height: screen.rows };\n if (\n this.rect.x !== nextRect.x ||\n this.rect.y !== nextRect.y ||\n this.rect.width !== nextRect.width ||\n this.rect.height !== nextRect.height\n ) {\n super.updateRect(nextRect);\n }\n\n const shouldClip = this.style.overflow !== 'visible';\n if (shouldClip) screen.pushClip(this.rect);\n\n const { x, y, width, height } = this.rect;\n const headerHeight = this._header ? 1 : 0;\n const footerHeight = this._footer ? 1 : 0;\n const bodyY = y + headerHeight;\n const bodyHeight = Math.max(0, height - headerHeight - footerHeight);\n\n this._renderFixedChild(this._header, screen, { x, y, width, height: headerHeight });\n this._renderFooter(screen, x, y, width, height, footerHeight);\n\n const sidebarWidth = this._sidebar && this._sidebarVisible\n ? Math.min(this._sidebarWidth, width)\n : 0;\n const mainX = x + sidebarWidth;\n const mainWidth = Math.max(0, width - sidebarWidth);\n const mainContentHeight = Math.max(bodyHeight, this._main.rect.height || 0);\n this._clampMainScroll(bodyHeight, mainContentHeight);\n\n if (sidebarWidth > 0 && bodyHeight > 0) {\n this._renderFixedChild(this._sidebar, screen, {\n x,\n y: bodyY,\n width: sidebarWidth,\n height: bodyHeight,\n });\n }\n\n if (mainWidth > 0 && bodyHeight > 0) {\n const originalRect = { ...this._main.rect };\n this._main.updateRect({\n x: mainX,\n y: bodyY - this._mainScrollOffset,\n width: mainWidth,\n height: mainContentHeight,\n });\n screen.pushClip({ x: mainX, y: bodyY, width: mainWidth, height: bodyHeight });\n try {\n this._main.render(screen);\n } finally {\n screen.popClip();\n this._main.updateRect(originalRect);\n }\n }\n\n if (shouldClip) screen.popClip();\n }\n\n private _renderFooter(screen: Screen, x: number, y: number, width: number, height: number, footerHeight: number): void {\n if (!this._footer || footerHeight <= 0) return;\n this._renderFixedChild(this._footer, screen, {\n x,\n y: y + height - footerHeight,\n width,\n height: footerHeight,\n });\n }\n\n private _renderFixedChild(child: Widget | undefined, screen: Screen, rect: Rect): void {\n if (!child || rect.width <= 0 || rect.height <= 0) return;\n const originalRect = { ...child.rect };\n child.updateRect(rect);\n try {\n child.render(screen);\n } finally {\n child.updateRect(originalRect);\n }\n }\n\n private _clampMainScroll(viewportHeight = this._bodyHeight(), contentHeight = Math.max(this._main.rect.height || 0, viewportHeight)): void {\n const maxOffset = Math.max(0, contentHeight - viewportHeight);\n this._mainScrollOffset = Math.max(0, Math.min(this._mainScrollOffset, maxOffset));\n }\n\n private _bodyHeight(): number {\n const headerHeight = this._header ? 1 : 0;\n const footerHeight = this._footer ? 1 : 0;\n return Math.max(0, this.rect.height - headerHeight - footerHeight);\n }\n}\n","// Pagination — simple page navigator\nimport { Widget } from '@termuijs/widgets';\nimport { type Style, type Screen, type KeyEvent, mergeStyles, defaultStyle, styleToCellAttrs } from '@termuijs/core';\n\nexport interface PaginationOptions {\n onChange?: (page: number) => void;\n}\n\nexport class Pagination extends Widget {\n private _page: number;\n private _totalPages: number;\n private _onChange?: (page: number) => void;\n focusable = true;\n\n constructor(page: number, totalPages: number, options: PaginationOptions = {}) {\n super(mergeStyles(defaultStyle(), { height: 1 }));\n this._totalPages = Math.max(1, Math.floor(totalPages));\n this._page = this._clamp(Math.floor(page));\n this._onChange = options.onChange;\n }\n\n get page(): number { return this._page; }\n get totalPages(): number { return this._totalPages; }\n\n private _clamp(n: number): number {\n if (isNaN(n) || !isFinite(n)) return 1;\n return Math.min(this._totalPages, Math.max(1, n));\n }\n\n setPage(n: number): void {\n const next = this._clamp(Math.floor(n));\n if (next === this._page) return;\n this._page = next;\n this._onChange?.(this._page);\n this.markDirty();\n }\n\n next(): void {\n this.setPage(this._page + 1);\n }\n\n prev(): void {\n this.setPage(this._page - 1);\n }\n\n handleKey(event: KeyEvent): void {\n switch (event.key) {\n case 'left': this.prev(); break;\n case 'h': if (!event.ctrl && !event.alt) this.prev(); break;\n case 'right': this.next(); break;\n case 'l': if (!event.ctrl && !event.alt) this.next(); break;\n }\n }\n\n protected _renderSelf(screen: Screen): void {\n const { x, y, width } = this._rect;\n if (width <= 0) return;\n const attrs = styleToCellAttrs(this.style);\n const text = `< ${this._page} / ${this._totalPages} >`;\n screen.writeString(x, y, text.slice(0, width), attrs);\n }\n}\n","import { Widget } from '@termuijs/widgets';\nimport { type Color, type Style, type Screen, type KeyEvent, mergeStyles, defaultStyle, styleToCellAttrs } from '@termuijs/core';\n\nexport interface ScalePromptOptions {\n max?: number;\n question?: string;\n endLabels?: [string, string];\n activeColor?: Color;\n onSelect?: (value: number) => void;\n}\n\nexport class ScalePrompt extends Widget {\n private _max: number;\n private _value: number;\n private _question?: string;\n private _endLabels?: [string, string];\n private _activeColor: Color;\n private _onSelect?: (value: number) => void;\n\n focusable = true;\n\n constructor(style?: Partial<Style>, opts: ScalePromptOptions = {}) {\n super(mergeStyles(defaultStyle(), { height: 3, flexGrow: 1, ...style }));\n\n this._max = Math.max(1, Math.floor(opts.max ?? 5));\n this._value = 1;\n this._question = opts.question;\n this._endLabels = opts.endLabels;\n this._activeColor = opts.activeColor ?? { type: 'named', name: 'cyan' };\n this._onSelect = opts.onSelect;\n }\n\n getValue(): number {\n return this._value;\n }\n\n private _setValue(value: number): void {\n const nextValue = Math.max(1, Math.min(this._max, value));\n\n if (nextValue === this._value) return;\n\n this._value = nextValue;\n this.markDirty();\n }\n\n handleKey(event: KeyEvent): void {\n switch (event.key) {\n case 'left':\n this._setValue(this._value - 1);\n break;\n\n case 'right':\n this._setValue(this._value + 1);\n break;\n\n case 'enter':\n this._onSelect?.(this._value);\n break;\n }\n }\n\n protected _renderSelf(screen: Screen): void {\n const { x, y, width, height } = this._rect;\n\n if (width <= 0 || height <= 0) return;\n\n const attrs = styleToCellAttrs(this.style);\n let row = 0;\n\n if (this._question) {\n screen.writeString(x, y + row, this._question.slice(0, width), attrs);\n row++;\n }\n\n if (row < height) {\n const numbers: string[] = [];\n\n for (let i = 1; i <= this._max; i++) {\n numbers.push(i === this._value ? `[${i}]` : String(i));\n }\n\n screen.writeString(\n x,\n y + row,\n numbers.join(' ').slice(0, width),\n { ...attrs, fg: this._activeColor }\n );\n row++;\n }\n\n if (row < height && this._endLabels) {\n const [leftLabel, rightLabel] = this._endLabels;\n const leftText = leftLabel.slice(0, width);\n const rightText = rightLabel.slice(0, width);\n const rightX = x + Math.max(0, width - rightText.length);\n\n screen.writeString(x, y + row, leftText, attrs);\n screen.writeString(rightX, y + row, rightText, attrs);\n }\n }\n}\n","// SegmentedControl — single-selection segmented control\n\nimport { Widget } from '@termuijs/widgets';\nimport {\n type Style,\n type Screen,\n type KeyEvent,\n mergeStyles,\n defaultStyle,\n styleToCellAttrs,\n caps,\n} from '@termuijs/core';\n\nexport interface SegmentedControlOptions {\n options: string[];\n value?: string;\n activeColor?: Style['fg'];\n onChange?: (value: string) => void;\n}\n\nexport class SegmentedControl extends Widget {\n private _options: string[];\n private _selectedIndex = 0;\n private _activeColor: Style['fg'];\n private _onChange?: (value: string) => void;\n\n focusable = true;\n\n constructor(config: SegmentedControlOptions) {\n super(mergeStyles(defaultStyle(), { height: 1 }));\n\n this._options = config.options;\n\n const index = this._options.indexOf(\n config.value ?? this._options[0]\n );\n\n this._selectedIndex = index >= 0 ? index : 0;\n\n this._activeColor =\n config.activeColor ??\n { type: 'named', name: 'cyan' };\n\n this._onChange = config.onChange;\n }\n\n get value(): string {\n return this._options[this._selectedIndex];\n }\n\n private _setIndex(index: number): void {\n if (\n index < 0 ||\n index >= this._options.length ||\n index === this._selectedIndex\n ) {\n return;\n }\n\n this._selectedIndex = index;\n this._onChange?.(this.value);\n this.markDirty();\n }\n\n next(): void {\n this._setIndex(this._selectedIndex + 1);\n }\n\n prev(): void {\n this._setIndex(this._selectedIndex - 1);\n }\n\n handleKey(event: KeyEvent): void {\n switch (event.key) {\n case 'left':\n this.prev();\n break;\n\n case 'right':\n this.next();\n break;\n }\n }\n\n protected _renderSelf(screen: Screen): void {\n const { x, y } = this._rect;\n\n const attrs = styleToCellAttrs(this.style);\n\n const separator = caps.unicode ? ' │ ' : ' | ';\n\n let col = x;\n\n screen.writeString(col, y, '[ ', attrs);\n col += 2;\n\n for (let i = 0; i < this._options.length; i++) {\n const active = i === this._selectedIndex;\n\n screen.writeString(\n col,\n y,\n this._options[i],\n {\n ...attrs,\n fg: active ? this._activeColor : attrs.fg,\n bold: active,\n }\n );\n\n col += this._options[i].length;\n\n if (i < this._options.length - 1) {\n screen.writeString(col, y, separator, attrs);\n col += separator.length;\n }\n }\n\n screen.writeString(col, y, ' ]', attrs);\n }\n}","import { type KeyEvent, type Screen, mergeStyles, defaultStyle, styleToCellAttrs, caps } from '@termuijs/core';\nimport { Widget } from '@termuijs/widgets';\n\nexport class SearchableSelect extends Widget {\n private _searchQuery: string = '';\n private _options: string[] = [];\n private _selectedIndex: number = 0;\n\n constructor() {\n super(mergeStyles(defaultStyle(), { height: 5 }));\n }\n\n public get searchQuery(): string {\n return this._searchQuery;\n }\n\n public get selectedOption(): string {\n return this._options[this._selectedIndex] || '';\n }\n\n public handleKey(event: KeyEvent): void {\n const char = event.key;\n \n if (char.length === 1 && !event.ctrl && !event.alt) {\n this._searchQuery += char;\n this._filterOptions();\n return;\n }\n\n if (event.key === 'backspace') {\n this._searchQuery = this._searchQuery.slice(0, -1);\n this._filterOptions();\n return;\n }\n\n if (event.key === 'down') {\n this.selectNext();\n return;\n }\n\n if (event.key === 'up') {\n this.selectPrev();\n return;\n }\n\n if (event.key === 'enter') {\n this.confirm();\n return;\n }\n }\n\n public selectNext(): void {\n if (this._selectedIndex < this._options.length - 1) {\n this._selectedIndex++;\n }\n }\n\n public selectPrev(): void {\n if (this._selectedIndex > 0) {\n this._selectedIndex--;\n }\n }\n\n public confirm(): void {\n }\n\n private _filterOptions(): void {\n }\n\n protected _renderSelf(screen: Screen): void {\n const { x, y } = this._rect;\n const pointer = caps.unicode ? '➔' : '>';\n \n screen.writeString(\n x, \n y, \n pointer + ' ' + this._searchQuery, \n styleToCellAttrs(this.style)\n );\n }\n}","// ─────────────────────────────────────────────────────\n// @termuijs/ui — Autocomplete widget\n// ─────────────────────────────────────────────────────\n\nimport {\n type Style,\n type Screen,\n type KeyEvent,\n type Color,\n mergeStyles,\n defaultStyle,\n styleToCellAttrs,\n caps,\n truncate,\n stringWidth\n} from '@termuijs/core';\nimport { Widget } from '@termuijs/widgets';\n\nexport interface AutocompleteOptions {\n /** List of search suggestions / candidates */\n items: string[];\n /** Callback when an item is selected or submitted */\n onSelect?: (value: string) => void;\n /** Callback when the query text changes */\n onChange?: (value: string) => void;\n /** Custom filter function to override default lowercase startsWith matching */\n filter?: (query: string, item: string) => boolean;\n /** Maximum number of suggestions to display in dropdown. Default: 5 */\n maxSuggestions?: number;\n /** Placeholder text when query is empty */\n placeholder?: string;\n /** Highlight color for the selected suggestion */\n highlightColor?: Color;\n}\n\nconst defaultFilter = (query: string, item: string) =>\n item.toLowerCase().startsWith(query.toLowerCase());\n\nexport class Autocomplete extends Widget {\n private _items: string[] = [];\n private _query = '';\n private _isOpen = false;\n private _selectedIndex = -1;\n private _onSelect?: (value: string) => void;\n private _onChange?: (value: string) => void;\n private _filter: (query: string, item: string) => boolean;\n private _maxSuggestions: number;\n private _placeholder: string;\n private _highlightColor: Color;\n\n constructor(style: Partial<Style> = {}, options: AutocompleteOptions = { items: [] }) {\n super(mergeStyles(defaultStyle(), { height: 6, focusRingStyle: 'none', ...style }));\n this._items = options.items ?? [];\n this._onSelect = options.onSelect;\n this._onChange = options.onChange;\n this._filter = options.filter ?? defaultFilter;\n this._maxSuggestions = options.maxSuggestions ?? 5;\n this._placeholder = options.placeholder ?? '';\n this._highlightColor = options.highlightColor ?? { type: 'named', name: 'cyan' };\n this.focusable = true;\n }\n\n get query(): string {\n return this._query;\n }\n\n set query(value: string) {\n this._query = value;\n this._selectedIndex = -1;\n this.markDirty();\n }\n\n get items(): string[] {\n return this._items;\n }\n\n setItems(items: string[]): void {\n this._items = items;\n this._selectedIndex = -1;\n this.markDirty();\n }\n\n private get _filteredItems(): string[] {\n return this._items.filter(item => this._filter(this._query, item));\n }\n\n public handleKey(event: KeyEvent): void {\n const filtered = this._filteredItems;\n const key = event.key;\n\n if (key === 'down' || key === 'tab') {\n this._isOpen = true;\n if (filtered.length > 0) {\n this._selectedIndex = (this._selectedIndex + 1) % filtered.length;\n }\n this.markDirty();\n return;\n }\n\n if (key === 'up') {\n this._isOpen = true;\n if (filtered.length > 0) {\n if (this._selectedIndex <= 0) {\n this._selectedIndex = filtered.length - 1;\n } else {\n this._selectedIndex--;\n }\n }\n this.markDirty();\n return;\n }\n\n if (key === 'escape') {\n this._isOpen = false;\n this._selectedIndex = -1;\n this.markDirty();\n return;\n }\n\n if (key === 'enter') {\n if (this._isOpen && this._selectedIndex >= 0 && this._selectedIndex < filtered.length) {\n const selected = filtered[this._selectedIndex];\n this._query = selected;\n this._onChange?.(this._query);\n this._onSelect?.(selected);\n this._isOpen = false;\n this._selectedIndex = -1;\n } else {\n this._onSelect?.(this._query);\n }\n this.markDirty();\n return;\n }\n\n if (key === 'backspace') {\n if (this._query.length > 0) {\n this._query = this._query.slice(0, -1);\n this._isOpen = true;\n this._selectedIndex = -1;\n this._onChange?.(this._query);\n }\n this.markDirty();\n return;\n }\n\n if (key.length === 1 && !event.ctrl && !event.alt) {\n this._query += key;\n this._isOpen = true;\n this._selectedIndex = -1;\n this._onChange?.(this._query);\n this.markDirty();\n return;\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 pointer = caps.unicode ? '➔' : '>';\n const pointerStr = pointer + ' ';\n const prefixWidth = stringWidth(pointerStr);\n\n if (this._query.length === 0 && !this.isFocused) {\n const displayPlaceholder = truncate(this._placeholder, width - prefixWidth);\n screen.writeString(x, y, pointerStr + displayPlaceholder, { ...attrs, dim: true });\n } else {\n const displayQuery = truncate(this._query, width - prefixWidth);\n screen.writeString(x, y, pointerStr + displayQuery, attrs);\n\n if (this.isFocused) {\n const cursorX = x + prefixWidth + stringWidth(displayQuery);\n if (cursorX < x + width) {\n screen.setCell(cursorX, y, {\n char: ' ',\n ...attrs,\n inverse: true,\n });\n }\n }\n }\n\n const filtered = this._filteredItems;\n if (this._isOpen && this.isFocused && filtered.length > 0) {\n const renderCount = Math.min(filtered.length, height - 1, this._maxSuggestions);\n for (let i = 0; i < renderCount; i++) {\n const item = filtered[i];\n const isSelected = i === this._selectedIndex;\n const rowY = y + 1 + i;\n if (rowY >= y + height) break;\n\n const itemText = truncate(item, width - 2);\n const prefix = isSelected ? (caps.unicode ? '● ' : '* ') : ' ';\n const itemAttrs = isSelected\n ? { ...attrs, fg: this._highlightColor, bold: true }\n : attrs;\n\n screen.writeString(x, rowY, prefix + itemText, itemAttrs);\n }\n }\n }\n}","import { Widget } from '@termuijs/widgets';\nimport { type Screen, type KeyEvent, mergeStyles, defaultStyle, styleToCellAttrs } from '@termuijs/core';\n\nexport interface ToggleOptions {\n defaultValue?: boolean;\n label?: string;\n onChange?: (value: boolean) => void;\n}\n\nexport class Toggle extends Widget {\n private _value: boolean;\n private _label?: string;\n onChange?: (value: boolean) => void;\n\n focusable = true;\n\n constructor(options: ToggleOptions = {}) {\n super(mergeStyles(defaultStyle(), { height: 1 }));\n\n this._value = options.defaultValue ?? false;\n this._label = options.label;\n this.onChange = options.onChange;\n }\n\n get value(): boolean {\n return this._value;\n }\n\n setValue(value: boolean): void {\n if (this._value === value) return;\n\n this._value = value;\n this.onChange?.(value);\n this.markDirty();\n }\n\n toggle(): void {\n this.setValue(!this._value);\n }\n\n handleKey(event: KeyEvent): void {\n switch (event.key) {\n case 'space':\n this.toggle();\n break;\n\n case 'right':\n this.setValue(true);\n break;\n\n case 'left':\n this.setValue(false);\n break;\n }\n }\n\n protected _renderSelf(screen: Screen): void {\n const { x, y, width } = this._rect;\n\n if (width <= 0) return;\n\n const attrs = styleToCellAttrs(this.style);\n\n const toggleText = this._value ? '[ ON ]' : '[OFF]';\n\n const text = this._label\n ? `${this._label} ${toggleText}`\n : toggleText;\n\n screen.writeString(x, y, text.slice(0, width), attrs);\n }\n}","import { Widget } from '@termuijs/widgets';\nimport {\n type Screen,\n type KeyEvent,\n mergeStyles,\n defaultStyle,\n styleToCellAttrs,\n caps,\n} from '@termuijs/core';\n\nexport interface SwitchOptions {\n defaultValue?: boolean;\n label?: string;\n onChange?: (value: boolean) => void;\n}\n\nexport class Switch extends Widget {\n private _value: boolean;\n private _label?: string;\n onChange?: (value: boolean) => void;\n\n focusable = true;\n\n constructor(options: SwitchOptions = {}) {\n super(mergeStyles(defaultStyle(), { height: 1 }));\n\n this._value = options.defaultValue ?? false;\n this._label = options.label;\n this.onChange = options.onChange;\n }\n\n get value(): boolean {\n return this._value;\n }\n\n setValue(value: boolean): void {\n if (this._value === value) return;\n\n this._value = value;\n this.onChange?.(value);\n this.markDirty();\n }\n\n toggle(): void {\n this.setValue(!this._value);\n }\n\n handleKey(event: KeyEvent): void {\n switch (event.key) {\n case 'space':\n this.toggle();\n break;\n\n case 'right':\n this.setValue(true);\n break;\n\n case 'left':\n this.setValue(false);\n break;\n }\n }\n\n protected _renderSelf(screen: Screen): void {\n const { x, y, width } = this._rect;\n\n if (width <= 0) return;\n\n const attrs = styleToCellAttrs(this.style);\n\n const track = caps.unicode\n ? (this._value ? '──●' : '●──')\n : (this._value ? '--O' : 'O--');\n\n const text = this._label\n ? `${this._label} ${track}`\n : track;\n\n screen.writeString(\n x,\n y,\n text.slice(0, width),\n attrs\n );\n }\n}","import { Widget } from '@termuijs/widgets';\nimport {\n type Screen,\n type KeyEvent,\n mergeStyles,\n defaultStyle,\n styleToCellAttrs,\n} from '@termuijs/core';\n\nexport interface CheckboxOptions {\n label: string;\n defaultChecked?: boolean;\n onChange?: (checked: boolean) => void;\n}\n\nexport class Checkbox extends Widget {\n private _checked: boolean;\n private _label: string;\n\n onChange?: (checked: boolean) => void;\n\n focusable = true;\n\n constructor(options: CheckboxOptions) {\n super(mergeStyles(defaultStyle(), { height: 1 }));\n\n this._checked = options.defaultChecked ?? false;\n this._label = options.label;\n this.onChange = options.onChange;\n }\n\n get checked(): boolean {\n return this._checked;\n }\n\n setChecked(checked: boolean): void {\n if (this._checked === checked) return;\n\n this._checked = checked;\n this.onChange?.(checked);\n this.markDirty();\n }\n\n toggle(): void {\n this.setChecked(!this._checked);\n }\n\n handleKey(event: KeyEvent): void {\n if (event.key === 'space') {\n this.toggle();\n }\n }\n\n protected _renderSelf(screen: Screen): void {\n const { x, y, width } = this._rect;\n\n if (width <= 0) return;\n\n const attrs = styleToCellAttrs(this.style);\n\n const checkboxText = this._checked\n ? `[x] ${this._label}`\n : `[ ] ${this._label}`;\n\n screen.writeString(\n x,\n y,\n checkboxText.slice(0, width),\n attrs\n );\n }\n}","import { Widget } from '@termuijs/widgets';\nimport {\n type Screen,\n type KeyEvent,\n mergeStyles,\n defaultStyle,\n styleToCellAttrs,\n caps,\n} from '@termuijs/core';\n\nexport interface CheckboxGroupOption {\n label: string;\n value: string;\n}\n\nexport interface CheckboxGroupOptions {\n options: CheckboxGroupOption[];\n defaultValues?: string[];\n onChange?: (selectedValues: string[]) => void;\n}\n\nexport class CheckboxGroup extends Widget {\n private _options: CheckboxGroupOption[];\n private _selected: Set<string>;\n private _focusedIndex = 0;\n\n onChange?: (selectedValues: string[]) => void;\n\n focusable = true;\n\n constructor(options: CheckboxGroupOptions) {\n super(\n mergeStyles(defaultStyle(), {\n height: Math.max(options.options.length, 1),\n })\n );\n\n this._options = options.options;\n const knownValues = new Set(options.options.map(o => o.value));\n this._selected = new Set(\n (options.defaultValues ?? []).filter(v => knownValues.has(v)),\n );\n this.onChange = options.onChange;\n }\n\n get selectedValues(): string[] {\n return Array.from(this._selected);\n }\n\n private emitChange(): void {\n this.onChange?.(this.selectedValues);\n }\n\n selectNext(): void {\n if (this._focusedIndex < this._options.length - 1) {\n this._focusedIndex++;\n this.markDirty();\n }\n }\n\n selectPrev(): void {\n if (this._focusedIndex > 0) {\n this._focusedIndex--;\n this.markDirty();\n }\n }\n\n toggleCurrent(): void {\n const option = this._options[this._focusedIndex];\n\n if (!option) return;\n\n if (this._selected.has(option.value)) {\n this._selected.delete(option.value);\n } else {\n this._selected.add(option.value);\n }\n\n this.emitChange();\n this.markDirty();\n }\n\n handleKey(event: KeyEvent): void {\n switch (event.key) {\n case 'up':\n this.selectPrev();\n break;\n\n case 'down':\n this.selectNext();\n break;\n\n case 'space':\n this.toggleCurrent();\n break;\n }\n }\n\n protected _renderSelf(screen: Screen): void {\n const { x, y, width, height } = this._rect;\n\n if (width <= 0 || height <= 0) return;\n\n const attrs = styleToCellAttrs(this.style);\n\n for (let i = 0; i < this._options.length && i < height; i++) {\n const option = this._options[i];\n\n const focused = i === this._focusedIndex;\n const checked = this._selected.has(option.value);\n\n const prefix = focused\n ? (caps.unicode ? '❯ ' : '> ')\n : ' ';\n\n const checkbox = checked ? '[x]' : '[ ]';\n\n const text = `${prefix}${checkbox} ${option.label}`;\n\n screen.writeString(\n x,\n y + i,\n text.slice(0, width),\n {\n ...attrs,\n bold: focused,\n }\n );\n }\n }\n}","import { Widget } from '@termuijs/widgets';\nimport {\n type Style,\n type Color,\n type Screen,\n type KeyEvent,\n mergeStyles,\n defaultStyle,\n styleToCellAttrs,\n} from '@termuijs/core';\n\nexport interface ButtonGroupItem {\n label: string;\n value: string;\n disabled?: boolean;\n}\n\nexport interface ButtonGroupOptions {\n activeColor?: Color;\n inactiveColor?: Color;\n onSelect?: (value: string) => void;\n}\n\nexport class ButtonGroup extends Widget {\n private _items: ButtonGroupItem[];\n private _activeIndex = -1;\n private _activeColor: Color;\n private _inactiveColor: Color;\n private _onSelect?: (value: string) => void;\n\n focusable = true;\n\n constructor(\n items: ButtonGroupItem[],\n style: Partial<Style> = {},\n opts: ButtonGroupOptions = {}\n ) {\n super(mergeStyles(mergeStyles(defaultStyle(), { height: 1 }), style as Style));\n\n this._items = items;\n this._activeColor = opts.activeColor ?? { type: 'named', name: 'cyan' };\n this._inactiveColor = opts.inactiveColor ?? { type: 'named', name: 'brightBlack' };\n this._onSelect = opts.onSelect;\n this._activeIndex = this._firstEnabledIndex();\n }\n\n setItems(items: ButtonGroupItem[]): void {\n this._items = items;\n\n const activeValue = this.getActiveValue();\n const activeIndex = this._items.findIndex(\n (item) => !item.disabled && item.value === activeValue\n );\n\n this._activeIndex = activeIndex >= 0\n ? activeIndex\n : this._firstEnabledIndex();\n\n this.markDirty();\n }\n\n setActiveValue(value: string): void {\n const index = this._items.findIndex(\n (item) => !item.disabled && item.value === value\n );\n\n if (index < 0 || index === this._activeIndex) return;\n\n this._activeIndex = index;\n this.markDirty();\n }\n\n getActiveValue(): string {\n return this._items[this._activeIndex]?.value ?? '';\n }\n\n handleKey(event: KeyEvent): void {\n switch (event.key) {\n case 'left':\n this._move(-1);\n break;\n\n case 'right':\n this._move(1);\n break;\n\n case 'enter':\n this._onSelect?.(this.getActiveValue());\n break;\n }\n }\n\n private _firstEnabledIndex(): number {\n return this._items.findIndex((item) => !item.disabled);\n }\n\n private _move(direction: -1 | 1): void {\n if (this._items.length === 0) return;\n\n let index = this._activeIndex;\n\n for (let i = 0; i < this._items.length; i++) {\n index = (index + direction + this._items.length) % this._items.length;\n\n if (!this._items[index].disabled) {\n this._activeIndex = index;\n this.markDirty();\n return;\n }\n }\n }\n\n protected _renderSelf(screen: Screen): void {\n const { x, y, width } = this._rect;\n\n if (width <= 0) return;\n\n const attrs = styleToCellAttrs(this.style);\n let col = x;\n\n for (let i = 0; i < this._items.length; i++) {\n const item = this._items[i];\n const label = `[${item.label}]`;\n const active = i === this._activeIndex;\n const remaining = x + width - col;\n\n if (remaining <= 0) return;\n\n screen.writeString(\n col,\n y,\n label.slice(0, remaining),\n {\n ...attrs,\n fg: active ? this._activeColor : this._inactiveColor,\n bold: active,\n dim: item.disabled || !active,\n }\n );\n\n col += label.length;\n\n if (i < this._items.length - 1) {\n const spacerRemaining = x + width - col;\n\n if (spacerRemaining <= 0) return;\n\n screen.writeString(col, y, ' '.slice(0, spacerRemaining), attrs);\n col++;\n }\n }\n }\n}\n","// ─────────────────────────────────────────────────────\n// @termuijs/ui — Wizard widget\n//\n// A multi-step form flow wizard.\n// ─────────────────────────────────────────────────────\n\nimport { Widget } from '@termuijs/widgets';\nimport {\n type Style,\n type Screen,\n type KeyEvent,\n mergeStyles,\n defaultStyle,\n normalizeEdges,\n styleToCellAttrs,\n truncate,\n} from '@termuijs/core';\n\nexport interface WizardStep {\n title: string;\n render: () => Widget;\n validate?: () => boolean | string;\n}\n\nexport interface WizardOptions {\n style?: Partial<Style>;\n onComplete?: (stepData: unknown[]) => void;\n}\n\nexport class Wizard extends Widget {\n private _steps: WizardStep[];\n private _stepWidgets: Widget[];\n private _currentStepIndex = 0;\n private _error = '';\n private _onComplete?: (stepData: unknown[]) => void;\n focusable = true;\n\n constructor(steps: WizardStep[], options: WizardOptions = {}) {\n const topPadding = 2;\n const userPadding = normalizeEdges(options.style?.padding);\n const style = mergeStyles(defaultStyle(), {\n flexDirection: 'column',\n flexGrow: 1,\n ...options.style,\n padding: {\n top: topPadding,\n right: userPadding.right,\n bottom: userPadding.bottom,\n left: userPadding.left,\n },\n });\n super(style);\n this._steps = steps;\n this._onComplete = options.onComplete;\n\n // Instantiate all step widgets so widget state persists while navigating\n this._stepWidgets = steps.map((s) => s.render());\n\n // Keep only the active widget attached as a child\n if (this._stepWidgets[0]) {\n this.addChild(this._stepWidgets[0]);\n }\n\n // Register default key listener\n this.events.on('key', (event) => this.handleKey(event));\n }\n\n get currentStepIndex(): number {\n return this._currentStepIndex;\n }\n\n get error(): string {\n return this._error;\n }\n\n get stepWidgets(): ReadonlyArray<Widget> {\n return this._stepWidgets;\n }\n\n nextStep(): void {\n const step = this._steps[this._currentStepIndex];\n if (step && step.validate) {\n const validationResult = step.validate();\n if (typeof validationResult === 'string') {\n this._error = validationResult;\n this.markDirty();\n return;\n } else if (validationResult === false) {\n // block silently\n this.markDirty();\n return;\n }\n }\n\n // Validation passed\n this._error = '';\n if (this._currentStepIndex < this._steps.length - 1) {\n this._showStep(this._currentStepIndex + 1);\n }\n }\n\n prevStep(): void {\n this._error = '';\n if (this._currentStepIndex > 0) {\n this._showStep(this._currentStepIndex - 1);\n }\n }\n\n complete(): void {\n this._onComplete?.(this._getStepData());\n }\n\n private _showStep(index: number): void {\n const currentWidget = this._stepWidgets[this._currentStepIndex];\n if (currentWidget) {\n this.removeChild(currentWidget);\n }\n this._currentStepIndex = index;\n const nextWidget = this._stepWidgets[index];\n if (nextWidget) {\n this.addChild(nextWidget);\n }\n this.markDirty();\n }\n\n private _getStepData(): unknown[] {\n return this._stepWidgets.map((widget) => {\n if ('value' in widget) {\n return (widget as { value: unknown }).value;\n }\n if ('values' in widget) {\n return (widget as { values: unknown }).values;\n }\n if ('numericValue' in widget) {\n return (widget as { numericValue: unknown }).numericValue;\n }\n if ('selectedOption' in widget) {\n return (widget as { selectedOption: unknown }).selectedOption;\n }\n if ('selectedOptions' in widget) {\n return (widget as { selectedOptions: unknown }).selectedOptions;\n }\n return undefined;\n });\n }\n\n handleKey(event: KeyEvent): void {\n if (event._propagationStopped || event._defaultPrevented) return;\n\n // Bypassing letters if an input widget is focused within the active step\n const isFocusInInput = (widget: Widget): boolean => {\n if (widget.isFocused && ('insertChar' in widget || 'value' in widget)) {\n return true;\n }\n for (const child of widget.children) {\n if (isFocusInInput(child)) return true;\n }\n return false;\n };\n\n const activeWidget = this._stepWidgets[this._currentStepIndex];\n const inputFocused = activeWidget ? isFocusInInput(activeWidget) : false;\n\n switch (event.key) {\n case 'right':\n if (!inputFocused) {\n this.nextStep();\n event.stopPropagation?.();\n }\n break;\n case 'n':\n if (!event.ctrl && !event.alt && !inputFocused) {\n this.nextStep();\n event.stopPropagation?.();\n }\n break;\n case 'left':\n if (!inputFocused) {\n this.prevStep();\n event.stopPropagation?.();\n }\n break;\n case 'b':\n if (!event.ctrl && !event.alt && !inputFocused) {\n this.prevStep();\n event.stopPropagation?.();\n }\n break;\n case 'enter':\n case 'return':\n if (this._currentStepIndex === this._steps.length - 1) {\n this.complete();\n event.stopPropagation?.();\n }\n break;\n }\n }\n\n protected _renderSelf(screen: Screen): void {\n const { x, y, width, height } = this._rect;\n if (width <= 0 || height <= 0) return;\n\n const attrs = styleToCellAttrs(this.style);\n const border = this._style.border && this._style.border !== 'none' ? 1 : 0;\n\n const step = this._steps[this._currentStepIndex];\n if (!step) return;\n\n const stepNum = this._currentStepIndex + 1;\n const total = this._steps.length;\n const indicatorText = `Step ${stepNum} of ${total}: ${step.title}`;\n const contentWidth = Math.max(0, width - border * 2);\n\n // Write the step indicator on row 0 of the content area\n screen.writeString(\n x + border,\n y + border,\n truncate(indicatorText, contentWidth),\n { ...attrs, bold: true }\n );\n\n // Write validation error if present on row 1 of the content area\n if (this._error) {\n screen.writeString(\n x + border,\n y + border + 1,\n truncate(this._error, contentWidth),\n { ...attrs, fg: { type: 'named', name: 'red' } }\n );\n } else {\n // Write blank line to clear any old error\n screen.writeString(\n x + border,\n y + border + 1,\n ' '.repeat(contentWidth),\n attrs\n );\n }\n }\n}\n","// ─────────────────────────────────────────────────────\n// @termuijs/ui — MultilineTextInput widget\n//\n// A multi-line text editor widget for terminal UIs.\n// - Arrow keys move the cursor across lines and columns\n// - Enter inserts a newline\n// - Text soft-wraps at the widget width so long lines stay visible\n// - Fires onChange(value) when the text changes\n// - Calls this.markDirty() on state changes that affect rendering\n// - Checks caps.unicode and provides an ASCII fallback where it draws symbols\n// ─────────────────────────────────────────────────────\n\nimport { Widget } from '@termuijs/widgets';\nimport {\n type Style,\n type Screen,\n type KeyEvent,\n styleToCellAttrs,\n caps,\n stringWidth,\n} from '@termuijs/core';\n\nexport interface MultilineTextInputOptions {\n placeholder?: string;\n onChange?: (value: string) => void;\n onSubmit?: (value: string) => void;\n}\n\nexport class MultilineTextInput extends Widget {\n /** Each element is one logical line (no '\\n' inside). */\n private _lines: string[] = [''];\n /** Cursor position: line index. */\n private _cursorLine = 0;\n /** Cursor position: column index within the logical line. */\n private _cursorCol = 0;\n private _placeholder: string;\n private _onChange?: (value: string) => void;\n private _onSubmit?: (value: string) => void;\n focusable = true;\n\n constructor(style: Partial<Style> = {}, options: MultilineTextInputOptions = {}) {\n super({ border: 'single', height: 6, ...style });\n this._placeholder = options.placeholder ?? '';\n this._onChange = options.onChange;\n this._onSubmit = options.onSubmit;\n }\n\n // ── Public API ─────────────────────────────────────\n\n /** Full text value with newlines. */\n get value(): string {\n return this._lines.join('\\n');\n }\n\n /** Set text programmatically. */\n set value(v: string) {\n this._lines = v.split('\\n');\n if (this._lines.length === 0) this._lines = [''];\n this._cursorLine = Math.min(this._cursorLine, this._lines.length - 1);\n this._cursorCol = Math.min(this._cursorCol, this._lines[this._cursorLine].length);\n this.markDirty();\n }\n\n /** Clear all content. */\n clear(): void {\n this._lines = [''];\n this._cursorLine = 0;\n this._cursorCol = 0;\n this._onChange?.('');\n this.markDirty();\n }\n\n // ── Editing operations ──────────────────────────────\n\n /** Insert a single printable character at the cursor position. */\n insertChar(char: string): void {\n const line = this._lines[this._cursorLine];\n this._lines[this._cursorLine] =\n line.slice(0, this._cursorCol) + char + line.slice(this._cursorCol);\n this._cursorCol++;\n this._notify();\n }\n\n /** Insert a newline — splits the current line at cursor. */\n insertNewline(): void {\n const line = this._lines[this._cursorLine];\n const before = line.slice(0, this._cursorCol);\n const after = line.slice(this._cursorCol);\n this._lines[this._cursorLine] = before;\n this._lines.splice(this._cursorLine + 1, 0, after);\n this._cursorLine++;\n this._cursorCol = 0;\n this._notify();\n }\n\n /** Delete the character before the cursor (Backspace). */\n deleteBack(): void {\n if (this._cursorCol > 0) {\n const line = this._lines[this._cursorLine];\n this._lines[this._cursorLine] =\n line.slice(0, this._cursorCol - 1) + line.slice(this._cursorCol);\n this._cursorCol--;\n this._notify();\n } else if (this._cursorLine > 0) {\n // Merge with previous line\n const prevLine = this._lines[this._cursorLine - 1];\n const curLine = this._lines[this._cursorLine];\n this._lines.splice(this._cursorLine, 1);\n this._cursorLine--;\n this._cursorCol = prevLine.length;\n this._lines[this._cursorLine] = prevLine + curLine;\n this._notify();\n }\n }\n\n /** Delete the character after the cursor (Delete). */\n deleteForward(): void {\n const line = this._lines[this._cursorLine];\n if (this._cursorCol < line.length) {\n this._lines[this._cursorLine] =\n line.slice(0, this._cursorCol) + line.slice(this._cursorCol + 1);\n this._notify();\n } else if (this._cursorLine < this._lines.length - 1) {\n // Merge next line into current\n const nextLine = this._lines[this._cursorLine + 1];\n this._lines.splice(this._cursorLine + 1, 1);\n this._lines[this._cursorLine] = line + nextLine;\n this._notify();\n }\n }\n\n // ── Cursor movement ─────────────────────────────────\n\n moveCursorLeft(): void {\n if (this._cursorCol > 0) {\n this._cursorCol--;\n } else if (this._cursorLine > 0) {\n this._cursorLine--;\n this._cursorCol = this._lines[this._cursorLine].length;\n }\n this.markDirty();\n }\n\n moveCursorRight(): void {\n const line = this._lines[this._cursorLine];\n if (this._cursorCol < line.length) {\n this._cursorCol++;\n } else if (this._cursorLine < this._lines.length - 1) {\n this._cursorLine++;\n this._cursorCol = 0;\n }\n this.markDirty();\n }\n\n moveCursorUp(): void {\n if (this._cursorLine > 0) {\n this._cursorLine--;\n this._cursorCol = Math.min(this._cursorCol, this._lines[this._cursorLine].length);\n this.markDirty();\n }\n }\n\n moveCursorDown(): void {\n if (this._cursorLine < this._lines.length - 1) {\n this._cursorLine++;\n this._cursorCol = Math.min(this._cursorCol, this._lines[this._cursorLine].length);\n this.markDirty();\n }\n }\n\n moveCursorHome(): void {\n this._cursorCol = 0;\n this.markDirty();\n }\n\n moveCursorEnd(): void {\n this._cursorCol = this._lines[this._cursorLine].length;\n this.markDirty();\n }\n\n submit(): void {\n this._onSubmit?.(this.value);\n }\n\n // ── Key handler ─────────────────────────────────────\n\n /**\n * Handle key events. Call this from your application input loop.\n * Returns true if the event was consumed.\n */\n handleKey(event: KeyEvent): boolean {\n switch (event.key) {\n case 'up': this.moveCursorUp(); return true;\n case 'down': this.moveCursorDown(); return true;\n case 'left': this.moveCursorLeft(); return true;\n case 'right': this.moveCursorRight(); return true;\n case 'home': this.moveCursorHome(); return true;\n case 'end': this.moveCursorEnd(); return true;\n case 'backspace': this.deleteBack(); return true;\n case 'delete': this.deleteForward(); return true;\n case 'return':\n case 'enter': this.insertNewline(); return true;\n default:\n if (\n event.key &&\n event.key.length === 1 &&\n !event.ctrl &&\n !event.alt\n ) {\n this.insertChar(event.key);\n return true;\n }\n return false;\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) return;\n\n const attrs = styleToCellAttrs(this._style);\n\n // Show placeholder when empty and not focused\n const isEmpty = this._lines.length === 1 && this._lines[0] === '';\n if (isEmpty && !this.isFocused && this._placeholder) {\n screen.writeString(x, y, this._placeholder.slice(0, width), { ...attrs, dim: true });\n return;\n }\n\n // Soft-wrap each logical line into display rows\n const displayRows = this._softWrap(width);\n\n // Find the display row + col of the cursor\n const { displayRow: cursorDisplayRow, displayCol: cursorDisplayCol } =\n this._cursorDisplayPos(width);\n\n // Scroll vertically so cursor is always visible\n const scrollY = this._calcScrollY(cursorDisplayRow, height);\n\n // Render visible rows\n for (let row = 0; row < height; row++) {\n const dRow = row + scrollY;\n if (dRow >= displayRows.length) break;\n const { text } = displayRows[dRow];\n screen.writeString(x, y + row, text.padEnd(width, ' ').slice(0, width), attrs);\n }\n\n // Render cursor\n if (this.isFocused) {\n const screenRow = cursorDisplayRow - scrollY;\n if (screenRow >= 0 && screenRow < height) {\n const cursorDisplayRow2 = cursorDisplayRow;\n const rowText = displayRows[cursorDisplayRow2]?.text ?? '';\n \n let cursorChar = ' ';\n const segmenter = new Intl.Segmenter();\n const segments = Array.from(segmenter.segment(rowText));\n let w = 0;\n for (const seg of segments) {\n const segWidth = stringWidth(seg.segment);\n if (cursorDisplayCol >= w && cursorDisplayCol < w + segWidth) {\n cursorChar = seg.segment;\n break;\n }\n w += segWidth;\n }\n \n // Unicode block cursor vs ASCII '|'\n const cursorGlyph = caps.unicode ? cursorChar : cursorChar;\n screen.setCell(x + cursorDisplayCol, y + screenRow, {\n char: cursorGlyph,\n ...attrs,\n inverse: true,\n });\n }\n }\n }\n\n // ── Private helpers ─────────────────────────────────\n\n private _notify(): void {\n this._onChange?.(this.value);\n this.markDirty();\n }\n\n private _softWrap(width: number): Array<{ text: string; lineIdx: number; lineOffset: number }> {\n const rows: Array<{ text: string; lineIdx: number; lineOffset: number }> = [];\n const segmenter = new Intl.Segmenter();\n\n for (let li = 0; li < this._lines.length; li++) {\n const line = this._lines[li];\n if (line.length === 0) {\n rows.push({ text: '', lineIdx: li, lineOffset: 0 });\n continue;\n }\n \n const segments = Array.from(segmenter.segment(line));\n let currentWidth = 0;\n let currentStart = 0;\n let currentText = '';\n let charOffset = 0;\n \n for (let i = 0; i < segments.length; i++) {\n const seg = segments[i];\n const w = stringWidth(seg.segment);\n \n if (currentWidth + w > width && currentText.length > 0) {\n rows.push({\n text: currentText,\n lineIdx: li,\n lineOffset: currentStart,\n });\n currentStart = charOffset;\n currentText = seg.segment;\n currentWidth = w;\n } else {\n currentText += seg.segment;\n currentWidth += w;\n }\n charOffset += seg.segment.length;\n }\n if (currentText.length > 0) {\n rows.push({\n text: currentText,\n lineIdx: li,\n lineOffset: currentStart,\n });\n }\n }\n return rows;\n }\n\n /**\n * Compute the display row and column for the current cursor position,\n * given the content area width.\n */\n private _cursorDisplayPos(width: number): { displayRow: number; displayCol: number } {\n const rows = this._softWrap(width);\n // Walk rows to find the one that contains the cursor\n let best = { displayRow: 0, displayCol: 0 };\n for (let ri = 0; ri < rows.length; ri++) {\n const row = rows[ri];\n if (row.lineIdx !== this._cursorLine) continue;\n const rowEndOffset = row.lineOffset + row.text.length;\n if (\n this._cursorCol >= row.lineOffset &&\n (this._cursorCol < rowEndOffset || ri === rows.length - 1 || rows[ri + 1]?.lineIdx !== this._cursorLine)\n ) {\n const targetCharOffset = this._cursorCol - row.lineOffset;\n const segmenter = new Intl.Segmenter();\n const segments = Array.from(segmenter.segment(row.text));\n let charCount = 0;\n let displayWidth = 0;\n for (const seg of segments) {\n if (charCount >= targetCharOffset) break;\n charCount += seg.segment.length;\n displayWidth += stringWidth(seg.segment);\n }\n best = {\n displayRow: ri,\n displayCol: displayWidth,\n };\n }\n }\n return best;\n }\n\n /**\n * Calculate a scroll offset so the cursor row is always visible.\n */\n private _calcScrollY(cursorDisplayRow: number, height: number): number {\n // Simple strategy: keep cursor in view, bias towards showing as much\n // content from the top as possible.\n let scrollY = 0;\n if (cursorDisplayRow >= height) {\n scrollY = cursorDisplayRow - height + 1;\n }\n return scrollY;\n }\n}\n","import { Widget } from \"@termuijs/widgets\";\nimport { type Style, type KeyEvent, Screen, caps } from \"@termuijs/core\";\n\nexport interface BasicAuthCredentials {\n username: string;\n password: string;\n}\n\nexport interface BasicAuthPromptOptions {\n usernameLabel?: string; // default: 'Username:'\n passwordLabel?: string; // default: 'Password:'\n onSubmit?: (credentials: BasicAuthCredentials) => void;\n}\n\nexport class BasicAuthPrompt extends Widget {\n private _username = \"\";\n private _password = \"\";\n private _activeField: \"username\" | \"password\" = \"username\";\n private _opts: BasicAuthPromptOptions;\n private get _maskChar(): string {\n return caps.unicode ? \"●\" : \"*\";\n }\n constructor(style?: Partial<Style>, opts?: BasicAuthPromptOptions) {\n super(style);\n\n this._opts = {\n usernameLabel: \"Username:\",\n passwordLabel: \"Password:\",\n ...opts,\n };\n }\n getCredentials(): BasicAuthCredentials {\n return {\n username: this._username,\n password: this._password,\n };\n }\n private onSubmit(): void {\n if (this._activeField === \"username\") {\n this._activeField = \"password\";\n } else if (this._activeField === \"password\") {\n this._opts.onSubmit?.(this.getCredentials());\n }\n this.markDirty();\n }\n private deleteBackward(): void {\n if (this._activeField === \"username\") {\n this._username = this._username.slice(0, -1);\n } else {\n this._password = this._password.slice(0, -1);\n }\n this.markDirty();\n }\n private insertChar(key: string): void {\n if (this._activeField === \"username\") {\n this._username += key;\n } else {\n this._password += key;\n }\n this.markDirty();\n }\n handleKey(event: KeyEvent): void {\n switch (event.key) {\n case \"enter\":\n this.onSubmit();\n break;\n case \"backspace\":\n this.deleteBackward();\n break;\n default:\n if (event.key.length === 1 && !event.ctrl && !event.alt) {\n this.insertChar(event.key);\n }\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 const username = `${this._opts.usernameLabel} ${this._username}`;\n const masked = this._maskChar.repeat(this._password.length);\n const password = `${this._opts.passwordLabel} ${masked}`;\n screen.writeString(x, y, username);\n if (height > 1) {\n screen.writeString(x, y + 1, password);\n }\n }\n}\n","import { type Screen, type Style, type KeyEvent, styleToCellAttrs, caps, truncate, mergeStyles, defaultStyle } from '@termuijs/core';\nimport { Widget } from '@termuijs/widgets';\n\nexport interface TextAreaOptions {\n /** Number of visible rows (default: 4) */\n rows?: number;\n placeholder?: string;\n onChange?: (value: string) => void;\n onSubmit?: (value: string) => void;\n}\n\n/**\n * TextArea - a multi-line text input field.\n *\n * Supports:\n * - Multi-line editing (Enter for newline)\n * - Cursor movement (up/down/left/right)\n * - Ctrl+Enter to submit\n * - Horizontal/Vertical scrolling when content overflows\n */\nexport class TextArea extends Widget {\n private _lines: string[] = [''];\n private _cursor = { row: 0, col: 0 };\n private _placeholder: string;\n private _onChange?: (value: string) => void;\n private _onSubmit?: (value: string) => void;\n\n constructor(style: Partial<Style> = {}, options: TextAreaOptions = {}) {\n // default rows = 4, add 2 for top/bottom single borders\n super(mergeStyles(defaultStyle(), { border: 'single', height: (options.rows ?? 4) + 2, ...style }));\n this._placeholder = options.placeholder ?? '';\n this._onChange = options.onChange;\n this._onSubmit = options.onSubmit;\n this.focusable = true;\n }\n\n get value(): string {\n return this._lines.join('\\n');\n }\n\n set value(v: string) {\n this._lines = v.split('\\n');\n if (this._lines.length === 0) this._lines = [''];\n this._cursor.row = Math.min(this._cursor.row, this._lines.length - 1);\n this._cursor.col = Math.min(this._cursor.col, this._lines[this._cursor.row].length);\n this.markDirty();\n }\n\n insertChar(char: string): void {\n const line = this._lines[this._cursor.row];\n this._lines[this._cursor.row] = line.slice(0, this._cursor.col) + char + line.slice(this._cursor.col);\n this._cursor.col++;\n this._notify();\n }\n\n insertNewline(): void {\n const line = this._lines[this._cursor.row];\n const before = line.slice(0, this._cursor.col);\n const after = line.slice(this._cursor.col);\n this._lines[this._cursor.row] = before;\n this._lines.splice(this._cursor.row + 1, 0, after);\n this._cursor.row++;\n this._cursor.col = 0;\n this._notify();\n }\n\n deleteBack(): void {\n if (this._cursor.col > 0) {\n const line = this._lines[this._cursor.row];\n this._lines[this._cursor.row] = line.slice(0, this._cursor.col - 1) + line.slice(this._cursor.col);\n this._cursor.col--;\n this._notify();\n } else if (this._cursor.row > 0) {\n const prevLine = this._lines[this._cursor.row - 1];\n const curLine = this._lines[this._cursor.row];\n this._lines.splice(this._cursor.row, 1);\n this._cursor.row--;\n this._cursor.col = prevLine.length;\n this._lines[this._cursor.row] = prevLine + curLine;\n this._notify();\n }\n }\n\n moveCursorLeft(): void {\n if (this._cursor.col > 0) {\n this._cursor.col--;\n this.markDirty();\n } else if (this._cursor.row > 0) {\n this._cursor.row--;\n this._cursor.col = this._lines[this._cursor.row].length;\n this.markDirty();\n }\n }\n\n moveCursorRight(): void {\n const line = this._lines[this._cursor.row];\n if (this._cursor.col < line.length) {\n this._cursor.col++;\n this.markDirty();\n } else if (this._cursor.row < this._lines.length - 1) {\n this._cursor.row++;\n this._cursor.col = 0;\n this.markDirty();\n }\n }\n\n moveCursorUp(): void {\n if (this._cursor.row > 0) {\n this._cursor.row--;\n this._cursor.col = Math.min(this._cursor.col, this._lines[this._cursor.row].length);\n this.markDirty();\n }\n }\n\n moveCursorDown(): void {\n if (this._cursor.row < this._lines.length - 1) {\n this._cursor.row++;\n this._cursor.col = Math.min(this._cursor.col, this._lines[this._cursor.row].length);\n this.markDirty();\n }\n }\n\n handleKey(event: KeyEvent): void {\n this.markDirty();\n const isEnter = event.key === 'enter' || event.key === 'return' || event.key === '\\r' || event.key === '\\n';\n \n if (isEnter && (event.ctrl || event.alt)) {\n this._onSubmit?.(this.value);\n return;\n }\n if (event.key === 's' && (event.ctrl || event.alt)) {\n this._onSubmit?.(this.value);\n return;\n }\n if (isEnter) {\n this.insertNewline();\n return;\n }\n\n switch (event.key) {\n case 'up': this.moveCursorUp(); break;\n case 'down': this.moveCursorDown(); break;\n case 'left': this.moveCursorLeft(); break;\n case 'right': this.moveCursorRight(); break;\n case 'backspace': this.deleteBack(); break;\n case 'space': this.insertChar(' '); break;\n default:\n if (event.key && event.key.length === 1 && !event.ctrl && !event.alt) {\n this.insertChar(event.key);\n }\n break;\n }\n }\n\n private _notify(): void {\n this._onChange?.(this.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\n const isEmpty = this._lines.length === 1 && this._lines[0] === '';\n if (isEmpty && !this.isFocused && this._placeholder) {\n screen.writeString(x, y, truncate(this._placeholder, width), { ...attrs, dim: true });\n return;\n }\n\n // Scroll Y to keep cursor visible\n let scrollY = 0;\n if (this._cursor.row >= height) {\n scrollY = this._cursor.row - height + 1;\n }\n\n // Scroll X to keep cursor visible\n let scrollX = 0;\n if (this._cursor.col >= width) {\n scrollX = this._cursor.col - width + 1;\n }\n\n // Render visible lines\n for (let r = 0; r < height; r++) {\n const lineIdx = r + scrollY;\n if (lineIdx >= this._lines.length) break;\n const lineStr = this._lines[lineIdx];\n const visibleText = lineStr.slice(scrollX, scrollX + width).padEnd(width, ' ').slice(0, width);\n screen.writeString(x, y + r, visibleText, attrs);\n }\n\n // Draw cursor\n if (this.isFocused) {\n const screenRow = this._cursor.row - scrollY;\n const screenCol = this._cursor.col - scrollX;\n if (screenRow >= 0 && screenRow < height && screenCol >= 0 && screenCol < width) {\n const lineStr = this._lines[this._cursor.row] || '';\n const cursorChar = this._cursor.col < lineStr.length ? lineStr[this._cursor.col] : ' ';\n const asciiFallback = cursorChar === ' ' ? '_' : cursorChar;\n const cursorGlyph = caps.unicode ? cursorChar : asciiFallback;\n screen.setCell(x + screenCol, y + screenRow, {\n char: cursorGlyph,\n ...attrs,\n inverse: true,\n });\n }\n }\n }\n}\n","import { Widget } from '@termuijs/widgets';\nimport { type Style, type Screen, mergeStyles, defaultStyle, styleToCellAttrs, caps } from '@termuijs/core';\n\nexport interface StepperOptions {\n completedColor?: Style['fg'];\n activeColor?: Style['fg'];\n pendingColor?: Style['fg'];\n connectorChar?: string;\n}\n\nexport class Stepper extends Widget {\n private _labels: string[];\n private _activeStep: number = 0;\n private _completedColor: Style['fg'];\n private _activeColor: Style['fg'];\n private _pendingColor: Style['fg'];\n private _connectorChar: string;\n\n constructor(labels: string[], style?: Partial<Style>, opts?: StepperOptions) {\n super(mergeStyles(defaultStyle(), style ?? {}));\n this._labels = labels;\n this._completedColor = opts?.completedColor ?? { type: 'named', name: 'green' };\n this._activeColor = opts?.activeColor ?? { type: 'named', name: 'yellow' };\n this._pendingColor = opts?.pendingColor ?? { type: 'named', name: 'brightBlack' };\n this._connectorChar = opts?.connectorChar ?? (caps.unicode ? '─' : '-');\n }\n\n get activeStep(): number { return this._activeStep; }\n\n setActiveStep(index: number): void {\n if (index >= 0 && index < this._labels.length) {\n this._activeStep = index;\n this.markDirty();\n }\n }\n\n protected _renderSelf(screen: Screen): void {\n const { x, y, width, height } = this._rect;\n if (width <= 0 || height <= 0) return;\n\n const attrs = styleToCellAttrs(this.style);\n let col = x;\n\n for (let i = 0; i < this._labels.length; i++) {\n const label = this._labels[i];\n let stepText: string;\n let color: Style['fg'];\n\n if (i < this._activeStep) {\n // Completed step - show checkmark\n const checkmark = caps.unicode ? '✓' : 'v';\n stepText = `${checkmark} ${label}`;\n color = this._completedColor;\n } else if (i === this._activeStep) {\n // Active step\n stepText = `${i + 1} ${label}`;\n color = this._activeColor;\n } else {\n // Pending step\n stepText = `${i + 1} ${label}`;\n color = this._pendingColor;\n }\n\n const isActive = i === this._activeStep;\n screen.writeString(col, y, stepText, {\n ...attrs,\n fg: color,\n bold: isActive,\n dim: !isActive && i > this._activeStep,\n });\n\n col += stepText.length;\n\n // Add connector between steps (not after the last one)\n if (i < this._labels.length - 1) {\n screen.writeString(col, y, this._connectorChar, { ...attrs, dim: true });\n col++;\n }\n }\n }\n}\n","/** @jsxImportSource @termuijs/jsx */\nimport { useState, useRef, useEffect, useKeymap, useFocusTrap, useFocus, getCurrentApp } from '@termuijs/jsx';\n\nexport type Shortcut = {\n key: string;\n label: string;\n};\n\nexport interface ShortcutHelpOverlayProps {\n shortcuts?: Shortcut[];\n}\n\nconst DEFAULT_SHORTCUTS: Shortcut[] = [\n { key: '?', label: 'Show Help' },\n { key: 'Ctrl+C', label: 'Exit Application' },\n { key: 'Ctrl+S', label: 'Save Changes' },\n { key: '/', label: 'Search' },\n];\n\nfunction ShortcutHelpOverlayContent({ shortcuts, onClose }: { shortcuts: Shortcut[]; onClose: () => void }) {\n const ids = ['shortcut-sentinel'];\n useFocusTrap(ids);\n\n function Sentinel() {\n useFocus({ id: 'shortcut-sentinel', autoFocus: true });\n return null as any; // as any: reconciler requires non-null return; null as any is workaround for no-content state\n }\n\n useEffect(() => {\n const app = getCurrentApp();\n if (!app) return;\n\n const handler = (evt: any) => {\n if (evt.type !== 'mousedown' && evt.type !== 'mouseup') return;\n\n // Find the Card widget instance with title 'Keyboard Shortcuts'\n const instances: Map<any, any> = (globalThis as any).__termuijs_instances;\n if (!instances) {\n onClose();\n return;\n }\n\n let cardRect: { x: number; y: number; width: number; height: number } | undefined;\n for (const [widget] of instances) {\n try {\n // Card instances have a private _title we can inspect\n if ((widget as any)._title === 'Keyboard Shortcuts' && (widget as any)._rect) {\n cardRect = (widget as any)._rect;\n break;\n }\n } catch {\n // ignore\n }\n }\n\n const x = evt.x ?? evt.clientX ?? 0;\n const y = evt.y ?? evt.clientY ?? 0;\n\n if (!cardRect) {\n onClose();\n return;\n }\n\n if (x < cardRect.x || x >= cardRect.x + cardRect.width || y < cardRect.y || y >= cardRect.y + cardRect.height) {\n onClose();\n }\n };\n\n const unsub = app.events.on('mouse', handler);\n return () => unsub();\n }, [onClose]);\n\n return (\n // Outer full-screen box — clicking outside the card closes the overlay\n <box width=\"100%\" height=\"100%\">\n <box width=\"100%\" height=\"100%\" padding={0}>\n {/* Centered card */}\n <center>\n <card title=\"Keyboard Shortcuts\" padding={1} borderColor=\"cyan\">\n <col>\n <row>\n <text bold={true} dim={true}>{''}</text>\n </row>\n {shortcuts.map((s) => (\n <row>\n <text bold={true} color=\"cyan\">[{s.key}]</text>\n <text> {s.label}</text>\n </row>\n ))}\n <divider />\n\n {/* Descriptive help content explaining the dashboard */}\n <row>\n <col>\n <text bold>About this view</text>\n <text>Top bars: CPU / MEM / DSK show current utilization.</text>\n <text>Left: CPU sparkline and service status indicators.</text>\n <text>Right: Process table with PID, CPU%, MEM% and status.</text>\n <text dim={true}>Click outside this box or press Esc / q to close</text>\n </col>\n </row>\n </col>\n </card>\n </center>\n </box>\n <Sentinel />\n </box>\n );\n}\n\nexport function ShortcutHelpOverlay({ shortcuts = DEFAULT_SHORTCUTS }: ShortcutHelpOverlayProps) {\n const [visible, setVisible] = useState(false);\n\n // Global key bindings: ? opens, Esc and q close\n useKeymap([\n { key: '?', action: () => setVisible(true) },\n { key: 'escape', action: () => setVisible(false) },\n { key: 'q', action: () => setVisible(false) },\n ]);\n\n if (!visible) return null as any;\n return <ShortcutHelpOverlayContent shortcuts={shortcuts} onClose={() => setVisible(false)} />;\n}\n","// ─────────────────────────────────────────────────────\n// @termuijs/ui — RadioGroup widget\n//\n// Renders a list of options where only one is selectable\n// at a time. Up/down arrow keys move the cursor; Enter\n// confirms the selection and fires onChange.\n// ─────────────────────────────────────────────────────\n\nimport { Widget } from '@termuijs/widgets';\nimport {\n type Screen,\n type KeyEvent,\n mergeStyles,\n defaultStyle,\n styleToCellAttrs,\n caps,\n} from '@termuijs/core';\n\nexport interface RadioGroupOption {\n label: string;\n value: string;\n disabled?: boolean;\n}\n\nexport interface RadioGroupOptions {\n options: Array<RadioGroupOption>;\n defaultValue?: string;\n onChange?: (value: string) => void;\n}\n\n/**\n * RadioGroup — renders a vertical list of mutually exclusive options.\n *\n * Example output (unicode):\n * (o) Dark\n * ( ) Light\n * ( ) System\n */\nexport class RadioGroup extends Widget {\n private _options: RadioGroupOption[];\n private _selectedValue: string;\n private _focusedIndex: number;\n\n /** Fires whenever the confirmed selection changes. */\n onChange?: (value: string) => void;\n\n focusable = true;\n\n constructor(config: RadioGroupOptions) {\n super(\n mergeStyles(defaultStyle(), {\n height: Math.max(config.options.length, 1),\n })\n );\n\n this._options = config.options;\n this.onChange = config.onChange;\n\n // Determine initial selection\n const defaultIndex = config.defaultValue !== undefined\n ? config.options.findIndex((o) => o.value === config.defaultValue)\n : -1;\n\n // If defaultValue matched a non-disabled option use it; otherwise pick\n // the first enabled option (or index 0 as a safe fallback).\n if (defaultIndex >= 0 && !config.options[defaultIndex]?.disabled) {\n this._selectedValue = config.options[defaultIndex]!.value;\n this._focusedIndex = defaultIndex;\n } else {\n const firstEnabled = config.options.findIndex((o) => !o.disabled);\n this._focusedIndex = firstEnabled >= 0 ? firstEnabled : 0;\n this._selectedValue = config.options[this._focusedIndex]?.value ?? '';\n }\n }\n\n // ── Accessors ─────────────────────────────────────\n\n /** The value of the currently confirmed selection. */\n get selectedValue(): string {\n return this._selectedValue;\n }\n\n /** The index currently under the keyboard cursor. */\n get focusedIndex(): number {\n return this._focusedIndex;\n }\n\n // ── Navigation ────────────────────────────────────\n\n /** Move cursor to the next enabled option. */\n selectNext(): void {\n let n = this._focusedIndex + 1;\n while (n < this._options.length && this._options[n]?.disabled) n++;\n if (n < this._options.length) {\n this._focusedIndex = n;\n this.markDirty();\n }\n }\n\n /** Move cursor to the previous enabled option. */\n selectPrev(): void {\n let n = this._focusedIndex - 1;\n while (n >= 0 && this._options[n]?.disabled) n--;\n if (n >= 0) {\n this._focusedIndex = n;\n this.markDirty();\n }\n }\n\n /** Confirm the focused option and fire onChange. */\n confirm(): void {\n const option = this._options[this._focusedIndex];\n if (!option || option.disabled) return;\n if (option.value === this._selectedValue) return; // nothing changed\n this._selectedValue = option.value;\n this.markDirty();\n this.onChange?.(this._selectedValue);\n }\n\n // ── Key handling ──────────────────────────────────\n\n handleKey(event: KeyEvent): void {\n switch (event.key) {\n case 'up':\n this.selectPrev();\n break;\n case 'down':\n this.selectNext();\n break;\n case 'enter':\n this.confirm();\n break;\n }\n }\n\n // ── Rendering ─────────────────────────────────────\n\n protected _renderSelf(screen: Screen): void {\n const { x, y, width, height } = this._rect;\n if (width <= 0 || height <= 0) return;\n\n const attrs = styleToCellAttrs(this.style);\n\n for (let i = 0; i < this._options.length && i < height; i++) {\n const option = this._options[i]!;\n const isFocused = i === this._focusedIndex;\n const isSelected = option.value === this._selectedValue;\n\n // \"(o) Label\" — selected\n // \"( ) Label\" — unselected\n // ASCII fallbacks for NO_UNICODE environments\n const radio = isSelected\n ? (caps.unicode ? '(o)' : '(*)')\n : (caps.unicode ? '( )' : '( )');\n\n const cursor = isFocused\n ? (caps.unicode ? '❯ ' : '> ')\n : ' ';\n\n const text = `${cursor}${radio} ${option.label}`;\n\n screen.writeString(\n x,\n y + i,\n text.slice(0, width),\n {\n ...attrs,\n bold: isFocused,\n dim: option.disabled === true,\n fg: option.disabled\n ? { type: 'named' as const, name: 'brightBlack' as const }\n : attrs.fg,\n }\n );\n }\n }\n}\n","// ─────────────────────────────────────────────────────\n// @termuijs/ui — Rating widget\n//\n// Renders a star rating selector controlled by arrow keys.\n// Right/left arrows adjust the value; enter confirms and\n// fires onSelect.\n// ─────────────────────────────────────────────────────\n\nimport { Widget } from '@termuijs/widgets';\nimport {\n type Screen,\n type Style,\n type Color,\n type KeyEvent,\n mergeStyles,\n defaultStyle,\n styleToCellAttrs,\n caps,\n} from '@termuijs/core';\n\nexport interface RatingOptions {\n /** Total number of stars. Default: 5 */\n max?: number;\n /** Initial rating. Default: 0 */\n value?: number;\n /** Filled star character. Default: '★' with ASCII fallback '*' */\n filledChar?: string;\n /** Empty star character. Default: '☆' with ASCII fallback '-' */\n emptyChar?: string;\n /** Color for filled stars */\n filledColor?: Color;\n /** Callback when the user confirms a rating via enter */\n onSelect?: (value: number) => void;\n}\n\n/**\n * Rating — renders a row of star glyphs for a 1-to-N rating.\n *\n * Example output (unicode, max=5, value=3):\n * ★★★☆☆\n *\n * ASCII fallback:\n * ***--\n */\nexport class Rating extends Widget {\n private _value: number;\n private _max: number;\n private _filledChar?: string;\n private _emptyChar?: string;\n private _filledColor?: Color;\n\n /** Callback when the user confirms a rating via enter. */\n onSelect?: (value: number) => void;\n\n focusable = true;\n\n constructor(style: Partial<Style> = {}, opts: RatingOptions = {}) {\n const max = Math.max(opts.max ?? 5, 1);\n\n super(mergeStyles(defaultStyle(), { ...style, height: 1 }));\n\n this._max = max;\n this._value = Math.max(0, Math.min(opts.value ?? 0, max));\n this._filledChar = opts.filledChar;\n this._emptyChar = opts.emptyChar;\n this._filledColor = opts.filledColor;\n this.onSelect = opts.onSelect;\n }\n\n // ── Accessors ─────────────────────────────────────\n\n /** The current rating value (0 to max). */\n get value(): number {\n return this._value;\n }\n\n /** The maximum number of stars. */\n get max(): number {\n return this._max;\n }\n\n // ── Public methods ────────────────────────────────\n\n /** Set the rating value (clamped to 0..max). Calls markDirty(). */\n setValue(value: number): void {\n const clamped = Math.max(0, Math.min(value, this._max));\n if (clamped === this._value) return;\n this._value = clamped;\n this.markDirty();\n }\n\n /** Get the current rating value. */\n getValue(): number {\n return this._value;\n }\n\n // ── Key handling ──────────────────────────────────\n\n handleKey(event: KeyEvent): void {\n switch (event.key) {\n case 'right':\n this.setValue(this._value + 1);\n break;\n case 'left':\n this.setValue(this._value - 1);\n break;\n case 'home':\n this.setValue(0);\n break;\n case 'end':\n this.setValue(this._max);\n break;\n case 'enter':\n this.onSelect?.(this._value);\n break;\n }\n }\n\n // ── Rendering ─────────────────────────────────────\n\n protected _renderSelf(screen: Screen): void {\n const { x, y, width } = this._rect;\n if (width <= 0) return;\n\n const attrs = styleToCellAttrs(this.style);\n\n const filled = this._filledChar ?? (caps.unicode ? '★' : '*');\n const empty = this._emptyChar ?? (caps.unicode ? '☆' : '-');\n\n let text = '';\n for (let i = 0; i < this._max; i++) {\n text += i < this._value ? filled : empty;\n }\n\n screen.writeString(x, y, text.slice(0, width), attrs);\n }\n}\n","// ─────────────────────────────────────────────────────\n// @termuijs/ui — ThemeSwitcher widget\n//\n// A list-based widget to display and switch between different themes.\n// - Keyboard navigable (Up/Down or K/J)\n// - Emits onChange(themeName) when a theme is confirmed via Enter/Space\n// ─────────────────────────────────────────────────────\n\nimport { Widget } from '@termuijs/widgets';\nimport { type Style, type Screen, type KeyEvent, mergeStyles, defaultStyle, styleToCellAttrs, caps } from '@termuijs/core';\n\nexport interface ThemeSwitcherOptions {\n themes?: string[];\n activeTheme?: string;\n onChange?: (theme: string) => void;\n activeColor?: Style['fg'];\n}\n\nexport class ThemeSwitcher extends Widget {\n private _themes: string[];\n private _activeTheme: string;\n private _selectedIndex: number;\n private _onChange?: (theme: string) => void;\n private _activeColor: Style['fg'];\n focusable = true;\n\n constructor(options: ThemeSwitcherOptions = {}) {\n const themes = options.themes ?? [\n 'default',\n 'cyberpunk',\n 'nord',\n 'dracula',\n 'gruvbox',\n 'catppuccin',\n 'solarized',\n 'tokyo-night',\n 'highContrast'\n ];\n\n super(mergeStyles(defaultStyle(), { border: 'single', height: themes.length + 2 }));\n\n this._themes = themes;\n this._activeTheme = options.activeTheme ?? 'default';\n this._selectedIndex = this._themes.indexOf(this._activeTheme);\n if (this._selectedIndex === -1) {\n this._activeTheme = this._themes[0] ?? '';\n this._selectedIndex = 0;\n }\n this._onChange = options.onChange;\n this._activeColor = options.activeColor ?? { type: 'named', name: 'cyan' };\n }\n\n get activeTheme(): string {\n return this._activeTheme;\n }\n\n set activeTheme(theme: string) {\n if (this._activeTheme === theme) return;\n this._activeTheme = theme;\n const idx = this._themes.indexOf(theme);\n if (idx !== -1) {\n this._selectedIndex = idx;\n }\n this.markDirty();\n }\n\n get themes(): string[] {\n return this._themes;\n }\n\n get selectedIndex(): number {\n return this._selectedIndex;\n }\n\n selectNext(): void {\n if (this._selectedIndex < this._themes.length - 1) {\n this._selectedIndex++;\n this.markDirty();\n }\n }\n\n selectPrev(): void {\n if (this._selectedIndex > 0) {\n this._selectedIndex--;\n this.markDirty();\n }\n }\n\n confirm(): void {\n const theme = this._themes[this._selectedIndex];\n if (theme) {\n this._activeTheme = theme;\n this._onChange?.(theme);\n this.markDirty();\n }\n }\n\n handleKey(event: KeyEvent): void {\n switch (event.key) {\n case 'up':\n case 'k':\n this.selectPrev();\n break;\n case 'down':\n case 'j':\n this.selectNext();\n break;\n case 'enter':\n case 'space':\n this.confirm();\n break;\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\n for (let i = 0; i < this._themes.length; i++) {\n if (i >= height) break;\n\n const themeName = this._themes[i];\n const isSelected = i === this._selectedIndex;\n const isActive = themeName === this._activeTheme;\n\n let prefix = ' ';\n if (isActive && isSelected) {\n prefix = caps.unicode ? '●▸' : '*>';\n } else if (isActive) {\n prefix = caps.unicode ? '● ' : '* ';\n } else if (isSelected) {\n prefix = caps.unicode ? ' ▸' : ' >';\n }\n\n const formattedName = themeName.charAt(0).toUpperCase() + themeName.slice(1);\n const lineText = `${prefix} ${formattedName}`;\n\n screen.writeString(x, y + i, lineText.slice(0, width), {\n ...attrs,\n fg: isSelected ? this._activeColor : attrs.fg,\n bold: isSelected || isActive,\n });\n }\n }\n}\n","// TreeSelect — expandable tree with single or multi selection\nimport { Widget } from '@termuijs/widgets';\nimport { type Style, type Screen, type KeyEvent, mergeStyles, defaultStyle, styleToCellAttrs, caps } from '@termuijs/core';\n\nexport interface TreeSelectNode {\n label: string;\n value: string;\n children?: TreeSelectNode[];\n expanded?: boolean;\n}\n\nexport interface TreeSelectOptions {\n multiple?: boolean;\n activeColor?: Style['fg'];\n onChange?: (values: string[]) => void;\n}\n\nexport class TreeSelect extends Widget {\n private _roots: TreeSelectNode[];\n private _cursorIndex = 0;\n private _selected = new Set<string>();\n private _multiple: boolean;\n private _activeColor: Style['fg'];\n private _onChange?: (values: string[]) => void;\n focusable = true;\n\n constructor(roots: TreeSelectNode[], options: TreeSelectOptions = {}) {\n super(mergeStyles(defaultStyle(), { flexGrow: 1 }));\n this._roots = roots;\n this._multiple = options.multiple ?? false;\n this._activeColor = options.activeColor ?? { type: 'named', name: 'cyan' };\n this._onChange = options.onChange;\n }\n\n get selectedValues(): string[] {\n return [...this._selected];\n }\n\n private _flatten(): { node: TreeSelectNode; depth: number; path: number[]; hasChildren: boolean }[] {\n const result: { node: TreeSelectNode; depth: number; path: number[]; hasChildren: boolean }[] = [];\n const walk = (nodes: TreeSelectNode[], depth: number, path: number[]) => {\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i];\n const hasChildren = (node.children?.length ?? 0) > 0;\n result.push({ node, depth, path: [...path, i], hasChildren });\n if (hasChildren && node.expanded) walk(node.children!, depth + 1, [...path, i]);\n }\n };\n walk(this._roots, 0, []);\n return result;\n }\n\n selectNext(): void {\n const f = this._flatten();\n if (this._cursorIndex < f.length - 1) {\n this._cursorIndex++;\n this.markDirty();\n }\n }\n\n selectPrev(): void {\n if (this._cursorIndex > 0) {\n this._cursorIndex--;\n this.markDirty();\n }\n }\n\n expand(): void {\n const f = this._flatten();\n const it = f[this._cursorIndex];\n if (it?.hasChildren && !it.node.expanded) {\n it.node.expanded = true;\n this.markDirty();\n }\n }\n\n collapse(): void {\n const f = this._flatten();\n const it = f[this._cursorIndex];\n if (!it) return;\n\n if (it.hasChildren && it.node.expanded) {\n it.node.expanded = false;\n this.markDirty();\n return;\n }\n\n if (it.depth > 0) {\n const parentPath = it.path.slice(0, -1);\n const parentIdx = f.findIndex(entry => _pathsEqual(entry.path, parentPath));\n if (parentIdx >= 0) {\n this._cursorIndex = parentIdx;\n this.markDirty();\n }\n }\n }\n\n toggleSelection(): void {\n const f = this._flatten();\n const it = f[this._cursorIndex];\n if (!it) return;\n\n const value = it.node.value;\n const previous = this.selectedValues;\n\n if (this._multiple) {\n if (this._selected.has(value)) {\n this._selected.delete(value);\n } else {\n this._selected.add(value);\n }\n } else if (this._selected.has(value)) {\n this._selected.clear();\n } else {\n this._selected.clear();\n this._selected.add(value);\n }\n\n this.markDirty();\n const next = this.selectedValues;\n if (!_valuesEqual(previous, next)) {\n this._onChange?.(next);\n }\n }\n\n handleKey(event: KeyEvent): void {\n switch (event.key) {\n case 'down':\n this.selectNext();\n break;\n case 'up':\n this.selectPrev();\n break;\n case 'right':\n this.expand();\n break;\n case 'left':\n this.collapse();\n break;\n case 'space':\n this.toggleSelection();\n break;\n }\n }\n\n protected _renderSelf(screen: Screen): void {\n const { x, y, width, height } = this._rect;\n if (width <= 0 || height <= 0) return;\n\n const attrs = styleToCellAttrs(this.style);\n const flat = this._flatten();\n const expandCollapsed = caps.unicode ? '▶ ' : '> ';\n const expandExpanded = caps.unicode ? '▼ ' : 'v ';\n const selectedMarker = caps.unicode ? '● ' : '* ';\n const unselectedMarker = caps.unicode ? '○ ' : 'o ';\n\n for (let i = 0; i < flat.length && i < height; i++) {\n const it = flat[i];\n const active = i === this._cursorIndex;\n const indent = ' '.repeat(it.depth);\n const expandIcon = it.hasChildren\n ? (it.node.expanded ? expandExpanded : expandCollapsed)\n : ' ';\n const selectIcon = this._selected.has(it.node.value) ? selectedMarker : unselectedMarker;\n const line = `${indent}${expandIcon}${selectIcon}${it.node.label}`;\n screen.writeString(x, y + i, line.slice(0, width), {\n ...attrs,\n fg: active ? this._activeColor : attrs.fg,\n bold: active,\n });\n }\n }\n}\n\nfunction _pathsEqual(a: number[], b: number[]): boolean {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) return false;\n }\n return true;\n}\n\nfunction _valuesEqual(a: string[], b: string[]): boolean {\n if (a.length !== b.length) return false;\n const sortedA = [...a].sort();\n const sortedB = [...b].sort();\n for (let i = 0; i < sortedA.length; i++) {\n if (sortedA[i] !== sortedB[i]) return false;\n }\n return true;\n}\n","// ─────────────────────────────────────────────────────\n// @termuijs/ui — EmailInput widget\n//\n// A TextInput restricted to email addresses.\n// - Validates email format\n// - Shows inline error for invalid emails\n// - Supports tab autocomplete for domains\n// ─────────────────────────────────────────────────────\n\nimport { Widget } from '@termuijs/widgets';\nimport { type Style, type Color, type Screen, type KeyEvent, styleToCellAttrs, truncate, mergeStyles, defaultStyle } from '@termuijs/core';\n\nexport interface EmailInputOptions {\n placeholder?: string;\n /** Common domains to suggest after '@'. Default: ['gmail.com','outlook.com','yahoo.com'] */\n domains?: string[];\n onSubmit?: (value: string) => void;\n onChange?: (value: string, valid: boolean) => void;\n errorColor?: Color;\n}\n\nexport class EmailInput extends Widget {\n private _raw = '';\n private _cursorPos = 0;\n private _placeholder: string;\n private _domains: string[];\n private _onSubmit?: (value: string) => void;\n private _onChange?: (value: string, valid: boolean) => void;\n private _errorColor: Color;\n \n focusable = true;\n\n constructor(\n style: Partial<Style> = {},\n opts: EmailInputOptions = {},\n ) {\n super(mergeStyles(defaultStyle(), { border: 'single', height: 3, ...style }));\n this._placeholder = opts.placeholder ?? '';\n this._domains = opts.domains ?? ['gmail.com', 'outlook.com', 'yahoo.com'];\n this._onSubmit = opts.onSubmit;\n this._onChange = opts.onChange;\n this._errorColor = opts.errorColor ?? { type: 'named', name: 'red' };\n }\n\n getValue(): string {\n return this._raw;\n }\n\n isValid(): boolean {\n return /^[^@]+@[^@]+\\.[^@]+$/.test(this._raw);\n }\n\n private _notify(): void {\n this._onChange?.(this._raw, this.isValid());\n this.markDirty();\n }\n\n insertChar(char: string): void {\n this._raw =\n this._raw.slice(0, this._cursorPos) +\n char +\n this._raw.slice(this._cursorPos);\n this._cursorPos++;\n this._notify();\n }\n\n deleteBack(): void {\n if (this._cursorPos > 0) {\n this._raw =\n this._raw.slice(0, this._cursorPos - 1) +\n this._raw.slice(this._cursorPos);\n this._cursorPos--;\n this._notify();\n }\n }\n\n deleteForward(): void {\n if (this._cursorPos < this._raw.length) {\n this._raw =\n this._raw.slice(0, this._cursorPos) +\n this._raw.slice(this._cursorPos + 1);\n this._notify();\n }\n }\n\n moveCursorLeft(): void { \n this._cursorPos = Math.max(0, this._cursorPos - 1); \n this.markDirty(); \n }\n \n moveCursorRight(): void { \n this._cursorPos = Math.min(this._raw.length, this._cursorPos + 1); \n this.markDirty(); \n }\n \n moveCursorHome(): void { \n this._cursorPos = 0; \n this.markDirty(); \n }\n \n moveCursorEnd(): void { \n this._cursorPos = this._raw.length; \n this.markDirty(); \n }\n\n autocompleteDomain(): void {\n const atIndex = this._raw.lastIndexOf('@');\n if (atIndex === -1) return;\n\n const typedDomain = this._raw.slice(atIndex + 1);\n const match = this._domains.find(d => d.startsWith(typedDomain));\n \n if (match) {\n this._raw = this._raw.slice(0, atIndex + 1) + match;\n this._cursorPos = this._raw.length;\n this._notify();\n }\n }\n\n handleKey(event: KeyEvent): void {\n switch (event.key) {\n case 'backspace': this.deleteBack(); break;\n case 'delete': this.deleteForward(); break;\n case 'left': this.moveCursorLeft(); break;\n case 'right': this.moveCursorRight(); break;\n case 'home': this.moveCursorHome(); break;\n case 'end': this.moveCursorEnd(); break;\n case 'tab': this.autocompleteDomain(); break;\n case 'return':\n case 'enter':\n if (this.isValid()) {\n this._onSubmit?.(this._raw);\n }\n break;\n default:\n if (event.key && event.key.length === 1 && !event.ctrl && !event.alt) {\n this.insertChar(event.key);\n }\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\n if (this._raw.length === 0 && !this.isFocused) {\n screen.writeString(x, y, truncate(this._placeholder, width), { ...attrs, dim: true });\n return;\n }\n\n const display = this._raw;\n const visibleWidth = width - 1;\n let scrollX = 0;\n if (this._cursorPos > visibleWidth) {\n scrollX = this._cursorPos - visibleWidth;\n }\n\n const visibleText = display.slice(scrollX, scrollX + visibleWidth);\n \n // Show error indicator if invalid and not empty\n const isError = this._raw.length > 0 && !this.isValid();\n const renderAttrs = isError ? { ...attrs, fg: this._errorColor } : attrs;\n\n screen.writeString(x, y, visibleText, renderAttrs);\n\n if (this.isFocused) {\n const cursorScreenPos = x + this._cursorPos - scrollX;\n if (cursorScreenPos >= x && cursorScreenPos < x + width) {\n const cursorChar = this._cursorPos < display.length\n ? display[this._cursorPos]\n : ' ';\n screen.setCell(cursorScreenPos, y, {\n char: cursorChar,\n ...renderAttrs,\n inverse: true,\n });\n }\n }\n \n // Inline error indicator if error\n if (isError && width > 4) {\n const hint = `[!]`;\n screen.writeString(x + width - hint.length, y, hint, { ...renderAttrs, fg: this._errorColor });\n }\n }\n}\n","import { Widget } from '@termuijs/widgets';\nimport { type Style, type Screen, type KeyEvent, mergeStyles, defaultStyle, styleToCellAttrs, caps } from '@termuijs/core';\n\nexport interface QuizQuestion {\n question: string;\n options: string[];\n correctIndex: number;\n}\n\nexport interface QuizResult {\n total: number;\n correct: number;\n answers: number[];\n}\n\nexport interface QuizPromptOptions {\n correctColor?: Style['fg'];\n wrongColor?: Style['fg'];\n onComplete?: (result: QuizResult) => void;\n}\n\nexport class QuizPrompt extends Widget {\n private _questions: QuizQuestion[];\n private _currentIndex: number = 0;\n private _selectedIndex: number = -1;\n private _answers: number[] = [];\n private _feedback: 'correct' | 'wrong' | null = null;\n private _feedbackTimeout: ReturnType<typeof setTimeout> | null = null;\n private _correctColor: Style['fg'];\n private _wrongColor: Style['fg'];\n private _onComplete?: (result: QuizResult) => void;\n focusable = true;\n\n constructor(questions: QuizQuestion[], style?: Partial<Style>, opts?: QuizPromptOptions) {\n super(mergeStyles(defaultStyle(), style ?? {}));\n this._questions = questions;\n this._correctColor = opts?.correctColor ?? { type: 'named', name: 'green' };\n this._wrongColor = opts?.wrongColor ?? { type: 'named', name: 'red' };\n this._onComplete = opts?.onComplete;\n }\n\n getResult(): QuizResult {\n let correct = 0;\n for (let i = 0; i < this._answers.length; i++) {\n if (this._answers[i] === this._questions[i].correctIndex) {\n correct++;\n }\n }\n return {\n total: this._answers.length,\n correct,\n answers: [...this._answers],\n };\n }\n\n handleKey(event: KeyEvent): void {\n if (this._currentIndex >= this._questions.length) return;\n \n const currentQuestion = this._questions[this._currentIndex];\n const optionsCount = currentQuestion.options.length;\n \n switch (event.key) {\n case 'up':\n if (this._selectedIndex > 0) {\n this._selectedIndex--;\n this.markDirty();\n }\n break;\n case 'down':\n if (this._selectedIndex < optionsCount - 1) {\n this._selectedIndex++;\n this.markDirty();\n }\n break;\n case 'enter':\n if (this._selectedIndex >= 0 && this._feedback === null) {\n this.submitAnswer();\n }\n break;\n }\n }\n \n private submitAnswer(): void {\n const isCorrect = this._selectedIndex === this._questions[this._currentIndex].correctIndex;\n this._answers[this._currentIndex] = this._selectedIndex;\n \n // Show feedback\n this._feedback = isCorrect ? 'correct' : 'wrong';\n this.markDirty();\n \n // Clear feedback after a short delay and advance\n if (this._feedbackTimeout) clearTimeout(this._feedbackTimeout);\n this._feedbackTimeout = setTimeout(() => {\n this._feedback = null;\n this._selectedIndex = -1;\n this._currentIndex++;\n this.markDirty();\n \n if (this._currentIndex >= this._questions.length) {\n this._onComplete?.(this.getResult());\n }\n \n this._feedbackTimeout = null;\n }, 800);\n }\n\n protected _renderSelf(screen: Screen): void {\n const { x, y, width, height } = this._rect;\n if (width <= 0 || height <= 0) return;\n \n const attrs = styleToCellAttrs(this.style);\n \n if (this._currentIndex >= this._questions.length) {\n // Show completion screen\n const result = this.getResult();\n const scoreText = `Quiz Complete! Score: ${result.correct}/${result.total}`;\n screen.writeString(x, y, scoreText.slice(0, width), attrs);\n return;\n }\n \n const currentQuestion = this._questions[this._currentIndex];\n let row = 0;\n \n // Render question\n const questionText = `${this._currentIndex + 1}. ${currentQuestion.question}`;\n screen.writeString(x, y + row, questionText.slice(0, width), { ...attrs, bold: true });\n row += 2;\n \n // Render options\n for (let i = 0; i < currentQuestion.options.length && row < height; i++) {\n const option = currentQuestion.options[i];\n const isSelected = this._selectedIndex === i;\n const cursor = isSelected ? (caps.unicode ? '❯ ' : '> ') : ' ';\n const indicator = this._feedback !== null && i === currentQuestion.correctIndex && this._feedback === 'correct' ? ' ✓' : '';\n const feedbackColor = this._feedback === 'correct' && i === currentQuestion.correctIndex ? this._correctColor :\n this._feedback === 'wrong' && i === this._selectedIndex ? this._wrongColor : attrs.fg;\n \n const line = `${cursor}${i + 1}. ${option}${indicator}`;\n screen.writeString(x, y + row, line.slice(0, width), {\n ...attrs,\n fg: feedbackColor,\n bold: isSelected,\n });\n row++;\n }\n \n // Render feedback message\n if (this._feedback === 'correct') {\n screen.writeString(x, y + row, '✓ Correct!'.slice(0, width), { ...attrs, fg: this._correctColor });\n } else if (this._feedback === 'wrong') {\n const correctIndex = currentQuestion.correctIndex;\n const correctText = `✗ Wrong. Correct answer: ${correctIndex + 1}. ${currentQuestion.options[correctIndex]}`;\n screen.writeString(x, y + row, correctText.slice(0, width), { ...attrs, fg: this._wrongColor });\n }\n }\n}\n","import { Widget } from '@termuijs/widgets';\nimport {\n type Screen,\n type KeyEvent,\n mergeStyles,\n defaultStyle,\n styleToCellAttrs,\n caps,\n} from '@termuijs/core';\n\nexport interface EditablePromptChoice {\n type: 'checkbox' | 'text';\n name: string;\n message: string;\n initial?: string;\n disabled?: boolean;\n}\n\nexport interface EditablePromptResult {\n selected: string[];\n values: Record<string, string>;\n}\n\nexport interface EditablePromptOptions {\n message?: string;\n choices: EditablePromptChoice[];\n onChange?: (result: EditablePromptResult) => void;\n}\n\nexport class EditablePrompt extends Widget {\n private _message: string;\n private _choices: EditablePromptChoice[];\n private _checkedNames: Set<string>;\n private _textValues: Record<string, string>;\n private _focusedIndex = 0;\n private _editingIndex = -1;\n private _editingValue = '';\n private _onChange?: (result: EditablePromptResult) => void;\n\n focusable = true;\n\n constructor(options: EditablePromptOptions) {\n super(\n mergeStyles(defaultStyle(), {\n height: Math.max(options.choices.length + (options.message ? 1 : 0), 1),\n })\n );\n\n this._message = options.message ?? '';\n this._choices = options.choices;\n this._onChange = options.onChange;\n\n // Initialize checked items and text values\n this._checkedNames = new Set();\n this._textValues = {};\n\n for (const choice of this._choices) {\n if (choice.type === 'text' && choice.initial !== undefined) {\n this._textValues[choice.name] = choice.initial;\n }\n }\n }\n\n get result(): EditablePromptResult {\n return {\n selected: this._choices\n .filter(choice => choice.type === 'checkbox' && this._checkedNames.has(choice.name))\n .map(choice => choice.name),\n values: { ...this._textValues }, // shallow copy to prevent external mutation\n };\n }\n\n private emitChange(): void {\n this._onChange?.(this.result);\n }\n\n selectNext(): void {\n if (this._editingIndex >= 0) return; // Don't navigate while editing\n\n if (this._focusedIndex < this._choices.length - 1) {\n this._focusedIndex++;\n this.markDirty();\n }\n }\n\n selectPrev(): void {\n if (this._editingIndex >= 0) return; // Don't navigate while editing\n\n if (this._focusedIndex > 0) {\n this._focusedIndex--;\n this.markDirty();\n }\n }\n\n toggleCheckbox(): void {\n const choice = this._choices[this._focusedIndex];\n if (!choice || choice.type !== 'checkbox' || choice.disabled) return;\n\n if (this._checkedNames.has(choice.name)) {\n this._checkedNames.delete(choice.name);\n } else {\n this._checkedNames.add(choice.name);\n }\n\n this.emitChange();\n this.markDirty();\n }\n\n enterEditMode(): void {\n const choice = this._choices[this._focusedIndex];\n if (!choice || choice.type !== 'text' || choice.disabled) return;\n\n this._editingIndex = this._focusedIndex;\n this._editingValue = this._textValues[choice.name] ?? choice.initial ?? '';\n this.markDirty();\n }\n\n submitEdit(): void {\n if (this._editingIndex < 0) return;\n\n const choice = this._choices[this._editingIndex];\n if (choice) {\n this._textValues[choice.name] = this._editingValue;\n this.emitChange();\n }\n\n this._editingIndex = -1;\n this._editingValue = '';\n this.markDirty();\n }\n\n cancelEdit(): void {\n this._editingIndex = -1;\n this._editingValue = '';\n this.markDirty();\n }\n\n handleKey(event: KeyEvent): void {\n // Handle editing keys\n if (this._editingIndex >= 0) {\n switch (event.key) {\n case 'enter':\n this.submitEdit();\n break;\n\n case 'escape':\n this.cancelEdit();\n break;\n\n case 'backspace':\n if (this._editingValue.length > 0) {\n this._editingValue = this._editingValue.slice(0, -1);\n this.markDirty();\n }\n break;\n\n default:\n // Handle regular character input (single printable character without modifiers)\n if (\n event.key &&\n event.key.length === 1 &&\n !event.ctrl &&\n !event.alt\n ) {\n this._editingValue += event.key;\n this.markDirty();\n }\n break;\n }\n return;\n }\n\n // Handle navigation and selection keys\n switch (event.key) {\n case 'up':\n this.selectPrev();\n break;\n\n case 'down':\n this.selectNext();\n break;\n\n case 'space':\n this.toggleCheckbox();\n break;\n\n case 'enter':\n this.enterEditMode();\n break;\n }\n }\n\n protected _renderSelf(screen: Screen): void {\n const { x, y, width, height } = this._rect;\n\n if (width <= 0 || height <= 0) return;\n\n const attrs = styleToCellAttrs(this.style);\n let line = 0;\n\n // Render message if provided\n if (this._message) {\n screen.writeString(x, y + line, this._message.slice(0, width), {\n ...attrs,\n bold: true,\n });\n line++;\n }\n\n // Render each choice\n for (let i = 0; i < this._choices.length && line < height; i++) {\n const choice = this._choices[i];\n const isFocused = i === this._focusedIndex;\n const isEditing = i === this._editingIndex;\n\n let text = '';\n\n if (choice.type === 'checkbox') {\n const checked = this._checkedNames.has(choice.name);\n const prefix = isFocused ? (caps.unicode ? '❯ ' : '> ') : ' ';\n const checkbox = checked ? '[x]' : '[ ]';\n text = `${prefix}${checkbox} ${choice.message}`;\n } else {\n // Text field\n const prefix = isFocused ? (caps.unicode ? '❯ ' : '> ') : ' ';\n const label = choice.message;\n const value = isEditing ? this._editingValue : (this._textValues[choice.name] ?? choice.initial ?? '');\n const displayValue = isEditing ? value + '_' : `\"${value}\"`;\n text = `${prefix}${label}: ${displayValue}`;\n }\n\n screen.writeString(x, y + line, text.slice(0, width), {\n ...attrs,\n bold: isFocused || isEditing,\n fg: choice.disabled ? { type: 'named', name: 'brightBlack' } : attrs.fg,\n dim: choice.disabled,\n });\n\n line++;\n }\n }\n}","import { Widget } from \"@termuijs/widgets\";\nimport {\n type Style,\n type Screen,\n type KeyEvent,\n mergeStyles,\n defaultStyle,\n styleToCellAttrs,\n caps,\n} from \"@termuijs/core\";\n\nexport interface SurveyQuestion {\n id: string;\n question: string;\n type: \"text\" | \"choice\";\n options?: string[];\n}\n\nexport interface SurveyPromptOptions {\n onComplete?: (answers: Record<string, string>) => void;\n}\n\nexport class SurveyPrompt extends Widget {\n private _questions: SurveyQuestion[];\n private _currentIndex = 0;\n private _answers: Record<string, string> = {};\n\n private _textBuffer = \"\";\n private _choiceIndex = 0;\n\n private _onComplete?: (answers: Record<string, string>) => void;\n\n focusable = true;\n\n constructor(\n questions: SurveyQuestion[],\n style?: Partial<Style>,\n opts?: SurveyPromptOptions,\n ) {\n super(mergeStyles(defaultStyle(), style ?? {}));\n\n this._questions = questions;\n this._onComplete = opts?.onComplete;\n }\n\n getAnswers(): Record<string, string> {\n return { ...this._answers };\n }\n\n getCurrentIndex(): number {\n return this._currentIndex;\n }\n private _advance(): void {\n this._currentIndex++;\n\n this._textBuffer = \"\";\n this._choiceIndex = 0;\n\n if (this._currentIndex >= this._questions.length) {\n this._onComplete?.({ ...this._answers });\n }\n\n this.markDirty();\n }\n\n handleKey(event: KeyEvent): void {\n if (this._currentIndex >= this._questions.length) return;\n\n const question = this._questions[this._currentIndex];\n\n if (question.type === \"text\") {\n switch (event.key) {\n case \"backspace\":\n this._textBuffer = this._textBuffer.slice(0, -1);\n this.markDirty();\n break;\n\n case \"enter\":\n this._answers[question.id] = this._textBuffer;\n this._advance();\n break;\n\n default:\n if (\n event.key &&\n event.key.length === 1 &&\n !event.ctrl &&\n !event.alt\n ) {\n this._textBuffer += event.key;\n this.markDirty();\n }\n }\n\n return;\n }\n\n switch (event.key) {\n case \"up\":\n if (this._choiceIndex > 0) {\n this._choiceIndex--;\n this.markDirty();\n }\n break;\n\n case \"down\":\n if (\n question.options &&\n this._choiceIndex < question.options.length - 1\n ) {\n this._choiceIndex++;\n this.markDirty();\n }\n break;\n\n case \"enter\":\n if (question.options?.length) {\n this._answers[question.id] =\n question.options[this._choiceIndex];\n this._advance();\n }\n break;\n }\n }\n\n protected _renderSelf(screen: Screen): void {\n const { x, y, width, height } = this._rect;\n\n if (width <= 0 || height <= 0) return;\n\n const attrs = styleToCellAttrs(this.style);\n\n if (this._currentIndex >= this._questions.length) {\n screen.writeString(x, y, \"Survey Complete\".slice(0, width), attrs);\n return;\n }\n\n const question = this._questions[this._currentIndex];\n\n let row = 0;\n\n screen.writeString(\n x,\n y + row,\n `${this._currentIndex + 1} / ${this._questions.length}`.slice(\n 0,\n width,\n ),\n attrs,\n );\n row += 2;\n\n screen.writeString(x, y + row, question.question.slice(0, width), {\n ...attrs,\n bold: true,\n });\n row += 2;\n\n if (question.type === \"text\") {\n screen.writeString(\n x,\n y + row,\n this._textBuffer.slice(0, width),\n attrs,\n );\n return;\n }\n\n const options = question.options ?? [];\n\n for (let i = 0; i < options.length && row < height; i++) {\n const active = i === this._choiceIndex;\n\n const prefix = active ? (caps.unicode ? \"❯ \" : \"> \") : \" \";\n\n screen.writeString(\n x,\n y + row,\n `${prefix}${options[i]}`.slice(0, width),\n {\n ...attrs,\n bold: active,\n },\n );\n\n row++;\n }\n }\n}\n","// ─────────────────────────────────────────────────────\n// @termuijs/ui — Breadcrumb component\n//\n// A horizontal path navigator. Left/right arrows move\n// focus; Enter fires the focused item's onSelect.\n// ─────────────────────────────────────────────────────\n\nimport { Widget } from '@termuijs/widgets';\nimport {\n type Screen,\n type KeyEvent,\n type Style,\n type Color,\n mergeStyles,\n defaultStyle,\n styleToCellAttrs,\n caps,\n stringWidth,\n truncate,\n} from '@termuijs/core';\n\nexport interface BreadcrumbItem {\n label: string;\n onSelect?: () => void;\n}\n\nexport interface BreadcrumbOptions {\n items: BreadcrumbItem[];\n currentColor?: Color;\n inactiveColor?: Color;\n separatorColor?: Color;\n}\n\nexport class Breadcrumb extends Widget {\n private _items: BreadcrumbItem[];\n private _focusedIndex = 0;\n private _currentColor: Color;\n private _inactiveColor: Color;\n private _separatorColor: Color;\n\n focusable = true;\n\n constructor(options: BreadcrumbOptions) {\n super(mergeStyles(defaultStyle(), { height: 1 }));\n this._items = options.items;\n this._currentColor = options.currentColor ?? { type: 'named', name: 'cyan' };\n this._inactiveColor = options.inactiveColor ?? { type: 'named', name: 'brightBlack' };\n this._separatorColor = options.separatorColor ?? { type: 'named', name: 'brightBlack' };\n }\n\n get items(): ReadonlyArray<BreadcrumbItem> { return this._items; }\n get focusedIndex(): number { return this._focusedIndex; }\n\n setItems(items: BreadcrumbItem[]): void {\n this._items = items;\n this._focusedIndex = Math.min(this._focusedIndex, Math.max(0, items.length - 1));\n this.markDirty();\n }\n\n handleKey(event: KeyEvent): void {\n if (this._items.length === 0) return;\n switch (event.key) {\n case 'right':\n this._focusedIndex = (this._focusedIndex + 1) % this._items.length;\n this.markDirty();\n break;\n case 'left':\n this._focusedIndex = (this._focusedIndex - 1 + this._items.length) % this._items.length;\n this.markDirty();\n break;\n case 'enter':\n case 'return':\n this._items[this._focusedIndex]?.onSelect?.();\n break;\n }\n }\n\n protected _renderSelf(screen: Screen): void {\n const { x, y, width } = this._getContentRect();\n if (width <= 0) return;\n\n const attrs = styleToCellAttrs(this.style);\n const sep = caps.unicode ? '›' : '>';\n const sepWithSpaces = ` ${sep} `;\n\n let cx = x;\n for (let i = 0; i < this._items.length; i++) {\n const item = this._items[i];\n if (!item) continue;\n const isLast = i === this._items.length - 1;\n const isFocused = i === this._focusedIndex;\n\n const itemWidth = stringWidth(item.label);\n if (cx + itemWidth > x + width) {\n const remaining = x + width - cx;\n screen.writeString(cx, y, truncate(item.label, remaining), attrs);\n return;\n }\n\n const itemAttrs = isLast\n ? { ...attrs, fg: this._currentColor, bold: true }\n : isFocused\n ? { ...attrs, fg: this._currentColor, underline: true }\n : { ...attrs, fg: this._inactiveColor };\n\n screen.writeString(cx, y, item.label, itemAttrs);\n cx += itemWidth;\n\n if (!isLast) {\n const sepWidth = stringWidth(sepWithSpaces);\n if (cx + sepWidth > x + width) return;\n screen.writeString(cx, y, sepWithSpaces, { ...attrs, fg: this._separatorColor, dim: true });\n cx += sepWidth;\n }\n }\n }\n}\n","import {\n type Screen,\n type KeyEvent,\n type Style,\n caps,\n mergeStyles,\n defaultStyle,\n styleToCellAttrs,\n truncate,\n} from '@termuijs/core';\nimport { Widget } from '@termuijs/widgets';\n\nexport interface DisclosureOptions {\n summary: string;\n defaultOpen?: boolean;\n onToggle?: (open: boolean) => void;\n}\n\nexport class Disclosure extends Widget {\n private _isOpen: boolean;\n private summary: string;\n private onToggleCallback?: (open: boolean) => void;\n private content: Widget;\n private _customStyle: Style;\n\n constructor(content: Widget, options: DisclosureOptions, style?: Partial<Style>) {\n super();\n \n this.content = content;\n this.summary = options.summary;\n this._isOpen = options.defaultOpen ?? false;\n this.onToggleCallback = options.onToggle;\n \n this._customStyle = mergeStyles(defaultStyle(), style ?? {}) as Style;\n \n this.focusable = true;\n }\n\n get isOpen(): boolean {\n return this._isOpen;\n }\n\n open(): void {\n if (!this._isOpen) {\n this._isOpen = true;\n this.markDirty();\n this.onToggleCallback?.(true);\n }\n }\n\n close(): void {\n if (this._isOpen) {\n this._isOpen = false;\n this.markDirty();\n this.onToggleCallback?.(false);\n }\n }\n\n toggle(): void {\n this._isOpen = !this._isOpen;\n this.markDirty();\n this.onToggleCallback?.(this._isOpen);\n }\n\n handleKey(event: KeyEvent): void {\n const key = event.key.toLowerCase();\n if (key === 'enter' || key === ' ' || key === 'space') {\n this.toggle();\n }\n }\n\n protected _renderSelf(screen: Screen): void {\n if (!this.rect || this.rect.width <= 0) return;\n\n const { x, y, width, height } = this.rect;\n\n const marker = caps.unicode\n ? (this._isOpen ? '▾' : '▸')\n : (this._isOpen ? 'v' : '>');\n\n const headerText = `${marker} ${this.summary}`;\n const truncatedHeader = truncate(headerText, width);\n\n screen.writeString(x, y, truncatedHeader, styleToCellAttrs(this._customStyle));\n\n if (this._isOpen && this.content) {\n const childRect = {\n x,\n y: y + 1,\n width,\n height: Math.max(0, height - 1),\n };\n\n this.content.updateRect(childRect);\n this.content.render(screen);\n }\n }\n}","import { Widget } from '@termuijs/widgets';\nimport { type Style, type Color, type KeyEvent, type Screen, mergeStyles, defaultStyle, styleToCellAttrs } from '@termuijs/core';\n\nexport interface ListbarItem {\n label: string;\n key?: string;\n action?: () => void;\n disabled?: boolean;\n}\n\nexport interface ListbarOptions {\n activeColor?: Color;\n keyColor?: Color;\n separator?: string;\n}\n\nexport class Listbar extends Widget {\n private _items: ListbarItem[] = [];\n private _activeIndex = 0;\n private _activeColor: Color;\n private _keyColor: Color;\n private _separator: string;\n\n focusable = true;\n\n constructor(items: ListbarItem[], style?: Partial<Style>, opts?: ListbarOptions) {\n super(mergeStyles(defaultStyle(), { height: 1, ...style }));\n this._items = items;\n this._activeColor = opts?.activeColor ?? { type: 'named', name: 'cyan' };\n this._keyColor = opts?.keyColor ?? { type: 'named', name: 'yellow' };\n this._separator = opts?.separator ?? ' | ';\n this._initActiveIndex();\n }\n\n get activeItem(): number {\n return this._activeIndex;\n }\n\n setItems(items: ListbarItem[]): void {\n this._items = items;\n this._initActiveIndex();\n this.markDirty();\n }\n\n handleKey(event: KeyEvent): void {\n switch (event.key) {\n case 'left':\n this._activeIndex = this._nextEnabled(this._activeIndex, -1);\n this.markDirty();\n break;\n\n case 'right':\n this._activeIndex = this._nextEnabled(this._activeIndex, 1);\n this.markDirty();\n break;\n\n case 'enter':\n const item = this._items[this._activeIndex];\n if (item && !item.disabled && item.action) {\n item.action();\n }\n break;\n }\n }\n\n private _initActiveIndex(): void {\n this._activeIndex = 0;\n for (let i = 0; i < this._items.length; i++) {\n if (!this._items[i].disabled) {\n this._activeIndex = i;\n return;\n }\n }\n }\n\n private _nextEnabled(from: number, direction: number): number {\n if (this._items.length === 0) return from;\n\n let i = from;\n do {\n i = (i + direction + this._items.length) % this._items.length;\n if (!this._items[i].disabled) return i;\n } while (i !== from);\n\n return from;\n }\n\n protected _renderSelf(screen: Screen): void {\n const { x, y, width } = this._rect;\n if (width <= 0) return;\n\n const baseAttrs = styleToCellAttrs(this.style);\n let col = x;\n\n for (let i = 0; i < this._items.length; i++) {\n if (col >= x + width) break;\n\n const item = this._items[i];\n const isActive = i === this._activeIndex;\n\n if (item.key) {\n const keyText = `${item.key} `;\n const keyColor = item.disabled\n ? { type: 'named', name: 'brightBlack' } as Color\n : isActive\n ? this._activeColor\n : this._keyColor;\n\n const keyVisible = keyText.slice(0, x + width - col);\n screen.writeString(col, y, keyVisible, {\n ...baseAttrs,\n fg: keyColor,\n dim: item.disabled,\n bold: isActive,\n });\n col += keyText.length;\n if (col >= x + width) break;\n }\n\n const labelVisible = item.label.slice(0, x + width - col);\n screen.writeString(col, y, labelVisible, {\n ...baseAttrs,\n fg: item.disabled\n ? { type: 'named', name: 'brightBlack' }\n : isActive\n ? this._activeColor\n : baseAttrs.fg,\n dim: item.disabled,\n bold: isActive,\n });\n col += item.label.length;\n\n if (i < this._items.length - 1 && col < x + width) {\n const sepVisible = this._separator.slice(0, x + width - col);\n screen.writeString(col, y, sepVisible, baseAttrs);\n col += this._separator.length;\n }\n }\n }\n}\n","import { Widget } from '@termuijs/widgets';\nimport {\n type Style,\n type Screen,\n type KeyEvent,\n caps,\n styleToCellAttrs\n} from '@termuijs/core';\n\nexport type PopoverPlacement = 'top' | 'bottom' | 'left' | 'right';\n\nexport interface PopoverOptions {\n /** The placement of the popover relative to the anchor. Default: 'bottom'. */\n placement?: PopoverPlacement;\n /** Title shown in the panel border. */\n title?: string;\n /** Border color. */\n borderColor?: Style['fg'];\n /** * The specific terminal coordinates (row/col) to anchor this popover to.\n * If omitted, it will attempt to use its own rect as the anchor bounds.\n */\n anchor?: { x: number; y: number };\n}\n\nexport class Popover extends Widget {\n private _isOpen = false;\n private content: Widget;\n private opts: PopoverOptions;\n\n constructor(content: Widget, style?: Partial<Style>, opts?: PopoverOptions) {\n super(style);\n this.content = content;\n this.opts = { placement: 'bottom', ...opts };\n }\n\n get isOpen(): boolean {\n return this._isOpen;\n }\n\n open(): void {\n if (!this._isOpen) {\n this._isOpen = true;\n this.markDirty();\n }\n }\n\n close(): void {\n if (this._isOpen) {\n this._isOpen = false;\n this.markDirty();\n }\n }\n\n toggle(): void {\n this._isOpen ? this.close() : this.open();\n }\n\n /** Update the anchor coordinates dynamically */\n setAnchor(x: number, y: number): void {\n this.opts.anchor = { x, y };\n this.markDirty();\n }\n\n handleKey(event: KeyEvent): void {\n if (!this._isOpen) return;\n\n if (event.key === 'escape') {\n this.close();\n return;\n }\n\n // `Widget` does not declare `handleKey`; only some concrete widgets implement it.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const focusable = this.content as any;\n if (typeof focusable.handleKey === 'function') {\n focusable.handleKey(event);\n }\n }\n\n private getBorderChars() {\n if (caps.unicode) {\n return {\n topLeft: '┌', topRight: '┐', bottomLeft: '└', bottomRight: '┘',\n top: '─', bottom: '─', left: '│', right: '│'\n };\n }\n return {\n topLeft: '+', topRight: '+', bottomLeft: '+', bottomRight: '+',\n top: '-', bottom: '-', left: '|', right: '|'\n };\n }\n\n protected _renderSelf(screen: Screen): void {\n if (!this._isOpen) return;\n\n // Use the explicit anchor if provided, otherwise fallback to the rect's origin\n const anchorX = this.opts.anchor?.x ?? this._rect.x;\n const anchorY = this.opts.anchor?.y ?? this._rect.y;\n \n const contentRect = this.content.rect;\n const width = Math.max(10, contentRect.width + 2); \n const height = Math.max(3, contentRect.height + 2);\n\n let px = anchorX;\n let py = anchorY;\n\n switch (this.opts.placement) {\n case 'top': py = anchorY - height; break;\n case 'bottom': py = anchorY + 1; break;\n case 'left': px = anchorX - width; break;\n case 'right': px = anchorX + 1; break;\n }\n\n const attrs = styleToCellAttrs(this.style);\n const bAttrs = { ...attrs, fg: this.opts.borderColor || attrs.fg };\n const border = this.getBorderChars();\n\n // ── 1. Draw Sides & Clear Background ──\n for (let r = 1; r < height - 1; r++) {\n screen.writeString(px, py + r, border.left, bAttrs);\n // This space clears whatever was drawn beneath it on the base layer\n screen.writeString(px + 1, py + r, ' '.repeat(Math.max(0, width - 2)), attrs);\n screen.writeString(px + width - 1, py + r, border.right, bAttrs);\n }\n\n // ── 2. Top Border with Title ──\n const titleStr = this.opts.title ? ` ${this.opts.title} ` : '';\n const innerWidth = Math.max(0, width - 2);\n const fill = Math.max(0, innerWidth - titleStr.length);\n const leftFill = Math.floor(fill / 2);\n const rightFill = fill - leftFill;\n\n screen.writeString(\n px, py,\n border.topLeft + border.top.repeat(leftFill) + titleStr + border.top.repeat(rightFill) + border.topRight,\n bAttrs\n );\n\n // ── 3. Bottom Border ──\n if (height >= 2) {\n screen.writeString(\n px, py + height - 1,\n border.bottomLeft + border.bottom.repeat(innerWidth) + border.bottomRight,\n bAttrs\n );\n }\n\n // ── 4. Render Child Content ──\n const contentX = px + 1;\n const contentY = py + 1;\n const contentW = innerWidth;\n const contentH = Math.max(0, height - 2);\n\n if (contentW > 0 && contentH > 0) {\n const originalRect = { ...this.content.rect };\n \n this.content.updateRect({\n x: contentX, y: contentY, width: contentW, height: contentH\n });\n\n screen.pushClip({ x: contentX, y: contentY, width: contentW, height: contentH });\n try {\n this.content.render(screen);\n } finally {\n screen.popClip();\n this.content.updateRect(originalRect);\n }\n }\n }\n}\n","import { createElement, createContext, useContext } from '@termuijs/jsx';\nimport type { VNode } from '@termuijs/jsx';\n\nexport interface FormContextValue {\n submit: () => void;\n}\n\nexport const FormContext = createContext<FormContextValue>({\n submit: () => {},\n});\n\nexport interface FormBuilderProps {\n onSubmit?: () => void;\n children?: VNode | VNode[];\n}\n\nexport function FormBuilder({ onSubmit, children }: FormBuilderProps) {\n const value = {\n submit: () => {\n if (onSubmit) onSubmit();\n }\n };\n return createElement(FormContext.Provider, { value }, children);\n}\n\nexport function useForm() {\n return useContext(FormContext);\n}\n","// ─────────────────────────────────────────────────────\n// @termuijs/ui — SearchInput component\n//\n// A text input with a search-icon prefix, debounced\n// onSearch, and Escape-to-clear.\n// ─────────────────────────────────────────────────────\n\nimport { Widget } from '@termuijs/widgets';\nimport {\n type Screen,\n type KeyEvent,\n type Style,\n mergeStyles,\n defaultStyle,\n styleToCellAttrs,\n truncate,\n caps,\n stringWidth,\n} from '@termuijs/core';\n\nexport interface SearchInputOptions {\n placeholder?: string;\n debounce?: number;\n onSearch?: (value: string) => void;\n}\n\nexport class SearchInput extends Widget {\n private _value = '';\n private _placeholder: string;\n private _debounce: number;\n onSearch?: (value: string) => void;\n\n private _debounceTimer: ReturnType<typeof setTimeout> | null = null;\n\n focusable = true;\n\n constructor(options: SearchInputOptions = {}) {\n super(mergeStyles(defaultStyle(), { height: 1 }));\n this._placeholder = options.placeholder ?? '';\n this._debounce = options.debounce ?? 300;\n this.onSearch = options.onSearch;\n }\n\n get value(): string { return this._value; }\n\n setValue(value: string): void {\n if (this._value === value) return;\n this._value = value;\n this.markDirty();\n this._scheduleSearch();\n }\n\n clear(): void {\n if (this._value === '' && this._debounceTimer === null) return;\n this._value = '';\n this._cancelDebounce();\n this.markDirty();\n this.onSearch?.('');\n }\n\n handleKey(event: KeyEvent): void {\n switch (event.key) {\n case 'escape':\n this.clear();\n break;\n case 'backspace':\n if (this._value.length > 0) {\n this._value = this._value.slice(0, -1);\n this.markDirty();\n this._scheduleSearch();\n }\n break;\n default:\n // Single printable character, no modifier keys held\n if (\n event.key.length === 1\n && !event.ctrl\n && !event.alt\n ) {\n this._value += event.key;\n this.markDirty();\n this._scheduleSearch();\n }\n break;\n }\n }\n\n private _scheduleSearch(): void {\n this._cancelDebounce();\n const value = this._value;\n this._debounceTimer = setTimeout(() => {\n this._debounceTimer = null;\n this.onSearch?.(value);\n }, this._debounce);\n }\n\n private _cancelDebounce(): void {\n if (this._debounceTimer !== null) {\n clearTimeout(this._debounceTimer);\n this._debounceTimer = null;\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 icon = caps.unicode ? '🔍' : '/';\n const prefix = `${icon} `;\n const prefixWidth = stringWidth(prefix);\n\n const valueOrPlaceholder = this._value.length > 0\n ? this._value\n : this._placeholder;\n\n const valueAttrs = this._value.length > 0\n ? attrs\n : { ...attrs, dim: true };\n\n const available = Math.max(0, width - prefixWidth);\n const valueText = truncate(valueOrPlaceholder, available);\n\n screen.writeString(x, y, prefix, attrs);\n if (valueText.length > 0) {\n screen.writeString(x + prefixWidth, y, valueText, valueAttrs);\n }\n }\n}\n"],"mappings":"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","names":["import_widgets","import_widgets","import_core","import_widgets","import_core","import_widgets","import_core","import_widgets","import_core","import_widgets","import_core","import_widgets","import_core","import_widgets","import_core","import_widgets","import_core","import_widgets","import_core","import_widgets","import_core","import_widgets","import_core","import_widgets","import_core","import_widgets","import_core","import_widgets","import_core","import_widgets","import_core","import_widgets","import_core","import_widgets","import_core","path","import_widgets","import_core","import_widgets","import_core","import_widgets","import_core","import_widgets","import_core","import_widgets","import_core","resolve","import_widgets","import_core","import_widgets","import_core","import_widgets","import_core","import_widgets","import_core","import_widgets","import_core","import_widgets","import_core","import_widgets","import_core","fs","import_widgets","import_core","sep","import_widgets","import_core","import_widgets","import_core","import_widgets","import_core","MONTH_NAMES","import_widgets","import_core","import_widgets","import_core","import_widgets","import_core","import_widgets","import_core","import_widgets","import_core","import_widgets","import_core","import_core","import_widgets","import_core","import_widgets","import_widgets","import_core","import_widgets","import_core","import_widgets","import_core","import_widgets","import_core","import_widgets","import_core","import_widgets","import_core","import_widgets","import_core","import_widgets","import_core","import_core","import_widgets","import_widgets","import_core","import_jsx","import_widgets","import_core","import_widgets","import_core","import_widgets","import_core","import_widgets","import_core","path","import_widgets","import_core","import_widgets","import_core","import_widgets","import_core","import_widgets","import_core","import_widgets","import_core","sep","import_core","import_widgets","import_widgets","import_core","import_widgets","import_core","import_jsx","import_widgets","import_core"]}
|