@cli-use/tui 0.1.0 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +68 -33
- package/dist/ai-worker.cjs +65 -0
- package/dist/ai-worker.cjs.map +1 -0
- package/dist/ai-worker.d.cts +2 -0
- package/dist/ai-worker.d.ts +2 -0
- package/dist/ai-worker.js +42 -0
- package/dist/ai-worker.js.map +1 -0
- package/dist/bin/ratatui-demo +0 -0
- package/dist/cli/index.cjs +126 -36
- package/dist/cli/index.cjs.map +1 -1
- package/dist/cli/index.js +126 -36
- package/dist/cli/index.js.map +1 -1
- package/dist/hooks/index.cjs +32 -18
- package/dist/hooks/index.cjs.map +1 -1
- package/dist/hooks/index.d.cts +1 -1
- package/dist/hooks/index.d.ts +1 -1
- package/dist/hooks/index.js +26 -28
- package/dist/hooks/index.js.map +1 -1
- package/dist/{index-DAO84gkm.d.cts → index-B4IaUxvU.d.cts} +4 -3
- package/dist/{index-DAO84gkm.d.ts → index-B4IaUxvU.d.ts} +4 -3
- package/dist/index.cjs +37 -29
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +44 -42
- package/dist/index.js.map +1 -1
- package/package.json +15 -10
package/dist/hooks/index.js.map
CHANGED
|
@@ -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: (
|
|
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?:
|
|
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?:
|
|
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: (
|
|
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?:
|
|
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?:
|
|
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 {
|
|
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 {
|
|
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 = (
|
|
691
|
+
var useApp = (_options = {}) => {
|
|
688
692
|
const rendererRef = (0, import_react8.useRef)(null);
|
|
689
|
-
const [size
|
|
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.
|
|
730
|
-
|
|
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
|
|
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)(
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
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
|
-
|
|
775
|
-
|
|
776
|
-
|
|
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();
|
package/dist/index.cjs.map
CHANGED
|
@@ -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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA,gBAAAA;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACiBO,IAAMC,UAAN,MAAM,QAAO;AAAA,EAClB,YACS,OACA,QACA,QAAkB,CAAC,GAC1B;AAHO;AACA;AACA;AAGP,SAAK,QAAQ,MAAM;AAAA,MAAK,EAAE,QAAQ,OAAO;AAAA,MAAG,MAC1C,MAAM,KAAK,EAAE,QAAQ,MAAM,GAAG,OAAO,EAAE,MAAM,IAAI,EAAE;AAAA,IACrD;AAAA,EACF;AAAA,EAEA,QAAQ,GAAW,GAAW,MAAkB;AAC9C,QAAI,KAAK,KAAK,IAAI,KAAK,UAAU,KAAK,KAAK,IAAI,KAAK,OAAO;AACzD,WAAK,MAAM,CAAC,EAAE,CAAC,IAAI;AAAA,IACrB;AAAA,EACF;AAAA,EAEA,QAAQ,GAAW,GAA6B;AAC9C,QAAI,KAAK,KAAK,IAAI,KAAK,UAAU,KAAK,KAAK,IAAI,KAAK,OAAO;AACzD,aAAO,KAAK,MAAM,CAAC,EAAE,CAAC;AAAA,IACxB;AACA,WAAO;AAAA,EACT;AAAA,EAEA,QAAc;AACZ,SAAK,QAAQ,MAAM;AAAA,MAAK,EAAE,QAAQ,KAAK,OAAO;AAAA,MAAG,MAC/C,MAAM,KAAK,EAAE,QAAQ,KAAK,MAAM,GAAG,OAAO,EAAE,MAAM,IAAI,EAAE;AAAA,IAC1D;AAAA,EACF;AAAA,EAEA,OAAO,OAAe,QAAsB;AAC1C,UAAM,WAAqB,MAAM;AAAA,MAAK,EAAE,QAAQ,OAAO;AAAA,MAAG,MACxD,MAAM,KAAK,EAAE,QAAQ,MAAM,GAAG,OAAO,EAAE,MAAM,IAAI,EAAE;AAAA,IACrD;AAGA,aAAS,IAAI,GAAG,IAAI,KAAK,IAAI,KAAK,QAAQ,MAAM,GAAG,KAAK;AACtD,eAAS,IAAI,GAAG,IAAI,KAAK,IAAI,KAAK,OAAO,KAAK,GAAG,KAAK;AACpD,iBAAS,CAAC,EAAE,CAAC,IAAI,KAAK,MAAM,CAAC,EAAE,CAAC;AAAA,MAClC;AAAA,IACF;AAEA,SAAK,QAAQ;AACb,SAAK,QAAQ;AACb,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,QAAgB;AACd,UAAM,YAAY,IAAI,QAAO,KAAK,OAAO,KAAK,MAAM;AACpD,cAAU,QAAQ,KAAK,MAAM,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,UAAU,EAAE,GAAG,KAAK,EAAE,CAAC;AAC1E,WAAO;AAAA,EACT;AACF;;;ACpEA,eAA0B;AAQnB,IAAM,OAAO;AAAA;AAAA,EAElB,cAAc;AAAA,EACd,cAAc;AAAA,EACd,yBAAyB;AAAA,EACzB,0BAA0B;AAAA;AAAA,EAG1B,aAAa;AAAA,EACb,aAAa;AAAA,EACb,aAAa,CAAC,GAAW,MAAc,QAAQ,IAAI,CAAC,IAAI,IAAI,CAAC;AAAA;AAAA,EAG7D,aAAa;AAAA,EACb,cAAc,CAAC,UAAkB,aAAa,KAAK;AAAA,EACnD,cAAc,CAAC,UAAkB,aAAa,KAAK;AAAA,EACnD,cAAc,CAAC,GAAW,GAAW,MAAc,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;AAAA,EAC3E,cAAc,CAAC,GAAW,GAAW,MAAc,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;AAAA;AAAA,EAG3E,MAAM;AAAA,EACN,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,eAAe;AAAA;AAAA,EAGf,UAAU;AAAA,EACV,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,mBAAmB;AACrB;AAKO,IAAM,WAAN,MAAe;AAAA,EACZ;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV,kBAAkB;AAAA,EAE1B,YAAY,QAAsB,QAAQ,OAAuB,SAAwB,QAAQ,QAAyB;AACxH,SAAK,QAAQ;AACb,SAAK,SAAS;AACd,SAAK,QAAQ,EAAE,MAAM,OAAO,WAAW,IAAI,MAAM,OAAO,QAAQ,GAAG;AAAA,EACrE;AAAA,EAEA,IAAI,OAAa;AACf,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAsB;AACpB,QAAI,KAAK,QAAS;AAClB,SAAK,UAAU;AACf,IAAS,4BAAmB,KAAK,KAAK;AACtC,IAAC,KAAK,MAA4B,WAAW,IAAI;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAuB;AACrB,QAAI,CAAC,KAAK,QAAS;AACnB,SAAK,UAAU;AACf,IAAC,KAAK,MAA4B,WAAW,KAAK;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA,EAKA,wBAA8B;AAC5B,QAAI,KAAK,gBAAiB;AAC1B,SAAK,kBAAkB;AACvB,SAAK,OAAO,MAAM,KAAK,uBAAuB;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA,EAKA,yBAA+B;AAC7B,QAAI,CAAC,KAAK,gBAAiB;AAC3B,SAAK,kBAAkB;AACvB,SAAK,OAAO,MAAM,KAAK,wBAAwB;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA,EAKA,aAAmB;AACjB,SAAK,OAAO,MAAM,KAAK,WAAW;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKA,aAAmB;AACjB,SAAK,OAAO,MAAM,KAAK,WAAW;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKA,QAAc;AACZ,SAAK,OAAO,MAAM,KAAK,eAAe,KAAK,YAAY;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAsB;AAC1B,QAAI,SAAS,KAAK;AAClB,QAAI,YAA2B;AAE/B,aAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,eAAS,IAAI,GAAG,IAAI,OAAO,OAAO,KAAK;AACrC,cAAM,OAAO,OAAO,QAAQ,GAAG,CAAC;AAChC,YAAI,CAAC,KAAM;AAGX,cAAM,QAAQ,KAAK,iBAAiB,IAAI;AACxC,YAAI,UAAU,WAAW;AACvB,oBAAU;AACV,sBAAY;AAAA,QACd;AAGA,kBAAU,KAAK;AAAA,MACjB;AAEA,gBAAU;AAAA,IACZ;AAEA,SAAK,OAAO,MAAM,MAAM;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAiB,MAA2E;AAClG,QAAI,QAAQ;AAEZ,QAAI,KAAK,OAAO,QAAW;AACzB,eAAS,KAAK,aAAa,KAAK,EAAE;AAAA,IACpC;AACA,QAAI,KAAK,OAAO,QAAW;AACzB,eAAS,KAAK,aAAa,KAAK,EAAE;AAAA,IACpC;AACA,QAAI,KAAK,MAAM;AACb,eAAS,KAAK;AAAA,IAChB;AACA,QAAI,KAAK,KAAK;AACZ,eAAS,KAAK;AAAA,IAChB;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,UAA4C;AACnD,UAAM,UAAU,MAAM;AACpB,WAAK,QAAQ,EAAE,MAAM,KAAK,OAAO,WAAW,IAAI,MAAM,KAAK,OAAO,QAAQ,GAAG;AAC7E,eAAS,KAAK,KAAK;AAAA,IACrB;AAEA,YAAQ,GAAG,YAAY,OAAO;AAE9B,WAAO,MAAM;AACX,cAAQ,IAAI,YAAY,OAAO;AAAA,IACjC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,UAAkE;AACxE,UAAM,UAAU,CAAC,OAAe,QAAsB;AACpD,eAAS,OAAO,GAAG;AAAA,IACrB;AAEA,SAAK,MAAM,GAAG,YAAY,OAAc;AAExC,WAAO,MAAM;AACX,WAAK,MAAM,IAAI,YAAY,OAAc;AAAA,IAC3C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,UAAgB;AACd,SAAK,WAAW;AAChB,SAAK,uBAAuB;AAC5B,SAAK,eAAe;AACpB,SAAK,OAAO,MAAM,KAAK,WAAW;AAAA,EACpC;AACF;;;AC/MO,IAAM,WAAN,MAAe;AAAA,EACZ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EAElB,YAAY,WAAW,IAAI,SAAS,GAAG;AACrC,SAAK,WAAW;AAChB,SAAK,cAAc,SAAS;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,QAAc;AACZ,QAAI,KAAK,QAAS;AAClB,SAAK,UAAU;AAGf,SAAK,SAAS,cAAc;AAC5B,SAAK,SAAS,sBAAsB;AACpC,SAAK,SAAS,WAAW;AACzB,SAAK,SAAS,MAAM;AAGpB,SAAK,SAAS,IAAIC,QAAO,KAAK,YAAY,MAAM,KAAK,YAAY,IAAI;AAGrE,SAAK,SAAS,SAAS,CAAC,SAAS;AAC/B,WAAK,cAAc;AACnB,WAAK,QAAQ,OAAO,KAAK,MAAM,KAAK,IAAI;AAAA,IAC1C,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,OAAa;AACX,QAAI,CAAC,KAAK,QAAS;AACnB,SAAK,UAAU;AAEf,SAAK,SAAS,QAAQ;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKA,YAAoB;AAClB,QAAI,CAAC,KAAK,QAAQ;AAChB,YAAM,IAAI,MAAM,sBAAsB;AAAA,IACxC;AACA,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,UAAgB;AACd,QAAI,CAAC,KAAK,OAAQ;AAIlB,SAAK,SAAS,MAAM,KAAK,MAAM;AAG/B,SAAK,iBAAiB,KAAK,OAAO,MAAM;AAGxC,SAAK,OAAO,MAAM;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAKA,UAAgB;AACd,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,cAAwB;AACtB,WAAO,KAAK;AAAA,EACd;AACF;;;AC3FA,8BAA4B;;;AC2CrB,IAAM,aAAa;AAAA,EACxB,qBAAqB;AAAA,EACrB,kBAAkB;AAAA,EAClB,eAAe,MAAW,OAAY;AACpC,WAAO;AAAA,MACL;AAAA,MACA,OAAO,EAAE,GAAG,MAAM;AAAA,MAClB,UAAU,CAAC;AAAA,MACX,QAAQ;AAAA,MACR,MAAM,EAAE,MAAM,OAAO,EAAE,GAAG,MAAM,GAAG,UAAU,CAAC,EAAE;AAAA,IAClD;AAAA,EACF;AAAA,EACA,mBAAmB,gBAAqB,OAAY;AAClD,mBAAe,SAAS,KAAK,KAAK;AAClC,UAAM,SAAS;AAAA,EACjB;AAAA,EACA,0BAA0B;AACxB,WAAO;AAAA,EACT;AAAA,EACA,gBAAgB;AACd,WAAO,CAAC;AAAA,EACV;AAAA,EACA,qBAAqB,MAAW;AAC9B,WAAO,SAAS;AAAA,EAClB;AAAA,EACA,mBAAmB,MAAW;AAC5B,WAAO;AAAA,MACL,MAAM;AAAA,MACN,OAAO,EAAE,UAAU,KAAK;AAAA,MACxB,UAAU,CAAC;AAAA,MACX,QAAQ;AAAA,MACR,MAAM,EAAE,MAAM,QAAQ,OAAO,EAAE,UAAU,KAAK,GAAG,UAAU,CAAC,EAAE;AAAA,IAChE;AAAA,EACF;AAAA,EACA,uBAAuB,WAAgB,OAAY;AACjD,cAAU,OAAO;AACjB,UAAM,SAAS;AAAA,EACjB;AAAA,EACA,YAAY,gBAAqB,OAAY;AAC3C,mBAAe,SAAS,KAAK,KAAK;AAClC,UAAM,SAAS;AAAA,EACjB;AAAA,EACA,YAAY,gBAAqB,OAAY;AAC3C,UAAM,QAAQ,eAAe,SAAS,QAAQ,KAAK;AACnD,QAAI,UAAU,IAAI;AAChB,qBAAe,SAAS,OAAO,OAAO,CAAC;AACvC,YAAM,SAAS;AAAA,IACjB;AAAA,EACF;AAAA,EACA,yBAAyB,YAAiB,OAAY;AACpD,UAAM,SAAS;AAAA,EACjB;AAAA,EACA,aAAa,gBAAqB,OAAY,aAAkB;AAC9D,UAAM,QAAQ,eAAe,SAAS,QAAQ,WAAW;AACzD,QAAI,UAAU,IAAI;AAChB,qBAAe,SAAS,OAAO,OAAO,GAAG,KAAK;AAAA,IAChD,OAAO;AACL,qBAAe,SAAS,KAAK,KAAK;AAAA,IACpC;AACA,UAAM,SAAS;AAAA,EACjB;AAAA,EACA,0BAA0B;AAAA,EAAC;AAAA,EAC3B,aAAa,UAAe,gBAAqB,OAAY,WAAgB,UAAe;AAC1F,aAAS,QAAQ,EAAE,GAAG,SAAS;AAC/B,aAAS,KAAK,QAAQ,EAAE,GAAG,SAAS;AAAA,EACtC;AAAA,EACA,iBAAiB,cAAmB,UAAe,SAAc;AAC/D,iBAAa,MAAM,WAAW;AAC9B,iBAAa,KAAK,MAAM,WAAW;AAAA,EACrC;AAAA,EACA,iBAAiB,UAAe;AAC9B,QAAI,SAAS,SAAS,QAAQ;AAC5B,eAAS,MAAM,WAAW;AAC1B,eAAS,KAAK,MAAM,WAAW;AAAA,IACjC;AAAA,EACF;AAAA,EACA,kBAAkB,UAAe;AAC/B,WAAO;AAAA,EACT;AAAA,EACA,mBAAmB,eAAoB;AACrC,WAAO;AAAA,EACT;AAAA,EACA,oBAAoB,mBAAwB;AAC1C,WAAO;AAAA,EACT;AAAA,EACA,mBAAmB;AACjB,WAAO;AAAA,EACT;AAAA,EACA,iBAAiB,WAAgB;AAC/B,QAAI,UAAU,MAAM;AAClB,qBAAe,UAAU,MAAM,UAAU,MAAM;AAAA,IACjD;AAAA,EACF;AAAA,EACA,+BAA+B;AAC7B,WAAO;AAAA,EACT;AAAA,EACA,iBAAiB;AAAA,EACjB,eAAe;AAAA,EACf,WAAW;AAAA,EACX,0BAA0B;AACxB,WAAO;AAAA,EACT;AAAA,EACA,oBAAoB,MAAW;AAC7B,WAAO;AAAA,EACT;AAAA,EACA,2BAA2B;AAAA,EAAC;AAAA,EAC5B,0BAA0B;AAAA,EAAC;AAAA,EAC3B,qBAAqB;AAAA,EAAC;AAAA,EACtB,qBAAqB;AAAA,EAAC;AAAA,EACtB,uBAAuB;AACrB,WAAO;AAAA,EACT;AAAA,EACA,wBAAwB;AAAA,EAAC;AAAA,EACzB,mBAAmB;AAAA,EACnB,mBAAmB;AACrB;AAEA,SAAS,eAAe,UAAe,QAAgB,IAAI,GAAG,IAAI,GAAS;AACzE,MAAI,CAAC,SAAU;AACf,QAAM,EAAE,MAAM,OAAO,SAAS,IAAI;AAClC,QAAM,WAAW,MAAM,KAAK;AAC5B,QAAM,WAAW,MAAM,KAAK;AAE5B,MAAI,SAAS,UAAU,OAAO,MAAM,aAAa,UAAU;AACzD,UAAM,OAAO,OAAO,MAAM,YAAY,EAAE;AACxC,UAAM,QAAQ,MAAM,SAAS,CAAC;AAC9B,aAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,YAAM,OAAO,KAAK,CAAC;AACnB,UAAI,SAAS,KAAM;AACnB,aAAO,QAAQ,WAAW,GAAG,UAAU,EAAE,MAAM,GAAG,MAAM,CAAC;AAAA,IAC3D;AAAA,EACF;AAEA,MAAI,MAAM,QAAQ,QAAQ,GAAG;AAC3B,eAAW,SAAS,UAAU;AAC5B,qBAAe,OAAO,QAAQ,UAAU,QAAQ;AAAA,IAClD;AAAA,EACF,WAAW,UAAU;AACnB,mBAAe,UAAU,QAAQ,UAAU,QAAQ;AAAA,EACrD;AACF;;;AD7KO,IAAM,mBAAmB,UAAM,wBAAAC,SAAgB,UAAU;AAKzD,IAAM,aAAa,CAAC,aAAqC;AAC9D,QAAM,SAAS,SAAS,UAAU;AAElC,SAAO;AAAA,IACL;AAAA,IACA,MAAM;AAAA,IACN,WAAW,CAAC;AAAA,EACd;AACF;AAKO,IAAM,SAAS,CAAC,SAAuB,WAAyB,aAAuB;AAC5F,QAAM,aAAa,iBAAiB;AAEpC,aAAW,gBAAgB,SAAS,WAAW,MAAM,MAAM;AAEzD,aAAS,QAAQ;AAAA,EACnB,CAAC;AACH;;;AEnCA,mBAAkB;AA0BX,IAAM,MAA0B,CAAC;AAAA,EACtC;AAAA,EACA;AAAA,EACA,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ;AAAA,EACA;AAAA,EACA,SAAS;AAAA,EACT,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,UAAU;AACZ,MAAM;AACJ,QAAM,QAAkB;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,SAAO,aAAAC,QAAM,cAAc,OAAO,OAAO,QAAQ;AACnD;AAEA,IAAI,cAAc;;;ACxDlB,IAAAC,gBAAkB;AAmBX,IAAM,OAA4B,CAAC,EAAE,UAAU,OAAO,IAAI,GAAG,IAAI,EAAE,MAAM;AAC9E,QAAM,QAAmB;AAAA,IACvB,UAAU,OAAO,QAAQ;AAAA,IACzB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,SAAO,cAAAC,QAAM,cAAc,QAAQ,KAAK;AAC1C;AAEA,KAAK,cAAc;;;AC9BnB,IAAAC,gBAAkB;AAYX,IAAM,OAA4B,CAAC,EAAE,UAAU,GAAG,SAAS,MAAM;AACtE,QAAM,QAA8B;AAAA,IAClC,GAAG;AAAA,IACH;AAAA,EACF;AAEA,SAAO,cAAAC,QAAM,cAAc,QAAQ,KAAK;AAC1C;AAEA,KAAK,cAAc;;;ACrBnB,IAAAC,gBAAkB;AAsBX,IAAM,OAA4B,CAAC;AAAA,EACxC;AAAA,EACA,UAAU;AAAA,EACV;AAAA,EACA,MAAM;AAAA,EACN;AAAA,EACA,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ;AAAA,EACA;AACF,MAAM;AACJ,QAAM,QAAmB;AAAA,IACvB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,SAAO,cAAAC,QAAM,cAAc,QAAQ,OAAO,QAAQ;AACpD;AAEA,KAAK,cAAc;;;AChDnB,IAAAC,gBAAkB;AAoBX,IAAM,SAAgC,CAAC;AAAA,EAC5C;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV;AAAA,EACA,IAAI;AAAA,EACJ,IAAI;AACN,MAAM;AAEJ,QAAM,cAAc,UAChB;AAAA,IACE,GAAG;AAAA,IACH,IAAI,OAAO,aAAa,OAAO,MAAM;AAAA,IACrC,IAAI,OAAO,aAAa,OAAO,MAAM;AAAA,EACvC,IACA;AAEJ,QAAM,QAAqB;AAAA,IACzB,UAAU,KAAK,QAAQ;AAAA,IACvB;AAAA,IACA;AAAA,IACA,OAAO;AAAA,IACP;AAAA,IACA;AAAA,EACF;AAEA,SAAO,cAAAC,QAAM,cAAc,UAAU,KAAK;AAC5C;AAEA,OAAO,cAAc;;;ACjDrB,IAAAC,gBAAkB;AAuBX,IAAM,QAA8B,CAAC;AAAA,EAC1C;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd,UAAU;AAAA,EACV,OAAO;AAAA,EACP;AAAA,EACA,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,QAAQ;AAAA,EACR;AACF,MAAM;AACJ,QAAM,eAAe,OAAO,IAAI,OAAO,MAAM,MAAM,IAAI;AACvD,QAAM,cACJ,MAAM,SAAS,IAAI,eAAe,UAAU,cAAc;AAE5D,QAAM,QAAoB;AAAA,IACxB,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO,UACH,QACA;AAAA,MACE,GAAG;AAAA,MACH,IAAI,OAAO,iBAAiB;AAAA,IAC9B;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,SAAO,cAAAC,QAAM,cAAc,SAAS,KAAK;AAC3C;AAEA,MAAM,cAAc;;;AC5DpB,IAAAC,gBAAkB;AAoBX,IAAM,WAAoC,CAAC;AAAA,EAChD;AAAA,EACA,MAAM;AAAA,EACN;AAAA,EACA,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,QAAQ;AAAA,EACR;AACF,MAAM;AACJ,QAAM,QAAuB;AAAA,IAC3B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,SAAO,cAAAC,QAAM,cAAc,YAAY,KAAK;AAC9C;AAEA,SAAS,cAAc;;;ACzCvB,IAAAC,gBAA4C;AAWrC,IAAM,SAAS,CAAC,WAAuB,CAAC,MAAM;AACnD,QAAM,kBAAc,sBAAwB,IAAI;AAChD,QAAM,CAAC,IAAI,QAAI,wBAAS,EAAE,MAAM,IAAI,MAAM,GAAG,CAAC;AAC9C,QAAM,CAAC,SAAS,UAAU,QAAI,wBAAS,KAAK;AAE5C,+BAAU,MAAM;AAiBd,UAAM,gBAAgB,MAAM;AAAA,IAE5B;AAEA,eAAW,IAAI;AAEf,WAAO,MAAM;AACX,iBAAW,KAAK;AAChB,oBAAc;AAAA,IAEhB;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,OAAO,MAAM;AACjB,QAAI,YAAY,SAAS;AAEvB,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAEA,SAAO;AAAA,IACL,UAAU,YAAY;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AC5DA,IAAAC,gBAAgE;AAChE,2BAAqB;AAwBd,IAAM,WAAW,CAAC,UAAyB,OAAuB,CAAC,MAAM;AAC9E,+BAAU,MAAM;AACd,UAAM,UAAU,CAAC,OAAe,QAAqB;AACnD,UAAI,CAAC,IAAK;AAEV,eAAS;AAAA,QACP,KAAK,IAAI,QAAQ;AAAA,QACjB,MAAM,IAAI,QAAQ;AAAA,QAClB,MAAM,IAAI,QAAQ;AAAA,QAClB,MAAM,IAAI,QAAQ;AAAA,QAClB,OAAO,IAAI,SAAS;AAAA,QACpB,UAAU,IAAI,YAAY;AAAA,MAC5B,CAAC;AAAA,IACH;AAEA,QAAI,QAAQ,MAAM,OAAO;AACvB,cAAQ,MAAM,WAAW,IAAI;AAAA,IAC/B;AACA,yBAAAC,QAAS,mBAAmB,QAAQ,KAAK;AAEzC,YAAQ,MAAM,GAAG,YAAY,OAAO;AAEpC,WAAO,MAAM;AACX,cAAQ,MAAM,IAAI,YAAY,OAAO;AAAA,IACvC;AAAA,EACF,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC;AACxB;AAKO,IAAM,SAAS,CACpB,SACA,UACA,OAAuB,CAAC,MACrB;AACH,QAAM,gBAAgB,MAAM,QAAQ,OAAO,IAAI,QAAQ,KAAK,GAAG,IAAI;AACnE,QAAM,WAAO,uBAAQ,MAAO,MAAM,QAAQ,OAAO,IAAI,UAAU,CAAC,OAAO,GAAI,CAAC,aAAa,CAAC;AAE1F;AAAA,QACE;AAAA,MACE,CAAC,EAAE,KAAK,MAAM,KAAK,MAAM;AAEvB,YAAI,QAAQ,KAAM;AAElB,YAAI,KAAK,SAAS,GAAG,GAAG;AACtB,mBAAS;AAAA,QACX;AAAA,MACF;AAAA,MACA,CAAC,UAAU,IAAI;AAAA,IACjB;AAAA,IACA;AAAA,EACF;AACF;;;AC9EA,IAAAC,iBAAiD;AACjD,IAAAC,wBAAqB;AASd,IAAM,WAAW,CAAC,eAAe,GAAG,cAAsB;AAC/D,QAAM,CAAC,cAAc,eAAe,QAAI,yBAAS,YAAY;AAE7D,QAAM,gBAAY,4BAAY,MAAM;AAClC,oBAAgB,CAAC,aAAa,UAAU,KAAK,SAAS;AAAA,EACxD,GAAG,CAAC,SAAS,CAAC;AAEd,QAAM,oBAAgB,4BAAY,MAAM;AACtC,oBAAgB,CAAC,aAAa,UAAU,IAAI,aAAa,SAAS;AAAA,EACpE,GAAG,CAAC,SAAS,CAAC;AAEd,QAAM,eAAW;AAAA,IACf,CAAC,UAAkB;AACjB,UAAI,SAAS,KAAK,QAAQ,WAAW;AACnC,wBAAgB,KAAK;AAAA,MACvB;AAAA,IACF;AAAA,IACA,CAAC,SAAS;AAAA,EACZ;AAEA,QAAM,gBAAY,4BAAY,CAAC,UAAkB,UAAU,cAAc,CAAC,YAAY,CAAC;AAGvF,gCAAU,MAAM;AACd,0BAAAC,QAAS,mBAAmB,QAAQ,KAAK;AACzC,QAAI,QAAQ,MAAM,OAAO;AACvB,cAAQ,MAAM,WAAW,IAAI;AAAA,IAC/B;AAEA,UAAM,iBAAiB,CAAC,QAAgB,QAAuB;AAC7D,UAAI,IAAI,SAAS,SAAS,IAAI,SAAS,SAAS;AAC9C,kBAAU;AAAA,MACZ,WAAW,IAAI,SAAS,QAAQ;AAC9B,sBAAc;AAAA,MAChB;AAAA,IACF;AAEA,YAAQ,MAAM,GAAG,YAAY,cAAc;AAE3C,WAAO,MAAM;AACX,cAAQ,MAAM,IAAI,YAAY,cAAc;AAAA,IAC9C;AAAA,EACF,GAAG,CAAC,WAAW,aAAa,CAAC;AAE7B,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AC7DA,IAAAC,iBAAiD;AAK1C,IAAM,sBAAsB,MAAM;AACvC,QAAM,CAAC,YAAY,aAAa,QAAI,yBAAS,OAAO;AAAA,IAClD,SAAS,QAAQ,OAAO,WAAW;AAAA,IACnC,MAAM,QAAQ,OAAO,QAAQ;AAAA,EAC/B,EAAE;AAEF,gCAAU,MAAM;AACd,UAAM,eAAe,MAAM;AACzB,oBAAc;AAAA,QACZ,SAAS,QAAQ,OAAO,WAAW;AAAA,QACnC,MAAM,QAAQ,OAAO,QAAQ;AAAA,MAC/B,CAAC;AAAA,IACH;AAEA,YAAQ,OAAO,GAAG,UAAU,YAAY;AAExC,WAAO,MAAM;AACX,cAAQ,OAAO,IAAI,UAAU,YAAY;AAAA,IAC3C;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,SAAO;AACT;AAKO,IAAM,YAAY,MAAM;AAC7B,QAAM,YAAQ,4BAAY,CAAC,SAAiB;AAC1C,YAAQ,OAAO,MAAM,IAAI;AAAA,EAC3B,GAAG,CAAC,CAAC;AAEL,SAAO,EAAE,MAAM;AACjB;;;ACtCA,IAAAC,iBAAkC;AAK3B,IAAM,cAAc,CAAC,UAAsB,UAAyB;AACzE,QAAM,oBAAgB,uBAAO,QAAQ;AAGrC,gCAAU,MAAM;AACd,kBAAc,UAAU;AAAA,EAC1B,GAAG,CAAC,QAAQ,CAAC;AAGb,gCAAU,MAAM;AACd,QAAI,UAAU,KAAM;AAEpB,UAAM,OAAO,MAAM,cAAc,QAAQ;AAEzC,UAAM,KAAK,YAAY,MAAM,KAAK;AAElC,WAAO,MAAM,cAAc,EAAE;AAAA,EAC/B,GAAG,CAAC,KAAK,CAAC;AACZ;AAKO,IAAM,aAAa,CAAC,UAAsB,UAAyB;AACxE,QAAM,oBAAgB,uBAAO,QAAQ;AAErC,gCAAU,MAAM;AACd,kBAAc,UAAU;AAAA,EAC1B,GAAG,CAAC,QAAQ,CAAC;AAEb,gCAAU,MAAM;AACd,QAAI,UAAU,KAAM;AAEpB,UAAM,OAAO,MAAM,cAAc,QAAQ;AAEzC,UAAM,KAAK,WAAW,MAAM,KAAK;AAEjC,WAAO,MAAM,aAAa,EAAE;AAAA,EAC9B,GAAG,CAAC,KAAK,CAAC;AACZ;;;AC5CA,IAAAC,iBAAsC;AAO/B,IAAM,cAAc,CAAC,eAAyB,WAAW;AAC9D,QAAM,CAAC,OAAO,QAAQ,QAAI,yBAAmB,YAAY;AACzD,QAAM,CAAC,OAAO,QAAQ,QAAI,yBAAuB,IAAI;AAErD,QAAM,iBAAa,4BAAY,MAAM;AACnC,aAAS,SAAS;AAClB,aAAS,IAAI;AAAA,EACf,GAAG,CAAC,CAAC;AAEL,QAAM,iBAAa,4BAAY,MAAM;AACnC,aAAS,SAAS;AAClB,aAAS,IAAI;AAAA,EACf,GAAG,CAAC,CAAC;AAEL,QAAM,oBAAgB,4BAAY,CAAC,QAAe;AAChD,aAAS,OAAO;AAChB,aAAS,GAAG;AAAA,EACd,GAAG,CAAC,CAAC;AAEL,QAAM,cAAU,4BAAY,MAAM;AAChC,aAAS,MAAM;AACf,aAAS,IAAI;AAAA,EACf,GAAG,CAAC,CAAC;AAEL,QAAM,YAAY,UAAU;AAC5B,QAAM,YAAY,UAAU;AAC5B,QAAM,UAAU,UAAU;AAC1B,QAAM,SAAS,UAAU;AAEzB,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,UAAU;AAAA,IACV;AAAA,EACF;AACF;;;AChDA,IAAAC,iBAAsC;AAW/B,IAAM,UAAU,CAAI;AAAA,EACzB,eAAe,CAAC;AAAA,EAChB,eAAe;AAAA,EACf,OAAO;AACT,IAAoB,CAAC,MAAM;AACzB,QAAM,CAAC,OAAO,QAAQ,QAAI,yBAAc,YAAY;AACpD,QAAM,CAAC,OAAO,QAAQ,QAAI,yBAAS,YAAY;AAE/C,QAAM,WAAO,4BAAY,MAAM;AAC7B,aAAS,CAAC,YAAY;AACpB,UAAI,MAAM,WAAW,EAAG,QAAO;AAE/B,YAAM,YAAY,UAAU;AAE5B,UAAI,aAAa,MAAM,QAAQ;AAC7B,eAAO,OAAO,IAAI,MAAM,SAAS;AAAA,MACnC;AAEA,aAAO;AAAA,IACT,CAAC;AAAA,EACH,GAAG,CAAC,MAAM,QAAQ,IAAI,CAAC;AAEvB,QAAM,eAAW,4BAAY,MAAM;AACjC,aAAS,CAAC,YAAY;AACpB,UAAI,MAAM,WAAW,EAAG,QAAO;AAE/B,YAAM,YAAY,UAAU;AAE5B,UAAI,YAAY,GAAG;AACjB,eAAO,OAAO,MAAM,SAAS,IAAI;AAAA,MACnC;AAEA,aAAO;AAAA,IACT,CAAC;AAAA,EACH,GAAG,CAAC,MAAM,QAAQ,IAAI,CAAC;AAEvB,QAAM,aAAS,4BAAY,CAAC,SAAY;AACtC,UAAM,WAAW,MAAM,QAAQ,IAAI;AACnC,QAAI,aAAa,IAAI;AACnB,eAAS,QAAQ;AAAA,IACnB;AAAA,EACF,GAAG,CAAC,KAAK,CAAC;AAEV,QAAM,gBAAgB;AACtB,QAAM,eAAe,MAAM,KAAK,KAAK;AAErC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AnB5DA,IAAAC,iBAAiC;","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-
|
|
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-
|
|
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-
|
|
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-
|
|
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';
|