From 39c58b807d5f62ee55b606ceb79f21855221a8d0 Mon Sep 17 00:00:00 2001 From: Christophe Besson Date: Sat, 19 Sep 2026 18:32:47 +0200 Subject: fix(hub): the members table stops hanging off the side of a phone `.admin-table` column heads are `white-space: nowrap`, which meets a translated string: "Username" is one word, "Nom d'utilisateur" is three, uppercased with letter-spacing on top. The heads alone overflowed a 360px window by 11px, and on Android an overflowing document takes every sticky element with it. 11px was only what could be measured: the probe served no members, so the table measured its headers and nothing else. With one realistic username in it the same page overflowed by 248px, at 420px-wide windows too. The cells get `word-break: break-word`, as `.file-name` already had. Co-Authored-By: Claude Opus 5 --- .../meshbay-hub/tests/harness/sticky_header_probe.py | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) (limited to 'packages/meshbay-hub/tests') diff --git a/packages/meshbay-hub/tests/harness/sticky_header_probe.py b/packages/meshbay-hub/tests/harness/sticky_header_probe.py index 6f084d6..7579bf9 100755 --- a/packages/meshbay-hub/tests/harness/sticky_header_probe.py +++ b/packages/meshbay-hub/tests/harness/sticky_header_probe.py @@ -401,7 +401,11 @@ const settle = () => new Promise((r) => .slice(0, 6) .map((el) => (el.tagName.toLowerCase() + '.' + (el.className || '')) .slice(0, 60) + ' →' - + Math.round(el.getBoundingClientRect().right)); + + Math.round(el.getBoundingClientRect().right) + // The text, because the element alone never says which + // cell it was: a column is as wide as its widest + // unwrappable string, and that string is the finding. + + ' ' + JSON.stringify((el.textContent || '').trim().slice(0, 40))); })(), innerHeight, innerWidth, // What the stylesheet was actually handed, so a wrong offset can be told @@ -487,6 +491,18 @@ class H(http.server.BaseHTTPRequestHandler): self._send(render_frame(index).encode(), "text/html; charset=utf-8") elif path == "/v1/groups/g1/nodes": self._send(b'{"nodes": [{"node_id": "n1"}]}', "application/json") + elif path == "/v1/groups/g1/members": + # Served at all because an empty table measures only its headers, + # and a member's name is a string this project did not choose. One + # of them has no spaces to break at, which is what makes a cell set + # its column's minimum width — the fault already recorded against + # the Files table, one table along. + self._send( + b'{"members": [' + b'{"user_id": "u1", "username": "moi"},' + b'{"user_id": "u2", "username":' + b' "un_utilisateur_au_nom_deraisonnablement_long_2026"}]}', + "application/json") else: asset = (STATIC / path.lstrip("/")).resolve() if not str(asset).startswith(str(STATIC)) or not asset.is_file(): -- cgit v1.2.3