@cli-use/tui 0.1.0 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/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 Buffer2 = class _Buffer {
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 Buffer2(this.currentSize.cols, this.currentSize.rows);
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 { type, props: { ...props }, children: [], parent: null, node: { type, props: { ...props }, children: [] } };
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 { type: "TEXT", props: { children: text }, children: [], parent: null, node: { type: "TEXT", props: { children: text }, children: [] } };
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 = (options = {}) => {
633
+ var useApp = (_options = {}) => {
636
634
  const rendererRef = useRef(null);
637
- const [size, setSize] = useState({ cols: 80, rows: 24 });
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.setRawMode(true);
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 keys = Array.isArray(keyName) ? keyName : [keyName];
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, useRef as useRef2, useEffect as useEffect3 } from "react";
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((index) => {
713
- if (index >= 0 && index < itemCount) {
714
- setFocusedIndex(index);
715
- }
716
- }, [itemCount]);
717
- const isFocused = useCallback2(
718
- (index) => index === focusedIndex,
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
- const readline2 = __require("readline");
723
- readline2.emitKeypressEvents(process.stdin);
724
- process.stdin.setRawMode(true);
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 useRef3 } from "react";
777
+ import { useEffect as useEffect5, useRef as useRef2 } from "react";
776
778
  var useInterval = (callback, delay) => {
777
- const savedCallback = useRef3(callback);
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 = useRef3(callback);
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
- Buffer2 as Buffer,
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.0",
3
+ "version": "0.1.4",
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,19 @@
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 --ext .ts,.tsx",
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",
40
+ "postinstall": "tsx scripts/postinstall.ts"
37
41
  },
38
42
  "keywords": [
39
43
  "tui",
@@ -62,8 +66,11 @@
62
66
  "access": "public"
63
67
  },
64
68
  "dependencies": {
69
+ "@ai-sdk/google": "^3.0.29",
70
+ "ai": "^6.0.86",
65
71
  "chalk": "^5.4.1",
66
72
  "commander": "^12.1.0",
73
+ "dotenv": "^17.3.1",
67
74
  "eastasianwidth": "^0.3.0",
68
75
  "ink": "3.2.0",
69
76
  "react": ">=18.0.0",
@@ -79,16 +86,15 @@
79
86
  "@typescript-eslint/eslint-plugin": "^8.19.1",
80
87
  "@typescript-eslint/parser": "^8.19.1",
81
88
  "@vitejs/plugin-react": "^4.3.4",
82
- "@vitest/ui": "^2.1.8",
83
89
  "eslint": "^9.17.0",
84
90
  "eslint-plugin-react": "^7.37.4",
85
91
  "eslint-plugin-react-hooks": "^5.1.0",
86
- "msw": "^2.7.0",
92
+ "globals": "^17.3.0",
87
93
  "prettier": "^3.4.2",
88
94
  "tsup": "^8.3.5",
89
95
  "tsx": "^4.21.0",
90
96
  "typescript": "^5.7.3",
91
- "vitest": "^2.1.8"
97
+ "typescript-eslint": "^8.55.0"
92
98
  },
93
99
  "peerDependencies": {
94
100
  "react": ">=18.0.0"