-
#116
31fc1aeThanks @natemoo-re! - Changesbordersides to reserve layout space instead of drawing as an overlay. Each border width is now added to the padding on its side, so content and children are laid out inside the border rather than collapsing behind the border glyphs.This is a breaking change for callers who compensated for the old behavior by setting
layout.paddingequal to the border width — that padding is now additive and double-counts. Remove the workaround:{ border: { color, left: 1, right: 1, top: 1, bottom: 1 }, - layout: { padding: { left: 1, right: 1, top: 1, bottom: 1 } }, }A
borderof 1 with no padding now reserves one cell per bordered side;borderof 1 pluspaddingof 1 reserves two, measured inward from the border edge. -
#113
6efecfbThanks @natemoo-re! - Adds a newterm.update()method to resize the terminal without reinitializing the WebAssembly module.If you previously ran
createTerm({ width, height })on resize events, you should replace that with an explicitterm.update({ width, height })call. -
#103
b9c10b3Thanks @cowboyd! - Adds acaretproperty to text elements that positions the terminal's hardware cursor at a code-point offset within the text, resolved through wrapping and wide-character widths. The cursor shows only while a caret is declared; an offset at or past the content length places it one cell past the last character, giving text inputs a real, movable cursor.
-
#89
2ebc906Thanks @natemoo-re! - Shrinks the bundled WASM ~35% (156 kB → 101 kB raw) by compiling out Clay's unused debug-inspector UI. -
#120
b371922Thanks @natemoo-re! - Scales the renderer's memory arena to the terminal grid instead of a fixed default, cutting the reservation for an 80×24 grid ~51% (4.85 MB → 2.39 MB) with no change to render performance. -
#49
d4bc79bThanks @natemoo-re! - Fixes width measurement for non-printable, control, and surrogate code points, which now measure as oneU+FFFDcell to match what the renderer draws (width data regenerated against Unicode 17).
-
#27 Thanks @cowboyd! - Adds frame-to-frame transitions. Visual properties now interpolate between renders, covering the subset of animations Clay supports today.
-
#96 Thanks @rauhryan! - Adds per-side border support, so each edge of an element can be styled independently.
- #85 Thanks @natemoo-re! - Fixes nested clipping so a nested clip restores its parent's region instead of disabling clipping entirely.
-
#99 Thanks @cowboyd! - Renames the published package to
@bomb.sh/tty. The internalclayterm.wasmbinary name is unchanged. -
#93 Thanks @rauhryan! - Adds glyph-cell text backgrounds, so text can carry a per-glyph background color.
-
#94 Thanks @rauhryan! - Adds border-cell backgrounds, so border cells can carry their own background color.
-
#29 Thanks @rauhryan! - Expands the floating parameters on
open()to cover more Clay options:expand,attachPoints,pointerCaptureMode,clipTo, andzIndex, exposed as string-literal enums. -
#42 Thanks @dreyfus92! - Switches alignment properties to string literals instead of numeric magic values.
-
#17 Thanks @cowboyd! - Adds
snapshot()to pre-pack a directive subtree into its binary transfer encoding, so unchanged subtrees are not re-encoded every frame. -
#22 Thanks @cowboyd! - Adds
RenderResult.info.get(id)for lazy, computed element bounding-box lookup. -
#23 Thanks @cowboyd! - Surfaces Clay layout errors per render as
errors: ClayError[]onRenderResult. -
#14 Thanks @cowboyd! - Decouples alternate-buffer switching from clearing.
alternateBuffer()accepts{ clear };clear: falseuses xterm mode 47 to preserve alt-buffer contents. -
#35 Thanks @natemoo-re! - Cuts npm install size ~63% (723 kB → 268 kB). Minimum Node is now v22.
-
#50 Thanks @natemoo-re! - Encodes the bundled WASM with brotli + Z85 instead of base64, cutting install size a further ~57% (270 kB → ~115 kB).
-
#20 Thanks @cowboyd! - Breaking: Renames the numeric
Opdiscriminant todirectiveandopen()'snameargument toid. Element IDs are hashed with a constant seed, so ensuring uniqueness is now the caller's responsibility. -
#33 Thanks @rauhryan! - Improves packed-string overflow errors. Oversized text and element-id payloads now throw a descriptive
RangeErrorinstead of corrupting the buffer. -
#87 Thanks @natemoo-re! - Leaves the terminal default foreground for uncolored text, so uncolored glyphs no longer emit concrete white — fixing appearance on light-background terminals.
-
#24 Thanks @cowboyd! - Adds the MIT
LICENSEfile to match the declared license.
-
#4 Thanks @cowboyd! - Adds a line rendering mode (
render(ops, { mode: "line" })) for newline-separated, pipe-friendly output. Therowoption becomes a 1-based render-time option matching DSR/CPR. -
#9 Thanks @cowboyd! - Inlines the WASM binary into the generated TypeScript module. This drops the
node:fs/promisesread and--allow-read, so the module imports from non-file://URLs. -
Adds a
termcodesmodule and makesCursorEventvalues 1-based to match the terminal's native DSR/CPR format.
-
#7 Thanks @cowboyd! - Accepts signed int32 colors in the validator, so full-alpha
rgba()colors (which serialize to a negative int32) no longer fail validation. -
Allows cell fill across different initialization types.
- Parses DSR cursor-position reports and renames the row-offset render option to
top.
-
Adds a
top(row offset) option tocreateTerm()for region-mode rendering. -
Adds composable terminal settings that automatically revert when disposed.
-
Adds pointer events and interactive hover to the Clay render pipeline, including the ability to capture mouse events.
-
Adds progressive Kitty keyboard protocol support, with
"0"to reset all progressive enhancements and numpad Enter/Add handling.
- Adds a Kitty keyboard protocol (CSI u) input parser.
- Preserves the parent background when a text background is set to default.
- Fixes WASM memory allocation and adds an ops-buffer overflow check.
- Exports the
inputmodule frommod.ts.
-
Adds a terminal input parser.
-
Adds ops validation backed by TypeBox schemas.
- Loads the WASM file with
node:fs/promises.
- Fixes JSR publish by using token auth for scope authorization.
- Initial release of the terminal rendering backend for Clay, compiled to WebAssembly.
render()returns aUint8Arrayof terminal output. Thanks @cowboyd!