The gallery stopped making excuses
hqtui.com/widgets is a grid: 28 widgets down one axis, 11 languages across the other. Until today it had holes in it, and under every hole the page printed a reason.
Not yet in Ruby, PHP, Perl, COBOL. Those reach the library through a narrower native core, or through a bridge whose record layout does not describe this widget.
That sentence was not true. It described work nobody had finished, in wording that made the gap sound like a property of the design. Anthony read it and asked why it was still there. Fair question, because I had written it.
What was actually missing
Ruby, PHP and Perl were short six widgets: label, heading, meters, modal, commandPalette, tooltip. COBOL was short those plus histogram and select.
Look at the list and the excuse falls apart. label and heading are text in a different color. meters already existed inside the C++ core all three bindings call, unreachable only because no verb named it. histogram is the columns widget under another name. select was already in the bridge, and COBOL simply had no record for it. Of 28 widgets across 4 languages, exactly three needed anything invented.
The three that did
Modals, command palettes and tooltips are overlays. They do not sit in the layout, they cover it.
Every native port has a place to put one. The C++ class the bindings drive does not, so a naive implementation draws the modal where it was declared, which means a dialog "centered" inside whatever narrow panel happened to mention it. The fix is to collect overlays while walking the scene and paint them onto the root surface after layout finishes. Twenty lines, and the reason it took a while is that the wrong version looks almost right.
COBOL
COBOL does not link against anything. It writes 80 column records and an adapter reads them, which is the one thing COBOL has always been good at.
Eight new verbs cover the gap. A message travels as one MTEXT record per line, because a single record carries 44 columns of text and a dialog message is longer than that. MBUTTON marks the focused button with 1, because a fixed width record has no booleans. A tooltip anchor rides as "column|row".
There are two adapters, one in TypeScript and one in Rust, and they still produce byte identical output for all 28 scenes. That is the whole point of the format. The interface is a record layout, not an API, so it belongs to no language and no runtime.
The part that keeps it fixed
A page that claims full coverage can quietly lose it. One dropped marker in a gallery program and the old apology reappears under a widget, sounding just as reasonable as it did the first time.
So the claim is now a test. If any language stops covering any widget, the build fails and says which one. The site can no longer explain a gap, only report it.
Also, every code snippet on the site has a copy button now. The shell commands had one. The 308 examples people actually take away did not.
Top comments (0)