Highlights
- New visual identity for
builder: FlatLaf-based theme (PbssTheme) — a paper/ink/civic-teal palette grounded in the actual subject matter (paper ballots, official process), flat design, applied before Spring eagerly constructsMainFrame(the previousUIManager.setLookAndFeel()call ran after every screen was already built — a latent no-op). - Dashboard step cards (the 1–7 + Print landing screen) each get a distinct color from a warm-to-cool progression — configurable via
dashboard.card.colorsinapplication.properties. - Numeric spinners no longer stretch to fill their form row — capped to a comfortable ~4-digit width instead of stretching edge-to-edge like a text field.
- Fixed a real crash/lockup bug, found by hand and confirmed against a real database: candidates created via bBuilder's REST API (
test-harness/build_election.py) never setdisplayOrder, leaving it at Java's default of0. The candidate table's new Order spinner used a model with minimum1, so opening the editor on any such candidate threwIllegalArgumentExceptionand left it broken — the spin arrows did nothing, and typing into it produced a system beep instead of accepting input. Fixed the model's bounds, and audited/fixed every other spinner acrossbuilderandscannerwith the same minimum-vs-possible-zero-stored-value risk (ballot design template's columns/typography/RCV spinners, scanner's DPI spinner) — several of those would have crashed their dialog on open outright. Added a permanent regression test. - Fixed a latent hang in
ScreenshotGenerator(the dev screenshot tool): it seeded data after Spring had already builtMainFrame, so a genuinely fresh database would hang forever on the same blocking-dialog issue fixed earlier for the GUI test suite. Restructured to seed first.
Notes
All thirteen module pom.xml files bumped to 0.9.17. builder-core, counter-core, scanner-core, and all ten dependent apps verified to install/compile cleanly at this version. builder's full suite (21 tests) passes cleanly with no skips on this run.