diff --git a/studio/frontend/src/components/app-sidebar.tsx b/studio/frontend/src/components/app-sidebar.tsx index 6d029a59bd..b1dc286df5 100644 --- a/studio/frontend/src/components/app-sidebar.tsx +++ b/studio/frontend/src/components/app-sidebar.tsx @@ -527,7 +527,7 @@ export function AppSidebar() { className="!size-8" /> -
+
{displayTitle} Studio
diff --git a/studio/frontend/src/components/assistant-ui/model-selector.tsx b/studio/frontend/src/components/assistant-ui/model-selector.tsx index 679034c9fa..4fa39beff4 100644 --- a/studio/frontend/src/components/assistant-ui/model-selector.tsx +++ b/studio/frontend/src/components/assistant-ui/model-selector.tsx @@ -81,7 +81,7 @@ function ModelSelectorTrigger({ )} - + {currentModel?.name ?? "Select model"} {currentModel?.description && ( diff --git a/tests/studio/test_studio_text_descender_clipping.py b/tests/studio/test_studio_text_descender_clipping.py new file mode 100644 index 0000000000..dd0df320bc --- /dev/null +++ b/tests/studio/test_studio_text_descender_clipping.py @@ -0,0 +1,69 @@ +""" +Regression guard: descender-prone text spans in Studio must not pair +`leading-none` with `truncate` (overflow: hidden), which clips glyph +descenders (g, p, q, y, j) in real user-visible labels. +""" + +from __future__ import annotations + +import re +from pathlib import Path + + +WORKDIR = Path(__file__).resolve().parents[2] +MODEL_SELECTOR = ( + WORKDIR + / "studio" + / "frontend" + / "src" + / "components" + / "assistant-ui" + / "model-selector.tsx" +) +APP_SIDEBAR = WORKDIR / "studio" / "frontend" / "src" / "components" / "app-sidebar.tsx" + + +def _read(path: Path) -> str: + assert path.exists(), f"missing source file: {path}" + return path.read_text() + + +def test_model_selector_trigger_label_uses_leading_tight(): + src = _read(MODEL_SELECTOR) + pattern = re.compile( + r'', + ) + matches = pattern.findall(src) + assert matches, "could not find sidebar account-block parent div" + leading_classes = [m for m in matches if m.startswith("leading-")] + assert ( + leading_classes + ), f"no leading-* class on sidebar account-block parent: {matches}" + for cls in leading_classes: + assert ( + cls == "leading-tight" + ), f"sidebar account-block must use leading-tight, got: {cls}" + + +def test_no_truncate_plus_leading_none_in_changed_files(): + for path in (MODEL_SELECTOR, APP_SIDEBAR): + src = _read(path) + for line in src.splitlines(): + if "truncate" in line and "leading-none" in line: + raise AssertionError( + f"{path.name}: same line uses truncate + leading-none, descenders will clip: {line.strip()}" + )