Skip to content

Add cursor shape control to useCursor hook - #961

Open
ganassini wants to merge 5 commits into
vadimdemedes:masterfrom
ganassini:feat/cursor-shape
Open

Add cursor shape control to useCursor hook#961
ganassini wants to merge 5 commits into
vadimdemedes:masterfrom
ganassini:feat/cursor-shape

Conversation

@ganassini

@ganassini ganassini commented May 27, 2026

Copy link
Copy Markdown

Summary

Adds cursor shape control to the useCursor() hook (via a new shape option), exposing DECSCUSR (CSI Ps SP q) control. Supported shapes: block, bar, underline, plus blinking- variants, and default to actively restore the terminal's user-configured shape.

The shape is restored to the terminal default (CSI 0 SP q) on done(), SIGINT, and unhandled React tree throws, so apps never leak a custom cursor shape back to the parent shell.

Why

Cursor-shape control is the standard way TUI libraries and editors signal mode changes — ratatui exposes it via Frame::set_cursor_position + cursor style, and neovim (and vim itself) toggles between block/bar/underline on mode switches via DECSCUSR. Ink had no equivalent, so consumers building modal interfaces had to write the escape sequences manually and remember to clean up on exit.

Motivation

Programs built on Ink that implement modal input — Claude Code's input area, anything with a vim mode, REPLs distinguishing normal/insert states — benefit from a first-class API. Doing this in userland is doable but fragile: the restore-on-exit path requires hooking into Ink's signal/throw handling, which isn't part of the public surface.

Test plan

  • npm test passes
  • New log-update tests cover shape emission, idempotence, done() restore, sync() fullscreen path
  • New useCursor tests cover React-level idempotence, non-interactive suppression, unmount/remount
  • New PTY-based exit tests verify restore on SIGINT and on unhandled throw

@sindresorhus

Copy link
Copy Markdown
Collaborator

I think the feature makes sense, but I’d strongly prefer not adding setCursorShape() as a second independent imperative setter.

The more React shaped API would be one declarative cursor intent:

useCursor({
	position: {x, y},
	shape: 'bar',
});

That maps much better to React’s lifecycle. When the component renders, it declares the cursor state for that frame. When it updates, the cursor state updates. When it unmounts, that intent disappears and Ink can cleanly hide or reset it. With a separate setCursorShape() API, shape and position become two loosely coupled pieces of global terminal state, which creates awkward semantics like undefined meaning “leave the previous terminal shape as is”. That is surprising in React, where absence of a rendered owner usually means cleanup.

It also keeps the public model smaller. Cursor position, visibility, shape, blink, and maybe color are all attributes of the same terminal cursor. Treating them as one cursor object avoids duplicated dirty state and lifecycle handling in log-update, and matches what higher level TUI APIs tend to do.

tl;dr expose it as declarative cursor state rather than adding setCursorShape(). That gives us clearer unmount behavior, a smaller API surface, and room to add future cursor attributes without adding more independent setters.

prisis added a commit to visulima/visulima that referenced this pull request May 27, 2026
Declarative cursor shape on `<Cursor shape={…}>` — block, bar,
underline plus blinking variants. Emits CSI Ps SP q only when the
shape changes and restores the user default on unmount/SIGINT so the
parent shell never inherits a leaked shape. Mirrors vadimdemedes/ink#961
while keeping the API component-only (no hook surface), aligning with
Sindre's preference for declarative cursor control.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
prisis pushed a commit to visulima/visulima that referenced this pull request May 27, 2026
…a/tui [1.0.0-alpha.20](https://github.com/visulima/visulima/compare/@visulima/tui@1.0.0-alpha.19...@visulima/tui@1.0.0-alpha.20) (2026-05-27)

### Features

* **tui:** add shape prop to <Cursor> via DECSCUSR ([303934f](303934f)), closes [vadimdemedes/ink#961](vadimdemedes/ink#961)

### Bug Fixes

* **storage-client:** percent-encode user fields in defaultFingerprint ([7c78a0f](7c78a0f))
* **tui:** use index keys in ErrorOverview stack + excerpt lists ([86cfdc2](86cfdc2))

### Documentation

* prettier-format agent instructions ([71b6414](71b6414))

### Miscellaneous Chores

* sorted package.json ([b47c545](b47c545))

### Dependencies

* **@visulima/ansi:** upgraded to 4.0.0-alpha.15
* **@visulima/boxen:** upgraded to 3.0.0-alpha.11
* **@visulima/colorize:** upgraded to 2.0.0-alpha.12
* **@visulima/error:** upgraded to 6.0.0-alpha.30
* **@visulima/spinner:** upgraded to 1.0.0-alpha.2
* **@visulima/string:** upgraded to 3.0.0-alpha.14
* **@visulima/tabular:** upgraded to 4.0.0-alpha.12
@ganassini ganassini changed the title Add setCursorShape to useCursor hook Add cursor shape control to useCursor hook May 27, 2026
@sindresorhus

Copy link
Copy Markdown
Collaborator

This currently removes the published return value from useCursor(). In v7.0.4, useCursor() returns {setCursorPosition}, and the README documents that pattern. With this change, existing code like const {setCursorPosition} = useCursor(); will throw at runtime. I think the declarative options API should be additive. The new API is better, but we don't want to break backwards compatibility.

Second, the unmount cleanup does not actually restore the cursor shape while the Ink app keeps running. The cleanup stores undefined, but undefined intentionally emits no DECSCUSR bytes, so a child that set shape: 'underline' can unmount and leave the terminal cursor underline until the whole app exits. This also conflicts with the new docs saying the cursor state is released when the component unmounts. I manually checked the bytes after unmounting a shape-owning child, and there was no CSI 0 SP q reset written, just the redraw/sync bytes. Might be worth adding a test for that exact case, becuase the current remount test only proves the next mount re-emits the shape.

@ganassini

Copy link
Copy Markdown
Author

Will look into that.

prisis pushed a commit to visulima/visulima that referenced this pull request Jul 3, 2026
….0 (2026-07-03)

### ⚠ BREAKING CHANGES

* **tui:** Components and hooks are no longer re-exported from the
bare `@visulima/tui` entry. Import each from its dedicated subpath:

  - import { Box } from "@visulima/tui/components/box";
  - import { useInput } from "@visulima/tui/hooks/use-input";

The bare entry now exposes only `render`, `renderToString`, and
lower-level primitives (mouse, layout, OSC52, terminal palette).
Heavy peer dependencies (cfonts, shiki, marked, diff, @visulima/tabular)
are loaded only when their component subpath is imported, keeping the
import graph small and making peer requirements explicit per component.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

### Features

* Add comprehensive Ink UI component library with 40+ components ([#614](https://github.com/visulima/visulima/issues/614)) ([24b00a8](https://github.com/visulima/visulima/commit/24b00a8855b1ddb509b85c4a3e0f9f3d76323f76))
* Add screen, keys, and waitFor helpers to TUI testing API ([#604](https://github.com/visulima/visulima/issues/604)) ([a98c6a1](https://github.com/visulima/visulima/commit/a98c6a18421ee4a1f23f57bbe3eb39b5ba6c6788))
* **string): native indent implementation; refactor(tui:** replace indent-string and is-fullwidth-code-point ([1368488](https://github.com/visulima/visulima/commit/136848850242ddeae91320dd21d6fdeb0760768c))
* **tui:** add @visulima/tui package with native Rust diff engine ([85fa477](https://github.com/visulima/visulima/commit/85fa477cf7060dcec51e252afee17e655fa53ace))
* **tui:** add Badge, StatusMessage, Alert, UnorderedList, and OrderedList components ([142fbae](https://github.com/visulima/visulima/commit/142fbae1700088f2bb676b594607afcc04157174))
* **tui:** add BigText component ported from ink-big-text ([6af0bf3](https://github.com/visulima/visulima/commit/6af0bf38d334734b0e2d4a45d1ce8c1e25cfeb45))
* **tui:** add border title support to Box component ([e9f35dc](https://github.com/visulima/visulima/commit/e9f35dc37c9ebb624ca370b54504695103fd8cbb))
* **tui:** add Code, Markdown, and DiffView components with syntax highlighting ([7bd6b51](https://github.com/visulima/visulima/commit/7bd6b517f490a31f052cc513e045cbf8b6bf2f6d))
* **tui:** add controlled value prop to Tabs component ([df1158d](https://github.com/visulima/visulima/commit/df1158dc036f7159ef909f497453e2e5dd1058df))
* **tui:** add Cursor component with inline mode and fix incremental rendering ([9899187](https://github.com/visulima/visulima/commit/98991878cf3222e86e853dbb173b92f1902aa622))
* **tui:** add cursor-input example entry point ([5f4342c](https://github.com/visulima/visulima/commit/5f4342c18412006efc81165b74ebb2172b98cdb2))
* **tui:** add getBackgroundColorEscape helper and background cache test ([889e314](https://github.com/visulima/visulima/commit/889e3148c7f827302ee77f8f2bbb0e270be1d6c1))
* **tui:** add Gradient component ported from ink-gradient ([92e0113](https://github.com/visulima/visulima/commit/92e0113f67fe14e3a44929ffe5269ab5b091c3ff))
* **tui:** add Link component ported from ink-link, fix screen reader docs ([86f3f40](https://github.com/visulima/visulima/commit/86f3f400820b0996dca4c46fbb557688bc962fa7))
* **tui:** add mouse support for ink layer, ported from @zenobius/ink-mouse ([a25352d](https://github.com/visulima/visulima/commit/a25352d569afa181002ff5ee98dbdac03a9b5cec))
* **tui:** add native Rust renderer bridge, audit fixes, and selection pipeline ([afc8743](https://github.com/visulima/visulima/commit/afc8743cc5561d4948abaa02610f10557c327ab6))
* **tui:** add ProgressBar component ported from ink-progress-bar ([4c7a648](https://github.com/visulima/visulima/commit/4c7a6489c40f4901536782a1a6ad0d3cfb810b69))
* **tui:** add scroll acceleration, color blindness, terminal palette, and console overlay ([27d478d](https://github.com/visulima/visulima/commit/27d478dd8655d8943b03101aebf59a847dadd176))
* **tui:** add scrollbar prop to ScrollView and document scroll approaches ([eb78557](https://github.com/visulima/visulima/commit/eb785578ad4f1e7bb1648872e5f3ec1254219113))
* **tui:** add SelectInput component ported from ink-select-input ([0d2a7fc](https://github.com/visulima/visulima/commit/0d2a7fc06126a899884a556e1cd42693264fd3f4)), closes [#13](https://github.com/visulima/visulima/issues/13) [#13](https://github.com/visulima/visulima/issues/13) [#38](https://github.com/visulima/visulima/issues/38) [#39](https://github.com/visulima/visulima/issues/39) [#22](https://github.com/visulima/visulima/issues/22) [#22](https://github.com/visulima/visulima/issues/22) [#3](https://github.com/visulima/visulima/issues/3) [#4](https://github.com/visulima/visulima/issues/4)
* **tui:** add shape prop to <Cursor> via DECSCUSR ([303934f](https://github.com/visulima/visulima/commit/303934fa36d78cd30fd74d50026472be9ea20fe4)), closes [vadimdemedes/ink#961](https://github.com/vadimdemedes/ink/issues/961)
* **tui:** add Slider, Textarea, clipboard, and text selection primitives ([eb0edfb](https://github.com/visulima/visulima/commit/eb0edfbe72d0f6b6bfc5b80104b6124d2688f9da))
* **tui:** add Spinner component, IME tests, and migrate deps to pnpm catalogs ([e117ba6](https://github.com/visulima/visulima/commit/e117ba6c93881d2bd1fb395d2c7405c09b90bcff))
* **tui:** add StyledChar text pipeline, Selection API, and examples ([b7d6fa8](https://github.com/visulima/visulima/commit/b7d6fa8e38a57648f3c57169c1286a9e8c9f341d))
* **tui:** add StyledLine columnar data structure and migrate Output grid ([b497554](https://github.com/visulima/visulima/commit/b49755438290600f3b483e10dfcff2ad991b849f))
* **tui:** add StyledLine.writeFrom() bulk write method ([8accc25](https://github.com/visulima/visulima/commit/8accc25505c82322aa0d31580048a38e4a4b9849))
* **tui:** add Tab and Tabs components ported from ink-tab ([5d4c439](https://github.com/visulima/visulima/commit/5d4c439dc26fabf8a68cc99d3ae795e035fdc37f))
* **tui:** add Table component ported from ink-table ([f1bb95c](https://github.com/visulima/visulima/commit/f1bb95c2dc5599f9f22eb585573aac52423fb50f))
* **tui:** add TextInput, ConfirmInput, and MultiSelect components ([00fa435](https://github.com/visulima/visulima/commit/00fa4356a9309e49ba752a9bdfb244241b16eecb))
* **tui:** add Timer, Stopwatch, Help, Paginator, FilePicker components and consolidate exports ([4b2a98f](https://github.com/visulima/visulima/commit/4b2a98f8b6a882763cae4980db402438785cd455))
* **tui:** add TreeView component with keyboard navigation and selection ([f3421e3](https://github.com/visulima/visulima/commit/f3421e36540f8c7a229e0176c683cb94c0d46e0f))
* **tui:** add useAnimation hook with shared-timer architecture ([129c036](https://github.com/visulima/visulima/commit/129c036cf1debc76650d97ad5da00ee5a03d5fc1))
* **tui:** add wrap-anywhere, wrap-preserve-words, and wrap-strict text wrap modes ([e850c12](https://github.com/visulima/visulima/commit/e850c12e866d11ab1a20ec39f7e0c2f624c87d41))
* **tui:** apply StaticRender render-function pattern from jacob314/ink[#99](https://github.com/visulima/visulima/issues/99) ([d8f03ce](https://github.com/visulima/visulima/commit/d8f03ce3f4b5be784b5993bd28458cd24a8e6830))
* **tui:** flush scrolled-off lines to terminal scrollback ([7856378](https://github.com/visulima/visulima/commit/78563780b60d506651013dee372bbad4a183bcb0))
* **tui:** native StyledLine word-wrapping in text-wrap.ts ([187daf5](https://github.com/visulima/visulima/commit/187daf51a5d9ae0441968712661aaffe46cc4936))
* **tui:** Phase 6 — addRegionTree() and cachedRender activation ([6eedf67](https://github.com/visulima/visulima/commit/6eedf6798ce6b30c8766a6b545fe210933969961))
* **tui:** Phase 6 complete — Region-based Output with startChildRegion/endChildRegion ([f7d5e3c](https://github.com/visulima/visulima/commit/f7d5e3c59f029dd58cabee901c23b61c84721bbd))
* **tui:** Phase 6 scaffolding — Region type, setCachedRender, render-cached ([417ede8](https://github.com/visulima/visulima/commit/417ede80e707a925e34b6ff2c0830a6999d7d49e))
* **tui:** Phase 7 complete — Render caching with StaticRender component ([64cb21f](https://github.com/visulima/visulima/commit/64cb21fbae6f27ed5f4d1df1535ffdd3ee9bae65))
* **tui:** port ink upstream PR 115/119/123/125 ([2232485](https://github.com/visulima/visulima/commit/22324855fbcca38bc263d46194ccf30522ecc599))
* **tui:** port scroll, sticky headers, and ResizeObserver from jacob314/ink ([7676c7c](https://github.com/visulima/visulima/commit/7676c7c2d446f3d288e8ab6515059fbd0e2b82e2))
* **tui:** re-export AppProps/StdinProps/StdoutProps/StderrProps from hook subpaths ([bc8306c](https://github.com/visulima/visulima/commit/bc8306cb1ed52dccd6316009ca1e3c2f497fac35))
* **tui:** re-export ink-scroll-view, ink-scroll-bar, and ink-scroll-list ([67e6cae](https://github.com/visulima/visulima/commit/67e6caef326ae0f7b9d540ab0b976ad3fa750545))
* **tui:** split components and hooks into per-symbol subpaths ([8a04b3c](https://github.com/visulima/visulima/commit/8a04b3c17ed3cbe54894b5f117db29e34ee7b144))
* **tui:** support nested StaticRender and cache trimmed length ([05ec31c](https://github.com/visulima/visulima/commit/05ec31c5b9b02e9cb5e658b0ec077a7c1feec66f))
* **vis:** add interactive progress bar and replace CI detection with is-in-ci ([255a1b1](https://github.com/visulima/visulima/commit/255a1b100d0dd4bc614094f292b61fc88bc4ad62))
* **vis:** expand devcontainer command with templates, validation, and config properties ([807e730](https://github.com/visulima/visulima/commit/807e730a43f0ea644d016b4f5506706972d2ff41))
* **vis:** replace inline TUI with full-screen Nx-style interactive task runner ([1409aad](https://github.com/visulima/visulima/commit/1409aad879c713051bba12298a3feb1d5ba852f2))
* **vis:** set terminal title to project name on startup ([204622a](https://github.com/visulima/visulima/commit/204622acd943ccad738b33f5e945190e38f5839f))

### Bug Fixes

* **bench:** import deep-clone fixture + tui modules via public paths ([362417e](https://github.com/visulima/visulima/commit/362417e58ee07b8efa8fa1057572ea729a035058))
* **ci:** always run native build job so artifacts are available ([51f3428](https://github.com/visulima/visulima/commit/51f34285bc04a0f6347609db240814862646c1cc))
* **ci:** make native-binding tests work with and without compiled binary ([9a40fb4](https://github.com/visulima/visulima/commit/9a40fb40d5cba9fcd2e0176eea8b7bf8d9792c7d))
* **ci:** publish native addons via local semantic-release plugin ([974beb2](https://github.com/visulima/visulima/commit/974beb2d021e7b2afc86b958bd2137be88d2f464))
* declare libc on linux binding subpackages ([078b31f](https://github.com/visulima/visulima/commit/078b31f1a9029487c86651e75ecdad70f02b37e8)), closes [npm/cli#4828](https://github.com/npm/cli/issues/4828)
* **release:** patch NAPI version-check string and ship fresh loader on release ([0676e33](https://github.com/visulima/visulima/commit/0676e336f453c9ae38c9f3a5fbbb675f9bff7ea0))
* remove deprecated baseUrl and downlevelIteration from tsconfigs ([a708366](https://github.com/visulima/visulima/commit/a708366b5c3bc73cfde480a712ed397bd921fb93))
* Remove JSR configuration generation script and generated jsr.json files ([#616](https://github.com/visulima/visulima/issues/616)) ([533744b](https://github.com/visulima/visulima/commit/533744b103b74896941db5b727173e617a27a63b))
* Replace resetTerminal with clearScreenAndHomeCursor to preserve scrollback ([#605](https://github.com/visulima/visulima/issues/605)) ([6a79e4d](https://github.com/visulima/visulima/commit/6a79e4d8350b90ec553ad5fbcf825d9ac30ece66))
* **storage-client:** percent-encode user fields in defaultFingerprint ([7c78a0f](https://github.com/visulima/visulima/commit/7c78a0f9512e2a673b941d80839e9f1e86b7b5d0))
* **task-runner,tui:** guard null native events and increase CI test timeout ([e76a791](https://github.com/visulima/visulima/commit/e76a791d90043537e08be0545f706e35acaa555d))
* **task-runner:** use JS fallback for onEvent streaming, fix StaticRender ref ([1a7165c](https://github.com/visulima/visulima/commit/1a7165cd9eb71472895cd08682983fa25703dc93))
* **terminal:** resolve eslint and formatting issues ([8f30389](https://github.com/visulima/visulima/commit/8f30389deb9ff81e7afce0aa064ef11fcb179f23))
* **tsconfig:** add node types and fix implicit any parameter ([1744d82](https://github.com/visulima/visulima/commit/1744d82a07fca03f2e6ff660b918e9b2623acf69))
* **tui:** 2 bug fixes + 2 perf ([53eb884](https://github.com/visulima/visulima/commit/53eb884de4609e6fb2c0ed8af7773673c0b83b2f))
* **tui:** add explicit return type to useStateRef for isolatedDeclarations ([cf17127](https://github.com/visulima/visulima/commit/cf1712704faea841b8503b02420bad42519badde))
* **tui:** add missing arrow in bench file arrow functions ([a1b524f](https://github.com/visulima/visulima/commit/a1b524ff44db381d573c3967d5b2e2674ae72564))
* **tui:** address code review findings ([d4e02c3](https://github.com/visulima/visulima/commit/d4e02c373736b77779021a394c41c573291c2abd))
* **tui:** address review findings across ported components ([cb727de](https://github.com/visulima/visulima/commit/cb727dec62ad67a16b279bdee96b6e8d48f11b62))
* **tui:** address SelectInput code review findings ([5a7cf1c](https://github.com/visulima/visulima/commit/5a7cf1ceb4080701d3576aa7b13060b176b380ee))
* **tui:** annotate Array.from element type in histogram ([8f94a52](https://github.com/visulima/visulima/commit/8f94a52e775430c1336a3b24e9d7a30b59afb3f9))
* **tui:** apply upstream ResizeObserver NaN guard and measurement extraction ([bcd4fd1](https://github.com/visulima/visulima/commit/bcd4fd16e7e0fda7d3de09657dfe76ce46fa370a))
* **tui:** backport ink v7.0.1-7.0.3 upstream fixes ([aa981c3](https://github.com/visulima/visulima/commit/aa981c3fc26646baffc4af423bf7e2978598873f))
* **tui:** benchmarks now use production dist/ build, not tsx source ([b84eb43](https://github.com/visulima/visulima/commit/b84eb436793a0e0e89d406215ef28a20885eb754))
* **tui:** calculate scroll state in renderToString and add Box scroll tests ([888f8e1](https://github.com/visulima/visulima/commit/888f8e10044073c3558bf4b947f341515c66fba2))
* **tui:** clear eslint errors in components ([#685](https://github.com/visulima/visulima/issues/685)) ([ebdb47f](https://github.com/visulima/visulima/commit/ebdb47fb22c8584b5908b89b7fbbfa3fb499786b))
* **tui:** clear terminal on windows fullscreen redraws ([879e83e](https://github.com/visulima/visulima/commit/879e83e45a4b195b3956cfa37f13a8914be3c527))
* **tui:** correct peer deps and runtime type-fest ([ececda1](https://github.com/visulima/visulima/commit/ececda1cf823ff39e0a1a0e4f1d64015088c42ff))
* **tui:** declare MIT license on native crate ([9d4ee53](https://github.com/visulima/visulima/commit/9d4ee53ea71c926ec07ce58083de1333ba888aeb))
* **tui:** declare static props on Form/Transition for isolatedDeclarations ([c30b9f1](https://github.com/visulima/visulima/commit/c30b9f148cf4ea75e54a9e358fea085a34f680e8))
* **tui:** filter ctrl/meta chord characters in TextInput insertion ([3531b35](https://github.com/visulima/visulima/commit/3531b35dcc79e7a1954136b37f0a6220c8856eee))
* **tui:** fix alternate-screen tests in CI and increase retry count ([1330266](https://github.com/visulima/visulima/commit/13302665d2c0f1c7ade0f7c73d52db8ca206f384))
* **tui:** fix beforeExit handler and output clipping for wide content ([1752ed3](https://github.com/visulima/visulima/commit/1752ed3088af025d0a271a97ce1180882f8abd93))
* **tui:** fix cursor suspense test failing in CI ([14372c7](https://github.com/visulima/visulima/commit/14372c7b0a102eb20c8da4870b3c0bc899e2c08c))
* **tui:** fix flaky useInput discrete-priority test race condition ([4221e96](https://github.com/visulima/visulima/commit/4221e96dd33fe5a4e0c00939ed1a83853be499ec))
* **tui:** fix remaining test lint issues ([74c5ec0](https://github.com/visulima/visulima/commit/74c5ec0afb6a108c86fcb22b21bf4d3f8143cd90))
* **tui:** fix rendering bugs, add edge-case tests and layout snapshots ([ecaff75](https://github.com/visulima/visulima/commit/ecaff75ea6c7d2c41c8c84eeaa1870d1d6cf83d7)), closes [#RGB](https://github.com/visulima/visulima/issues/RGB)
* **tui:** fix Select All keybinding, scroll double-emit, and type safety issues ([234a164](https://github.com/visulima/visulima/commit/234a1641956693870de4d8e116bd3ed535fd59f4))
* **tui:** fix StaticRender isolatedDeclarations error ([5a156d1](https://github.com/visulima/visulima/commit/5a156d18e662e9a7123b27fb40f0847e67af91c0))
* **tui:** fix StyledLine serializer escape code ordering and dim/bold interaction ([434bb42](https://github.com/visulima/visulima/commit/434bb428f6cafa6cb6bf2781c255fd4f4c5c3a25))
* **tui:** fix test failures and add missing ime-utils module ([6d20130](https://github.com/visulima/visulima/commit/6d201304274c48380895706abfc2cef2e350dbdf))
* **tui:** fix test mock stdin setup and incorrect assertions ([4f6d877](https://github.com/visulima/visulima/commit/4f6d8774e37e3fc276f1163e00d464908115e9b3))
* **tui:** fixed types ([abe7106](https://github.com/visulima/visulima/commit/abe7106aa1f55340d1b218f4b338709a0317c671))
* **tui:** floor text node width when calling wrapOrTruncateStyledChars ([1d06086](https://github.com/visulima/visulima/commit/1d06086404c54b46baec8f688fc1e39228a0ab75))
* **tui:** guard Spinner against unknown spinner name ([94ea8fd](https://github.com/visulima/visulima/commit/94ea8fd639a6ae66799f42996f731720aa363c31))
* **tui:** harden persistent-state and fix export/sideeffects drift ([40a0dbe](https://github.com/visulima/visulima/commit/40a0dbedc317af0e02d2e87314295c66c276991f))
* **tui:** improve test reliability for PTY and timing-sensitive tests ([d66d68e](https://github.com/visulima/visulima/commit/d66d68eb48ecb93adb8c00b1e9247c2a474d3d76))
* **tui:** inline component and hook barrel exports in ink entry ([1cf8dd2](https://github.com/visulima/visulima/commit/1cf8dd25c91a2001268fb9d964d95df649bf7832))
* **tui:** make interactive tests CI-safe by setting interactive: true ([477b003](https://github.com/visulima/visulima/commit/477b00334e6722e1f2de1bf8149d7000a0be93c3))
* **tui:** map 0x7F to backspace instead of delete in key parser ([bd111a5](https://github.com/visulima/visulima/commit/bd111a5884758317b4bd6ca6a7b87e2b182f2590)), closes [ink-rs/ink#634](https://github.com/ink-rs/ink/issues/634)
* **tui:** narrow ANSI_CODES type and cast yoga Node remove call ([87b2c67](https://github.com/visulima/visulima/commit/87b2c6787d44ae630a0eece56b3b2df395a7c63b))
* **tui:** prevent interactive apps from exiting on beforeExit ([449e84c](https://github.com/visulima/visulima/commit/449e84ca739d9dd48728f40ad9514359306f9527))
* **tui:** properly fix eslint errors in code ([6fc67aa](https://github.com/visulima/visulima/commit/6fc67aa9d6381e7d8763e0dab8acec272f16f763))
* **tui:** remove 16-bit offset limit from StyledLine and guard negative border sizes ([526bd35](https://github.com/visulima/visulima/commit/526bd357b4ec2512271612bdcc0e24d5da9ebc7c))
* **tui:** rename components to kebab-case, fix broken test assertions, protect fixtures from auto-format ([caa2e86](https://github.com/visulima/visulima/commit/caa2e86f7500467e56c89b3671d0e33b6b5d0173))
* **tui:** resolve all StyledLine serializer edge cases ([445d798](https://github.com/visulima/visulima/commit/445d7983f791593507c70a70314a3ea658cb780e))
* **tui:** resolve all TypeScript and ESLint errors ([c623c2a](https://github.com/visulima/visulima/commit/c623c2a17842a7bea29c1cac4daa770cda87dc4a))
* **tui:** resolve isolatedDeclarations build errors and runtime bugs ([2c0f2bb](https://github.com/visulima/visulima/commit/2c0f2bba384e50ddca975ea5df83149585fbd016))
* **tui:** resolve remaining ESLint errors across all source files ([4f996cb](https://github.com/visulima/visulima/commit/4f996cb546f81d2925a71b5c04d0f85dbc5d3a9c))
* **tui:** restrict OSC passthrough to OSC 8 hyperlinks ([355f91a](https://github.com/visulima/visulima/commit/355f91aefae0a8e623a6c434b91dddb8d5e3f8d8)), closes [ink#957](https://github.com/visulima/ink/issues/957)
* **tui:** revert write-path slice+combine optimization ([56a2e63](https://github.com/visulima/visulima/commit/56a2e63bce941d70823a105bbd7e30411d89461f))
* **tui:** share useBoxMetrics resize listener via emitLayoutListeners ([2a17d4f](https://github.com/visulima/visulima/commit/2a17d4f947f33a29830b230a895ff4553710d0b0))
* **tui:** skip flaky IME flush test on Linux PTY ([9dec064](https://github.com/visulima/visulima/commit/9dec064ac7795341abd0e34200791c2a60a56fb7))
* **tui:** type histogram bucket counts as number[] ([883eca4](https://github.com/visulima/visulima/commit/883eca42cf74df3db8409a5f921d75371ba79070))
* **tui:** use index keys in ErrorOverview stack + excerpt lists ([86cfdc2](https://github.com/visulima/visulima/commit/86cfdc24821dce8a4edb0ffb22f386eb7a14175b))
* updated install script ([bdeaece](https://github.com/visulima/visulima/commit/bdeaeced0357901dfd92cf1e5a4345cc8924ad65))
* **vis,tui:** fix 10 code review issues across TUI components ([3410347](https://github.com/visulima/visulima/commit/34103473cb661cca4187661e59b396eecff1bdec))
* **vis,tui:** validate directory in detectPm and use useLayoutEffect in StaticRender ([de53e9b](https://github.com/visulima/visulima/commit/de53e9b7a944a3778f0d10f1daa1653a1063d9b3))

### Performance Improvements

* **tui:** add setCharFast() to StyledLine and use in Output hot path ([61e507f](https://github.com/visulima/visulima/commit/61e507f3a5e3a0d852e4c18fc68d87d7aa8d5188))
* **tui:** avoid per-keystroke Key allocation and double key-enumeration in prepareUpdate ([f87f6c7](https://github.com/visulima/visulima/commit/f87f6c789324b21ca49c8415b71ba95bdfc94ac2))
* **tui:** batch StyledChar-to-StyledLine conversion in processStyledWriteOperation ([6035dbc](https://github.com/visulima/visulima/commit/6035dbc2e68085f4f2fa1022fd3a34fa0ce1a03d))
* **tui:** optimize ink components for re-render performance and fix pre-existing type errors ([8803a2f](https://github.com/visulima/visulima/commit/8803a2f4e3c705b93266d9814744c06412e6f1a2))
* **tui:** optimize render pipeline and defer kitty keyboard auto-detection ([946ab50](https://github.com/visulima/visulima/commit/946ab5058bfeb49daabe0f56fa1f9ffacf3c9a70))
* **tui:** Phase 4 — StyledLine fast path in text pipeline ([7c36e92](https://github.com/visulima/visulima/commit/7c36e929a5c0c5dd4526e6934df43cfe551a01ab))
* **tui:** port jacob314/ink micro-optimizations ([cc0131d](https://github.com/visulima/visulima/commit/cc0131d3efa832330e6eb129ec3d61e0d8be3887))
* **tui:** remove autoBind overhead and optimize App component ([b0c4f36](https://github.com/visulima/visulima/commit/b0c4f36e0f0ac44a11942973c6cca9c3e3faa72e))
* **tui:** remove autoBind overhead and optimize App component ([d2adf6b](https://github.com/visulima/visulima/commit/d2adf6bdac1a8f5316bdd0aa6b402ddd054f2146))
* **tui:** remove callBeforeRender tree walk from hot path ([0c18e06](https://github.com/visulima/visulima/commit/0c18e0681091ec13fa904bdafe6aba8c6ca6483f))
* **tui:** remove performance.now() from render hot path ([acb4150](https://github.com/visulima/visulima/commit/acb4150c117677c9634bda7e482da126ed3ec73d))
* **tui:** revert ref-caching in App back to ink's direct dependency pattern ([073f3ef](https://github.com/visulima/visulima/commit/073f3efffb63f52c4b53b92e57977e87dcbb3ea9))
* **tui:** rewrite wrapStyledLine with index-based tracking ([8de898e](https://github.com/visulima/visulima/commit/8de898e9ca429a15e258137d791391100613006e))
* **tui:** simplify and optimize hot path after code review ([b937d4e](https://github.com/visulima/visulima/commit/b937d4efdca0d7691ccacc59afbf67c21d255cb5))
* **tui:** span-walk serializer with getTextRange for O(spans) output ([d5c5e0d](https://github.com/visulima/visulima/commit/d5c5e0d80733edd1a7a5f07432860e390d8d690f))
* **vis:** wrap immutable TUI components with StaticRender ([00e47e9](https://github.com/visulima/visulima/commit/00e47e9f7a6c562570e0b090b7940389451aa1ef))

### Documentation

* prettier-format agent instructions ([71b6414](https://github.com/visulima/visulima/commit/71b6414528780ac82c4e0bb25b5f4f11faba5549))
* **tui:** add ink-ui component examples, media, and examples.mdx updates ([926ca3e](https://github.com/visulima/visulima/commit/926ca3e5b8ce0d0907f0ace22f93e184d6ef9993))
* **tui:** add performance visuals and media from ratatat ([6868e6c](https://github.com/visulima/visulima/commit/6868e6c55b03cad968efd9d67b88b8fc8a009d4e))
* **tui:** add TODO for StyledLine-native measureTextNode ([e5d0407](https://github.com/visulima/visulima/commit/e5d04076cac7244538f88f84ac196e0d575bdf7a))
* **tui:** all 7 phases complete ([a463916](https://github.com/visulima/visulima/commit/a4639169b7efb199d8b4685ba5a3c6ea907c2641))
* **tui:** correct sideEffects guidance ([e41d2bb](https://github.com/visulima/visulima/commit/e41d2bb33807d227b94eba973dcf6fa21e01566c))
* **tui:** cover 51 components, 4 hooks, ink PR ports ([0138e99](https://github.com/visulima/visulima/commit/0138e99694d82c0789bae32977480ee9dc61aa79)), closes [123/#125](https://github.com/123/visulima/issues/125)
* **tui:** document border background color support and fix table formatting ([a12cb57](https://github.com/visulima/visulima/commit/a12cb5786fb5885ea7a747fc254528f08a6cbb93))
* **tui:** document Cursor component and useCursor hook ([67606c5](https://github.com/visulima/visulima/commit/67606c5fc93c15f0c20c1c6290d3dfa51f566d81))
* **tui:** restructure README, link to visulima.com for full docs ([00e0de1](https://github.com/visulima/visulima/commit/00e0de199b0f6d496ccd3db27d12d839bfa361db))
* **tui:** update LICENSE.md with complete attribution ([b89b9bd](https://github.com/visulima/visulima/commit/b89b9bd368a7c52458a584787bb4b5bfadc342b3))
* **tui:** update migration plan — Phase 6 scaffolding done ([8b7ca9c](https://github.com/visulima/visulima/commit/8b7ca9c05abf9d3a5836856844b1de3eaf50d612))
* **tui:** update StyledLine migration plan with completion status ([db6b452](https://github.com/visulima/visulima/commit/db6b452622f1bc8e97a1c4878732652ead1f5106))

### Styles

* cs fixes ([2a960bb](https://github.com/visulima/visulima/commit/2a960bb1772c9dc70080e2d75d3a0d827034e294))
* cs fixs ([0666662](https://github.com/visulima/visulima/commit/066666293c50cde41c796dc38b4b62c48531a3c0))

### Miscellaneous Chores

* add fallow code-intelligence across all packages ([a3b4821](https://github.com/visulima/visulima/commit/a3b48215002e86fed20f2973038b5d4a0aa1ce04))
* added og images ([02d9d1e](https://github.com/visulima/visulima/commit/02d9d1e47be3ce75679ea89e857dc4e4bfe4946b))
* apply eslint + prettier autofixes across packages ([c1bb784](https://github.com/visulima/visulima/commit/c1bb7848a0d93d0dfe2960c77e3cda22239c79a0))
* bump engines.node to ^22.14.0 || >=24.10.0 ([c3d0931](https://github.com/visulima/visulima/commit/c3d0931d1504e4f21ebf50ea680cfa7ce4ba15ce))
* **ci-stability:** green CI across vis, native, lint, tests, attw ([#651](https://github.com/visulima/visulima/issues/651)) ([d4eb684](https://github.com/visulima/visulima/commit/d4eb684b5f75c818c9251048c605a0ed54a268e3))
* clean up ([c9f395a](https://github.com/visulima/visulima/commit/c9f395a1c80877f5dfa40eefc2fda58837244668))
* **deps:** bump rust crates to current majors ([3a1d9bb](https://github.com/visulima/visulima/commit/3a1d9bb7f6e2c6b2d3862e212ae62707d60815cc))
* **fallow:** resolve dead-code findings ([c4125d5](https://github.com/visulima/visulima/commit/c4125d53e03ac9d90115399634535991927a96cc))
* fixed jsr.json ([5d85e51](https://github.com/visulima/visulima/commit/5d85e5179de38e284ec433b14d77c71a1619c8d6))
* **lint:** clear eslint findings in bench + animation test ([16bba0b](https://github.com/visulima/visulima/commit/16bba0b6a35885904b719a3f4a560da436a997c4))
* path update ([42f4097](https://github.com/visulima/visulima/commit/42f4097b9287be1e70dbfb348626ec21f599fd70))
* re-enable jsdoc/match-description in api-platform and tighten config docs ([4ecaa31](https://github.com/visulima/visulima/commit/4ecaa315064cdd798af1ea1296be1fe52967bf9a))
* re-sort workspace package.json files via vis sort-package-json ([f625696](https://github.com/visulima/visulima/commit/f625696cfac974325774b3243e1a83c3d23acbd7))
* **release:** @visulima/tui@1.0.0-alpha.1 [skip ci]\n\n## @visulima/tui 1.0.0-alpha.1 (2026-04-08) ([8d8e3c3](https://github.com/visulima/visulima/commit/8d8e3c36fde375202941ff561001a9ca4b43d916))
* **release:** @visulima/tui@1.0.0-alpha.10 [skip ci]\n\n## @visulima/tui [1.0.0-alpha.10](https://github.com/visulima/visulima/compare/@visulima/tui@1.0.0-alpha.9...@visulima/tui@1.0.0-alpha.10) (2026-05-07) ([3c932af](https://github.com/visulima/visulima/commit/3c932af14cd586bff08a1fac37e524aaffc02435))
* **release:** @visulima/tui@1.0.0-alpha.11 [skip ci]\n\n## @visulima/tui [1.0.0-alpha.11](https://github.com/visulima/visulima/compare/@visulima/tui@1.0.0-alpha.10...@visulima/tui@1.0.0-alpha.11) (2026-05-10) ([6941f1c](https://github.com/visulima/visulima/commit/6941f1cb79604fbd5ba194fa55f7bbce16957b7d))
* **release:** @visulima/tui@1.0.0-alpha.12 [skip ci]\n\n## @visulima/tui [1.0.0-alpha.12](https://github.com/visulima/visulima/compare/@visulima/tui@1.0.0-alpha.11...@visulima/tui@1.0.0-alpha.12) (2026-05-10) ([5ff86cc](https://github.com/visulima/visulima/commit/5ff86cc2216ecd80740bb716656ada5c05e01b73))
* **release:** @visulima/tui@1.0.0-alpha.13 [skip ci]\n\n## @visulima/tui [1.0.0-alpha.13](https://github.com/visulima/visulima/compare/@visulima/tui@1.0.0-alpha.12...@visulima/tui@1.0.0-alpha.13) (2026-05-11) ([4ab93d7](https://github.com/visulima/visulima/commit/4ab93d7c800bbb7c03e244ac7f1643111df1fcc2))
* **release:** @visulima/tui@1.0.0-alpha.14 [skip ci]\n\n## @visulima/tui [1.0.0-alpha.14](https://github.com/visulima/visulima/compare/@visulima/tui@1.0.0-alpha.13...@visulima/tui@1.0.0-alpha.14) (2026-05-11) ([c06df57](https://github.com/visulima/visulima/commit/c06df574a4f72f183fe211e17e1960463a611a44))
* **release:** @visulima/tui@1.0.0-alpha.15 [skip ci]\n\n## @visulima/tui [1.0.0-alpha.15](https://github.com/visulima/visulima/compare/@visulima/tui@1.0.0-alpha.14...@visulima/tui@1.0.0-alpha.15) (2026-05-14) ([9b02c82](https://github.com/visulima/visulima/commit/9b02c82b06ff23b98f2d2a321d6118f580fa8955))
* **release:** @visulima/tui@1.0.0-alpha.16 [skip ci]\n\n## @visulima/tui [1.0.0-alpha.16](https://github.com/visulima/visulima/compare/@visulima/tui@1.0.0-alpha.15...@visulima/tui@1.0.0-alpha.16) (2026-05-16) ([6938484](https://github.com/visulima/visulima/commit/693848429708c98789a11da360bb577477fa975a))
* **release:** @visulima/tui@1.0.0-alpha.17 [skip ci]\n\n## @visulima/tui [1.0.0-alpha.17](https://github.com/visulima/visulima/compare/@visulima/tui@1.0.0-alpha.16...@visulima/tui@1.0.0-alpha.17) (2026-05-19) ([c0ebb50](https://github.com/visulima/visulima/commit/c0ebb50c0f7414035c40738635d7f8de02d79bfc))
* **release:** @visulima/tui@1.0.0-alpha.18 [skip ci]\n\n## @visulima/tui [1.0.0-alpha.18](https://github.com/visulima/visulima/compare/@visulima/tui@1.0.0-alpha.17...@visulima/tui@1.0.0-alpha.18) (2026-05-20) ([f2078e2](https://github.com/visulima/visulima/commit/f2078e247a9f3e2ac2a1e867a2aa7bcdfd1d6ab3))
* **release:** @visulima/tui@1.0.0-alpha.19 [skip ci]\n\n## @visulima/tui [1.0.0-alpha.19](https://github.com/visulima/visulima/compare/@visulima/tui@1.0.0-alpha.18...@visulima/tui@1.0.0-alpha.19) (2026-05-26) ([7941cc3](https://github.com/visulima/visulima/commit/7941cc3f6d67991b6bf5297480d3e9fb090b06c9))
* **release:** @visulima/tui@1.0.0-alpha.2 [skip ci]\n\n## @visulima/tui [1.0.0-alpha.2](https://github.com/visulima/visulima/compare/@visulima/tui@1.0.0-alpha.1...@visulima/tui@1.0.0-alpha.2) (2026-04-09) ([0e3a33e](https://github.com/visulima/visulima/commit/0e3a33efa259bf24fff1870478da126c9993f519))
* **release:** @visulima/tui@1.0.0-alpha.20 [skip ci]\n\n## @visulima/tui [1.0.0-alpha.20](https://github.com/visulima/visulima/compare/@visulima/tui@1.0.0-alpha.19...@visulima/tui@1.0.0-alpha.20) (2026-05-27) ([98667aa](https://github.com/visulima/visulima/commit/98667aa2c7d4dbab9f7fd01f99bb70e06b47d974))
* **release:** @visulima/tui@1.0.0-alpha.21 [skip ci]\n\n## @visulima/tui [1.0.0-alpha.21](https://github.com/visulima/visulima/compare/@visulima/tui@1.0.0-alpha.20...@visulima/tui@1.0.0-alpha.21) (2026-06-02) ([0505d25](https://github.com/visulima/visulima/commit/0505d25046ce9f50f94f94d6ea59e0f94b2afedf))
* **release:** @visulima/tui@1.0.0-alpha.22 [skip ci]\n\n## @visulima/tui [1.0.0-alpha.22](https://github.com/visulima/visulima/compare/@visulima/tui@1.0.0-alpha.21...@visulima/tui@1.0.0-alpha.22) (2026-06-04) ([571bdc0](https://github.com/visulima/visulima/commit/571bdc01b8a6221f981ba1c6ae76b6ca82540501))
* **release:** @visulima/tui@1.0.0-alpha.23 [skip ci]\n\n## @visulima/tui [1.0.0-alpha.23](https://github.com/visulima/visulima/compare/@visulima/tui@1.0.0-alpha.22...@visulima/tui@1.0.0-alpha.23) (2026-06-04) ([e2c027a](https://github.com/visulima/visulima/commit/e2c027a4e383a60ed0d30a3c7c1e243b29e5fb91))
* **release:** @visulima/tui@1.0.0-alpha.24 [skip ci]\n\n## @visulima/tui [1.0.0-alpha.24](https://github.com/visulima/visulima/compare/@visulima/tui@1.0.0-alpha.23...@visulima/tui@1.0.0-alpha.24) (2026-06-13) ([86a6730](https://github.com/visulima/visulima/commit/86a673036194ccce96bc728b768e10417f7ea0c1))
* **release:** @visulima/tui@1.0.0-alpha.25 [skip ci]\n\n## @visulima/tui [1.0.0-alpha.25](https://github.com/visulima/visulima/compare/@visulima/tui@1.0.0-alpha.24...@visulima/tui@1.0.0-alpha.25) (2026-06-15) ([1605835](https://github.com/visulima/visulima/commit/16058354136af9003785a9cc9dea50b11ccbe80c))
* **release:** @visulima/tui@1.0.0-alpha.26 [skip ci]\n\n## @visulima/tui [1.0.0-alpha.26](https://github.com/visulima/visulima/compare/@visulima/tui@1.0.0-alpha.25...@visulima/tui@1.0.0-alpha.26) (2026-06-19) ([009d02e](https://github.com/visulima/visulima/commit/009d02eb49f41d19c82b96121521538bd8b818a9))
* **release:** @visulima/tui@1.0.0-alpha.27 [skip ci]\n\n## @visulima/tui [1.0.0-alpha.27](https://github.com/visulima/visulima/compare/@visulima/tui@1.0.0-alpha.26...@visulima/tui@1.0.0-alpha.27) (2026-06-30) ([40fc68c](https://github.com/visulima/visulima/commit/40fc68c68f04df4fa68724c0bf78350407af87bb))
* **release:** @visulima/tui@1.0.0-alpha.3 [skip ci]\n\n## @visulima/tui [1.0.0-alpha.3](https://github.com/visulima/visulima/compare/@visulima/tui@1.0.0-alpha.2...@visulima/tui@1.0.0-alpha.3) (2026-04-22) ([3ece430](https://github.com/visulima/visulima/commit/3ece4302a9c20bc43ca80ab287cbbd72ef1c75e5))
* **release:** @visulima/tui@1.0.0-alpha.4 [skip ci]\n\n## @visulima/tui [1.0.0-alpha.4](https://github.com/visulima/visulima/compare/@visulima/tui@1.0.0-alpha.3...@visulima/tui@1.0.0-alpha.4) (2026-04-22) ([ea8594d](https://github.com/visulima/visulima/commit/ea8594dd2b2eacd109ab4b1181f30ce750b33e44))
* **release:** @visulima/tui@1.0.0-alpha.5 [skip ci]\n\n## @visulima/tui [1.0.0-alpha.5](https://github.com/visulima/visulima/compare/@visulima/tui@1.0.0-alpha.4...@visulima/tui@1.0.0-alpha.5) (2026-04-28) ([8656e85](https://github.com/visulima/visulima/commit/8656e85d9ab3805b42d3814b4051ef57b156ee7f))
* **release:** @visulima/tui@1.0.0-alpha.6 [skip ci]\n\n## @visulima/tui [1.0.0-alpha.6](https://github.com/visulima/visulima/compare/@visulima/tui@1.0.0-alpha.5...@visulima/tui@1.0.0-alpha.6) (2026-05-04) ([c197079](https://github.com/visulima/visulima/commit/c197079781cf68a37f2cb174ec88962fa10e869e))
* **release:** @visulima/tui@1.0.0-alpha.7 [skip ci]\n\n## @visulima/tui [1.0.0-alpha.7](https://github.com/visulima/visulima/compare/@visulima/tui@1.0.0-alpha.6...@visulima/tui@1.0.0-alpha.7) (2026-05-06) ([a775a83](https://github.com/visulima/visulima/commit/a775a83b47caa5a33dd2f1d1b66465852976c295))
* **release:** @visulima/tui@1.0.0-alpha.8 [skip ci]\n\n## @visulima/tui [1.0.0-alpha.8](https://github.com/visulima/visulima/compare/@visulima/tui@1.0.0-alpha.7...@visulima/tui@1.0.0-alpha.8) (2026-05-06) ([de7d525](https://github.com/visulima/visulima/commit/de7d52536de6a5e608596296e5d8106611723f86))
* **release:** @visulima/tui@1.0.0-alpha.9 [skip ci]\n\n## @visulima/tui [1.0.0-alpha.9](https://github.com/visulima/visulima/compare/@visulima/tui@1.0.0-alpha.8...@visulima/tui@1.0.0-alpha.9) (2026-05-07) ([5ab84f6](https://github.com/visulima/visulima/commit/5ab84f62454ecd4ab548c9527fd0fba05a8b4b72))
* remove not needed file ([1944cee](https://github.com/visulima/visulima/commit/1944cee9e6b8083acc728ed69ee2ca2b2a240bc3))
* remove unused deprecated aliases ([#612](https://github.com/visulima/visulima/issues/612)) ([24ee546](https://github.com/visulima/visulima/commit/24ee546bcb2c17b8915622e4878797c00aa1d813))
* **repo:** apply eslint --fix and prettier --fix across packages ([#650](https://github.com/visulima/visulima/issues/650)) ([2e26a84](https://github.com/visulima/visulima/commit/2e26a84774f218f21345e9a8ecd68236b6542743)), closes [#620](https://github.com/visulima/visulima/issues/620)
* **repo:** sort package.json keys across all packages ([e1fd9ab](https://github.com/visulima/visulima/commit/e1fd9ab467ef96a98c777da1572ff6a50fcf7e71))
* sorted package.json ([b47c545](https://github.com/visulima/visulima/commit/b47c545591600fdab17d5cd3a3fbc68b61e199da))
* **tui:** align jsx ternaries with prettier formatting ([3ed06fa](https://github.com/visulima/visulima/commit/3ed06fa1979e8c5be29948a4793580e516b1c370))
* **tui:** apply formatter and lint fixes ([e70da36](https://github.com/visulima/visulima/commit/e70da3672d1c06cbbe2a6294c86535d770dc04bf))
* **tui:** apply linter auto-fixes and formatting ([18b2361](https://github.com/visulima/visulima/commit/18b23617980b889c9bc2568c95de8d863411805d))
* **tui:** apply pending changes ([f432dc8](https://github.com/visulima/visulima/commit/f432dc8aae2c4f26b43132d956067b770d4a9548))
* **tui:** apply pending lint and source updates ([7fe85fe](https://github.com/visulima/visulima/commit/7fe85fe0261d2d792762971c56a98fe1c03040a6))
* **tui:** apply prettier and eslint formatting sweep ([62a7700](https://github.com/visulima/visulima/commit/62a7700005ff20a567643a09bc89a7d212b3e17d))
* **tui:** apply prettier and eslint quote-style auto-fix ([a815954](https://github.com/visulima/visulima/commit/a8159542aa6fcef2060bf69d6a9fd4fe8a034ec2))
* **tui:** apply prettier formatting ([586f156](https://github.com/visulima/visulima/commit/586f1564befa31ce55948836bf9cf504bbfb58a0))
* **tui:** bump react peer to >=19.2.6 and bench ink to v7 ([4c97b71](https://github.com/visulima/visulima/commit/4c97b71fa229bf4d03e585fbdbb962795a3e4adc))
* **tui:** clean up ink.tsx — document React.memo limitation ([55bf3f0](https://github.com/visulima/visulima/commit/55bf3f09e21730e0ccd0c9825edb8c0a8b333880))
* **tui:** clear lint warnings ([74a3679](https://github.com/visulima/visulima/commit/74a36798eb1768dad01bcc14e1ba25079ada25d5))
* **tui:** configure eslint defaultProject for tsconfig resolution ([a5996e7](https://github.com/visulima/visulima/commit/a5996e7cdbfd9d67b9a56baac1cbb7fb62eeb66a))
* **tui:** configure eslint with typescript-aware linting ([dfeacdb](https://github.com/visulima/visulima/commit/dfeacdb5f546174c419dbad77438ca6be6135005))
* **tui:** drop runtime deps in favor of local helpers ([4427daf](https://github.com/visulima/visulima/commit/4427daf4a8d5c7b831950d3e75bd066e1ff16ab3))
* **tui:** enforce curly braces and apply lint fixes ([ffab48f](https://github.com/visulima/visulima/commit/ffab48f89720a8e906d863bb3539c86bee9783a5))
* **tui:** expand inline if-return to block syntax ([a89cda6](https://github.com/visulima/visulima/commit/a89cda6171bd53e99bd623e96b56d901d75dae3c))
* **tui:** expand inline if-return to block syntax ([20f1494](https://github.com/visulima/visulima/commit/20f1494b88a22f519cc9d09e955b463dd5dec0cc))
* **tui:** fix all remaining eslint code errors (709 → 218) ([84ad020](https://github.com/visulima/visulima/commit/84ad02027383fc90c10074dbcc8a9b57fe2d64cb))
* **tui:** fix eslint errors and add eslint-disable directives ([d72a525](https://github.com/visulima/visulima/commit/d72a525114502053f059c614c3e82da3c0abd2c0))
* **tui:** fix lint errors ([ca7d9ff](https://github.com/visulima/visulima/commit/ca7d9ff9b1abe21a660b71897d33ff6c9c0446c7))
* **tui:** housekeeping cleanup ([b79b801](https://github.com/visulima/visulima/commit/b79b801b28d4a56171581ebcebb8fd0d75e89ac7))
* **tui:** migrate .prettierrc.cjs to prettier.config.js ([bbcc819](https://github.com/visulima/visulima/commit/bbcc8193a672a2df80ba3bf5cedadf716db04636))
* **tui:** move scroll media to docs/media, update lockfile and snapshots ([2b30bde](https://github.com/visulima/visulima/commit/2b30bde2e126febdc669fd5dc6d98dbddc6aef99))
* **tui:** remove stale migration comments from styled-line-bridge ([0f371c2](https://github.com/visulima/visulima/commit/0f371c2b97e541e9ef2f18c37f95c5af934a7f16))
* **tui:** resolve TODOs and update migration plan ([5795d2b](https://github.com/visulima/visulima/commit/5795d2ba7038c307ef01a834ca636a09e9cba9b6))
* **tui:** update bundled dependency license formatting ([78637fd](https://github.com/visulima/visulima/commit/78637fd2dd415cc34283f6eab8efa7836f920149))
* **tui:** upgrade packem to 2.0.0-alpha.76 ([12e76e0](https://github.com/visulima/visulima/commit/12e76e05c3c7f2656af061a058f6812c7c45d1e4))
* update examples ([431fadc](https://github.com/visulima/visulima/commit/431fadc784b9099aa019f15da0dc564eb34f31b4))
* update examples ([51c37c2](https://github.com/visulima/visulima/commit/51c37c2d14e864cb91cf82c6cc59df55ef7c9191))
* update license ([ee53d3f](https://github.com/visulima/visulima/commit/ee53d3f42d0952a793acac0bbe933cc8a4212e05))

### Code Refactoring

* replace inline import() types with top-level imports ([4569a4c](https://github.com/visulima/visulima/commit/4569a4ca04723da069f985855dcfab292f7347e1))
* **tui:** apply linting and formatting fixes ([db8f922](https://github.com/visulima/visulima/commit/db8f9226b35a629ef403ac9c0800469bd08a1d08))
* **tui:** apply Vercel React best practices to App component ([f36f02b](https://github.com/visulima/visulima/commit/f36f02b3e0b8b2b8e3c65e661cfb0ddb1a218e6b))
* **tui:** convert Output from operation queue to immediate writes ([cce0a90](https://github.com/visulima/visulima/commit/cce0a90b61b14e43f42cc628340462e107ac7ff4))
* **tui:** extract shared color-utils and unify span mutation ([291a81f](https://github.com/visulima/visulima/commit/291a81fcfb0c14e5c2ee394b25495c6b0a8f2726))
* **tui:** fix additional test lint issues from background agent ([b733b5b](https://github.com/visulima/visulima/commit/b733b5b3449038e5a338f7ddee3277fa6a03b4f0))
* **tui:** fix eslint errors in source files ([69daaa6](https://github.com/visulima/visulima/commit/69daaa66ff53893ac21ca5bfac3f77cd286d173c))
* **tui:** fix eslint errors in test and example files ([11d07ce](https://github.com/visulima/visulima/commit/11d07ce4ff5fd99dd5e3bdd1ea749e372e126464))
* **tui:** fix lint issues in fixtures, tests, and source files ([1935312](https://github.com/visulima/visulima/commit/19353126a86ed8f48e9275c5c69dd2a5b3b31c73))
* **tui:** merge examples-raw/ into examples/raw/ ([180ea9c](https://github.com/visulima/visulima/commit/180ea9c76e2919286c5c8138461aaead29e44d58))
* **tui:** port scroll components, remove ink peer dep ([d8acb7c](https://github.com/visulima/visulima/commit/d8acb7ceb5725ccff96ce20afef928209698db5f))
* **tui:** reformat NAPI loader and src to prettier style ([38f99e5](https://github.com/visulima/visulima/commit/38f99e521be081fefb134e0ad25172fbb4de2965))
* **tui:** remove @alcalzone/ansi-tokenize dependency ([dab87d8](https://github.com/visulima/visulima/commit/dab87d8c4d0b2168d0028f8065b1bce5af703a18))
* **tui:** replace chalk and boxen with visulima packages ([a5fb042](https://github.com/visulima/visulima/commit/a5fb0421333840f6e1a823b3d708a2741a059845))
* **tui:** replace external deps with visulima packages ([5a6ecf8](https://github.com/visulima/visulima/commit/5a6ecf8a1c63d44c59756e9ba8053c85de68a2a1))
* **tui:** resolve fallow dead-code findings ([24fc8ad](https://github.com/visulima/visulima/commit/24fc8ad90face6d37f02edb4e87d18a7f2eb7900))
* **tui:** revert Output from region stack to flat clip model ([d2b13aa](https://github.com/visulima/visulima/commit/d2b13aa3ef53bdc75b9cca4cda780ff149aa71be))
* **tui:** simplify code, add missing tests, improve type safety ([d1035ce](https://github.com/visulima/visulima/commit/d1035ceea25d0778be576bf0c8dc06b26b44a0ad))
* **tui:** switch spinner to @visulima/spinner ([0c2e2f4](https://github.com/visulima/visulima/commit/0c2e2f498e8c2f4bee46b257dfc1f61d5924a012))
* **tui:** unify napi root-binding loader ([84172fc](https://github.com/visulima/visulima/commit/84172fcb8675881313066fd5dc96d2d452e1d3f2))
* **vis:** unify TUI style across run and update commands ([2c85520](https://github.com/visulima/visulima/commit/2c855204a1972596e079a42e12b3a79aba6c657c))

### Tests

* adjusted test ([7b734cb](https://github.com/visulima/visulima/commit/7b734cbaf684acb38332adf7d6e6ed5cb585a5fb))
* fix failing and flaky package tests ([3f2894e](https://github.com/visulima/visulima/commit/3f2894e816e99f465abb0d3b7d5161af69bbb4ec))
* **repo:** add dist runtime + types integration tests ([32ee300](https://github.com/visulima/visulima/commit/32ee300b7184117a0ddf9f9d390f75f8932d5ed9))
* **secret-scanner:** add per-file JIT warmup and extended timeouts ([3255e63](https://github.com/visulima/visulima/commit/3255e636cb554e3bfb40e8c4cafd6108034f9acf))
* **tui, dev-toolbar:** fix expect.assertions counts on looped assertions ([898bc59](https://github.com/visulima/visulima/commit/898bc59ef217f7c8ee2aa7fdf7da3d355c028b13))
* **tui, find-ai-runner:** fix CI-flaky tests with polling and retry ([8f574f5](https://github.com/visulima/visulima/commit/8f574f5cac421fdd7090eb059d4c1d82af3c1f6a))
* **tui:** add @jrichman/ink render benchmark comparison ([0cd8576](https://github.com/visulima/visulima/commit/0cd85769ce51490a4bfe1b2cca39226009b3512e))
* **tui:** add benchmarks for new components and utilities ([dac6310](https://github.com/visulima/visulima/commit/dac63103fe08fc23542ab0331e895c3062a8b96a))
* **tui:** add border background color example and tests ([6b6ee05](https://github.com/visulima/visulima/commit/6b6ee052c1de8e1fdb3522141bd7e7cf6c088eac))
* **tui:** add CJK text truncation tests from ink upstream ([#598](https://github.com/visulima/visulima/issues/598)) ([e8e5002](https://github.com/visulima/visulima/commit/e8e5002b278dc337b280ba8f470c0e4c6223a822))
* **tui:** add ink v6.8.0 test suite converted from Ava to Vitest ([60c9679](https://github.com/visulima/visulima/commit/60c9679fd7e326203f94857cb8a97cb54a460725))
* **tui:** add native-binding test for CI build-native workflow ([b3bffc4](https://github.com/visulima/visulima/commit/b3bffc4f0a5892e2219dc9fe7e395ac761249640))
* **tui:** add scroll component tests and docs with demo SVGs ([2a86ee1](https://github.com/visulima/visulima/commit/2a86ee15a8498e8032ccb187fa18bb654afa547b))
* **tui:** cover input parser, text-wrap, measure-text/element, and selection logic ([47b4311](https://github.com/visulima/visulima/commit/47b43119fb47fad536ea68e4d3ae0a4ede159b87))
* **tui:** de-flake form-controls autoFocus race ([d787b44](https://github.com/visulima/visulima/commit/d787b44a8dc6147c780632ac6b2879b675382d84))
* **tui:** de-flake radio-group commit-on-space test ([7b9b9e8](https://github.com/visulima/visulima/commit/7b9b9e8dbc43919116ecf6c26e62515c10789ab2))
* **tui:** de-flake same-interval animation sync on slow ci ([d8418de](https://github.com/visulima/visulima/commit/d8418de0831740b473cdfde665811fe0eeccebdc))
* **tui:** de-flake streamingText typewriter onComplete assertion ([2e02f04](https://github.com/visulima/visulima/commit/2e02f047665eab077b966788c45c0a43092bf631))
* **tui:** de-flake toggle focus management ([ceb4007](https://github.com/visulima/visulima/commit/ceb4007728f7e97894ec2a0734acc2f1f5edca78))
* **tui:** fix 15 broken ink component tests ([c1e25a0](https://github.com/visulima/visulima/commit/c1e25a00d0fbd4532df0802a07452dc803e93f79))
* **tui:** gate ink input emits on the readable listener ([3c45fc6](https://github.com/visulima/visulima/commit/3c45fc666349d4c2983f92ed028ed65e1cb671a3))
* **tui:** move expect.assertions past platform-guard early returns ([f3ce2e3](https://github.com/visulima/visulima/commit/f3ce2e3eecac57192f4b91582ca990e4256b4538))
* **tui:** move remaining expect.assertions past platform guards ([c227075](https://github.com/visulima/visulima/commit/c2270756cfdc87fa083ea1f8f90d6ece76951540))
* **tui:** pass interactive:true to useBoxMetrics resize-listener tests ([e6394be](https://github.com/visulima/visulima/commit/e6394be60ad294235c88f62e53b90160b61d695e))
* **tui:** relax flaky suspended-animation frame assertion ([d68ba4e](https://github.com/visulima/visulima/commit/d68ba4ee482534613e6b34045721115cc7890c58))
* **tui:** replace expect.hasAssertions with exact expect.assertions counts ([d3fe122](https://github.com/visulima/visulima/commit/d3fe1228e40ee7d030edef7168c49b50c1d780fd))
* **tui:** replace fragile delay() waits with vi.waitFor ([1e90e64](https://github.com/visulima/visulima/commit/1e90e64a454c8ed3ed058f1c4ee286357192904f))
* **tui:** skip flaky suspense-animation test on macos ([68e3933](https://github.com/visulima/visulima/commit/68e3933f7756a0a40427d93e09c060858a62e5e4))
* **tui:** stabilize flaky ink input and chart tests ([183be7b](https://github.com/visulima/visulima/commit/183be7b2a1cfcdf4fa6f57f6ee02b5b8d62b29a4))
* **tui:** stabilize flaky ink input tests and remove native guard ([445abd8](https://github.com/visulima/visulima/commit/445abd85a0b44707f28122e8b1921564af728f33))
* **tui:** stabilize Transition onExit test with vi.waitFor ([cd5e8a0](https://github.com/visulima/visulima/commit/cd5e8a004c062949bd5fe6cb31a39def83071e4d))
* **tui:** use assertions(0) so empty-series test allows expectTypeOf-only ([7c728dd](https://github.com/visulima/visulima/commit/7c728dddcb1f0a1751924e2585eb03c60d31132e))
* **tui:** use runtime expect in LineChart empty-series test ([0a6e167](https://github.com/visulima/visulima/commit/0a6e167a332cf35b21391f325ab0ce29591a8ece))

### Build System

* **deps:** update tui dependencies ([7bd603d](https://github.com/visulima/visulima/commit/7bd603db3d0efa7f5e8d5427df34d9bdc4b747dd))
* regenerate bundled-license manifests and types ordering ([af26588](https://github.com/visulima/visulima/commit/af26588d75aaa937fd4862800560bd4070a4878c))
* regenerate NAPI-RS bindings as ESM ([f202caf](https://github.com/visulima/visulima/commit/f202caf3dc383a2ec24815c4935d8d68c29f33d0))
* switch NAPI-RS native builds to ESM output ([3d7cd61](https://github.com/visulima/visulima/commit/3d7cd615ad830392005915735c11771e0247ef3f))

### Continuous Integration

* drop lewagon, fix tui lint, api-platform publint, preview-release JSON ([3801100](https://github.com/visulima/visulima/commit/38011006b2488fd25f186a7638ceda5a6ee65e45))
* **fallow:** make fallow:health advisory (--report-only) ([d57148e](https://github.com/visulima/visulima/commit/d57148ea0e3556b4c24d8d336b9fa14987f5dc7d))
* integrate codspeed for benchmark tracking ([e758f3d](https://github.com/visulima/visulima/commit/e758f3da491cc00d3f8bbf10d7ba3fdf8deb5325))
* pin macos to 15, fix task-runner indent + backbuffer flake ([61cbf4f](https://github.com/visulima/visulima/commit/61cbf4fb09be40c567a4e0d2d4349ad24ea91afb))
* stabilize flaky tests and drop markdown lint ([91e110a](https://github.com/visulima/visulima/commit/91e110a30b1ef8ca16f0632253a9e4d13856d8f9))

### Dependencies

* **@visulima/ansi:** upgraded to 4.0.0
* **@visulima/colorize:** upgraded to 2.0.0
* **@visulima/error:** upgraded to 6.0.0
* **@visulima/spinner:** upgraded to 1.0.0
* **@visulima/string:** upgraded to 3.0.0
* **@visulima/boxen:** upgraded to 3.0.0
* **@visulima/tabular:** upgraded to 4.0.0
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants