Close gap #11 (chart integration) from the datagrid gap analysis, split as
usual into testable headless logic plus a thin DSL widget:
- chart.rs (measured): candle bucketing (OHLC from a price series), series
bounds, line-point mapping with the reference's 8% padding, the vertical
strips that trace a polyline with axis-aligned quads, candle body/wick
geometry with up/down classification, and the 1/2/5×10^k axis tick step.
- market.rs (measured): a deterministic live market — the reference's
splitmix-style `mix64`, a HISTORY-capped random walk per symbol, lazy
per-row symbol growth (so any selected row charts), tick() with roll-off,
and the derived stats (last/change/pct_change/day_range/candles).
- trend_chart.rs: a `TrendChart` widget (excluded from coverage like
grid.rs) that colours and draws chart.rs output — gridlines, a polyline
for a series, or candle bodies + wicks — via `set_series`/`set_candles`.
- workspace.rs glue: a 220px chart panel under the grid (line + candlesticks
side by side) fed from a 0.25s `Timer` ticker; selecting a grid row
switches the charted symbol and updates the title label.
Engine untouched. UI controllers: 112 tests (+16 chart/market). Coverage:
ui-controllers 99.32% (floor 96), chart.rs 100%, market.rs 99.36%.