Skip to content

release: 3.2.0 - #15

Merged
CtrlAltDevelop merged 44 commits into
mainfrom
develop
Oct 15, 2026
Merged

CtrlAltDevelop merged 44 commits into
mainfrom
develop

Conversation

@CtrlAltDevelop

Copy link
Copy Markdown
Owner

Release 3.2.0.

Added

  • ProgressBars — pill, block or segmented progress bars with a target mark, touch and a draw-in animation.
  • ProgressCard — a card around any widget whose whole background is the progress, in sweep, circle or linear mode.
  • Ten charts for training and serving language models, and a more readable TokenHeatmap.
  • A new "Progress and goals" group in the gallery, with docs, screenshots and README entries.

Changed

  • Chart data classes compare by value.
  • PieChart and HeatmapChart animate in again when their values change.

See CHANGELOG.md for the full list.

Checks

flutter analyze, dart format and flutter test (4624 tests) all pass.

Williams %R looked back over period + 1 candles; it now reads period.
The simple, volume and internal moving averages kept a running sum, so
one close that was not a number turned every later average into NaN.
They now count the missing values in the window and leave only the
windows that hold one empty.
…eek buckets

A market-profile candle with no range sitting on a level edge counted
nothing, and a zero tick size threw. An option payoff that crossed zero
exactly on a strike was reported as a break-even twice. A decimal
histogram bin width such as 0.1 added an empty bin. The pair hedge ratio
fell back to 1 for prices quoted in tiny numbers. A treemap item with an
infinite value starved every other tile. Weekly time buckets began on a
Thursday and a 180-day step bucketed by quarter. Renko and range bars
stop at CandleTransforms.maxBlocks instead of looping for millions of
bricks.
A replay that caught up with the end of its series stopped its timer
without telling its listeners, leaving a play/pause button stale.
play(interval:) while playing is applied instead of ignored, a series
shrunk to nothing keeps one candle in play, and a zero interval is held
to a millisecond. A chart removed from a ChartLink before the post-frame
spread no longer moves the others.
Reports how far a replay has got, from 0 to 1, for a scrub bar or a
progress indicator. The replay tests cover it and the fixes above.
A candle chart threw while painting when a pane was squeezed below its
own padding, or when every value in a pane was equal (a single candle,
a flat market, MACD at zero), and drew a flat negative range upside
down. A candle, volume bar or depth rung whose price is NaN or infinite
is left as a gap and no longer poisons the price or volume scale. The
funnel, bubble, footprint, order-book and option-payoff charts no longer
throw on a NaN, and the R-multiple chart no longer overflows in a box
too short for its figures.
The divergences were worked out again on every frame of the entry
animation, a scan of the lookback window for each bar.
The data classes the charts take compare by value, so a parent that
rebuilds with the same numbers in a new list no longer restarts the
chart's entry animation. A chart keeps still when it is rebuilt with
equal data and animates when the values change. ParallelAxis.formatter
and PieSection.badge are left out of the comparison, since an inline
closure or widget is new on every build. PieChart and HeatmapChart now
animate on a change of value, not only of count.
…changelog

The README is now a landing page of under 100 lines; the full gallery
and feature list live in doc/gallery.md and doc/features.md. The pub
description is shortened to fit the listing, indexRangeCovering's
documentation says what it does for a span past the data, and the
changelog records this release's fixes.
audit_fixes_test covers the calculation fixes. degenerate_input_test
builds every chart widget with empty, single, flat, negative, huge and
non-finite data in a normal, a 1x1 and a 0x0 box, and touches it.
Plots every trade by how far it went against the position (MAE) or for
it (MFE) against what it made, with the limit line no trade can pass and
reference lines for a stop or a target. ExcursionStats and
winnersStoppedAt work out the edge ratio and what a stop would have cost.
Shared axis, range and tooltip helpers live in utils/xy_plot.dart.
Draws implied volatility across strike and expiry as a heatmap built on
HeatmapChart, with the skew against the at-the-money strike on touch.
atTheMoneyIndex and surfaceSkew are the numbers behind it.
Plots portfolios by risk and return and traces the efficient frontier
through the ones nothing beats, marking the best return per unit of risk,
the least risky portfolio, the capital market line and the portfolio held
now. efficientFrontierIndices, maxSharpeIndex and minRiskIndex are the
numbers behind it.
Shows a set of returns as a histogram with the loss tail picked out and
the value at risk and expected shortfall marked. ValueAtRisk.fromReturns
works the figures out by the historical method, and varBins colours the
tail for a histogram of your own.
Plots futures prices against delivery month, one or more curves at a
time, with the first curve's shape (contango or backwardation) and slope
in the corner and the calendar spread on touch. curveShape, curveSlope
and calendarSpreads are the numbers behind it.
Lays a week out as a clock face, the hours of the day round the dial and
a weekday on each ring, coloured by what happened then. It takes the
same SeasonalSample as SeasonalityChart. layOutClock and clockSegmentAt
are the layout and hit test behind it.
The statistics row of the R-multiple chart, and of the new value-at-risk
chart, shared the column with the histogram as an equal flex child, so the
histogram took half the box. The row is now limited to part of the box
and clipped, and the histogram fills the rest. The efficient frontier's
marker names sit above and to the left of their markers, off the
frontier line.
Adds MAE/MFE, volatility surface, efficient frontier, value at risk,
futures curve and the activity clock, with sample data, to the gallery
catalogue. The tab and the screenshot tool both build from it, so each
gets a page in the app and a scene for its documentation image.
Each new chart's page shows its image, the gallery page lists them, and
the README's preview has a row of three. The README highlights name the
volatility, futures and risk charts.
Rendered from the current chart, which now gives the histogram the full
height the figures leave.
PlotScaffold holds what plot charts repeat: sizing, the entry animation,
one hit per pointer position and a tooltip beside it. paintXyAxes takes
logX and logY, and mapAcrossLog and log10OrNull map values onto a
logarithmic scale.
Draws the loss and accuracy curves of one or more training runs with
exponential smoothing over faint raw readings, a logarithmic axis, the
best checkpoint, the step a run diverged at and the train/validation gap.
smoothValues, bestIndex and divergenceIndex are the numbers behind it.
niceStep and niceLogTicks took a power of ten of two ints, which Dart
computes as an integer and wraps past 1e18, so the axis of a very large
number was noise. They take it as a double.
Plots loss against parameters, tokens or compute on log-log axes with the
fitted power law, a residual band, an extrapolation and the scale at
which the law reaches a target loss. fitPowerLaw and PowerLawFit are the
numbers behind it.
SweepChart lays a two-setting hyperparameter sweep out as a grid of
scores with the best combination starred and the mean of each setting
alongside. TrainingTimelineChart shows training jobs by machine, coloured
by how each finished, with the running count underneath.
BenchmarkMatrixChart compares models across benchmarks, each score
coloured by its standing in its column, the leaders starred and an
average column to rank by.
ModelParetoChart plots models by cost against quality with the Pareto
frontier traced through the ones nothing beats, bubbles sized by context
window and models grouped by provider; paretoIndices is the number behind
it. LatencyBandChart shows p50, p95 and p99 latency over time as bands
with an objective drawn across and the intervals that broke it marked;
sloBreaches is the number behind it.
TokenUsageChart shows tokens served over time as stacked cached, input and
output columns with the cost as a line on its own axis; usageTotals,
UsageBucket.cacheHitRate and compactCount are the numbers behind it.
EvalBreakdownChart shows an evaluation by category as bars of passed,
failed and skipped tasks, worst first, with the pass rate, how many tasks
stand behind it and a threshold; wilsonInterval, overallPassRate and
sortedByPassRate are the numbers behind it.
Shows a model's text with each token shaded by a score — its surprisal,
an entropy, an attribution — flowing and wrapping like text, with a
legend and the perplexity. summarizeTokens and flowTokens are the numbers
behind it.
…charts

Log axes over more than six decades tick on powers of ten, not on every
1, 2 and 5. The scaling-law chart writes its axis in clean scientific form
and puts point and target names off the fitted line. The training
timeline draws taller lanes and lists the statuses in use, dropping the
legend in a box too small to hold it. The evaluation breakdown's bars grow
to fill the box. Token heatmap tokens have a hairline between them.
A new Models and training group with sample data for training curves,
scaling laws, a hyperparameter sweep, training jobs, a benchmark matrix,
model cost against quality, latency bands, token usage, an evaluation
breakdown and a token heatmap. The screenshot tool builds from the same
list, so each has a scene for its documentation image.
…charts

Each page shows its image, the gallery has a Models and training section,
the README preview has a row of three, and the counts in the README, the
pub description and the example README are brought up to date.
A tooltip card wider than its chart shrinks to fit it, and so does the
widget placed in the middle of a sunburst, a doughnut or a gauge. The
equity curve's time labels no longer throw when the plot is narrower than
a label, and the training timeline's legend shrinks its items in a narrow
box. The degenerate-input test now builds every chart in boxes from 60 to
800 pixels across as well, with overflow counted as a failure.
Touching a token opens a readout of its score, rank, probability and what
the model was weighing instead. highlightTop rings and numbers the most
doubtful tokens, focusAbove leaves the confident ones unshaded, showStrip
draws every token's score in order for a long text, showWhitespace writes
spaces and line breaks as middle dots and arrows, and selectedIndex holds
one outlined. The legend marks the mean, and rank badges are no longer
clipped on the first line.
A variant's title and figure share the row and give way, with an ellipsis,
when it is narrow. The Gallery is now built at widths from 240 to 1,400
pixels with overflow counted as a failure, and the token heatmap has two
variants showing its new options.
Rendered with the corrected panel headers, and the token heatmap with its
ringed tokens, strip and readout options. The changelog records the
overflow fixes and the heatmap's additions.
Each token is a rounded box with padding round its text. A token that
begins a word, where the tokenizer put a space, sits apart from the one
before it, and one that carries a word on sits close. The colour is a tint
with a line of the full colour under the text, so the text stays readable
and tokens no longer run together; TokenShading.solid keeps the old look.
New horizontalPadding, wordGap, tokenGap and shading parameters, and a
tokenText helper.
The screenshot scene for the token heatmap uses the short frame, so the
panels are not half empty.
ProgressCard wraps any widget in a card whose whole background is the
progress, in one of three modes: sweep (a wedge round the card like a
clock), circle (a circle growing from the left edge) or linear.

ProgressBars was already in the tree; this adds its tests, export and the
gallery entries for both widgets.
@CtrlAltDevelop
CtrlAltDevelop merged commit 0ddc13e into main Oct 15, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant