@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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/hooks/useApp.ts","../../src/hooks/useInput.ts","../../src/hooks/useFocus.ts","../../src/hooks/useStdout.ts","../../src/hooks/useInterval.ts","../../src/hooks/useAppState.ts","../../src/hooks/useList.ts"],"sourcesContent":["import { Renderer } from '../renderer/index.js';\nimport { useEffect, useState, useRef } from 'react';\n\ninterface AppOptions {\n fullscreen?: boolean;\n alternateScreen?: boolean;\n mouseCapture?: boolean;\n}\n\n/**\n * useApp - Hook for managing the application lifecycle\n */\nexport const useApp = (options: AppOptions = {}) => {\n const rendererRef = useRef<Renderer | null>(null);\n const [size, setSize] = useState({ cols: 80, rows: 24 });\n const [running, setRunning] = useState(false);\n\n useEffect(() => {\n // Note: Renderer is not fully implemented yet, this is a skeleton\n // const renderer = new Renderer();\n // rendererRef.current = renderer;\n //\n // renderer.start();\n //\n // // Set initial size\n // setSize(renderer.getSize());\n //\n // // Setup resize handler\n // const cleanupResize = renderer.getTerminal().onResize((newSize) => {\n // setSize(newSize);\n // });\n //\n // setRunning(true);\n\n const cleanupResize = () => {\n // Cleanup function\n };\n\n setRunning(true);\n\n return () => {\n setRunning(false);\n cleanupResize();\n // renderer.stop();\n };\n }, []);\n\n const exit = () => {\n if (rendererRef.current) {\n // rendererRef.current.stop();\n setRunning(false);\n }\n };\n\n return {\n renderer: rendererRef.current,\n size,\n running,\n exit,\n };\n};\n","import { useEffect, useCallback } from 'react';\n\ninterface InputEvent {\n key: string;\n name: string;\n ctrl: boolean;\n meta: boolean;\n shift: boolean;\n sequence: string;\n}\n\ninterface ReadlineKey {\n name?: string;\n ctrl?: boolean;\n meta?: boolean;\n shift?: boolean;\n sequence?: string;\n}\n\ntype InputCallback = (input: InputEvent) => void;\n\n/**\n * useInput - Hook for capturing keyboard input\n */\nexport const useInput = (callback: InputCallback, deps: any[] = []) => {\n useEffect(() => {\n const readline = require('node:readline');\n\n const handler = (chunk: Buffer, key: ReadlineKey) => {\n if (!key) return;\n\n callback({\n key: key.name || '',\n name: key.name || '',\n ctrl: key.ctrl || false,\n meta: key.meta || false,\n shift: key.shift || false,\n sequence: key.sequence || '',\n });\n };\n\n process.stdin.setRawMode(true);\n readline.emitKeypressEvents(process.stdin);\n\n process.stdin.on('keypress', handler);\n\n return () => {\n process.stdin.off('keypress', handler);\n };\n }, [callback, ...deps]);\n};\n\n/**\n * useKey - Hook for capturing specific key presses\n */\nexport const useKey = (\n keyName: string | string[],\n callback: () => void,\n deps: any[] = []\n) => {\n const keys = Array.isArray(keyName) ? keyName : [keyName];\n\n useInput(\n useCallback(\n ({ key, ctrl, meta }) => {\n // Don't trigger if modifier keys are pressed (unless specified)\n if (ctrl || meta) return;\n\n if (keys.includes(key)) {\n callback();\n }\n },\n [callback, keys]\n ),\n deps\n );\n};\n","import { useState, useCallback, useRef, useEffect } from 'react';\n\ninterface FocusableElement {\n id: string;\n index: number;\n}\n\ninterface KeyPressEvent {\n name?: string;\n}\n\n/**\n * useFocus - Hook for managing focus state in forms and lists\n */\nexport const useFocus = (initialFocus = 0, itemCount: number) => {\n const [focusedIndex, setFocusedIndex] = useState(initialFocus);\n const focusableRefs = useRef<Map<number, HTMLElement>>(new Map());\n\n const focusNext = useCallback(() => {\n setFocusedIndex((current) => (current + 1) % itemCount);\n }, [itemCount]);\n\n const focusPrevious = useCallback(() => {\n setFocusedIndex((current) => (current - 1 + itemCount) % itemCount);\n }, [itemCount]);\n\n const setFocus = useCallback((index: number) => {\n if (index >= 0 && index < itemCount) {\n setFocusedIndex(index);\n }\n }, [itemCount]);\n\n const isFocused = useCallback(\n (index: number) => index === focusedIndex,\n [focusedIndex]\n );\n\n // Keyboard navigation\n useEffect(() => {\n const readline = require('node:readline');\n readline.emitKeypressEvents(process.stdin);\n process.stdin.setRawMode(true);\n\n const handleKeyPress = (_chunk: Buffer, key: KeyPressEvent) => {\n if (key.name === 'tab' || key.name === 'right') {\n focusNext();\n } else if (key.name === 'left') {\n focusPrevious();\n }\n };\n\n process.stdin.on('keypress', handleKeyPress);\n\n return () => {\n process.stdin.off('keypress', handleKeyPress);\n };\n }, [focusNext, focusPrevious]);\n\n return {\n focusedIndex,\n focusNext,\n focusPrevious,\n setFocus,\n isFocused,\n };\n};\n","import { useCallback, useEffect, useState } from 'react';\n\n/**\n * useStdoutDimensions - Hook for getting terminal dimensions\n */\nexport const useStdoutDimensions = () => {\n const [dimensions, setDimensions] = useState(() => ({\n columns: process.stdout.columns || 80,\n rows: process.stdout.rows || 24,\n }));\n\n useEffect(() => {\n const handleResize = () => {\n setDimensions({\n columns: process.stdout.columns || 80,\n rows: process.stdout.rows || 24,\n });\n };\n\n process.stdout.on('resize', handleResize);\n\n return () => {\n process.stdout.off('resize', handleResize);\n };\n }, []);\n\n return dimensions;\n};\n\n/**\n * useStdout - Hook for stdout operations\n */\nexport const useStdout = () => {\n const write = useCallback((data: string) => {\n process.stdout.write(data);\n }, []);\n\n return { write };\n};\n","import { useEffect, useRef } from 'react';\n\n/**\n * useInterval - Hook for setting up intervals\n */\nexport const useInterval = (callback: () => void, delay: number | null) => {\n const savedCallback = useRef(callback);\n\n // Remember the latest callback\n useEffect(() => {\n savedCallback.current = callback;\n }, [callback]);\n\n // Set up the interval\n useEffect(() => {\n if (delay === null) return;\n\n const tick = () => savedCallback.current();\n\n const id = setInterval(tick, delay);\n\n return () => clearInterval(id);\n }, [delay]);\n};\n\n/**\n * useTimeout - Hook for setting up timeouts\n */\nexport const useTimeout = (callback: () => void, delay: number | null) => {\n const savedCallback = useRef(callback);\n\n useEffect(() => {\n savedCallback.current = callback;\n }, [callback]);\n\n useEffect(() => {\n if (delay === null) return;\n\n const tick = () => savedCallback.current();\n\n const id = setTimeout(tick, delay);\n\n return () => clearTimeout(id);\n }, [delay]);\n};\n","import { useState, useCallback } from 'react';\n\ntype AppState = 'idle' | 'loading' | 'success' | 'error';\n\n/**\n * useAppState - Hook for managing application state\n */\nexport const useAppState = (initialState: AppState = 'idle') => {\n const [state, setState] = useState<AppState>(initialState);\n const [error, setError] = useState<Error | null>(null);\n\n const setLoading = useCallback(() => {\n setState('loading');\n setError(null);\n }, []);\n\n const setSuccess = useCallback(() => {\n setState('success');\n setError(null);\n }, []);\n\n const setErrorState = useCallback((err: Error) => {\n setState('error');\n setError(err);\n }, []);\n\n const setIdle = useCallback(() => {\n setState('idle');\n setError(null);\n }, []);\n\n const isLoading = state === 'loading';\n const isSuccess = state === 'success';\n const isError = state === 'error';\n const isIdle = state === 'idle';\n\n return {\n state,\n error,\n isLoading,\n isSuccess,\n isError,\n isIdle,\n setLoading,\n setSuccess,\n setError: setErrorState,\n setIdle,\n };\n};\n","import { useState, useCallback } from 'react';\n\ninterface ListOptions<T> {\n initialItems?: T[];\n initialIndex?: number;\n loop?: boolean;\n}\n\n/**\n * useList - Hook for managing list navigation\n */\nexport const useList = <T>({\n initialItems = [],\n initialIndex = 0,\n loop = true,\n}: ListOptions<T> = {}) => {\n const [items, setItems] = useState<T[]>(initialItems);\n const [index, setIndex] = useState(initialIndex);\n\n const next = useCallback(() => {\n setIndex((current) => {\n if (items.length === 0) return 0;\n\n const nextIndex = current + 1;\n\n if (nextIndex >= items.length) {\n return loop ? 0 : items.length - 1;\n }\n\n return nextIndex;\n });\n }, [items.length, loop]);\n\n const previous = useCallback(() => {\n setIndex((current) => {\n if (items.length === 0) return 0;\n\n const prevIndex = current - 1;\n\n if (prevIndex < 0) {\n return loop ? items.length - 1 : 0;\n }\n\n return prevIndex;\n });\n }, [items.length, loop]);\n\n const select = useCallback((item: T) => {\n const newIndex = items.indexOf(item);\n if (newIndex !== -1) {\n setIndex(newIndex);\n }\n }, [items]);\n\n const selectedIndex = index;\n const selectedItem = items[index] ?? null;\n\n return {\n items,\n setItems,\n index: selectedIndex,\n setIndex,\n selectedItem,\n next,\n previous,\n select,\n };\n};\n"],"mappings":"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","names":["useEffect","useState","useCallback","useRef","useEffect","useCallback","useEffect","useState","useEffect","useRef","useState","useCallback","useState","useCallback"]}
1
+ {"version":3,"sources":["../../src/hooks/useApp.ts","../../src/hooks/useInput.ts","../../src/hooks/useFocus.ts","../../src/hooks/useStdout.ts","../../src/hooks/useInterval.ts","../../src/hooks/useAppState.ts","../../src/hooks/useList.ts"],"sourcesContent":["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"],"mappings":"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","names":["useEffect","useState","useCallback","useEffect","readline","useCallback","useEffect","useState","useEffect","useRef","useState","useCallback","useState","useCallback"]}
@@ -1,6 +1,7 @@
1
1
  import { ReadStream, WriteStream } from 'node:tty';
2
2
  import * as readline from 'node:readline';
3
3
  import * as React from 'react';
4
+ import { DependencyList } from 'react';
4
5
 
5
6
  /**
6
7
  * Terminal cell representation
@@ -171,7 +172,7 @@ interface AppOptions {
171
172
  /**
172
173
  * useApp - Hook for managing the application lifecycle
173
174
  */
174
- declare const useApp: (options?: AppOptions) => {
175
+ declare const useApp: (_options?: AppOptions) => {
175
176
  renderer: Renderer | null;
176
177
  size: {
177
178
  cols: number;
@@ -193,11 +194,11 @@ type InputCallback = (input: InputEvent) => void;
193
194
  /**
194
195
  * useInput - Hook for capturing keyboard input
195
196
  */
196
- declare const useInput: (callback: InputCallback, deps?: any[]) => void;
197
+ declare const useInput: (callback: InputCallback, deps?: DependencyList) => void;
197
198
  /**
198
199
  * useKey - Hook for capturing specific key presses
199
200
  */
200
- declare const useKey: (keyName: string | string[], callback: () => void, deps?: any[]) => void;
201
+ declare const useKey: (keyName: string | string[], callback: () => void, deps?: DependencyList) => void;
201
202
 
202
203
  /**
203
204
  * useFocus - Hook for managing focus state in forms and lists
@@ -1,6 +1,7 @@
1
1
  import { ReadStream, WriteStream } from 'node:tty';
2
2
  import * as readline from 'node:readline';
3
3
  import * as React from 'react';
4
+ import { DependencyList } from 'react';
4
5
 
5
6
  /**
6
7
  * Terminal cell representation
@@ -171,7 +172,7 @@ interface AppOptions {
171
172
  /**
172
173
  * useApp - Hook for managing the application lifecycle
173
174
  */
174
- declare const useApp: (options?: AppOptions) => {
175
+ declare const useApp: (_options?: AppOptions) => {
175
176
  renderer: Renderer | null;
176
177
  size: {
177
178
  cols: number;
@@ -193,11 +194,11 @@ type InputCallback = (input: InputEvent) => void;
193
194
  /**
194
195
  * useInput - Hook for capturing keyboard input
195
196
  */
196
- declare const useInput: (callback: InputCallback, deps?: any[]) => void;
197
+ declare const useInput: (callback: InputCallback, deps?: DependencyList) => void;
197
198
  /**
198
199
  * useKey - Hook for capturing specific key presses
199
200
  */
200
- declare const useKey: (keyName: string | string[], callback: () => void, deps?: any[]) => void;
201
+ declare const useKey: (keyName: string | string[], callback: () => void, deps?: DependencyList) => void;
201
202
 
202
203
  /**
203
204
  * useFocus - Hook for managing focus state in forms and lists
package/dist/index.cjs CHANGED
@@ -358,7 +358,13 @@ var hostConfig = {
358
358
  supportsPersistence: false,
359
359
  supportsMutation: true,
360
360
  createInstance(type, props) {
361
- return { type, props: { ...props }, children: [], parent: null, node: { type, props: { ...props }, children: [] } };
361
+ return {
362
+ type,
363
+ props: { ...props },
364
+ children: [],
365
+ parent: null,
366
+ node: { type, props: { ...props }, children: [] }
367
+ };
362
368
  },
363
369
  appendInitialChild(parentInstance, child) {
364
370
  parentInstance.children.push(child);
@@ -374,7 +380,13 @@ var hostConfig = {
374
380
  return type === "TEXT";
375
381
  },
376
382
  createTextInstance(text) {
377
- return { type: "TEXT", props: { children: text }, children: [], parent: null, node: { type: "TEXT", props: { children: text }, children: [] } };
383
+ return {
384
+ type: "TEXT",
385
+ props: { children: text },
386
+ children: [],
387
+ parent: null,
388
+ node: { type: "TEXT", props: { children: text }, children: [] }
389
+ };
378
390
  },
379
391
  appendChildToContainer(container, child) {
380
392
  container.root = child;
@@ -551,13 +563,7 @@ Text.displayName = "Text";
551
563
 
552
564
  // src/components/Flex.tsx
553
565
  var import_react3 = __toESM(require("react"), 1);
554
- var Flex = ({
555
- children,
556
- grow = 0,
557
- shrink = 1,
558
- basis = "auto",
559
- ...boxProps
560
- }) => {
566
+ var Flex = ({ children, ...boxProps }) => {
561
567
  const props = {
562
568
  ...boxProps,
563
569
  children
@@ -667,8 +673,6 @@ var Progress = ({
667
673
  width = 20,
668
674
  label
669
675
  }) => {
670
- const percentage = Math.min(Math.max(value / max, 0), 1);
671
- const filledWidth = Math.floor(percentage * width);
672
676
  const props = {
673
677
  value,
674
678
  max,
@@ -684,9 +688,9 @@ Progress.displayName = "Progress";
684
688
 
685
689
  // src/hooks/useApp.ts
686
690
  var import_react8 = require("react");
687
- var useApp = (options = {}) => {
691
+ var useApp = (_options = {}) => {
688
692
  const rendererRef = (0, import_react8.useRef)(null);
689
- const [size, setSize] = (0, import_react8.useState)({ cols: 80, rows: 24 });
693
+ const [size] = (0, import_react8.useState)({ cols: 80, rows: 24 });
690
694
  const [running, setRunning] = (0, import_react8.useState)(false);
691
695
  (0, import_react8.useEffect)(() => {
692
696
  const cleanupResize = () => {
@@ -712,9 +716,9 @@ var useApp = (options = {}) => {
712
716
 
713
717
  // src/hooks/useInput.ts
714
718
  var import_react9 = require("react");
719
+ var import_node_readline = __toESM(require("readline"), 1);
715
720
  var useInput = (callback, deps = []) => {
716
721
  (0, import_react9.useEffect)(() => {
717
- const readline2 = require("readline");
718
722
  const handler = (chunk, key) => {
719
723
  if (!key) return;
720
724
  callback({
@@ -726,8 +730,10 @@ var useInput = (callback, deps = []) => {
726
730
  sequence: key.sequence || ""
727
731
  });
728
732
  };
729
- process.stdin.setRawMode(true);
730
- readline2.emitKeypressEvents(process.stdin);
733
+ if (process.stdin.isTTY) {
734
+ process.stdin.setRawMode(true);
735
+ }
736
+ import_node_readline.default.emitKeypressEvents(process.stdin);
731
737
  process.stdin.on("keypress", handler);
732
738
  return () => {
733
739
  process.stdin.off("keypress", handler);
@@ -735,7 +741,8 @@ var useInput = (callback, deps = []) => {
735
741
  }, [callback, ...deps]);
736
742
  };
737
743
  var useKey = (keyName, callback, deps = []) => {
738
- const keys = Array.isArray(keyName) ? keyName : [keyName];
744
+ const keyNameString = Array.isArray(keyName) ? keyName.join(",") : keyName;
745
+ const keys = (0, import_react9.useMemo)(() => Array.isArray(keyName) ? keyName : [keyName], [keyNameString]);
739
746
  useInput(
740
747
  (0, import_react9.useCallback)(
741
748
  ({ key, ctrl, meta }) => {
@@ -752,28 +759,29 @@ var useKey = (keyName, callback, deps = []) => {
752
759
 
753
760
  // src/hooks/useFocus.ts
754
761
  var import_react10 = require("react");
762
+ var import_node_readline2 = __toESM(require("readline"), 1);
755
763
  var useFocus = (initialFocus = 0, itemCount) => {
756
764
  const [focusedIndex, setFocusedIndex] = (0, import_react10.useState)(initialFocus);
757
- const focusableRefs = (0, import_react10.useRef)(/* @__PURE__ */ new Map());
758
765
  const focusNext = (0, import_react10.useCallback)(() => {
759
766
  setFocusedIndex((current) => (current + 1) % itemCount);
760
767
  }, [itemCount]);
761
768
  const focusPrevious = (0, import_react10.useCallback)(() => {
762
769
  setFocusedIndex((current) => (current - 1 + itemCount) % itemCount);
763
770
  }, [itemCount]);
764
- const setFocus = (0, import_react10.useCallback)((index) => {
765
- if (index >= 0 && index < itemCount) {
766
- setFocusedIndex(index);
767
- }
768
- }, [itemCount]);
769
- const isFocused = (0, import_react10.useCallback)(
770
- (index) => index === focusedIndex,
771
- [focusedIndex]
771
+ const setFocus = (0, import_react10.useCallback)(
772
+ (index) => {
773
+ if (index >= 0 && index < itemCount) {
774
+ setFocusedIndex(index);
775
+ }
776
+ },
777
+ [itemCount]
772
778
  );
779
+ const isFocused = (0, import_react10.useCallback)((index) => index === focusedIndex, [focusedIndex]);
773
780
  (0, import_react10.useEffect)(() => {
774
- const readline2 = require("readline");
775
- readline2.emitKeypressEvents(process.stdin);
776
- process.stdin.setRawMode(true);
781
+ import_node_readline2.default.emitKeypressEvents(process.stdin);
782
+ if (process.stdin.isTTY) {
783
+ process.stdin.setRawMode(true);
784
+ }
777
785
  const handleKeyPress = (_chunk, key) => {
778
786
  if (key.name === "tab" || key.name === "right") {
779
787
  focusNext();
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/renderer/types.ts","../src/renderer/terminal.ts","../src/renderer/renderer.ts","../src/reconciler/index.ts","../src/reconciler/host-config.ts","../src/components/Box.tsx","../src/components/Text.tsx","../src/components/Flex.tsx","../src/components/Grid.tsx","../src/components/Button.tsx","../src/components/Input.tsx","../src/components/Progress.tsx","../src/hooks/useApp.ts","../src/hooks/useInput.ts","../src/hooks/useFocus.ts","../src/hooks/useStdout.ts","../src/hooks/useInterval.ts","../src/hooks/useAppState.ts","../src/hooks/useList.ts"],"sourcesContent":["// Main exports\nexport { Renderer, Buffer, Terminal, ANSI } from './renderer/index.js';\nexport { createRoot, render } from './reconciler/index.js';\nexport * from './components/index.js';\nexport * from './hooks/index.js';\n\n// Re-export React for convenience\nexport { default as React } from 'react';\n","/**\n * Terminal cell representation\n */\nexport interface Cell {\n char: string;\n fg?: number; // Foreground color (ANSI 256 or RGB)\n bg?: number; // Background color\n bold?: boolean;\n dim?: boolean;\n italic?: boolean;\n underline?: boolean;\n strikethrough?: boolean;\n}\n\n/**\n * Terminal buffer - a 2D grid of cells\n */\nexport class Buffer {\n constructor(\n public width: number,\n public height: number,\n public cells: Cell[][] = []\n ) {\n // Initialize empty buffer\n this.cells = Array.from({ length: height }, () =>\n Array.from({ length: width }, () => ({ char: ' ' }))\n );\n }\n\n setCell(x: number, y: number, cell: Cell): void {\n if (y >= 0 && y < this.height && x >= 0 && x < this.width) {\n this.cells[y][x] = cell;\n }\n }\n\n getCell(x: number, y: number): Cell | undefined {\n if (y >= 0 && y < this.height && x >= 0 && x < this.width) {\n return this.cells[y][x];\n }\n return undefined;\n }\n\n clear(): void {\n this.cells = Array.from({ length: this.height }, () =>\n Array.from({ length: this.width }, () => ({ char: ' ' }))\n );\n }\n\n resize(width: number, height: number): void {\n const newCells: Cell[][] = Array.from({ length: height }, () =>\n Array.from({ length: width }, () => ({ char: ' ' }))\n );\n\n // Copy existing content\n for (let y = 0; y < Math.min(this.height, height); y++) {\n for (let x = 0; x < Math.min(this.width, width); x++) {\n newCells[y][x] = this.cells[y][x];\n }\n }\n\n this.cells = newCells;\n this.width = width;\n this.height = height;\n }\n\n clone(): Buffer {\n const newBuffer = new Buffer(this.width, this.height);\n newBuffer.cells = this.cells.map((row) => row.map((cell) => ({ ...cell })));\n return newBuffer;\n }\n}\n\n/**\n * Terminal size\n */\nexport interface Size {\n cols: number;\n rows: number;\n}\n\n/**\n * Position in terminal\n */\nexport interface Position {\n x: number;\n y: number;\n}\n\n/**\n * Rectangle area\n */\nexport interface Rect {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n","import type { ReadStream, WriteStream } from 'node:tty';\nimport { Buffer, Size } from './types.js';\nimport * as readline from 'node:readline';\n\ntype ProcessStdin = ReadStream & NodeJS.ReadStream;\ntype ProcessStdout = WriteStream & NodeJS.WriteStream;\n\n/**\n * ANSI escape codes for terminal control\n */\nexport const ANSI = {\n // Screen control\n CLEAR_SCREEN: '\\x1b[2J',\n RESET_CURSOR: '\\x1b[H',\n ALTERNATE_SCREEN_ENABLE: '\\x1b[?1049h',\n ALTERNATE_SCREEN_DISABLE: '\\x1b[?1049l',\n\n // Cursor control\n HIDE_CURSOR: '\\x1b[?25l',\n SHOW_CURSOR: '\\x1b[?25h',\n MOVE_CURSOR: (x: number, y: number) => `\\x1b[${y + 1};${x + 1}H`,\n\n // Colors\n RESET_STYLE: '\\x1b[0m',\n FG_COLOR_256: (color: number) => `\\x1b[38;5;${color}m`,\n BG_COLOR_256: (color: number) => `\\x1b[48;5;${color}m`,\n FG_COLOR_RGB: (r: number, g: number, b: number) => `\\x1b[38;2;${r};${g};${b}m`,\n BG_COLOR_RGB: (r: number, g: number, b: number) => `\\x1b[48;2;${r};${g};${b}m`,\n\n // Text styles\n BOLD: '\\x1b[1m',\n DIM: '\\x1b[2m',\n ITALIC: '\\x1b[3m',\n UNDERLINE: '\\x1b[4m',\n STRIKETHROUGH: '\\x1b[9m',\n\n // Reset individual styles\n BOLD_OFF: '\\x1b[22m',\n DIM_OFF: '\\x1b[22m',\n ITALIC_OFF: '\\x1b[23m',\n UNDERLINE_OFF: '\\x1b[24m',\n STRIKETHROUGH_OFF: '\\x1b[29m',\n} as const;\n\n/**\n * Terminal interface - handles low-level terminal I/O\n */\nexport class Terminal {\n private stdin: ProcessStdin;\n private stdout: ProcessStdout;\n private _size: Size;\n private rawMode = false;\n private alternateScreen = false;\n\n constructor(stdin: ProcessStdin = process.stdin as ProcessStdin, stdout: ProcessStdout = process.stdout as ProcessStdout) {\n this.stdin = stdin;\n this.stdout = stdout;\n this._size = { cols: stdout.columns || 80, rows: stdout.rows || 24 };\n }\n\n get size(): Size {\n return this._size;\n }\n\n /**\n * Enable raw mode for character-by-character input\n */\n enableRawMode(): void {\n if (this.rawMode) return;\n this.rawMode = true;\n readline.emitKeypressEvents(this.stdin);\n (this.stdin as NodeJS.ReadStream).setRawMode(true);\n }\n\n /**\n * Disable raw mode\n */\n disableRawMode(): void {\n if (!this.rawMode) return;\n this.rawMode = false;\n (this.stdin as NodeJS.ReadStream).setRawMode(false);\n }\n\n /**\n * Enable alternate screen buffer\n */\n enableAlternateScreen(): void {\n if (this.alternateScreen) return;\n this.alternateScreen = true;\n this.stdout.write(ANSI.ALTERNATE_SCREEN_ENABLE);\n }\n\n /**\n * Disable alternate screen buffer\n */\n disableAlternateScreen(): void {\n if (!this.alternateScreen) return;\n this.alternateScreen = false;\n this.stdout.write(ANSI.ALTERNATE_SCREEN_DISABLE);\n }\n\n /**\n * Hide cursor\n */\n hideCursor(): void {\n this.stdout.write(ANSI.HIDE_CURSOR);\n }\n\n /**\n * Show cursor\n */\n showCursor(): void {\n this.stdout.write(ANSI.SHOW_CURSOR);\n }\n\n /**\n * Clear the entire screen\n */\n clear(): void {\n this.stdout.write(ANSI.CLEAR_SCREEN + ANSI.RESET_CURSOR);\n }\n\n /**\n * Write buffer to terminal\n */\n write(buffer: Buffer): void {\n let output = ANSI.RESET_STYLE;\n let lastStyle: string | null = null;\n\n for (let y = 0; y < buffer.height; y++) {\n for (let x = 0; x < buffer.width; x++) {\n const cell = buffer.getCell(x, y);\n if (!cell) continue;\n\n // Build style string\n const style = this.buildStyleString(cell);\n if (style !== lastStyle) {\n output += style;\n lastStyle = style;\n }\n\n // Add character\n output += cell.char;\n }\n // New line after each row\n output += '\\r\\n';\n }\n\n this.stdout.write(output);\n }\n\n /**\n * Build ANSI style string from cell\n */\n private buildStyleString(cell: { fg?: number; bg?: number; bold?: boolean; dim?: boolean }): string {\n let style = '';\n\n if (cell.fg !== undefined) {\n style += ANSI.FG_COLOR_256(cell.fg);\n }\n if (cell.bg !== undefined) {\n style += ANSI.BG_COLOR_256(cell.bg);\n }\n if (cell.bold) {\n style += ANSI.BOLD;\n }\n if (cell.dim) {\n style += ANSI.DIM;\n }\n\n return style;\n }\n\n /**\n * Set up SIGWINCH handler for terminal resize\n */\n onResize(callback: (size: Size) => void): () => void {\n const handler = () => {\n this._size = { cols: this.stdout.columns || 80, rows: this.stdout.rows || 24 };\n callback(this._size);\n };\n\n process.on('SIGWINCH', handler);\n\n return () => {\n process.off('SIGWINCH', handler);\n };\n }\n\n /**\n * Set up input handler\n */\n onInput(callback: (chunk: Buffer, key: readline.Key) => void): () => void {\n const handler = (chunk: Buffer, key: readline.Key) => {\n callback(chunk, key);\n };\n\n this.stdin.on('keypress', handler as any);\n\n return () => {\n this.stdin.off('keypress', handler as any);\n };\n }\n\n /**\n * Clean up terminal state\n */\n restore(): void {\n this.showCursor();\n this.disableAlternateScreen();\n this.disableRawMode();\n this.stdout.write(ANSI.RESET_STYLE);\n }\n}\n","import { Buffer, Size, Rect } from './types.js';\nimport { Terminal } from './terminal.js';\n\n/**\n * Renderer - manages the rendering lifecycle\n */\nexport class Renderer {\n private terminal: Terminal;\n private buffer?: Buffer;\n private previousBuffer?: Buffer;\n private currentSize: Size;\n private running = false;\n\n constructor(terminal = new Terminal()) {\n this.terminal = terminal;\n this.currentSize = terminal.size;\n }\n\n /**\n * Start the renderer\n */\n start(): void {\n if (this.running) return;\n this.running = true;\n\n // Setup terminal\n this.terminal.enableRawMode();\n this.terminal.enableAlternateScreen();\n this.terminal.hideCursor();\n this.terminal.clear();\n\n // Initialize buffer\n this.buffer = new Buffer(this.currentSize.cols, this.currentSize.rows);\n\n // Handle resize\n this.terminal.onResize((size) => {\n this.currentSize = size;\n this.buffer?.resize(size.cols, size.rows);\n });\n }\n\n /**\n * Stop the renderer\n */\n stop(): void {\n if (!this.running) return;\n this.running = false;\n\n this.terminal.restore();\n }\n\n /**\n * Get a writable buffer for the current frame\n */\n getBuffer(): Buffer {\n if (!this.buffer) {\n throw new Error('Renderer not started');\n }\n return this.buffer;\n }\n\n /**\n * Present the current buffer to the terminal\n */\n present(): void {\n if (!this.buffer) return;\n\n // For now, just write the entire buffer\n // TODO: Implement differential rendering for performance\n this.terminal.write(this.buffer);\n\n // Store for next frame comparison\n this.previousBuffer = this.buffer.clone();\n\n // Clear buffer for next frame\n this.buffer.clear();\n }\n\n /**\n * Get the current terminal size\n */\n getSize(): Size {\n return this.currentSize;\n }\n\n /**\n * Get the terminal instance for direct access\n */\n getTerminal(): Terminal {\n return this.terminal;\n }\n}\n","import ReactReconciler from 'react-reconciler';\nimport { hostConfig, TUIContainer, TUIProps } from './host-config.js';\nimport { Buffer, Renderer } from '../renderer/index.js';\n\n// Import React types\nimport type { ReactElement } from 'react';\n\n/**\n * Create a reconciler instance\n */\nexport const createReconciler = () => ReactReconciler(hostConfig);\n\n/**\n * Create a root container for rendering\n */\nexport const createRoot = (renderer: Renderer): TUIContainer => {\n const buffer = renderer.getBuffer();\n\n return {\n buffer,\n root: null,\n listeners: {},\n };\n};\n\n/**\n * Render a React element to the terminal\n */\nexport const render = (\n element: ReactElement,\n container: TUIContainer,\n renderer: Renderer\n) => {\n const reconciler = createReconciler();\n\n reconciler.updateContainer(element, container, null, () => {\n // Present the frame after React has finished rendering\n renderer.present();\n });\n};\n\n// Export types\nexport type { TUIContainer, TUIProps };\n","import type { HostConfig } from 'react-reconciler';\nimport type { Buffer } from '../renderer/types.js';\n\nexport interface TUIProps {\n style?: {\n fg?: number;\n bg?: number;\n bold?: boolean;\n dim?: boolean;\n italic?: boolean;\n underline?: boolean;\n };\n x?: number;\n y?: number;\n width?: number;\n height?: number;\n children?: any;\n}\n\nexport type TUIType = string;\n\nexport interface TUIElement {\n type: TUIType;\n props: TUIProps;\n children: TUIElement[];\n}\n\nexport interface TUIContainer {\n buffer: Buffer;\n root: TUIElement | null;\n listeners: {\n onInput?: (key: string) => void;\n onClick?: (x: number, y: number) => void;\n };\n}\n\nexport interface TUIInstance {\n type: TUIType;\n props: TUIProps;\n children: TUIInstance[];\n parent: TUIInstance | null;\n node: TUIElement;\n}\n\n// @ts-ignore - React reconciler types are complex\nexport const hostConfig = {\n supportsPersistence: false,\n supportsMutation: true,\n createInstance(type: any, props: any) {\n return { type, props: { ...props }, children: [], parent: null, node: { type, props: { ...props }, children: [] } };\n },\n appendInitialChild(parentInstance: any, child: any) {\n parentInstance.children.push(child);\n child.parent = parentInstance;\n },\n finalizeInitialChildren() { return false; },\n prepareUpdate() { return {}; },\n shouldSetTextContent(type: any) { return type === 'TEXT'; },\n createTextInstance(text: any) {\n return { type: 'TEXT', props: { children: text }, children: [], parent: null, node: { type: 'TEXT', props: { children: text }, children: [] } };\n },\n appendChildToContainer(container: any, child: any) {\n container.root = child;\n child.parent = null;\n },\n appendChild(parentInstance: any, child: any) {\n parentInstance.children.push(child);\n child.parent = parentInstance;\n },\n removeChild(parentInstance: any, child: any) {\n const index = parentInstance.children.indexOf(child);\n if (index !== -1) {\n parentInstance.children.splice(index, 1);\n child.parent = null;\n }\n },\n removeChildFromContainer(_container: any, child: any) { child.parent = null; },\n insertBefore(parentInstance: any, child: any, beforeChild: any) {\n const index = parentInstance.children.indexOf(beforeChild);\n if (index !== -1) {\n parentInstance.children.splice(index, 0, child);\n } else {\n parentInstance.children.push(child);\n }\n child.parent = parentInstance;\n },\n insertInContainerBefore() {},\n commitUpdate(instance: any, _updatePayload: any, _type: any, _oldProps: any, newProps: any) {\n instance.props = { ...newProps };\n instance.node.props = { ...newProps };\n },\n commitTextUpdate(textInstance: any, _oldText: any, newText: any) {\n textInstance.props.children = newText;\n textInstance.node.props.children = newText;\n },\n resetTextContent(instance: any) {\n if (instance.type === 'TEXT') {\n instance.props.children = '';\n instance.node.props.children = '';\n }\n },\n getPublicInstance(instance: any) { return instance; },\n getRootHostContext(rootContainer: any) { return rootContainer; },\n getChildHostContext(parentHostContext: any) { return parentHostContext; },\n prepareForCommit() { return null; },\n resetAfterCommit(container: any) {\n if (container.root) {\n renderToBuffer(container.root, container.buffer);\n }\n },\n shouldAttemptEagerTransition() { return false; },\n scheduleTimeout: setTimeout,\n cancelTimeout: clearTimeout,\n noTimeout: -1,\n getCurrentEventPriority() { return 0; },\n getInstanceFromNode(node: any) { return node; },\n beforeActiveInstanceBlur() {},\n afterActiveInstanceBlur() {},\n preparePortalMount() {},\n prepareScopeUpdate() {},\n getInstanceFromScope() { return null; },\n detachDeletedInstance() {},\n isPrimaryRenderer: true,\n supportsHydration: false,\n};\n\nfunction renderToBuffer(instance: any, buffer: Buffer, x = 0, y = 0): void {\n if (!instance) return;\n const { type, props, children } = instance;\n const currentX = props.x ?? x;\n const currentY = props.y ?? y;\n\n if (type === 'TEXT' || typeof props.children === 'string') {\n const text = String(props.children || '');\n const style = props.style || {};\n for (let i = 0; i < text.length; i++) {\n const char = text[i];\n if (char === '\\n') continue;\n buffer.setCell(currentX + i, currentY, { char, ...style });\n }\n }\n\n if (Array.isArray(children)) {\n for (const child of children) {\n renderToBuffer(child, buffer, currentX, currentY);\n }\n } else if (children) {\n renderToBuffer(children, buffer, currentX, currentY);\n }\n}\n","import React from 'react';\n\nexport interface BoxProps {\n children?: React.ReactNode;\n style?: {\n fg?: number;\n bg?: number;\n bold?: boolean;\n dim?: boolean;\n italic?: boolean;\n underline?: boolean;\n };\n x?: number;\n y?: number;\n width?: number;\n height?: number;\n border?: boolean;\n flexDirection?: 'row' | 'column';\n justifyContent?: 'flex-start' | 'center' | 'flex-end' | 'space-between';\n alignItems?: 'flex-start' | 'center' | 'flex-end';\n padding?: number;\n}\n\n/**\n * Box - A flexible container component for layout\n */\nexport const Box: React.FC<BoxProps> = ({\n children,\n style,\n x = 0,\n y = 0,\n width,\n height,\n border = false,\n flexDirection = 'column',\n justifyContent = 'flex-start',\n alignItems = 'flex-start',\n padding = 0,\n}) => {\n const props: BoxProps = {\n children,\n style,\n x,\n y,\n width,\n height,\n border,\n flexDirection,\n justifyContent,\n alignItems,\n padding,\n };\n\n return React.createElement('BOX', props, children);\n};\n\nBox.displayName = 'Box';\n","import React from 'react';\n\nexport interface TextProps {\n children: React.ReactNode;\n style?: {\n fg?: number;\n bg?: number;\n bold?: boolean;\n dim?: boolean;\n italic?: boolean;\n underline?: boolean;\n };\n x?: number;\n y?: number;\n}\n\n/**\n * Text - A text component\n */\nexport const Text: React.FC<TextProps> = ({ children, style, x = 0, y = 0 }) => {\n const props: TextProps = {\n children: String(children),\n style,\n x,\n y,\n };\n\n return React.createElement('TEXT', props);\n};\n\nText.displayName = 'Text';\n","import React from 'react';\nimport { BoxProps } from './Box.js';\n\nexport interface FlexProps extends BoxProps {\n grow?: number;\n shrink?: number;\n basis?: number;\n}\n\n/**\n * Flex - A flex container for flexible layouts\n */\nexport const Flex: React.FC<FlexProps> = ({\n children,\n grow = 0,\n shrink = 1,\n basis = 'auto',\n ...boxProps\n}) => {\n const props: BoxProps = {\n ...boxProps,\n children,\n };\n\n return React.createElement('FLEX', props);\n};\n\nFlex.displayName = 'Flex';\n","import React from 'react';\n\nexport interface GridProps {\n children?: React.ReactNode;\n columns?: number;\n rows?: number;\n gap?: number;\n style?: {\n fg?: number;\n bg?: number;\n bold?: boolean;\n dim?: boolean;\n };\n x?: number;\n y?: number;\n width?: number;\n height?: number;\n}\n\n/**\n * Grid - A grid layout component\n */\nexport const Grid: React.FC<GridProps> = ({\n children,\n columns = 2,\n rows,\n gap = 1,\n style,\n x = 0,\n y = 0,\n width,\n height,\n}) => {\n const props: GridProps = {\n children,\n columns,\n rows,\n gap,\n style,\n x,\n y,\n width,\n height,\n };\n\n return React.createElement('GRID', props, children);\n};\n\nGrid.displayName = 'Grid';\n","import React from 'react';\n\nexport interface ButtonProps {\n children: React.ReactNode;\n onClick?: () => void;\n focused?: boolean;\n style?: {\n fg?: number;\n bg?: number;\n bold?: boolean;\n focusedFg?: number;\n focusedBg?: number;\n };\n x?: number;\n y?: number;\n}\n\n/**\n * Button - A clickable button component\n */\nexport const Button: React.FC<ButtonProps> = ({\n children,\n onClick,\n focused = false,\n style,\n x = 0,\n y = 0,\n}) => {\n // Use focused style if focused\n const activeStyle = focused\n ? {\n ...style,\n fg: style?.focusedFg || style?.fg || 0,\n bg: style?.focusedBg || style?.bg || 7,\n }\n : style;\n\n const props: ButtonProps = {\n children: `[ ${children} ]`,\n onClick,\n focused,\n style: activeStyle,\n x,\n y,\n };\n\n return React.createElement('BUTTON', props);\n};\n\nButton.displayName = 'Button';\n","import React from 'react';\n\nexport interface InputProps {\n value: string;\n onChange?: (value: string) => void;\n placeholder?: string;\n focused?: boolean;\n mask?: boolean;\n style?: {\n fg?: number;\n bg?: number;\n bold?: boolean;\n placeholderFg?: number;\n };\n x?: number;\n y?: number;\n width?: number;\n maxLength?: number;\n}\n\n/**\n * Input - A text input component\n */\nexport const Input: React.FC<InputProps> = ({\n value,\n onChange,\n placeholder = '',\n focused = false,\n mask = false,\n style,\n x = 0,\n y = 0,\n width = 20,\n maxLength,\n}) => {\n const displayValue = mask ? '*'.repeat(value.length) : value;\n const displayText =\n value.length > 0 ? displayValue : focused ? placeholder : '';\n\n const props: InputProps = {\n value: displayText,\n onChange,\n placeholder,\n focused,\n mask,\n style: focused\n ? style\n : {\n ...style,\n fg: style?.placeholderFg || 8,\n },\n x,\n y,\n width,\n maxLength,\n };\n\n return React.createElement('INPUT', props);\n};\n\nInput.displayName = 'Input';\n","import React from 'react';\n\nexport interface ProgressProps {\n value: number;\n max?: number;\n style?: {\n fg?: number;\n bg?: number;\n filledFg?: number;\n filledBg?: number;\n };\n x?: number;\n y?: number;\n width?: number;\n label?: string;\n}\n\n/**\n * Progress - A progress bar component\n */\nexport const Progress: React.FC<ProgressProps> = ({\n value,\n max = 100,\n style,\n x = 0,\n y = 0,\n width = 20,\n label,\n}) => {\n const percentage = Math.min(Math.max(value / max, 0), 1);\n const filledWidth = Math.floor(percentage * width);\n\n const props: ProgressProps = {\n value,\n max,\n style,\n x,\n y,\n width,\n label,\n };\n\n return React.createElement('PROGRESS', props);\n};\n\nProgress.displayName = 'Progress';\n","import { Renderer } from '../renderer/index.js';\nimport { useEffect, useState, useRef } from 'react';\n\ninterface AppOptions {\n fullscreen?: boolean;\n alternateScreen?: boolean;\n mouseCapture?: boolean;\n}\n\n/**\n * useApp - Hook for managing the application lifecycle\n */\nexport const useApp = (options: AppOptions = {}) => {\n const rendererRef = useRef<Renderer | null>(null);\n const [size, setSize] = useState({ cols: 80, rows: 24 });\n const [running, setRunning] = useState(false);\n\n useEffect(() => {\n // Note: Renderer is not fully implemented yet, this is a skeleton\n // const renderer = new Renderer();\n // rendererRef.current = renderer;\n //\n // renderer.start();\n //\n // // Set initial size\n // setSize(renderer.getSize());\n //\n // // Setup resize handler\n // const cleanupResize = renderer.getTerminal().onResize((newSize) => {\n // setSize(newSize);\n // });\n //\n // setRunning(true);\n\n const cleanupResize = () => {\n // Cleanup function\n };\n\n setRunning(true);\n\n return () => {\n setRunning(false);\n cleanupResize();\n // renderer.stop();\n };\n }, []);\n\n const exit = () => {\n if (rendererRef.current) {\n // rendererRef.current.stop();\n setRunning(false);\n }\n };\n\n return {\n renderer: rendererRef.current,\n size,\n running,\n exit,\n };\n};\n","import { useEffect, useCallback } from 'react';\n\ninterface InputEvent {\n key: string;\n name: string;\n ctrl: boolean;\n meta: boolean;\n shift: boolean;\n sequence: string;\n}\n\ninterface ReadlineKey {\n name?: string;\n ctrl?: boolean;\n meta?: boolean;\n shift?: boolean;\n sequence?: string;\n}\n\ntype InputCallback = (input: InputEvent) => void;\n\n/**\n * useInput - Hook for capturing keyboard input\n */\nexport const useInput = (callback: InputCallback, deps: any[] = []) => {\n useEffect(() => {\n const readline = require('node:readline');\n\n const handler = (chunk: Buffer, key: ReadlineKey) => {\n if (!key) return;\n\n callback({\n key: key.name || '',\n name: key.name || '',\n ctrl: key.ctrl || false,\n meta: key.meta || false,\n shift: key.shift || false,\n sequence: key.sequence || '',\n });\n };\n\n process.stdin.setRawMode(true);\n readline.emitKeypressEvents(process.stdin);\n\n process.stdin.on('keypress', handler);\n\n return () => {\n process.stdin.off('keypress', handler);\n };\n }, [callback, ...deps]);\n};\n\n/**\n * useKey - Hook for capturing specific key presses\n */\nexport const useKey = (\n keyName: string | string[],\n callback: () => void,\n deps: any[] = []\n) => {\n const keys = Array.isArray(keyName) ? keyName : [keyName];\n\n useInput(\n useCallback(\n ({ key, ctrl, meta }) => {\n // Don't trigger if modifier keys are pressed (unless specified)\n if (ctrl || meta) return;\n\n if (keys.includes(key)) {\n callback();\n }\n },\n [callback, keys]\n ),\n deps\n );\n};\n","import { useState, useCallback, useRef, useEffect } from 'react';\n\ninterface FocusableElement {\n id: string;\n index: number;\n}\n\ninterface KeyPressEvent {\n name?: string;\n}\n\n/**\n * useFocus - Hook for managing focus state in forms and lists\n */\nexport const useFocus = (initialFocus = 0, itemCount: number) => {\n const [focusedIndex, setFocusedIndex] = useState(initialFocus);\n const focusableRefs = useRef<Map<number, HTMLElement>>(new Map());\n\n const focusNext = useCallback(() => {\n setFocusedIndex((current) => (current + 1) % itemCount);\n }, [itemCount]);\n\n const focusPrevious = useCallback(() => {\n setFocusedIndex((current) => (current - 1 + itemCount) % itemCount);\n }, [itemCount]);\n\n const setFocus = useCallback((index: number) => {\n if (index >= 0 && index < itemCount) {\n setFocusedIndex(index);\n }\n }, [itemCount]);\n\n const isFocused = useCallback(\n (index: number) => index === focusedIndex,\n [focusedIndex]\n );\n\n // Keyboard navigation\n useEffect(() => {\n const readline = require('node:readline');\n readline.emitKeypressEvents(process.stdin);\n process.stdin.setRawMode(true);\n\n const handleKeyPress = (_chunk: Buffer, key: KeyPressEvent) => {\n if (key.name === 'tab' || key.name === 'right') {\n focusNext();\n } else if (key.name === 'left') {\n focusPrevious();\n }\n };\n\n process.stdin.on('keypress', handleKeyPress);\n\n return () => {\n process.stdin.off('keypress', handleKeyPress);\n };\n }, [focusNext, focusPrevious]);\n\n return {\n focusedIndex,\n focusNext,\n focusPrevious,\n setFocus,\n isFocused,\n };\n};\n","import { useCallback, useEffect, useState } from 'react';\n\n/**\n * useStdoutDimensions - Hook for getting terminal dimensions\n */\nexport const useStdoutDimensions = () => {\n const [dimensions, setDimensions] = useState(() => ({\n columns: process.stdout.columns || 80,\n rows: process.stdout.rows || 24,\n }));\n\n useEffect(() => {\n const handleResize = () => {\n setDimensions({\n columns: process.stdout.columns || 80,\n rows: process.stdout.rows || 24,\n });\n };\n\n process.stdout.on('resize', handleResize);\n\n return () => {\n process.stdout.off('resize', handleResize);\n };\n }, []);\n\n return dimensions;\n};\n\n/**\n * useStdout - Hook for stdout operations\n */\nexport const useStdout = () => {\n const write = useCallback((data: string) => {\n process.stdout.write(data);\n }, []);\n\n return { write };\n};\n","import { useEffect, useRef } from 'react';\n\n/**\n * useInterval - Hook for setting up intervals\n */\nexport const useInterval = (callback: () => void, delay: number | null) => {\n const savedCallback = useRef(callback);\n\n // Remember the latest callback\n useEffect(() => {\n savedCallback.current = callback;\n }, [callback]);\n\n // Set up the interval\n useEffect(() => {\n if (delay === null) return;\n\n const tick = () => savedCallback.current();\n\n const id = setInterval(tick, delay);\n\n return () => clearInterval(id);\n }, [delay]);\n};\n\n/**\n * useTimeout - Hook for setting up timeouts\n */\nexport const useTimeout = (callback: () => void, delay: number | null) => {\n const savedCallback = useRef(callback);\n\n useEffect(() => {\n savedCallback.current = callback;\n }, [callback]);\n\n useEffect(() => {\n if (delay === null) return;\n\n const tick = () => savedCallback.current();\n\n const id = setTimeout(tick, delay);\n\n return () => clearTimeout(id);\n }, [delay]);\n};\n","import { useState, useCallback } from 'react';\n\ntype AppState = 'idle' | 'loading' | 'success' | 'error';\n\n/**\n * useAppState - Hook for managing application state\n */\nexport const useAppState = (initialState: AppState = 'idle') => {\n const [state, setState] = useState<AppState>(initialState);\n const [error, setError] = useState<Error | null>(null);\n\n const setLoading = useCallback(() => {\n setState('loading');\n setError(null);\n }, []);\n\n const setSuccess = useCallback(() => {\n setState('success');\n setError(null);\n }, []);\n\n const setErrorState = useCallback((err: Error) => {\n setState('error');\n setError(err);\n }, []);\n\n const setIdle = useCallback(() => {\n setState('idle');\n setError(null);\n }, []);\n\n const isLoading = state === 'loading';\n const isSuccess = state === 'success';\n const isError = state === 'error';\n const isIdle = state === 'idle';\n\n return {\n state,\n error,\n isLoading,\n isSuccess,\n isError,\n isIdle,\n setLoading,\n setSuccess,\n setError: setErrorState,\n setIdle,\n };\n};\n","import { useState, useCallback } from 'react';\n\ninterface ListOptions<T> {\n initialItems?: T[];\n initialIndex?: number;\n loop?: boolean;\n}\n\n/**\n * useList - Hook for managing list navigation\n */\nexport const useList = <T>({\n initialItems = [],\n initialIndex = 0,\n loop = true,\n}: ListOptions<T> = {}) => {\n const [items, setItems] = useState<T[]>(initialItems);\n const [index, setIndex] = useState(initialIndex);\n\n const next = useCallback(() => {\n setIndex((current) => {\n if (items.length === 0) return 0;\n\n const nextIndex = current + 1;\n\n if (nextIndex >= items.length) {\n return loop ? 0 : items.length - 1;\n }\n\n return nextIndex;\n });\n }, [items.length, loop]);\n\n const previous = useCallback(() => {\n setIndex((current) => {\n if (items.length === 0) return 0;\n\n const prevIndex = current - 1;\n\n if (prevIndex < 0) {\n return loop ? items.length - 1 : 0;\n }\n\n return prevIndex;\n });\n }, [items.length, loop]);\n\n const select = useCallback((item: T) => {\n const newIndex = items.indexOf(item);\n if (newIndex !== -1) {\n setIndex(newIndex);\n }\n }, [items]);\n\n const selectedIndex = index;\n const selectedItem = items[index] ?? null;\n\n return {\n items,\n setItems,\n index: selectedIndex,\n setIndex,\n selectedItem,\n next,\n previous,\n select,\n };\n};\n"],"mappings":"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","names":["Buffer","Buffer","Buffer","ReactReconciler","React","import_react","React","import_react","React","import_react","React","import_react","React","import_react","React","import_react","React","import_react","import_react","readline","import_react","readline","import_react","import_react","import_react","import_react","import_react"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/renderer/types.ts","../src/renderer/terminal.ts","../src/renderer/renderer.ts","../src/reconciler/index.ts","../src/reconciler/host-config.ts","../src/components/Box.tsx","../src/components/Text.tsx","../src/components/Flex.tsx","../src/components/Grid.tsx","../src/components/Button.tsx","../src/components/Input.tsx","../src/components/Progress.tsx","../src/hooks/useApp.ts","../src/hooks/useInput.ts","../src/hooks/useFocus.ts","../src/hooks/useStdout.ts","../src/hooks/useInterval.ts","../src/hooks/useAppState.ts","../src/hooks/useList.ts"],"sourcesContent":["// Main exports\nexport { Renderer, Buffer, Terminal, ANSI } from './renderer/index.js';\nexport { createRoot, render } from './reconciler/index.js';\nexport * from './components/index.js';\nexport * from './hooks/index.js';\n\n// Re-export React for convenience\nexport { default as React } from 'react';\n","/**\n * Terminal cell representation\n */\nexport interface Cell {\n char: string;\n fg?: number; // Foreground color (ANSI 256 or RGB)\n bg?: number; // Background color\n bold?: boolean;\n dim?: boolean;\n italic?: boolean;\n underline?: boolean;\n strikethrough?: boolean;\n}\n\n/**\n * Terminal buffer - a 2D grid of cells\n */\nexport class Buffer {\n constructor(\n public width: number,\n public height: number,\n public cells: Cell[][] = []\n ) {\n // Initialize empty buffer\n this.cells = Array.from({ length: height }, () =>\n Array.from({ length: width }, () => ({ char: ' ' }))\n );\n }\n\n setCell(x: number, y: number, cell: Cell): void {\n if (y >= 0 && y < this.height && x >= 0 && x < this.width) {\n this.cells[y][x] = cell;\n }\n }\n\n getCell(x: number, y: number): Cell | undefined {\n if (y >= 0 && y < this.height && x >= 0 && x < this.width) {\n return this.cells[y][x];\n }\n return undefined;\n }\n\n clear(): void {\n this.cells = Array.from({ length: this.height }, () =>\n Array.from({ length: this.width }, () => ({ char: ' ' }))\n );\n }\n\n resize(width: number, height: number): void {\n const newCells: Cell[][] = Array.from({ length: height }, () =>\n Array.from({ length: width }, () => ({ char: ' ' }))\n );\n\n // Copy existing content\n for (let y = 0; y < Math.min(this.height, height); y++) {\n for (let x = 0; x < Math.min(this.width, width); x++) {\n newCells[y][x] = this.cells[y][x];\n }\n }\n\n this.cells = newCells;\n this.width = width;\n this.height = height;\n }\n\n clone(): Buffer {\n const newBuffer = new Buffer(this.width, this.height);\n newBuffer.cells = this.cells.map((row) => row.map((cell) => ({ ...cell })));\n return newBuffer;\n }\n}\n\n/**\n * Terminal size\n */\nexport interface Size {\n cols: number;\n rows: number;\n}\n\n/**\n * Position in terminal\n */\nexport interface Position {\n x: number;\n y: number;\n}\n\n/**\n * Rectangle area\n */\nexport interface Rect {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n","import type { ReadStream, WriteStream } from 'node:tty';\nimport { Buffer, Size } from './types.js';\nimport * as readline from 'node:readline';\n\ntype ProcessStdin = ReadStream & NodeJS.ReadStream;\ntype ProcessStdout = WriteStream & NodeJS.WriteStream;\n\n/**\n * ANSI escape codes for terminal control\n */\nexport const ANSI = {\n // Screen control\n CLEAR_SCREEN: '\\x1b[2J',\n RESET_CURSOR: '\\x1b[H',\n ALTERNATE_SCREEN_ENABLE: '\\x1b[?1049h',\n ALTERNATE_SCREEN_DISABLE: '\\x1b[?1049l',\n\n // Cursor control\n HIDE_CURSOR: '\\x1b[?25l',\n SHOW_CURSOR: '\\x1b[?25h',\n MOVE_CURSOR: (x: number, y: number) => `\\x1b[${y + 1};${x + 1}H`,\n\n // Colors\n RESET_STYLE: '\\x1b[0m',\n FG_COLOR_256: (color: number) => `\\x1b[38;5;${color}m`,\n BG_COLOR_256: (color: number) => `\\x1b[48;5;${color}m`,\n FG_COLOR_RGB: (r: number, g: number, b: number) => `\\x1b[38;2;${r};${g};${b}m`,\n BG_COLOR_RGB: (r: number, g: number, b: number) => `\\x1b[48;2;${r};${g};${b}m`,\n\n // Text styles\n BOLD: '\\x1b[1m',\n DIM: '\\x1b[2m',\n ITALIC: '\\x1b[3m',\n UNDERLINE: '\\x1b[4m',\n STRIKETHROUGH: '\\x1b[9m',\n\n // Reset individual styles\n BOLD_OFF: '\\x1b[22m',\n DIM_OFF: '\\x1b[22m',\n ITALIC_OFF: '\\x1b[23m',\n UNDERLINE_OFF: '\\x1b[24m',\n STRIKETHROUGH_OFF: '\\x1b[29m',\n} as const;\n\n/**\n * Terminal interface - handles low-level terminal I/O\n */\nexport class Terminal {\n private stdin: ProcessStdin;\n private stdout: ProcessStdout;\n private _size: Size;\n private rawMode = false;\n private alternateScreen = false;\n\n constructor(stdin: ProcessStdin = process.stdin as ProcessStdin, stdout: ProcessStdout = process.stdout as ProcessStdout) {\n this.stdin = stdin;\n this.stdout = stdout;\n this._size = { cols: stdout.columns || 80, rows: stdout.rows || 24 };\n }\n\n get size(): Size {\n return this._size;\n }\n\n /**\n * Enable raw mode for character-by-character input\n */\n enableRawMode(): void {\n if (this.rawMode) return;\n this.rawMode = true;\n readline.emitKeypressEvents(this.stdin);\n (this.stdin as NodeJS.ReadStream).setRawMode(true);\n }\n\n /**\n * Disable raw mode\n */\n disableRawMode(): void {\n if (!this.rawMode) return;\n this.rawMode = false;\n (this.stdin as NodeJS.ReadStream).setRawMode(false);\n }\n\n /**\n * Enable alternate screen buffer\n */\n enableAlternateScreen(): void {\n if (this.alternateScreen) return;\n this.alternateScreen = true;\n this.stdout.write(ANSI.ALTERNATE_SCREEN_ENABLE);\n }\n\n /**\n * Disable alternate screen buffer\n */\n disableAlternateScreen(): void {\n if (!this.alternateScreen) return;\n this.alternateScreen = false;\n this.stdout.write(ANSI.ALTERNATE_SCREEN_DISABLE);\n }\n\n /**\n * Hide cursor\n */\n hideCursor(): void {\n this.stdout.write(ANSI.HIDE_CURSOR);\n }\n\n /**\n * Show cursor\n */\n showCursor(): void {\n this.stdout.write(ANSI.SHOW_CURSOR);\n }\n\n /**\n * Clear the entire screen\n */\n clear(): void {\n this.stdout.write(ANSI.CLEAR_SCREEN + ANSI.RESET_CURSOR);\n }\n\n /**\n * Write buffer to terminal\n */\n write(buffer: Buffer): void {\n let output = ANSI.RESET_STYLE;\n let lastStyle: string | null = null;\n\n for (let y = 0; y < buffer.height; y++) {\n for (let x = 0; x < buffer.width; x++) {\n const cell = buffer.getCell(x, y);\n if (!cell) continue;\n\n // Build style string\n const style = this.buildStyleString(cell);\n if (style !== lastStyle) {\n output += style;\n lastStyle = style;\n }\n\n // Add character\n output += cell.char;\n }\n // New line after each row\n output += '\\r\\n';\n }\n\n this.stdout.write(output);\n }\n\n /**\n * Build ANSI style string from cell\n */\n private buildStyleString(cell: { fg?: number; bg?: number; bold?: boolean; dim?: boolean }): string {\n let style = '';\n\n if (cell.fg !== undefined) {\n style += ANSI.FG_COLOR_256(cell.fg);\n }\n if (cell.bg !== undefined) {\n style += ANSI.BG_COLOR_256(cell.bg);\n }\n if (cell.bold) {\n style += ANSI.BOLD;\n }\n if (cell.dim) {\n style += ANSI.DIM;\n }\n\n return style;\n }\n\n /**\n * Set up SIGWINCH handler for terminal resize\n */\n onResize(callback: (size: Size) => void): () => void {\n const handler = () => {\n this._size = { cols: this.stdout.columns || 80, rows: this.stdout.rows || 24 };\n callback(this._size);\n };\n\n process.on('SIGWINCH', handler);\n\n return () => {\n process.off('SIGWINCH', handler);\n };\n }\n\n /**\n * Set up input handler\n */\n onInput(callback: (chunk: Buffer, key: readline.Key) => void): () => void {\n const handler = (chunk: Buffer, key: readline.Key) => {\n callback(chunk, key);\n };\n\n this.stdin.on('keypress', handler as any);\n\n return () => {\n this.stdin.off('keypress', handler as any);\n };\n }\n\n /**\n * Clean up terminal state\n */\n restore(): void {\n this.showCursor();\n this.disableAlternateScreen();\n this.disableRawMode();\n this.stdout.write(ANSI.RESET_STYLE);\n }\n}\n","import { Buffer, Size } 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"],"mappings":"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","names":["Buffer","Buffer","Buffer","ReactReconciler","React","import_react","React","import_react","React","import_react","React","import_react","React","import_react","React","import_react","React","import_react","import_react","readline","import_react","import_node_readline","readline","import_react","import_react","import_react","import_react","import_react"]}
package/dist/index.d.cts CHANGED
@@ -1,5 +1,5 @@
1
- import { B as Buffer, R as Renderer } from './index-DAO84gkm.cjs';
2
- export { A as ANSI, T as Terminal, u as useApp, a as useAppState, b as useFocus, c as useInput, d as useInterval, e as useKey, f as useList, g as useStdout, h as useStdoutDimensions, i as useTimeout } from './index-DAO84gkm.cjs';
1
+ import { B as Buffer, R as Renderer } from './index-B4IaUxvU.cjs';
2
+ export { A as ANSI, T as Terminal, u as useApp, a as useAppState, b as useFocus, c as useInput, d as useInterval, e as useKey, f as useList, g as useStdout, h as useStdoutDimensions, i as useTimeout } from './index-B4IaUxvU.cjs';
3
3
  import React__default, { ReactElement } from 'react';
4
4
  export { default as React } from 'react';
5
5
  import 'node:tty';
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { B as Buffer, R as Renderer } from './index-DAO84gkm.js';
2
- export { A as ANSI, T as Terminal, u as useApp, a as useAppState, b as useFocus, c as useInput, d as useInterval, e as useKey, f as useList, g as useStdout, h as useStdoutDimensions, i as useTimeout } from './index-DAO84gkm.js';
1
+ import { B as Buffer, R as Renderer } from './index-B4IaUxvU.js';
2
+ export { A as ANSI, T as Terminal, u as useApp, a as useAppState, b as useFocus, c as useInput, d as useInterval, e as useKey, f as useList, g as useStdout, h as useStdoutDimensions, i as useTimeout } from './index-B4IaUxvU.js';
3
3
  import React__default, { ReactElement } from 'react';
4
4
  export { default as React } from 'react';
5
5
  import 'node:tty';