@termuijs/ui 0.1.2 → 0.1.4
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 +104 -18
- package/dist/index.cjs +977 -31
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +277 -2
- package/dist/index.d.ts +277 -2
- package/dist/index.js +952 -26
- package/dist/index.js.map +1 -1
- package/package.json +9 -3
package/dist/index.js.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"],"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","// 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 } 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 ? ` ● ${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, '│', { ...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 } 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 ?? '░';\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 } 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 ? '▼ ' : '▶ ';\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 ? '● ' : ' ';\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 } 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 ?? '◼';\n this._uncheckChar = config.uncheckChar ?? '◻';\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 ? '❯ ' : ' '}${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 } 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 ? '▼ ' : '▶ ') : ' ';\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 } 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: Record<ToastType, string> = { info: 'ℹ', success: '✓', warning: '⚠', error: '✗' };\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 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 } 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 for (let r = 0; r < height; r++) screen.writeString(x, y + r, '░'.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, (' 🔍 ' + 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 ? '❯ ' : ' ') + 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"],"mappings":";AAQA;AAAA,EACI;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAAA;AAAA,OACG;;;ACpBP,SAAS,cAAc;AACvB,SAAkC,aAAa,cAAc,wBAAwB;AAQ9E,IAAM,UAAN,cAAsB,OAAO;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EAER,YAAY,UAA0B,CAAC,GAAG;AACtC,UAAM,YAAY,aAAa,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC;AAChD,SAAK,QAAQ,QAAQ,QAAQ;AAC7B,SAAK,SAAS,QAAQ;AACtB,SAAK,SAAS,QAAQ,SAAS;AAAA,EACnC;AAAA,EAEU,YAAY,QAAsB;AACxC,UAAM,EAAE,GAAG,GAAG,MAAM,IAAI,KAAK;AAC7B,QAAI,SAAS,EAAG;AAChB,UAAM,QAAQ,iBAAiB,KAAK,KAAK;AACzC,QAAI,KAAK,OAAQ,OAAM,KAAK,KAAK;AACjC,UAAM,MAAM;AACZ,QAAI,KAAK,QAAQ;AACb,YAAM,WAAW,IAAI,KAAK,MAAM;AAChC,YAAM,UAAU,KAAK,IAAI,GAAG,KAAK,OAAO,QAAQ,SAAS,UAAU,CAAC,CAAC;AACrE,YAAM,WAAW,KAAK,IAAI,GAAG,QAAQ,UAAU,SAAS,MAAM;AAC9D,YAAM,OAAO,KAAK,MAAM,OAAO,OAAO,IAAI,WAAW,KAAK,MAAM,OAAO,QAAQ;AAC/E,aAAO,YAAY,GAAG,GAAG,KAAK,MAAM,GAAG,KAAK,GAAG,KAAK;AAAA,IACxD,OAAO;AACH,aAAO,YAAY,GAAG,GAAG,KAAK,MAAM,OAAO,KAAK,GAAG,KAAK;AAAA,IAC5D;AAAA,EACJ;AACJ;;;ACrCA,SAAS,UAAAC,eAAc;AACvB,SAAsB,eAAAC,cAAa,gBAAAC,qBAAoB;AAEhD,IAAM,SAAN,cAAqBF,QAAO;AAAA,EAC/B,YAAY,OAAe,GAAG;AAC1B,UAAMC,aAAYC,cAAa,GAAG,EAAE,UAAU,KAAK,CAAC,CAAC;AAAA,EACzD;AAAA,EACU,YAAY,SAAuB;AAAA,EAAc;AAC/D;;;ACRA,SAAS,UAAAC,eAAc;AACvB,SAAkC,eAAAC,cAAa,gBAAAC,eAAc,oBAAAC,yBAAwB;AAS9E,IAAM,OAAN,cAAmBH,QAAO;AAAA,EACrB,QAAe,CAAC;AAAA,EAChB,eAAe;AAAA,EACf;AAAA,EACA;AAAA,EACR,YAAY;AAAA,EAEZ,YAAY,MAAa,UAAuB,CAAC,GAAG;AAChD,UAAMC,aAAYC,cAAa,GAAG,EAAE,UAAU,GAAG,QAAQ,QAAQ,UAAU,SAAS,CAAC,CAAC;AACtF,SAAK,QAAQ;AACb,SAAK,eAAe,QAAQ,eAAe,EAAE,MAAM,SAAS,MAAM,OAAO;AACzE,SAAK,iBAAiB,QAAQ,iBAAiB,EAAE,MAAM,SAAS,MAAM,cAAc;AAAA,EACxF;AAAA,EAEA,IAAI,cAAsB;AAAE,WAAO,KAAK;AAAA,EAAc;AAAA,EACtD,UAAU,GAAiB;AAAE,QAAI,KAAK,KAAK,IAAI,KAAK,MAAM,QAAQ;AAAE,WAAK,eAAe;AAAG,WAAK,UAAU;AAAA,IAAG;AAAA,EAAE;AAAA,EAC/G,UAAgB;AAAE,SAAK,gBAAgB,KAAK,eAAe,KAAK,KAAK,MAAM;AAAQ,SAAK,UAAU;AAAA,EAAG;AAAA,EACrG,UAAgB;AAAE,SAAK,gBAAgB,KAAK,eAAe,IAAI,KAAK,MAAM,UAAU,KAAK,MAAM;AAAQ,SAAK,UAAU;AAAA,EAAG;AAAA,EACzH,IAAI,gBAAoC;AAAE,WAAO,KAAK,MAAM,KAAK,YAAY,GAAG;AAAA,EAAS;AAAA,EAE/E,YAAY,QAAsB;AACxC,UAAM,EAAE,GAAG,GAAG,OAAO,OAAO,IAAI,KAAK;AACrC,QAAI,SAAS,KAAK,UAAU,EAAG;AAC/B,UAAM,QAAQC,kBAAiB,KAAK,KAAK;AACzC,QAAI,MAAM;AACV,aAAS,IAAI,GAAG,IAAI,KAAK,MAAM,QAAQ,KAAK;AACxC,YAAM,MAAM,KAAK,MAAM,CAAC;AACxB,YAAM,WAAW,MAAM,KAAK;AAC5B,YAAM,QAAQ,WAAW,WAAM,IAAI,KAAK,MAAM,MAAM,IAAI,KAAK;AAC7D,aAAO,YAAY,KAAK,GAAG,OAAO;AAAA,QAC9B,GAAG;AAAA,QACH,IAAI,WAAW,KAAK,eAAe,KAAK;AAAA,QACxC,MAAM;AAAA,QAAU,KAAK,CAAC;AAAA,MAC1B,CAAC;AACD,aAAO,MAAM;AACb,UAAI,IAAI,KAAK,MAAM,SAAS,GAAG;AAAE,eAAO,YAAY,KAAK,GAAG,UAAK,EAAE,GAAG,OAAO,KAAK,KAAK,CAAC;AAAG;AAAA,MAAO;AAAA,IACtG;AACA,QAAI,SAAS,EAAG,QAAO,YAAY,GAAG,IAAI,GAAG,SAAI,OAAO,KAAK,GAAG,EAAE,GAAG,OAAO,KAAK,KAAK,CAAC;AAAA,EAC3F;AACJ;;;ACjDA,SAAS,UAAAC,eAAc;AACvB,SAAkC,eAAAC,cAAa,gBAAAC,eAAc,oBAAAC,mBAAkB,sBAAsB;AAU9F,IAAM,QAAN,cAAoBH,QAAO;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,WAA0B;AAAA,EAElC,YAAY,UAAwB,CAAC,GAAG;AACpC,UAAMC,aAAYC,cAAa,GAAG,CAAC,CAAC,CAAC;AACrC,SAAK,SAAS,QAAQ,SAAS;AAC/B,SAAK,cAAc,QAAQ,SAAS;AACpC,SAAK,eAAe,QAAQ,UAAU;AACtC,SAAK,eAAe,QAAQ,eAAe,EAAE,MAAM,SAAS,MAAM,OAAO;AACzE,SAAK,gBAAgB,QAAQ,gBAAgB;AAAA,EACjD;AAAA,EAEA,IAAI,UAAmB;AAAE,WAAO,KAAK;AAAA,EAAU;AAAA,EAC/C,OAAa;AAAE,SAAK,WAAW;AAAM,SAAK,UAAU;AAAA,EAAG;AAAA,EACvD,OAAa;AAAE,SAAK,WAAW;AAAO,SAAK,UAAU;AAAA,EAAG;AAAA,EACxD,SAAe;AAAE,SAAK,WAAW,CAAC,KAAK;AAAU,SAAK,UAAU;AAAA,EAAG;AAAA,EACnE,WAAW,SAAuB;AAAE,SAAK,WAAW;AAAS,SAAK,UAAU;AAAA,EAAG;AAAA,EAErE,YAAY,QAAsB;AACxC,QAAI,CAAC,KAAK,SAAU;AACpB,UAAM,EAAE,GAAG,GAAG,OAAO,OAAO,IAAI,KAAK;AACrC,UAAM,QAAQC,kBAAiB,KAAK,KAAK;AAEzC,aAAS,IAAI,GAAG,IAAI,QAAQ,KAAK;AAC7B,aAAO,YAAY,GAAG,IAAI,GAAG,KAAK,cAAc,OAAO,KAAK,GAAG,EAAE,GAAG,OAAO,KAAK,KAAK,CAAC;AAAA,IAC1F;AAEA,UAAM,KAAK,KAAK,IAAI,KAAK,aAAa,QAAQ,CAAC;AAC/C,UAAM,KAAK,KAAK,IAAI,KAAK,cAAc,SAAS,CAAC;AACjD,UAAM,KAAK,IAAI,KAAK,OAAO,QAAQ,MAAM,CAAC;AAC1C,UAAM,KAAK,IAAI,KAAK,OAAO,SAAS,MAAM,CAAC;AAC3C,UAAM,SAAS,eAAe,QAAQ;AACtC,QAAI,CAAC,OAAQ;AACb,UAAM,SAAS,EAAE,GAAG,OAAO,IAAI,KAAK,aAAa;AAEjD,UAAM,WAAW,KAAK,SAAS,IAAI,KAAK,MAAM,MAAM;AACpD,UAAM,UAAU,KAAK,IAAI,SAAS;AAClC,UAAM,KAAK,KAAK,MAAM,UAAU,CAAC;AACjC,UAAM,KAAK,UAAU;AACrB,WAAO,YAAY,IAAI,IAAI,OAAO,UAAU,OAAO,IAAI,OAAO,EAAE,IAAI,WAAW,OAAO,IAAI,OAAO,KAAK,IAAI,GAAG,EAAE,CAAC,IAAI,OAAO,UAAU,MAAM;AAE3I,UAAM,MAAMA,kBAAiB,KAAK,KAAK;AACvC,aAAS,IAAI,GAAG,IAAI,KAAK,GAAG,KAAK;AAC7B,aAAO,YAAY,IAAI,KAAK,GAAG,OAAO,MAAM,MAAM;AAClD,aAAO,YAAY,KAAK,GAAG,KAAK,GAAG,IAAI,OAAO,KAAK,CAAC,GAAG,GAAG;AAC1D,aAAO,YAAY,KAAK,KAAK,GAAG,KAAK,GAAG,OAAO,OAAO,MAAM;AAAA,IAChE;AAEA,WAAO,YAAY,IAAI,KAAK,KAAK,GAAG,OAAO,aAAa,OAAO,OAAO,OAAO,KAAK,CAAC,IAAI,OAAO,aAAa,MAAM;AAEjH,QAAI,KAAK,UAAU;AACf,YAAM,KAAK,EAAE,GAAG,KAAK,GAAG,GAAG,KAAK,GAAG,OAAO,KAAK,GAAG,QAAQ,KAAK,EAAE;AACjE,MAAC,KAAK,SAAiB,QAAQ;AAC/B,MAAC,KAAK,SAAiB,YAAY,MAAM;AAAA,IAC7C;AAAA,EACJ;AACJ;;;ACzEA,SAAS,UAAAC,eAAc;AACvB,SAAkC,eAAAC,cAAa,gBAAAC,eAAc,oBAAAC,yBAAwB;AAS9E,IAAM,SAAN,cAAqBH,QAAO;AAAA,EACvB;AAAA,EACA,iBAAiB;AAAA,EACjB,UAAU;AAAA,EACV;AAAA,EACA;AAAA,EACA;AAAA,EACR,YAAY;AAAA,EAEZ,YAAY,SAAyB,SAAwB,CAAC,GAAG;AAC7D,UAAMC,aAAYC,cAAa,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC;AAChD,SAAK,WAAW;AAChB,SAAK,eAAe,OAAO,eAAe;AAC1C,SAAK,eAAe,OAAO,eAAe,EAAE,MAAM,SAAS,MAAM,OAAO;AACxE,SAAK,YAAY,OAAO;AAAA,EAC5B;AAAA,EAEA,IAAI,iBAA2C;AAAE,WAAO,KAAK,SAAS,KAAK,cAAc;AAAA,EAAG;AAAA,EAC5F,IAAI,gBAAwB;AAAE,WAAO,KAAK;AAAA,EAAgB;AAAA,EAC1D,IAAI,SAAkB;AAAE,WAAO,KAAK;AAAA,EAAS;AAAA,EAC7C,OAAa;AAAE,SAAK,UAAU;AAAM,SAAK,UAAU;AAAA,EAAG;AAAA,EACtD,QAAc;AAAE,SAAK,UAAU;AAAO,SAAK,UAAU;AAAA,EAAG;AAAA,EACxD,SAAe;AAAE,SAAK,UAAU,CAAC,KAAK;AAAS,SAAK,UAAU;AAAA,EAAG;AAAA,EAEjE,aAAmB;AACf,QAAI,IAAI,KAAK,iBAAiB;AAC9B,WAAO,IAAI,KAAK,SAAS,UAAU,KAAK,SAAS,CAAC,EAAE,SAAU;AAC9D,QAAI,IAAI,KAAK,SAAS,QAAQ;AAAE,WAAK,iBAAiB;AAAG,WAAK,UAAU;AAAA,IAAG;AAAA,EAC/E;AAAA,EACA,aAAmB;AACf,QAAI,IAAI,KAAK,iBAAiB;AAC9B,WAAO,KAAK,KAAK,KAAK,SAAS,CAAC,EAAE,SAAU;AAC5C,QAAI,KAAK,GAAG;AAAE,WAAK,iBAAiB;AAAG,WAAK,UAAU;AAAA,IAAG;AAAA,EAC7D;AAAA,EACA,UAAgB;AACZ,UAAM,MAAM,KAAK,SAAS,KAAK,cAAc;AAC7C,QAAI,OAAO,CAAC,IAAI,UAAU;AAAE,WAAK,YAAY,KAAK,KAAK,cAAc;AAAG,WAAK,UAAU;AAAO,WAAK,UAAU;AAAA,IAAG;AAAA,EACpH;AAAA,EAEU,YAAY,QAAsB;AACxC,UAAM,EAAE,GAAG,GAAG,MAAM,IAAI,KAAK;AAC7B,QAAI,SAAS,EAAG;AAChB,UAAM,QAAQC,kBAAiB,KAAK,KAAK;AACzC,UAAM,MAAM,KAAK,SAAS,KAAK,cAAc;AAC7C,UAAM,QAAQ,MAAM,IAAI,QAAQ,KAAK;AACrC,UAAM,SAAS,KAAK,UAAU,YAAO;AACrC,WAAO,YAAY,GAAG,GAAG,SAAS,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,EAAE,GAAG,OAAO,IAAI,KAAK,aAAa,CAAC;AAChG,QAAI,KAAK,SAAS;AACd,eAAS,IAAI,GAAG,IAAI,KAAK,SAAS,QAAQ,KAAK;AAC3C,cAAM,IAAI,KAAK,SAAS,CAAC;AACzB,cAAM,QAAQ,MAAM,KAAK;AACzB,cAAM,IAAI,QAAQ,YAAO;AACzB,eAAO,YAAY,GAAG,IAAI,IAAI,GAAG,IAAI,EAAE,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG;AAAA,UAC9D,GAAG;AAAA,UACH,IAAI,EAAE,WAAW,EAAE,MAAM,SAAkB,MAAM,cAAuB,IAAI,QAAQ,KAAK,eAAe,MAAM;AAAA,UAC9G,MAAM;AAAA,UAAO,KAAK,EAAE;AAAA,QACxB,CAAC;AAAA,MACL;AAAA,IACJ;AAAA,EACJ;AACJ;;;ACtEA,SAAS,UAAAC,eAAc;AACvB,SAAkC,eAAAC,cAAa,gBAAAC,eAAc,oBAAAC,yBAAwB;AAU9E,IAAM,cAAN,cAA0BH,QAAO;AAAA,EAC5B;AAAA,EACA,eAAe;AAAA,EACf,WAAwB,oBAAI,IAAI;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACR,YAAY;AAAA,EAEZ,YAAY,SAA8B,SAA6B,CAAC,GAAG;AACvE,UAAMC,aAAYC,cAAa,GAAG,EAAE,QAAQ,KAAK,IAAI,QAAQ,QAAQ,CAAC,EAAE,CAAC,CAAC;AAC1E,SAAK,WAAW;AAChB,SAAK,eAAe,OAAO,eAAe,EAAE,MAAM,SAAS,MAAM,OAAO;AACxE,SAAK,aAAa,OAAO,aAAa;AACtC,SAAK,eAAe,OAAO,eAAe;AAC1C,SAAK,YAAY,OAAO;AAAA,EAC5B;AAAA,EAEA,IAAI,kBAAuC;AACvC,WAAO,CAAC,GAAG,KAAK,QAAQ,EAAE,KAAK,EAAE,IAAI,OAAK,KAAK,SAAS,CAAC,CAAC;AAAA,EAC9D;AAAA,EACA,aAAmB;AAAE,QAAI,IAAI,KAAK,eAAe;AAAG,WAAO,IAAI,KAAK,SAAS,UAAU,KAAK,SAAS,CAAC,EAAE,SAAU;AAAK,QAAI,IAAI,KAAK,SAAS,QAAQ;AAAE,WAAK,eAAe;AAAG,WAAK,UAAU;AAAA,IAAG;AAAA,EAAE;AAAA,EAClM,aAAmB;AAAE,QAAI,IAAI,KAAK,eAAe;AAAG,WAAO,KAAK,KAAK,KAAK,SAAS,CAAC,EAAE,SAAU;AAAK,QAAI,KAAK,GAAG;AAAE,WAAK,eAAe;AAAG,WAAK,UAAU;AAAA,IAAG;AAAA,EAAE;AAAA,EAC9J,gBAAsB;AAClB,UAAM,IAAI,KAAK,SAAS,KAAK,YAAY;AACzC,QAAI,KAAK,CAAC,EAAE,UAAU;AAAE,WAAK,SAAS,IAAI,KAAK,YAAY,IAAI,KAAK,SAAS,OAAO,KAAK,YAAY,IAAI,KAAK,SAAS,IAAI,KAAK,YAAY;AAAG,WAAK,UAAU;AAAA,IAAG;AAAA,EACrK;AAAA,EACA,SAAe;AAAE,SAAK,YAAY,KAAK,eAAe;AAAA,EAAG;AAAA,EAE/C,YAAY,QAAsB;AACxC,UAAM,EAAE,GAAG,GAAG,OAAO,OAAO,IAAI,KAAK;AACrC,QAAI,SAAS,KAAK,UAAU,EAAG;AAC/B,UAAM,QAAQC,kBAAiB,KAAK,KAAK;AACzC,aAAS,IAAI,GAAG,IAAI,KAAK,SAAS,UAAU,IAAI,QAAQ,KAAK;AACzD,YAAM,IAAI,KAAK,SAAS,CAAC;AACzB,YAAM,SAAS,MAAM,KAAK;AAC1B,YAAM,UAAU,KAAK,SAAS,IAAI,CAAC;AACnC,YAAM,QAAQ,GAAG,SAAS,YAAO,IAAI,GAAG,UAAU,KAAK,aAAa,KAAK,YAAY,IAAI,EAAE,KAAK;AAChG,aAAO,YAAY,GAAG,IAAI,GAAG,MAAM,MAAM,GAAG,KAAK,GAAG;AAAA,QAChD,GAAG;AAAA,QACH,IAAI,EAAE,WAAW,EAAE,MAAM,SAAkB,MAAM,cAAuB,IAAI,SAAS,KAAK,eAAe,MAAM;AAAA,QAC/G,MAAM;AAAA,QAAQ,KAAK,EAAE;AAAA,MACzB,CAAC;AAAA,IACL;AAAA,EACJ;AACJ;;;ACzDA,SAAS,UAAAC,eAAc;AACvB,SAAkC,eAAAC,cAAa,gBAAAC,eAAc,oBAAAC,yBAAwB;AAK9E,IAAM,OAAN,cAAmBH,QAAO;AAAA,EACrB;AAAA,EACA,eAAe;AAAA,EACf;AAAA,EACA;AAAA,EACR,YAAY;AAAA,EAEZ,YAAY,OAAmB,UAAuB,CAAC,GAAG;AACtD,UAAMC,aAAYC,cAAa,GAAG,EAAE,UAAU,EAAE,CAAC,CAAC;AAClD,SAAK,SAAS;AACd,SAAK,eAAe,QAAQ,eAAe,EAAE,MAAM,SAAS,MAAM,OAAO;AACzE,SAAK,YAAY,QAAQ;AAAA,EAC7B;AAAA,EAEQ,WAAsF;AAC1F,UAAM,SAAoF,CAAC;AAC3F,UAAM,OAAO,CAAC,OAAmB,OAAe,SAAmB;AAC/D,eAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACnC,cAAM,OAAO,MAAM,CAAC;AACpB,cAAM,eAAe,KAAK,UAAU,UAAU,KAAK;AACnD,eAAO,KAAK,EAAE,MAAM,OAAO,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,YAAY,CAAC;AAC5D,YAAI,eAAe,KAAK,SAAU,MAAK,KAAK,UAAW,QAAQ,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC;AAAA,MAClF;AAAA,IACJ;AACA,SAAK,KAAK,QAAQ,GAAG,CAAC,CAAC;AACvB,WAAO;AAAA,EACX;AAAA,EAEA,aAAmB;AAAE,UAAM,IAAI,KAAK,SAAS;AAAG,QAAI,KAAK,eAAe,EAAE,SAAS,GAAG;AAAE,WAAK;AAAgB,WAAK,UAAU;AAAA,IAAG;AAAA,EAAE;AAAA,EACjI,aAAmB;AAAE,QAAI,KAAK,eAAe,GAAG;AAAE,WAAK;AAAgB,WAAK,UAAU;AAAA,IAAG;AAAA,EAAE;AAAA,EAC3F,eAAqB;AAAE,UAAM,IAAI,KAAK,SAAS;AAAG,UAAM,KAAK,EAAE,KAAK,YAAY;AAAG,QAAI,IAAI,aAAa;AAAE,SAAG,KAAK,WAAW,CAAC,GAAG,KAAK;AAAU,WAAK,UAAU;AAAA,IAAG;AAAA,EAAE;AAAA,EACpK,UAAgB;AACZ,UAAM,IAAI,KAAK,SAAS;AAAG,UAAM,KAAK,EAAE,KAAK,YAAY;AACzD,QAAI,IAAI;AAAE,SAAG,cAAc,KAAK,aAAa,IAAI,KAAK,YAAY,GAAG,MAAM,GAAG,IAAI;AAAA,IAAG;AAAA,EACzF;AAAA,EAEU,YAAY,QAAsB;AACxC,UAAM,EAAE,GAAG,GAAG,OAAO,OAAO,IAAI,KAAK;AACrC,QAAI,SAAS,KAAK,UAAU,EAAG;AAC/B,UAAM,QAAQC,kBAAiB,KAAK,KAAK;AACzC,UAAM,OAAO,KAAK,SAAS;AAC3B,aAAS,IAAI,GAAG,IAAI,KAAK,UAAU,IAAI,QAAQ,KAAK;AAChD,YAAM,KAAK,KAAK,CAAC;AACjB,YAAM,SAAS,MAAM,KAAK;AAC1B,YAAM,SAAS,KAAK,OAAO,GAAG,KAAK;AACnC,YAAM,OAAO,GAAG,cAAe,GAAG,KAAK,WAAW,YAAO,YAAQ;AACjE,YAAM,WAAW,GAAG,KAAK,OAAO,GAAG,GAAG,KAAK,IAAI,MAAM;AACrD,YAAM,OAAO,GAAG,MAAM,GAAG,IAAI,GAAG,QAAQ,GAAG,GAAG,KAAK,KAAK;AACxD,aAAO,YAAY,GAAG,IAAI,GAAG,KAAK,MAAM,GAAG,KAAK,GAAG,EAAE,GAAG,OAAO,IAAI,SAAS,KAAK,eAAe,MAAM,IAAI,MAAM,OAAO,CAAC;AAAA,IAC5H;AAAA,EACJ;AACJ;;;ACzDA,SAAS,UAAAC,eAAc;AACvB,SAAsB,eAAAC,cAAa,gBAAAC,eAAc,oBAAAC,yBAAwB;AAMzE,IAAM,QAAmC,EAAE,MAAM,UAAK,SAAS,UAAK,SAAS,UAAK,OAAO,SAAI;AAC7F,IAAM,SAAoC,EAAE,MAAM,QAAQ,SAAS,SAAS,SAAS,UAAU,OAAO,MAAM;AAErG,IAAM,QAAN,cAAoBH,QAAO;AAAA,EACtB,YAA4B,CAAC;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EAER,YAAY,UAAwB,CAAC,GAAG;AACpC,UAAMC,aAAYC,cAAa,GAAG,CAAC,CAAC,CAAC;AACrC,SAAK,YAAY,QAAQ,YAAY;AACrC,SAAK,cAAc,QAAQ,cAAc;AACzC,SAAK,cAAc,QAAQ,cAAc;AAAA,EAC7C;AAAA,EAEA,KAAK,MAAc,OAAkB,QAAc;AAAE,SAAK,UAAU,KAAK,EAAE,MAAM,MAAM,UAAU,KAAK,IAAI,IAAI,KAAK,YAAY,CAAC;AAAG,SAAK,UAAU;AAAA,EAAG;AAAA,EACrJ,KAAK,MAAoB;AAAE,SAAK,KAAK,MAAM,MAAM;AAAA,EAAG;AAAA,EACpD,QAAQ,MAAoB;AAAE,SAAK,KAAK,MAAM,SAAS;AAAA,EAAG;AAAA,EAC1D,QAAQ,MAAoB;AAAE,SAAK,KAAK,MAAM,SAAS;AAAA,EAAG;AAAA,EAC1D,MAAM,MAAoB;AAAE,SAAK,KAAK,MAAM,OAAO;AAAA,EAAG;AAAA,EAE5C,YAAY,QAAsB;AACxC,UAAM,MAAM,KAAK,IAAI;AACrB,SAAK,YAAY,KAAK,UAAU,OAAO,OAAK,EAAE,WAAW,GAAG;AAC5D,QAAI,KAAK,UAAU,WAAW,EAAG;AACjC,UAAM,EAAE,GAAG,GAAG,OAAO,OAAO,IAAI,KAAK;AACrC,UAAM,UAAU,KAAK,UAAU,MAAM,CAAC,KAAK,WAAW;AACtD,UAAM,KAAK,KAAK,IAAI,IAAI,QAAQ,CAAC;AACjC,UAAM,UAAU,KAAK,UAAU,SAAS,OAAO;AAC/C,UAAM,WAAW,KAAK,UAAU,SAAS,QAAQ;AACjD,UAAM,KAAK,UAAU,IAAI,QAAQ,KAAK,IAAI,IAAI;AAC9C,UAAM,KAAK,WAAW,IAAI,SAAS,QAAQ,SAAS,IAAI,IAAI;AAC5D,UAAM,QAAQC,kBAAiB,KAAK,KAAK;AACzC,aAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACrC,YAAM,IAAI,QAAQ,CAAC;AACnB,YAAM,QAAQ,IAAI,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,IAAI,MAAM,GAAG,EAAE,EAAE,OAAO,EAAE;AACnE,aAAO,YAAY,IAAI,KAAK,GAAG,OAAO,EAAE,GAAG,OAAO,IAAI,EAAE,MAAM,SAAS,MAAM,OAAO,EAAE,IAAI,EAAS,GAAG,MAAM,KAAK,CAAC;AAAA,IACtH;AAAA,EACJ;AACJ;;;AC/CA,SAAS,UAAAC,eAAc;AACvB,SAAkC,eAAAC,cAAa,gBAAAC,eAAc,oBAAAC,mBAAkB,kBAAAC,uBAAsB;AAW9F,IAAM,gBAAN,cAA4BJ,QAAO;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAkC;AAAA,EAClC,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACR,YAAY;AAAA,EAEZ,YAAY,SAA+B;AACvC,UAAMC,aAAYC,cAAa,GAAG,CAAC,CAAC,CAAC;AACrC,SAAK,WAAW,QAAQ;AACxB,SAAK,gBAAgB,QAAQ,gBAAgB;AAC7C,SAAK,eAAe,QAAQ,eAAe;AAC3C,SAAK,eAAe,QAAQ,eAAe,EAAE,MAAM,SAAS,MAAM,SAAS;AAC3E,SAAK,aAAa,QAAQ;AAC1B,SAAK,YAAY,QAAQ;AAAA,EAC7B;AAAA,EAEA,IAAI,UAAmB;AAAE,WAAO,KAAK;AAAA,EAAU;AAAA,EAC/C,OAAa;AAAE,SAAK,WAAW;AAAM,SAAK,YAAY;AAAW,SAAK,UAAU;AAAA,EAAG;AAAA,EACnF,OAAa;AAAE,SAAK,WAAW;AAAO,SAAK,UAAU;AAAA,EAAG;AAAA,EACxD,gBAAsB;AAAE,SAAK,YAAY;AAAW,SAAK,UAAU;AAAA,EAAG;AAAA,EACtE,eAAqB;AAAE,SAAK,YAAY;AAAU,SAAK,UAAU;AAAA,EAAG;AAAA,EACpE,kBAAwB;AAAE,SAAK,YAAY,KAAK,cAAc,YAAY,WAAW;AAAW,SAAK,UAAU;AAAA,EAAG;AAAA,EAClH,UAAgB;AACZ,KAAC,KAAK,cAAc,YAAY,KAAK,aAAa,KAAK,aAAa;AACpE,SAAK,WAAW;AAChB,SAAK,UAAU;AAAA,EACnB;AAAA,EAEU,YAAY,QAAsB;AACxC,QAAI,CAAC,KAAK,SAAU;AACpB,UAAM,EAAE,GAAG,GAAG,OAAO,OAAO,IAAI,KAAK;AACrC,UAAM,QAAQC,kBAAiB,KAAK,KAAK;AACzC,aAAS,IAAI,GAAG,IAAI,QAAQ,IAAK,QAAO,YAAY,GAAG,IAAI,GAAG,SAAI,OAAO,KAAK,GAAG,EAAE,GAAG,OAAO,KAAK,KAAK,CAAC;AACxG,UAAM,KAAK,KAAK,IAAI,IAAI,QAAQ,CAAC;AACjC,UAAM,KAAK;AACX,UAAM,KAAK,IAAI,KAAK,OAAO,QAAQ,MAAM,CAAC;AAC1C,UAAM,KAAK,IAAI,KAAK,OAAO,SAAS,MAAM,CAAC;AAC3C,UAAM,SAASC,gBAAe,QAAQ;AACtC,QAAI,CAAC,OAAQ;AACb,UAAM,KAAK,EAAE,GAAG,OAAO,IAAI,KAAK,aAAa;AAC7C,WAAO,YAAY,IAAI,IAAI,OAAO,UAAU,OAAO,IAAI,OAAO,KAAK,CAAC,IAAI,OAAO,UAAU,EAAE;AAC3F,aAAS,IAAI,GAAG,IAAI,KAAK,GAAG,KAAK;AAC7B,aAAO,YAAY,IAAI,KAAK,GAAG,OAAO,MAAM,EAAE;AAC9C,aAAO,YAAY,KAAK,GAAG,KAAK,GAAG,IAAI,OAAO,KAAK,CAAC,GAAG,KAAK;AAC5D,aAAO,YAAY,KAAK,KAAK,GAAG,KAAK,GAAG,OAAO,OAAO,EAAE;AAAA,IAC5D;AACA,WAAO,YAAY,IAAI,KAAK,KAAK,GAAG,OAAO,aAAa,OAAO,OAAO,OAAO,KAAK,CAAC,IAAI,OAAO,aAAa,EAAE;AAC7G,WAAO,YAAY,KAAK,GAAG,KAAK,GAAG,KAAK,SAAS,MAAM,GAAG,KAAK,CAAC,GAAG,EAAE,GAAG,OAAO,MAAM,KAAK,CAAC;AAC3F,UAAM,SAAS,KAAK,cAAc,YAAY,KAAK,KAAK,aAAa,OAAO,KAAK,KAAK,aAAa;AACnG,UAAM,QAAQ,KAAK,cAAc,WAAW,KAAK,KAAK,YAAY,OAAO,KAAK,KAAK,YAAY;AAC/F,WAAO,YAAY,KAAK,GAAG,KAAK,GAAG,QAAQ,EAAE,GAAG,OAAO,IAAI,KAAK,cAAc,YAAY,EAAE,MAAM,SAAS,MAAM,QAAQ,IAAI,MAAM,IAAI,MAAM,KAAK,cAAc,UAAU,CAAC;AAC3K,WAAO,YAAY,KAAK,IAAI,OAAO,SAAS,GAAG,KAAK,GAAG,OAAO,EAAE,GAAG,OAAO,IAAI,KAAK,cAAc,WAAW,EAAE,MAAM,SAAS,MAAM,MAAM,IAAI,MAAM,IAAI,MAAM,KAAK,cAAc,SAAS,CAAC;AAAA,EAC9L;AACJ;;;ACtEA,SAAS,UAAAC,gBAAc;AACvB,SAAkC,eAAAC,eAAa,gBAAAC,gBAAc,oBAAAC,yBAAwB;AAY9E,IAAM,OAAN,cAAmBH,SAAO;AAAA,EACrB;AAAA,EACA,UAA+B,oBAAI,IAAI;AAAA,EACvC,UAA+B,oBAAI,IAAI;AAAA,EACvC,eAAe;AAAA,EACf,aAAa;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACR,YAAY;AAAA,EAEZ,YAAY,QAAqB,UAAuB,CAAC,GAAG;AACxD,UAAMC,cAAYC,eAAa,GAAG,EAAE,QAAQ,OAAO,SAAS,IAAI,GAAG,UAAU,EAAE,CAAC,CAAC;AACjF,SAAK,UAAU;AACf,SAAK,cAAc,QAAQ,cAAc,EAAE,MAAM,SAAS,MAAM,OAAO;AACvE,SAAK,cAAc,QAAQ,cAAc,EAAE,MAAM,SAAS,MAAM,MAAM;AACtE,SAAK,eAAe,QAAQ,eAAe,EAAE,MAAM,SAAS,MAAM,OAAO;AACzE,SAAK,YAAY,QAAQ;AACzB,eAAW,KAAK,OAAQ,MAAK,QAAQ,IAAI,EAAE,MAAM,EAAE;AAAA,EACvD;AAAA,EAEA,IAAI,SAAiC;AAAE,UAAM,IAA4B,CAAC;AAAG,eAAW,CAAC,GAAG,CAAC,KAAK,KAAK,QAAS,GAAE,CAAC,IAAI;AAAG,WAAO;AAAA,EAAG;AAAA,EACpI,YAAkB;AAAE,QAAI,KAAK,eAAe,KAAK,QAAQ,QAAQ;AAAE,WAAK;AAAgB,WAAK,aAAa;AAAG,WAAK,UAAU;AAAA,IAAG;AAAA,EAAE;AAAA,EACjI,YAAkB;AAAE,QAAI,KAAK,eAAe,GAAG;AAAE,WAAK;AAAgB,WAAK,cAAc,KAAK,QAAQ,IAAI,KAAK,QAAQ,KAAK,YAAY,EAAE,IAAI,KAAK,IAAI;AAAQ,WAAK,UAAU;AAAA,IAAG;AAAA,EAAE;AAAA,EACnL,WAAW,IAAkB;AACzB,QAAI,KAAK,gBAAgB,KAAK,QAAQ,OAAQ;AAC9C,UAAM,IAAI,KAAK,QAAQ,KAAK,YAAY;AAAG,UAAM,MAAM,KAAK,QAAQ,IAAI,EAAE,IAAI,KAAK;AACnF,SAAK,QAAQ,IAAI,EAAE,MAAM,IAAI,MAAM,GAAG,KAAK,UAAU,IAAI,KAAK,IAAI,MAAM,KAAK,UAAU,CAAC;AACxF,SAAK;AAAc,SAAK,QAAQ,OAAO,EAAE,IAAI;AAAG,SAAK,UAAU;AAAA,EACnE;AAAA,EACA,aAAmB;AACf,QAAI,KAAK,gBAAgB,KAAK,QAAQ,OAAQ;AAC9C,UAAM,IAAI,KAAK,QAAQ,KAAK,YAAY;AAAG,UAAM,MAAM,KAAK,QAAQ,IAAI,EAAE,IAAI,KAAK;AACnF,QAAI,KAAK,aAAa,GAAG;AAAE,WAAK,QAAQ,IAAI,EAAE,MAAM,IAAI,MAAM,GAAG,KAAK,aAAa,CAAC,IAAI,IAAI,MAAM,KAAK,UAAU,CAAC;AAAG,WAAK;AAAc,WAAK,UAAU;AAAA,IAAG;AAAA,EAC9J;AAAA,EACA,SAAe;AACX,SAAK,QAAQ,MAAM;AAAG,QAAI,SAAS;AACnC,eAAW,KAAK,KAAK,SAAS;AAC1B,YAAM,IAAI,KAAK,QAAQ,IAAI,EAAE,IAAI,KAAK;AACtC,UAAI,EAAE,YAAY,CAAC,EAAE,KAAK,GAAG;AAAE,aAAK,QAAQ,IAAI,EAAE,MAAM,GAAG,EAAE,KAAK,cAAc;AAAG,iBAAS;AAAA,MAAM;AAClG,UAAI,EAAE,UAAU;AAAE,cAAM,IAAI,EAAE,SAAS,CAAC;AAAG,YAAI,GAAG;AAAE,eAAK,QAAQ,IAAI,EAAE,MAAM,CAAC;AAAG,mBAAS;AAAA,QAAM;AAAA,MAAE;AAAA,IACtG;AACA,QAAI,CAAC,OAAQ,MAAK,YAAY,KAAK,MAAM;AACzC,SAAK,UAAU;AAAA,EACnB;AAAA,EAEU,YAAY,QAAsB;AACxC,UAAM,EAAE,GAAG,GAAG,OAAO,OAAO,IAAI,KAAK;AACrC,QAAI,SAAS,KAAK,UAAU,EAAG;AAC/B,UAAM,QAAQC,kBAAiB,KAAK,KAAK;AACzC,QAAI,MAAM;AACV,aAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,UAAU,MAAM,SAAS,GAAG,KAAK;AAC9D,YAAM,IAAI,KAAK,QAAQ,CAAC;AAAG,YAAM,SAAS,MAAM,KAAK;AACrD,YAAM,MAAM,KAAK,QAAQ,IAAI,EAAE,IAAI,KAAK;AAAI,YAAM,MAAM,KAAK,QAAQ,IAAI,EAAE,IAAI;AAC/E,aAAO,YAAY,GAAG,IAAI,KAAK,GAAG,EAAE,KAAK,GAAG,EAAE,WAAW,OAAO,EAAE,IAAI,MAAM,GAAG,KAAK,GAAG,EAAE,GAAG,OAAO,IAAI,MAAM,KAAK,cAAc,KAAK,aAAa,MAAM,OAAO,CAAC;AAAG;AACnK,UAAI,OAAO,OAAQ;AACnB,YAAM,UAAU,QAAQ,EAAE,eAAe;AACzC,aAAO,YAAY,GAAG,IAAI,KAAK,GAAG,SAAS,YAAO,IAAI,GAAG,OAAO,GAAG,MAAM,GAAG,KAAK,GAAG,EAAE,GAAG,OAAO,IAAI,SAAS,KAAK,eAAe,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,YAAY,CAAC;AAAG;AAAA,IAChL;AACA,QAAI,MAAM,QAAQ;AACd,YAAM,QAAQ,KAAK,gBAAgB,KAAK,QAAQ;AAChD,aAAO,YAAY,GAAG,IAAI,KAAK,QAAQ,iBAAiB,gBAAgB,EAAE,GAAG,OAAO,IAAI,QAAQ,EAAE,MAAM,SAAS,MAAM,QAAQ,IAAI,MAAM,IAAI,MAAM,MAAM,CAAC;AAAA,IAC9J;AAAA,EACJ;AACJ;;;AC9EA,SAAS,UAAAC,gBAAc;AACvB,SAAkC,eAAAC,eAAa,gBAAAC,gBAAc,oBAAAC,oBAAkB,kBAAAC,uBAAsB;AAK9F,IAAM,iBAAN,cAA6BJ,SAAO;AAAA,EAC/B;AAAA,EACA,YAAuB,CAAC;AAAA,EACxB,SAAS;AAAA,EACT,aAAa;AAAA,EACb,iBAAiB;AAAA,EACjB,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACR,YAAY;AAAA,EAEZ,YAAY,UAAqB,UAAiC,CAAC,GAAG;AAClE,UAAMC,cAAYC,eAAa,GAAG,CAAC,CAAC,CAAC;AACrC,SAAK,YAAY;AACjB,SAAK,YAAY,CAAC,GAAG,QAAQ;AAC7B,SAAK,eAAe,QAAQ,eAAe;AAC3C,SAAK,eAAe,QAAQ,eAAe,EAAE,MAAM,SAAS,MAAM,OAAO;AACzE,SAAK,eAAe,QAAQ,eAAe,EAAE,MAAM,SAAS,MAAM,OAAO;AACzE,SAAK,cAAc,QAAQ,cAAc;AAAA,EAC7C;AAAA,EAEA,IAAI,UAAmB;AAAE,WAAO,KAAK;AAAA,EAAU;AAAA,EAC/C,OAAa;AAAE,SAAK,WAAW;AAAM,SAAK,SAAS;AAAI,SAAK,aAAa;AAAG,SAAK,iBAAiB;AAAG,SAAK,YAAY,CAAC,GAAG,KAAK,SAAS;AAAG,SAAK,UAAU;AAAA,EAAG;AAAA,EAC7J,OAAa;AAAE,SAAK,WAAW;AAAO,SAAK,UAAU;AAAA,EAAG;AAAA,EACxD,SAAe;AAAE,SAAK,WAAW,KAAK,KAAK,IAAI,KAAK,KAAK;AAAA,EAAG;AAAA,EAC5D,WAAW,IAAkB;AAAE,SAAK,SAAS,KAAK,OAAO,MAAM,GAAG,KAAK,UAAU,IAAI,KAAK,KAAK,OAAO,MAAM,KAAK,UAAU;AAAG,SAAK;AAAc,SAAK,QAAQ;AAAG,SAAK,UAAU;AAAA,EAAG;AAAA,EACnL,aAAmB;AAAE,QAAI,KAAK,aAAa,GAAG;AAAE,WAAK,SAAS,KAAK,OAAO,MAAM,GAAG,KAAK,aAAa,CAAC,IAAI,KAAK,OAAO,MAAM,KAAK,UAAU;AAAG,WAAK;AAAc,WAAK,QAAQ;AAAG,WAAK,UAAU;AAAA,IAAG;AAAA,EAAE;AAAA,EACrM,aAAmB;AAAE,QAAI,KAAK,iBAAiB,KAAK,UAAU,SAAS,GAAG;AAAE,WAAK;AAAkB,WAAK,UAAU;AAAA,IAAG;AAAA,EAAE;AAAA,EACvH,aAAmB;AAAE,QAAI,KAAK,iBAAiB,GAAG;AAAE,WAAK;AAAkB,WAAK,UAAU;AAAA,IAAG;AAAA,EAAE;AAAA,EAC/F,UAAgB;AAAE,UAAM,IAAI,KAAK,UAAU,KAAK,cAAc;AAAG,QAAI,GAAG;AAAE,WAAK,KAAK;AAAG,QAAE,OAAO;AAAA,IAAG;AAAA,EAAE;AAAA,EAE7F,UAAgB;AACpB,UAAM,IAAI,KAAK,OAAO,YAAY;AAClC,QAAI,CAAC,GAAG;AAAE,WAAK,YAAY,CAAC,GAAG,KAAK,SAAS;AAAA,IAAG,OAAO;AACnD,WAAK,YAAY,KAAK,UAAU,OAAO,OAAK;AAAE,cAAM,IAAI,EAAE,MAAM,YAAY;AAAG,YAAI,KAAK;AAAG,iBAAS,IAAI,GAAG,IAAI,EAAE,UAAU,KAAK,EAAE,QAAQ,KAAK;AAAE,cAAI,EAAE,CAAC,MAAM,EAAE,EAAE,EAAG;AAAA,QAAM;AAAE,eAAO,OAAO,EAAE;AAAA,MAAQ,CAAC;AAAA,IAC1M;AACA,SAAK,iBAAiB;AAAA,EAC1B;AAAA,EAEU,YAAY,QAAsB;AACxC,QAAI,CAAC,KAAK,SAAU;AACpB,UAAM,EAAE,GAAG,GAAG,OAAO,OAAO,IAAI,KAAK;AACrC,UAAM,QAAQC,mBAAiB,KAAK,KAAK;AAEzC,aAAS,IAAI,GAAG,IAAI,QAAQ,IAAK,QAAO,YAAY,GAAG,IAAI,GAAG,SAAI,OAAO,KAAK,GAAG,EAAE,GAAG,OAAO,KAAK,KAAK,CAAC;AAExG,UAAM,MAAM,KAAK,UAAU,MAAM,GAAG,KAAK,WAAW;AACpD,UAAM,KAAK,KAAK,IAAI,IAAI,QAAQ,CAAC;AACjC,UAAM,KAAK,KAAK,IAAI,IAAI,SAAS,GAAG,SAAS,CAAC;AAC9C,UAAM,KAAK,IAAI,KAAK,OAAO,QAAQ,MAAM,CAAC;AAC1C,UAAM,KAAK,IAAI;AACf,UAAM,SAASC,gBAAe,QAAQ;AACtC,QAAI,CAAC,OAAQ;AACb,UAAM,KAAK,EAAE,GAAG,OAAO,IAAI,KAAK,aAAa;AAE7C,WAAO,YAAY,IAAI,IAAI,OAAO,UAAU,OAAO,IAAI,OAAO,KAAK,CAAC,IAAI,OAAO,UAAU,EAAE;AAE3F,WAAO,YAAY,IAAI,KAAK,GAAG,OAAO,MAAM,EAAE;AAC9C,UAAM,QAAQ,KAAK,UAAU,KAAK;AAClC,WAAO,YAAY,KAAK,GAAG,KAAK,IAAI,gBAAS,OAAO,MAAM,GAAG,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC,GAAG,EAAE,GAAG,OAAO,KAAK,CAAC,KAAK,OAAO,CAAC;AACpH,WAAO,YAAY,KAAK,KAAK,GAAG,KAAK,GAAG,OAAO,OAAO,EAAE;AAExD,WAAO,YAAY,IAAI,KAAK,GAAG,OAAO,OAAO,SAAI,OAAO,KAAK,CAAC,IAAI,OAAO,OAAO,EAAE;AAElF,aAAS,IAAI,GAAG,IAAI,IAAI,UAAU,IAAI,IAAI,KAAK,GAAG,KAAK;AACnD,YAAM,IAAI,IAAI,CAAC;AAAG,YAAM,SAAS,MAAM,KAAK;AAC5C,YAAM,SAAS,SAAS,YAAO,QAAQ,EAAE;AACzC,YAAM,KAAK,EAAE,YAAY;AACzB,aAAO,YAAY,IAAI,KAAK,IAAI,GAAG,OAAO,MAAM,EAAE;AAClD,aAAO,YAAY,KAAK,GAAG,KAAK,IAAI,IAAI,MAAM,OAAO,MAAM,GAAG,KAAK,GAAG,SAAS,CAAC,EAAE,OAAO,KAAK,GAAG,SAAS,CAAC,GAAG,EAAE,GAAG,OAAO,IAAI,SAAS,KAAK,eAAe,MAAM,IAAI,MAAM,OAAO,CAAC;AACnL,UAAI,GAAI,QAAO,YAAY,KAAK,KAAK,GAAG,SAAS,GAAG,KAAK,IAAI,GAAG,IAAI,EAAE,GAAG,OAAO,KAAK,KAAK,CAAC;AAC3F,aAAO,YAAY,KAAK,KAAK,GAAG,KAAK,IAAI,GAAG,OAAO,OAAO,EAAE;AAAA,IAChE;AAEA,UAAM,OAAO,KAAK,IAAI,KAAK,IAAI,IAAI,QAAQ,KAAK,KAAK,CAAC;AACtD,WAAO,YAAY,IAAI,MAAM,OAAO,aAAa,OAAO,OAAO,OAAO,KAAK,CAAC,IAAI,OAAO,aAAa,EAAE;AAAA,EAC1G;AACJ;","names":["Widget","Widget","mergeStyles","defaultStyle","Widget","mergeStyles","defaultStyle","styleToCellAttrs","Widget","mergeStyles","defaultStyle","styleToCellAttrs","Widget","mergeStyles","defaultStyle","styleToCellAttrs","Widget","mergeStyles","defaultStyle","styleToCellAttrs","Widget","mergeStyles","defaultStyle","styleToCellAttrs","Widget","mergeStyles","defaultStyle","styleToCellAttrs","Widget","mergeStyles","defaultStyle","styleToCellAttrs","getBorderChars","Widget","mergeStyles","defaultStyle","styleToCellAttrs","Widget","mergeStyles","defaultStyle","styleToCellAttrs","getBorderChars"]}
|
|
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":["Widget","Widget","mergeStyles","defaultStyle","Widget","mergeStyles","defaultStyle","styleToCellAttrs","Widget","mergeStyles","defaultStyle","styleToCellAttrs","caps","Widget","mergeStyles","defaultStyle","styleToCellAttrs","caps","Widget","mergeStyles","defaultStyle","styleToCellAttrs","caps","Widget","mergeStyles","defaultStyle","styleToCellAttrs","caps","path","Widget","mergeStyles","defaultStyle","styleToCellAttrs","caps","Widget","mergeStyles","defaultStyle","styleToCellAttrs","getBorderChars","Widget","mergeStyles","defaultStyle","styleToCellAttrs","Widget","mergeStyles","defaultStyle","styleToCellAttrs","getBorderChars","caps","Widget","caps","Widget","styleToCellAttrs","caps","Widget","styleToCellAttrs","truncate","Widget","styleToCellAttrs","truncate","caps","Widget","styleToCellAttrs","caps"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@termuijs/ui",
|
|
3
|
-
"
|
|
3
|
+
"homepage": "https://www.termui.io/docs/ui/overview",
|
|
4
|
+
"repository": {
|
|
5
|
+
"type": "git",
|
|
6
|
+
"url": "https://github.com/Karanjot786/TermUI"
|
|
7
|
+
},
|
|
8
|
+
"version": "0.1.4",
|
|
4
9
|
"description": "Modal, Select, Tabs, Toast, Form, Tree, and CommandPalette for TermUI",
|
|
5
10
|
"type": "module",
|
|
6
11
|
"main": "./dist/index.cjs",
|
|
@@ -20,8 +25,9 @@
|
|
|
20
25
|
"access": "public"
|
|
21
26
|
},
|
|
22
27
|
"dependencies": {
|
|
23
|
-
"@termuijs/core": "0.1.
|
|
24
|
-
"@termuijs/
|
|
28
|
+
"@termuijs/core": "0.1.4",
|
|
29
|
+
"@termuijs/jsx": "0.1.4",
|
|
30
|
+
"@termuijs/widgets": "0.1.4"
|
|
25
31
|
},
|
|
26
32
|
"devDependencies": {
|
|
27
33
|
"tsup": "^8.0.0",
|