diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 1c3d1a88..4c3e0dd1 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -10,6 +10,7 @@ This is an UNSTABLE release. It includes many experimental features, as well as * rugnux: `--model` validation now aligns the data to the model before scoring - the observed reflections are reindexed into the model's enantiomorph when the two differ only by hand (indistinguishable from merged intensities). A merohedral indexing ambiguity is resolved against the reference MTZ when one is given (so a whole campaign shares one indexing convention); only with a model and no reference does validation fall back to fitting each candidate reindexing and keeping the lowest R-free. * rugnux: De-novo symmetry - recover a genuine high-symmetry group whose data are imperfectly scaled. Such a merge's within-orbit chi² lands just past the self-consistency bound (each real symmetry step adds a little systematic scatter), right where a merohedral twin also lands, so the chi² ratio alone cannot separate them. The candidate is now rescued when the extra intensity-proportional systematic error it invokes stays small relative to the confirmed subgroup - a genuine symmetry step gains multiplicity without inflating the merge error model's b, whereas a twin forces non-equivalent reflections together and b balloons. Fixes cubic insulin (I23 instead of I222) with no change to any other crystal in the test battery, including the twins that must stay in their lower symmetry. * Docs: Document the French-Wilson amplitude estimation, R-free flagging, reference-based space-group/ambiguity resolution, and model-based validation/maps in CPU_DATA_ANALYSIS.md. +* Frontend: The status-bar pill now shows a progress bar during detector calibration (previously only during measurement), and the calibration state and its button are labelled "Calibration"/"CALIBRATE" (the internal `Pedestal` state name is unchanged for back-compatibility). ### 1.0.0-rc.158 This is an UNSTABLE release. It includes many experimental features, as well as many AI generated fixes. We recommend using rc.152 for production use. diff --git a/frontend/src/components/StatusBar.tsx b/frontend/src/components/StatusBar.tsx index e15fb578..d818b682 100644 --- a/frontend/src/components/StatusBar.tsx +++ b/frontend/src/components/StatusBar.tsx @@ -17,16 +17,15 @@ type MyProps = { } // A tight, strong palette: lime = good/running, coral = working/alarm (deeper = worse), -// light-blue (sidebar) = neutral/idle-connection. Measuring is handled separately. +// light-blue (sidebar) = neutral/idle-connection. Measuring and Pedestal are handled separately. const STATE_STYLE: Record = { Idle: { fill: "secondary.main", text: "rgba(0,0,0,.87)" }, // lime + black text Busy: { fill: deepOrange[300], text: "rgba(0,0,0,.87)" }, // light coral - Pedestal: { fill: deepOrange[300], text: "rgba(0,0,0,.87)" }, // light coral Error: { fill: deepOrange[700], text: "#fff" }, // deep coral Inactive: { fill: indigo[100], text: "rgba(0,0,0,.87)" }, // sidebar light blue }; -// Fixed width so the pill fits the longest label ("Measuring · 100 %") and never +// Fixed width so the pill fits the longest label ("Calibration · 100 %") and never // resizes as the state changes. const pillSx = { position: "relative", width: 200, height: 36, borderRadius: 999, overflow: "hidden", @@ -57,16 +56,20 @@ function StatusChip({s}: {s?: broker_status}) { ); - // Measuring: a light-blue (sidebar) track filled lime to the progress fraction, - // with black text that stays legible over both the track and the lime fill. - if (s.state === "Measuring") { + // Measuring and Pedestal both fill a light-blue (sidebar) track to the progress + // fraction, with black text legible over both track and fill. Measuring fills lime; + // Pedestal fills coral (matching its flat-pill colour elsewhere). The "Pedestal" + // state is shown as "Calibration" — the internal name is kept only for back-compat. + if (s.state === "Measuring" || s.state === "Pedestal") { const pct = Math.max(0, Math.min(100, (s.progress ?? 0) * 100.0)); + const fill = s.state === "Measuring" ? "secondary.main" : deepOrange[300]; + const label = s.state === "Measuring" ? "Measuring" : "Calibration"; return ( + bgcolor: fill, transition: "width .4s ease"}}/> - Measuring · {pct.toFixed(0)} % + {label} · {pct.toFixed(0)} % ); @@ -114,7 +117,7 @@ function StatusBar({s, onMenuClick}: MyProps) { {...TIER[cancelTier]} />