Replace clear-then-write pattern with overwrite-in-place: move cursor
up to start of rendered area and write new content directly over old
lines. Only clear trailing lines if the new render is shorter. This
removes the visible blank frame between clear and re-render.
- Show terminal container BEFORE calling fitAddon.fit() so it can
measure actual dimensions (was measuring display:none → 0 height)
- Read actual terminal rows from JS after init (getDimensions)
- Remove max-height:600px CSS constraint, let terminal fill viewport
- Revert preRender approach that caused flickering on arrow selection
- Height is now dynamic (instance property) instead of hardcoded 30
- Fix arrow selection line count calculation (overcounted by 1 due to
trailing newline, causing progressive line truncation on each redraw)
- Replace sync Loreline bridge with queue-based async pattern to avoid
"Cannot wait on monitors" WASM deadlock
- Add bounded input buffer (8 keys, DropOldest) to prevent held-key
accumulation
- Set Spectre.Console Profile.Height on all AnsiConsole.Create calls to
prevent PlatformNotSupportedException on Console.WindowHeight
- Add explicit Loreline.dll reference + TrimmerRootAssembly for WASM
- Use MSBuild CopyGameContent target instead of Content/Link for static
file serving in Blazor WASM
- Add WASM guards for file I/O in ContentRegistry, LocalizationManager,
AdventureEngine
- Enforce min 120x30 terminal dimensions in xterm.js
- Add Playwright E2E tests (6 tests: page load, language selection,
full flow, multi-box progression, extended play, adventure)
Compile the game to WebAssembly so it runs entirely client-side in the browser.
Uses xterm.js for terminal emulation and Spectre.Console off-screen rendering
for full ANSI output fidelity. Saves use localStorage. CI deploys to itch.io
via Butler on push to main.