The mobile keybar was a small floating overlay that obscured terminal
content. Now it's a full-width bar docked to the bottom using flexbox
layout, so the terminal shrinks to accommodate it. Buttons use 44px
height (Apple HIG recommended touch target) and evenly fill the width.
Also uses 100dvh for correct mobile viewport sizing.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Update ghostty-web to b0aa99e which wraps the requestAnimationFrame
render loop in try/catch. Previously, any exception in renderer.render()
or wasmTerm.getCursor() would silently kill the loop, permanently
freezing the terminal canvas while input continued to flow normally.
The fix ensures requestAnimationFrame is always re-scheduled and logs
errors to console for diagnosis. This addresses intermittent terminal
stalls that were not correlated with resize, focus, or user interaction.
- Add package.json with @xterm/xterm 6.0 and all addons
- Create terminal.ts client with WebSocket protocol support
- Bundle with Bun (bun run build -> terminal.js)
- Remove textual-serve dependency from pyproject.toml
- Remove canvas monkey-patch workaround (no longer needed)
- Add scrollback support (configurable via data-scrollback)
- Update static file routing to serve from /static/
- Add Makefile targets: bundle, bundle-watch, bundle-clean
- Update tests for new static path structure
Benefits:
- Full control over xterm.js configuration
- Scrollback history now works (default 1000 lines)
- Custom font family without workarounds
- Smaller footprint (no unused Roboto Mono fonts)
- Latest xterm.js 6.0 features available