skill
Adom UI Design System
Public Made by Adomby adom
How the AI builds and tests interfaces people love to use in Adom. Ships as one installable skill that bundles focused skills (tooltips, floating-windows, toasts, responsive-ui, app-shell, ai-driven-apps, clickable-paths).
← Commit history
2.19.0: phrase headroom is now a selfCheck row - a console warning nobody reads is not a check, and 'does not truncate today' is not 'has room'
3 files changed
+58−2
assets/module/newbie-panel.js+29−1@@ -519,6 +519,34 @@ * fleet mismatch comes back in a form the check is blind to. This asserts the panel's * left edge against the PANE, which covers the whole ancestor chain in one number. * (parts-search, 2026-08-25, reasoning about what the new yardstick still could not see.) */+ /* PHRASE HEADROOM AS A ROW, not a console warning nobody reads. The mount-time probe has+ * warned about over-budget phrases since 2.0.0 and it warned on at least one live app that+ * then reported "0 of 6 truncated" and a clean pass, because "does not truncate TODAY" and+ * "has room" are different claims. kicad measured its longest phrase at clientWidth ==+ * scrollWidth EXACTLY: not truncating, and one character from doing so. A row makes it+ * appear in the evidence everyone already pastes. */+ var spans = [].slice.call(panel.querySelectorAll('.anp-phrase span'));+ if (spans.length) {+ var probe = document.createElement('span');+ probe.style.cssText = 'position:absolute;visibility:hidden;white-space:nowrap;font:' ++ getComputedStyle(spans[0]).font;+ document.body.appendChild(probe);+ var worst = 0, worstTxt = '', tight = 0;+ spans.forEach(function (sp) {+ probe.textContent = sp.textContent;+ var need = Math.ceil(probe.getBoundingClientRect().width);+ var have = Math.round(sp.getBoundingClientRect().width);+ var slack = have - need;+ if (worstTxt === '' || slack < worst) { worst = slack; worstTxt = sp.textContent.trim().slice(0, 40); }+ if (slack < 8) tight++;+ });+ probe.remove();+ var headOk = worst >= 8;+ if (!headOk) ok = false;+ rows.push({ what: 'phrase headroom', want: 'at least 8px of slack on every phrase',+ got: worst + 'px on ' + JSON.stringify(worstTxt) + (tight > 1 ? ' (' + tight + ' tight)' : ''),+ pass: headOk });+ } var fam = getComputedStyle(panel.querySelector('.anp-phrase span') || panel).fontFamily; var famOk = /Satoshi/.test(fam); if (!famOk) ok = false;@@ -556,6 +584,6 @@ } root.AdomNewbiePanel = { mount: mount, toast: toast, selfCheck: selfCheck, copyText: copyText,- checkSend: checkSend, version: '2.17.0',+ checkSend: checkSend, version: '2.19.0', TWO_COL_MIN: TWO_COL_MIN, PHRASE_BUDGET: PHRASE_BUDGET }; })(typeof window !== 'undefined' ? window : this);
package.json+1−1@@ -1,6 +1,6 @@ { "slug": "adom-ui-design",- "version": "2.18.0",+ "version": "2.19.0", "type": "skill", "description": "The Adom UI Design System plus a bundle of focused UI skills (tooltips, floating-windows, toasts, responsive-ui, app-shell, ai-driven-apps, clickable-paths, dark-default, input-feedback, settings-layout). One install drops the whole set of skill files onto your container, plus shared icon assets (the settings cog) so every Adom app draws the same glyph.", "dependencies": {},
skills/newbie-panel/SKILL.md+28@@ -1185,6 +1185,25 @@ first, `/api/status` proves the second, and **only `AdomNewbiePanel.version` rea live document proves the third.** Report all three or you are reporting one and implying the others. +## ⛔ "DOES NOT TRUNCATE TODAY" AND "HAS ROOM" ARE DIFFERENT CLAIMS++`selfCheck` now carries a **phrase headroom** row: every phrase must have **at least 8px of+slack**, and it reports the worst one by name.++The mount-time probe has warned about over-budget phrases since the first release, in a+`console.warn` **nobody reads**. So an app could report "0 of 6 truncated" and a clean eleven+rows while sitting exactly on the edge: kicad measured its longest phrase, "open the symbol in+kicad", at `clientWidth == scrollWidth` **exactly**. Not truncating, and one character from it.+A slightly wider font fallback, a 2px narrower pane, or one extra word, and it ellipsises the+trigger noun — which is the specific failure this whole panel exists to prevent.++**A warning in a channel nobody reads is not a check.** Put it in the evidence people already+paste. Negative-controlled before shipping: comfortable phrases pass with 136px of slack, a+phrase stretched to its box goes red at -116px, restoring returns it to green.++**This will turn some clean passes red, correctly.** If your row goes red, shorten the phrase;+that is the authoring rule this skill already carried, now enforced where it can be seen.+ ## Two margins at John's width, neither a defect today, both worth watching parts-search measured these on his box and flagged them rather than reporting a clean pass:@@ -1196,6 +1215,15 @@ parts-search measured these on his box and flagged them rather than reporting a - **The longest phrase is 332px in a 343px box: 11px of headroom**, on "check ESP32-S3-WROOM-1 stock". The 0-of-6 is real and it is not comfortable. +kicad's are tighter still, and it reported them rather than banking a clean pass: **a 2px+collapse margin** (scroller box 734, panel 702, threshold 700, so a 12px scrollbar drops it to+one column) and **0px of phrase headroom**. It is the app that defines the fleet's safety+margin on both axes.++**And the version gate has zero headroom too:** John's shell is EXACTLY 1.0.142, the minimum+the module requires. The gate passes with nothing to spare, so a single patch downgrade starts+refusing sends — correctly, but worth knowing it is a boundary rather than a comfort.+ At his width the two-column layout is close to its limit on BOTH axes. Nothing to change today; something to check first if a dashboard ever renders one column unexpectedly.