@cli-use/tui 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/LICENSE +21 -0
- package/README.md +125 -0
- package/dist/cli/index.cjs +549 -0
- package/dist/cli/index.cjs.map +1 -0
- package/dist/cli/index.d.cts +1 -0
- package/dist/cli/index.d.ts +1 -0
- package/dist/cli/index.js +526 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/hooks/index.cjs +309 -0
- package/dist/hooks/index.cjs.map +1 -0
- package/dist/hooks/index.d.cts +4 -0
- package/dist/hooks/index.d.ts +4 -0
- package/dist/hooks/index.js +280 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/index-DAO84gkm.d.cts +272 -0
- package/dist/index-DAO84gkm.d.ts +272 -0
- package/dist/index.cjs +970 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +181 -0
- package/dist/index.d.ts +181 -0
- package/dist/index.js +917 -0
- package/dist/index.js.map +1 -0
- package/package.json +99 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/renderer/types.ts","../src/renderer/terminal.ts","../src/renderer/renderer.ts","../src/reconciler/index.ts","../src/reconciler/host-config.ts","../src/components/Box.tsx","../src/components/Text.tsx","../src/components/Flex.tsx","../src/components/Grid.tsx","../src/components/Button.tsx","../src/components/Input.tsx","../src/components/Progress.tsx","../src/hooks/useApp.ts","../src/hooks/useInput.ts","../src/hooks/useFocus.ts","../src/hooks/useStdout.ts","../src/hooks/useInterval.ts","../src/hooks/useAppState.ts","../src/hooks/useList.ts"],"sourcesContent":["// Main exports\nexport { Renderer, Buffer, Terminal, ANSI } from './renderer/index.js';\nexport { createRoot, render } from './reconciler/index.js';\nexport * from './components/index.js';\nexport * from './hooks/index.js';\n\n// Re-export React for convenience\nexport { default as React } from 'react';\n","/**\n * Terminal cell representation\n */\nexport interface Cell {\n char: string;\n fg?: number; // Foreground color (ANSI 256 or RGB)\n bg?: number; // Background color\n bold?: boolean;\n dim?: boolean;\n italic?: boolean;\n underline?: boolean;\n strikethrough?: boolean;\n}\n\n/**\n * Terminal buffer - a 2D grid of cells\n */\nexport class Buffer {\n constructor(\n public width: number,\n public height: number,\n public cells: Cell[][] = []\n ) {\n // Initialize empty buffer\n this.cells = Array.from({ length: height }, () =>\n Array.from({ length: width }, () => ({ char: ' ' }))\n );\n }\n\n setCell(x: number, y: number, cell: Cell): void {\n if (y >= 0 && y < this.height && x >= 0 && x < this.width) {\n this.cells[y][x] = cell;\n }\n }\n\n getCell(x: number, y: number): Cell | undefined {\n if (y >= 0 && y < this.height && x >= 0 && x < this.width) {\n return this.cells[y][x];\n }\n return undefined;\n }\n\n clear(): void {\n this.cells = Array.from({ length: this.height }, () =>\n Array.from({ length: this.width }, () => ({ char: ' ' }))\n );\n }\n\n resize(width: number, height: number): void {\n const newCells: Cell[][] = Array.from({ length: height }, () =>\n Array.from({ length: width }, () => ({ char: ' ' }))\n );\n\n // Copy existing content\n for (let y = 0; y < Math.min(this.height, height); y++) {\n for (let x = 0; x < Math.min(this.width, width); x++) {\n newCells[y][x] = this.cells[y][x];\n }\n }\n\n this.cells = newCells;\n this.width = width;\n this.height = height;\n }\n\n clone(): Buffer {\n const newBuffer = new Buffer(this.width, this.height);\n newBuffer.cells = this.cells.map((row) => row.map((cell) => ({ ...cell })));\n return newBuffer;\n }\n}\n\n/**\n * Terminal size\n */\nexport interface Size {\n cols: number;\n rows: number;\n}\n\n/**\n * Position in terminal\n */\nexport interface Position {\n x: number;\n y: number;\n}\n\n/**\n * Rectangle area\n */\nexport interface Rect {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n","import type { ReadStream, WriteStream } from 'node:tty';\nimport { Buffer, Size } from './types.js';\nimport * as readline from 'node:readline';\n\ntype ProcessStdin = ReadStream & NodeJS.ReadStream;\ntype ProcessStdout = WriteStream & NodeJS.WriteStream;\n\n/**\n * ANSI escape codes for terminal control\n */\nexport const ANSI = {\n // Screen control\n CLEAR_SCREEN: '\\x1b[2J',\n RESET_CURSOR: '\\x1b[H',\n ALTERNATE_SCREEN_ENABLE: '\\x1b[?1049h',\n ALTERNATE_SCREEN_DISABLE: '\\x1b[?1049l',\n\n // Cursor control\n HIDE_CURSOR: '\\x1b[?25l',\n SHOW_CURSOR: '\\x1b[?25h',\n MOVE_CURSOR: (x: number, y: number) => `\\x1b[${y + 1};${x + 1}H`,\n\n // Colors\n RESET_STYLE: '\\x1b[0m',\n FG_COLOR_256: (color: number) => `\\x1b[38;5;${color}m`,\n BG_COLOR_256: (color: number) => `\\x1b[48;5;${color}m`,\n FG_COLOR_RGB: (r: number, g: number, b: number) => `\\x1b[38;2;${r};${g};${b}m`,\n BG_COLOR_RGB: (r: number, g: number, b: number) => `\\x1b[48;2;${r};${g};${b}m`,\n\n // Text styles\n BOLD: '\\x1b[1m',\n DIM: '\\x1b[2m',\n ITALIC: '\\x1b[3m',\n UNDERLINE: '\\x1b[4m',\n STRIKETHROUGH: '\\x1b[9m',\n\n // Reset individual styles\n BOLD_OFF: '\\x1b[22m',\n DIM_OFF: '\\x1b[22m',\n ITALIC_OFF: '\\x1b[23m',\n UNDERLINE_OFF: '\\x1b[24m',\n STRIKETHROUGH_OFF: '\\x1b[29m',\n} as const;\n\n/**\n * Terminal interface - handles low-level terminal I/O\n */\nexport class Terminal {\n private stdin: ProcessStdin;\n private stdout: ProcessStdout;\n private _size: Size;\n private rawMode = false;\n private alternateScreen = false;\n\n constructor(stdin: ProcessStdin = process.stdin as ProcessStdin, stdout: ProcessStdout = process.stdout as ProcessStdout) {\n this.stdin = stdin;\n this.stdout = stdout;\n this._size = { cols: stdout.columns || 80, rows: stdout.rows || 24 };\n }\n\n get size(): Size {\n return this._size;\n }\n\n /**\n * Enable raw mode for character-by-character input\n */\n enableRawMode(): void {\n if (this.rawMode) return;\n this.rawMode = true;\n readline.emitKeypressEvents(this.stdin);\n (this.stdin as NodeJS.ReadStream).setRawMode(true);\n }\n\n /**\n * Disable raw mode\n */\n disableRawMode(): void {\n if (!this.rawMode) return;\n this.rawMode = false;\n (this.stdin as NodeJS.ReadStream).setRawMode(false);\n }\n\n /**\n * Enable alternate screen buffer\n */\n enableAlternateScreen(): void {\n if (this.alternateScreen) return;\n this.alternateScreen = true;\n this.stdout.write(ANSI.ALTERNATE_SCREEN_ENABLE);\n }\n\n /**\n * Disable alternate screen buffer\n */\n disableAlternateScreen(): void {\n if (!this.alternateScreen) return;\n this.alternateScreen = false;\n this.stdout.write(ANSI.ALTERNATE_SCREEN_DISABLE);\n }\n\n /**\n * Hide cursor\n */\n hideCursor(): void {\n this.stdout.write(ANSI.HIDE_CURSOR);\n }\n\n /**\n * Show cursor\n */\n showCursor(): void {\n this.stdout.write(ANSI.SHOW_CURSOR);\n }\n\n /**\n * Clear the entire screen\n */\n clear(): void {\n this.stdout.write(ANSI.CLEAR_SCREEN + ANSI.RESET_CURSOR);\n }\n\n /**\n * Write buffer to terminal\n */\n write(buffer: Buffer): void {\n let output = ANSI.RESET_STYLE;\n let lastStyle: string | null = null;\n\n for (let y = 0; y < buffer.height; y++) {\n for (let x = 0; x < buffer.width; x++) {\n const cell = buffer.getCell(x, y);\n if (!cell) continue;\n\n // Build style string\n const style = this.buildStyleString(cell);\n if (style !== lastStyle) {\n output += style;\n lastStyle = style;\n }\n\n // Add character\n output += cell.char;\n }\n // New line after each row\n output += '\\r\\n';\n }\n\n this.stdout.write(output);\n }\n\n /**\n * Build ANSI style string from cell\n */\n private buildStyleString(cell: { fg?: number; bg?: number; bold?: boolean; dim?: boolean }): string {\n let style = '';\n\n if (cell.fg !== undefined) {\n style += ANSI.FG_COLOR_256(cell.fg);\n }\n if (cell.bg !== undefined) {\n style += ANSI.BG_COLOR_256(cell.bg);\n }\n if (cell.bold) {\n style += ANSI.BOLD;\n }\n if (cell.dim) {\n style += ANSI.DIM;\n }\n\n return style;\n }\n\n /**\n * Set up SIGWINCH handler for terminal resize\n */\n onResize(callback: (size: Size) => void): () => void {\n const handler = () => {\n this._size = { cols: this.stdout.columns || 80, rows: this.stdout.rows || 24 };\n callback(this._size);\n };\n\n process.on('SIGWINCH', handler);\n\n return () => {\n process.off('SIGWINCH', handler);\n };\n }\n\n /**\n * Set up input handler\n */\n onInput(callback: (chunk: Buffer, key: readline.Key) => void): () => void {\n const handler = (chunk: Buffer, key: readline.Key) => {\n callback(chunk, key);\n };\n\n this.stdin.on('keypress', handler as any);\n\n return () => {\n this.stdin.off('keypress', handler as any);\n };\n }\n\n /**\n * Clean up terminal state\n */\n restore(): void {\n this.showCursor();\n this.disableAlternateScreen();\n this.disableRawMode();\n this.stdout.write(ANSI.RESET_STYLE);\n }\n}\n","import { Buffer, Size, Rect } from './types.js';\nimport { Terminal } from './terminal.js';\n\n/**\n * Renderer - manages the rendering lifecycle\n */\nexport class Renderer {\n private terminal: Terminal;\n private buffer?: Buffer;\n private previousBuffer?: Buffer;\n private currentSize: Size;\n private running = false;\n\n constructor(terminal = new Terminal()) {\n this.terminal = terminal;\n this.currentSize = terminal.size;\n }\n\n /**\n * Start the renderer\n */\n start(): void {\n if (this.running) return;\n this.running = true;\n\n // Setup terminal\n this.terminal.enableRawMode();\n this.terminal.enableAlternateScreen();\n this.terminal.hideCursor();\n this.terminal.clear();\n\n // Initialize buffer\n this.buffer = new Buffer(this.currentSize.cols, this.currentSize.rows);\n\n // Handle resize\n this.terminal.onResize((size) => {\n this.currentSize = size;\n this.buffer?.resize(size.cols, size.rows);\n });\n }\n\n /**\n * Stop the renderer\n */\n stop(): void {\n if (!this.running) return;\n this.running = false;\n\n this.terminal.restore();\n }\n\n /**\n * Get a writable buffer for the current frame\n */\n getBuffer(): Buffer {\n if (!this.buffer) {\n throw new Error('Renderer not started');\n }\n return this.buffer;\n }\n\n /**\n * Present the current buffer to the terminal\n */\n present(): void {\n if (!this.buffer) return;\n\n // For now, just write the entire buffer\n // TODO: Implement differential rendering for performance\n this.terminal.write(this.buffer);\n\n // Store for next frame comparison\n this.previousBuffer = this.buffer.clone();\n\n // Clear buffer for next frame\n this.buffer.clear();\n }\n\n /**\n * Get the current terminal size\n */\n getSize(): Size {\n return this.currentSize;\n }\n\n /**\n * Get the terminal instance for direct access\n */\n getTerminal(): Terminal {\n return this.terminal;\n }\n}\n","import ReactReconciler from 'react-reconciler';\nimport { hostConfig, TUIContainer, TUIProps } from './host-config.js';\nimport { Buffer, Renderer } from '../renderer/index.js';\n\n// Import React types\nimport type { ReactElement } from 'react';\n\n/**\n * Create a reconciler instance\n */\nexport const createReconciler = () => ReactReconciler(hostConfig);\n\n/**\n * Create a root container for rendering\n */\nexport const createRoot = (renderer: Renderer): TUIContainer => {\n const buffer = renderer.getBuffer();\n\n return {\n buffer,\n root: null,\n listeners: {},\n };\n};\n\n/**\n * Render a React element to the terminal\n */\nexport const render = (\n element: ReactElement,\n container: TUIContainer,\n renderer: Renderer\n) => {\n const reconciler = createReconciler();\n\n reconciler.updateContainer(element, container, null, () => {\n // Present the frame after React has finished rendering\n renderer.present();\n });\n};\n\n// Export types\nexport type { TUIContainer, TUIProps };\n","import type { HostConfig } from 'react-reconciler';\nimport type { Buffer } from '../renderer/types.js';\n\nexport interface TUIProps {\n style?: {\n fg?: number;\n bg?: number;\n bold?: boolean;\n dim?: boolean;\n italic?: boolean;\n underline?: boolean;\n };\n x?: number;\n y?: number;\n width?: number;\n height?: number;\n children?: any;\n}\n\nexport type TUIType = string;\n\nexport interface TUIElement {\n type: TUIType;\n props: TUIProps;\n children: TUIElement[];\n}\n\nexport interface TUIContainer {\n buffer: Buffer;\n root: TUIElement | null;\n listeners: {\n onInput?: (key: string) => void;\n onClick?: (x: number, y: number) => void;\n };\n}\n\nexport interface TUIInstance {\n type: TUIType;\n props: TUIProps;\n children: TUIInstance[];\n parent: TUIInstance | null;\n node: TUIElement;\n}\n\n// @ts-ignore - React reconciler types are complex\nexport const hostConfig = {\n supportsPersistence: false,\n supportsMutation: true,\n createInstance(type: any, props: any) {\n return { type, props: { ...props }, children: [], parent: null, node: { type, props: { ...props }, children: [] } };\n },\n appendInitialChild(parentInstance: any, child: any) {\n parentInstance.children.push(child);\n child.parent = parentInstance;\n },\n finalizeInitialChildren() { return false; },\n prepareUpdate() { return {}; },\n shouldSetTextContent(type: any) { return type === 'TEXT'; },\n createTextInstance(text: any) {\n return { type: 'TEXT', props: { children: text }, children: [], parent: null, node: { type: 'TEXT', props: { children: text }, children: [] } };\n },\n appendChildToContainer(container: any, child: any) {\n container.root = child;\n child.parent = null;\n },\n appendChild(parentInstance: any, child: any) {\n parentInstance.children.push(child);\n child.parent = parentInstance;\n },\n removeChild(parentInstance: any, child: any) {\n const index = parentInstance.children.indexOf(child);\n if (index !== -1) {\n parentInstance.children.splice(index, 1);\n child.parent = null;\n }\n },\n removeChildFromContainer(_container: any, child: any) { child.parent = null; },\n insertBefore(parentInstance: any, child: any, beforeChild: any) {\n const index = parentInstance.children.indexOf(beforeChild);\n if (index !== -1) {\n parentInstance.children.splice(index, 0, child);\n } else {\n parentInstance.children.push(child);\n }\n child.parent = parentInstance;\n },\n insertInContainerBefore() {},\n commitUpdate(instance: any, _updatePayload: any, _type: any, _oldProps: any, newProps: any) {\n instance.props = { ...newProps };\n instance.node.props = { ...newProps };\n },\n commitTextUpdate(textInstance: any, _oldText: any, newText: any) {\n textInstance.props.children = newText;\n textInstance.node.props.children = newText;\n },\n resetTextContent(instance: any) {\n if (instance.type === 'TEXT') {\n instance.props.children = '';\n instance.node.props.children = '';\n }\n },\n getPublicInstance(instance: any) { return instance; },\n getRootHostContext(rootContainer: any) { return rootContainer; },\n getChildHostContext(parentHostContext: any) { return parentHostContext; },\n prepareForCommit() { return null; },\n resetAfterCommit(container: any) {\n if (container.root) {\n renderToBuffer(container.root, container.buffer);\n }\n },\n shouldAttemptEagerTransition() { return false; },\n scheduleTimeout: setTimeout,\n cancelTimeout: clearTimeout,\n noTimeout: -1,\n getCurrentEventPriority() { return 0; },\n getInstanceFromNode(node: any) { return node; },\n beforeActiveInstanceBlur() {},\n afterActiveInstanceBlur() {},\n preparePortalMount() {},\n prepareScopeUpdate() {},\n getInstanceFromScope() { return null; },\n detachDeletedInstance() {},\n isPrimaryRenderer: true,\n supportsHydration: false,\n};\n\nfunction renderToBuffer(instance: any, buffer: Buffer, x = 0, y = 0): void {\n if (!instance) return;\n const { type, props, children } = instance;\n const currentX = props.x ?? x;\n const currentY = props.y ?? y;\n\n if (type === 'TEXT' || typeof props.children === 'string') {\n const text = String(props.children || '');\n const style = props.style || {};\n for (let i = 0; i < text.length; i++) {\n const char = text[i];\n if (char === '\\n') continue;\n buffer.setCell(currentX + i, currentY, { char, ...style });\n }\n }\n\n if (Array.isArray(children)) {\n for (const child of children) {\n renderToBuffer(child, buffer, currentX, currentY);\n }\n } else if (children) {\n renderToBuffer(children, buffer, currentX, currentY);\n }\n}\n","import React from 'react';\n\nexport interface BoxProps {\n children?: React.ReactNode;\n style?: {\n fg?: number;\n bg?: number;\n bold?: boolean;\n dim?: boolean;\n italic?: boolean;\n underline?: boolean;\n };\n x?: number;\n y?: number;\n width?: number;\n height?: number;\n border?: boolean;\n flexDirection?: 'row' | 'column';\n justifyContent?: 'flex-start' | 'center' | 'flex-end' | 'space-between';\n alignItems?: 'flex-start' | 'center' | 'flex-end';\n padding?: number;\n}\n\n/**\n * Box - A flexible container component for layout\n */\nexport const Box: React.FC<BoxProps> = ({\n children,\n style,\n x = 0,\n y = 0,\n width,\n height,\n border = false,\n flexDirection = 'column',\n justifyContent = 'flex-start',\n alignItems = 'flex-start',\n padding = 0,\n}) => {\n const props: BoxProps = {\n children,\n style,\n x,\n y,\n width,\n height,\n border,\n flexDirection,\n justifyContent,\n alignItems,\n padding,\n };\n\n return React.createElement('BOX', props, children);\n};\n\nBox.displayName = 'Box';\n","import React from 'react';\n\nexport interface TextProps {\n children: React.ReactNode;\n style?: {\n fg?: number;\n bg?: number;\n bold?: boolean;\n dim?: boolean;\n italic?: boolean;\n underline?: boolean;\n };\n x?: number;\n y?: number;\n}\n\n/**\n * Text - A text component\n */\nexport const Text: React.FC<TextProps> = ({ children, style, x = 0, y = 0 }) => {\n const props: TextProps = {\n children: String(children),\n style,\n x,\n y,\n };\n\n return React.createElement('TEXT', props);\n};\n\nText.displayName = 'Text';\n","import React from 'react';\nimport { BoxProps } from './Box.js';\n\nexport interface FlexProps extends BoxProps {\n grow?: number;\n shrink?: number;\n basis?: number;\n}\n\n/**\n * Flex - A flex container for flexible layouts\n */\nexport const Flex: React.FC<FlexProps> = ({\n children,\n grow = 0,\n shrink = 1,\n basis = 'auto',\n ...boxProps\n}) => {\n const props: BoxProps = {\n ...boxProps,\n children,\n };\n\n return React.createElement('FLEX', props);\n};\n\nFlex.displayName = 'Flex';\n","import React from 'react';\n\nexport interface GridProps {\n children?: React.ReactNode;\n columns?: number;\n rows?: number;\n gap?: number;\n style?: {\n fg?: number;\n bg?: number;\n bold?: boolean;\n dim?: boolean;\n };\n x?: number;\n y?: number;\n width?: number;\n height?: number;\n}\n\n/**\n * Grid - A grid layout component\n */\nexport const Grid: React.FC<GridProps> = ({\n children,\n columns = 2,\n rows,\n gap = 1,\n style,\n x = 0,\n y = 0,\n width,\n height,\n}) => {\n const props: GridProps = {\n children,\n columns,\n rows,\n gap,\n style,\n x,\n y,\n width,\n height,\n };\n\n return React.createElement('GRID', props, children);\n};\n\nGrid.displayName = 'Grid';\n","import React from 'react';\n\nexport interface ButtonProps {\n children: React.ReactNode;\n onClick?: () => void;\n focused?: boolean;\n style?: {\n fg?: number;\n bg?: number;\n bold?: boolean;\n focusedFg?: number;\n focusedBg?: number;\n };\n x?: number;\n y?: number;\n}\n\n/**\n * Button - A clickable button component\n */\nexport const Button: React.FC<ButtonProps> = ({\n children,\n onClick,\n focused = false,\n style,\n x = 0,\n y = 0,\n}) => {\n // Use focused style if focused\n const activeStyle = focused\n ? {\n ...style,\n fg: style?.focusedFg || style?.fg || 0,\n bg: style?.focusedBg || style?.bg || 7,\n }\n : style;\n\n const props: ButtonProps = {\n children: `[ ${children} ]`,\n onClick,\n focused,\n style: activeStyle,\n x,\n y,\n };\n\n return React.createElement('BUTTON', props);\n};\n\nButton.displayName = 'Button';\n","import React from 'react';\n\nexport interface InputProps {\n value: string;\n onChange?: (value: string) => void;\n placeholder?: string;\n focused?: boolean;\n mask?: boolean;\n style?: {\n fg?: number;\n bg?: number;\n bold?: boolean;\n placeholderFg?: number;\n };\n x?: number;\n y?: number;\n width?: number;\n maxLength?: number;\n}\n\n/**\n * Input - A text input component\n */\nexport const Input: React.FC<InputProps> = ({\n value,\n onChange,\n placeholder = '',\n focused = false,\n mask = false,\n style,\n x = 0,\n y = 0,\n width = 20,\n maxLength,\n}) => {\n const displayValue = mask ? '*'.repeat(value.length) : value;\n const displayText =\n value.length > 0 ? displayValue : focused ? placeholder : '';\n\n const props: InputProps = {\n value: displayText,\n onChange,\n placeholder,\n focused,\n mask,\n style: focused\n ? style\n : {\n ...style,\n fg: style?.placeholderFg || 8,\n },\n x,\n y,\n width,\n maxLength,\n };\n\n return React.createElement('INPUT', props);\n};\n\nInput.displayName = 'Input';\n","import React from 'react';\n\nexport interface ProgressProps {\n value: number;\n max?: number;\n style?: {\n fg?: number;\n bg?: number;\n filledFg?: number;\n filledBg?: number;\n };\n x?: number;\n y?: number;\n width?: number;\n label?: string;\n}\n\n/**\n * Progress - A progress bar component\n */\nexport const Progress: React.FC<ProgressProps> = ({\n value,\n max = 100,\n style,\n x = 0,\n y = 0,\n width = 20,\n label,\n}) => {\n const percentage = Math.min(Math.max(value / max, 0), 1);\n const filledWidth = Math.floor(percentage * width);\n\n const props: ProgressProps = {\n value,\n max,\n style,\n x,\n y,\n width,\n label,\n };\n\n return React.createElement('PROGRESS', props);\n};\n\nProgress.displayName = 'Progress';\n","import { Renderer } from '../renderer/index.js';\nimport { useEffect, useState, useRef } from 'react';\n\ninterface AppOptions {\n fullscreen?: boolean;\n alternateScreen?: boolean;\n mouseCapture?: boolean;\n}\n\n/**\n * useApp - Hook for managing the application lifecycle\n */\nexport const useApp = (options: AppOptions = {}) => {\n const rendererRef = useRef<Renderer | null>(null);\n const [size, setSize] = useState({ cols: 80, rows: 24 });\n const [running, setRunning] = useState(false);\n\n useEffect(() => {\n // Note: Renderer is not fully implemented yet, this is a skeleton\n // const renderer = new Renderer();\n // rendererRef.current = renderer;\n //\n // renderer.start();\n //\n // // Set initial size\n // setSize(renderer.getSize());\n //\n // // Setup resize handler\n // const cleanupResize = renderer.getTerminal().onResize((newSize) => {\n // setSize(newSize);\n // });\n //\n // setRunning(true);\n\n const cleanupResize = () => {\n // Cleanup function\n };\n\n setRunning(true);\n\n return () => {\n setRunning(false);\n cleanupResize();\n // renderer.stop();\n };\n }, []);\n\n const exit = () => {\n if (rendererRef.current) {\n // rendererRef.current.stop();\n setRunning(false);\n }\n };\n\n return {\n renderer: rendererRef.current,\n size,\n running,\n exit,\n };\n};\n","import { useEffect, useCallback } from 'react';\n\ninterface InputEvent {\n key: string;\n name: string;\n ctrl: boolean;\n meta: boolean;\n shift: boolean;\n sequence: string;\n}\n\ninterface ReadlineKey {\n name?: string;\n ctrl?: boolean;\n meta?: boolean;\n shift?: boolean;\n sequence?: string;\n}\n\ntype InputCallback = (input: InputEvent) => void;\n\n/**\n * useInput - Hook for capturing keyboard input\n */\nexport const useInput = (callback: InputCallback, deps: any[] = []) => {\n useEffect(() => {\n const readline = require('node:readline');\n\n const handler = (chunk: Buffer, key: ReadlineKey) => {\n if (!key) return;\n\n callback({\n key: key.name || '',\n name: key.name || '',\n ctrl: key.ctrl || false,\n meta: key.meta || false,\n shift: key.shift || false,\n sequence: key.sequence || '',\n });\n };\n\n process.stdin.setRawMode(true);\n readline.emitKeypressEvents(process.stdin);\n\n process.stdin.on('keypress', handler);\n\n return () => {\n process.stdin.off('keypress', handler);\n };\n }, [callback, ...deps]);\n};\n\n/**\n * useKey - Hook for capturing specific key presses\n */\nexport const useKey = (\n keyName: string | string[],\n callback: () => void,\n deps: any[] = []\n) => {\n const keys = Array.isArray(keyName) ? keyName : [keyName];\n\n useInput(\n useCallback(\n ({ key, ctrl, meta }) => {\n // Don't trigger if modifier keys are pressed (unless specified)\n if (ctrl || meta) return;\n\n if (keys.includes(key)) {\n callback();\n }\n },\n [callback, keys]\n ),\n deps\n );\n};\n","import { useState, useCallback, useRef, useEffect } from 'react';\n\ninterface FocusableElement {\n id: string;\n index: number;\n}\n\ninterface KeyPressEvent {\n name?: string;\n}\n\n/**\n * useFocus - Hook for managing focus state in forms and lists\n */\nexport const useFocus = (initialFocus = 0, itemCount: number) => {\n const [focusedIndex, setFocusedIndex] = useState(initialFocus);\n const focusableRefs = useRef<Map<number, HTMLElement>>(new Map());\n\n const focusNext = useCallback(() => {\n setFocusedIndex((current) => (current + 1) % itemCount);\n }, [itemCount]);\n\n const focusPrevious = useCallback(() => {\n setFocusedIndex((current) => (current - 1 + itemCount) % itemCount);\n }, [itemCount]);\n\n const setFocus = useCallback((index: number) => {\n if (index >= 0 && index < itemCount) {\n setFocusedIndex(index);\n }\n }, [itemCount]);\n\n const isFocused = useCallback(\n (index: number) => index === focusedIndex,\n [focusedIndex]\n );\n\n // Keyboard navigation\n useEffect(() => {\n const readline = require('node:readline');\n readline.emitKeypressEvents(process.stdin);\n process.stdin.setRawMode(true);\n\n const handleKeyPress = (_chunk: Buffer, key: KeyPressEvent) => {\n if (key.name === 'tab' || key.name === 'right') {\n focusNext();\n } else if (key.name === 'left') {\n focusPrevious();\n }\n };\n\n process.stdin.on('keypress', handleKeyPress);\n\n return () => {\n process.stdin.off('keypress', handleKeyPress);\n };\n }, [focusNext, focusPrevious]);\n\n return {\n focusedIndex,\n focusNext,\n focusPrevious,\n setFocus,\n isFocused,\n };\n};\n","import { useCallback, useEffect, useState } from 'react';\n\n/**\n * useStdoutDimensions - Hook for getting terminal dimensions\n */\nexport const useStdoutDimensions = () => {\n const [dimensions, setDimensions] = useState(() => ({\n columns: process.stdout.columns || 80,\n rows: process.stdout.rows || 24,\n }));\n\n useEffect(() => {\n const handleResize = () => {\n setDimensions({\n columns: process.stdout.columns || 80,\n rows: process.stdout.rows || 24,\n });\n };\n\n process.stdout.on('resize', handleResize);\n\n return () => {\n process.stdout.off('resize', handleResize);\n };\n }, []);\n\n return dimensions;\n};\n\n/**\n * useStdout - Hook for stdout operations\n */\nexport const useStdout = () => {\n const write = useCallback((data: string) => {\n process.stdout.write(data);\n }, []);\n\n return { write };\n};\n","import { useEffect, useRef } from 'react';\n\n/**\n * useInterval - Hook for setting up intervals\n */\nexport const useInterval = (callback: () => void, delay: number | null) => {\n const savedCallback = useRef(callback);\n\n // Remember the latest callback\n useEffect(() => {\n savedCallback.current = callback;\n }, [callback]);\n\n // Set up the interval\n useEffect(() => {\n if (delay === null) return;\n\n const tick = () => savedCallback.current();\n\n const id = setInterval(tick, delay);\n\n return () => clearInterval(id);\n }, [delay]);\n};\n\n/**\n * useTimeout - Hook for setting up timeouts\n */\nexport const useTimeout = (callback: () => void, delay: number | null) => {\n const savedCallback = useRef(callback);\n\n useEffect(() => {\n savedCallback.current = callback;\n }, [callback]);\n\n useEffect(() => {\n if (delay === null) return;\n\n const tick = () => savedCallback.current();\n\n const id = setTimeout(tick, delay);\n\n return () => clearTimeout(id);\n }, [delay]);\n};\n","import { useState, useCallback } from 'react';\n\ntype AppState = 'idle' | 'loading' | 'success' | 'error';\n\n/**\n * useAppState - Hook for managing application state\n */\nexport const useAppState = (initialState: AppState = 'idle') => {\n const [state, setState] = useState<AppState>(initialState);\n const [error, setError] = useState<Error | null>(null);\n\n const setLoading = useCallback(() => {\n setState('loading');\n setError(null);\n }, []);\n\n const setSuccess = useCallback(() => {\n setState('success');\n setError(null);\n }, []);\n\n const setErrorState = useCallback((err: Error) => {\n setState('error');\n setError(err);\n }, []);\n\n const setIdle = useCallback(() => {\n setState('idle');\n setError(null);\n }, []);\n\n const isLoading = state === 'loading';\n const isSuccess = state === 'success';\n const isError = state === 'error';\n const isIdle = state === 'idle';\n\n return {\n state,\n error,\n isLoading,\n isSuccess,\n isError,\n isIdle,\n setLoading,\n setSuccess,\n setError: setErrorState,\n setIdle,\n };\n};\n","import { useState, useCallback } from 'react';\n\ninterface ListOptions<T> {\n initialItems?: T[];\n initialIndex?: number;\n loop?: boolean;\n}\n\n/**\n * useList - Hook for managing list navigation\n */\nexport const useList = <T>({\n initialItems = [],\n initialIndex = 0,\n loop = true,\n}: ListOptions<T> = {}) => {\n const [items, setItems] = useState<T[]>(initialItems);\n const [index, setIndex] = useState(initialIndex);\n\n const next = useCallback(() => {\n setIndex((current) => {\n if (items.length === 0) return 0;\n\n const nextIndex = current + 1;\n\n if (nextIndex >= items.length) {\n return loop ? 0 : items.length - 1;\n }\n\n return nextIndex;\n });\n }, [items.length, loop]);\n\n const previous = useCallback(() => {\n setIndex((current) => {\n if (items.length === 0) return 0;\n\n const prevIndex = current - 1;\n\n if (prevIndex < 0) {\n return loop ? items.length - 1 : 0;\n }\n\n return prevIndex;\n });\n }, [items.length, loop]);\n\n const select = useCallback((item: T) => {\n const newIndex = items.indexOf(item);\n if (newIndex !== -1) {\n setIndex(newIndex);\n }\n }, [items]);\n\n const selectedIndex = index;\n const selectedItem = items[index] ?? null;\n\n return {\n items,\n setItems,\n index: selectedIndex,\n setIndex,\n selectedItem,\n next,\n previous,\n select,\n };\n};\n"],"mappings":"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","names":["Buffer","Buffer","Buffer","ReactReconciler","React","import_react","React","import_react","React","import_react","React","import_react","React","import_react","React","import_react","React","import_react","import_react","readline","import_react","readline","import_react","import_react","import_react","import_react","import_react"]}
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import { B as Buffer, R as Renderer } from './index-DAO84gkm.cjs';
|
|
2
|
+
export { A as ANSI, T as Terminal, u as useApp, a as useAppState, b as useFocus, c as useInput, d as useInterval, e as useKey, f as useList, g as useStdout, h as useStdoutDimensions, i as useTimeout } from './index-DAO84gkm.cjs';
|
|
3
|
+
import React__default, { ReactElement } from 'react';
|
|
4
|
+
export { default as React } from 'react';
|
|
5
|
+
import 'node:tty';
|
|
6
|
+
import 'node:readline';
|
|
7
|
+
|
|
8
|
+
interface TUIProps {
|
|
9
|
+
style?: {
|
|
10
|
+
fg?: number;
|
|
11
|
+
bg?: number;
|
|
12
|
+
bold?: boolean;
|
|
13
|
+
dim?: boolean;
|
|
14
|
+
italic?: boolean;
|
|
15
|
+
underline?: boolean;
|
|
16
|
+
};
|
|
17
|
+
x?: number;
|
|
18
|
+
y?: number;
|
|
19
|
+
width?: number;
|
|
20
|
+
height?: number;
|
|
21
|
+
children?: any;
|
|
22
|
+
}
|
|
23
|
+
type TUIType = string;
|
|
24
|
+
interface TUIElement {
|
|
25
|
+
type: TUIType;
|
|
26
|
+
props: TUIProps;
|
|
27
|
+
children: TUIElement[];
|
|
28
|
+
}
|
|
29
|
+
interface TUIContainer {
|
|
30
|
+
buffer: Buffer;
|
|
31
|
+
root: TUIElement | null;
|
|
32
|
+
listeners: {
|
|
33
|
+
onInput?: (key: string) => void;
|
|
34
|
+
onClick?: (x: number, y: number) => void;
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Create a root container for rendering
|
|
40
|
+
*/
|
|
41
|
+
declare const createRoot: (renderer: Renderer) => TUIContainer;
|
|
42
|
+
/**
|
|
43
|
+
* Render a React element to the terminal
|
|
44
|
+
*/
|
|
45
|
+
declare const render: (element: ReactElement, container: TUIContainer, renderer: Renderer) => void;
|
|
46
|
+
|
|
47
|
+
interface BoxProps {
|
|
48
|
+
children?: React__default.ReactNode;
|
|
49
|
+
style?: {
|
|
50
|
+
fg?: number;
|
|
51
|
+
bg?: number;
|
|
52
|
+
bold?: boolean;
|
|
53
|
+
dim?: boolean;
|
|
54
|
+
italic?: boolean;
|
|
55
|
+
underline?: boolean;
|
|
56
|
+
};
|
|
57
|
+
x?: number;
|
|
58
|
+
y?: number;
|
|
59
|
+
width?: number;
|
|
60
|
+
height?: number;
|
|
61
|
+
border?: boolean;
|
|
62
|
+
flexDirection?: 'row' | 'column';
|
|
63
|
+
justifyContent?: 'flex-start' | 'center' | 'flex-end' | 'space-between';
|
|
64
|
+
alignItems?: 'flex-start' | 'center' | 'flex-end';
|
|
65
|
+
padding?: number;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Box - A flexible container component for layout
|
|
69
|
+
*/
|
|
70
|
+
declare const Box: React__default.FC<BoxProps>;
|
|
71
|
+
|
|
72
|
+
interface TextProps {
|
|
73
|
+
children: React__default.ReactNode;
|
|
74
|
+
style?: {
|
|
75
|
+
fg?: number;
|
|
76
|
+
bg?: number;
|
|
77
|
+
bold?: boolean;
|
|
78
|
+
dim?: boolean;
|
|
79
|
+
italic?: boolean;
|
|
80
|
+
underline?: boolean;
|
|
81
|
+
};
|
|
82
|
+
x?: number;
|
|
83
|
+
y?: number;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Text - A text component
|
|
87
|
+
*/
|
|
88
|
+
declare const Text: React__default.FC<TextProps>;
|
|
89
|
+
|
|
90
|
+
interface FlexProps extends BoxProps {
|
|
91
|
+
grow?: number;
|
|
92
|
+
shrink?: number;
|
|
93
|
+
basis?: number;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Flex - A flex container for flexible layouts
|
|
97
|
+
*/
|
|
98
|
+
declare const Flex: React__default.FC<FlexProps>;
|
|
99
|
+
|
|
100
|
+
interface GridProps {
|
|
101
|
+
children?: React__default.ReactNode;
|
|
102
|
+
columns?: number;
|
|
103
|
+
rows?: number;
|
|
104
|
+
gap?: number;
|
|
105
|
+
style?: {
|
|
106
|
+
fg?: number;
|
|
107
|
+
bg?: number;
|
|
108
|
+
bold?: boolean;
|
|
109
|
+
dim?: boolean;
|
|
110
|
+
};
|
|
111
|
+
x?: number;
|
|
112
|
+
y?: number;
|
|
113
|
+
width?: number;
|
|
114
|
+
height?: number;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Grid - A grid layout component
|
|
118
|
+
*/
|
|
119
|
+
declare const Grid: React__default.FC<GridProps>;
|
|
120
|
+
|
|
121
|
+
interface ButtonProps {
|
|
122
|
+
children: React__default.ReactNode;
|
|
123
|
+
onClick?: () => void;
|
|
124
|
+
focused?: boolean;
|
|
125
|
+
style?: {
|
|
126
|
+
fg?: number;
|
|
127
|
+
bg?: number;
|
|
128
|
+
bold?: boolean;
|
|
129
|
+
focusedFg?: number;
|
|
130
|
+
focusedBg?: number;
|
|
131
|
+
};
|
|
132
|
+
x?: number;
|
|
133
|
+
y?: number;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Button - A clickable button component
|
|
137
|
+
*/
|
|
138
|
+
declare const Button: React__default.FC<ButtonProps>;
|
|
139
|
+
|
|
140
|
+
interface InputProps {
|
|
141
|
+
value: string;
|
|
142
|
+
onChange?: (value: string) => void;
|
|
143
|
+
placeholder?: string;
|
|
144
|
+
focused?: boolean;
|
|
145
|
+
mask?: boolean;
|
|
146
|
+
style?: {
|
|
147
|
+
fg?: number;
|
|
148
|
+
bg?: number;
|
|
149
|
+
bold?: boolean;
|
|
150
|
+
placeholderFg?: number;
|
|
151
|
+
};
|
|
152
|
+
x?: number;
|
|
153
|
+
y?: number;
|
|
154
|
+
width?: number;
|
|
155
|
+
maxLength?: number;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Input - A text input component
|
|
159
|
+
*/
|
|
160
|
+
declare const Input: React__default.FC<InputProps>;
|
|
161
|
+
|
|
162
|
+
interface ProgressProps {
|
|
163
|
+
value: number;
|
|
164
|
+
max?: number;
|
|
165
|
+
style?: {
|
|
166
|
+
fg?: number;
|
|
167
|
+
bg?: number;
|
|
168
|
+
filledFg?: number;
|
|
169
|
+
filledBg?: number;
|
|
170
|
+
};
|
|
171
|
+
x?: number;
|
|
172
|
+
y?: number;
|
|
173
|
+
width?: number;
|
|
174
|
+
label?: string;
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Progress - A progress bar component
|
|
178
|
+
*/
|
|
179
|
+
declare const Progress: React__default.FC<ProgressProps>;
|
|
180
|
+
|
|
181
|
+
export { Box, type BoxProps, Buffer, Button, type ButtonProps, Flex, type FlexProps, Grid, type GridProps, Input, type InputProps, Progress, type ProgressProps, Renderer, Text, type TextProps, createRoot, render };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import { B as Buffer, R as Renderer } from './index-DAO84gkm.js';
|
|
2
|
+
export { A as ANSI, T as Terminal, u as useApp, a as useAppState, b as useFocus, c as useInput, d as useInterval, e as useKey, f as useList, g as useStdout, h as useStdoutDimensions, i as useTimeout } from './index-DAO84gkm.js';
|
|
3
|
+
import React__default, { ReactElement } from 'react';
|
|
4
|
+
export { default as React } from 'react';
|
|
5
|
+
import 'node:tty';
|
|
6
|
+
import 'node:readline';
|
|
7
|
+
|
|
8
|
+
interface TUIProps {
|
|
9
|
+
style?: {
|
|
10
|
+
fg?: number;
|
|
11
|
+
bg?: number;
|
|
12
|
+
bold?: boolean;
|
|
13
|
+
dim?: boolean;
|
|
14
|
+
italic?: boolean;
|
|
15
|
+
underline?: boolean;
|
|
16
|
+
};
|
|
17
|
+
x?: number;
|
|
18
|
+
y?: number;
|
|
19
|
+
width?: number;
|
|
20
|
+
height?: number;
|
|
21
|
+
children?: any;
|
|
22
|
+
}
|
|
23
|
+
type TUIType = string;
|
|
24
|
+
interface TUIElement {
|
|
25
|
+
type: TUIType;
|
|
26
|
+
props: TUIProps;
|
|
27
|
+
children: TUIElement[];
|
|
28
|
+
}
|
|
29
|
+
interface TUIContainer {
|
|
30
|
+
buffer: Buffer;
|
|
31
|
+
root: TUIElement | null;
|
|
32
|
+
listeners: {
|
|
33
|
+
onInput?: (key: string) => void;
|
|
34
|
+
onClick?: (x: number, y: number) => void;
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Create a root container for rendering
|
|
40
|
+
*/
|
|
41
|
+
declare const createRoot: (renderer: Renderer) => TUIContainer;
|
|
42
|
+
/**
|
|
43
|
+
* Render a React element to the terminal
|
|
44
|
+
*/
|
|
45
|
+
declare const render: (element: ReactElement, container: TUIContainer, renderer: Renderer) => void;
|
|
46
|
+
|
|
47
|
+
interface BoxProps {
|
|
48
|
+
children?: React__default.ReactNode;
|
|
49
|
+
style?: {
|
|
50
|
+
fg?: number;
|
|
51
|
+
bg?: number;
|
|
52
|
+
bold?: boolean;
|
|
53
|
+
dim?: boolean;
|
|
54
|
+
italic?: boolean;
|
|
55
|
+
underline?: boolean;
|
|
56
|
+
};
|
|
57
|
+
x?: number;
|
|
58
|
+
y?: number;
|
|
59
|
+
width?: number;
|
|
60
|
+
height?: number;
|
|
61
|
+
border?: boolean;
|
|
62
|
+
flexDirection?: 'row' | 'column';
|
|
63
|
+
justifyContent?: 'flex-start' | 'center' | 'flex-end' | 'space-between';
|
|
64
|
+
alignItems?: 'flex-start' | 'center' | 'flex-end';
|
|
65
|
+
padding?: number;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Box - A flexible container component for layout
|
|
69
|
+
*/
|
|
70
|
+
declare const Box: React__default.FC<BoxProps>;
|
|
71
|
+
|
|
72
|
+
interface TextProps {
|
|
73
|
+
children: React__default.ReactNode;
|
|
74
|
+
style?: {
|
|
75
|
+
fg?: number;
|
|
76
|
+
bg?: number;
|
|
77
|
+
bold?: boolean;
|
|
78
|
+
dim?: boolean;
|
|
79
|
+
italic?: boolean;
|
|
80
|
+
underline?: boolean;
|
|
81
|
+
};
|
|
82
|
+
x?: number;
|
|
83
|
+
y?: number;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Text - A text component
|
|
87
|
+
*/
|
|
88
|
+
declare const Text: React__default.FC<TextProps>;
|
|
89
|
+
|
|
90
|
+
interface FlexProps extends BoxProps {
|
|
91
|
+
grow?: number;
|
|
92
|
+
shrink?: number;
|
|
93
|
+
basis?: number;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Flex - A flex container for flexible layouts
|
|
97
|
+
*/
|
|
98
|
+
declare const Flex: React__default.FC<FlexProps>;
|
|
99
|
+
|
|
100
|
+
interface GridProps {
|
|
101
|
+
children?: React__default.ReactNode;
|
|
102
|
+
columns?: number;
|
|
103
|
+
rows?: number;
|
|
104
|
+
gap?: number;
|
|
105
|
+
style?: {
|
|
106
|
+
fg?: number;
|
|
107
|
+
bg?: number;
|
|
108
|
+
bold?: boolean;
|
|
109
|
+
dim?: boolean;
|
|
110
|
+
};
|
|
111
|
+
x?: number;
|
|
112
|
+
y?: number;
|
|
113
|
+
width?: number;
|
|
114
|
+
height?: number;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Grid - A grid layout component
|
|
118
|
+
*/
|
|
119
|
+
declare const Grid: React__default.FC<GridProps>;
|
|
120
|
+
|
|
121
|
+
interface ButtonProps {
|
|
122
|
+
children: React__default.ReactNode;
|
|
123
|
+
onClick?: () => void;
|
|
124
|
+
focused?: boolean;
|
|
125
|
+
style?: {
|
|
126
|
+
fg?: number;
|
|
127
|
+
bg?: number;
|
|
128
|
+
bold?: boolean;
|
|
129
|
+
focusedFg?: number;
|
|
130
|
+
focusedBg?: number;
|
|
131
|
+
};
|
|
132
|
+
x?: number;
|
|
133
|
+
y?: number;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Button - A clickable button component
|
|
137
|
+
*/
|
|
138
|
+
declare const Button: React__default.FC<ButtonProps>;
|
|
139
|
+
|
|
140
|
+
interface InputProps {
|
|
141
|
+
value: string;
|
|
142
|
+
onChange?: (value: string) => void;
|
|
143
|
+
placeholder?: string;
|
|
144
|
+
focused?: boolean;
|
|
145
|
+
mask?: boolean;
|
|
146
|
+
style?: {
|
|
147
|
+
fg?: number;
|
|
148
|
+
bg?: number;
|
|
149
|
+
bold?: boolean;
|
|
150
|
+
placeholderFg?: number;
|
|
151
|
+
};
|
|
152
|
+
x?: number;
|
|
153
|
+
y?: number;
|
|
154
|
+
width?: number;
|
|
155
|
+
maxLength?: number;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Input - A text input component
|
|
159
|
+
*/
|
|
160
|
+
declare const Input: React__default.FC<InputProps>;
|
|
161
|
+
|
|
162
|
+
interface ProgressProps {
|
|
163
|
+
value: number;
|
|
164
|
+
max?: number;
|
|
165
|
+
style?: {
|
|
166
|
+
fg?: number;
|
|
167
|
+
bg?: number;
|
|
168
|
+
filledFg?: number;
|
|
169
|
+
filledBg?: number;
|
|
170
|
+
};
|
|
171
|
+
x?: number;
|
|
172
|
+
y?: number;
|
|
173
|
+
width?: number;
|
|
174
|
+
label?: string;
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Progress - A progress bar component
|
|
178
|
+
*/
|
|
179
|
+
declare const Progress: React__default.FC<ProgressProps>;
|
|
180
|
+
|
|
181
|
+
export { Box, type BoxProps, Buffer, Button, type ButtonProps, Flex, type FlexProps, Grid, type GridProps, Input, type InputProps, Progress, type ProgressProps, Renderer, Text, type TextProps, createRoot, render };
|