build(deps): bump @opentui/solid from 0.8.1 to 0.8.3

Closed
DE
4h ago
+40-34

Bumps @opentui/solid from 0.8.1 to 0.8.3.

Release notes

Sourced from @​opentui/solid's releases.

Release v0.8.3

Over ssh, sshd drops COLORTERM. A terminal that draws 24-bit color but sends TERM=xterm-256color without COLORTERM therefore got every color mapped to the 256-color palette. In WezTerm and xterm over ssh, a navy #23344b turned into a gray #3a3a3a. In 0.8.2, only a kitty XTVERSION reply turned on 24-bit color. In 0.8.3, when COLORTERM does not settle the question, the startup queries also ask XTGETTCAP RGB and Tc. A positive reply turns on 24-bit color. So does an XTVERSION reply from Ghostty, WezTerm, foot, XTerm, iTerm2, or tmux, because tmux converts 24-bit colors for its client itself. The replies come back through ssh, so this works without COLORTERM. Inside GNU Screen, OpenTUI sends neither query, because Screen drops 24-bit colors and prints the query bodies as text. When nothing answers, the old TERM rule still applies. Alacritty and mosh answer none of these queries, so they still need COLORTERM=truecolor.

The width method decides how many cells an emoji sequence takes. When OpenTUI picks a different method than the terminal uses, the line overflows or leaves gaps. Before, OpenTUI kept the unicode method in terminals that do not report mode 2027, even though many of them draw a sequence one code point at a time. tmux 3.6 and later draws a sequence as one cluster but got wcwidth. An inherited TERM_PROGRAM=ghostty also forced unicode-wide in other terminals. Now the method comes from one place, with the strongest evidence first:

  1. OPENTUI_FORCE_*, also over SSH.
  2. The multiplexer.
  3. The DECRPM 2027 reply. An unrecognized or permanently reset mode means wcwidth, except in kitty and iTerm2.
  4. XTVERSION.
  5. The environment, where TERM wins over an inherited TERM_PROGRAM.
Terminal Before After
Alacritty, xterm, urxvt, GNOME Terminal, VS Code, Zellij, foot (wcswidth) unicode wcwidth
tmux 3.6+ wcwidth unicode
kitty started from Ghostty unicode-wide unicode
Ghostty over SSH, libghostty unicode unicode-wide

No method matches tmux when variation-selector-always-wide is off. Unicode is the closest. If the new choice is wrong for your terminal, set OPENTUI_FORCE_UNICODE or OPENTUI_FORCE_WCWIDTH. These settings still win.

Before this release, a host that started an unmodified OpenTUI app could not easily make it load a different native build. setRenderLibPath() needs code, and OTUI_ASSET_ROOT needs the whole asset tree under one root. OPENTUI_LIB_PATH names one library file, under both Bun and Node:

OPENTUI_LIB_PATH=../opentui/packages/native/lib/x86_64-linux/libopentui.so bun run src/index.ts

A relative path resolves against the working directory. setRenderLibPath() takes precedence over the variable, and the variable takes precedence over OTUI_ASSET_ROOT and the platform package. If the file is missing or does not load, the error names the variable. Core now also checks the context ABI version when it loads a library, so a library built for another context ABI fails at load and not at a later call.

A host that embeds a terminal often has to know where the terminal's view is. For example, it can pass an unused wheel step to an outer scroll view or draw a scrollbar. Counting scroll steps does not give the answer. Output and resizes keep the view on its history rows, a scrollback clear jumps to the live screen, and the alternate screen has no history. EmbeddedTerminalRenderable.getScroll() reads the current view from the emulator, including the moves that the emulator makes on its own:

function scrollStatus(terminal: EmbeddedTerminalRenderable): string {
  const { offset, total, visible } = terminal.getScroll()
  if (offset === 0) return "live"
  return `${offset} of ${total - visible} rows back`
}

C and Rust hosts get two changes. First, the @opentui/core-<platform> packages now ship the opentui.h that their library was built from. Before, a binding that took the library from npm had no matching header. Second, opentui.h now declares the audio engine. Before, a host could bind it only by copying Zig signatures. With OT_AUDIO_START_NO_DEVICE, the engine mixes only when the host calls ot_audio_mix, so tests can play sounds without a device. Voice IDs now carry a generation. An old ID no longer stops a new sound that reused its slot.

Added

  • core: EmbeddedTerminalRenderable.getScroll() returns the view's offset from the live screen, the total rows, and the visible rows. See Embedded terminal. (#1934)
  • core: OPENTUI_LIB_PATH names a native library file. Under Bun and Node, Core loads it instead of the OTUI_ASSET_ROOT copy or the platform package. setRenderLibPath() takes precedence over the variable. See Environment variables. (#1933)
  • native: ot_embedded_terminal_scrollbar_get fills an ot_embedded_terminal_scrollbar record with the offset from the live screen, the total rows, and the visible rows. See Embedded terminal. (#1934)
  • native: opentui.h declares nine ot_audio_* functions that address an audio engine by ot_handle and return ot_status. With the OT_AUDIO_START_NO_DEVICE flag, ot_audio_start opens no device, and the engine mixes only in ot_audio_mix. See C. (#1935)
  • native: The @opentui/core-<platform> packages include the opentui.h that the library was built from. On Windows, they also include opentui.lib. See C. (#1932)
  • native: The OT_INPUT_KEY_TYPED key flag marks a key whose code is a printable character that the terminal sent as text or as a CSI 27 code. See Keyboard input. (#1919)

Changed

... (truncated)

Commits

Dependabot compatibility score

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


Dependabot commands and options

You can trigger Dependabot actions by commenting on this PR:

  • @dependabot rebase will rebase this PR
  • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
  • @dependabot show <dependency name> ignore conditions will show all of the ignore conditions of the specified dependency
  • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
  • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
  • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)

Summary by cubic

Bumps @opentui/solid to 0.8.3 in packages/opencode, pulling in OpenTUI's terminal rendering fixes. 24-bit color now works over SSH without COLORTERM, emoji width detection better matches what the terminal actually draws, and a new OPENTUI_LIB_PATH env var lets hosts load a custom native library.