@cli-use/tui 0.1.0 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +68 -33
- package/dist/ai-worker.cjs +65 -0
- package/dist/ai-worker.cjs.map +1 -0
- package/dist/ai-worker.d.cts +2 -0
- package/dist/ai-worker.d.ts +2 -0
- package/dist/ai-worker.js +42 -0
- package/dist/ai-worker.js.map +1 -0
- package/dist/bin/ratatui-demo +0 -0
- package/dist/cli/index.cjs +126 -36
- package/dist/cli/index.cjs.map +1 -1
- package/dist/cli/index.js +126 -36
- package/dist/cli/index.js.map +1 -1
- package/dist/hooks/index.cjs +32 -18
- package/dist/hooks/index.cjs.map +1 -1
- package/dist/hooks/index.d.cts +1 -1
- package/dist/hooks/index.d.ts +1 -1
- package/dist/hooks/index.js +26 -28
- package/dist/hooks/index.js.map +1 -1
- package/dist/{index-DAO84gkm.d.cts → index-B4IaUxvU.d.cts} +4 -3
- package/dist/{index-DAO84gkm.d.ts → index-B4IaUxvU.d.ts} +4 -3
- package/dist/index.cjs +37 -29
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +44 -42
- package/dist/index.js.map +1 -1
- package/package.json +15 -10
package/dist/index.js
CHANGED
|
@@ -3,15 +3,9 @@
|
|
|
3
3
|
* cli-use - React-based Terminal UI Framework
|
|
4
4
|
* Inspired by Ratatui (https://ratatui.rs)
|
|
5
5
|
*/
|
|
6
|
-
var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
|
|
7
|
-
get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
|
|
8
|
-
}) : x)(function(x) {
|
|
9
|
-
if (typeof require !== "undefined") return require.apply(this, arguments);
|
|
10
|
-
throw Error('Dynamic require of "' + x + '" is not supported');
|
|
11
|
-
});
|
|
12
6
|
|
|
13
7
|
// src/renderer/types.ts
|
|
14
|
-
var
|
|
8
|
+
var Buffer = class _Buffer {
|
|
15
9
|
constructor(width, height, cells = []) {
|
|
16
10
|
this.width = width;
|
|
17
11
|
this.height = height;
|
|
@@ -252,7 +246,7 @@ var Renderer = class {
|
|
|
252
246
|
this.terminal.enableAlternateScreen();
|
|
253
247
|
this.terminal.hideCursor();
|
|
254
248
|
this.terminal.clear();
|
|
255
|
-
this.buffer = new
|
|
249
|
+
this.buffer = new Buffer(this.currentSize.cols, this.currentSize.rows);
|
|
256
250
|
this.terminal.onResize((size) => {
|
|
257
251
|
this.currentSize = size;
|
|
258
252
|
this.buffer?.resize(size.cols, size.rows);
|
|
@@ -306,7 +300,13 @@ var hostConfig = {
|
|
|
306
300
|
supportsPersistence: false,
|
|
307
301
|
supportsMutation: true,
|
|
308
302
|
createInstance(type, props) {
|
|
309
|
-
return {
|
|
303
|
+
return {
|
|
304
|
+
type,
|
|
305
|
+
props: { ...props },
|
|
306
|
+
children: [],
|
|
307
|
+
parent: null,
|
|
308
|
+
node: { type, props: { ...props }, children: [] }
|
|
309
|
+
};
|
|
310
310
|
},
|
|
311
311
|
appendInitialChild(parentInstance, child) {
|
|
312
312
|
parentInstance.children.push(child);
|
|
@@ -322,7 +322,13 @@ var hostConfig = {
|
|
|
322
322
|
return type === "TEXT";
|
|
323
323
|
},
|
|
324
324
|
createTextInstance(text) {
|
|
325
|
-
return {
|
|
325
|
+
return {
|
|
326
|
+
type: "TEXT",
|
|
327
|
+
props: { children: text },
|
|
328
|
+
children: [],
|
|
329
|
+
parent: null,
|
|
330
|
+
node: { type: "TEXT", props: { children: text }, children: [] }
|
|
331
|
+
};
|
|
326
332
|
},
|
|
327
333
|
appendChildToContainer(container, child) {
|
|
328
334
|
container.root = child;
|
|
@@ -499,13 +505,7 @@ Text.displayName = "Text";
|
|
|
499
505
|
|
|
500
506
|
// src/components/Flex.tsx
|
|
501
507
|
import React3 from "react";
|
|
502
|
-
var Flex = ({
|
|
503
|
-
children,
|
|
504
|
-
grow = 0,
|
|
505
|
-
shrink = 1,
|
|
506
|
-
basis = "auto",
|
|
507
|
-
...boxProps
|
|
508
|
-
}) => {
|
|
508
|
+
var Flex = ({ children, ...boxProps }) => {
|
|
509
509
|
const props = {
|
|
510
510
|
...boxProps,
|
|
511
511
|
children
|
|
@@ -615,8 +615,6 @@ var Progress = ({
|
|
|
615
615
|
width = 20,
|
|
616
616
|
label
|
|
617
617
|
}) => {
|
|
618
|
-
const percentage = Math.min(Math.max(value / max, 0), 1);
|
|
619
|
-
const filledWidth = Math.floor(percentage * width);
|
|
620
618
|
const props = {
|
|
621
619
|
value,
|
|
622
620
|
max,
|
|
@@ -632,9 +630,9 @@ Progress.displayName = "Progress";
|
|
|
632
630
|
|
|
633
631
|
// src/hooks/useApp.ts
|
|
634
632
|
import { useEffect, useState, useRef } from "react";
|
|
635
|
-
var useApp = (
|
|
633
|
+
var useApp = (_options = {}) => {
|
|
636
634
|
const rendererRef = useRef(null);
|
|
637
|
-
const [size
|
|
635
|
+
const [size] = useState({ cols: 80, rows: 24 });
|
|
638
636
|
const [running, setRunning] = useState(false);
|
|
639
637
|
useEffect(() => {
|
|
640
638
|
const cleanupResize = () => {
|
|
@@ -659,10 +657,10 @@ var useApp = (options = {}) => {
|
|
|
659
657
|
};
|
|
660
658
|
|
|
661
659
|
// src/hooks/useInput.ts
|
|
662
|
-
import { useEffect as useEffect2, useCallback } from "react";
|
|
660
|
+
import { useEffect as useEffect2, useCallback, useMemo } from "react";
|
|
661
|
+
import readline2 from "readline";
|
|
663
662
|
var useInput = (callback, deps = []) => {
|
|
664
663
|
useEffect2(() => {
|
|
665
|
-
const readline2 = __require("readline");
|
|
666
664
|
const handler = (chunk, key) => {
|
|
667
665
|
if (!key) return;
|
|
668
666
|
callback({
|
|
@@ -674,7 +672,9 @@ var useInput = (callback, deps = []) => {
|
|
|
674
672
|
sequence: key.sequence || ""
|
|
675
673
|
});
|
|
676
674
|
};
|
|
677
|
-
process.stdin.
|
|
675
|
+
if (process.stdin.isTTY) {
|
|
676
|
+
process.stdin.setRawMode(true);
|
|
677
|
+
}
|
|
678
678
|
readline2.emitKeypressEvents(process.stdin);
|
|
679
679
|
process.stdin.on("keypress", handler);
|
|
680
680
|
return () => {
|
|
@@ -683,7 +683,8 @@ var useInput = (callback, deps = []) => {
|
|
|
683
683
|
}, [callback, ...deps]);
|
|
684
684
|
};
|
|
685
685
|
var useKey = (keyName, callback, deps = []) => {
|
|
686
|
-
const
|
|
686
|
+
const keyNameString = Array.isArray(keyName) ? keyName.join(",") : keyName;
|
|
687
|
+
const keys = useMemo(() => Array.isArray(keyName) ? keyName : [keyName], [keyNameString]);
|
|
687
688
|
useInput(
|
|
688
689
|
useCallback(
|
|
689
690
|
({ key, ctrl, meta }) => {
|
|
@@ -699,29 +700,30 @@ var useKey = (keyName, callback, deps = []) => {
|
|
|
699
700
|
};
|
|
700
701
|
|
|
701
702
|
// src/hooks/useFocus.ts
|
|
702
|
-
import { useState as useState2, useCallback as useCallback2,
|
|
703
|
+
import { useState as useState2, useCallback as useCallback2, useEffect as useEffect3 } from "react";
|
|
704
|
+
import readline3 from "readline";
|
|
703
705
|
var useFocus = (initialFocus = 0, itemCount) => {
|
|
704
706
|
const [focusedIndex, setFocusedIndex] = useState2(initialFocus);
|
|
705
|
-
const focusableRefs = useRef2(/* @__PURE__ */ new Map());
|
|
706
707
|
const focusNext = useCallback2(() => {
|
|
707
708
|
setFocusedIndex((current) => (current + 1) % itemCount);
|
|
708
709
|
}, [itemCount]);
|
|
709
710
|
const focusPrevious = useCallback2(() => {
|
|
710
711
|
setFocusedIndex((current) => (current - 1 + itemCount) % itemCount);
|
|
711
712
|
}, [itemCount]);
|
|
712
|
-
const setFocus = useCallback2(
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
[focusedIndex]
|
|
713
|
+
const setFocus = useCallback2(
|
|
714
|
+
(index) => {
|
|
715
|
+
if (index >= 0 && index < itemCount) {
|
|
716
|
+
setFocusedIndex(index);
|
|
717
|
+
}
|
|
718
|
+
},
|
|
719
|
+
[itemCount]
|
|
720
720
|
);
|
|
721
|
+
const isFocused = useCallback2((index) => index === focusedIndex, [focusedIndex]);
|
|
721
722
|
useEffect3(() => {
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
723
|
+
readline3.emitKeypressEvents(process.stdin);
|
|
724
|
+
if (process.stdin.isTTY) {
|
|
725
|
+
process.stdin.setRawMode(true);
|
|
726
|
+
}
|
|
725
727
|
const handleKeyPress = (_chunk, key) => {
|
|
726
728
|
if (key.name === "tab" || key.name === "right") {
|
|
727
729
|
focusNext();
|
|
@@ -772,9 +774,9 @@ var useStdout = () => {
|
|
|
772
774
|
};
|
|
773
775
|
|
|
774
776
|
// src/hooks/useInterval.ts
|
|
775
|
-
import { useEffect as useEffect5, useRef as
|
|
777
|
+
import { useEffect as useEffect5, useRef as useRef2 } from "react";
|
|
776
778
|
var useInterval = (callback, delay) => {
|
|
777
|
-
const savedCallback =
|
|
779
|
+
const savedCallback = useRef2(callback);
|
|
778
780
|
useEffect5(() => {
|
|
779
781
|
savedCallback.current = callback;
|
|
780
782
|
}, [callback]);
|
|
@@ -786,7 +788,7 @@ var useInterval = (callback, delay) => {
|
|
|
786
788
|
}, [delay]);
|
|
787
789
|
};
|
|
788
790
|
var useTimeout = (callback, delay) => {
|
|
789
|
-
const savedCallback =
|
|
791
|
+
const savedCallback = useRef2(callback);
|
|
790
792
|
useEffect5(() => {
|
|
791
793
|
savedCallback.current = callback;
|
|
792
794
|
}, [callback]);
|
|
@@ -891,7 +893,7 @@ import { default as default2 } from "react";
|
|
|
891
893
|
export {
|
|
892
894
|
ANSI,
|
|
893
895
|
Box,
|
|
894
|
-
|
|
896
|
+
Buffer,
|
|
895
897
|
Button,
|
|
896
898
|
Flex,
|
|
897
899
|
Grid,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../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","../src/index.ts"],"sourcesContent":["/**\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","// 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"],"mappings":"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","names":["Buffer","Buffer","React","React","React","React","React","React","useEffect","readline","useState","useCallback","useRef","useEffect","readline","useCallback","useEffect","useState","useEffect","useRef","useState","useCallback","useState","useCallback","default"]}
|
|
1
|
+
{"version":3,"sources":["../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","../src/index.ts"],"sourcesContent":["/**\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 } 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 { 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 = (element: ReactElement, container: TUIContainer, renderer: Renderer) => {\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 { 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\nexport const hostConfig = {\n supportsPersistence: false,\n supportsMutation: true,\n createInstance(type: any, props: any) {\n return {\n type,\n props: { ...props },\n children: [],\n parent: null,\n node: { type, props: { ...props }, children: [] },\n };\n },\n appendInitialChild(parentInstance: any, child: any) {\n parentInstance.children.push(child);\n child.parent = parentInstance;\n },\n finalizeInitialChildren() {\n return false;\n },\n prepareUpdate() {\n return {};\n },\n shouldSetTextContent(type: any) {\n return type === 'TEXT';\n },\n createTextInstance(text: any) {\n return {\n type: 'TEXT',\n props: { children: text },\n children: [],\n parent: null,\n node: { type: 'TEXT', props: { children: text }, children: [] },\n };\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) {\n child.parent = null;\n },\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) {\n return instance;\n },\n getRootHostContext(rootContainer: any) {\n return rootContainer;\n },\n getChildHostContext(parentHostContext: any) {\n return parentHostContext;\n },\n prepareForCommit() {\n return null;\n },\n resetAfterCommit(container: any) {\n if (container.root) {\n renderToBuffer(container.root, container.buffer);\n }\n },\n shouldAttemptEagerTransition() {\n return false;\n },\n scheduleTimeout: setTimeout,\n cancelTimeout: clearTimeout,\n noTimeout: -1,\n getCurrentEventPriority() {\n return 0;\n },\n getInstanceFromNode(node: any) {\n return node;\n },\n beforeActiveInstanceBlur() {},\n afterActiveInstanceBlur() {},\n preparePortalMount() {},\n prepareScopeUpdate() {},\n getInstanceFromScope() {\n return null;\n },\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> = ({ children, ...boxProps }) => {\n const props: BoxProps & FlexProps = {\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 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] = 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, DependencyList, useMemo } from 'react';\nimport readline from 'node:readline';\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: DependencyList = []) => {\n useEffect(() => {\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 if (process.stdin.isTTY) {\n process.stdin.setRawMode(true);\n }\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: DependencyList = []\n) => {\n const keyNameString = Array.isArray(keyName) ? keyName.join(',') : keyName;\n const keys = useMemo(() => (Array.isArray(keyName) ? keyName : [keyName]), [keyNameString]);\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, useEffect } from 'react';\nimport readline from 'node:readline';\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\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(\n (index: number) => {\n if (index >= 0 && index < itemCount) {\n setFocusedIndex(index);\n }\n },\n [itemCount]\n );\n\n const isFocused = useCallback((index: number) => index === focusedIndex, [focusedIndex]);\n\n // Keyboard navigation\n useEffect(() => {\n readline.emitKeypressEvents(process.stdin);\n if (process.stdin.isTTY) {\n process.stdin.setRawMode(true);\n }\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","// 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"],"mappings":"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","names":["React","React","React","React","React","React","useEffect","readline","useState","useCallback","useEffect","readline","useCallback","useEffect","useState","useEffect","useRef","useState","useCallback","useState","useCallback","default"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cli-use/tui",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.3",
|
|
4
4
|
"description": "Build beautiful terminal user interfaces with styled components - A powerful TUI framework for creating stunning CLI applications",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -25,15 +25,18 @@
|
|
|
25
25
|
"LICENSE"
|
|
26
26
|
],
|
|
27
27
|
"scripts": {
|
|
28
|
-
"build": "tsup",
|
|
28
|
+
"build": "npm run build:rust && tsup && npm run build:copy",
|
|
29
29
|
"dev": "tsup --watch",
|
|
30
|
-
"test:unit": "vitest run --reporter=verbose",
|
|
31
|
-
"test:integration": "vitest run --reporter=verbose",
|
|
32
|
-
"test:watch": "vitest",
|
|
33
30
|
"typecheck": "tsc --noEmit",
|
|
34
|
-
"lint": "eslint src
|
|
31
|
+
"lint": "eslint src",
|
|
35
32
|
"format": "prettier --write \"src/**/*.ts\" \"src/**/*.tsx\"",
|
|
36
|
-
"prepublishOnly": "npm run build"
|
|
33
|
+
"prepublishOnly": "npm run build",
|
|
34
|
+
"build:rust": "cd native && cargo build --release",
|
|
35
|
+
"demo:rust": "tsx scripts/run-rust-demo.ts",
|
|
36
|
+
"test:ai": "tsx scripts/test-ai.ts",
|
|
37
|
+
"list:models": "tsx scripts/list-models.ts",
|
|
38
|
+
"build:copy": "tsx scripts/copy-binary.ts",
|
|
39
|
+
"demo:cli-use": "tsx src/examples/cli-use-demo.tsx"
|
|
37
40
|
},
|
|
38
41
|
"keywords": [
|
|
39
42
|
"tui",
|
|
@@ -62,8 +65,11 @@
|
|
|
62
65
|
"access": "public"
|
|
63
66
|
},
|
|
64
67
|
"dependencies": {
|
|
68
|
+
"@ai-sdk/google": "^3.0.29",
|
|
69
|
+
"ai": "^6.0.86",
|
|
65
70
|
"chalk": "^5.4.1",
|
|
66
71
|
"commander": "^12.1.0",
|
|
72
|
+
"dotenv": "^17.3.1",
|
|
67
73
|
"eastasianwidth": "^0.3.0",
|
|
68
74
|
"ink": "3.2.0",
|
|
69
75
|
"react": ">=18.0.0",
|
|
@@ -79,16 +85,15 @@
|
|
|
79
85
|
"@typescript-eslint/eslint-plugin": "^8.19.1",
|
|
80
86
|
"@typescript-eslint/parser": "^8.19.1",
|
|
81
87
|
"@vitejs/plugin-react": "^4.3.4",
|
|
82
|
-
"@vitest/ui": "^2.1.8",
|
|
83
88
|
"eslint": "^9.17.0",
|
|
84
89
|
"eslint-plugin-react": "^7.37.4",
|
|
85
90
|
"eslint-plugin-react-hooks": "^5.1.0",
|
|
86
|
-
"
|
|
91
|
+
"globals": "^17.3.0",
|
|
87
92
|
"prettier": "^3.4.2",
|
|
88
93
|
"tsup": "^8.3.5",
|
|
89
94
|
"tsx": "^4.21.0",
|
|
90
95
|
"typescript": "^5.7.3",
|
|
91
|
-
"
|
|
96
|
+
"typescript-eslint": "^8.55.0"
|
|
92
97
|
},
|
|
93
98
|
"peerDependencies": {
|
|
94
99
|
"react": ">=18.0.0"
|