Game catalog: replaced emoji badges with the story field (word-wrapped)
and external links listed as label + URL. GameModel gains story and
external_links attributes.
New message: navigates back to idle immediately after a successful send
instead of sitting on the sent confirmation screen.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Bug: frozen_string_literal: true makes '' a frozen String literal.
@input << ch raised FrozenError immediately on any keystroke, causing
the TUI runner to exit. Fixed by using +'' (mutable string) for @input
everywhere it is initialised or reset.
Also removed the section header text lines that were being drawn inside
each page's content area — the page title is already embedded in the
right panel's box border, so the inner header was redundant.
Adjusted content offsets and scroll window sizes to use the reclaimed row.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Full blue background (screen_fill), double-line bordered panels side
by side: left panel for the menu, right panel for content. The right
panel's title bar shows the current page name, username and online count.
Color theme (THEME constant) maps to combined fg+bg ANSI codes so all
elements look native on the blue background: bright cyan borders, white
normal text, yellow labels, black-on-cyan selection highlights.
Status bar at the bottom mimics the NC function key bar with bright key
labels on cyan background.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Each BBS screen is now a declarative `page` block. Shared rendering
logic (wiki list, scroll helpers, wiki page opening) lives in a `helpers`
block. The persistent chrome (header bar, sidebar menu, footer) is
defined once in a `chrome` block rendered every frame.
The main flow no longer reaches into runner internals: context flows
through naturally via the updated rubbs `tui` step.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
include BBS::Color at top level — c() available everywhere
including instance_eval blocks and OutputBuilder.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
sep / line / cols / para / badge methods replace manual string
concatenation. badges auto-flush before the next content line.
render { } wraps a block in the builder via instance_eval.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
All content rendering now lives in bbs.rb via the rubbs DSL.
fetch/pick handle wiki list + article drill-down; output handles
the multi-line game catalog. display.rb is gone.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>