Repository navigation
chore(deps): update opentui - #22
Open
renovate[bot] wants to merge 1 commit into
Open
renovate[bot] wants to merge 1 commit into
renovate[bot] wants to merge 1 commit into
Conversation
commit: |
renovate
Bot
force-pushed
the
renovate/opentui
branch
from
July 17, 2026 14:27
b25a572 to
f8f5214
Compare
renovate
Bot
force-pushed
the
renovate/opentui
branch
2 times, most recently
from
August 4, 2026 06:39
3801e87 to
98c897c
Compare
renovate
Bot
force-pushed
the
renovate/opentui
branch
4 times, most recently
from
August 18, 2026 15:17
167d32f to
d1f33f6
Compare
renovate
Bot
force-pushed
the
renovate/opentui
branch
3 times, most recently
from
August 25, 2026 12:56
33a33c2 to
3596eb8
Compare
renovate
Bot
force-pushed
the
renovate/opentui
branch
2 times, most recently
from
September 1, 2026 19:02
e5f8841 to
c38a2b3
Compare
renovate
Bot
force-pushed
the
renovate/opentui
branch
from
September 7, 2026 13:08
c38a2b3 to
8c1a7b0
Compare
renovate
Bot
force-pushed
the
renovate/opentui
branch
from
September 22, 2026 18:50
8c1a7b0 to
bd331c4
Compare
renovate
Bot
force-pushed
the
renovate/opentui
branch
from
October 1, 2026 03:17
bd331c4 to
80484bd
Compare
renovate
Bot
force-pushed
the
renovate/opentui
branch
2 times, most recently
from
October 7, 2026 11:14
46c4570 to
febd6be
Compare
renovate
Bot
force-pushed
the
renovate/opentui
branch
6 times, most recently
from
October 11, 2026 21:25
287c721 to
1b35cb9
Compare
renovate
Bot
force-pushed
the
renovate/opentui
branch
4 times, most recently
from
October 14, 2026 12:57
c9da71d to
ae06eef
Compare
renovate
Bot
force-pushed
the
renovate/opentui
branch
from
October 14, 2026 19:41
ae06eef to
8d111fe
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Note
This PR body was truncated due to platform limits.
This PR contains the following updates:
0.5.14→0.6.60.5.14→0.6.60.5.14→0.6.60.5.14→0.6.60.5.14→0.6.60.5.14→0.6.60.5.14→0.6.60.5.14→0.6.61.9.15→1.9.17Release Notes
anomalyco/opentui (@opentui/core)
v0.6.6Compare Source
Previously, most layout setters ignored
null,undefined, or both, so the node kept its old style. As a result, a React or Solid component that removed a style prop kept the old layout. A plugin that readUnit.Undefinedfrom a getter also could not write that value back. In 0.6.6, a nullish write restores the default that the constructor uses when the option is omitted:Margin, padding, gap, min and max sizes, and
flexBasisbecome unset, so an edge falls back to its shorthand again.top,right,bottom, andleftalso unset the native edge. Before, the getter reportedundefinedwhile layout kept the old offset.widthandheightbecome"auto",positionbecomes"relative",overflowbecomes"visible", andvisiblebecomestrue. Invalid values are still ignored. Not every default comes back. Class defaults such as the row direction ofScrollBoxRenderablestay as they are, andflexShrinkbecomes1.If a custom renderable passes its own
widthorheighttosuper(), it should override the newprotected defaultDimension(kind)method. A nullish write then restores that size instead of"auto". Built-in classes that size themselves, such asInputRenderable,TabSelectRenderable, andASCIIFontRenderable, already override it.Added
protected defaultDimension(kind)to set thewidthorheightthat a nullish write restores. See Custom renderables. (#1678)Changed
nullorundefinedto a layout property restores the default for an omitted option, and removing a React or Solid style prop does the same. See Layout. (#1678)nullorundefinedtovisibleshows the node. Before,nullhid the node, so assignfalseto hide it. (#1678)Fixed
fillRect,drawBox,setCell,drawChar, and other calls with u32 fields now say "must be a non-negative integer" for NaN, Infinity, fractional, and negative values. Before, the error said that the value exceeded the u32 limit. See Buffer API. (#1674)titleorbottomTitleover 64 KiB throws the sameRangeErrorasdrawTextinstead of aNativeErrorwith theInvalidArgumentstatus. See Box. (#1674)NativeErrorwith the message "Scene nesting depth exceeds the native limit". Before, the message gave only theObjectLimitstatus. See Layout. (#1674)API changes and documentation: https://opentui.com/docs/releases/0.6.6
What's Changed
Full Changelog: anomalyco/opentui@v0.6.5...v0.6.6
v0.6.5Compare Source
OpenTUI 0.6 removed
Renderable.getLayoutNode(). Before 0.6, plugins used it to read the layout styles of host renderables that they did not create. Some plugins saved a container'sgetMaxWidth()andgetAlignSelf()so they could restore the container after they restyled it. Others checked the host layout withgetFlexDirection(), or sized a panel inside a padded sidebar withgetPadding(). 0.6 kept onlygetWidth()andgetMargin(edge), so this code had nothing to call.In 0.6.5, renderables have the other style getters of a Yoga
Node, with the same names and return types. To move, remove thegetLayoutNode()call:These getters return the declared style, not the computed layout. A write shows up at once, before the next layout pass. After
box.maxWidth = 40,box.getMaxWidth()returns{ unit: Unit.Point, value: 40 }, butbox.widthstill holds the computed width from the last pass. Afterdestroy(), the getters do not throw. They return Yoga's unset values, asgetWidth()does.An edge getter reads only the value set for that exact edge, so this case needs care. The
paddingoption setsEdge.All,paddingXsetsEdge.Horizontal, andpaddingLeftsetsEdge.Left. Afterpadding: 2,getPadding(Edge.Left)returns aUnit.Undefinedvalue, but layout still pads the left side by 2. That is because Yoga falls back fromEdge.LefttoEdge.Horizontaland then toEdge.All. To get the declared left padding, check the edges in that same order:Renderables still have no getter for computed padding, margin, or border. For padding declared in points, the declared value and the computed value are the same.
Added
Nodestyle getters, such asgetHeight(),getMaxWidth(),getPadding(edge),getGap(gutter),getFlexDirection(), andgetAlignSelf(). Use them instead of style reads throughgetLayoutNode(). See Layout. (#1667)API changes and documentation: https://opentui.com/docs/releases/0.6.5
What's Changed
Full Changelog: anomalyco/opentui@v0.6.4...v0.6.5
v0.6.4Compare Source
Fixed
API changes and documentation: https://opentui.com/docs/releases/0.6.4
What's Changed
Full Changelog: anomalyco/opentui@v0.6.3...v0.6.4
v0.6.3Compare Source
A coding agent such as opencode can wait for minutes at a permission prompt in a
background tab. Before this release, the terminal could not tell the user about it.
In 0.6.3, the agent can report its state to the terminal:
This call writes one report in the
Program Status Protocol,
OSC 7501. The terminal decides how to show the report. It can use a tab
indicator, an inbox entry, or a desktop notification. A terminal that does not
implement the protocol ignores the sequence, so
setProgramStatus()does notwait for capability detection.
capabilities.program_statusonly tells you thata reply arrived. A
falsevalue can also mean that the reply has not arrivedyet.
Each report replaces one record, and a field that a report omits is gone from
the record. Send
appandtitlewith every report that needs them. A programthat runs several tasks can give each task its own record with an
id. It canthen remove that record with
clear:Records belong to the terminal, not to the renderer. OpenTUI does not clear them
when the renderer is destroyed or suspended. When the process exits, the
terminal drops
workingandblockedrecords. It keepsdoneanderrorrecords for the user to find. If the user should see the result, report
doneorerrorbefore the program exits. OpenTUI also does not wrap reports in tmux orGNU Screen passthrough. The outer terminal cannot tell panes apart or see the
program exit, so a
workingrecord from a pane would never clear.C hosts send the same report with
ot_session_control()andOT_CONTROL_PROGRAM_STATUS. The payload is anot_session_program_statusstruct,followed by the id, app, title, and message bytes. Native code checks every
report on both paths before it writes anything. A report that a terminal would
discard or only partly read fails at the call.
Added
renderer.setProgramStatus(status)andNativeSession.setProgramStatus(status)send one OSC 7501 program statusreport. They return
falsewhen OpenTUI does not queue the report, and theythrow for an invalid report. See
Program status.
(#1657)
TerminalCapabilities.program_statusistruewhen the terminalreplies to the
OSC 7501 ; ?query. The renderer sends this query at startupwith the other capability queries, but not to foot. See
Terminal capabilities.
(#1657)
ot_session_control()withOT_CONTROL_PROGRAM_STATUSand anot_session_program_statuspayload sends a program status report.OT_CAP_PROGRAM_STATUSis set when the terminal replies to the query. SeeProgram status.
(#1657)
Changed
ot_session_control()now checks the payload before the terminalphase. While the terminal is not active, an invalid payload returns
OT_INVALID_ARGUMENTinstead ofOT_INVALID_PHASE. A title with controlcharacters is one example. See Frames and output.
(#1657)
API changes and documentation: https://opentui.com/docs/releases/0.6.3
What's Changed
Full Changelog: anomalyco/opentui@v0.6.2...v0.6.3
v0.6.2Compare Source
In 0.6.1, editors started to show control characters as notation. As a result,
an editor offset is no longer the same as a JavaScript string width. The string
"\f"has a width of 0, but the editor shows it as^Lin two cells.EditBuffer.measureText()gives the correct offset, but only for a buffer youalready have. To get the offset of text that was not in an editor yet, code had
to create an
EditBufferonly to measure that text.In 0.6.2,
measureEditText()measures text without a buffer. It returns thesame value as
measureText()on an edit buffer with the same width method andtab width. Pass the settings of the editor that will hold the text.
Textareaand
Inputuse the renderer's width method and the default tab width, which is2:
C programs get the same measurement from
ot_edit_measure_text(). It takes acontext, but no edit buffer handle.
Added
measureEditText(text, { widthMethod, tabWidth })returns theeditor offset at the end of
textwithout anEditBuffer.tabWidthdefaults to the tab width of a new edit buffer. See
Editing buffers and views.
(3ab0b954a)
ot_edit_measure_text()gives the same measurement through the Cinterface. A
tab_widthover 255 fails. SeeEditing buffers and views.
(3ab0b954a)
Fixed
struck-through cell in the last column of a row no longer gives its
attributes to the next cells that the renderer draws. A row that ends in such
a cell writes 4 more bytes. See Frames and output.
(#1652)
Hangul jamo, or U+FE0F in an editor, the editor now stores its correct width.
Before, 👍🏽 took 4 cells instead of 2, so the cursor, wrapping, selection, and
Right key were wrong. See Textarea.
(#1650)
character before it, for example U+0301 typed after
abcin an editor oradded with
TextBuffer.append. The renderer drops a mark that would make a1-cell character 2 cells wide, such as U+FE0F. See
Text and terminal cells.
(#1651)
default foreground or background color (OSC 10, 11, 110, or 111) or sets
reverse video on or off (
CSI ? 5 horCSI ? 5 l). Before, rows on thescreen kept the old colors. See
Embedded terminal.
(#1649)
terminal now sends keypad Enter, keypad navigation, lock, Print Screen, Pause,
and left and right modifier keys to the child. Keypad digits reach a Kitty
child as keypad keys, and Ctrl+keypad 0 no longer arrives as a bare
0. SeeEmbedded terminal.
(#1648)
parseKeypress()no longer changes the caller'sBufferwhen itdecodes a single byte above 127 as a meta key. The input parser of the
renderer did not have this problem. See
Keyboard input.
(#1653)
API changes and documentation: https://opentui.com/docs/releases/0.6.2
What's Changed
Full Changelog: anomalyco/opentui@v0.6.1...v0.6.2
v0.6.1Compare Source
In 0.6.0,
EditBuffer.setText("a\fb")throwsNativeError. The editor placesits cursor by display cell, and a control character took no cells, so the
cursor could not move past it or delete it. In 0.5.14, which accepted
controls, the cursor in
"a\fb"could not reach column 0, Backspace stopped at"a\f", and rendering"A\x07B\x1bC\fD"wrote raw BEL and ESC bytes to theterminal. Rejecting the text stopped that, but every application then had to
remove these characters before it could edit a string.
In 0.6.1, editors keep control characters and show them the way Vim and
Neovim do. The text
"a\fb\0c\x1bd\x85e\x7ff"shows asa^Lb^@c^[d<85>e^?f. AC0 control or DEL is caret notation in two cells, and a C1 control is
lowercase hex in four cells. The notation changes only how the text looks. The
cursor stops before each control, one Backspace deletes it, and
getText(),undo, and selection copy return the original characters. Tab, carriage
return, and line feed work as before. Read-only text, such as
TextRenderable, still gives controls no cells.This has one cost. An editor offset is no longer the same as a JavaScript
string width.
Bun.stringWidth("\f")is 0, but^Ltakes two cells. Codethat calculates editor offsets from string widths, such as code that places an
extmark after a match, must ask the buffer instead.
measureText()measurestext the way the buffer lays it out, and
getTextRange()converts an offsetback to a string index:
Added
EditBuffer.measureText(text)returns the display offset at theend of
textas the buffer would lay it out. It counts each line break asone. See Editing buffers and views.
(#1636)
ot_edit_buffer_measure_text()gives the same measurementthrough the C interface. See
Editing buffers and views.
(#1636)
Changed
EditBuffer.setText(),insertText(), andreplaceText(),Textarea
initialValue,Input.value, and placeholders accept controlcharacters and do not throw
NativeError. An editor shows C0 controls andDEL as
^@to^_and^?in two cells, and C1 controls as<80>to<9f>in four cells. See Editing buffers and views.(#1636)
TextareaandInputkeeps control characters. Itremoves terminal escape sequences, including a lone ESC and an incomplete
sequence, the same way on Bun and Node. Core no longer depends on
strip-ansi. See Editing buffers and views.(#1636)
Fixed
Inputcursor use native display offsets. As aresult, they keep the correct position in text that contains control
characters. See Editing buffers and views.
(#1636)
API changes and documentation: https://opentui.com/docs/releases/0.6.1
What's Changed
Full Changelog: anomalyco/opentui@v0.6.0...v0.6.1
v0.6.0Compare Source
OpenTUI 0.5 kept the renderable tree in JavaScript. On each frame, JavaScript
walked the tree and read each node's position back from Yoga. It then made one
native call for each draw, so the cost of a frame grew with the number of
nodes and draws. In 0.6.0, native code owns the tree. Each
Renderablehas anode in a native scene, which holds the node's Yoga node and paint state.
Layout and paint setters stage their changes, and Core sends all staged
changes to native code in one call before each frame step. Native code then
lays out, clips, and paints the scene and fills the hit grid. It draws most
built-in renderables without a call to JavaScript. When no visible node has a
JavaScript hook, one native frame step lays out and paints the whole frame.
Rendering pipeline follows a
complete frame.
The built-in renderables and the React and Solid bindings keep their option
names, but a few option values now throw, such as
enableLayout: false.Custom renderables may need a little work.
Renderableno longer hasrender(),getLayoutNode(), or a protectedyogaNode. Draw inrenderSelf(),renderBefore, orrenderAfter, and report content size withsetMeasureProvider(). Paint hooks also work differently. A hook of anunbuffered renderable now receives a recording buffer: OpenTUI stores the
hook's draw calls, and native code plays them back at the node's place in
paint order. Painting never stops to call JavaScript, so a hook cannot tear
the frame. But a hook can no longer read the frame's cells. To read cells, a
hook must draw into a buffer that the renderable owns and compose that
buffer, or the work must move to a post-process function. With
buffered: true, the hooks draw into such a buffer, and OpenTUI composes it.Custom renderables shows a complete
example.
Native rendering resources now belong to one owner, a native Context.
Buffers, text buffers, views, syntax styles, images, and scene nodes cross the
native boundary as generational handles instead of raw pointers. A stale
handle fails with an error instead of touching freed memory, and destroying a
Context releases everything that it owns. The factories that used to create
resources without an owner now take one. For a resource that a renderer
draws, pass
renderer.nativeScene:Image factories take only a
ResourceContextas theirowner. For therenderer's Context, pass
renderer.nativeScene.resourceContext. Without arenderer, create a Context with
new ResourceContext({ objectCapacity, renderCellsMax }), and call itsdestroy()method when you are done.objectCapacityis the initial numberof object slots, and
renderCellsMaxlimits the cells in each buffer.API and symbol index lists each removed or
changed API with its replacement.
Terminal transitions are now asynchronous.
suspend()andresume()returnpromises.
destroy()still returns at once, but the terminal restoration andthe remaining output finish later. Before you reuse the streams, or before a
deliberate exit, await
renderer.closed:The native library now has a C interface.
opentui.hdeclares a C ABI ofot_*functions, and theopentuiZig module gains the same Context, scene,and Session model. A C or Zig program can build a scene and write frames with
no JavaScript runtime. The ABI is experimental, so use the header, library,
and bindings from the same revision.
Native rendering starts with a box and a label.
One fix changes colors in some SSH sessions. Inside an SSH or mosh login,
OpenTUI detects remote mode automatically. In that mode, it used to stop
reading the environment before it read
TERMandCOLORTERM. As a result,every remote terminal got truecolor output, and a 256-color terminal such as
GNU screen 4.x showed the UI without color. OpenTUI now reads these two keys.
This has a cost. A truecolor terminal that reaches the server with
TERM=xterm-256colorand noCOLORTERMused to get exact colors by accident.Examples are iTerm2 and WezTerm over a stock macOS ssh client, which does not
forward
COLORTERM. They now get 256-color approximations. A Kitty XTVERSIONreply still turns on truecolor. To keep truecolor in other terminals, export
COLORTERM=truecoloron the server, forward it withSendEnv COLORTERMandAcceptEnv COLORTERM, or pass it in the renderer'senvironmentoption.Breaking changes
Renderable.render(),updateLayout(),updateFromLayout(),canReuseRenderCommandList(),getLayoutNode(), the protectedyogaNode,the
RenderCommandtype, andRootRenderable.calculateLayout()areremoved. Draw in
renderSelf(),renderBefore, orrenderAfter, and usesetMeasureProvider(),invalidateIntrinsicSize(), andgetLayout()forsize and layout. Protected members such as
_x,_y,getScissorRect(),and
_getVisibleChildren()are also removed. Usex,y,screenX, andscreenY, and theviewportCullingoption ofScrollBox. SeeCustom renderables.
(#1479)
enableLayout: falseoption throws.on("resized")andon("layout-changed")throw on a renderable that is not the root, wherethese listeners never ran. Use
onSizeChangeinstead. SeeLayout.
(#1479)
that cannot read cells, and
renderer.nextRenderBufferaccepts drawing onlyin a post-process function.
buffer.buffersworks only in a post-processfunction. Elsewhere, use
buffer.withBuffers(callback). To read or changecells in a hook, set
buffered: true, or draw into a buffer that you own andcompose it. For the whole frame, use a post-process function. See
Rendering pipeline.
(#1479)
addToHitGrid(),pushHitGridScissorRect(),popHitGridScissorRect(), andclearHitGridScissorRects()are removed fromCliRendererandRenderContext. Native code adds a hit area for eachvisible node, and
renderer.hitTest(x, y)queries the hit grid. A customRenderContextmust implementnativeScene,requestAnimationFrame(), andcancelAnimationFrame(). SeeInteraction, focus, and selection.
(#1479)
OptimizedBuffer.create(),TextBuffer.create(),EditBuffer.create(),SyntaxStyle.create(),SyntaxStyle.fromStyles(),and
SyntaxStyle.fromTheme()require an owner, and theptrproperties ofbuffers, views, and styles are removed. Pass
renderer.nativeScene, or aResourceContextwhen no renderer exists. Resources from different ownerscannot be used together, and the resources that a renderer owns stop
working when the renderer is destroyed. See
How Core uses native.
(#1479)
suspend()andresume()return aPromise<void>, anddestroy()restores the terminal asynchronously. Await the transitions, andawait
renderer.closedbefore you reuse the streams. Both methods throwwhile another transition is pending, and when the terminal is not set up,
for example on a test renderer or after
destroy(). SeeLifecycle and cleanup.
(#1479)
useThreadoption,renderer.useThread,renderer.rendererPtr,dumpBuffers(),dumpOutputBuffer(), and theOTUI_NO_NATIVE_RENDERenvironment variable are removed. RemoveuseThread. Instead ofdumpBuffers(), use test frame capture orrenderer.currentRenderBuffer.withBuffers(). Instead ofdumpOutputBuffer(), give the renderer a customstdout. Instead ofOTUI_NO_NATIVE_RENDER, usecreateTestRenderer(). SeeRendering diagnostics.
(#1479)
Clipboardclass is removed. Userenderer.copyToClipboardOSC52()andrenderer.clearClipboardOSC52(), orcreateClipboard()withcreateHostClipboard()andcreateRendererClipboardAdapter(renderer). SeeClipboard.
(#1479)
requestAnimationFrame,cancelAnimationFrame, orwindow. Userenderer.requestAnimationFrame()andrenderer.cancelAnimationFrame().See Animation and Timeline.
(#1479)
destroy(), renderable constructors, the timelineengine.attach(), and most renderer methods throw, for examplesetTerminalTitle(),copyToClipboardOSC52(),getStats(), andhitTest().requestRender()andresize()do nothing. Checkrenderer.isDestroyedfirst. SeeLifecycle and cleanup.
(#1479)
error, or closes or finishes beforethe renderer closes it, the renderer destroys itself and
renderer.closedrejects. Handle the rejection of
closed. SeeLifecycle and cleanup.
(#1479)
RangeErrorfor fractional,NaN, orinfinite coordinates and sizes.
drawText()and box titles throwRangeErrorfor text larger than 64 KiB of UTF-8.setCell(),setCellWithAlphaBlending(),drawChar(), anddrawText()throwNativeErrorfor attribute bits 8 to 31. In a paint hook, the frame failsinstead. See Buffer API.
(#1479)
EditBuffer.setText(),insertText(),insertChar(), andreplaceText(), the same Textarea and Input methods, TextareainitialValue,Input.value, and bothplaceholderoptions throwNativeErrorfor control characters other than tab, carriage return, andline feed. DEL and C1 control characters also throw. Remove these
characters first. See Editing buffers and views.
(#1479)
that CI tests. Bun 1.3.0 to 1.3.3 pass some FFI pointer arguments as wrong
addresses, Bun 1.3.4 to 1.3.6 can crash after a Worker exits, and Bun 1.3.7
can hang while it loads modules. See
Runtime and platform support.
(#1479)
RenderLibmethods, such ascreateRendererand
bufferDrawText, and the handle types, such asRendererHandleandOptimizedBufferHandle, are removed. Use the public classes and theContext*Handle,SessionHandle, andSceneNodeHandletypes. SeeHow Core uses native.
(#1479)
YogathrowsYogaErrorfor invalid arguments, andConfig.free()throws while nodes from that config remain. Measure anddirtied functions must return synchronously and must not change Yoga nodes.
See Yoga API.
(#1479)
session.write()can throwOutputPressureErrororRangeError.colsandrowshold the requested size until the renderer attaches, andonCloseruns at logical close, before the renderer finishes closing. SeeSSH.
(#1479)
createRendererandbufferDrawText, are removed. Use theot_*functions inopentui.h. InZig, the global grapheme and link pools are removed, so
OptimizedBuffer.init()andCliRenderer.create()require alink_pool.GraphemePool.acquire()andLinkPool.acquire()replacealloc(). Theyreturn an ID that holds one reference, which
decref()releases. SeeC and Zig.
(#1479)
Added
renderer.requestAnimationFrame()andrenderer.cancelAnimationFrame()schedule one-shot frame callbacks for onerenderer.
getTimelineEngine(renderer)andcreateTimeline(options, renderer)give each renderer its own timelineengine. See Animation and Timeline.
(#1479)
renderer.closedresolves after destruction writes the remainingoutput and native teardown finishes. It rejects when the output fails or
does not finish within one second. See
Lifecycle and cleanup.
(#1479)
renderer.requestResize(width, height)debounces size changesfrom a custom terminal and applies only the latest size. See
Renderer.
(#1479)
nativeSceneWorkBudgetoption lets a frame yield to the eventloop during preparation. Painting still runs in one native call. See
Renderer.
(#1479)
environmentoption gives terminal environment values to onerenderer, for example
{ TERM: pty.term }from an SSH client. These valuesreplace the
forwardEnvKeysvalues with the same names. In an automaticallydetected SSH login, only
TERMandCOLORTERMtake effect unless you setremote: true. SeeTerminal capabilities.
(#1603)
ResourceContextowns native resources without a renderer, andNativeErrorreports a failed native call with itsoperationandstatus. Image factories accept aResourceContextin theirowneroption, such as
renderer.nativeScene.resourceContext. SeeHow Core uses native and
NativeImage.
(#1479)
setMeasureProvider(),invalidateIntrinsicSize(),getLayout(),refreshHooks(), anddefineNativeIntegration().TextRenderableandCodeRenderablegetdrawToBuffer(), andOptimizedBuffergetswithBuffers()for scoped cellaccess. See Custom renderables.
(#1479)
TestRendererSetup.dispose()and[Symbol.asyncDispose]()destroy the test renderer and wait for
renderer.closed.ManualClock.pendingTimerCountcounts the scheduled timeouts and activeintervals. See Testing.
(#1479)
opentui.hdeclares an experimental C ABI, and theopentuiZig module gains the same Context, scene, and Session model. A
Context's object table starts at
object_capacityslots and doubles when itis full, up to 4,194,304 slots or
object_capacity, whichever is larger.Past that limit, object creation fails with
OT_OBJECT_LIMIT. SeeNative rendering.
(#1479,
#1622)
its XTVERSION reply names it. See
Terminal capabilities.
(#1566)
COLORTERM,TERM_PROGRAM, andTERM_PROGRAM_VERSIONenv requests that arrive before the shell request,with values of at most 256 bytes. It rejects other keys. The renderer gets
these values with the client's PTY
TERM, so capability detection sees theclient's color depth and hyperlink support, and GNU Screen or tmux from the
TERMprefix. A client withTERM=xterm-256colorand noCOLORTERMnowgets 256-color output instead of truecolor. To keep truecolor, add
SendEnv COLORTERMto the client's ssh configuration. SeeSSH.
(#1603)
Changed
hit grid, so JavaScript no longer walks the tree on each frame. JavaScript
work in a frame now grows with changes and hooks, not with the number of
renderables. Some built-in renderables, such as Select and ScrollBox, still
run JavaScript hooks. See
Rendering pipeline.
(#1479)
appending text use less time and memory. See
Editing buffers and views.
(#1582)
path, and
drawText()writes printable ASCII without copying it. SeeBuffer API.
(#1591)
EmbeddedTerminalRenderableencodesmetaas Alt, and onlysuperencodes as Super. Core's key parser setsmetafor Alt, so Alt+bnow reaches a legacy child as
ESC b, notb. On macOS, an Alt modifierreaches the child as Alt, because the host terminal already applied its
Option setting. See Embedded terminal.
(#1594,
1b25377b6,
f0d7d1d3b,
be14991e6)
root.render()does nothing when the renderer is destroyed, forexample after
exitOnCtrlC. See React bindings.(#1604)
render()does not mount when the renderer is destroyed, forexample after
exitOnCtrlC. See Solid bindings.(#1604)
Fixed
reads the color depth from
TERMandCOLORTERM. A 256-color terminal suchas GNU screen 4.x gets 256-color output instead of truecolor that it cannot
show. See Terminal capabilities.
(#1624)
longer loses or overwrites a wide character at the end of the row. Tabs in
captured stdout count from the start of the terminal row and stop at the
last column. See Renderer.
(#1597,
#1617)
width keeps its last cell. Output no longer erases the footer when fewer
than two rows remain above it, for example with the default footer in a
terminal of 13 rows or fewer. See Renderer.
(#1581,
#1618)
append, insert, or undo adds to that line later.
setText()andreplaceText()drop highlights on lines past the new line count, sogetHighlightCount()andgetLineHighlights()no longer report them. SeeEditing buffers and views.
(#1621,
#1601)
tab, not inside it. This applies to
EditBuffer.moveCursorUp()andmoveCursorDown(),EditorView.moveUpVisual()andmoveDownVisual(), theTextarea arrow keys, and
EditorView.setViewport()withmoveCursor. SeeTextarea.
(#1596)
placeholder of more than one row. The next edit no longer fails with
InvalidArgument. See Textarea.(#1619)
narrower wrap. Before this fix, a 94 KiB text wrapped at width 1 and then at
width 80 kept about 46 MB. See Text.
(#1602)
is one non-ASCII character. On Dvorak, Ctrl+J no longer matches
exitOnCtrlC, and Ctrl+ㅊ still matches Ctrl+C. SeeKeyboard input.
(#1599)
.tsxfiles andtsxMarkdown fences use the tree-sitter TSXgrammar through a separate
typescriptreactparser. JSX closing tags nolonger highlight as regular expressions. See
Syntax highlighting with Tree-sitter.
(#1598)
#lua-match?predicates to#match?in bundled and registered queries when it can translate thepattern. TypeScript and Zig identifiers no longer all get the
typeandconstantcaptures. SeeSyntax highlighting with Tree-sitter.
(#1620)
EmbeddedTerminalRenderablesends F1 to F12 with or withoutmodifiers, keys that the host terminal sends in SS3 form, and the keypad
Begin key. It sends F13 to F25 to a child in Kitty keyboard mode. See
Embedded terminal.
(#1616)
21 color queries, and it applies an OSC 10 or OSC 11 that sets only one
default color. OSC 110 resets the foreground to white, and OSC 111 resets the
background to black. See
Embedded terminal.
(#1615)
Device Attributes queries. fish 4.1 and later no longer stall for about two
seconds at startup. See
Embedded terminal.
(#1595)
API changes and documentation: https://opentui.com/docs/releases/0.6.0
What's Changed
Configuration
📅 Schedule: (UTC)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
👻 Immortal: This PR will be recreated if closed unmerged. Get config help if that's undesired.
This PR was generated by Mend Renovate. View the repository job log.