"""Panel widths: three numbers per panel, in three files, that must agree. `set_layout` drops a CSS variable it does not recognise, and it drops it silently -- an older browser sending a key a newer release removed must not fail the whole request. The cost of that kindness is that a panel whose width is missing from `LAYOUT_BOUNDS` is one whose drag handle appears to work, moves the edge, and forgets by the next page load. Nothing anywhere says so. So the three are pinned here: the allowlist entry, the `data-resize-min` on the handle, and the `--*-width-min` token the CSS clamps with. """ from __future__ import annotations import re from pathlib import Path import lembas from lembas.api.preferences import LAYOUT_BOUNDS ROOT = Path(lembas.__file__).parent TOKENS = (ROOT / "web/static/css/tokens.css").read_text(encoding="utf-8") TEMPLATES = ROOT / "web/templates" # The panels with a drag handle, and the template each handle lives in. PANELS = { "--terminal-width": "chat/_terminal.html", "--canvas-width": "chat/_canvas.html", } # 1rem, everywhere in this application. REM = 16 def _resize_min(template: str) -> int: text = (TEMPLATES / template).read_text(encoding="utf-8") found = re.search(r'data-resize-min="(\d+)"', text) assert found, f"{template} has a resize handle with no minimum" return int(found.group(1)) def _token_min(name: str) -> int: found = re.search(rf"{re.escape(name)}-min:\s*([\d.]+)rem", TOKENS) assert found, f"{name}-min is not declared in tokens.css" return int(float(found.group(1)) * REM) def test_every_dragged_panel_is_in_the_allowlist(): """Without the entry the drag is silently discarded on the way to the account, so the width survives in one browser and vanishes in the next.""" missing = [name for name in PANELS if name not in LAYOUT_BOUNDS] assert not missing, f"not in LAYOUT_BOUNDS: {missing}" def test_the_three_minimums_agree(): for name, template in PANELS.items(): assert LAYOUT_BOUNDS[name][0] == _resize_min(template) == _token_min(name), name def test_no_bound_lets_a_panel_become_unreachable(): """A width outside these is a panel somebody cannot see well enough to drag back, which is the other half of what the allowlist is for.""" for name, (low, high) in LAYOUT_BOUNDS.items(): assert 0 < low < high, name def test_the_canvas_starts_wider_than_the_terminal(): """A source line is longer than eighty columns once nothing is re-wrapping it, and this one holds prose as well.""" widths = { name: float(re.search(rf"{re.escape(name)}:\s*([\d.]+)rem", TOKENS).group(1)) for name in PANELS } assert widths["--canvas-width"] > widths["--terminal-width"]