{"id":47745580,"url":"https://github.com/oneeyed1366/wolf-tui","last_synced_at":"2026-05-22T21:01:14.069Z","repository":{"id":341000215,"uuid":"1166396299","full_name":"OneEyed1366/wolf-tui","owner":"OneEyed1366","description":"Framework-agnostic Terminal UI library — React, Vue, Angular, SolidJS, Svelte. JSX/template syntax, Flexbox/Grid layouts (Taffy), CSS-like styling.","archived":false,"fork":false,"pushed_at":"2026-04-14T13:27:00.000Z","size":3065,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-04-14T13:27:43.888Z","etag":null,"topics":["angular","cli","css","flexbox","jsx","nodejs","react","solidjs","svelte","terminal","terminal-ui","tui","tui-framework","typescript","vue"],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/OneEyed1366.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"license","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-02-25T07:14:53.000Z","updated_at":"2026-04-14T13:27:06.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/OneEyed1366/wolf-tui","commit_stats":null,"previous_names":["oneeyed1366/wolfi-tui"],"tags_count":74,"template":false,"template_full_name":null,"purl":"pkg:github/OneEyed1366/wolf-tui","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/OneEyed1366%2Fwolf-tui","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/OneEyed1366%2Fwolf-tui/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/OneEyed1366%2Fwolf-tui/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/OneEyed1366%2Fwolf-tui/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/OneEyed1366","download_url":"https://codeload.github.com/OneEyed1366/wolf-tui/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/OneEyed1366%2Fwolf-tui/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31803790,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-14T11:13:53.975Z","status":"ssl_error","status_checked_at":"2026-04-14T11:13:53.299Z","response_time":153,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["angular","cli","css","flexbox","jsx","nodejs","react","solidjs","svelte","terminal","terminal-ui","tui","tui-framework","typescript","vue"],"created_at":"2026-04-03T00:54:07.308Z","updated_at":"2026-05-22T21:01:14.063Z","avatar_url":"https://github.com/OneEyed1366.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# wolf-tui\n\n### Write CLI apps with your web framework — React, Vue, Angular, Solid, or Svelte\n\n[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT)\n[![Node.js](https://img.shields.io/badge/Node.js-%3E%3D20-green)](https://nodejs.org/)\n\n[Quick Start](#quick-start) · [Packages](#packages) · [Components](#components) · [Styling](#styling) · [Testing](#testing) · [Architecture](#architecture) · [Development](#development)\n\n---\n\n\u003e [!IMPORTANT]\n\u003e **What this installs:**\n\u003e\n\u003e - Native `.node` bindings for the [Taffy](https://github.com/DioxusLabs/taffy) layout engine (Rust → Node via napi-rs, not WASM)\n\u003e - Prebuilt for Linux (x64/arm64), macOS (Intel/Apple Silicon), Windows\n\u003e - No network calls, no telemetry, no files written outside your project\n\u003e\n\u003e **Uninstall:** `npm remove @wolf-tui/react @wolf-tui/plugin` (substitute your adapter)\n\n## The Problem\n\nBuilding terminal UIs means choosing between raw ANSI escape codes or framework-specific tools locked to one ecosystem. If you know React, you can use [Ink](https://github.com/vadimdemedes/ink) — but there's nothing for Vue, Angular, Solid, or Svelte. And Ink's layout engine (Yoga) only supports Flexbox.\n\nwolf-tui started as a fork of Ink, then expanded: five framework adapters sharing one layout engine ([Taffy](https://github.com/DioxusLabs/taffy) — Flexbox + CSS Grid), one component library, and one styling pipeline (Tailwind, SCSS, CSS Modules). Write a component once, render it in any adapter.\n\n---\n\n## Quick Start\n\n### Scaffold a new project\n\n```bash\nnpm create wolf-tui\n```\n\nThe CLI walks you through framework, bundler, and styling choices — generates a ready-to-run project. See [create-wolf-tui](packages/create-wolf-tui/README.md) for flags and options.\n\n### Add to an existing project\n\nPick your framework:\n\n### React\n\n```bash\nnpm install @wolf-tui/react \u0026\u0026 npm install -D @wolf-tui/plugin\n```\n\n```tsx\nimport { render, Box, Text } from '@wolf-tui/react'\n\nfunction App() {\n\treturn (\n\t\t\u003cBox style={{ flexDirection: 'column', padding: 1 }}\u003e\n\t\t\t\u003cText style={{ color: 'green' }}\u003eHello from wolf-tui!\u003c/Text\u003e\n\t\t\u003c/Box\u003e\n\t)\n}\n\nrender(\u003cApp /\u003e)\n```\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eVue\u003c/b\u003e\u003c/summary\u003e\n\n```bash\nnpm install @wolf-tui/vue \u0026\u0026 npm install -D @wolf-tui/plugin\n```\n\n```vue\n\u003cscript setup\u003e\nimport { Box, Text } from '@wolf-tui/vue'\n\u003c/script\u003e\n\n\u003ctemplate\u003e\n\t\u003cBox :style=\"{ flexDirection: 'column', padding: 1 }\"\u003e\n\t\t\u003cText :style=\"{ color: 'green' }\"\u003eHello from wolf-tui!\u003c/Text\u003e\n\t\u003c/Box\u003e\n\u003c/template\u003e\n```\n\n```ts\nimport { render } from '@wolf-tui/vue'\nimport App from './App.vue'\n\nrender(App)\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eAngular\u003c/b\u003e\u003c/summary\u003e\n\n```bash\nnpm install @wolf-tui/angular \u0026\u0026 npm install -D @wolf-tui/plugin\n```\n\n```typescript\nimport { Component } from '@angular/core'\nimport { BoxComponent, TextComponent } from '@wolf-tui/angular'\n\n@Component({\n\tstandalone: true,\n\timports: [BoxComponent, TextComponent],\n\ttemplate: `\n\t\t\u003cw-box [style]=\"{ flexDirection: 'column', padding: 1 }\"\u003e\n\t\t\t\u003cw-text [style]=\"{ color: 'green' }\"\u003eHello from wolf-tui!\u003c/w-text\u003e\n\t\t\u003c/w-box\u003e\n\t`,\n})\nexport class AppComponent {}\n```\n\n```ts\nimport { renderWolfie } from '@wolf-tui/angular'\nimport { AppComponent } from './app.component'\n\nrenderWolfie(AppComponent)\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eSolidJS\u003c/b\u003e\u003c/summary\u003e\n\n```bash\nnpm install @wolf-tui/solid \u0026\u0026 npm install -D @wolf-tui/plugin\n```\n\n```tsx\nimport { render, Box, Text } from '@wolf-tui/solid'\n\nfunction App() {\n\treturn (\n\t\t\u003cBox style={{ flexDirection: 'column' }}\u003e\n\t\t\t\u003cText style={{ color: 'green' }}\u003eHello from wolf-tui!\u003c/Text\u003e\n\t\t\u003c/Box\u003e\n\t)\n}\n\nrender(App, { stdout: process.stdout, stdin: process.stdin })\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eSvelte\u003c/b\u003e\u003c/summary\u003e\n\n```bash\nnpm install @wolf-tui/svelte \u0026\u0026 npm install -D @wolf-tui/plugin\n```\n\n```svelte\n\u003c!-- App.svelte --\u003e\n\u003cscript\u003e\nimport { Box, Text } from '@wolf-tui/svelte'\n\u003c/script\u003e\n\n\u003cBox style={{ flexDirection: 'column', padding: 1 }}\u003e\n\t\u003cText style={{ color: 'green', fontWeight: 'bold' }}\u003eHello from wolf-tui!\u003c/Text\u003e\n\u003c/Box\u003e\n```\n\n```ts\nimport { render } from '@wolf-tui/svelte'\nimport App from './App.svelte'\n\nrender(App)\n```\n\nSvelte requires `--conditions=browser` at runtime and a build step. See the [Svelte adapter README](packages/svelte/README.md) for full setup.\n\n\u003c/details\u003e\n\nEach adapter has a detailed README with full API docs, Vite/esbuild/webpack configuration, and component reference.\n\n---\n\n## Packages\n\n| Package                                                             | Description                                | Docs                                           |\n| ------------------------------------------------------------------- | ------------------------------------------ | ---------------------------------------------- |\n| [create-wolf-tui](packages/create-wolf-tui/README.md)               | Project scaffolding CLI                    | [README](packages/create-wolf-tui/README.md)   |\n| [@wolf-tui/core](internal/core/README.md)                           | Layout engine, DOM, renderer               | Core                                           |\n| [@wolf-tui/react](packages/react/README.md)                         | React 19+ adapter                          | [README](packages/react/README.md)             |\n| [@wolf-tui/vue](packages/vue/README.md)                             | Vue 3.5+ adapter                           | [README](packages/vue/README.md)               |\n| [@wolf-tui/angular](packages/angular/README.md)                     | Angular 17+ adapter                        | [README](packages/angular/README.md)           |\n| [@wolf-tui/solid](packages/solid/README.md)                         | SolidJS 1.9+ adapter                       | [README](packages/solid/README.md)             |\n| [@wolf-tui/svelte](packages/svelte/README.md)                       | Svelte 5+ adapter                          | [README](packages/svelte/README.md)            |\n| [@wolf-tui/testing-library](packages/testing-library/README.md)     | Framework-agnostic headless testing utils  | [README](packages/testing-library/README.md)   |\n| [@wolf-tui/plugin](packages/plugin/README.md)                       | Build plugin (Vite/esbuild/webpack/Rollup) | [README](packages/plugin/README.md)            |\n| [@wolf-tui/typescript-plugin](packages/typescript-plugin/README.md) | TypeScript plugin for CSS module types     | [README](packages/typescript-plugin/README.md) |\n| [@wolf-tui/css-parser](internal/css-parser/README.md)               | CSS/SCSS/LESS/Stylus parser                | Internal                                       |\n\n---\n\n## Components\n\nAll adapters share the same component set — same visual output across all 5 frameworks via the shared WNode render architecture.\n\n| Category    | Components                                                                                                                                           |\n| ----------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- |\n| **Layout**  | `Box`, `Text`, `Newline`, `Spacer`, `Static`, `Transform`, `ScrollView`, `Table`                                                                     |\n| **Display** | `Alert`, `Badge`, `Spinner`, `ProgressBar`, `StatusMessage`, `ErrorOverview`, `Gradient`, `BigText`, `Timer`, `TreeView`, `JsonViewer`, `FilePicker` |\n| **Input**   | `TextInput`, `PasswordInput`, `EmailInput`, `ConfirmInput`, `Select`, `MultiSelect`, `Combobox`                                                      |\n| **Lists**   | `OrderedList`, `UnorderedList`                                                                                                                       |\n\nPlus composables/hooks: `useInput`, `useFocus`, `useFocusManager`, stream access, screen reader detection.\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eComponent reference\u003c/b\u003e — Description + Key features\u003c/summary\u003e\n\nAdapted (where applicable) from the [ink-\\* community ecosystem](https://github.com/vadimdemedes/ink/pull/922) (Gradient from [ink-gradient](https://github.com/sindresorhus/ink-gradient), BigText from [ink-big-text](https://github.com/sindresorhus/ink-big-text)). Available in all 5 adapters with identical APIs.\n\n**Layout**\n\n| Component    | Description                                 | Key features                                               |\n| ------------ | ------------------------------------------- | ---------------------------------------------------------- |\n| `Box`        | Flexbox/Grid layout container               | All CSS-like flex props, `style` object, `className`       |\n| `Text`       | Styled inline text                          | Color, bold/italic/underline, wrap modes                   |\n| `Newline`    | Empty lines                                 | `count` prop                                               |\n| `Spacer`     | Fills remaining flex space                  | Pushes siblings apart in flex containers                   |\n| `Static`     | Renders items once, skips re-renders        | Append-only logs, scroll-back history                      |\n| `Transform`  | Transforms rendered text of children        | `transform: (line, idx) =\u003e string`                         |\n| `ScrollView` | Fixed-height viewport with clipped overflow | Built-in arrow / PageUp / PageDown / Home / End navigation |\n| `Table`      | Box-drawing table for tabular data          | `ink-table` parity, themable borders/cells, column subset  |\n\n**Display**\n\n| Component       | Description                            | Key features                                                   |\n| --------------- | -------------------------------------- | -------------------------------------------------------------- |\n| `Alert`         | Boxed alert message                    | `variant`: `success` / `error` / `warning` / `info` + title    |\n| `Badge`         | Inline coloured label                  | `color` prop                                                   |\n| `Spinner`       | Animated loading spinner               | 80+ `type`s (dots, line, arc, …), optional `label`             |\n| `ProgressBar`   | Horizontal progress bar                | `value` 0–100, custom characters, themable colors              |\n| `StatusMessage` | One-line status with icon              | `variant`: `success` / `error` / `warning` / `info`            |\n| `ErrorOverview` | Formatted error display                | Pretty stack trace, source frame highlight                     |\n| `Gradient`      | Coloured text gradient                 | 13 presets or custom hex stops, per-character interpolation    |\n| `BigText`       | ASCII-art figlet-style banner          | `cfonts` engine, multiple fonts, gradients, alignment          |\n| `Timer`         | Count-up, countdown, or stopwatch      | Lap recording, configurable format, drift-resistant            |\n| `TreeView`      | Hierarchical tree with expand/collapse | Single/multi-select, async lazy loading, virtual scroll        |\n| `JsonViewer`    | Interactive JSON tree viewer           | 16 value types, syntax colouring, circular-reference detection |\n| `FilePicker`    | Filesystem browser with filter mode    | Multi-select, symlinks, directory navigation                   |\n\n**Input**\n\n| Component       | Description                         | Key features                                            |\n| --------------- | ----------------------------------- | ------------------------------------------------------- |\n| `TextInput`     | Single-line text field              | `onChange` / `onSubmit`, placeholder, mask, suggestions |\n| `PasswordInput` | Masked text input                   | Configurable mask character                             |\n| `EmailInput`    | Email field with domain suggestions | Auto-completes top-100 email domains                    |\n| `ConfirmInput`  | Yes / No prompt                     | y / n keys, customizable defaults                       |\n| `Select`        | Single-selection picker             | Keyboard nav, themed indicator, `options` array         |\n| `MultiSelect`   | Multi-selection picker              | Toggle with space, submit with enter                    |\n| `Combobox`      | Fuzzy-search autocomplete dropdown  | Two-pass fzf-style matching, cursor nav, autofill       |\n\n**Lists**\n\n| Component       | Description   | Key features                 |\n| --------------- | ------------- | ---------------------------- |\n| `OrderedList`   | Numbered list | `OrderedListItem` children   |\n| `UnorderedList` | Bulleted list | `UnorderedListItem` children |\n\n```tsx\n// React example\nimport { Timer, JsonViewer, FilePicker, Table, Gradient, BigText } from '@wolf-tui/react'\n\n// Timer with countdown\n\u003cTimer variant=\"countdown\" durationMs={60000} format=\"human\" /\u003e\n\n// Interactive JSON viewer\n\u003cJsonViewer data={{ users: [{ name: 'Alice' }] }} defaultExpandDepth={2} /\u003e\n\n// File picker with multi-select\n\u003cFilePicker initialPath=\".\" multiSelect onSelect={(paths) =\u003e console.log(paths)} /\u003e\n\n// Table with box-drawing borders\n\u003cTable data={[{ id: 1, name: 'Alice' }, { id: 2, name: 'Bob' }]} /\u003e\n\n// Gradient text — by preset name, or custom stops\n\u003cGradient name=\"rainbow\"\u003ewolf-tui in color\u003c/Gradient\u003e\n\u003cGradient colors={['#ff3366', '#ffd700']}\u003eHand-picked stops\u003c/Gradient\u003e\n\n// BigText figlet-style banner\n\u003cBigText text=\"WOLF\" font=\"block\" gradient=\"rainbow\" /\u003e\n```\n\n\u003c/details\u003e\n\nSee individual adapter READMEs for API details and prop reference.\n\n---\n\n## Styling\n\n```tsx\n// Inline styles\n\u003cBox style={{ flexDirection: 'column', padding: 1, gap: 1 }}\u003e\n\t\u003cText style={{ color: 'green', fontWeight: 'bold' }}\u003eStyled text\u003c/Text\u003e\n\u003c/Box\u003e\n\n// Tailwind CSS (v3.4 / v4.1)\n\u003cBox className=\"flex-col p-4 gap-2\"\u003e\n\t\u003cText className=\"text-green-500 font-bold\"\u003eStyled with Tailwind\u003c/Text\u003e\n\u003c/Box\u003e\n```\n\n| Method           | Setup                             |\n| ---------------- | --------------------------------- |\n| Inline styles    | Works out of the box              |\n| Tailwind CSS     | PostCSS + `@wolf-tui/plugin`      |\n| CSS Modules      | `*.module.css` imports            |\n| SCSS/LESS/Stylus | Preprocessor + `@wolf-tui/plugin` |\n\nAll CSS approaches resolve to terminal styles at build time — no runtime CSS engine.\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eUnits and colors\u003c/b\u003e\u003c/summary\u003e\n\n**Relative units:**\n\n| Unit        | Terminal conversion                     |\n| ----------- | --------------------------------------- |\n| `px`        | value / 4 cells                         |\n| `rem`       | value × 4 cells (1rem = 16px = 4 cells) |\n| `%`         | Dynamic (parent-based)                  |\n| `vw` / `vh` | Terminal columns / rows                 |\n| `ch`        | 1 cell per ch                           |\n\n**Color support:**\n\n- 140+ named CSS colors mapped to ANSI\n- Hex: `#fff`, `#ffffff`\n- RGB/RGBA: `rgb(255 0 0)`, `rgba(255, 0, 0, 0.5)`\n- OKLCH, HSL, LAB, LCH via colorjs.io\n- Tailwind arbitrary values: `text-[cyan]`, `bg-[#ff0]`\n\n\u003c/details\u003e\n\n---\n\n## Testing\n\nEvery adapter ships a `/testing` subpath that swaps the real terminal for virtual streams, so components can be exercised headlessly under Vitest, Jest, or Node's test runner. The same API works across all five frameworks — pick your adapter's import and the rest is identical.\n\n```tsx\nimport { afterEach, test, expect } from 'vitest'\nimport {\n\trender,\n\tcleanup,\n\tKEYS,\n\tdelay,\n\tstripAnsi,\n} from '@wolf-tui/react/testing'\nimport { App } from './App'\n\nafterEach(cleanup)\n\ntest('navigates the menu', async () =\u003e {\n\tconst { stdin, lastFrame } = render(\u003cApp /\u003e, { columns: 80, rows: 24 })\n\n\tawait stdin.write(KEYS.DOWN)\n\tawait stdin.write(KEYS.ENTER)\n\tawait delay(100)\n\n\texpect(stripAnsi(lastFrame() ?? '')).toContain('Selection: Option B')\n})\n```\n\nScaffold a project with `npm create wolf-tui -- --test` to get Vitest, `@wolf-tui/testing-library`, and a pre-wired `test/setup.ts` out of the box. See [@wolf-tui/testing-library](packages/testing-library/README.md) for the full API.\n\n---\n\n## Architecture\n\n```\n┌──────────────────┐\n│  @wolf-tui/core    │  Taffy layout, virtual DOM, ANSI renderer\n│  (napi-rs)       │  native .node bindings\n└────────┬─────────┘\n         │\n┌────────┴─────────┐\n│  @wolf-tui/shared  │  render scheduler, shared render functions,\n│                  │  input parsing, theme system\n└────────┬─────────┘\n         │\n   ┌─────┼─────┬─────────┬──────────┐\n   │     │     │         │          │\n React  Vue  Angular  SolidJS   Svelte\n```\n\nEach adapter maps its framework's component model to the shared virtual DOM. Taffy computes layout, the core renderer produces ANSI output. A visual bug either affects all adapters (render function issue) or one adapter (integration issue) — two-step debug path.\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eLayout engine: Taffy\u003c/b\u003e\u003c/summary\u003e\n\nwolf-tui uses [Taffy](https://github.com/DioxusLabs/taffy) for layout computation. Taffy supports both Flexbox and CSS Grid — Yoga (used by Ink and React Native) only supports Flexbox.\n\nIntegration details:\n\n- Native Node.js bindings via napi-rs (not WASM — no startup penalty)\n- Supports `calc()` values\n- Prebuilt for Linux (x64/arm64), macOS (Intel/Apple Silicon), Windows\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003ePerformance\u003c/b\u003e\u003c/summary\u003e\n\n**Incremental rendering:** All adapters render only changed terminal lines per frame, not the full screen. Disable for headless testing:\n\n```ts\nrender(\u003cApp /\u003e, { incrementalRendering: false })\n```\n\n**React Compiler:** `@wolf-tui/react` ships pre-compiled with the [React Compiler](https://react.dev/learn/react-compiler) — all library components skip re-renders when props haven't changed. To apply to your own components:\n\n```bash\nnpm install -D babel-plugin-react-compiler\n```\n\n```ts\n// vite.config.ts\nimport { defineConfig } from 'vite'\nimport react from '@vitejs/plugin-react'\nimport { wolfie } from '@wolf-tui/plugin/vite'\n\nexport default defineConfig({\n\tplugins: [\n\t\treact({\n\t\t\tbabel: {\n\t\t\t\tplugins: [['babel-plugin-react-compiler', {}]],\n\t\t\t},\n\t\t}),\n\t\twolfie('react'),\n\t],\n})\n```\n\nRequires React 19+.\n\n\u003c/details\u003e\n\n---\n\n## Development\n\n```bash\ngit clone \u003crepo-url\u003e\ncd wolf-tui\npnpm install\npnpm dev\n```\n\n| Command          | Description                           |\n| ---------------- | ------------------------------------- |\n| `pnpm dev`       | Watch mode for all packages           |\n| `pnpm build`     | Build all packages                    |\n| `pnpm test`      | Run all unit tests                    |\n| `pnpm test:e2e`  | E2E screenshot tests (20 tests, ~38s) |\n| `pnpm lint`      | ESLint check                          |\n| `pnpm typecheck` | TypeScript type checking              |\n\nSee [CONTRIBUTING.md](CONTRIBUTING.md) for development guidelines.\n\n---\n\n## Acknowledgments\n\nThis project started as a fork of [Ink](https://github.com/vadimdemedes/ink) by Vadim Demedes. The React package (`@wolf-tui/react`) builds upon Ink's foundation and includes components from the ink-\\* ecosystem.\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foneeyed1366%2Fwolf-tui","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Foneeyed1366%2Fwolf-tui","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foneeyed1366%2Fwolf-tui/lists"}