bombshell-dev
tty
Blog
Docs
Changelog
Blog
Docs
Changelog
Overview
Branches
Benchmarks
Runs
Performance History
Latest Results
style: clang-format
nm/cell-grapheme
1 day ago
style: deno fmt
nm/cell-grapheme
1 day ago
fix: bordered boxes now reserve layout space for their border sides Clay doesn't account for border widths in layout โ borders were drawn as visual overlays, so any element with border width > padding had its content collapsed behind the border glyphs (or, for fit-height boxes, collapsed to a single row with top and bottom glyphs overlapping and children invisible). Fix: at pack time, compute effective padding per side as max(userPadding, borderWidth). Border glyphs draw in the same cells as before; only the Clay layout values change so the engine reserves those cells. Semantics of the max rule: - No explicit padding: border width becomes the effective padding; content lands inside the border, not behind it. - padding == borderWidth (prior workaround): max evaluates to the same value, no double-reservation; these elements render identically. - padding > borderWidth: extra padding provides breathing room inside the border, measured from the border edge inward. Callers who set padding == borderWidth as a workaround are unaffected. Downstream compensators (e.g. lgtm.shop Panel) will render identically until they drop the manual compensation on their next pin bump. Resolves Open Decision #4 in specs/renderer-spec.md.
fix/border-reserves-space
1 day ago
test(layout): regression tests for grow() + padding content-box bug Four cases covering the fixed behavior: (a) fixed() and grow() roots produce identical child positions for a right-aligned row (text + grow spacer + text) with symmetric padding. (b) grow() root with asymmetric padding โ R lands at the correct column respecting the larger right pad, not overflowing it. (c) Two levels of grow() nesting โ each box preserves its own content box so R remains inside the innermost right padding. (d) Height axis โ grow() root bounds.height equals terminal height even when content rows + vertical padding exceed it (catches the same minDimensions bug on the Y axis).
fix/nested-grow-right-padding
2 days ago
build(deps): bump the github-actions group across 1 directory with 3 updates (#111) Bumps the github-actions group with 3 updates in the / directory: [actions/checkout](https://github.com/actions/checkout), [actions/setup-node](https://github.com/actions/setup-node) and [CodSpeedHQ/action](https://github.com/codspeedhq/action). Updates `actions/checkout` from 7.0.0 to 7.0.1 - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0...3d3c42e5aac5ba805825da76410c181273ba90b1) Updates `actions/setup-node` from 6.4.0 to 7.0.0 - [Release notes](https://github.com/actions/setup-node/releases) - [Commits](https://github.com/actions/setup-node/compare/48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e...820762786026740c76f36085b0efc47a31fe5020) Updates `CodSpeedHQ/action` from 4.18.2 to 5.0.1 - [Release notes](https://github.com/codspeedhq/action/releases) - [Changelog](https://github.com/CodSpeedHQ/action/blob/main/CHANGELOG.md) - [Commits](https://github.com/codspeedhq/action/compare/4e969336ab9acd4f6f8d025fdd793292b0835df0...88472375d0a4572cf70a9f1fe3a4e0ab8da1b924) --- updated-dependencies: - dependency-name: actions/checkout dependency-version: 7.0.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: github-actions - dependency-name: actions/setup-node dependency-version: 7.0.0 dependency-type: direct:production update-type: version-update:semver-major dependency-group: github-actions - dependency-name: CodSpeedHQ/action dependency-version: 4.18.5 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: github-actions ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
main
2 days ago
โจ hardware cursor positioning via text() caret (#103) * spec(renderer): add hardware cursor visibility and positioning * ๐ spec(renderer): note ยง7.6 carve-out in ยง11.2 output description * feat(term): emit hardware cursor at text() caret offset * ๐งช test(term): cursor hides on caret-present โ caret-absent transition * ๐งช test(term): no cursor bytes when no caret ever declared * ๐งช test(term): caret at end-of-content positions one cell past last char * ๐งช test(term): caret lands on correct line after text wrapping * ๐งช test(term): caret accounts for wide-character cell widths * ๐งช test(term): first caret declaration wins when multiple present * โจ example(term): interactive text input demonstrating caret * ๐ AGENTS.md: reflect ยง7.6 cursor management exception * ๐งช test(term): document v1 limitation for caret on empty text * ๐จ example(term): simplify layout and fall back to space for empty input * linting & formatting * ๐ spec(renderer): specify caret behavior on empty text content Adds a normative paragraph to ยง7.6 stating that a `caret` declaration on empty content places the cursor at the text element's origin โ the cell where the first code point of `content` would be drawn if it were a single space. Frames the empty-content case as a rendering commitment the renderer must honor, without prescribing mechanism. * โจ feat(term): resolve caret cell on empty text content Substitute a single-space slice for empty text nodes carrying a caret declaration so the layout engine emits one cell of geometry at the text element's origin. Replaces the v1-limitation test with one asserting the spec's outcome (CUP to row 1, col 1 + DECTCEM-show). * ๐ฅ example(term): drop empty-value workaround now handled by renderer The `value || " "` fallback previously worked around the renderer's inability to attach a caret to an empty text node. That case is now handled directly by the renderer, so the example can pass the raw value through and let the caret resolve at the input box's origin. * ๐ spec(renderer): specify caret behavior at wrap boundaries * ๐ fix(term): resolve caret cell during the render walk Precompute the caret's byte offset within its text node at OP_TEXT decode time, then place the caret cell as a side effect of render_text's existing walk: at the top of each iteration, if the current pointer matches the target byte offset, record the cell. Two edge cases fall out of the same mechanism. A slice whose first byte is already past the target (Clay dropped whitespace at the wrap seam) snaps the caret to the slice's origin โ the start of the next wrapped line โ rather than orphaning it off the end of the previous line. And the trailing cell of the last walked caret slice is remembered as the end-of-content fallback for offset == content-length. Deletes locate_caret, which walked slices with a code-point accumulator that diverged from the caller's original offset whenever the layout engine's wrap pass either dropped or retained-off-screen the seam whitespace. Adds tests covering both wrap-boundary cases and tightens the previously-lax "correct wrapped line" assertion to an exact cell. * make tests visual
main
3 days ago
fix(input): bail OSC code accumulation past 22 to prevent overflow The numeric OSC code loop accumulated digits with no cap, so a long digit run (e.g. ESC ] 9999...) would overflow the int accumulator. Since 22 is the only code parse_osc accepts and the accumulator only grows, bail with PARSE_ERR as soon as it passes 22. Addresses review feedback from @dreyfus92 on #101.
nm/feat/cursor
4 days ago
fix(term): use bare set OSC 22 so pointer shapes work on Ghostty The tracker emitted the kitty push/pop stack form (ESC]22;>shape and ESC]22;<). Ghostty's OSC 22 parser treats the whole payload after "22;" as a literal shape name, so ">shape" is not a valid shape and is dropped โ the pointer never changed on Ghostty (and any other set-only terminal). Switch to the portable bare set form: set the shape on enter (ESC]22;shape) and restore the base by setting "default" on leave. kitty and Ghostty both honor this. The trade-off is that we assume the base shape is "default" rather than restoring a non-default prior shape; the push/pop helpers remain exported for callers that target kitty and want exact save/restore.
nm/feat/cursor
4 days ago
Latest Branches
CodSpeed Performance Gauge
-16%
fix: preserve grapheme clusters (combining marks) in cell emission
#114
1 day ago
07a84e9
nm/cell-grapheme
CodSpeed Performance Gauge
0%
fix: box-sizing behavior with borders
#116
2 days ago
6203ef3
fix/border-reserves-space
CodSpeed Performance Gauge
0%
fix: nested grow() children overflow parent padding on grow()-sized padded roots
#115
2 days ago
e7a31bd
fix/nested-grow-right-padding
ยฉ 2026 CodSpeed Technology
Home
Terms
Privacy
Docs