@termuijs/ui 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +780 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +285 -0
- package/dist/index.d.ts +285 -0
- package/dist/index.js +746 -0
- package/dist/index.js.map +1 -0
- package/package.json +45 -0
|
@@ -0,0 +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; }\n nextTab(): void { this._activeIndex = (this._activeIndex + 1) % this._tabs.length; }\n prevTab(): void { this._activeIndex = (this._activeIndex - 1 + this._tabs.length) % this._tabs.length; }\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; }\n hide(): void { this._visible = false; }\n toggle(): void { this._visible = !this._visible; }\n setContent(content: Widget): void { this._content = content; }\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; }\n close(): void { this._isOpen = false; }\n toggle(): void { this._isOpen = !this._isOpen; }\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;\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;\n }\n confirm(): void {\n const opt = this._options[this._selectedIndex];\n if (opt && !opt.disabled) { this._onSelect?.(opt, this._selectedIndex); this._isOpen = false; }\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; }\n selectPrev(): void { let n = this._cursorIndex - 1; while (n >= 0 && this._options[n].disabled) n--; if (n >= 0) this._cursorIndex = n; }\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); }\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++; }\n selectPrev(): void { if (this._cursorIndex > 0) this._cursorIndex--; }\n toggleExpand(): void { const f = this._flatten(); const it = f[this._cursorIndex]; if (it?.hasChildren) it.node.expanded = !it.node.expanded; }\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 }); }\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'; }\n hide(): void { this._visible = false; }\n selectConfirm(): void { this._selected = 'confirm'; }\n selectCancel(): void { this._selected = 'cancel'; }\n toggleSelection(): void { this._selected = this._selected === 'confirm' ? 'cancel' : 'confirm'; }\n confirm(): void {\n (this._selected === 'confirm' ? this._onConfirm : this._onCancel)?.();\n this._visible = false;\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; } }\n prevField(): void { if (this._activeField > 0) { this._activeField--; this._cursorPos = (this._values.get(this._fields[this._activeField].name) ?? '').length; } }\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);\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--; }\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 }\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]; }\n hide(): void { this._visible = false; }\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(); }\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(); } }\n selectNext(): void { if (this._selectedIndex < this._filtered.length - 1) this._selectedIndex++; }\n selectPrev(): void { if (this._selectedIndex > 0) this._selectedIndex--; }\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":"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","names":["import_widgets","import_widgets","import_core","import_widgets","import_core","import_widgets","import_core","import_widgets","import_core","import_widgets","import_core","import_widgets","import_core","import_widgets","import_core","import_widgets","import_core","import_widgets","import_core","import_widgets","import_core"]}
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
import { Widget } from '@termuijs/widgets';
|
|
2
|
+
export { Box, Gauge, List, LogView, ProgressBar, Sparkline, Spinner, StatusIndicator, Table, Text, TextInput, Widget } from '@termuijs/widgets';
|
|
3
|
+
import { Style, Screen } from '@termuijs/core';
|
|
4
|
+
|
|
5
|
+
interface DividerOptions {
|
|
6
|
+
char?: string;
|
|
7
|
+
color?: Style['fg'];
|
|
8
|
+
title?: string;
|
|
9
|
+
}
|
|
10
|
+
declare class Divider extends Widget {
|
|
11
|
+
private _char;
|
|
12
|
+
private _color;
|
|
13
|
+
private _title;
|
|
14
|
+
constructor(options?: DividerOptions);
|
|
15
|
+
protected _renderSelf(screen: Screen): void;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
declare class Spacer extends Widget {
|
|
19
|
+
constructor(grow?: number);
|
|
20
|
+
protected _renderSelf(_screen: Screen): void;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
interface Tab {
|
|
24
|
+
label: string;
|
|
25
|
+
content: Widget;
|
|
26
|
+
}
|
|
27
|
+
interface TabsOptions {
|
|
28
|
+
activeColor?: Style['fg'];
|
|
29
|
+
inactiveColor?: Style['fg'];
|
|
30
|
+
border?: Style['border'];
|
|
31
|
+
}
|
|
32
|
+
declare class Tabs extends Widget {
|
|
33
|
+
private _tabs;
|
|
34
|
+
private _activeIndex;
|
|
35
|
+
private _activeColor;
|
|
36
|
+
private _inactiveColor;
|
|
37
|
+
focusable: boolean;
|
|
38
|
+
constructor(tabs: Tab[], options?: TabsOptions);
|
|
39
|
+
get activeIndex(): number;
|
|
40
|
+
selectTab(i: number): void;
|
|
41
|
+
nextTab(): void;
|
|
42
|
+
prevTab(): void;
|
|
43
|
+
get activeContent(): Widget | undefined;
|
|
44
|
+
protected _renderSelf(screen: Screen): void;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
interface ModalOptions {
|
|
48
|
+
title?: string;
|
|
49
|
+
width?: number;
|
|
50
|
+
height?: number;
|
|
51
|
+
borderColor?: Style['fg'];
|
|
52
|
+
backdropChar?: string;
|
|
53
|
+
}
|
|
54
|
+
declare class Modal extends Widget {
|
|
55
|
+
private _title;
|
|
56
|
+
private _modalWidth;
|
|
57
|
+
private _modalHeight;
|
|
58
|
+
private _borderColor;
|
|
59
|
+
private _backdropChar;
|
|
60
|
+
private _visible;
|
|
61
|
+
private _content;
|
|
62
|
+
constructor(options?: ModalOptions);
|
|
63
|
+
get visible(): boolean;
|
|
64
|
+
show(): void;
|
|
65
|
+
hide(): void;
|
|
66
|
+
toggle(): void;
|
|
67
|
+
setContent(content: Widget): void;
|
|
68
|
+
protected _renderSelf(screen: Screen): void;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
interface SelectOption {
|
|
72
|
+
label: string;
|
|
73
|
+
value: string;
|
|
74
|
+
disabled?: boolean;
|
|
75
|
+
}
|
|
76
|
+
interface SelectOptions {
|
|
77
|
+
placeholder?: string;
|
|
78
|
+
activeColor?: Style['fg'];
|
|
79
|
+
onSelect?: (option: SelectOption, index: number) => void;
|
|
80
|
+
}
|
|
81
|
+
declare class Select extends Widget {
|
|
82
|
+
private _options;
|
|
83
|
+
private _selectedIndex;
|
|
84
|
+
private _isOpen;
|
|
85
|
+
private _placeholder;
|
|
86
|
+
private _activeColor;
|
|
87
|
+
private _onSelect?;
|
|
88
|
+
focusable: boolean;
|
|
89
|
+
constructor(options: SelectOption[], config?: SelectOptions);
|
|
90
|
+
get selectedOption(): SelectOption | undefined;
|
|
91
|
+
get selectedIndex(): number;
|
|
92
|
+
get isOpen(): boolean;
|
|
93
|
+
open(): void;
|
|
94
|
+
close(): void;
|
|
95
|
+
toggle(): void;
|
|
96
|
+
selectNext(): void;
|
|
97
|
+
selectPrev(): void;
|
|
98
|
+
confirm(): void;
|
|
99
|
+
protected _renderSelf(screen: Screen): void;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
interface MultiSelectOption {
|
|
103
|
+
label: string;
|
|
104
|
+
value: string;
|
|
105
|
+
disabled?: boolean;
|
|
106
|
+
}
|
|
107
|
+
interface MultiSelectOptions {
|
|
108
|
+
activeColor?: Style['fg'];
|
|
109
|
+
checkChar?: string;
|
|
110
|
+
uncheckChar?: string;
|
|
111
|
+
onSubmit?: (selected: MultiSelectOption[]) => void;
|
|
112
|
+
}
|
|
113
|
+
declare class MultiSelect extends Widget {
|
|
114
|
+
private _options;
|
|
115
|
+
private _cursorIndex;
|
|
116
|
+
private _checked;
|
|
117
|
+
private _activeColor;
|
|
118
|
+
private _checkChar;
|
|
119
|
+
private _uncheckChar;
|
|
120
|
+
private _onSubmit?;
|
|
121
|
+
focusable: boolean;
|
|
122
|
+
constructor(options: MultiSelectOption[], config?: MultiSelectOptions);
|
|
123
|
+
get selectedOptions(): MultiSelectOption[];
|
|
124
|
+
selectNext(): void;
|
|
125
|
+
selectPrev(): void;
|
|
126
|
+
toggleCurrent(): void;
|
|
127
|
+
submit(): void;
|
|
128
|
+
protected _renderSelf(screen: Screen): void;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
interface TreeNode {
|
|
132
|
+
label: string;
|
|
133
|
+
children?: TreeNode[];
|
|
134
|
+
expanded?: boolean;
|
|
135
|
+
icon?: string;
|
|
136
|
+
}
|
|
137
|
+
interface TreeOptions {
|
|
138
|
+
activeColor?: Style['fg'];
|
|
139
|
+
onSelect?: (node: TreeNode, path: number[]) => void;
|
|
140
|
+
}
|
|
141
|
+
declare class Tree extends Widget {
|
|
142
|
+
private _roots;
|
|
143
|
+
private _cursorIndex;
|
|
144
|
+
private _activeColor;
|
|
145
|
+
private _onSelect?;
|
|
146
|
+
focusable: boolean;
|
|
147
|
+
constructor(roots: TreeNode[], options?: TreeOptions);
|
|
148
|
+
private _flatten;
|
|
149
|
+
selectNext(): void;
|
|
150
|
+
selectPrev(): void;
|
|
151
|
+
toggleExpand(): void;
|
|
152
|
+
confirm(): void;
|
|
153
|
+
protected _renderSelf(screen: Screen): void;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
type ToastType = 'info' | 'success' | 'warning' | 'error';
|
|
157
|
+
interface ToastMessage {
|
|
158
|
+
text: string;
|
|
159
|
+
type: ToastType;
|
|
160
|
+
expireAt: number;
|
|
161
|
+
}
|
|
162
|
+
interface ToastOptions {
|
|
163
|
+
position?: 'top-right' | 'bottom-right' | 'top-left' | 'bottom-left';
|
|
164
|
+
durationMs?: number;
|
|
165
|
+
maxVisible?: number;
|
|
166
|
+
}
|
|
167
|
+
declare class Toast extends Widget {
|
|
168
|
+
private _messages;
|
|
169
|
+
private _position;
|
|
170
|
+
private _durationMs;
|
|
171
|
+
private _maxVisible;
|
|
172
|
+
constructor(options?: ToastOptions);
|
|
173
|
+
push(text: string, type?: ToastType): void;
|
|
174
|
+
info(text: string): void;
|
|
175
|
+
success(text: string): void;
|
|
176
|
+
warning(text: string): void;
|
|
177
|
+
error(text: string): void;
|
|
178
|
+
protected _renderSelf(screen: Screen): void;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
interface ConfirmDialogOptions {
|
|
182
|
+
message: string;
|
|
183
|
+
confirmLabel?: string;
|
|
184
|
+
cancelLabel?: string;
|
|
185
|
+
borderColor?: Style['fg'];
|
|
186
|
+
onConfirm?: () => void;
|
|
187
|
+
onCancel?: () => void;
|
|
188
|
+
}
|
|
189
|
+
declare class ConfirmDialog extends Widget {
|
|
190
|
+
private _message;
|
|
191
|
+
private _confirmLabel;
|
|
192
|
+
private _cancelLabel;
|
|
193
|
+
private _borderColor;
|
|
194
|
+
private _selected;
|
|
195
|
+
private _visible;
|
|
196
|
+
private _onConfirm?;
|
|
197
|
+
private _onCancel?;
|
|
198
|
+
focusable: boolean;
|
|
199
|
+
constructor(options: ConfirmDialogOptions);
|
|
200
|
+
get visible(): boolean;
|
|
201
|
+
show(): void;
|
|
202
|
+
hide(): void;
|
|
203
|
+
selectConfirm(): void;
|
|
204
|
+
selectCancel(): void;
|
|
205
|
+
toggleSelection(): void;
|
|
206
|
+
confirm(): void;
|
|
207
|
+
protected _renderSelf(screen: Screen): void;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
interface FormField {
|
|
211
|
+
name: string;
|
|
212
|
+
label: string;
|
|
213
|
+
type: 'text' | 'select' | 'checkbox';
|
|
214
|
+
placeholder?: string;
|
|
215
|
+
required?: boolean;
|
|
216
|
+
options?: string[];
|
|
217
|
+
validate?: (value: string) => string | null;
|
|
218
|
+
}
|
|
219
|
+
interface FormOptions {
|
|
220
|
+
labelColor?: Style['fg'];
|
|
221
|
+
errorColor?: Style['fg'];
|
|
222
|
+
activeColor?: Style['fg'];
|
|
223
|
+
onSubmit?: (values: Record<string, string>) => void;
|
|
224
|
+
}
|
|
225
|
+
declare class Form extends Widget {
|
|
226
|
+
private _fields;
|
|
227
|
+
private _values;
|
|
228
|
+
private _errors;
|
|
229
|
+
private _activeField;
|
|
230
|
+
private _cursorPos;
|
|
231
|
+
private _labelColor;
|
|
232
|
+
private _errorColor;
|
|
233
|
+
private _activeColor;
|
|
234
|
+
private _onSubmit?;
|
|
235
|
+
focusable: boolean;
|
|
236
|
+
constructor(fields: FormField[], options?: FormOptions);
|
|
237
|
+
get values(): Record<string, string>;
|
|
238
|
+
nextField(): void;
|
|
239
|
+
prevField(): void;
|
|
240
|
+
insertChar(ch: string): void;
|
|
241
|
+
deleteBack(): void;
|
|
242
|
+
submit(): void;
|
|
243
|
+
protected _renderSelf(screen: Screen): void;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
interface Command {
|
|
247
|
+
id: string;
|
|
248
|
+
label: string;
|
|
249
|
+
shortcut?: string;
|
|
250
|
+
action: () => void;
|
|
251
|
+
category?: string;
|
|
252
|
+
}
|
|
253
|
+
interface CommandPaletteOptions {
|
|
254
|
+
placeholder?: string;
|
|
255
|
+
borderColor?: Style['fg'];
|
|
256
|
+
activeColor?: Style['fg'];
|
|
257
|
+
maxVisible?: number;
|
|
258
|
+
}
|
|
259
|
+
declare class CommandPalette extends Widget {
|
|
260
|
+
private _commands;
|
|
261
|
+
private _filtered;
|
|
262
|
+
private _query;
|
|
263
|
+
private _cursorPos;
|
|
264
|
+
private _selectedIndex;
|
|
265
|
+
private _visible;
|
|
266
|
+
private _placeholder;
|
|
267
|
+
private _borderColor;
|
|
268
|
+
private _activeColor;
|
|
269
|
+
private _maxVisible;
|
|
270
|
+
focusable: boolean;
|
|
271
|
+
constructor(commands: Command[], options?: CommandPaletteOptions);
|
|
272
|
+
get visible(): boolean;
|
|
273
|
+
show(): void;
|
|
274
|
+
hide(): void;
|
|
275
|
+
toggle(): void;
|
|
276
|
+
insertChar(ch: string): void;
|
|
277
|
+
deleteBack(): void;
|
|
278
|
+
selectNext(): void;
|
|
279
|
+
selectPrev(): void;
|
|
280
|
+
confirm(): void;
|
|
281
|
+
private _filter;
|
|
282
|
+
protected _renderSelf(screen: Screen): void;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
export { type Command, CommandPalette, type CommandPaletteOptions, ConfirmDialog, type ConfirmDialogOptions, Divider, type DividerOptions, Form, type FormField, type FormOptions, Modal, type ModalOptions, MultiSelect, type MultiSelectOption, type MultiSelectOptions, Select, type SelectOption, type SelectOptions, Spacer, type Tab, Tabs, type TabsOptions, Toast, type ToastMessage, type ToastOptions, type ToastType, Tree, type TreeNode, type TreeOptions };
|