From b7bf7d728b010b76351b57966f31344a882bf4ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jaroslav=20Bene=C5=A1?= Date: Fri, 25 Sep 2026 19:27:39 +0000 Subject: [PATCH] An admin area a phone could reach and not navigate Administration has a nav of its own rather than the chat sidebar, and 1.1.0 gave every `.sidebar` the drawer behaviour -- starts closed, slides in -- without giving that one any of the drawer's furniture. No id for the toggle to resolve, no toggle, no close, no scrim: it sat at left:-280 with nothing in the application able to open it. The close button and the scrim are partials now, used by both, and the test that guards it *finds* sidebars by scanning the templates rather than working from a list, which is exactly why this one was missed. The chat, measured at 390px, spent forty pixels of side padding and a forty-four pixel avatar column before drawing a word -- close to a quarter of the screen on margin, so anything that could not wrap had to be reached sideways. Padding halved and the avatar moved above the turn; a code block gained about sixty pixels. Worse in the same row: `.topbar__actions` asked for 317px of a 390px bar, because the control that used to give in that row is display:none below a tablet width, so the group went rigid and the title -- flex: 1 -- was squeezed to exactly zero. And `.btn--icon` sets a width with no `flex: none`, so the row shrank the button instead of the text: the sidebar toggle measured eighteen pixels across. The picker gives now, and shows its avatar rather than its name on a phone. Also the instrument, which lied twice more: it could not see horizontal overflow at all, because `.shell` is overflow:hidden and its "is this contained" test therefore answered yes for everything on the page; and run from a copy it resolved `STATIC` to a directory that did not exist, rewrote every asset URL to a dead file:// path and reported the whole application overflowing by thirty thousand pixels. It resolves from the imported package now and asserts that what it rewrote to is really there. Co-Authored-By: Claude Opus 5 --- CHANGELOG.md | 30 +++++++ scripts/shoot.py | 40 +++++++-- src/lembas/__init__.py | 2 +- src/lembas/web/static/css/app.css | 85 +++++++++++++++++- src/lembas/web/static/css/chat.css | 49 ++++++++++ src/lembas/web/static/css/tokens.css | 12 ++- .../web/static/img/screenshot-narrow.png | Bin 35789 -> 34146 bytes src/lembas/web/templates/admin/_layout.html | 21 ++++- .../templates/partials/_sidebar_close.html | 20 +++++ .../templates/partials/_sidebar_scrim.html | 10 +++ .../web/templates/partials/sidebar.html | 33 +------ tests/test_sidebar_drawer.py | 73 ++++++++++++++- 12 files changed, 327 insertions(+), 48 deletions(-) create mode 100644 src/lembas/web/templates/partials/_sidebar_close.html create mode 100644 src/lembas/web/templates/partials/_sidebar_scrim.html diff --git a/CHANGELOG.md b/CHANGELOG.md index 421264a..64092df 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,36 @@ for 1.0.0 have something to be assembled from. ## Unreleased +## 1.1.2 + +Two things a phone found that 1.1.0's phone pass had not. + +- Fixed: **the administration area could not be navigated on a phone.** Admin + has a nav of its own rather than the chat sidebar, and 1.1.0 gave every + sidebar the drawer behaviour — starts closed, slides in — without giving that + one any of the drawer's furniture. So it sat off-screen with no button to open + it, no close, and nothing to tap beside it: every administration page was + reachable and then a dead end. It now opens, closes and dims the page like the + other one, and a test refuses any future sidebar that cannot be opened. +- Fixed: **the chat gave nearly a quarter of a phone screen to margins**, so + anything that could not wrap had to be scrolled to sideways. The thread's side + padding is halved, and the speaker's avatar moves above the turn instead of + sitting in a 44px column beside every line of it — a code block gained about + sixty pixels of readable width. +- Fixed: **the chat's title was squeezed to nothing.** The row's designated + shrinker is hidden below a tablet width, so on a phone the controls went rigid + and asked for 317 pixels of a 390 pixel bar; the heading was not truncated, it + simply stopped occupying space. The model picker gives now, and on a phone it + shows its avatar rather than its name — the name is one tap away and the + title is not. +- Tick boxes and the smaller buttons are big enough to hit on a phone. A + checkbox is drawn by the browser at about sixteen pixels whatever the type + around it, which made it the smallest target in the application by some way, + and the admin lists are mostly checkboxes. +- Fixed: **icon buttons could be squashed below their own size.** The sidebar + toggle measured eighteen pixels across on a phone, under half its target, + because a full row shrank the button rather than the text beside it. + ## 1.1.1 One bug, and it is the one that made 1.1.0 look broken the moment you updated to diff --git a/scripts/shoot.py b/scripts/shoot.py index 1aa41b5..f233911 100644 --- a/scripts/shoot.py +++ b/scripts/shoot.py @@ -29,10 +29,19 @@ import tempfile from pathlib import Path REPO = Path(__file__).resolve().parent.parent -SRC = REPO / "src" -sys.path.insert(0, str(SRC)) +sys.path.insert(0, str(REPO / "src")) -STATIC = SRC / "lembas/web/static" +# Resolved from the package that actually got imported, not from where this +# file happens to sit. A copy of this script run from somewhere else silently +# pointed STATIC at a directory that did not exist, every asset URL was +# rewritten to a file:// path with nothing behind it, and the run measured an +# unstyled document -- reporting that every page in the application overflowed +# by thirty thousand pixels. The guard below only asked whether the URLs had +# been rewritten, which they had. +import lembas # noqa: E402 + +SRC = Path(lembas.__file__).resolve().parent.parent +STATIC = Path(lembas.__file__).resolve().parent / "web/static" CHROMIUM = shutil.which("chromium") or shutil.which("chromium-browser") # Routes that are served by the app rather than mounted, so the rewrite has to @@ -131,8 +140,17 @@ window.__measure = function () { tallCulprits: culprits('y'), wideCulprits: culprits('x'), /* The invariant: the application shell fills the window and the DOCUMENT - never scrolls. A document taller than the window is the /settings bug. */ - documentScrolls: de.scrollHeight > window.innerHeight + 1, + never scrolls *for the reader*. A document taller than the window is the + /settings bug -- but only when the reader can actually move it. `overflow: + hidden` blocks a wheel and a finger while still permitting an assignment + to scrollTop, so a page whose shell clips a tall descendant reports a + scrollHeight of thousands and scrolls for nobody. /admin/prompts does + exactly that, and reading the raw height called it a bug four times. */ + documentScrolls: + de.scrollHeight > window.innerHeight + 1 && + ["visible", "auto", "scroll"].indexOf( + getComputedStyle(document.documentElement).overflowY + ) !== -1, scrollsSideways: de.scrollWidth > window.innerWidth + 1, smallTargets: small.slice(0, 40), smallCount: small.length, @@ -219,6 +237,18 @@ def rewrite(html: str, client, assets: Path) -> str: f"{sorted(set(blocking))[:8]}" ) + # And that what they were rewritten *to* is really there. A rewrite that + # matches and produces a dead path is indistinguishable, from inside the + # browser, from no stylesheet at all -- and it is the failure that actually + # happened, twice. + missing = [ + url + for url in re.findall(r'(?:href|src)="file://([^"?]+)"', html) + if not Path(url).exists() + ] + if missing: + raise SystemExit(f"REWRITTEN TO NOTHING -- still an unstyled document: {missing[:5]}") + # The one-time notifications offer is a modal over the very page we came # to measure, and it is gated on a localStorage key. Set it in the head, so # it runs before the deferred script that reads it. diff --git a/src/lembas/__init__.py b/src/lembas/__init__.py index 5ceab52..f7b6d4c 100644 --- a/src/lembas/__init__.py +++ b/src/lembas/__init__.py @@ -1,3 +1,3 @@ """LLeMbas - a Middle-earth themed web UI for OpenAI-compatible LLM endpoints.""" -__version__ = "1.1.1" +__version__ = "1.1.2" diff --git a/src/lembas/web/static/css/app.css b/src/lembas/web/static/css/app.css index 3658a58..c85c06c 100644 --- a/src/lembas/web/static/css/app.css +++ b/src/lembas/web/static/css/app.css @@ -185,6 +185,12 @@ button, input, textarea, select { /* Square, and the same height as everything beside it. */ .btn--icon { width: var(--control-h); + /* Square, and it stays square. Without this a flex row that runs out of room + shrinks it instead of its neighbours -- the sidebar toggle measured 18px + across on a 390px chat, less than half the target it is supposed to be, + while the row beside it kept every pixel it had asked for. A control's + size is not the give in a layout; text is. */ + flex: none; padding: 0; background: transparent; border-color: transparent; @@ -354,12 +360,28 @@ button, input, textarea, select { } .checkbox input { accent-color: var(--accent); - width: 1rem; - height: 1rem; + width: var(--check-size); + height: var(--check-size); flex: none; cursor: pointer; } +/* Every tick box, not only the ones inside a `.checkbox` label -- the admin + lists put bare ones in a row and those were 16px square on a phone. */ +input[type="checkbox"], +input[type="radio"] { + accent-color: var(--accent); + width: var(--check-size); + height: var(--check-size); +} +/* Except the ones that are deliberately 1px: a visually-hidden radio is the + state behind a label, and the label is the target. */ +input.visually-hidden[type="radio"], +input.visually-hidden[type="checkbox"] { + width: 1px; + height: 1px; +} + /* Multi-column form layout, one definition. */ .grid { display: grid; gap: var(--sp-4); } .grid--2 { grid-template-columns: repeat(auto-fit, minmax(14rem, 1fr)); } @@ -953,7 +975,48 @@ body.is-resizing .canvas__body { pointer-events: none; } min-width: 0; flex: 1; } -.topbar__actions { display: flex; align-items: center; gap: var(--sp-2); flex: none; } +/* + The controls on the right of the topbar. + + `flex: none` on the group with `min-width: 0` inside it: the group keeps the + width its controls need, and the one child whose width is a *name* rather + than a control -- the model picker -- is the thing allowed to give. Without + the second half the group asked for 317px of a 390px bar and the chat's + title, which is `flex: 1`, was squeezed to exactly zero: a heading that had + not been shortened or truncated but had simply ceased to occupy space. +*/ +.topbar__actions { + display: flex; + align-items: center; + gap: var(--sp-2); + /* Allowed to give, which it was not. `--topbar__where` used to be the + designated shrinker in this row, and it is `display: none` below 64rem -- + so on a phone the group became rigid, asked for 317px of a 390px bar, and + the title (`flex: 1`) was squeezed to exactly zero: a heading that had not + been truncated but had ceased to occupy space. + + Nothing inside it shrinks except the model picker: every button here is + `flex: none` because a control's size is not the give in a layout. */ + flex: 0 1 auto; + min-width: 0; +} +/* A title identifies the page, so it gets a floor and truncates rather than + disappearing. */ +.topbar__title { min-width: 4rem; } + +/* The one control in this row whose width is somebody else's decision -- a + model's label is whatever an administrator called it -- so it is the one + that gives, and it gives by truncating its name rather than its avatar or + its chevron. */ +.topbar__actions .picker { min-width: 0; } +.topbar__actions .picker__button { max-width: 100%; } +.topbar__actions .picker__label { + min-width: 0; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.picker__avatar, .picker__chevron { flex: none; } /* Which machine an agent chat runs on, and where. @@ -1243,6 +1306,22 @@ body.is-resizing .canvas__body { pointer-events: none; } } @media (max-width: 48rem) { + /* The bar is the densest row in the application and the one with the least + room: a toggle, a title, a model, and up to four panel buttons. Tighter + padding and a smaller gap buy back about 24px, which is the difference + between a title that truncates and one there is no room for at all. */ + .topbar { + gap: var(--sp-2); + padding-right: max(var(--sp-2), var(--safe-right)); + padding-left: max(var(--sp-2), var(--safe-left)); + } + + /* The model's name costs about a hundred pixels and its avatar does not, + and the picker opens onto a list of full names the moment it is touched. + So on a phone the avatar carries the identity and the chat's own title -- + which nothing else on the screen tells you -- gets the room back. */ + .topbar__actions .picker__label { display: none; } + .sidebar { position: fixed; inset: 0 auto 0 0; diff --git a/src/lembas/web/static/css/chat.css b/src/lembas/web/static/css/chat.css index fd80060..419f7f0 100644 --- a/src/lembas/web/static/css/chat.css +++ b/src/lembas/web/static/css/chat.css @@ -1726,3 +1726,52 @@ .thread__intro > * { animation: intro-rise var(--dur-3) var(--ease-out) both; } .thread__intro > *:nth-child(2) { animation-delay: 60ms; } .thread__intro > *:nth-child(3) { animation-delay: 120ms; } + +/* + --- A phone ---------------------------------------------------------------- + + The one width-aware block in this file, and the reason the blanket ban on + `@media` here was lifted: everything below is a *size*, and there is no + intrinsic-sizing trick that makes 24px of thread padding the right amount on + a 390px screen. The ban existed to stop the composer toolbar being "fixed" + with a breakpoint instead of by saying which child gives, and that guarantee + is asserted directly now (`tests/test_chat.py`) -- so this block may not touch + `.composer__toolbar` or `.composer__actions`, and a test refuses it if it + does. + + What was wrong: a 390px screen spent 40px of its width on thread padding and + another 44 on the avatar gutter before a single word was drawn, which is + nearly a quarter of the screen given over to margin -- so anything that could + not wrap had to be scrolled to sideways. +*/ +@media (max-width: 48rem) { + /* Half the horizontal padding. The vertical stays: it is what separates one + turn from the next, and turns are no closer together on a phone. */ + .thread { + padding-left: var(--sp-3); + padding-right: var(--sp-3); + } + + /* The avatar goes to the top of the turn rather than beside it, so the body + gets the whole width. The gutter is what identifies the speaker and it + still does; it simply stops costing 44px of every line. */ + .msg { + grid-template-columns: 1fr; + gap: var(--sp-2); + } + .msg__gutter { + width: var(--control-h-sm); + height: var(--control-h-sm); + } + .msg__meta { gap: var(--sp-2); } + + /* A bubble against the edge of the screen wants less inside it. */ + .msg--user .msg__body--plain { padding: var(--sp-2) var(--sp-3); } + + /* The composer is the other thing pressed against both edges. */ + .composer { padding-left: var(--sp-2); padding-right: var(--sp-2); } + + /* A hint that runs to four lines on a phone is a hint nobody reads, and it + sits directly under the thing a thumb is reaching for. */ + .composer__hint { font-size: var(--text-xs); } +} diff --git a/src/lembas/web/static/css/tokens.css b/src/lembas/web/static/css/tokens.css index 08699a7..e18f3e5 100644 --- a/src/lembas/web/static/css/tokens.css +++ b/src/lembas/web/static/css/tokens.css @@ -145,6 +145,9 @@ Raising the token is the only version that reaches all of them, and it is what `--control-h` exists for. */ --tap-min: 2.75rem; + /* A tick box, which does not take its size from `--control-h`: the browser + draws it and only `width`/`height` move it. */ + --check-size: 1rem; /* --- The window's own edges --------------------------------------------- Installed on a phone, the page runs under the notch and the home @@ -421,9 +424,16 @@ @media (pointer: coarse), (max-width: 48rem) { :root { --control-h: var(--tap-min); - --control-h-sm: 2.25rem; + /* 40px, not the 36 a comfortable pointer gets. A `.btn--sm` is a secondary + action, not an unimportant one -- Edit, Enable and Use default are all + `.btn--sm`, and on a phone they are the whole interaction. */ + --control-h-sm: 2.5rem; --control-px: var(--sp-4); --control-px-sm: var(--sp-3); + /* A native checkbox is 13-16px whatever the surrounding type is, and no + amount of padding on its label changes the box itself. It is the + smallest target in the application on a phone by some margin. */ + --check-size: 1.375rem; } } diff --git a/src/lembas/web/static/img/screenshot-narrow.png b/src/lembas/web/static/img/screenshot-narrow.png index 6f6f7fadcf3383dbd69cc86d2e102694de52d443..5554a5afb1f8a56aefa1d2f57a78f7a6aa9963ba 100644 GIT binary patch literal 34146 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 z

+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 -

-{# - The scrim behind the open drawer. It carries the same `data-toggle` as every - other control that closes it, so tapping beside the drawer closes it through - exactly one code path rather than a second one written for touch. - - Rendered always and shown by CSS: it exists only below the breakpoint and only - while the drawer is open, which is a question about width and state that the - server cannot answer and the stylesheet can. -#} - +{% include "partials/_sidebar_scrim.html" %} diff --git a/tests/test_sidebar_drawer.py b/tests/test_sidebar_drawer.py index 1f03121..f2de3f2 100644 --- a/tests/test_sidebar_drawer.py +++ b/tests/test_sidebar_drawer.py @@ -95,9 +95,12 @@ def test_inert_is_never_left_behind_on_a_widened_window(): def test_the_drawer_is_dismissible_without_finding_a_button(): - sidebar = (TEMPLATES / "partials/sidebar.html").read_text(encoding="utf-8") - assert 'class="sidebar-scrim"' in sidebar - assert 'data-toggle="#sidebar"' in sidebar + """The scrim is a partial because there are two sidebars, so the markup is + asserted where it is defined and its *inclusion* is asserted per sidebar by + `test_every_sidebar_carries_the_way_out_and_the_scrim`.""" + scrim = (TEMPLATES / "partials/_sidebar_scrim.html").read_text(encoding="utf-8") + assert 'class="sidebar-scrim"' in scrim + assert 'data-toggle="#sidebar"' in scrim assert ".sidebar-scrim" in APP_CSS @@ -113,3 +116,67 @@ def test_the_toggle_is_a_real_target(client: TestClient, registered): tokens = (ROOT / "web/static/css/tokens.css").read_text(encoding="utf-8") assert "--tap-min: 2.75rem" in tokens assert "--control-h: var(--tap-min)" in tokens + + +# --- Any sidebar, not only the one this was written for ---------------------- +def _sidebar_templates() -> list[str]: + """Every template that renders a sidebar of its own, found rather than + listed -- the admin one was missed precisely because it was not on a list.""" + return [ + str(p.relative_to(TEMPLATES)) + for p in TEMPLATES.rglob("*.html") + if '