@termuijs/widgets 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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/base/Widget.ts","../src/display/Box.ts","../src/display/Text.ts","../src/display/LogView.ts","../src/input/List.ts","../src/input/TextInput.ts","../src/data/Table.ts","../src/data/Gauge.ts","../src/data/Sparkline.ts","../src/data/StatusIndicator.ts","../src/feedback/ProgressBar.ts","../src/feedback/Spinner.ts"],"sourcesContent":["// ─────────────────────────────────────────────────────\n// @termuijs/widgets — Public API\n// ─────────────────────────────────────────────────────\n\n// ── Base ──────────────────────────────────────────────\nexport { Widget } from './base/Widget.js';\nexport type { WidgetEvents } from './base/Widget.js';\n\n// ── Display Widgets ───────────────────────────────────\nexport { Box } from './display/Box.js';\nexport { Text } from './display/Text.js';\nexport type { TextProps } from './display/Text.js';\nexport { LogView } from './display/LogView.js';\nexport type { LogViewOptions } from './display/LogView.js';\n\n// ── Input Widgets ─────────────────────────────────────\nexport { List } from './input/List.js';\nexport type { ListItem } from './input/List.js';\nexport { TextInput } from './input/TextInput.js';\n\n// ── Data Widgets ──────────────────────────────────────\nexport { Table } from './data/Table.js';\nexport type { TableColumn, TableRow, TableOptions } from './data/Table.js';\nexport { Gauge } from './data/Gauge.js';\nexport type { GaugeOptions } from './data/Gauge.js';\nexport { Sparkline } from './data/Sparkline.js';\nexport type { SparklineOptions } from './data/Sparkline.js';\nexport { StatusIndicator } from './data/StatusIndicator.js';\nexport type { StatusIndicatorOptions } from './data/StatusIndicator.js';\n\n// ── Feedback Widgets ──────────────────────────────────\nexport { ProgressBar } from './feedback/ProgressBar.js';\nexport type { ProgressBarOptions } from './feedback/ProgressBar.js';\nexport { Spinner, SPINNER_FRAMES } from './feedback/Spinner.js';\nexport type { SpinnerOptions } from './feedback/Spinner.js';\n","// ─────────────────────────────────────────────────────\n// @termuijs/widgets — Base Widget class\n// ─────────────────────────────────────────────────────\n\nimport {\n type Screen,\n type Style,\n type LayoutNode,\n type Rect,\n type KeyEvent,\n type MouseEvent as TermMouseEvent,\n defaultStyle,\n mergeStyles,\n createLayoutNode,\n EventEmitter,\n normalizeEdges,\n getBorderChars,\n styleToCellAttrs,\n containsPoint,\n} from '@termuijs/core';\n\n/**\n * Event map for widgets.\n */\nexport interface WidgetEvents {\n key: KeyEvent;\n mouse: TermMouseEvent;\n focus: void;\n blur: void;\n mount: void;\n unmount: void;\n}\n\nlet _widgetIdCounter = 0;\n\n/**\n * Base class for all TermUI widgets.\n *\n * Provides:\n * - Unique ID generation\n * - Style management and merging\n * - Layout node generation with rect sync\n * - Border/padding rendering into the screen buffer\n * - Child management\n * - Focus support\n * - Event emission\n */\nexport abstract class Widget {\n /** Unique widget identifier */\n readonly id: string;\n\n /** Widget's style */\n protected _style: Style;\n\n /** Child widgets */\n protected _children: Widget[] = [];\n\n /** Parent widget (null for root) */\n parent: Widget | null = null;\n\n /** Computed layout rectangle */\n protected _rect: Rect = { x: 0, y: 0, width: 0, height: 0 };\n\n /** Reference to the layout node (set during getLayoutNode) */\n private _layoutNode: LayoutNode | null = null;\n\n /** Whether this widget can receive focus */\n focusable = false;\n\n /** Tab index for focus ordering */\n tabIndex = 0;\n\n /** Event emitter for this widget */\n readonly events = new EventEmitter<WidgetEvents>();\n\n /** Whether the widget is currently focused */\n isFocused = false;\n\n /**\n * Dirty flag — true when this widget needs re-rendering.\n * Newly created widgets start dirty.\n */\n protected _dirty = true;\n\n constructor(style: Partial<Style> = {}) {\n this.id = `widget_${++_widgetIdCounter}`;\n this._style = mergeStyles(defaultStyle(), style);\n }\n\n /** Get the current style */\n get style(): Style { return this._style; }\n\n /** Update the style (merge with existing) */\n setStyle(style: Partial<Style>): void {\n this._style = mergeStyles(this._style, style);\n this.markDirty();\n }\n\n /** Get the computed rect after layout */\n get rect(): Rect { return this._rect; }\n\n /** Add a child widget */\n addChild(child: Widget): void {\n child.parent = this;\n this._children.push(child);\n }\n\n /** Remove a child widget */\n removeChild(child: Widget): void {\n const idx = this._children.indexOf(child);\n if (idx >= 0) {\n this._children.splice(idx, 1);\n child.parent = null;\n }\n }\n\n /** Remove all children */\n clearChildren(): void {\n for (const child of this._children) {\n child.parent = null;\n }\n this._children = [];\n }\n\n /** Get all children */\n get children(): ReadonlyArray<Widget> { return this._children; }\n\n /**\n * Build the LayoutNode tree for this widget.\n * Stores a reference so we can sync computed rects back via syncLayout().\n */\n getLayoutNode(): LayoutNode {\n const childNodes = this._children\n .filter(c => c.style.visible !== false)\n .map(c => c.getLayoutNode());\n\n this._layoutNode = createLayoutNode(this.id, this._style, childNodes);\n return this._layoutNode;\n }\n\n /**\n * After computeLayout() has been called, sync the computed rects\n * from the layout tree back into widget `_rect` fields.\n * This MUST be called after computeLayout() and before render().\n */\n syncLayout(): void {\n if (this._layoutNode) {\n this._rect = { ...this._layoutNode.computed };\n }\n\n // Sync children (match visible children to layout node children)\n const visibleChildren = this._children.filter(c => c.style.visible !== false);\n for (let i = 0; i < visibleChildren.length; i++) {\n visibleChildren[i].syncLayout();\n }\n }\n\n /**\n * Render this widget (and children) into the screen buffer.\n * Automatically pushes a clip region if overflow is hidden (default).\n */\n render(screen: Screen): void {\n if (this._style.visible === false) return;\n\n // Push clip region if overflow is hidden (default style)\n const shouldClip = this._style.overflow !== 'visible';\n if (shouldClip) {\n screen.pushClip(this._rect);\n }\n\n // Render own content\n this._renderSelf(screen);\n\n // Render border\n this._renderBorder(screen);\n\n // Render children\n for (const child of this._children) {\n child.render(screen);\n }\n\n // Pop clip region\n if (shouldClip) {\n screen.popClip();\n }\n }\n\n /**\n * Override this to render the widget's own content.\n * The rect is available as `this._rect`.\n */\n protected abstract _renderSelf(screen: Screen): void;\n\n /**\n * Update the computed rect from layout results.\n */\n updateRect(rect: Rect): void {\n this._rect = rect;\n }\n\n /**\n * Mark this widget as needing re-render.\n * Propagates up to parent so the render loop can detect changes.\n */\n markDirty(): void {\n if (this._dirty) return; // Already dirty\n this._dirty = true;\n this.parent?.markDirty();\n }\n\n /**\n * Clear the dirty flag after rendering.\n */\n clearDirty(): void {\n this._dirty = false;\n for (const child of this._children) {\n child.clearDirty();\n }\n }\n\n /** Check if this widget (or any child) needs re-rendering */\n get isDirty(): boolean { return this._dirty; }\n\n /**\n * Render the border around this widget, including focus ring if focused.\n */\n protected _renderBorder(screen: Screen): void {\n const border = this._style.border;\n const hasBorder = border && border !== 'none';\n const showFocusRing = this.isFocused && this.focusable\n && this._style.focusRingStyle !== 'none';\n\n if (!hasBorder && !showFocusRing) return;\n\n const { x, y, width, height } = this._rect;\n if (width < 2 || height < 2) return;\n\n if (hasBorder) {\n const chars = getBorderChars(border);\n if (!chars) return;\n\n const attrs = styleToCellAttrs(this._style);\n const borderFg = this._style.borderColor ?? attrs.fg;\n\n // Use focus ring color when focused, otherwise normal border color\n const fg = showFocusRing\n ? (this._style.focusRingColor ?? { type: 'named' as const, name: 'cyan' as const })\n : borderFg;\n const cellStyle = { fg };\n\n // Top edge\n screen.setCell(x, y, { char: chars.topLeft, ...cellStyle });\n for (let c = 1; c < width - 1; c++) {\n screen.setCell(x + c, y, { char: chars.top, ...cellStyle });\n }\n screen.setCell(x + width - 1, y, { char: chars.topRight, ...cellStyle });\n\n // Bottom edge\n screen.setCell(x, y + height - 1, { char: chars.bottomLeft, ...cellStyle });\n for (let c = 1; c < width - 1; c++) {\n screen.setCell(x + c, y + height - 1, { char: chars.bottom, ...cellStyle });\n }\n screen.setCell(x + width - 1, y + height - 1, { char: chars.bottomRight, ...cellStyle });\n\n // Left and right edges\n for (let r = 1; r < height - 1; r++) {\n screen.setCell(x, y + r, { char: chars.left, ...cellStyle });\n screen.setCell(x + width - 1, y + r, { char: chars.right, ...cellStyle });\n }\n } else if (showFocusRing) {\n // No border — render corner bracket focus indicators\n const fg = this._style.focusRingColor ?? { type: 'named' as const, name: 'cyan' as const };\n const cellStyle = { fg, bold: true };\n\n // Top-left corner\n screen.setCell(x, y, { char: '┌', ...cellStyle });\n if (width > 2) screen.setCell(x + 1, y, { char: '─', ...cellStyle });\n\n // Top-right corner\n screen.setCell(x + width - 1, y, { char: '┐', ...cellStyle });\n if (width > 2) screen.setCell(x + width - 2, y, { char: '─', ...cellStyle });\n\n // Bottom-left corner\n screen.setCell(x, y + height - 1, { char: '└', ...cellStyle });\n if (width > 2) screen.setCell(x + 1, y + height - 1, { char: '─', ...cellStyle });\n\n // Bottom-right corner\n screen.setCell(x + width - 1, y + height - 1, { char: '┘', ...cellStyle });\n if (width > 2) screen.setCell(x + width - 2, y + height - 1, { char: '─', ...cellStyle });\n\n // Short vertical marks if tall enough\n if (height > 2) {\n screen.setCell(x, y + 1, { char: '│', ...cellStyle });\n screen.setCell(x + width - 1, y + 1, { char: '│', ...cellStyle });\n screen.setCell(x, y + height - 2, { char: '│', ...cellStyle });\n screen.setCell(x + width - 1, y + height - 2, { char: '│', ...cellStyle });\n }\n }\n }\n\n /**\n * Get the inner content area (after border + padding).\n */\n protected _getContentRect(): Rect {\n const padding = normalizeEdges(this._style.padding);\n const border = this._style.border && this._style.border !== 'none' ? 1 : 0;\n\n return {\n x: this._rect.x + padding.left + border,\n y: this._rect.y + padding.top + border,\n width: Math.max(0, this._rect.width - padding.left - padding.right - border * 2),\n height: Math.max(0, this._rect.height - padding.top - padding.bottom - border * 2),\n };\n }\n\n /**\n * Check if a point hits this widget.\n */\n hitTest(x: number, y: number): boolean {\n return containsPoint(this._rect, x, y);\n }\n\n /** Lifecycle: called when the widget is mounted */\n mount(): void {\n this.events.emit('mount', undefined as any);\n for (const child of this._children) {\n child.mount();\n }\n }\n\n /** Lifecycle: called when the widget is unmounted */\n unmount(): void {\n for (const child of this._children) {\n child.unmount();\n }\n this.events.emit('unmount', undefined as any);\n }\n}\n","// ─────────────────────────────────────────────────────\n// @termuijs/widgets — Box widget\n// ─────────────────────────────────────────────────────\n\nimport type { Screen, Style } from '@termuijs/core';\nimport { styleToCellAttrs } from '@termuijs/core';\nimport { Widget } from '../base/Widget.js';\n\n/**\n * Box — the fundamental container widget, similar to a `<div>`.\n *\n * Supports:\n * - Flexbox layout (row/column)\n * - Border styles (single/double/round/heavy/dashed)\n * - Padding and margin\n * - Background color\n */\nexport class Box extends Widget {\n constructor(style: Partial<Style> = {}) {\n super(style);\n }\n\n protected _renderSelf(screen: Screen): void {\n const { bg } = styleToCellAttrs(this._style);\n if (bg.type === 'none') return;\n\n const { x, y, width, height } = this._rect;\n const border = this._style.border && this._style.border !== 'none' ? 1 : 0;\n\n // Fill background\n for (let r = border; r < height - border; r++) {\n for (let c = border; c < width - border; c++) {\n screen.setCell(x + c, y + r, { char: ' ', bg });\n }\n }\n }\n}\n","// ─────────────────────────────────────────────────────\n// @termuijs/widgets — Text widget\n// ─────────────────────────────────────────────────────\n\nimport { type Screen, type Style, styleToCellAttrs, wordWrap, stringWidth } from '@termuijs/core';\nimport { Widget } from '../base/Widget.js';\n\nexport interface TextProps {\n content: string;\n wrap?: boolean;\n align?: 'left' | 'center' | 'right';\n}\n\n/**\n * Text — renders a string of text with word-wrapping and alignment.\n */\nexport class Text extends Widget {\n private _content: string;\n private _wrap: boolean;\n private _align: 'left' | 'center' | 'right';\n\n constructor(content: string, style: Partial<Style> = {}, props: Partial<TextProps> = {}) {\n super(style);\n this._content = content;\n this._wrap = props.wrap ?? true;\n this._align = props.align ?? 'left';\n }\n\n /** Update the text content */\n setContent(content: string): void {\n this._content = content;\n }\n\n /** Get current text content */\n getContent(): string {\n return this._content;\n }\n\n protected _renderSelf(screen: Screen): void {\n const contentRect = this._getContentRect();\n const { x, y, width, height } = contentRect;\n if (width <= 0 || height <= 0) return;\n\n const attrs = styleToCellAttrs(this._style);\n\n // Word-wrap if enabled\n let text = this._wrap ? wordWrap(this._content, width) : this._content;\n const lines = text.split('\\n');\n\n for (let i = 0; i < Math.min(lines.length, height); i++) {\n let line = lines[i];\n const lineWidth = stringWidth(line);\n\n // Apply alignment\n let offsetX = 0;\n if (this._align === 'center') {\n offsetX = Math.floor((width - lineWidth) / 2);\n } else if (this._align === 'right') {\n offsetX = width - lineWidth;\n }\n\n screen.writeString(x + Math.max(0, offsetX), y + i, line, attrs);\n }\n }\n}\n","// ─────────────────────────────────────────────────────\n// @termuijs/widgets — LogView widget (scrollable log)\n// ─────────────────────────────────────────────────────\n\nimport { type Screen, type Style, type Color, styleToCellAttrs, truncate } from '@termuijs/core';\nimport { Widget } from '../base/Widget.js';\n\nexport interface LogViewOptions {\n /** Highlight rules: keyword → color */\n highlight?: Record<string, Color>;\n /** Auto-scroll to bottom */\n autoScroll?: boolean;\n}\n\n/**\n * LogView — scrollable, highlighted log output.\n *\n * Supports keyword-based color highlighting (ERROR → red, WARN → yellow, etc.)\n */\nexport class LogView extends Widget {\n private _lines: string[] = [];\n private _scrollOffset = 0;\n private _highlight: Record<string, Color>;\n private _autoScroll: boolean;\n\n constructor(style: Partial<Style> = {}, opts: LogViewOptions = {}) {\n super(style);\n this._highlight = opts.highlight ?? {\n ERROR: { type: 'named', name: 'red' },\n WARN: { type: 'named', name: 'yellow' },\n INFO: { type: 'named', name: 'green' },\n DEBUG: { type: 'named', name: 'brightBlack' },\n };\n this._autoScroll = opts.autoScroll ?? true;\n }\n\n setLines(lines: string[]): void {\n this._lines = lines;\n if (this._autoScroll) {\n this._scrollToBottom();\n }\n }\n\n appendLine(line: string): void {\n this._lines.push(line);\n if (this._autoScroll) {\n this._scrollToBottom();\n }\n }\n\n scrollUp(n = 1): void {\n this._scrollOffset = Math.max(0, this._scrollOffset - n);\n }\n\n scrollDown(n = 1): void {\n this._scrollOffset = Math.min(\n Math.max(0, this._lines.length - 1),\n this._scrollOffset + n,\n );\n }\n\n private _scrollToBottom(): void {\n const rect = this._getContentRect();\n const visibleLines = Math.max(1, rect.height);\n this._scrollOffset = Math.max(0, this._lines.length - visibleLines);\n }\n\n protected _renderSelf(screen: Screen): void {\n const rect = this._getContentRect();\n const { x, y, width, height } = rect;\n if (width <= 0 || height <= 0) return;\n\n const attrs = styleToCellAttrs(this._style);\n const visibleLines = this._lines.slice(this._scrollOffset, this._scrollOffset + height);\n\n for (let i = 0; i < Math.min(visibleLines.length, height); i++) {\n const line = truncate(visibleLines[i], width);\n const lineColor = this._getLineColor(line);\n\n screen.writeString(x, y + i, line, {\n ...attrs,\n ...(lineColor ? { fg: lineColor } : {}),\n });\n }\n }\n\n private _getLineColor(line: string): Color | null {\n for (const [keyword, color] of Object.entries(this._highlight)) {\n if (line.includes(keyword)) return color;\n }\n return null;\n }\n}\n","// ─────────────────────────────────────────────────────\n// @termuijs/widgets — List widget (selectable)\n// ─────────────────────────────────────────────────────\n\nimport { type Screen, type Style, styleToCellAttrs, stringWidth, truncate } from '@termuijs/core';\nimport { Widget } from '../base/Widget.js';\n\nexport interface ListItem {\n label: string;\n value: string;\n disabled?: boolean;\n}\n\n/**\n * List — a scrollable, selectable list of items.\n *\n * Supports:\n * - Keyboard navigation (up/down/Home/End)\n * - Scrolling when items exceed visible height\n * - Custom item styling\n * - Disabled items\n */\nexport class List extends Widget {\n private _items: ListItem[];\n private _selectedIndex = 0;\n private _scrollOffset = 0;\n private _onSelect?: (item: ListItem, index: number) => void;\n\n constructor(\n items: ListItem[],\n style: Partial<Style> = {},\n onSelect?: (item: ListItem, index: number) => void,\n ) {\n super({ border: 'single', ...style });\n this._items = items;\n this._onSelect = onSelect;\n this.focusable = true;\n }\n\n get selectedIndex(): number { return this._selectedIndex; }\n get selectedItem(): ListItem | undefined { return this._items[this._selectedIndex]; }\n\n setItems(items: ListItem[]): void {\n this._items = items;\n this._selectedIndex = Math.min(this._selectedIndex, items.length - 1);\n this._clampScroll();\n }\n\n /** Move selection up */\n selectPrev(): void {\n let next = this._selectedIndex - 1;\n while (next >= 0 && this._items[next].disabled) next--;\n if (next >= 0) {\n this._selectedIndex = next;\n this._clampScroll();\n }\n }\n\n /** Move selection down */\n selectNext(): void {\n let next = this._selectedIndex + 1;\n while (next < this._items.length && this._items[next].disabled) next++;\n if (next < this._items.length) {\n this._selectedIndex = next;\n this._clampScroll();\n }\n }\n\n /** Confirm the current selection */\n confirm(): void {\n const item = this._items[this._selectedIndex];\n if (item && !item.disabled) {\n this._onSelect?.(item, this._selectedIndex);\n }\n }\n\n protected _renderSelf(screen: Screen): void {\n const rect = this._getContentRect();\n const { x, y, width, height } = rect;\n if (width <= 0 || height <= 0) return;\n\n const attrs = styleToCellAttrs(this._style);\n const visibleCount = Math.min(this._items.length - this._scrollOffset, height);\n\n for (let i = 0; i < visibleCount; i++) {\n const itemIdx = this._scrollOffset + i;\n const item = this._items[itemIdx];\n const isSelected = itemIdx === this._selectedIndex;\n\n // Compose the line\n const prefix = isSelected ? '▸ ' : ' ';\n let line = prefix + item.label;\n line = truncate(line, width);\n\n // Style\n const cellStyle = {\n ...attrs,\n bold: isSelected,\n dim: item.disabled ?? false,\n inverse: isSelected && this.isFocused,\n };\n\n screen.writeString(x, y + i, line, cellStyle);\n\n // Fill rest of line for inverse highlight\n if (isSelected && this.isFocused) {\n const remaining = width - stringWidth(line);\n for (let c = 0; c < remaining; c++) {\n screen.setCell(x + stringWidth(line) + c, y + i, { char: ' ', ...cellStyle });\n }\n }\n }\n\n // Scrollbar indicator\n if (this._items.length > height) {\n const scrollRatio = this._scrollOffset / (this._items.length - height);\n const scrollPos = Math.floor(scrollRatio * (height - 1));\n for (let r = 0; r < height; r++) {\n const scrollChar = r === scrollPos ? '█' : '░';\n screen.setCell(x + width - 1, y + r, { char: scrollChar, ...attrs, dim: true });\n }\n }\n }\n\n private _clampScroll(): void {\n const rect = this._getContentRect();\n const visibleHeight = rect.height;\n if (visibleHeight <= 0) return;\n\n if (this._selectedIndex < this._scrollOffset) {\n this._scrollOffset = this._selectedIndex;\n }\n if (this._selectedIndex >= this._scrollOffset + visibleHeight) {\n this._scrollOffset = this._selectedIndex - visibleHeight + 1;\n }\n }\n}\n","// ─────────────────────────────────────────────────────\n// @termuijs/widgets — TextInput widget\n// ─────────────────────────────────────────────────────\n\nimport { type Screen, type Style, styleToCellAttrs, stringWidth, truncate } from '@termuijs/core';\nimport { Widget } from '../base/Widget.js';\n\n/**\n * TextInput — a single-line text input field.\n *\n * Supports:\n * - Cursor movement (left/right/Home/End)\n * - Character insertion and deletion\n * - Placeholder text\n * - Password masking\n * - Max length constraint\n */\nexport class TextInput extends Widget {\n private _value = '';\n private _cursorPos = 0;\n private _placeholder: string;\n private _mask: string | null;\n private _maxLength: number;\n private _onChange?: (value: string) => void;\n private _onSubmit?: (value: string) => void;\n\n constructor(\n style: Partial<Style> = {},\n options: {\n placeholder?: string;\n mask?: string;\n maxLength?: number;\n onChange?: (value: string) => void;\n onSubmit?: (value: string) => void;\n } = {},\n ) {\n super({ border: 'single', height: 3, ...style });\n this._placeholder = options.placeholder ?? '';\n this._mask = options.mask ?? null;\n this._maxLength = options.maxLength ?? Infinity;\n this._onChange = options.onChange;\n this._onSubmit = options.onSubmit;\n this.focusable = true;\n }\n\n get value(): string { return this._value; }\n set value(v: string) {\n this._value = v.slice(0, this._maxLength);\n this._cursorPos = Math.min(this._cursorPos, this._value.length);\n }\n\n /**\n * Handle a typed character.\n */\n insertChar(char: string): void {\n if (this._value.length >= this._maxLength) return;\n this._value =\n this._value.slice(0, this._cursorPos) +\n char +\n this._value.slice(this._cursorPos);\n this._cursorPos++;\n this._onChange?.(this._value);\n }\n\n /**\n * Delete the character before the cursor.\n */\n deleteBack(): void {\n if (this._cursorPos > 0) {\n this._value =\n this._value.slice(0, this._cursorPos - 1) +\n this._value.slice(this._cursorPos);\n this._cursorPos--;\n this._onChange?.(this._value);\n }\n }\n\n /**\n * Delete the character after the cursor.\n */\n deleteForward(): void {\n if (this._cursorPos < this._value.length) {\n this._value =\n this._value.slice(0, this._cursorPos) +\n this._value.slice(this._cursorPos + 1);\n this._onChange?.(this._value);\n }\n }\n\n moveCursorLeft(): void { this._cursorPos = Math.max(0, this._cursorPos - 1); }\n moveCursorRight(): void { this._cursorPos = Math.min(this._value.length, this._cursorPos + 1); }\n moveCursorHome(): void { this._cursorPos = 0; }\n moveCursorEnd(): void { this._cursorPos = this._value.length; }\n submit(): void { this._onSubmit?.(this._value); }\n clear(): void { this._value = ''; this._cursorPos = 0; this._onChange?.(''); }\n\n protected _renderSelf(screen: Screen): void {\n const rect = this._getContentRect();\n const { x, y, width, height } = rect;\n if (width <= 0 || height <= 0) return;\n\n const attrs = styleToCellAttrs(this._style);\n\n if (this._value.length === 0 && !this.isFocused) {\n // Show placeholder\n screen.writeString(x, y, truncate(this._placeholder, width), { ...attrs, dim: true });\n return;\n }\n\n // Display value (optionally masked)\n const displayValue = this._mask\n ? this._mask.repeat(this._value.length)\n : this._value;\n\n // Scroll the view if cursor is beyond visible area\n const visibleWidth = width - 1; // Leave room for cursor\n let scrollX = 0;\n if (this._cursorPos > visibleWidth) {\n scrollX = this._cursorPos - visibleWidth;\n }\n\n const visibleText = displayValue.slice(scrollX, scrollX + visibleWidth);\n screen.writeString(x, y, visibleText, attrs);\n\n // Draw cursor when focused\n if (this.isFocused) {\n const cursorScreenPos = x + this._cursorPos - scrollX;\n if (cursorScreenPos >= x && cursorScreenPos < x + width) {\n const cursorChar = this._cursorPos < displayValue.length\n ? displayValue[this._cursorPos]\n : ' ';\n screen.setCell(cursorScreenPos, y, {\n char: cursorChar,\n ...attrs,\n inverse: true,\n });\n }\n }\n }\n}\n","// ─────────────────────────────────────────────────────\n// @termuijs/widgets — Table widget\n// ─────────────────────────────────────────────────────\n\nimport { type Screen, type Style, type Color, styleToCellAttrs, stringWidth, truncate } from '@termuijs/core';\nimport { Widget } from '../base/Widget.js';\n\nexport interface TableColumn {\n /** Column header label */\n header: string;\n /** Key to pull data from row objects */\n key: string;\n /** Fixed width (chars). If omitted, auto-distributes. */\n width?: number;\n /** Text alignment within the column */\n align?: 'left' | 'center' | 'right';\n}\n\nexport type TableRow = Record<string, string | number>;\n\nexport interface TableOptions {\n /** Whether to show the header row */\n showHeader?: boolean;\n /** Color for the header row */\n headerColor?: Color;\n /** Whether rows are zebra-striped */\n stripe?: boolean;\n /** Stripe color */\n stripeColor?: Color;\n /** Column separator character */\n separator?: string;\n}\n\n/**\n * Table — renders tabular data with columns, headers, and optional zebra-striping.\n *\n * Supports:\n * - Auto-width column distribution\n * - Fixed and percentage widths\n * - Header styling\n * - Zebra striping\n * - Text alignment per column\n * - Truncation for overflow\n */\nexport class Table extends Widget {\n private _columns: TableColumn[];\n private _rows: TableRow[];\n private _showHeader: boolean;\n private _headerColor: Color;\n private _stripe: boolean;\n private _stripeColor: Color;\n private _separator: string;\n\n constructor(\n columns: TableColumn[],\n rows: TableRow[],\n style: Partial<Style> = {},\n options: TableOptions = {},\n ) {\n super(style);\n this._columns = columns;\n this._rows = rows;\n this._showHeader = options.showHeader ?? true;\n this._headerColor = options.headerColor ?? { type: 'named', name: 'cyan' };\n this._stripe = options.stripe ?? true;\n this._stripeColor = options.stripeColor ?? { type: 'named', name: 'brightBlack' };\n this._separator = options.separator ?? ' │ ';\n }\n\n setRows(rows: TableRow[]): void {\n this._rows = rows;\n }\n\n protected _renderSelf(screen: Screen): void {\n const rect = this._getContentRect();\n const { x, y, width, height } = rect;\n if (width <= 0 || height <= 0) return;\n\n const attrs = styleToCellAttrs(this._style);\n const sepWidth = stringWidth(this._separator);\n\n // Calculate column widths\n const colWidths = this._computeColumnWidths(\n width - (this._columns.length - 1) * sepWidth,\n );\n\n let row = 0;\n\n // Render header\n if (this._showHeader && row < height) {\n let cx = x;\n for (let c = 0; c < this._columns.length; c++) {\n const col = this._columns[c];\n const cellText = this._alignText(col.header, colWidths[c], col.align ?? 'left');\n screen.writeString(cx, y + row, cellText, {\n ...attrs,\n fg: this._headerColor,\n bold: true,\n });\n cx += colWidths[c];\n if (c < this._columns.length - 1) {\n screen.writeString(cx, y + row, this._separator, { ...attrs, dim: true });\n cx += sepWidth;\n }\n }\n row++;\n\n // Header separator line\n if (row < height) {\n const sepLine = '─'.repeat(width);\n screen.writeString(x, y + row, sepLine, { ...attrs, dim: true });\n row++;\n }\n }\n\n // Render data rows\n for (let r = 0; r < this._rows.length && row < height; r++) {\n const dataRow = this._rows[r];\n const isStripe = this._stripe && r % 2 === 1;\n let cx = x;\n\n for (let c = 0; c < this._columns.length; c++) {\n const col = this._columns[c];\n const rawValue = String(dataRow[col.key] ?? '');\n const cellText = this._alignText(rawValue, colWidths[c], col.align ?? 'left');\n\n screen.writeString(cx, y + row, cellText, {\n ...attrs,\n bg: isStripe ? this._stripeColor : attrs.bg,\n });\n cx += colWidths[c];\n if (c < this._columns.length - 1) {\n screen.writeString(cx, y + row, this._separator, {\n ...attrs,\n dim: true,\n bg: isStripe ? this._stripeColor : attrs.bg,\n });\n cx += sepWidth;\n }\n }\n\n // Fill remaining width for stripe\n if (isStripe) {\n for (let fx = cx; fx < x + width; fx++) {\n screen.setCell(fx, y + row, { char: ' ', bg: this._stripeColor });\n }\n }\n\n row++;\n }\n }\n\n private _computeColumnWidths(totalWidth: number): number[] {\n const fixedCols = this._columns.filter(c => c.width !== undefined);\n const flexCols = this._columns.filter(c => c.width === undefined);\n\n let usedWidth = fixedCols.reduce((sum, c) => sum + (c.width ?? 0), 0);\n const remainingWidth = Math.max(0, totalWidth - usedWidth);\n const flexWidth = flexCols.length > 0 ? Math.floor(remainingWidth / flexCols.length) : 0;\n\n return this._columns.map(c => c.width ?? flexWidth);\n }\n\n private _alignText(text: string, width: number, align: 'left' | 'center' | 'right'): string {\n const truncated = truncate(text, width);\n const textWidth = stringWidth(truncated);\n const pad = Math.max(0, width - textWidth);\n\n switch (align) {\n case 'right':\n return ' '.repeat(pad) + truncated;\n case 'center': {\n const left = Math.floor(pad / 2);\n const right = pad - left;\n return ' '.repeat(left) + truncated + ' '.repeat(right);\n }\n case 'left':\n default:\n return truncated + ' '.repeat(pad);\n }\n }\n}\n","// ─────────────────────────────────────────────────────\n// @termuijs/widgets — Gauge widget (label + bar + value)\n// ─────────────────────────────────────────────────────\n\nimport { type Screen, type Style, type Color, styleToCellAttrs, stringWidth } from '@termuijs/core';\nimport { Widget } from '../base/Widget.js';\n\nexport interface GaugeOptions {\n /** Color of the filled portion */\n color?: Color;\n /** Show percentage label */\n showLabel?: boolean;\n}\n\n/**\n * Gauge — a self-contained metric display with label, bar, and value.\n *\n * Example:\n * CPU ████████░░░░ 65%\n */\nexport class Gauge extends Widget {\n private _label: string;\n private _value: number = 0;\n private _color: Color;\n private _showLabel: boolean;\n\n constructor(label: string, style: Partial<Style> = {}, opts: GaugeOptions = {}) {\n super(style);\n this._label = label;\n this._color = opts.color ?? { type: 'named', name: 'green' };\n this._showLabel = opts.showLabel ?? true;\n }\n\n setValue(value: number): void {\n this._value = Math.max(0, Math.min(1, value));\n }\n\n getValue(): number {\n return this._value;\n }\n\n setLabel(label: string): void {\n this._label = label;\n }\n\n protected _renderSelf(screen: Screen): void {\n const rect = this._getContentRect();\n const { x, y, width, height } = rect;\n if (width <= 0 || height <= 0) return;\n\n const attrs = styleToCellAttrs(this._style);\n\n // Layout: \"Label ████████░░░░ XX%\"\n const labelStr = this._label + ' ';\n const percentStr = this._showLabel ? ` ${Math.round(this._value * 100)}%` : '';\n const labelWidth = stringWidth(labelStr);\n const percentWidth = stringWidth(percentStr);\n const barWidth = Math.max(0, width - labelWidth - percentWidth);\n\n // Render label\n screen.writeString(x, y, labelStr, { ...attrs, bold: true });\n\n // Render bar\n const filled = Math.round(barWidth * this._value);\n const barX = x + labelWidth;\n for (let i = 0; i < barWidth; i++) {\n const char = i < filled ? '█' : '░';\n screen.setCell(barX + i, y, {\n char,\n fg: i < filled ? this._color : { type: 'named', name: 'brightBlack' },\n });\n }\n\n // Render percentage\n if (this._showLabel) {\n screen.writeString(barX + barWidth, y, percentStr, {\n ...attrs,\n bold: true,\n });\n }\n }\n}\n","// ─────────────────────────────────────────────────────\n// @termuijs/widgets — Sparkline widget (braille chart)\n// ─────────────────────────────────────────────────────\n\nimport { type Screen, type Style, type Color, styleToCellAttrs } from '@termuijs/core';\nimport { Widget } from '../base/Widget.js';\n\nexport interface SparklineOptions {\n /** Color of the sparkline */\n color?: Color;\n /** Show min/max labels */\n showRange?: boolean;\n}\n\n// Braille sparkline characters (8 levels per cell, bottom to top)\nconst SPARK_CHARS = ['▁', '▂', '▃', '▄', '▅', '▆', '▇', '█'];\n\n/**\n * Sparkline — a compact inline chart showing a data trend.\n *\n * Example:\n * Latency ▂▃▅▇▅▃▂▁▃▅█▅▃\n */\nexport class Sparkline extends Widget {\n private _label: string;\n private _data: number[] = [];\n private _color: Color;\n private _showRange: boolean;\n\n constructor(label: string, style: Partial<Style> = {}, opts: SparklineOptions = {}) {\n super(style);\n this._label = label;\n this._color = opts.color ?? { type: 'named', name: 'cyan' };\n this._showRange = opts.showRange ?? false;\n }\n\n setData(data: number[]): void {\n this._data = data;\n }\n\n pushValue(value: number): void {\n this._data.push(value);\n }\n\n protected _renderSelf(screen: Screen): void {\n const rect = this._getContentRect();\n const { x, y, width, height } = rect;\n if (width <= 0 || height <= 0) return;\n\n const attrs = styleToCellAttrs(this._style);\n const labelStr = this._label + ' ';\n const labelWidth = labelStr.length;\n\n // Render label\n screen.writeString(x, y, labelStr, { ...attrs, bold: true });\n\n // Available sparkline width\n const sparkWidth = width - labelWidth;\n if (sparkWidth <= 0 || this._data.length === 0) return;\n\n // Take the most recent data points that fit\n const data = this._data.slice(-sparkWidth);\n\n // Normalize data to 0–7 range\n const min = Math.min(...data);\n const max = Math.max(...data);\n const range = max - min || 1;\n\n for (let i = 0; i < data.length; i++) {\n const normalized = (data[i] - min) / range;\n const charIdx = Math.min(7, Math.floor(normalized * 8));\n screen.setCell(x + labelWidth + i, y, {\n char: SPARK_CHARS[charIdx],\n fg: this._color,\n });\n }\n\n // Optional range labels on second line\n if (this._showRange && height > 1) {\n const rangeStr = `${min.toFixed(0)}–${max.toFixed(0)}`;\n screen.writeString(x + labelWidth, y + 1, rangeStr, {\n ...attrs,\n dim: true,\n });\n }\n }\n}\n","// ─────────────────────────────────────────────────────\n// @termuijs/widgets — StatusIndicator widget\n// ─────────────────────────────────────────────────────\n\nimport { type Screen, type Style, type Color, styleToCellAttrs } from '@termuijs/core';\nimport { Widget } from '../base/Widget.js';\n\nexport interface StatusIndicatorOptions {\n /** Color when up/active */\n upColor?: Color;\n /** Color when down/inactive */\n downColor?: Color;\n}\n\n/**\n * StatusIndicator — simple up/down indicator with label.\n *\n * Example:\n * ● API Server — Online\n * ○ Worker — Offline\n */\nexport class StatusIndicator extends Widget {\n private _label: string;\n private _isUp: boolean;\n private _upColor: Color;\n private _downColor: Color;\n\n constructor(label: string, isUp: boolean, style: Partial<Style> = {}, opts: StatusIndicatorOptions = {}) {\n super(style);\n this._label = label;\n this._isUp = isUp;\n this._upColor = opts.upColor ?? { type: 'named', name: 'green' };\n this._downColor = opts.downColor ?? { type: 'named', name: 'red' };\n }\n\n setStatus(isUp: boolean): void {\n this._isUp = isUp;\n }\n\n getStatus(): boolean {\n return this._isUp;\n }\n\n setLabel(label: string): void {\n this._label = label;\n }\n\n protected _renderSelf(screen: Screen): void {\n const rect = this._getContentRect();\n const { x, y, width, height } = rect;\n if (width <= 0 || height <= 0) return;\n\n const attrs = styleToCellAttrs(this._style);\n const dot = this._isUp ? '●' : '○';\n const statusText = this._isUp ? 'Online' : 'Offline';\n const color = this._isUp ? this._upColor : this._downColor;\n\n screen.setCell(x, y, { char: dot, fg: color });\n screen.writeString(x + 2, y, `${this._label} — ${statusText}`, {\n ...attrs,\n fg: color,\n });\n }\n}\n","// ─────────────────────────────────────────────────────\n// @termuijs/widgets — ProgressBar widget\n// ─────────────────────────────────────────────────────\n\nimport { type Screen, type Style, styleToCellAttrs, type Color } from '@termuijs/core';\nimport { Widget } from '../base/Widget.js';\n\nexport interface ProgressBarOptions {\n /** Current value (0–1) */\n value?: number;\n /** Character for the filled portion */\n fillChar?: string;\n /** Character for the empty portion */\n emptyChar?: string;\n /** Color of the filled portion */\n fillColor?: Color;\n /** Show percentage label */\n showLabel?: boolean;\n /** Label format: 'percent' | 'fraction' | 'custom' */\n labelFormat?: 'percent' | 'fraction';\n /** Total for fraction display */\n total?: number;\n}\n\n/**\n * ProgressBar — horizontal progress indicator.\n *\n * Supports:\n * - Configurable fill/empty characters\n * - Custom fill color\n * - Percentage or fraction label\n * - Smooth animation-ready value changes\n */\nexport class ProgressBar extends Widget {\n private _value: number;\n private _fillChar: string;\n private _emptyChar: string;\n private _fillColor: Color;\n private _showLabel: boolean;\n private _labelFormat: 'percent' | 'fraction';\n private _total: number;\n\n constructor(style: Partial<Style> = {}, options: ProgressBarOptions = {}) {\n super({ height: 1, ...style });\n this._value = Math.max(0, Math.min(1, options.value ?? 0));\n this._fillChar = options.fillChar ?? '█';\n this._emptyChar = options.emptyChar ?? '░';\n this._fillColor = options.fillColor ?? { type: 'named', name: 'green' };\n this._showLabel = options.showLabel ?? true;\n this._labelFormat = options.labelFormat ?? 'percent';\n this._total = options.total ?? 100;\n }\n\n /** Set progress value (0–1) */\n setValue(value: number): void {\n this._value = Math.max(0, Math.min(1, value));\n }\n\n get value(): number { return this._value; }\n\n protected _renderSelf(screen: Screen): void {\n const rect = this._getContentRect();\n const { x, y, width } = rect;\n if (width <= 0) return;\n\n const attrs = styleToCellAttrs(this._style);\n\n // Label\n let label = '';\n if (this._showLabel) {\n if (this._labelFormat === 'percent') {\n label = ` ${Math.round(this._value * 100)}%`;\n } else {\n label = ` ${Math.round(this._value * this._total)}/${this._total}`;\n }\n }\n\n const barWidth = Math.max(0, width - label.length);\n const filled = Math.round(barWidth * this._value);\n const empty = barWidth - filled;\n\n // Render bar\n for (let i = 0; i < filled; i++) {\n screen.setCell(x + i, y, { char: this._fillChar, ...attrs, fg: this._fillColor });\n }\n for (let i = 0; i < empty; i++) {\n screen.setCell(x + filled + i, y, { char: this._emptyChar, ...attrs, dim: true });\n }\n\n // Render label\n if (label) {\n screen.writeString(x + barWidth, y, label, { ...attrs, bold: true });\n }\n }\n}\n","// ─────────────────────────────────────────────────────\n// @termuijs/widgets — Spinner widget\n// ─────────────────────────────────────────────────────\n\nimport { type Screen, type Style, styleToCellAttrs, type Color } from '@termuijs/core';\nimport { Widget } from '../base/Widget.js';\n\n/**\n * Built-in spinner frame sets.\n */\nexport const SPINNER_FRAMES: Record<string, { frames: string[]; interval: number }> = {\n dots: {\n frames: ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'],\n interval: 80,\n },\n line: {\n frames: ['-', '\\\\', '|', '/'],\n interval: 130,\n },\n star: {\n frames: ['✶', '✸', '✹', '✺', '✹', '✷'],\n interval: 70,\n },\n arc: {\n frames: ['◜', '◠', '◝', '◞', '◡', '◟'],\n interval: 100,\n },\n circle: {\n frames: ['◐', '◓', '◑', '◒'],\n interval: 120,\n },\n bounce: {\n frames: ['⠁', '⠂', '⠄', '⠂'],\n interval: 120,\n },\n arrow: {\n frames: ['←', '↖', '↑', '↗', '→', '↘', '↓', '↙'],\n interval: 100,\n },\n clock: {\n frames: ['🕐', '🕑', '🕒', '🕓', '🕔', '🕕', '🕖', '🕗', '🕘', '🕙', '🕚', '🕛'],\n interval: 100,\n },\n};\n\nexport interface SpinnerOptions {\n /** Spinner preset name or custom frames */\n spinner?: string | { frames: string[]; interval: number };\n /** Text label displayed after the spinner */\n label?: string;\n /** Color for the spinner frames */\n color?: Color;\n}\n\n/**\n * Spinner — animated loading indicator.\n *\n * Supports:\n * - 8 built-in spinner presets\n * - Custom frame sequences\n * - Configurable color and label\n * - Automatic frame advancement via tick()\n */\nexport class Spinner extends Widget {\n private _frames: string[];\n private _interval: number;\n private _frameIndex = 0;\n private _label: string;\n private _color: Color;\n private _lastTick = 0;\n private _elapsed = 0;\n\n constructor(style: Partial<Style> = {}, options: SpinnerOptions = {}) {\n super({ height: 1, ...style });\n\n const spinnerDef = typeof options.spinner === 'string'\n ? (SPINNER_FRAMES[options.spinner] ?? SPINNER_FRAMES.dots)\n : (options.spinner ?? SPINNER_FRAMES.dots);\n\n this._frames = spinnerDef.frames;\n this._interval = spinnerDef.interval;\n this._label = options.label ?? '';\n this._color = options.color ?? { type: 'named', name: 'cyan' };\n }\n\n /** Update the spinner label */\n setLabel(label: string): void {\n this._label = label;\n }\n\n /**\n * Advance the spinner frame based on elapsed time.\n * Call this with a delta (ms) from the render loop.\n */\n tick(deltaMs: number): void {\n this._elapsed += deltaMs;\n if (this._elapsed >= this._interval) {\n this._frameIndex = (this._frameIndex + 1) % this._frames.length;\n this._elapsed = 0;\n }\n }\n\n protected _renderSelf(screen: Screen): void {\n const rect = this._getContentRect();\n const { x, y, width } = rect;\n if (width <= 0) return;\n\n const attrs = styleToCellAttrs(this._style);\n const frame = this._frames[this._frameIndex];\n\n // Render spinner character\n screen.writeString(x, y, frame, { ...attrs, fg: this._color });\n\n // Render label\n if (this._label) {\n screen.writeString(x + 2, y, this._label, attrs);\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACIA,kBAeO;AAcP,IAAI,mBAAmB;AAchB,IAAe,SAAf,MAAsB;AAAA;AAAA,EAEhB;AAAA;AAAA,EAGC;AAAA;AAAA,EAGA,YAAsB,CAAC;AAAA;AAAA,EAGjC,SAAwB;AAAA;AAAA,EAGd,QAAc,EAAE,GAAG,GAAG,GAAG,GAAG,OAAO,GAAG,QAAQ,EAAE;AAAA;AAAA,EAGlD,cAAiC;AAAA;AAAA,EAGzC,YAAY;AAAA;AAAA,EAGZ,WAAW;AAAA;AAAA,EAGF,SAAS,IAAI,yBAA2B;AAAA;AAAA,EAGjD,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA,EAMF,SAAS;AAAA,EAEnB,YAAY,QAAwB,CAAC,GAAG;AACpC,SAAK,KAAK,UAAU,EAAE,gBAAgB;AACtC,SAAK,aAAS,6BAAY,0BAAa,GAAG,KAAK;AAAA,EACnD;AAAA;AAAA,EAGA,IAAI,QAAe;AAAE,WAAO,KAAK;AAAA,EAAQ;AAAA;AAAA,EAGzC,SAAS,OAA6B;AAClC,SAAK,aAAS,yBAAY,KAAK,QAAQ,KAAK;AAC5C,SAAK,UAAU;AAAA,EACnB;AAAA;AAAA,EAGA,IAAI,OAAa;AAAE,WAAO,KAAK;AAAA,EAAO;AAAA;AAAA,EAGtC,SAAS,OAAqB;AAC1B,UAAM,SAAS;AACf,SAAK,UAAU,KAAK,KAAK;AAAA,EAC7B;AAAA;AAAA,EAGA,YAAY,OAAqB;AAC7B,UAAM,MAAM,KAAK,UAAU,QAAQ,KAAK;AACxC,QAAI,OAAO,GAAG;AACV,WAAK,UAAU,OAAO,KAAK,CAAC;AAC5B,YAAM,SAAS;AAAA,IACnB;AAAA,EACJ;AAAA;AAAA,EAGA,gBAAsB;AAClB,eAAW,SAAS,KAAK,WAAW;AAChC,YAAM,SAAS;AAAA,IACnB;AACA,SAAK,YAAY,CAAC;AAAA,EACtB;AAAA;AAAA,EAGA,IAAI,WAAkC;AAAE,WAAO,KAAK;AAAA,EAAW;AAAA;AAAA;AAAA;AAAA;AAAA,EAM/D,gBAA4B;AACxB,UAAM,aAAa,KAAK,UACnB,OAAO,OAAK,EAAE,MAAM,YAAY,KAAK,EACrC,IAAI,OAAK,EAAE,cAAc,CAAC;AAE/B,SAAK,kBAAc,8BAAiB,KAAK,IAAI,KAAK,QAAQ,UAAU;AACpE,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,aAAmB;AACf,QAAI,KAAK,aAAa;AAClB,WAAK,QAAQ,EAAE,GAAG,KAAK,YAAY,SAAS;AAAA,IAChD;AAGA,UAAM,kBAAkB,KAAK,UAAU,OAAO,OAAK,EAAE,MAAM,YAAY,KAAK;AAC5E,aAAS,IAAI,GAAG,IAAI,gBAAgB,QAAQ,KAAK;AAC7C,sBAAgB,CAAC,EAAE,WAAW;AAAA,IAClC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,QAAsB;AACzB,QAAI,KAAK,OAAO,YAAY,MAAO;AAGnC,UAAM,aAAa,KAAK,OAAO,aAAa;AAC5C,QAAI,YAAY;AACZ,aAAO,SAAS,KAAK,KAAK;AAAA,IAC9B;AAGA,SAAK,YAAY,MAAM;AAGvB,SAAK,cAAc,MAAM;AAGzB,eAAW,SAAS,KAAK,WAAW;AAChC,YAAM,OAAO,MAAM;AAAA,IACvB;AAGA,QAAI,YAAY;AACZ,aAAO,QAAQ;AAAA,IACnB;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAWA,WAAW,MAAkB;AACzB,SAAK,QAAQ;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAkB;AACd,QAAI,KAAK,OAAQ;AACjB,SAAK,SAAS;AACd,SAAK,QAAQ,UAAU;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAKA,aAAmB;AACf,SAAK,SAAS;AACd,eAAW,SAAS,KAAK,WAAW;AAChC,YAAM,WAAW;AAAA,IACrB;AAAA,EACJ;AAAA;AAAA,EAGA,IAAI,UAAmB;AAAE,WAAO,KAAK;AAAA,EAAQ;AAAA;AAAA;AAAA;AAAA,EAKnC,cAAc,QAAsB;AAC1C,UAAM,SAAS,KAAK,OAAO;AAC3B,UAAM,YAAY,UAAU,WAAW;AACvC,UAAM,gBAAgB,KAAK,aAAa,KAAK,aACtC,KAAK,OAAO,mBAAmB;AAEtC,QAAI,CAAC,aAAa,CAAC,cAAe;AAElC,UAAM,EAAE,GAAG,GAAG,OAAO,OAAO,IAAI,KAAK;AACrC,QAAI,QAAQ,KAAK,SAAS,EAAG;AAE7B,QAAI,WAAW;AACX,YAAM,YAAQ,4BAAe,MAAM;AACnC,UAAI,CAAC,MAAO;AAEZ,YAAM,YAAQ,8BAAiB,KAAK,MAAM;AAC1C,YAAM,WAAW,KAAK,OAAO,eAAe,MAAM;AAGlD,YAAM,KAAK,gBACJ,KAAK,OAAO,kBAAkB,EAAE,MAAM,SAAkB,MAAM,OAAgB,IAC/E;AACN,YAAM,YAAY,EAAE,GAAG;AAGvB,aAAO,QAAQ,GAAG,GAAG,EAAE,MAAM,MAAM,SAAS,GAAG,UAAU,CAAC;AAC1D,eAAS,IAAI,GAAG,IAAI,QAAQ,GAAG,KAAK;AAChC,eAAO,QAAQ,IAAI,GAAG,GAAG,EAAE,MAAM,MAAM,KAAK,GAAG,UAAU,CAAC;AAAA,MAC9D;AACA,aAAO,QAAQ,IAAI,QAAQ,GAAG,GAAG,EAAE,MAAM,MAAM,UAAU,GAAG,UAAU,CAAC;AAGvE,aAAO,QAAQ,GAAG,IAAI,SAAS,GAAG,EAAE,MAAM,MAAM,YAAY,GAAG,UAAU,CAAC;AAC1E,eAAS,IAAI,GAAG,IAAI,QAAQ,GAAG,KAAK;AAChC,eAAO,QAAQ,IAAI,GAAG,IAAI,SAAS,GAAG,EAAE,MAAM,MAAM,QAAQ,GAAG,UAAU,CAAC;AAAA,MAC9E;AACA,aAAO,QAAQ,IAAI,QAAQ,GAAG,IAAI,SAAS,GAAG,EAAE,MAAM,MAAM,aAAa,GAAG,UAAU,CAAC;AAGvF,eAAS,IAAI,GAAG,IAAI,SAAS,GAAG,KAAK;AACjC,eAAO,QAAQ,GAAG,IAAI,GAAG,EAAE,MAAM,MAAM,MAAM,GAAG,UAAU,CAAC;AAC3D,eAAO,QAAQ,IAAI,QAAQ,GAAG,IAAI,GAAG,EAAE,MAAM,MAAM,OAAO,GAAG,UAAU,CAAC;AAAA,MAC5E;AAAA,IACJ,WAAW,eAAe;AAEtB,YAAM,KAAK,KAAK,OAAO,kBAAkB,EAAE,MAAM,SAAkB,MAAM,OAAgB;AACzF,YAAM,YAAY,EAAE,IAAI,MAAM,KAAK;AAGnC,aAAO,QAAQ,GAAG,GAAG,EAAE,MAAM,UAAK,GAAG,UAAU,CAAC;AAChD,UAAI,QAAQ,EAAG,QAAO,QAAQ,IAAI,GAAG,GAAG,EAAE,MAAM,UAAK,GAAG,UAAU,CAAC;AAGnE,aAAO,QAAQ,IAAI,QAAQ,GAAG,GAAG,EAAE,MAAM,UAAK,GAAG,UAAU,CAAC;AAC5D,UAAI,QAAQ,EAAG,QAAO,QAAQ,IAAI,QAAQ,GAAG,GAAG,EAAE,MAAM,UAAK,GAAG,UAAU,CAAC;AAG3E,aAAO,QAAQ,GAAG,IAAI,SAAS,GAAG,EAAE,MAAM,UAAK,GAAG,UAAU,CAAC;AAC7D,UAAI,QAAQ,EAAG,QAAO,QAAQ,IAAI,GAAG,IAAI,SAAS,GAAG,EAAE,MAAM,UAAK,GAAG,UAAU,CAAC;AAGhF,aAAO,QAAQ,IAAI,QAAQ,GAAG,IAAI,SAAS,GAAG,EAAE,MAAM,UAAK,GAAG,UAAU,CAAC;AACzE,UAAI,QAAQ,EAAG,QAAO,QAAQ,IAAI,QAAQ,GAAG,IAAI,SAAS,GAAG,EAAE,MAAM,UAAK,GAAG,UAAU,CAAC;AAGxF,UAAI,SAAS,GAAG;AACZ,eAAO,QAAQ,GAAG,IAAI,GAAG,EAAE,MAAM,UAAK,GAAG,UAAU,CAAC;AACpD,eAAO,QAAQ,IAAI,QAAQ,GAAG,IAAI,GAAG,EAAE,MAAM,UAAK,GAAG,UAAU,CAAC;AAChE,eAAO,QAAQ,GAAG,IAAI,SAAS,GAAG,EAAE,MAAM,UAAK,GAAG,UAAU,CAAC;AAC7D,eAAO,QAAQ,IAAI,QAAQ,GAAG,IAAI,SAAS,GAAG,EAAE,MAAM,UAAK,GAAG,UAAU,CAAC;AAAA,MAC7E;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKU,kBAAwB;AAC9B,UAAM,cAAU,4BAAe,KAAK,OAAO,OAAO;AAClD,UAAM,SAAS,KAAK,OAAO,UAAU,KAAK,OAAO,WAAW,SAAS,IAAI;AAEzE,WAAO;AAAA,MACH,GAAG,KAAK,MAAM,IAAI,QAAQ,OAAO;AAAA,MACjC,GAAG,KAAK,MAAM,IAAI,QAAQ,MAAM;AAAA,MAChC,OAAO,KAAK,IAAI,GAAG,KAAK,MAAM,QAAQ,QAAQ,OAAO,QAAQ,QAAQ,SAAS,CAAC;AAAA,MAC/E,QAAQ,KAAK,IAAI,GAAG,KAAK,MAAM,SAAS,QAAQ,MAAM,QAAQ,SAAS,SAAS,CAAC;AAAA,IACrF;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,GAAW,GAAoB;AACnC,eAAO,2BAAc,KAAK,OAAO,GAAG,CAAC;AAAA,EACzC;AAAA;AAAA,EAGA,QAAc;AACV,SAAK,OAAO,KAAK,SAAS,MAAgB;AAC1C,eAAW,SAAS,KAAK,WAAW;AAChC,YAAM,MAAM;AAAA,IAChB;AAAA,EACJ;AAAA;AAAA,EAGA,UAAgB;AACZ,eAAW,SAAS,KAAK,WAAW;AAChC,YAAM,QAAQ;AAAA,IAClB;AACA,SAAK,OAAO,KAAK,WAAW,MAAgB;AAAA,EAChD;AACJ;;;AC5UA,IAAAA,eAAiC;AAY1B,IAAM,MAAN,cAAkB,OAAO;AAAA,EAC5B,YAAY,QAAwB,CAAC,GAAG;AACpC,UAAM,KAAK;AAAA,EACf;AAAA,EAEU,YAAY,QAAsB;AACxC,UAAM,EAAE,GAAG,QAAI,+BAAiB,KAAK,MAAM;AAC3C,QAAI,GAAG,SAAS,OAAQ;AAExB,UAAM,EAAE,GAAG,GAAG,OAAO,OAAO,IAAI,KAAK;AACrC,UAAM,SAAS,KAAK,OAAO,UAAU,KAAK,OAAO,WAAW,SAAS,IAAI;AAGzE,aAAS,IAAI,QAAQ,IAAI,SAAS,QAAQ,KAAK;AAC3C,eAAS,IAAI,QAAQ,IAAI,QAAQ,QAAQ,KAAK;AAC1C,eAAO,QAAQ,IAAI,GAAG,IAAI,GAAG,EAAE,MAAM,KAAK,GAAG,CAAC;AAAA,MAClD;AAAA,IACJ;AAAA,EACJ;AACJ;;;AChCA,IAAAC,eAAiF;AAY1E,IAAM,OAAN,cAAmB,OAAO;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EAER,YAAY,SAAiB,QAAwB,CAAC,GAAG,QAA4B,CAAC,GAAG;AACrF,UAAM,KAAK;AACX,SAAK,WAAW;AAChB,SAAK,QAAQ,MAAM,QAAQ;AAC3B,SAAK,SAAS,MAAM,SAAS;AAAA,EACjC;AAAA;AAAA,EAGA,WAAW,SAAuB;AAC9B,SAAK,WAAW;AAAA,EACpB;AAAA;AAAA,EAGA,aAAqB;AACjB,WAAO,KAAK;AAAA,EAChB;AAAA,EAEU,YAAY,QAAsB;AACxC,UAAM,cAAc,KAAK,gBAAgB;AACzC,UAAM,EAAE,GAAG,GAAG,OAAO,OAAO,IAAI;AAChC,QAAI,SAAS,KAAK,UAAU,EAAG;AAE/B,UAAM,YAAQ,+BAAiB,KAAK,MAAM;AAG1C,QAAI,OAAO,KAAK,YAAQ,uBAAS,KAAK,UAAU,KAAK,IAAI,KAAK;AAC9D,UAAM,QAAQ,KAAK,MAAM,IAAI;AAE7B,aAAS,IAAI,GAAG,IAAI,KAAK,IAAI,MAAM,QAAQ,MAAM,GAAG,KAAK;AACrD,UAAI,OAAO,MAAM,CAAC;AAClB,YAAM,gBAAY,0BAAY,IAAI;AAGlC,UAAI,UAAU;AACd,UAAI,KAAK,WAAW,UAAU;AAC1B,kBAAU,KAAK,OAAO,QAAQ,aAAa,CAAC;AAAA,MAChD,WAAW,KAAK,WAAW,SAAS;AAChC,kBAAU,QAAQ;AAAA,MACtB;AAEA,aAAO,YAAY,IAAI,KAAK,IAAI,GAAG,OAAO,GAAG,IAAI,GAAG,MAAM,KAAK;AAAA,IACnE;AAAA,EACJ;AACJ;;;AC5DA,IAAAC,eAAgF;AAezE,IAAM,UAAN,cAAsB,OAAO;AAAA,EACxB,SAAmB,CAAC;AAAA,EACpB,gBAAgB;AAAA,EAChB;AAAA,EACA;AAAA,EAER,YAAY,QAAwB,CAAC,GAAG,OAAuB,CAAC,GAAG;AAC/D,UAAM,KAAK;AACX,SAAK,aAAa,KAAK,aAAa;AAAA,MAChC,OAAO,EAAE,MAAM,SAAS,MAAM,MAAM;AAAA,MACpC,MAAM,EAAE,MAAM,SAAS,MAAM,SAAS;AAAA,MACtC,MAAM,EAAE,MAAM,SAAS,MAAM,QAAQ;AAAA,MACrC,OAAO,EAAE,MAAM,SAAS,MAAM,cAAc;AAAA,IAChD;AACA,SAAK,cAAc,KAAK,cAAc;AAAA,EAC1C;AAAA,EAEA,SAAS,OAAuB;AAC5B,SAAK,SAAS;AACd,QAAI,KAAK,aAAa;AAClB,WAAK,gBAAgB;AAAA,IACzB;AAAA,EACJ;AAAA,EAEA,WAAW,MAAoB;AAC3B,SAAK,OAAO,KAAK,IAAI;AACrB,QAAI,KAAK,aAAa;AAClB,WAAK,gBAAgB;AAAA,IACzB;AAAA,EACJ;AAAA,EAEA,SAAS,IAAI,GAAS;AAClB,SAAK,gBAAgB,KAAK,IAAI,GAAG,KAAK,gBAAgB,CAAC;AAAA,EAC3D;AAAA,EAEA,WAAW,IAAI,GAAS;AACpB,SAAK,gBAAgB,KAAK;AAAA,MACtB,KAAK,IAAI,GAAG,KAAK,OAAO,SAAS,CAAC;AAAA,MAClC,KAAK,gBAAgB;AAAA,IACzB;AAAA,EACJ;AAAA,EAEQ,kBAAwB;AAC5B,UAAM,OAAO,KAAK,gBAAgB;AAClC,UAAM,eAAe,KAAK,IAAI,GAAG,KAAK,MAAM;AAC5C,SAAK,gBAAgB,KAAK,IAAI,GAAG,KAAK,OAAO,SAAS,YAAY;AAAA,EACtE;AAAA,EAEU,YAAY,QAAsB;AACxC,UAAM,OAAO,KAAK,gBAAgB;AAClC,UAAM,EAAE,GAAG,GAAG,OAAO,OAAO,IAAI;AAChC,QAAI,SAAS,KAAK,UAAU,EAAG;AAE/B,UAAM,YAAQ,+BAAiB,KAAK,MAAM;AAC1C,UAAM,eAAe,KAAK,OAAO,MAAM,KAAK,eAAe,KAAK,gBAAgB,MAAM;AAEtF,aAAS,IAAI,GAAG,IAAI,KAAK,IAAI,aAAa,QAAQ,MAAM,GAAG,KAAK;AAC5D,YAAM,WAAO,uBAAS,aAAa,CAAC,GAAG,KAAK;AAC5C,YAAM,YAAY,KAAK,cAAc,IAAI;AAEzC,aAAO,YAAY,GAAG,IAAI,GAAG,MAAM;AAAA,QAC/B,GAAG;AAAA,QACH,GAAI,YAAY,EAAE,IAAI,UAAU,IAAI,CAAC;AAAA,MACzC,CAAC;AAAA,IACL;AAAA,EACJ;AAAA,EAEQ,cAAc,MAA4B;AAC9C,eAAW,CAAC,SAAS,KAAK,KAAK,OAAO,QAAQ,KAAK,UAAU,GAAG;AAC5D,UAAI,KAAK,SAAS,OAAO,EAAG,QAAO;AAAA,IACvC;AACA,WAAO;AAAA,EACX;AACJ;;;ACxFA,IAAAC,eAAiF;AAkB1E,IAAM,OAAN,cAAmB,OAAO;AAAA,EACrB;AAAA,EACA,iBAAiB;AAAA,EACjB,gBAAgB;AAAA,EAChB;AAAA,EAER,YACI,OACA,QAAwB,CAAC,GACzB,UACF;AACE,UAAM,EAAE,QAAQ,UAAU,GAAG,MAAM,CAAC;AACpC,SAAK,SAAS;AACd,SAAK,YAAY;AACjB,SAAK,YAAY;AAAA,EACrB;AAAA,EAEA,IAAI,gBAAwB;AAAE,WAAO,KAAK;AAAA,EAAgB;AAAA,EAC1D,IAAI,eAAqC;AAAE,WAAO,KAAK,OAAO,KAAK,cAAc;AAAA,EAAG;AAAA,EAEpF,SAAS,OAAyB;AAC9B,SAAK,SAAS;AACd,SAAK,iBAAiB,KAAK,IAAI,KAAK,gBAAgB,MAAM,SAAS,CAAC;AACpE,SAAK,aAAa;AAAA,EACtB;AAAA;AAAA,EAGA,aAAmB;AACf,QAAI,OAAO,KAAK,iBAAiB;AACjC,WAAO,QAAQ,KAAK,KAAK,OAAO,IAAI,EAAE,SAAU;AAChD,QAAI,QAAQ,GAAG;AACX,WAAK,iBAAiB;AACtB,WAAK,aAAa;AAAA,IACtB;AAAA,EACJ;AAAA;AAAA,EAGA,aAAmB;AACf,QAAI,OAAO,KAAK,iBAAiB;AACjC,WAAO,OAAO,KAAK,OAAO,UAAU,KAAK,OAAO,IAAI,EAAE,SAAU;AAChE,QAAI,OAAO,KAAK,OAAO,QAAQ;AAC3B,WAAK,iBAAiB;AACtB,WAAK,aAAa;AAAA,IACtB;AAAA,EACJ;AAAA;AAAA,EAGA,UAAgB;AACZ,UAAM,OAAO,KAAK,OAAO,KAAK,cAAc;AAC5C,QAAI,QAAQ,CAAC,KAAK,UAAU;AACxB,WAAK,YAAY,MAAM,KAAK,cAAc;AAAA,IAC9C;AAAA,EACJ;AAAA,EAEU,YAAY,QAAsB;AACxC,UAAM,OAAO,KAAK,gBAAgB;AAClC,UAAM,EAAE,GAAG,GAAG,OAAO,OAAO,IAAI;AAChC,QAAI,SAAS,KAAK,UAAU,EAAG;AAE/B,UAAM,YAAQ,+BAAiB,KAAK,MAAM;AAC1C,UAAM,eAAe,KAAK,IAAI,KAAK,OAAO,SAAS,KAAK,eAAe,MAAM;AAE7E,aAAS,IAAI,GAAG,IAAI,cAAc,KAAK;AACnC,YAAM,UAAU,KAAK,gBAAgB;AACrC,YAAM,OAAO,KAAK,OAAO,OAAO;AAChC,YAAM,aAAa,YAAY,KAAK;AAGpC,YAAM,SAAS,aAAa,YAAO;AACnC,UAAI,OAAO,SAAS,KAAK;AACzB,iBAAO,uBAAS,MAAM,KAAK;AAG3B,YAAM,YAAY;AAAA,QACd,GAAG;AAAA,QACH,MAAM;AAAA,QACN,KAAK,KAAK,YAAY;AAAA,QACtB,SAAS,cAAc,KAAK;AAAA,MAChC;AAEA,aAAO,YAAY,GAAG,IAAI,GAAG,MAAM,SAAS;AAG5C,UAAI,cAAc,KAAK,WAAW;AAC9B,cAAM,YAAY,YAAQ,0BAAY,IAAI;AAC1C,iBAAS,IAAI,GAAG,IAAI,WAAW,KAAK;AAChC,iBAAO,QAAQ,QAAI,0BAAY,IAAI,IAAI,GAAG,IAAI,GAAG,EAAE,MAAM,KAAK,GAAG,UAAU,CAAC;AAAA,QAChF;AAAA,MACJ;AAAA,IACJ;AAGA,QAAI,KAAK,OAAO,SAAS,QAAQ;AAC7B,YAAM,cAAc,KAAK,iBAAiB,KAAK,OAAO,SAAS;AAC/D,YAAM,YAAY,KAAK,MAAM,eAAe,SAAS,EAAE;AACvD,eAAS,IAAI,GAAG,IAAI,QAAQ,KAAK;AAC7B,cAAM,aAAa,MAAM,YAAY,WAAM;AAC3C,eAAO,QAAQ,IAAI,QAAQ,GAAG,IAAI,GAAG,EAAE,MAAM,YAAY,GAAG,OAAO,KAAK,KAAK,CAAC;AAAA,MAClF;AAAA,IACJ;AAAA,EACJ;AAAA,EAEQ,eAAqB;AACzB,UAAM,OAAO,KAAK,gBAAgB;AAClC,UAAM,gBAAgB,KAAK;AAC3B,QAAI,iBAAiB,EAAG;AAExB,QAAI,KAAK,iBAAiB,KAAK,eAAe;AAC1C,WAAK,gBAAgB,KAAK;AAAA,IAC9B;AACA,QAAI,KAAK,kBAAkB,KAAK,gBAAgB,eAAe;AAC3D,WAAK,gBAAgB,KAAK,iBAAiB,gBAAgB;AAAA,IAC/D;AAAA,EACJ;AACJ;;;ACpIA,IAAAC,eAAiF;AAa1E,IAAM,YAAN,cAAwB,OAAO;AAAA,EAC1B,SAAS;AAAA,EACT,aAAa;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAER,YACI,QAAwB,CAAC,GACzB,UAMI,CAAC,GACP;AACE,UAAM,EAAE,QAAQ,UAAU,QAAQ,GAAG,GAAG,MAAM,CAAC;AAC/C,SAAK,eAAe,QAAQ,eAAe;AAC3C,SAAK,QAAQ,QAAQ,QAAQ;AAC7B,SAAK,aAAa,QAAQ,aAAa;AACvC,SAAK,YAAY,QAAQ;AACzB,SAAK,YAAY,QAAQ;AACzB,SAAK,YAAY;AAAA,EACrB;AAAA,EAEA,IAAI,QAAgB;AAAE,WAAO,KAAK;AAAA,EAAQ;AAAA,EAC1C,IAAI,MAAM,GAAW;AACjB,SAAK,SAAS,EAAE,MAAM,GAAG,KAAK,UAAU;AACxC,SAAK,aAAa,KAAK,IAAI,KAAK,YAAY,KAAK,OAAO,MAAM;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,MAAoB;AAC3B,QAAI,KAAK,OAAO,UAAU,KAAK,WAAY;AAC3C,SAAK,SACD,KAAK,OAAO,MAAM,GAAG,KAAK,UAAU,IACpC,OACA,KAAK,OAAO,MAAM,KAAK,UAAU;AACrC,SAAK;AACL,SAAK,YAAY,KAAK,MAAM;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,aAAmB;AACf,QAAI,KAAK,aAAa,GAAG;AACrB,WAAK,SACD,KAAK,OAAO,MAAM,GAAG,KAAK,aAAa,CAAC,IACxC,KAAK,OAAO,MAAM,KAAK,UAAU;AACrC,WAAK;AACL,WAAK,YAAY,KAAK,MAAM;AAAA,IAChC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAsB;AAClB,QAAI,KAAK,aAAa,KAAK,OAAO,QAAQ;AACtC,WAAK,SACD,KAAK,OAAO,MAAM,GAAG,KAAK,UAAU,IACpC,KAAK,OAAO,MAAM,KAAK,aAAa,CAAC;AACzC,WAAK,YAAY,KAAK,MAAM;AAAA,IAChC;AAAA,EACJ;AAAA,EAEA,iBAAuB;AAAE,SAAK,aAAa,KAAK,IAAI,GAAG,KAAK,aAAa,CAAC;AAAA,EAAG;AAAA,EAC7E,kBAAwB;AAAE,SAAK,aAAa,KAAK,IAAI,KAAK,OAAO,QAAQ,KAAK,aAAa,CAAC;AAAA,EAAG;AAAA,EAC/F,iBAAuB;AAAE,SAAK,aAAa;AAAA,EAAG;AAAA,EAC9C,gBAAsB;AAAE,SAAK,aAAa,KAAK,OAAO;AAAA,EAAQ;AAAA,EAC9D,SAAe;AAAE,SAAK,YAAY,KAAK,MAAM;AAAA,EAAG;AAAA,EAChD,QAAc;AAAE,SAAK,SAAS;AAAI,SAAK,aAAa;AAAG,SAAK,YAAY,EAAE;AAAA,EAAG;AAAA,EAEnE,YAAY,QAAsB;AACxC,UAAM,OAAO,KAAK,gBAAgB;AAClC,UAAM,EAAE,GAAG,GAAG,OAAO,OAAO,IAAI;AAChC,QAAI,SAAS,KAAK,UAAU,EAAG;AAE/B,UAAM,YAAQ,+BAAiB,KAAK,MAAM;AAE1C,QAAI,KAAK,OAAO,WAAW,KAAK,CAAC,KAAK,WAAW;AAE7C,aAAO,YAAY,GAAG,OAAG,uBAAS,KAAK,cAAc,KAAK,GAAG,EAAE,GAAG,OAAO,KAAK,KAAK,CAAC;AACpF;AAAA,IACJ;AAGA,UAAM,eAAe,KAAK,QACpB,KAAK,MAAM,OAAO,KAAK,OAAO,MAAM,IACpC,KAAK;AAGX,UAAM,eAAe,QAAQ;AAC7B,QAAI,UAAU;AACd,QAAI,KAAK,aAAa,cAAc;AAChC,gBAAU,KAAK,aAAa;AAAA,IAChC;AAEA,UAAM,cAAc,aAAa,MAAM,SAAS,UAAU,YAAY;AACtE,WAAO,YAAY,GAAG,GAAG,aAAa,KAAK;AAG3C,QAAI,KAAK,WAAW;AAChB,YAAM,kBAAkB,IAAI,KAAK,aAAa;AAC9C,UAAI,mBAAmB,KAAK,kBAAkB,IAAI,OAAO;AACrD,cAAM,aAAa,KAAK,aAAa,aAAa,SAC5C,aAAa,KAAK,UAAU,IAC5B;AACN,eAAO,QAAQ,iBAAiB,GAAG;AAAA,UAC/B,MAAM;AAAA,UACN,GAAG;AAAA,UACH,SAAS;AAAA,QACb,CAAC;AAAA,MACL;AAAA,IACJ;AAAA,EACJ;AACJ;;;ACvIA,IAAAC,eAA6F;AAwCtF,IAAM,QAAN,cAAoB,OAAO;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAER,YACI,SACA,MACA,QAAwB,CAAC,GACzB,UAAwB,CAAC,GAC3B;AACE,UAAM,KAAK;AACX,SAAK,WAAW;AAChB,SAAK,QAAQ;AACb,SAAK,cAAc,QAAQ,cAAc;AACzC,SAAK,eAAe,QAAQ,eAAe,EAAE,MAAM,SAAS,MAAM,OAAO;AACzE,SAAK,UAAU,QAAQ,UAAU;AACjC,SAAK,eAAe,QAAQ,eAAe,EAAE,MAAM,SAAS,MAAM,cAAc;AAChF,SAAK,aAAa,QAAQ,aAAa;AAAA,EAC3C;AAAA,EAEA,QAAQ,MAAwB;AAC5B,SAAK,QAAQ;AAAA,EACjB;AAAA,EAEU,YAAY,QAAsB;AACxC,UAAM,OAAO,KAAK,gBAAgB;AAClC,UAAM,EAAE,GAAG,GAAG,OAAO,OAAO,IAAI;AAChC,QAAI,SAAS,KAAK,UAAU,EAAG;AAE/B,UAAM,YAAQ,+BAAiB,KAAK,MAAM;AAC1C,UAAM,eAAW,0BAAY,KAAK,UAAU;AAG5C,UAAM,YAAY,KAAK;AAAA,MACnB,SAAS,KAAK,SAAS,SAAS,KAAK;AAAA,IACzC;AAEA,QAAI,MAAM;AAGV,QAAI,KAAK,eAAe,MAAM,QAAQ;AAClC,UAAI,KAAK;AACT,eAAS,IAAI,GAAG,IAAI,KAAK,SAAS,QAAQ,KAAK;AAC3C,cAAM,MAAM,KAAK,SAAS,CAAC;AAC3B,cAAM,WAAW,KAAK,WAAW,IAAI,QAAQ,UAAU,CAAC,GAAG,IAAI,SAAS,MAAM;AAC9E,eAAO,YAAY,IAAI,IAAI,KAAK,UAAU;AAAA,UACtC,GAAG;AAAA,UACH,IAAI,KAAK;AAAA,UACT,MAAM;AAAA,QACV,CAAC;AACD,cAAM,UAAU,CAAC;AACjB,YAAI,IAAI,KAAK,SAAS,SAAS,GAAG;AAC9B,iBAAO,YAAY,IAAI,IAAI,KAAK,KAAK,YAAY,EAAE,GAAG,OAAO,KAAK,KAAK,CAAC;AACxE,gBAAM;AAAA,QACV;AAAA,MACJ;AACA;AAGA,UAAI,MAAM,QAAQ;AACd,cAAM,UAAU,SAAI,OAAO,KAAK;AAChC,eAAO,YAAY,GAAG,IAAI,KAAK,SAAS,EAAE,GAAG,OAAO,KAAK,KAAK,CAAC;AAC/D;AAAA,MACJ;AAAA,IACJ;AAGA,aAAS,IAAI,GAAG,IAAI,KAAK,MAAM,UAAU,MAAM,QAAQ,KAAK;AACxD,YAAM,UAAU,KAAK,MAAM,CAAC;AAC5B,YAAM,WAAW,KAAK,WAAW,IAAI,MAAM;AAC3C,UAAI,KAAK;AAET,eAAS,IAAI,GAAG,IAAI,KAAK,SAAS,QAAQ,KAAK;AAC3C,cAAM,MAAM,KAAK,SAAS,CAAC;AAC3B,cAAM,WAAW,OAAO,QAAQ,IAAI,GAAG,KAAK,EAAE;AAC9C,cAAM,WAAW,KAAK,WAAW,UAAU,UAAU,CAAC,GAAG,IAAI,SAAS,MAAM;AAE5E,eAAO,YAAY,IAAI,IAAI,KAAK,UAAU;AAAA,UACtC,GAAG;AAAA,UACH,IAAI,WAAW,KAAK,eAAe,MAAM;AAAA,QAC7C,CAAC;AACD,cAAM,UAAU,CAAC;AACjB,YAAI,IAAI,KAAK,SAAS,SAAS,GAAG;AAC9B,iBAAO,YAAY,IAAI,IAAI,KAAK,KAAK,YAAY;AAAA,YAC7C,GAAG;AAAA,YACH,KAAK;AAAA,YACL,IAAI,WAAW,KAAK,eAAe,MAAM;AAAA,UAC7C,CAAC;AACD,gBAAM;AAAA,QACV;AAAA,MACJ;AAGA,UAAI,UAAU;AACV,iBAAS,KAAK,IAAI,KAAK,IAAI,OAAO,MAAM;AACpC,iBAAO,QAAQ,IAAI,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,KAAK,aAAa,CAAC;AAAA,QACpE;AAAA,MACJ;AAEA;AAAA,IACJ;AAAA,EACJ;AAAA,EAEQ,qBAAqB,YAA8B;AACvD,UAAM,YAAY,KAAK,SAAS,OAAO,OAAK,EAAE,UAAU,MAAS;AACjE,UAAM,WAAW,KAAK,SAAS,OAAO,OAAK,EAAE,UAAU,MAAS;AAEhE,QAAI,YAAY,UAAU,OAAO,CAAC,KAAK,MAAM,OAAO,EAAE,SAAS,IAAI,CAAC;AACpE,UAAM,iBAAiB,KAAK,IAAI,GAAG,aAAa,SAAS;AACzD,UAAM,YAAY,SAAS,SAAS,IAAI,KAAK,MAAM,iBAAiB,SAAS,MAAM,IAAI;AAEvF,WAAO,KAAK,SAAS,IAAI,OAAK,EAAE,SAAS,SAAS;AAAA,EACtD;AAAA,EAEQ,WAAW,MAAc,OAAe,OAA4C;AACxF,UAAM,gBAAY,uBAAS,MAAM,KAAK;AACtC,UAAM,gBAAY,0BAAY,SAAS;AACvC,UAAM,MAAM,KAAK,IAAI,GAAG,QAAQ,SAAS;AAEzC,YAAQ,OAAO;AAAA,MACX,KAAK;AACD,eAAO,IAAI,OAAO,GAAG,IAAI;AAAA,MAC7B,KAAK,UAAU;AACX,cAAM,OAAO,KAAK,MAAM,MAAM,CAAC;AAC/B,cAAM,QAAQ,MAAM;AACpB,eAAO,IAAI,OAAO,IAAI,IAAI,YAAY,IAAI,OAAO,KAAK;AAAA,MAC1D;AAAA,MACA,KAAK;AAAA,MACL;AACI,eAAO,YAAY,IAAI,OAAO,GAAG;AAAA,IACzC;AAAA,EACJ;AACJ;;;ACjLA,IAAAC,eAAmF;AAgB5E,IAAM,QAAN,cAAoB,OAAO;AAAA,EACtB;AAAA,EACA,SAAiB;AAAA,EACjB;AAAA,EACA;AAAA,EAER,YAAY,OAAe,QAAwB,CAAC,GAAG,OAAqB,CAAC,GAAG;AAC5E,UAAM,KAAK;AACX,SAAK,SAAS;AACd,SAAK,SAAS,KAAK,SAAS,EAAE,MAAM,SAAS,MAAM,QAAQ;AAC3D,SAAK,aAAa,KAAK,aAAa;AAAA,EACxC;AAAA,EAEA,SAAS,OAAqB;AAC1B,SAAK,SAAS,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,KAAK,CAAC;AAAA,EAChD;AAAA,EAEA,WAAmB;AACf,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,SAAS,OAAqB;AAC1B,SAAK,SAAS;AAAA,EAClB;AAAA,EAEU,YAAY,QAAsB;AACxC,UAAM,OAAO,KAAK,gBAAgB;AAClC,UAAM,EAAE,GAAG,GAAG,OAAO,OAAO,IAAI;AAChC,QAAI,SAAS,KAAK,UAAU,EAAG;AAE/B,UAAM,YAAQ,+BAAiB,KAAK,MAAM;AAG1C,UAAM,WAAW,KAAK,SAAS;AAC/B,UAAM,aAAa,KAAK,aAAa,IAAI,KAAK,MAAM,KAAK,SAAS,GAAG,CAAC,MAAM;AAC5E,UAAM,iBAAa,0BAAY,QAAQ;AACvC,UAAM,mBAAe,0BAAY,UAAU;AAC3C,UAAM,WAAW,KAAK,IAAI,GAAG,QAAQ,aAAa,YAAY;AAG9D,WAAO,YAAY,GAAG,GAAG,UAAU,EAAE,GAAG,OAAO,MAAM,KAAK,CAAC;AAG3D,UAAM,SAAS,KAAK,MAAM,WAAW,KAAK,MAAM;AAChD,UAAM,OAAO,IAAI;AACjB,aAAS,IAAI,GAAG,IAAI,UAAU,KAAK;AAC/B,YAAM,OAAO,IAAI,SAAS,WAAM;AAChC,aAAO,QAAQ,OAAO,GAAG,GAAG;AAAA,QACxB;AAAA,QACA,IAAI,IAAI,SAAS,KAAK,SAAS,EAAE,MAAM,SAAS,MAAM,cAAc;AAAA,MACxE,CAAC;AAAA,IACL;AAGA,QAAI,KAAK,YAAY;AACjB,aAAO,YAAY,OAAO,UAAU,GAAG,YAAY;AAAA,QAC/C,GAAG;AAAA,QACH,MAAM;AAAA,MACV,CAAC;AAAA,IACL;AAAA,EACJ;AACJ;;;AC7EA,IAAAC,eAAsE;AAWtE,IAAM,cAAc,CAAC,UAAK,UAAK,UAAK,UAAK,UAAK,UAAK,UAAK,QAAG;AAQpD,IAAM,YAAN,cAAwB,OAAO;AAAA,EAC1B;AAAA,EACA,QAAkB,CAAC;AAAA,EACnB;AAAA,EACA;AAAA,EAER,YAAY,OAAe,QAAwB,CAAC,GAAG,OAAyB,CAAC,GAAG;AAChF,UAAM,KAAK;AACX,SAAK,SAAS;AACd,SAAK,SAAS,KAAK,SAAS,EAAE,MAAM,SAAS,MAAM,OAAO;AAC1D,SAAK,aAAa,KAAK,aAAa;AAAA,EACxC;AAAA,EAEA,QAAQ,MAAsB;AAC1B,SAAK,QAAQ;AAAA,EACjB;AAAA,EAEA,UAAU,OAAqB;AAC3B,SAAK,MAAM,KAAK,KAAK;AAAA,EACzB;AAAA,EAEU,YAAY,QAAsB;AACxC,UAAM,OAAO,KAAK,gBAAgB;AAClC,UAAM,EAAE,GAAG,GAAG,OAAO,OAAO,IAAI;AAChC,QAAI,SAAS,KAAK,UAAU,EAAG;AAE/B,UAAM,YAAQ,+BAAiB,KAAK,MAAM;AAC1C,UAAM,WAAW,KAAK,SAAS;AAC/B,UAAM,aAAa,SAAS;AAG5B,WAAO,YAAY,GAAG,GAAG,UAAU,EAAE,GAAG,OAAO,MAAM,KAAK,CAAC;AAG3D,UAAM,aAAa,QAAQ;AAC3B,QAAI,cAAc,KAAK,KAAK,MAAM,WAAW,EAAG;AAGhD,UAAM,OAAO,KAAK,MAAM,MAAM,CAAC,UAAU;AAGzC,UAAM,MAAM,KAAK,IAAI,GAAG,IAAI;AAC5B,UAAM,MAAM,KAAK,IAAI,GAAG,IAAI;AAC5B,UAAM,QAAQ,MAAM,OAAO;AAE3B,aAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AAClC,YAAM,cAAc,KAAK,CAAC,IAAI,OAAO;AACrC,YAAM,UAAU,KAAK,IAAI,GAAG,KAAK,MAAM,aAAa,CAAC,CAAC;AACtD,aAAO,QAAQ,IAAI,aAAa,GAAG,GAAG;AAAA,QAClC,MAAM,YAAY,OAAO;AAAA,QACzB,IAAI,KAAK;AAAA,MACb,CAAC;AAAA,IACL;AAGA,QAAI,KAAK,cAAc,SAAS,GAAG;AAC/B,YAAM,WAAW,GAAG,IAAI,QAAQ,CAAC,CAAC,SAAI,IAAI,QAAQ,CAAC,CAAC;AACpD,aAAO,YAAY,IAAI,YAAY,IAAI,GAAG,UAAU;AAAA,QAChD,GAAG;AAAA,QACH,KAAK;AAAA,MACT,CAAC;AAAA,IACL;AAAA,EACJ;AACJ;;;AClFA,IAAAC,gBAAsE;AAiB/D,IAAM,kBAAN,cAA8B,OAAO;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAER,YAAY,OAAe,MAAe,QAAwB,CAAC,GAAG,OAA+B,CAAC,GAAG;AACrG,UAAM,KAAK;AACX,SAAK,SAAS;AACd,SAAK,QAAQ;AACb,SAAK,WAAW,KAAK,WAAW,EAAE,MAAM,SAAS,MAAM,QAAQ;AAC/D,SAAK,aAAa,KAAK,aAAa,EAAE,MAAM,SAAS,MAAM,MAAM;AAAA,EACrE;AAAA,EAEA,UAAU,MAAqB;AAC3B,SAAK,QAAQ;AAAA,EACjB;AAAA,EAEA,YAAqB;AACjB,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,SAAS,OAAqB;AAC1B,SAAK,SAAS;AAAA,EAClB;AAAA,EAEU,YAAY,QAAsB;AACxC,UAAM,OAAO,KAAK,gBAAgB;AAClC,UAAM,EAAE,GAAG,GAAG,OAAO,OAAO,IAAI;AAChC,QAAI,SAAS,KAAK,UAAU,EAAG;AAE/B,UAAM,YAAQ,gCAAiB,KAAK,MAAM;AAC1C,UAAM,MAAM,KAAK,QAAQ,WAAM;AAC/B,UAAM,aAAa,KAAK,QAAQ,WAAW;AAC3C,UAAM,QAAQ,KAAK,QAAQ,KAAK,WAAW,KAAK;AAEhD,WAAO,QAAQ,GAAG,GAAG,EAAE,MAAM,KAAK,IAAI,MAAM,CAAC;AAC7C,WAAO,YAAY,IAAI,GAAG,GAAG,GAAG,KAAK,MAAM,WAAM,UAAU,IAAI;AAAA,MAC3D,GAAG;AAAA,MACH,IAAI;AAAA,IACR,CAAC;AAAA,EACL;AACJ;;;AC3DA,IAAAC,gBAAsE;AA6B/D,IAAM,cAAN,cAA0B,OAAO;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAER,YAAY,QAAwB,CAAC,GAAG,UAA8B,CAAC,GAAG;AACtE,UAAM,EAAE,QAAQ,GAAG,GAAG,MAAM,CAAC;AAC7B,SAAK,SAAS,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,QAAQ,SAAS,CAAC,CAAC;AACzD,SAAK,YAAY,QAAQ,YAAY;AACrC,SAAK,aAAa,QAAQ,aAAa;AACvC,SAAK,aAAa,QAAQ,aAAa,EAAE,MAAM,SAAS,MAAM,QAAQ;AACtE,SAAK,aAAa,QAAQ,aAAa;AACvC,SAAK,eAAe,QAAQ,eAAe;AAC3C,SAAK,SAAS,QAAQ,SAAS;AAAA,EACnC;AAAA;AAAA,EAGA,SAAS,OAAqB;AAC1B,SAAK,SAAS,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,KAAK,CAAC;AAAA,EAChD;AAAA,EAEA,IAAI,QAAgB;AAAE,WAAO,KAAK;AAAA,EAAQ;AAAA,EAEhC,YAAY,QAAsB;AACxC,UAAM,OAAO,KAAK,gBAAgB;AAClC,UAAM,EAAE,GAAG,GAAG,MAAM,IAAI;AACxB,QAAI,SAAS,EAAG;AAEhB,UAAM,YAAQ,gCAAiB,KAAK,MAAM;AAG1C,QAAI,QAAQ;AACZ,QAAI,KAAK,YAAY;AACjB,UAAI,KAAK,iBAAiB,WAAW;AACjC,gBAAQ,IAAI,KAAK,MAAM,KAAK,SAAS,GAAG,CAAC;AAAA,MAC7C,OAAO;AACH,gBAAQ,IAAI,KAAK,MAAM,KAAK,SAAS,KAAK,MAAM,CAAC,IAAI,KAAK,MAAM;AAAA,MACpE;AAAA,IACJ;AAEA,UAAM,WAAW,KAAK,IAAI,GAAG,QAAQ,MAAM,MAAM;AACjD,UAAM,SAAS,KAAK,MAAM,WAAW,KAAK,MAAM;AAChD,UAAM,QAAQ,WAAW;AAGzB,aAAS,IAAI,GAAG,IAAI,QAAQ,KAAK;AAC7B,aAAO,QAAQ,IAAI,GAAG,GAAG,EAAE,MAAM,KAAK,WAAW,GAAG,OAAO,IAAI,KAAK,WAAW,CAAC;AAAA,IACpF;AACA,aAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AAC5B,aAAO,QAAQ,IAAI,SAAS,GAAG,GAAG,EAAE,MAAM,KAAK,YAAY,GAAG,OAAO,KAAK,KAAK,CAAC;AAAA,IACpF;AAGA,QAAI,OAAO;AACP,aAAO,YAAY,IAAI,UAAU,GAAG,OAAO,EAAE,GAAG,OAAO,MAAM,KAAK,CAAC;AAAA,IACvE;AAAA,EACJ;AACJ;;;AC1FA,IAAAC,gBAAsE;AAM/D,IAAM,iBAAyE;AAAA,EAClF,MAAM;AAAA,IACF,QAAQ,CAAC,UAAK,UAAK,UAAK,UAAK,UAAK,UAAK,UAAK,UAAK,UAAK,QAAG;AAAA,IACzD,UAAU;AAAA,EACd;AAAA,EACA,MAAM;AAAA,IACF,QAAQ,CAAC,KAAK,MAAM,KAAK,GAAG;AAAA,IAC5B,UAAU;AAAA,EACd;AAAA,EACA,MAAM;AAAA,IACF,QAAQ,CAAC,UAAK,UAAK,UAAK,UAAK,UAAK,QAAG;AAAA,IACrC,UAAU;AAAA,EACd;AAAA,EACA,KAAK;AAAA,IACD,QAAQ,CAAC,UAAK,UAAK,UAAK,UAAK,UAAK,QAAG;AAAA,IACrC,UAAU;AAAA,EACd;AAAA,EACA,QAAQ;AAAA,IACJ,QAAQ,CAAC,UAAK,UAAK,UAAK,QAAG;AAAA,IAC3B,UAAU;AAAA,EACd;AAAA,EACA,QAAQ;AAAA,IACJ,QAAQ,CAAC,UAAK,UAAK,UAAK,QAAG;AAAA,IAC3B,UAAU;AAAA,EACd;AAAA,EACA,OAAO;AAAA,IACH,QAAQ,CAAC,UAAK,UAAK,UAAK,UAAK,UAAK,UAAK,UAAK,QAAG;AAAA,IAC/C,UAAU;AAAA,EACd;AAAA,EACA,OAAO;AAAA,IACH,QAAQ,CAAC,aAAM,aAAM,aAAM,aAAM,aAAM,aAAM,aAAM,aAAM,aAAM,aAAM,aAAM,WAAI;AAAA,IAC/E,UAAU;AAAA,EACd;AACJ;AAoBO,IAAM,UAAN,cAAsB,OAAO;AAAA,EACxB;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ,WAAW;AAAA,EAEnB,YAAY,QAAwB,CAAC,GAAG,UAA0B,CAAC,GAAG;AAClE,UAAM,EAAE,QAAQ,GAAG,GAAG,MAAM,CAAC;AAE7B,UAAM,aAAa,OAAO,QAAQ,YAAY,WACvC,eAAe,QAAQ,OAAO,KAAK,eAAe,OAClD,QAAQ,WAAW,eAAe;AAEzC,SAAK,UAAU,WAAW;AAC1B,SAAK,YAAY,WAAW;AAC5B,SAAK,SAAS,QAAQ,SAAS;AAC/B,SAAK,SAAS,QAAQ,SAAS,EAAE,MAAM,SAAS,MAAM,OAAO;AAAA,EACjE;AAAA;AAAA,EAGA,SAAS,OAAqB;AAC1B,SAAK,SAAS;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,KAAK,SAAuB;AACxB,SAAK,YAAY;AACjB,QAAI,KAAK,YAAY,KAAK,WAAW;AACjC,WAAK,eAAe,KAAK,cAAc,KAAK,KAAK,QAAQ;AACzD,WAAK,WAAW;AAAA,IACpB;AAAA,EACJ;AAAA,EAEU,YAAY,QAAsB;AACxC,UAAM,OAAO,KAAK,gBAAgB;AAClC,UAAM,EAAE,GAAG,GAAG,MAAM,IAAI;AACxB,QAAI,SAAS,EAAG;AAEhB,UAAM,YAAQ,gCAAiB,KAAK,MAAM;AAC1C,UAAM,QAAQ,KAAK,QAAQ,KAAK,WAAW;AAG3C,WAAO,YAAY,GAAG,GAAG,OAAO,EAAE,GAAG,OAAO,IAAI,KAAK,OAAO,CAAC;AAG7D,QAAI,KAAK,QAAQ;AACb,aAAO,YAAY,IAAI,GAAG,GAAG,KAAK,QAAQ,KAAK;AAAA,IACnD;AAAA,EACJ;AACJ;","names":["import_core","import_core","import_core","import_core","import_core","import_core","import_core","import_core","import_core","import_core","import_core"]}
@@ -0,0 +1,469 @@
1
+ import { Style, Rect, EventEmitter, KeyEvent, MouseEvent, LayoutNode, Screen, Color } from '@termuijs/core';
2
+
3
+ /**
4
+ * Event map for widgets.
5
+ */
6
+ interface WidgetEvents {
7
+ key: KeyEvent;
8
+ mouse: MouseEvent;
9
+ focus: void;
10
+ blur: void;
11
+ mount: void;
12
+ unmount: void;
13
+ }
14
+ /**
15
+ * Base class for all TermUI widgets.
16
+ *
17
+ * Provides:
18
+ * - Unique ID generation
19
+ * - Style management and merging
20
+ * - Layout node generation with rect sync
21
+ * - Border/padding rendering into the screen buffer
22
+ * - Child management
23
+ * - Focus support
24
+ * - Event emission
25
+ */
26
+ declare abstract class Widget {
27
+ /** Unique widget identifier */
28
+ readonly id: string;
29
+ /** Widget's style */
30
+ protected _style: Style;
31
+ /** Child widgets */
32
+ protected _children: Widget[];
33
+ /** Parent widget (null for root) */
34
+ parent: Widget | null;
35
+ /** Computed layout rectangle */
36
+ protected _rect: Rect;
37
+ /** Reference to the layout node (set during getLayoutNode) */
38
+ private _layoutNode;
39
+ /** Whether this widget can receive focus */
40
+ focusable: boolean;
41
+ /** Tab index for focus ordering */
42
+ tabIndex: number;
43
+ /** Event emitter for this widget */
44
+ readonly events: EventEmitter<WidgetEvents>;
45
+ /** Whether the widget is currently focused */
46
+ isFocused: boolean;
47
+ /**
48
+ * Dirty flag — true when this widget needs re-rendering.
49
+ * Newly created widgets start dirty.
50
+ */
51
+ protected _dirty: boolean;
52
+ constructor(style?: Partial<Style>);
53
+ /** Get the current style */
54
+ get style(): Style;
55
+ /** Update the style (merge with existing) */
56
+ setStyle(style: Partial<Style>): void;
57
+ /** Get the computed rect after layout */
58
+ get rect(): Rect;
59
+ /** Add a child widget */
60
+ addChild(child: Widget): void;
61
+ /** Remove a child widget */
62
+ removeChild(child: Widget): void;
63
+ /** Remove all children */
64
+ clearChildren(): void;
65
+ /** Get all children */
66
+ get children(): ReadonlyArray<Widget>;
67
+ /**
68
+ * Build the LayoutNode tree for this widget.
69
+ * Stores a reference so we can sync computed rects back via syncLayout().
70
+ */
71
+ getLayoutNode(): LayoutNode;
72
+ /**
73
+ * After computeLayout() has been called, sync the computed rects
74
+ * from the layout tree back into widget `_rect` fields.
75
+ * This MUST be called after computeLayout() and before render().
76
+ */
77
+ syncLayout(): void;
78
+ /**
79
+ * Render this widget (and children) into the screen buffer.
80
+ * Automatically pushes a clip region if overflow is hidden (default).
81
+ */
82
+ render(screen: Screen): void;
83
+ /**
84
+ * Override this to render the widget's own content.
85
+ * The rect is available as `this._rect`.
86
+ */
87
+ protected abstract _renderSelf(screen: Screen): void;
88
+ /**
89
+ * Update the computed rect from layout results.
90
+ */
91
+ updateRect(rect: Rect): void;
92
+ /**
93
+ * Mark this widget as needing re-render.
94
+ * Propagates up to parent so the render loop can detect changes.
95
+ */
96
+ markDirty(): void;
97
+ /**
98
+ * Clear the dirty flag after rendering.
99
+ */
100
+ clearDirty(): void;
101
+ /** Check if this widget (or any child) needs re-rendering */
102
+ get isDirty(): boolean;
103
+ /**
104
+ * Render the border around this widget, including focus ring if focused.
105
+ */
106
+ protected _renderBorder(screen: Screen): void;
107
+ /**
108
+ * Get the inner content area (after border + padding).
109
+ */
110
+ protected _getContentRect(): Rect;
111
+ /**
112
+ * Check if a point hits this widget.
113
+ */
114
+ hitTest(x: number, y: number): boolean;
115
+ /** Lifecycle: called when the widget is mounted */
116
+ mount(): void;
117
+ /** Lifecycle: called when the widget is unmounted */
118
+ unmount(): void;
119
+ }
120
+
121
+ /**
122
+ * Box — the fundamental container widget, similar to a `<div>`.
123
+ *
124
+ * Supports:
125
+ * - Flexbox layout (row/column)
126
+ * - Border styles (single/double/round/heavy/dashed)
127
+ * - Padding and margin
128
+ * - Background color
129
+ */
130
+ declare class Box extends Widget {
131
+ constructor(style?: Partial<Style>);
132
+ protected _renderSelf(screen: Screen): void;
133
+ }
134
+
135
+ interface TextProps {
136
+ content: string;
137
+ wrap?: boolean;
138
+ align?: 'left' | 'center' | 'right';
139
+ }
140
+ /**
141
+ * Text — renders a string of text with word-wrapping and alignment.
142
+ */
143
+ declare class Text extends Widget {
144
+ private _content;
145
+ private _wrap;
146
+ private _align;
147
+ constructor(content: string, style?: Partial<Style>, props?: Partial<TextProps>);
148
+ /** Update the text content */
149
+ setContent(content: string): void;
150
+ /** Get current text content */
151
+ getContent(): string;
152
+ protected _renderSelf(screen: Screen): void;
153
+ }
154
+
155
+ interface LogViewOptions {
156
+ /** Highlight rules: keyword → color */
157
+ highlight?: Record<string, Color>;
158
+ /** Auto-scroll to bottom */
159
+ autoScroll?: boolean;
160
+ }
161
+ /**
162
+ * LogView — scrollable, highlighted log output.
163
+ *
164
+ * Supports keyword-based color highlighting (ERROR → red, WARN → yellow, etc.)
165
+ */
166
+ declare class LogView extends Widget {
167
+ private _lines;
168
+ private _scrollOffset;
169
+ private _highlight;
170
+ private _autoScroll;
171
+ constructor(style?: Partial<Style>, opts?: LogViewOptions);
172
+ setLines(lines: string[]): void;
173
+ appendLine(line: string): void;
174
+ scrollUp(n?: number): void;
175
+ scrollDown(n?: number): void;
176
+ private _scrollToBottom;
177
+ protected _renderSelf(screen: Screen): void;
178
+ private _getLineColor;
179
+ }
180
+
181
+ interface ListItem {
182
+ label: string;
183
+ value: string;
184
+ disabled?: boolean;
185
+ }
186
+ /**
187
+ * List — a scrollable, selectable list of items.
188
+ *
189
+ * Supports:
190
+ * - Keyboard navigation (up/down/Home/End)
191
+ * - Scrolling when items exceed visible height
192
+ * - Custom item styling
193
+ * - Disabled items
194
+ */
195
+ declare class List extends Widget {
196
+ private _items;
197
+ private _selectedIndex;
198
+ private _scrollOffset;
199
+ private _onSelect?;
200
+ constructor(items: ListItem[], style?: Partial<Style>, onSelect?: (item: ListItem, index: number) => void);
201
+ get selectedIndex(): number;
202
+ get selectedItem(): ListItem | undefined;
203
+ setItems(items: ListItem[]): void;
204
+ /** Move selection up */
205
+ selectPrev(): void;
206
+ /** Move selection down */
207
+ selectNext(): void;
208
+ /** Confirm the current selection */
209
+ confirm(): void;
210
+ protected _renderSelf(screen: Screen): void;
211
+ private _clampScroll;
212
+ }
213
+
214
+ /**
215
+ * TextInput — a single-line text input field.
216
+ *
217
+ * Supports:
218
+ * - Cursor movement (left/right/Home/End)
219
+ * - Character insertion and deletion
220
+ * - Placeholder text
221
+ * - Password masking
222
+ * - Max length constraint
223
+ */
224
+ declare class TextInput extends Widget {
225
+ private _value;
226
+ private _cursorPos;
227
+ private _placeholder;
228
+ private _mask;
229
+ private _maxLength;
230
+ private _onChange?;
231
+ private _onSubmit?;
232
+ constructor(style?: Partial<Style>, options?: {
233
+ placeholder?: string;
234
+ mask?: string;
235
+ maxLength?: number;
236
+ onChange?: (value: string) => void;
237
+ onSubmit?: (value: string) => void;
238
+ });
239
+ get value(): string;
240
+ set value(v: string);
241
+ /**
242
+ * Handle a typed character.
243
+ */
244
+ insertChar(char: string): void;
245
+ /**
246
+ * Delete the character before the cursor.
247
+ */
248
+ deleteBack(): void;
249
+ /**
250
+ * Delete the character after the cursor.
251
+ */
252
+ deleteForward(): void;
253
+ moveCursorLeft(): void;
254
+ moveCursorRight(): void;
255
+ moveCursorHome(): void;
256
+ moveCursorEnd(): void;
257
+ submit(): void;
258
+ clear(): void;
259
+ protected _renderSelf(screen: Screen): void;
260
+ }
261
+
262
+ interface TableColumn {
263
+ /** Column header label */
264
+ header: string;
265
+ /** Key to pull data from row objects */
266
+ key: string;
267
+ /** Fixed width (chars). If omitted, auto-distributes. */
268
+ width?: number;
269
+ /** Text alignment within the column */
270
+ align?: 'left' | 'center' | 'right';
271
+ }
272
+ type TableRow = Record<string, string | number>;
273
+ interface TableOptions {
274
+ /** Whether to show the header row */
275
+ showHeader?: boolean;
276
+ /** Color for the header row */
277
+ headerColor?: Color;
278
+ /** Whether rows are zebra-striped */
279
+ stripe?: boolean;
280
+ /** Stripe color */
281
+ stripeColor?: Color;
282
+ /** Column separator character */
283
+ separator?: string;
284
+ }
285
+ /**
286
+ * Table — renders tabular data with columns, headers, and optional zebra-striping.
287
+ *
288
+ * Supports:
289
+ * - Auto-width column distribution
290
+ * - Fixed and percentage widths
291
+ * - Header styling
292
+ * - Zebra striping
293
+ * - Text alignment per column
294
+ * - Truncation for overflow
295
+ */
296
+ declare class Table extends Widget {
297
+ private _columns;
298
+ private _rows;
299
+ private _showHeader;
300
+ private _headerColor;
301
+ private _stripe;
302
+ private _stripeColor;
303
+ private _separator;
304
+ constructor(columns: TableColumn[], rows: TableRow[], style?: Partial<Style>, options?: TableOptions);
305
+ setRows(rows: TableRow[]): void;
306
+ protected _renderSelf(screen: Screen): void;
307
+ private _computeColumnWidths;
308
+ private _alignText;
309
+ }
310
+
311
+ interface GaugeOptions {
312
+ /** Color of the filled portion */
313
+ color?: Color;
314
+ /** Show percentage label */
315
+ showLabel?: boolean;
316
+ }
317
+ /**
318
+ * Gauge — a self-contained metric display with label, bar, and value.
319
+ *
320
+ * Example:
321
+ * CPU ████████░░░░ 65%
322
+ */
323
+ declare class Gauge extends Widget {
324
+ private _label;
325
+ private _value;
326
+ private _color;
327
+ private _showLabel;
328
+ constructor(label: string, style?: Partial<Style>, opts?: GaugeOptions);
329
+ setValue(value: number): void;
330
+ getValue(): number;
331
+ setLabel(label: string): void;
332
+ protected _renderSelf(screen: Screen): void;
333
+ }
334
+
335
+ interface SparklineOptions {
336
+ /** Color of the sparkline */
337
+ color?: Color;
338
+ /** Show min/max labels */
339
+ showRange?: boolean;
340
+ }
341
+ /**
342
+ * Sparkline — a compact inline chart showing a data trend.
343
+ *
344
+ * Example:
345
+ * Latency ▂▃▅▇▅▃▂▁▃▅█▅▃
346
+ */
347
+ declare class Sparkline extends Widget {
348
+ private _label;
349
+ private _data;
350
+ private _color;
351
+ private _showRange;
352
+ constructor(label: string, style?: Partial<Style>, opts?: SparklineOptions);
353
+ setData(data: number[]): void;
354
+ pushValue(value: number): void;
355
+ protected _renderSelf(screen: Screen): void;
356
+ }
357
+
358
+ interface StatusIndicatorOptions {
359
+ /** Color when up/active */
360
+ upColor?: Color;
361
+ /** Color when down/inactive */
362
+ downColor?: Color;
363
+ }
364
+ /**
365
+ * StatusIndicator — simple up/down indicator with label.
366
+ *
367
+ * Example:
368
+ * ● API Server — Online
369
+ * ○ Worker — Offline
370
+ */
371
+ declare class StatusIndicator extends Widget {
372
+ private _label;
373
+ private _isUp;
374
+ private _upColor;
375
+ private _downColor;
376
+ constructor(label: string, isUp: boolean, style?: Partial<Style>, opts?: StatusIndicatorOptions);
377
+ setStatus(isUp: boolean): void;
378
+ getStatus(): boolean;
379
+ setLabel(label: string): void;
380
+ protected _renderSelf(screen: Screen): void;
381
+ }
382
+
383
+ interface ProgressBarOptions {
384
+ /** Current value (0–1) */
385
+ value?: number;
386
+ /** Character for the filled portion */
387
+ fillChar?: string;
388
+ /** Character for the empty portion */
389
+ emptyChar?: string;
390
+ /** Color of the filled portion */
391
+ fillColor?: Color;
392
+ /** Show percentage label */
393
+ showLabel?: boolean;
394
+ /** Label format: 'percent' | 'fraction' | 'custom' */
395
+ labelFormat?: 'percent' | 'fraction';
396
+ /** Total for fraction display */
397
+ total?: number;
398
+ }
399
+ /**
400
+ * ProgressBar — horizontal progress indicator.
401
+ *
402
+ * Supports:
403
+ * - Configurable fill/empty characters
404
+ * - Custom fill color
405
+ * - Percentage or fraction label
406
+ * - Smooth animation-ready value changes
407
+ */
408
+ declare class ProgressBar extends Widget {
409
+ private _value;
410
+ private _fillChar;
411
+ private _emptyChar;
412
+ private _fillColor;
413
+ private _showLabel;
414
+ private _labelFormat;
415
+ private _total;
416
+ constructor(style?: Partial<Style>, options?: ProgressBarOptions);
417
+ /** Set progress value (0–1) */
418
+ setValue(value: number): void;
419
+ get value(): number;
420
+ protected _renderSelf(screen: Screen): void;
421
+ }
422
+
423
+ /**
424
+ * Built-in spinner frame sets.
425
+ */
426
+ declare const SPINNER_FRAMES: Record<string, {
427
+ frames: string[];
428
+ interval: number;
429
+ }>;
430
+ interface SpinnerOptions {
431
+ /** Spinner preset name or custom frames */
432
+ spinner?: string | {
433
+ frames: string[];
434
+ interval: number;
435
+ };
436
+ /** Text label displayed after the spinner */
437
+ label?: string;
438
+ /** Color for the spinner frames */
439
+ color?: Color;
440
+ }
441
+ /**
442
+ * Spinner — animated loading indicator.
443
+ *
444
+ * Supports:
445
+ * - 8 built-in spinner presets
446
+ * - Custom frame sequences
447
+ * - Configurable color and label
448
+ * - Automatic frame advancement via tick()
449
+ */
450
+ declare class Spinner extends Widget {
451
+ private _frames;
452
+ private _interval;
453
+ private _frameIndex;
454
+ private _label;
455
+ private _color;
456
+ private _lastTick;
457
+ private _elapsed;
458
+ constructor(style?: Partial<Style>, options?: SpinnerOptions);
459
+ /** Update the spinner label */
460
+ setLabel(label: string): void;
461
+ /**
462
+ * Advance the spinner frame based on elapsed time.
463
+ * Call this with a delta (ms) from the render loop.
464
+ */
465
+ tick(deltaMs: number): void;
466
+ protected _renderSelf(screen: Screen): void;
467
+ }
468
+
469
+ export { Box, Gauge, type GaugeOptions, List, type ListItem, LogView, type LogViewOptions, ProgressBar, type ProgressBarOptions, SPINNER_FRAMES, Sparkline, type SparklineOptions, Spinner, type SpinnerOptions, StatusIndicator, type StatusIndicatorOptions, Table, type TableColumn, type TableOptions, type TableRow, Text, TextInput, type TextProps, Widget, type WidgetEvents };