tuika 0.10.0
Released 2026-08-17. crates.io · docs.rs · GitHub release
Released alongside tuika-charts 0.1.1, tuika-codeformatters 0.4.3,
tuika-html 0.1.3, and tuika-mermaid 0.3.1. Their tuika dependency
requirements now track 0.10.
Added
- Components:
ProgressBar::label_stylestyles the caption set bylabel, the same theme-by-default/explicit-override pattern ascolors. The trailingNN%ofpercentstays separate chrome on the theme’s muted style. - Components:
SelectionAnchorselects howTableandSelectListwindow themselves around the selection when they resolve their own window —Center(today’s recentering behavior, still the default) orEdge, which moves the window only when the selection would leave it. - Virtualization:
VirtualWindow::keepingis the edge-following policy as a pure function of the caller’s current start;SelectViewportState::resolvenow uses it, so the persistent and stateless paths share one implementation. - Charts: both axes carry tick labels, so a chart states its scale instead
of leaving the reader to guess it. Ticks land on round values (a power of ten
times 1, 2, 2.5, or 5) and label precision follows the tick step.
Axis::formatreplaces the numeric formatter,Axis::tickstargets a tick count, andAxis::hiddenopts an axis out. Labels are drawn as cells in both render modes — the graphics image covers the plot only — so the same numbers land in the same cells whether or not the terminal has graphics.
Changed
- Breaking: Mouse capture is now opt-in in alternate-screen mode, preserving native OSC 8
link activation, terminal selection, and scrolling by default. Applications
that need pointer or wheel events use
ScreenMode::with_mouse_capture,MouseCapture::Enabled, orAltScreen::enter_with_mouse_capture; captured sessions may use runner selection andctrl_click_urlas application-side fallbacks. MarkdownState::linkspreserves labeled and bare hyperlink targets across incremental updates, settled-prefix caching, wrapping, and resize, so hosts drawing streaming lines can apply native OSC 8 links without re-parsing.- Charts:
Axis::categoriesnames positions instead of measuring them, which is what most bar and area charts actually want.Chart::stackcombines bar and area series —Stack::Normalsums them,Stack::Percentscales every position to 100 — while unstacked bar series split their category band into slots and sit side by side.Chart::horizontalswaps the axes so a category gets a whole row of width for its name.Series::markersandSeries::labelsannotate samples,Chart::focusmarks one position and lists every series’ value there, andSeries::donutwithChart::centerdraws a ring. A rule is drawn along zero whenever the value domain straddles it. - Breaking: chart axis labels are on by default, so a chart that previously
filled its whole area now gives a few columns to the y-axis gutter.
Chart::x_axisandChart::y_axiswithAxis::hiddenrestore the old geometry exactly; the x labels reuse the margin row the plot already reserved and cost no plot height. Aligning both renderers on one cell grid also removed the graphics path’s internal margins, so a graphics plot now covers the same data cells its portable counterpart does.
Fixed
- Charts: graphics-mode plots are transparent where nothing is drawn rather than filled with the theme background, so cell-drawn text — value labels, a donut’s centre text — is no longer hidden by the image composited over it.
- Charts: automatic y domains reach the zero baseline whenever a chart
carries a bar or area series. These marks encode their value in the filled
span, so a domain starting at the data minimum drew a bar of 1 beside a bar
of 5 as a sliver beside a full column — a ratio the data never contained.
Line, step, and scatter series are read as positions and keep the tighter
domain that resolves their variation;
Chart::y_domainstill overrides both.