diff --git a/CHANGELOG.md b/CHANGELOG.md index 6e938441..05804203 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ ## [Unreleased] +### Fixed + +- Board selector menu labels no longer overlap board titles when board metadata uses a longer text label in the icon/color slot. + ## [v0.51.89] — 2026-05-18 — Release BM (stage-382 — 6-PR full sweep batch — runtime adapter approval/clarify seam + SOUL.md memory panel + #1855 resolve_model_provider fast-path + PWA sidebar spinner fix + /model active-provider preference + contributor contract docs index) ### Changed @@ -71,6 +75,7 @@ - **PR #2479** by @Michaelyklam (refs #1925) — Route Stop Generation through the default-off `RuntimeAdapter.cancel_run(...)` seam when `HERMES_WEBUI_RUNTIME_ADAPTER=legacy-journal` is enabled. Implements the first code slice of the Slice 3a cancel-control gate accepted in #2469 / v0.51.85. The default `legacy-direct` path still calls `cancel_stream(...)` directly; the adapter branch preserves the existing `{ok, cancelled, stream_id}` JSON response contract. No new cancellation registry, runner, sidecar, approval/clarify, queue/goal, or cached-agent state is introduced — adapter remains a pure protocol translator. + ## [v0.51.85] — 2026-05-17 — Release BI (stage-378 — 3-PR batch — workspace-prefix display leakage fix + release-tag update banner + Slice 3a cancel-control gate RFC) ### Fixed diff --git a/docs/images/pr-2458-board-selector-after.png b/docs/images/pr-2458-board-selector-after.png new file mode 100644 index 00000000..0bb0be08 Binary files /dev/null and b/docs/images/pr-2458-board-selector-after.png differ diff --git a/docs/images/pr-2458-board-selector-before.png b/docs/images/pr-2458-board-selector-before.png new file mode 100644 index 00000000..ecf642c0 Binary files /dev/null and b/docs/images/pr-2458-board-selector-before.png differ diff --git a/static/style.css b/static/style.css index 7a594b90..7fdbe915 100644 --- a/static/style.css +++ b/static/style.css @@ -3817,7 +3817,14 @@ main.main.showing-insights > #mainInsights{display:flex;overflow-y:auto;} .kanban-board-switcher-item:hover, .kanban-board-switcher-item:focus{background:var(--accent-bg);outline:none;} .kanban-board-switcher-item.is-current{font-weight:650;} -.kanban-board-switcher-item-icon{font-size:14px;line-height:1;flex-shrink:0;width:18px;text-align:center;} +.kanban-board-switcher-item-icon{ + display:block; + font-size:14px;line-height:1.15; + flex:0 1 auto; + min-width:18px;max-width:7.5rem; + overflow:hidden;text-overflow:ellipsis;white-space:nowrap; + text-align:center; +} .kanban-board-switcher-item-name{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;} .kanban-board-switcher-item-count{ flex-shrink:0;font-size:10px;color:var(--muted); diff --git a/tests/test_kanban_ui_static.py b/tests/test_kanban_ui_static.py index b92c074e..bb517c11 100644 --- a/tests/test_kanban_ui_static.py +++ b/tests/test_kanban_ui_static.py @@ -874,6 +874,28 @@ def test_kanban_board_switcher_handlers_in_panels(): assert fn in PANELS, f"Missing handler: {fn}" +def test_kanban_board_switcher_icon_column_clamps_long_labels(): + """Regression for #2458: board metadata may use a short text label in the + icon/color slot. The menu must keep that label inside its own column instead + of letting it overlap the board title and count badge. + """ + rule = re.search( + r"\.kanban-board-switcher-item-icon\{(?P.*?)\}", + STYLE, + flags=re.S, + ) + assert rule, "missing .kanban-board-switcher-item-icon CSS rule" + compact = re.sub(r"\s+", "", rule.group("body")) + for required in ( + "overflow:hidden", + "text-overflow:ellipsis", + "white-space:nowrap", + "max-width:7.5rem", + "min-width:18px", + ): + assert required in compact + + def test_kanban_board_switcher_calls_correct_endpoints(): """The switcher must hit the right REST verbs to round-trip with the bridge's multi-board contract."""