HERMES-GIELIE/tests/test_workspace_panel_session_list.py

271 lines
13 KiB
Python
Raw Normal View History

v0.50.220: workspace panel collapse + project color dot fix (#1090) * fix(ui): workspace panel collapse priority + visible project color dot Two related sidebar UI bugs from project-ui-bugs.md: 1. Workspace panel header had no collapse priority. As the right panel narrowed, all three header children (Workspace label, git badge, icon buttons) compressed at the same rate because `.panel-header` used `justify-content:space-between` with no flex-shrink ratios. The icon buttons -- the actual primary controls -- could disappear before the git badge (which is least-essential metadata). Fix: declare `.rightpanel` as a `container-type:inline-size` container. Replace `justify-content:space-between` with `gap:6px` plus `margin-left:auto` on `.panel-actions`. Set flex-shrink:0 on `.panel-actions` (icons never shrink), flex-shrink:2 on the label, flex-shrink:3 on `.git-badge` (shrinks fastest), and `min-width:0;text-overflow:ellipsis` for graceful intermediate shrink. Add @container queries that crisply set `display:none` on the git badge below 220px and on the label below 160px. 2. Project color dot was appended INSIDE the `.session-title` span, which is `overflow:hidden;text-overflow:ellipsis`. Long titles clipped the dot off entirely -- hiding the project marker exactly when it was most needed. The timestamp was also `position:absolute`, so the title's `flex:1` ran underneath it and there was nowhere coherent to anchor the dot. Fix: in sessions.js, append the dot to `titleRow` between title and timestamp (a flex sibling, not inside the truncating title span). In style.css, move `.session-time` from absolute positioning to `margin-left:auto` in the flex row. Drop the `margin-left:4px/vertical-align:middle` from `.session-project-dot` (gap:6px on the row handles spacing). Reduce `.session-item` padding-right at rest from 86px (which was reserving space for the absolute timestamp) to 8px; expand to 40px on hover/streaming/unread/menu-open/focus-within so the absolute action button + attention indicator still have room. Tests: - tests/test_workspace_panel_session_list.py (14 new tests) - tests/test_issue856_pinned_indicator_layout.py updated to reflect the new flex-flow timestamp + reduced rest-padding Full suite: 2433 passed, 47 skipped, 0 PR-related failures. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * fix(ui): remove duplicate margin-left:auto from .git-badge With .panel-actions already carrying margin-left:auto, both .git-badge and .panel-actions having auto margins split the free space equally, centering the badge instead of keeping it adjacent to the label. Remove margin-left:auto and margin-right:4px from .git-badge. The panel-header gap:6px handles label→badge spacing; panel-actions margin-left:auto owns the right-push. Layout: [label][badge][→][actions]. * fix(ui): mobile session-item padding 86px → 40px + git-badge margin fix Two fixes from Opus independent review of #1089: 1. Mobile padding regression: .session-item mobile override had padding:10px 86px 10px 12px — the 86px was reserving space for the old position:absolute timestamp. Since the timestamp now lives in the flex flow of .session-title-row (margin-left:auto), that 86px reservation is wasted and pushes the timestamp ~76px from the right edge, leaving dead space between it and the always-visible action button. Fixed: 86px → 40px (matching desktop hover/attention rule, only enough for the absolute action button at right:6px + 26px wide). 2. Duplicate margin-left:auto on .git-badge: the old rule from master had margin-left:auto on .git-badge (for the old space-between layout). With .panel-actions also having margin-left:auto, the two auto margins split free space equally, floating the badge to the middle of the header instead of keeping it flush against the label. Removed margin-left:auto and margin-right:4px from .git-badge; gap:6px on .panel-header handles label→badge spacing; .panel-actions margin-left:auto owns the right-push. Updated tests: - test_workspace_panel_session_list.py: assert 40px mobile padding - test_issue856_pinned_indicator_layout.py: assert 40px mobile padding Verified by Playwright visual QA: - Desktop 250px: badge hidden, Workspace label visible, icons visible ✓ - Desktop 150px: badge hidden, label hidden, icons only ✓ - Project dots visible on long-title sessions (outside truncating title span) ✓ - Mobile: padding-right=40px, no layout overflow ✓ * docs: v0.50.220 release notes, test count 2481, roadmap --------- Co-authored-by: Nathan Esquenazi <nesquena@gmail.com> Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com> Co-authored-by: nesquena-hermes <nesquena-hermes@users.noreply.github.com>
2026-04-26 07:19:05 +00:00
"""Regression tests for two related sidebar/panel UI fixes.
1. Workspace panel header collapse priority — as the right panel narrows,
the git-badge must vanish first, the "Workspace" label second, and the
icon buttons last. Previously all three compressed simultaneously
because `.panel-header` used `justify-content:space-between` with no
flex-shrink ratios or container queries.
2. Project color dot truncation — the dot used to be appended INSIDE the
`.session-title` span (which is `overflow:hidden;text-overflow:ellipsis`),
so the dot got clipped along with long titles. Fix moves the dot to a
flex sibling in `.session-title-row` between title and timestamp, and
moves `.session-time` from `position:absolute` to flex flow so the
title's `flex:1` bound stops at the timestamp's left edge.
"""
import pathlib
REPO = pathlib.Path(__file__).parent.parent
SESSIONS_JS = (REPO / "static" / "sessions.js").read_text(encoding="utf-8")
STYLE_CSS = (REPO / "static" / "style.css").read_text(encoding="utf-8")
def _extract_js_function_body(src: str, name: str) -> str:
start = src.find(f"function {name}(")
assert start >= 0, f"function {name} not found"
brace = src.find("{", start)
assert brace >= 0, f"function {name} body not found"
depth = 1
i = brace + 1
while depth > 0 and i < len(src):
if src[i] == "{":
depth += 1
elif src[i] == "}":
depth -= 1
i += 1
assert depth == 0, f"function {name} body did not close"
return src[start:i]
v0.50.220: workspace panel collapse + project color dot fix (#1090) * fix(ui): workspace panel collapse priority + visible project color dot Two related sidebar UI bugs from project-ui-bugs.md: 1. Workspace panel header had no collapse priority. As the right panel narrowed, all three header children (Workspace label, git badge, icon buttons) compressed at the same rate because `.panel-header` used `justify-content:space-between` with no flex-shrink ratios. The icon buttons -- the actual primary controls -- could disappear before the git badge (which is least-essential metadata). Fix: declare `.rightpanel` as a `container-type:inline-size` container. Replace `justify-content:space-between` with `gap:6px` plus `margin-left:auto` on `.panel-actions`. Set flex-shrink:0 on `.panel-actions` (icons never shrink), flex-shrink:2 on the label, flex-shrink:3 on `.git-badge` (shrinks fastest), and `min-width:0;text-overflow:ellipsis` for graceful intermediate shrink. Add @container queries that crisply set `display:none` on the git badge below 220px and on the label below 160px. 2. Project color dot was appended INSIDE the `.session-title` span, which is `overflow:hidden;text-overflow:ellipsis`. Long titles clipped the dot off entirely -- hiding the project marker exactly when it was most needed. The timestamp was also `position:absolute`, so the title's `flex:1` ran underneath it and there was nowhere coherent to anchor the dot. Fix: in sessions.js, append the dot to `titleRow` between title and timestamp (a flex sibling, not inside the truncating title span). In style.css, move `.session-time` from absolute positioning to `margin-left:auto` in the flex row. Drop the `margin-left:4px/vertical-align:middle` from `.session-project-dot` (gap:6px on the row handles spacing). Reduce `.session-item` padding-right at rest from 86px (which was reserving space for the absolute timestamp) to 8px; expand to 40px on hover/streaming/unread/menu-open/focus-within so the absolute action button + attention indicator still have room. Tests: - tests/test_workspace_panel_session_list.py (14 new tests) - tests/test_issue856_pinned_indicator_layout.py updated to reflect the new flex-flow timestamp + reduced rest-padding Full suite: 2433 passed, 47 skipped, 0 PR-related failures. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * fix(ui): remove duplicate margin-left:auto from .git-badge With .panel-actions already carrying margin-left:auto, both .git-badge and .panel-actions having auto margins split the free space equally, centering the badge instead of keeping it adjacent to the label. Remove margin-left:auto and margin-right:4px from .git-badge. The panel-header gap:6px handles label→badge spacing; panel-actions margin-left:auto owns the right-push. Layout: [label][badge][→][actions]. * fix(ui): mobile session-item padding 86px → 40px + git-badge margin fix Two fixes from Opus independent review of #1089: 1. Mobile padding regression: .session-item mobile override had padding:10px 86px 10px 12px — the 86px was reserving space for the old position:absolute timestamp. Since the timestamp now lives in the flex flow of .session-title-row (margin-left:auto), that 86px reservation is wasted and pushes the timestamp ~76px from the right edge, leaving dead space between it and the always-visible action button. Fixed: 86px → 40px (matching desktop hover/attention rule, only enough for the absolute action button at right:6px + 26px wide). 2. Duplicate margin-left:auto on .git-badge: the old rule from master had margin-left:auto on .git-badge (for the old space-between layout). With .panel-actions also having margin-left:auto, the two auto margins split free space equally, floating the badge to the middle of the header instead of keeping it flush against the label. Removed margin-left:auto and margin-right:4px from .git-badge; gap:6px on .panel-header handles label→badge spacing; .panel-actions margin-left:auto owns the right-push. Updated tests: - test_workspace_panel_session_list.py: assert 40px mobile padding - test_issue856_pinned_indicator_layout.py: assert 40px mobile padding Verified by Playwright visual QA: - Desktop 250px: badge hidden, Workspace label visible, icons visible ✓ - Desktop 150px: badge hidden, label hidden, icons only ✓ - Project dots visible on long-title sessions (outside truncating title span) ✓ - Mobile: padding-right=40px, no layout overflow ✓ * docs: v0.50.220 release notes, test count 2481, roadmap --------- Co-authored-by: Nathan Esquenazi <nesquena@gmail.com> Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com> Co-authored-by: nesquena-hermes <nesquena-hermes@users.noreply.github.com>
2026-04-26 07:19:05 +00:00
# ── Bug 1: workspace panel header collapse priority ──────────────────────────
class TestWorkspacePanelCollapsePriority:
def test_rightpanel_is_a_size_container(self):
"""The right panel must declare itself as an inline-size container so
its descendants can run @container queries against the panel's width."""
# Look at the .rightpanel rule body
idx = STYLE_CSS.find(".rightpanel{")
assert idx >= 0, ".rightpanel rule not found"
rule = STYLE_CSS[idx: idx + 1200]
assert "container-type:inline-size" in rule, (
".rightpanel must declare container-type:inline-size for the "
"header collapse-priority @container queries to work."
)
assert "container-name:rightpanel" in rule, (
".rightpanel should be named 'rightpanel' so descendants can "
"scope @container queries explicitly."
)
def test_panel_header_no_longer_uses_space_between(self):
"""`justify-content:space-between` was the root cause of the
simultaneous-shrink behaviour. The header now uses `gap` and
`margin-left:auto` on `.panel-actions` to push them right."""
idx = STYLE_CSS.find(".panel-header{")
rule = STYLE_CSS[idx: STYLE_CSS.find("}", idx) + 1]
assert "justify-content:space-between" not in rule, (
"panel-header still uses justify-content:space-between — that "
"compresses all three children simultaneously."
)
assert "gap:6px" in rule
fix(ux): add has-tooltip--left variant for right-edge buttons + fix tests (1) Send-button tooltip clipping fix: The send button (btnSend) sits at the right edge of the composer area. Its side-positioned tooltip extended 'Send message' (~95px wide) past the viewport edge, leaving only 'Se' visible in some viewports — confirmed by maintainer screenshot review. Added a new `.has-tooltip--left` variant that flips the tooltip to the LEFT side of the trigger via `right: calc(100% + 8px)` instead of `left: calc(100% + 8px)`. Applied to btnSend in index.html. Browser-verified: full 'Send message' text now readable to the left of the gold Send button, no clipping. (2) Test compatibility for the tooltip coverage expansion: 5 pre-existing tests hardcoded specific class strings or 'title=' attributes that no longer apply after we added has-tooltip + replaced title= with data-tooltip= on 11 high-traffic icon buttons. - tests/test_issue1488_composer_voice_buttons.py: - test_dictation_button_has_dictate_i18n_key: accept either title='Dictate' or data-tooltip='Dictate' as the static fallback. - test_buttons_have_distinct_static_titles: extracted helper _static_tooltip() that prefers data-tooltip over title. - tests/test_sprint20.py::test_mic_button_has_mic_btn_class: regex tolerant to additional utility classes between icon-btn and mic-btn (now 'icon-btn mic-btn has-tooltip'). - tests/test_sprint20b.py::test_send_button_has_title_attribute: accept title= OR data-tooltip= per #1775. - tests/test_sprint20b.py::test_send_button_still_has_send_btn_class: regex tolerant to additional utility classes. - tests/test_workspace_panel_session_list.py::TestWorkspacePanelCollapsePriority::test_panel_header_no_longer_uses_space_between: panel-header was changed from overflow:hidden to overflow:visible so its tooltips can escape the header bar. The title-text ellipsis moved to the inner span (.panel-header > span:first-child) which already had its own overflow:hidden + text-overflow:ellipsis. Test now accepts either parent-level or inner-span overflow handling. All 192 of the previously-failing or impacted tests now pass.
2026-05-07 04:30:02 +00:00
# Note: `.panel-header` was changed from overflow:hidden to overflow:visible
# in #1775 so its tooltip pseudo-elements can escape the header bar
# (otherwise the workspace-panel header tooltips like "New file" get
# clipped). The title-text ellipsis is preserved by the inner span
2026-05-15 14:58:24 +00:00
# `.workspace-panel-title-group > span:first-child` which has its own
fix(ux): add has-tooltip--left variant for right-edge buttons + fix tests (1) Send-button tooltip clipping fix: The send button (btnSend) sits at the right edge of the composer area. Its side-positioned tooltip extended 'Send message' (~95px wide) past the viewport edge, leaving only 'Se' visible in some viewports — confirmed by maintainer screenshot review. Added a new `.has-tooltip--left` variant that flips the tooltip to the LEFT side of the trigger via `right: calc(100% + 8px)` instead of `left: calc(100% + 8px)`. Applied to btnSend in index.html. Browser-verified: full 'Send message' text now readable to the left of the gold Send button, no clipping. (2) Test compatibility for the tooltip coverage expansion: 5 pre-existing tests hardcoded specific class strings or 'title=' attributes that no longer apply after we added has-tooltip + replaced title= with data-tooltip= on 11 high-traffic icon buttons. - tests/test_issue1488_composer_voice_buttons.py: - test_dictation_button_has_dictate_i18n_key: accept either title='Dictate' or data-tooltip='Dictate' as the static fallback. - test_buttons_have_distinct_static_titles: extracted helper _static_tooltip() that prefers data-tooltip over title. - tests/test_sprint20.py::test_mic_button_has_mic_btn_class: regex tolerant to additional utility classes between icon-btn and mic-btn (now 'icon-btn mic-btn has-tooltip'). - tests/test_sprint20b.py::test_send_button_has_title_attribute: accept title= OR data-tooltip= per #1775. - tests/test_sprint20b.py::test_send_button_still_has_send_btn_class: regex tolerant to additional utility classes. - tests/test_workspace_panel_session_list.py::TestWorkspacePanelCollapsePriority::test_panel_header_no_longer_uses_space_between: panel-header was changed from overflow:hidden to overflow:visible so its tooltips can escape the header bar. The title-text ellipsis moved to the inner span (.panel-header > span:first-child) which already had its own overflow:hidden + text-overflow:ellipsis. Test now accepts either parent-level or inner-span overflow handling. All 192 of the previously-failing or impacted tests now pass.
2026-05-07 04:30:02 +00:00
# overflow:hidden + text-overflow:ellipsis. So we check that EITHER
# the parent uses overflow:hidden (legacy) or that the inner span
# handles its own ellipsis (current).
if "overflow:hidden" not in rule:
2026-05-15 14:58:24 +00:00
inner_span_idx = STYLE_CSS.find(".workspace-panel-title-group > span:first-child{")
fix(ux): add has-tooltip--left variant for right-edge buttons + fix tests (1) Send-button tooltip clipping fix: The send button (btnSend) sits at the right edge of the composer area. Its side-positioned tooltip extended 'Send message' (~95px wide) past the viewport edge, leaving only 'Se' visible in some viewports — confirmed by maintainer screenshot review. Added a new `.has-tooltip--left` variant that flips the tooltip to the LEFT side of the trigger via `right: calc(100% + 8px)` instead of `left: calc(100% + 8px)`. Applied to btnSend in index.html. Browser-verified: full 'Send message' text now readable to the left of the gold Send button, no clipping. (2) Test compatibility for the tooltip coverage expansion: 5 pre-existing tests hardcoded specific class strings or 'title=' attributes that no longer apply after we added has-tooltip + replaced title= with data-tooltip= on 11 high-traffic icon buttons. - tests/test_issue1488_composer_voice_buttons.py: - test_dictation_button_has_dictate_i18n_key: accept either title='Dictate' or data-tooltip='Dictate' as the static fallback. - test_buttons_have_distinct_static_titles: extracted helper _static_tooltip() that prefers data-tooltip over title. - tests/test_sprint20.py::test_mic_button_has_mic_btn_class: regex tolerant to additional utility classes between icon-btn and mic-btn (now 'icon-btn mic-btn has-tooltip'). - tests/test_sprint20b.py::test_send_button_has_title_attribute: accept title= OR data-tooltip= per #1775. - tests/test_sprint20b.py::test_send_button_still_has_send_btn_class: regex tolerant to additional utility classes. - tests/test_workspace_panel_session_list.py::TestWorkspacePanelCollapsePriority::test_panel_header_no_longer_uses_space_between: panel-header was changed from overflow:hidden to overflow:visible so its tooltips can escape the header bar. The title-text ellipsis moved to the inner span (.panel-header > span:first-child) which already had its own overflow:hidden + text-overflow:ellipsis. Test now accepts either parent-level or inner-span overflow handling. All 192 of the previously-failing or impacted tests now pass.
2026-05-07 04:30:02 +00:00
assert inner_span_idx != -1, (
".panel-header lost overflow:hidden but no inner span "
2026-05-15 14:58:24 +00:00
"rule (.workspace-panel-title-group > span:first-child) handles the "
fix(ux): add has-tooltip--left variant for right-edge buttons + fix tests (1) Send-button tooltip clipping fix: The send button (btnSend) sits at the right edge of the composer area. Its side-positioned tooltip extended 'Send message' (~95px wide) past the viewport edge, leaving only 'Se' visible in some viewports — confirmed by maintainer screenshot review. Added a new `.has-tooltip--left` variant that flips the tooltip to the LEFT side of the trigger via `right: calc(100% + 8px)` instead of `left: calc(100% + 8px)`. Applied to btnSend in index.html. Browser-verified: full 'Send message' text now readable to the left of the gold Send button, no clipping. (2) Test compatibility for the tooltip coverage expansion: 5 pre-existing tests hardcoded specific class strings or 'title=' attributes that no longer apply after we added has-tooltip + replaced title= with data-tooltip= on 11 high-traffic icon buttons. - tests/test_issue1488_composer_voice_buttons.py: - test_dictation_button_has_dictate_i18n_key: accept either title='Dictate' or data-tooltip='Dictate' as the static fallback. - test_buttons_have_distinct_static_titles: extracted helper _static_tooltip() that prefers data-tooltip over title. - tests/test_sprint20.py::test_mic_button_has_mic_btn_class: regex tolerant to additional utility classes between icon-btn and mic-btn (now 'icon-btn mic-btn has-tooltip'). - tests/test_sprint20b.py::test_send_button_has_title_attribute: accept title= OR data-tooltip= per #1775. - tests/test_sprint20b.py::test_send_button_still_has_send_btn_class: regex tolerant to additional utility classes. - tests/test_workspace_panel_session_list.py::TestWorkspacePanelCollapsePriority::test_panel_header_no_longer_uses_space_between: panel-header was changed from overflow:hidden to overflow:visible so its tooltips can escape the header bar. The title-text ellipsis moved to the inner span (.panel-header > span:first-child) which already had its own overflow:hidden + text-overflow:ellipsis. Test now accepts either parent-level or inner-span overflow handling. All 192 of the previously-failing or impacted tests now pass.
2026-05-07 04:30:02 +00:00
"title-text ellipsis as a fallback."
)
inner_rule = STYLE_CSS[inner_span_idx: STYLE_CSS.find("}", inner_span_idx) + 1]
assert "overflow:hidden" in inner_rule and "text-overflow:ellipsis" in inner_rule, (
2026-05-15 14:58:24 +00:00
".workspace-panel-title-group > span:first-child must own the ellipsis "
fix(ux): add has-tooltip--left variant for right-edge buttons + fix tests (1) Send-button tooltip clipping fix: The send button (btnSend) sits at the right edge of the composer area. Its side-positioned tooltip extended 'Send message' (~95px wide) past the viewport edge, leaving only 'Se' visible in some viewports — confirmed by maintainer screenshot review. Added a new `.has-tooltip--left` variant that flips the tooltip to the LEFT side of the trigger via `right: calc(100% + 8px)` instead of `left: calc(100% + 8px)`. Applied to btnSend in index.html. Browser-verified: full 'Send message' text now readable to the left of the gold Send button, no clipping. (2) Test compatibility for the tooltip coverage expansion: 5 pre-existing tests hardcoded specific class strings or 'title=' attributes that no longer apply after we added has-tooltip + replaced title= with data-tooltip= on 11 high-traffic icon buttons. - tests/test_issue1488_composer_voice_buttons.py: - test_dictation_button_has_dictate_i18n_key: accept either title='Dictate' or data-tooltip='Dictate' as the static fallback. - test_buttons_have_distinct_static_titles: extracted helper _static_tooltip() that prefers data-tooltip over title. - tests/test_sprint20.py::test_mic_button_has_mic_btn_class: regex tolerant to additional utility classes between icon-btn and mic-btn (now 'icon-btn mic-btn has-tooltip'). - tests/test_sprint20b.py::test_send_button_has_title_attribute: accept title= OR data-tooltip= per #1775. - tests/test_sprint20b.py::test_send_button_still_has_send_btn_class: regex tolerant to additional utility classes. - tests/test_workspace_panel_session_list.py::TestWorkspacePanelCollapsePriority::test_panel_header_no_longer_uses_space_between: panel-header was changed from overflow:hidden to overflow:visible so its tooltips can escape the header bar. The title-text ellipsis moved to the inner span (.panel-header > span:first-child) which already had its own overflow:hidden + text-overflow:ellipsis. Test now accepts either parent-level or inner-span overflow handling. All 192 of the previously-failing or impacted tests now pass.
2026-05-07 04:30:02 +00:00
"behaviour now that the parent is overflow:visible."
)
v0.50.220: workspace panel collapse + project color dot fix (#1090) * fix(ui): workspace panel collapse priority + visible project color dot Two related sidebar UI bugs from project-ui-bugs.md: 1. Workspace panel header had no collapse priority. As the right panel narrowed, all three header children (Workspace label, git badge, icon buttons) compressed at the same rate because `.panel-header` used `justify-content:space-between` with no flex-shrink ratios. The icon buttons -- the actual primary controls -- could disappear before the git badge (which is least-essential metadata). Fix: declare `.rightpanel` as a `container-type:inline-size` container. Replace `justify-content:space-between` with `gap:6px` plus `margin-left:auto` on `.panel-actions`. Set flex-shrink:0 on `.panel-actions` (icons never shrink), flex-shrink:2 on the label, flex-shrink:3 on `.git-badge` (shrinks fastest), and `min-width:0;text-overflow:ellipsis` for graceful intermediate shrink. Add @container queries that crisply set `display:none` on the git badge below 220px and on the label below 160px. 2. Project color dot was appended INSIDE the `.session-title` span, which is `overflow:hidden;text-overflow:ellipsis`. Long titles clipped the dot off entirely -- hiding the project marker exactly when it was most needed. The timestamp was also `position:absolute`, so the title's `flex:1` ran underneath it and there was nowhere coherent to anchor the dot. Fix: in sessions.js, append the dot to `titleRow` between title and timestamp (a flex sibling, not inside the truncating title span). In style.css, move `.session-time` from absolute positioning to `margin-left:auto` in the flex row. Drop the `margin-left:4px/vertical-align:middle` from `.session-project-dot` (gap:6px on the row handles spacing). Reduce `.session-item` padding-right at rest from 86px (which was reserving space for the absolute timestamp) to 8px; expand to 40px on hover/streaming/unread/menu-open/focus-within so the absolute action button + attention indicator still have room. Tests: - tests/test_workspace_panel_session_list.py (14 new tests) - tests/test_issue856_pinned_indicator_layout.py updated to reflect the new flex-flow timestamp + reduced rest-padding Full suite: 2433 passed, 47 skipped, 0 PR-related failures. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * fix(ui): remove duplicate margin-left:auto from .git-badge With .panel-actions already carrying margin-left:auto, both .git-badge and .panel-actions having auto margins split the free space equally, centering the badge instead of keeping it adjacent to the label. Remove margin-left:auto and margin-right:4px from .git-badge. The panel-header gap:6px handles label→badge spacing; panel-actions margin-left:auto owns the right-push. Layout: [label][badge][→][actions]. * fix(ui): mobile session-item padding 86px → 40px + git-badge margin fix Two fixes from Opus independent review of #1089: 1. Mobile padding regression: .session-item mobile override had padding:10px 86px 10px 12px — the 86px was reserving space for the old position:absolute timestamp. Since the timestamp now lives in the flex flow of .session-title-row (margin-left:auto), that 86px reservation is wasted and pushes the timestamp ~76px from the right edge, leaving dead space between it and the always-visible action button. Fixed: 86px → 40px (matching desktop hover/attention rule, only enough for the absolute action button at right:6px + 26px wide). 2. Duplicate margin-left:auto on .git-badge: the old rule from master had margin-left:auto on .git-badge (for the old space-between layout). With .panel-actions also having margin-left:auto, the two auto margins split free space equally, floating the badge to the middle of the header instead of keeping it flush against the label. Removed margin-left:auto and margin-right:4px from .git-badge; gap:6px on .panel-header handles label→badge spacing; .panel-actions margin-left:auto owns the right-push. Updated tests: - test_workspace_panel_session_list.py: assert 40px mobile padding - test_issue856_pinned_indicator_layout.py: assert 40px mobile padding Verified by Playwright visual QA: - Desktop 250px: badge hidden, Workspace label visible, icons visible ✓ - Desktop 150px: badge hidden, label hidden, icons only ✓ - Project dots visible on long-title sessions (outside truncating title span) ✓ - Mobile: padding-right=40px, no layout overflow ✓ * docs: v0.50.220 release notes, test count 2481, roadmap --------- Co-authored-by: Nathan Esquenazi <nesquena@gmail.com> Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com> Co-authored-by: nesquena-hermes <nesquena-hermes@users.noreply.github.com>
2026-04-26 07:19:05 +00:00
def test_panel_actions_pushed_right_and_never_shrinks(self):
"""`.panel-actions` must have flex-shrink:0 and margin-left:auto so
the icon buttons stay visible no matter how narrow the panel gets,
and they sit at the right edge once `space-between` is removed."""
idx = STYLE_CSS.find(".panel-actions{")
rule = STYLE_CSS[idx: STYLE_CSS.find("}", idx)]
assert "flex-shrink:0" in rule, (
".panel-actions must not shrink — icons are the priority."
)
assert "margin-left:auto" in rule, (
".panel-actions must use margin-left:auto to push to the right "
"now that justify-content:space-between is gone."
)
def test_workspace_label_shrinks_with_ellipsis(self):
2026-05-15 14:58:24 +00:00
"""The "Workspace" label must shrink with ellipsis truncation."""
v0.50.220: workspace panel collapse + project color dot fix (#1090) * fix(ui): workspace panel collapse priority + visible project color dot Two related sidebar UI bugs from project-ui-bugs.md: 1. Workspace panel header had no collapse priority. As the right panel narrowed, all three header children (Workspace label, git badge, icon buttons) compressed at the same rate because `.panel-header` used `justify-content:space-between` with no flex-shrink ratios. The icon buttons -- the actual primary controls -- could disappear before the git badge (which is least-essential metadata). Fix: declare `.rightpanel` as a `container-type:inline-size` container. Replace `justify-content:space-between` with `gap:6px` plus `margin-left:auto` on `.panel-actions`. Set flex-shrink:0 on `.panel-actions` (icons never shrink), flex-shrink:2 on the label, flex-shrink:3 on `.git-badge` (shrinks fastest), and `min-width:0;text-overflow:ellipsis` for graceful intermediate shrink. Add @container queries that crisply set `display:none` on the git badge below 220px and on the label below 160px. 2. Project color dot was appended INSIDE the `.session-title` span, which is `overflow:hidden;text-overflow:ellipsis`. Long titles clipped the dot off entirely -- hiding the project marker exactly when it was most needed. The timestamp was also `position:absolute`, so the title's `flex:1` ran underneath it and there was nowhere coherent to anchor the dot. Fix: in sessions.js, append the dot to `titleRow` between title and timestamp (a flex sibling, not inside the truncating title span). In style.css, move `.session-time` from absolute positioning to `margin-left:auto` in the flex row. Drop the `margin-left:4px/vertical-align:middle` from `.session-project-dot` (gap:6px on the row handles spacing). Reduce `.session-item` padding-right at rest from 86px (which was reserving space for the absolute timestamp) to 8px; expand to 40px on hover/streaming/unread/menu-open/focus-within so the absolute action button + attention indicator still have room. Tests: - tests/test_workspace_panel_session_list.py (14 new tests) - tests/test_issue856_pinned_indicator_layout.py updated to reflect the new flex-flow timestamp + reduced rest-padding Full suite: 2433 passed, 47 skipped, 0 PR-related failures. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * fix(ui): remove duplicate margin-left:auto from .git-badge With .panel-actions already carrying margin-left:auto, both .git-badge and .panel-actions having auto margins split the free space equally, centering the badge instead of keeping it adjacent to the label. Remove margin-left:auto and margin-right:4px from .git-badge. The panel-header gap:6px handles label→badge spacing; panel-actions margin-left:auto owns the right-push. Layout: [label][badge][→][actions]. * fix(ui): mobile session-item padding 86px → 40px + git-badge margin fix Two fixes from Opus independent review of #1089: 1. Mobile padding regression: .session-item mobile override had padding:10px 86px 10px 12px — the 86px was reserving space for the old position:absolute timestamp. Since the timestamp now lives in the flex flow of .session-title-row (margin-left:auto), that 86px reservation is wasted and pushes the timestamp ~76px from the right edge, leaving dead space between it and the always-visible action button. Fixed: 86px → 40px (matching desktop hover/attention rule, only enough for the absolute action button at right:6px + 26px wide). 2. Duplicate margin-left:auto on .git-badge: the old rule from master had margin-left:auto on .git-badge (for the old space-between layout). With .panel-actions also having margin-left:auto, the two auto margins split free space equally, floating the badge to the middle of the header instead of keeping it flush against the label. Removed margin-left:auto and margin-right:4px from .git-badge; gap:6px on .panel-header handles label→badge spacing; .panel-actions margin-left:auto owns the right-push. Updated tests: - test_workspace_panel_session_list.py: assert 40px mobile padding - test_issue856_pinned_indicator_layout.py: assert 40px mobile padding Verified by Playwright visual QA: - Desktop 250px: badge hidden, Workspace label visible, icons visible ✓ - Desktop 150px: badge hidden, label hidden, icons only ✓ - Project dots visible on long-title sessions (outside truncating title span) ✓ - Mobile: padding-right=40px, no layout overflow ✓ * docs: v0.50.220 release notes, test count 2481, roadmap --------- Co-authored-by: Nathan Esquenazi <nesquena@gmail.com> Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com> Co-authored-by: nesquena-hermes <nesquena-hermes@users.noreply.github.com>
2026-04-26 07:19:05 +00:00
# Find the rule
2026-05-15 14:58:24 +00:00
sel = ".workspace-panel-title-group > span:first-child"
v0.50.220: workspace panel collapse + project color dot fix (#1090) * fix(ui): workspace panel collapse priority + visible project color dot Two related sidebar UI bugs from project-ui-bugs.md: 1. Workspace panel header had no collapse priority. As the right panel narrowed, all three header children (Workspace label, git badge, icon buttons) compressed at the same rate because `.panel-header` used `justify-content:space-between` with no flex-shrink ratios. The icon buttons -- the actual primary controls -- could disappear before the git badge (which is least-essential metadata). Fix: declare `.rightpanel` as a `container-type:inline-size` container. Replace `justify-content:space-between` with `gap:6px` plus `margin-left:auto` on `.panel-actions`. Set flex-shrink:0 on `.panel-actions` (icons never shrink), flex-shrink:2 on the label, flex-shrink:3 on `.git-badge` (shrinks fastest), and `min-width:0;text-overflow:ellipsis` for graceful intermediate shrink. Add @container queries that crisply set `display:none` on the git badge below 220px and on the label below 160px. 2. Project color dot was appended INSIDE the `.session-title` span, which is `overflow:hidden;text-overflow:ellipsis`. Long titles clipped the dot off entirely -- hiding the project marker exactly when it was most needed. The timestamp was also `position:absolute`, so the title's `flex:1` ran underneath it and there was nowhere coherent to anchor the dot. Fix: in sessions.js, append the dot to `titleRow` between title and timestamp (a flex sibling, not inside the truncating title span). In style.css, move `.session-time` from absolute positioning to `margin-left:auto` in the flex row. Drop the `margin-left:4px/vertical-align:middle` from `.session-project-dot` (gap:6px on the row handles spacing). Reduce `.session-item` padding-right at rest from 86px (which was reserving space for the absolute timestamp) to 8px; expand to 40px on hover/streaming/unread/menu-open/focus-within so the absolute action button + attention indicator still have room. Tests: - tests/test_workspace_panel_session_list.py (14 new tests) - tests/test_issue856_pinned_indicator_layout.py updated to reflect the new flex-flow timestamp + reduced rest-padding Full suite: 2433 passed, 47 skipped, 0 PR-related failures. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * fix(ui): remove duplicate margin-left:auto from .git-badge With .panel-actions already carrying margin-left:auto, both .git-badge and .panel-actions having auto margins split the free space equally, centering the badge instead of keeping it adjacent to the label. Remove margin-left:auto and margin-right:4px from .git-badge. The panel-header gap:6px handles label→badge spacing; panel-actions margin-left:auto owns the right-push. Layout: [label][badge][→][actions]. * fix(ui): mobile session-item padding 86px → 40px + git-badge margin fix Two fixes from Opus independent review of #1089: 1. Mobile padding regression: .session-item mobile override had padding:10px 86px 10px 12px — the 86px was reserving space for the old position:absolute timestamp. Since the timestamp now lives in the flex flow of .session-title-row (margin-left:auto), that 86px reservation is wasted and pushes the timestamp ~76px from the right edge, leaving dead space between it and the always-visible action button. Fixed: 86px → 40px (matching desktop hover/attention rule, only enough for the absolute action button at right:6px + 26px wide). 2. Duplicate margin-left:auto on .git-badge: the old rule from master had margin-left:auto on .git-badge (for the old space-between layout). With .panel-actions also having margin-left:auto, the two auto margins split free space equally, floating the badge to the middle of the header instead of keeping it flush against the label. Removed margin-left:auto and margin-right:4px from .git-badge; gap:6px on .panel-header handles label→badge spacing; .panel-actions margin-left:auto owns the right-push. Updated tests: - test_workspace_panel_session_list.py: assert 40px mobile padding - test_issue856_pinned_indicator_layout.py: assert 40px mobile padding Verified by Playwright visual QA: - Desktop 250px: badge hidden, Workspace label visible, icons visible ✓ - Desktop 150px: badge hidden, label hidden, icons only ✓ - Project dots visible on long-title sessions (outside truncating title span) ✓ - Mobile: padding-right=40px, no layout overflow ✓ * docs: v0.50.220 release notes, test count 2481, roadmap --------- Co-authored-by: Nathan Esquenazi <nesquena@gmail.com> Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com> Co-authored-by: nesquena-hermes <nesquena-hermes@users.noreply.github.com>
2026-04-26 07:19:05 +00:00
idx = STYLE_CSS.find(sel)
assert idx >= 0, f"Selector {sel!r} not found in style.css"
rule = STYLE_CSS[idx: STYLE_CSS.find("}", idx)]
assert "text-overflow:ellipsis" in rule
assert "min-width:0" in rule
2026-05-15 14:58:24 +00:00
def test_git_badge_uses_second_row(self):
"""`.git-badge` should sit beneath the title/action row."""
v0.50.220: workspace panel collapse + project color dot fix (#1090) * fix(ui): workspace panel collapse priority + visible project color dot Two related sidebar UI bugs from project-ui-bugs.md: 1. Workspace panel header had no collapse priority. As the right panel narrowed, all three header children (Workspace label, git badge, icon buttons) compressed at the same rate because `.panel-header` used `justify-content:space-between` with no flex-shrink ratios. The icon buttons -- the actual primary controls -- could disappear before the git badge (which is least-essential metadata). Fix: declare `.rightpanel` as a `container-type:inline-size` container. Replace `justify-content:space-between` with `gap:6px` plus `margin-left:auto` on `.panel-actions`. Set flex-shrink:0 on `.panel-actions` (icons never shrink), flex-shrink:2 on the label, flex-shrink:3 on `.git-badge` (shrinks fastest), and `min-width:0;text-overflow:ellipsis` for graceful intermediate shrink. Add @container queries that crisply set `display:none` on the git badge below 220px and on the label below 160px. 2. Project color dot was appended INSIDE the `.session-title` span, which is `overflow:hidden;text-overflow:ellipsis`. Long titles clipped the dot off entirely -- hiding the project marker exactly when it was most needed. The timestamp was also `position:absolute`, so the title's `flex:1` ran underneath it and there was nowhere coherent to anchor the dot. Fix: in sessions.js, append the dot to `titleRow` between title and timestamp (a flex sibling, not inside the truncating title span). In style.css, move `.session-time` from absolute positioning to `margin-left:auto` in the flex row. Drop the `margin-left:4px/vertical-align:middle` from `.session-project-dot` (gap:6px on the row handles spacing). Reduce `.session-item` padding-right at rest from 86px (which was reserving space for the absolute timestamp) to 8px; expand to 40px on hover/streaming/unread/menu-open/focus-within so the absolute action button + attention indicator still have room. Tests: - tests/test_workspace_panel_session_list.py (14 new tests) - tests/test_issue856_pinned_indicator_layout.py updated to reflect the new flex-flow timestamp + reduced rest-padding Full suite: 2433 passed, 47 skipped, 0 PR-related failures. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * fix(ui): remove duplicate margin-left:auto from .git-badge With .panel-actions already carrying margin-left:auto, both .git-badge and .panel-actions having auto margins split the free space equally, centering the badge instead of keeping it adjacent to the label. Remove margin-left:auto and margin-right:4px from .git-badge. The panel-header gap:6px handles label→badge spacing; panel-actions margin-left:auto owns the right-push. Layout: [label][badge][→][actions]. * fix(ui): mobile session-item padding 86px → 40px + git-badge margin fix Two fixes from Opus independent review of #1089: 1. Mobile padding regression: .session-item mobile override had padding:10px 86px 10px 12px — the 86px was reserving space for the old position:absolute timestamp. Since the timestamp now lives in the flex flow of .session-title-row (margin-left:auto), that 86px reservation is wasted and pushes the timestamp ~76px from the right edge, leaving dead space between it and the always-visible action button. Fixed: 86px → 40px (matching desktop hover/attention rule, only enough for the absolute action button at right:6px + 26px wide). 2. Duplicate margin-left:auto on .git-badge: the old rule from master had margin-left:auto on .git-badge (for the old space-between layout). With .panel-actions also having margin-left:auto, the two auto margins split free space equally, floating the badge to the middle of the header instead of keeping it flush against the label. Removed margin-left:auto and margin-right:4px from .git-badge; gap:6px on .panel-header handles label→badge spacing; .panel-actions margin-left:auto owns the right-push. Updated tests: - test_workspace_panel_session_list.py: assert 40px mobile padding - test_issue856_pinned_indicator_layout.py: assert 40px mobile padding Verified by Playwright visual QA: - Desktop 250px: badge hidden, Workspace label visible, icons visible ✓ - Desktop 150px: badge hidden, label hidden, icons only ✓ - Project dots visible on long-title sessions (outside truncating title span) ✓ - Mobile: padding-right=40px, no layout overflow ✓ * docs: v0.50.220 release notes, test count 2481, roadmap --------- Co-authored-by: Nathan Esquenazi <nesquena@gmail.com> Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com> Co-authored-by: nesquena-hermes <nesquena-hermes@users.noreply.github.com>
2026-04-26 07:19:05 +00:00
idx = STYLE_CSS.find(".git-badge{")
rule = STYLE_CSS[idx: STYLE_CSS.find("}", idx)]
2026-05-15 14:58:24 +00:00
assert "grid-column:1 / -1" in rule
assert "grid-row:2" in rule
v0.50.220: workspace panel collapse + project color dot fix (#1090) * fix(ui): workspace panel collapse priority + visible project color dot Two related sidebar UI bugs from project-ui-bugs.md: 1. Workspace panel header had no collapse priority. As the right panel narrowed, all three header children (Workspace label, git badge, icon buttons) compressed at the same rate because `.panel-header` used `justify-content:space-between` with no flex-shrink ratios. The icon buttons -- the actual primary controls -- could disappear before the git badge (which is least-essential metadata). Fix: declare `.rightpanel` as a `container-type:inline-size` container. Replace `justify-content:space-between` with `gap:6px` plus `margin-left:auto` on `.panel-actions`. Set flex-shrink:0 on `.panel-actions` (icons never shrink), flex-shrink:2 on the label, flex-shrink:3 on `.git-badge` (shrinks fastest), and `min-width:0;text-overflow:ellipsis` for graceful intermediate shrink. Add @container queries that crisply set `display:none` on the git badge below 220px and on the label below 160px. 2. Project color dot was appended INSIDE the `.session-title` span, which is `overflow:hidden;text-overflow:ellipsis`. Long titles clipped the dot off entirely -- hiding the project marker exactly when it was most needed. The timestamp was also `position:absolute`, so the title's `flex:1` ran underneath it and there was nowhere coherent to anchor the dot. Fix: in sessions.js, append the dot to `titleRow` between title and timestamp (a flex sibling, not inside the truncating title span). In style.css, move `.session-time` from absolute positioning to `margin-left:auto` in the flex row. Drop the `margin-left:4px/vertical-align:middle` from `.session-project-dot` (gap:6px on the row handles spacing). Reduce `.session-item` padding-right at rest from 86px (which was reserving space for the absolute timestamp) to 8px; expand to 40px on hover/streaming/unread/menu-open/focus-within so the absolute action button + attention indicator still have room. Tests: - tests/test_workspace_panel_session_list.py (14 new tests) - tests/test_issue856_pinned_indicator_layout.py updated to reflect the new flex-flow timestamp + reduced rest-padding Full suite: 2433 passed, 47 skipped, 0 PR-related failures. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * fix(ui): remove duplicate margin-left:auto from .git-badge With .panel-actions already carrying margin-left:auto, both .git-badge and .panel-actions having auto margins split the free space equally, centering the badge instead of keeping it adjacent to the label. Remove margin-left:auto and margin-right:4px from .git-badge. The panel-header gap:6px handles label→badge spacing; panel-actions margin-left:auto owns the right-push. Layout: [label][badge][→][actions]. * fix(ui): mobile session-item padding 86px → 40px + git-badge margin fix Two fixes from Opus independent review of #1089: 1. Mobile padding regression: .session-item mobile override had padding:10px 86px 10px 12px — the 86px was reserving space for the old position:absolute timestamp. Since the timestamp now lives in the flex flow of .session-title-row (margin-left:auto), that 86px reservation is wasted and pushes the timestamp ~76px from the right edge, leaving dead space between it and the always-visible action button. Fixed: 86px → 40px (matching desktop hover/attention rule, only enough for the absolute action button at right:6px + 26px wide). 2. Duplicate margin-left:auto on .git-badge: the old rule from master had margin-left:auto on .git-badge (for the old space-between layout). With .panel-actions also having margin-left:auto, the two auto margins split free space equally, floating the badge to the middle of the header instead of keeping it flush against the label. Removed margin-left:auto and margin-right:4px from .git-badge; gap:6px on .panel-header handles label→badge spacing; .panel-actions margin-left:auto owns the right-push. Updated tests: - test_workspace_panel_session_list.py: assert 40px mobile padding - test_issue856_pinned_indicator_layout.py: assert 40px mobile padding Verified by Playwright visual QA: - Desktop 250px: badge hidden, Workspace label visible, icons visible ✓ - Desktop 150px: badge hidden, label hidden, icons only ✓ - Project dots visible on long-title sessions (outside truncating title span) ✓ - Mobile: padding-right=40px, no layout overflow ✓ * docs: v0.50.220 release notes, test count 2481, roadmap --------- Co-authored-by: Nathan Esquenazi <nesquena@gmail.com> Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com> Co-authored-by: nesquena-hermes <nesquena-hermes@users.noreply.github.com>
2026-04-26 07:19:05 +00:00
def test_container_query_hides_git_badge_first(self):
"""At narrow widths the git badge gets `display:none` BEFORE the
label is hidden — git badge first."""
# The container query block for hiding git badge
assert "@container rightpanel (max-width: 220px)" in STYLE_CSS, (
"Missing @container rule to hide .git-badge at narrow widths"
)
# Find the block and check git-badge is targeted
idx = STYLE_CSS.find("@container rightpanel (max-width: 220px)")
block = STYLE_CSS[idx: idx + 200]
assert ".git-badge{display:none" in block
def test_container_query_hides_label_at_narrower_width(self):
"""The label hides at a NARROWER threshold than the git badge —
confirms collapse priority order."""
assert "@container rightpanel (max-width: 160px)" in STYLE_CSS
idx = STYLE_CSS.find("@container rightpanel (max-width: 160px)")
block = STYLE_CSS[idx: idx + 200]
2026-05-15 14:58:24 +00:00
assert ".workspace-panel-title-group{display:none" in block
v0.50.220: workspace panel collapse + project color dot fix (#1090) * fix(ui): workspace panel collapse priority + visible project color dot Two related sidebar UI bugs from project-ui-bugs.md: 1. Workspace panel header had no collapse priority. As the right panel narrowed, all three header children (Workspace label, git badge, icon buttons) compressed at the same rate because `.panel-header` used `justify-content:space-between` with no flex-shrink ratios. The icon buttons -- the actual primary controls -- could disappear before the git badge (which is least-essential metadata). Fix: declare `.rightpanel` as a `container-type:inline-size` container. Replace `justify-content:space-between` with `gap:6px` plus `margin-left:auto` on `.panel-actions`. Set flex-shrink:0 on `.panel-actions` (icons never shrink), flex-shrink:2 on the label, flex-shrink:3 on `.git-badge` (shrinks fastest), and `min-width:0;text-overflow:ellipsis` for graceful intermediate shrink. Add @container queries that crisply set `display:none` on the git badge below 220px and on the label below 160px. 2. Project color dot was appended INSIDE the `.session-title` span, which is `overflow:hidden;text-overflow:ellipsis`. Long titles clipped the dot off entirely -- hiding the project marker exactly when it was most needed. The timestamp was also `position:absolute`, so the title's `flex:1` ran underneath it and there was nowhere coherent to anchor the dot. Fix: in sessions.js, append the dot to `titleRow` between title and timestamp (a flex sibling, not inside the truncating title span). In style.css, move `.session-time` from absolute positioning to `margin-left:auto` in the flex row. Drop the `margin-left:4px/vertical-align:middle` from `.session-project-dot` (gap:6px on the row handles spacing). Reduce `.session-item` padding-right at rest from 86px (which was reserving space for the absolute timestamp) to 8px; expand to 40px on hover/streaming/unread/menu-open/focus-within so the absolute action button + attention indicator still have room. Tests: - tests/test_workspace_panel_session_list.py (14 new tests) - tests/test_issue856_pinned_indicator_layout.py updated to reflect the new flex-flow timestamp + reduced rest-padding Full suite: 2433 passed, 47 skipped, 0 PR-related failures. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * fix(ui): remove duplicate margin-left:auto from .git-badge With .panel-actions already carrying margin-left:auto, both .git-badge and .panel-actions having auto margins split the free space equally, centering the badge instead of keeping it adjacent to the label. Remove margin-left:auto and margin-right:4px from .git-badge. The panel-header gap:6px handles label→badge spacing; panel-actions margin-left:auto owns the right-push. Layout: [label][badge][→][actions]. * fix(ui): mobile session-item padding 86px → 40px + git-badge margin fix Two fixes from Opus independent review of #1089: 1. Mobile padding regression: .session-item mobile override had padding:10px 86px 10px 12px — the 86px was reserving space for the old position:absolute timestamp. Since the timestamp now lives in the flex flow of .session-title-row (margin-left:auto), that 86px reservation is wasted and pushes the timestamp ~76px from the right edge, leaving dead space between it and the always-visible action button. Fixed: 86px → 40px (matching desktop hover/attention rule, only enough for the absolute action button at right:6px + 26px wide). 2. Duplicate margin-left:auto on .git-badge: the old rule from master had margin-left:auto on .git-badge (for the old space-between layout). With .panel-actions also having margin-left:auto, the two auto margins split free space equally, floating the badge to the middle of the header instead of keeping it flush against the label. Removed margin-left:auto and margin-right:4px from .git-badge; gap:6px on .panel-header handles label→badge spacing; .panel-actions margin-left:auto owns the right-push. Updated tests: - test_workspace_panel_session_list.py: assert 40px mobile padding - test_issue856_pinned_indicator_layout.py: assert 40px mobile padding Verified by Playwright visual QA: - Desktop 250px: badge hidden, Workspace label visible, icons visible ✓ - Desktop 150px: badge hidden, label hidden, icons only ✓ - Project dots visible on long-title sessions (outside truncating title span) ✓ - Mobile: padding-right=40px, no layout overflow ✓ * docs: v0.50.220 release notes, test count 2481, roadmap --------- Co-authored-by: Nathan Esquenazi <nesquena@gmail.com> Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com> Co-authored-by: nesquena-hermes <nesquena-hermes@users.noreply.github.com>
2026-04-26 07:19:05 +00:00
def test_breakpoints_in_correct_order(self):
"""Sanity: the git-badge breakpoint (220px) must be wider than the
label breakpoint (160px). Otherwise the label would vanish first."""
# Both queries exist — extract numeric thresholds
import re
matches = re.findall(
r"@container rightpanel \(max-width:\s*(\d+)px\)", STYLE_CSS
)
assert len(matches) >= 2
thresholds = [int(m) for m in matches]
# First threshold (git badge) must be larger than label threshold
assert thresholds[0] > thresholds[1], (
f"Git badge breakpoint ({thresholds[0]}px) must be wider than "
f"label breakpoint ({thresholds[1]}px) so git-badge hides first."
)
# ── Bug 2: project color dot placement ───────────────────────────────────────
class TestProjectDotPlacement:
def test_dot_appended_to_title_row_not_title(self):
"""The project dot must be appended to `titleRow` (a flex sibling
of the title and timestamp), not to the title span (which truncates
with ellipsis and would clip the dot off long titles)."""
# Find _renderOneSession body
body = _extract_js_function_body(SESSIONS_JS, "_renderOneSession")
v0.50.220: workspace panel collapse + project color dot fix (#1090) * fix(ui): workspace panel collapse priority + visible project color dot Two related sidebar UI bugs from project-ui-bugs.md: 1. Workspace panel header had no collapse priority. As the right panel narrowed, all three header children (Workspace label, git badge, icon buttons) compressed at the same rate because `.panel-header` used `justify-content:space-between` with no flex-shrink ratios. The icon buttons -- the actual primary controls -- could disappear before the git badge (which is least-essential metadata). Fix: declare `.rightpanel` as a `container-type:inline-size` container. Replace `justify-content:space-between` with `gap:6px` plus `margin-left:auto` on `.panel-actions`. Set flex-shrink:0 on `.panel-actions` (icons never shrink), flex-shrink:2 on the label, flex-shrink:3 on `.git-badge` (shrinks fastest), and `min-width:0;text-overflow:ellipsis` for graceful intermediate shrink. Add @container queries that crisply set `display:none` on the git badge below 220px and on the label below 160px. 2. Project color dot was appended INSIDE the `.session-title` span, which is `overflow:hidden;text-overflow:ellipsis`. Long titles clipped the dot off entirely -- hiding the project marker exactly when it was most needed. The timestamp was also `position:absolute`, so the title's `flex:1` ran underneath it and there was nowhere coherent to anchor the dot. Fix: in sessions.js, append the dot to `titleRow` between title and timestamp (a flex sibling, not inside the truncating title span). In style.css, move `.session-time` from absolute positioning to `margin-left:auto` in the flex row. Drop the `margin-left:4px/vertical-align:middle` from `.session-project-dot` (gap:6px on the row handles spacing). Reduce `.session-item` padding-right at rest from 86px (which was reserving space for the absolute timestamp) to 8px; expand to 40px on hover/streaming/unread/menu-open/focus-within so the absolute action button + attention indicator still have room. Tests: - tests/test_workspace_panel_session_list.py (14 new tests) - tests/test_issue856_pinned_indicator_layout.py updated to reflect the new flex-flow timestamp + reduced rest-padding Full suite: 2433 passed, 47 skipped, 0 PR-related failures. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * fix(ui): remove duplicate margin-left:auto from .git-badge With .panel-actions already carrying margin-left:auto, both .git-badge and .panel-actions having auto margins split the free space equally, centering the badge instead of keeping it adjacent to the label. Remove margin-left:auto and margin-right:4px from .git-badge. The panel-header gap:6px handles label→badge spacing; panel-actions margin-left:auto owns the right-push. Layout: [label][badge][→][actions]. * fix(ui): mobile session-item padding 86px → 40px + git-badge margin fix Two fixes from Opus independent review of #1089: 1. Mobile padding regression: .session-item mobile override had padding:10px 86px 10px 12px — the 86px was reserving space for the old position:absolute timestamp. Since the timestamp now lives in the flex flow of .session-title-row (margin-left:auto), that 86px reservation is wasted and pushes the timestamp ~76px from the right edge, leaving dead space between it and the always-visible action button. Fixed: 86px → 40px (matching desktop hover/attention rule, only enough for the absolute action button at right:6px + 26px wide). 2. Duplicate margin-left:auto on .git-badge: the old rule from master had margin-left:auto on .git-badge (for the old space-between layout). With .panel-actions also having margin-left:auto, the two auto margins split free space equally, floating the badge to the middle of the header instead of keeping it flush against the label. Removed margin-left:auto and margin-right:4px from .git-badge; gap:6px on .panel-header handles label→badge spacing; .panel-actions margin-left:auto owns the right-push. Updated tests: - test_workspace_panel_session_list.py: assert 40px mobile padding - test_issue856_pinned_indicator_layout.py: assert 40px mobile padding Verified by Playwright visual QA: - Desktop 250px: badge hidden, Workspace label visible, icons visible ✓ - Desktop 150px: badge hidden, label hidden, icons only ✓ - Project dots visible on long-title sessions (outside truncating title span) ✓ - Mobile: padding-right=40px, no layout overflow ✓ * docs: v0.50.220 release notes, test count 2481, roadmap --------- Co-authored-by: Nathan Esquenazi <nesquena@gmail.com> Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com> Co-authored-by: nesquena-hermes <nesquena-hermes@users.noreply.github.com>
2026-04-26 07:19:05 +00:00
# Must append dot to titleRow
assert "titleRow.appendChild(dot)" in body, (
"Project dot must be appended to titleRow as a flex sibling, "
"not inside the truncating title span"
)
# Must NOT append dot to title (the truncating span)
assert "title.appendChild(dot)" not in body, (
"Old behaviour — dot inside title span gets clipped by the "
"ellipsis truncation. Dot must live in titleRow instead."
)
def test_dot_placed_between_title_and_timestamp(self):
"""The dot is appended AFTER title.appendChild and BEFORE ts append
— that ordering puts the dot between the title and the timestamp
in the flex row."""
body = _extract_js_function_body(SESSIONS_JS, "_renderOneSession")
v0.50.220: workspace panel collapse + project color dot fix (#1090) * fix(ui): workspace panel collapse priority + visible project color dot Two related sidebar UI bugs from project-ui-bugs.md: 1. Workspace panel header had no collapse priority. As the right panel narrowed, all three header children (Workspace label, git badge, icon buttons) compressed at the same rate because `.panel-header` used `justify-content:space-between` with no flex-shrink ratios. The icon buttons -- the actual primary controls -- could disappear before the git badge (which is least-essential metadata). Fix: declare `.rightpanel` as a `container-type:inline-size` container. Replace `justify-content:space-between` with `gap:6px` plus `margin-left:auto` on `.panel-actions`. Set flex-shrink:0 on `.panel-actions` (icons never shrink), flex-shrink:2 on the label, flex-shrink:3 on `.git-badge` (shrinks fastest), and `min-width:0;text-overflow:ellipsis` for graceful intermediate shrink. Add @container queries that crisply set `display:none` on the git badge below 220px and on the label below 160px. 2. Project color dot was appended INSIDE the `.session-title` span, which is `overflow:hidden;text-overflow:ellipsis`. Long titles clipped the dot off entirely -- hiding the project marker exactly when it was most needed. The timestamp was also `position:absolute`, so the title's `flex:1` ran underneath it and there was nowhere coherent to anchor the dot. Fix: in sessions.js, append the dot to `titleRow` between title and timestamp (a flex sibling, not inside the truncating title span). In style.css, move `.session-time` from absolute positioning to `margin-left:auto` in the flex row. Drop the `margin-left:4px/vertical-align:middle` from `.session-project-dot` (gap:6px on the row handles spacing). Reduce `.session-item` padding-right at rest from 86px (which was reserving space for the absolute timestamp) to 8px; expand to 40px on hover/streaming/unread/menu-open/focus-within so the absolute action button + attention indicator still have room. Tests: - tests/test_workspace_panel_session_list.py (14 new tests) - tests/test_issue856_pinned_indicator_layout.py updated to reflect the new flex-flow timestamp + reduced rest-padding Full suite: 2433 passed, 47 skipped, 0 PR-related failures. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * fix(ui): remove duplicate margin-left:auto from .git-badge With .panel-actions already carrying margin-left:auto, both .git-badge and .panel-actions having auto margins split the free space equally, centering the badge instead of keeping it adjacent to the label. Remove margin-left:auto and margin-right:4px from .git-badge. The panel-header gap:6px handles label→badge spacing; panel-actions margin-left:auto owns the right-push. Layout: [label][badge][→][actions]. * fix(ui): mobile session-item padding 86px → 40px + git-badge margin fix Two fixes from Opus independent review of #1089: 1. Mobile padding regression: .session-item mobile override had padding:10px 86px 10px 12px — the 86px was reserving space for the old position:absolute timestamp. Since the timestamp now lives in the flex flow of .session-title-row (margin-left:auto), that 86px reservation is wasted and pushes the timestamp ~76px from the right edge, leaving dead space between it and the always-visible action button. Fixed: 86px → 40px (matching desktop hover/attention rule, only enough for the absolute action button at right:6px + 26px wide). 2. Duplicate margin-left:auto on .git-badge: the old rule from master had margin-left:auto on .git-badge (for the old space-between layout). With .panel-actions also having margin-left:auto, the two auto margins split free space equally, floating the badge to the middle of the header instead of keeping it flush against the label. Removed margin-left:auto and margin-right:4px from .git-badge; gap:6px on .panel-header handles label→badge spacing; .panel-actions margin-left:auto owns the right-push. Updated tests: - test_workspace_panel_session_list.py: assert 40px mobile padding - test_issue856_pinned_indicator_layout.py: assert 40px mobile padding Verified by Playwright visual QA: - Desktop 250px: badge hidden, Workspace label visible, icons visible ✓ - Desktop 150px: badge hidden, label hidden, icons only ✓ - Project dots visible on long-title sessions (outside truncating title span) ✓ - Mobile: padding-right=40px, no layout overflow ✓ * docs: v0.50.220 release notes, test count 2481, roadmap --------- Co-authored-by: Nathan Esquenazi <nesquena@gmail.com> Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com> Co-authored-by: nesquena-hermes <nesquena-hermes@users.noreply.github.com>
2026-04-26 07:19:05 +00:00
title_pos = body.find("titleRow.appendChild(title);")
dot_pos = body.find("titleRow.appendChild(dot);")
ts_pos = body.find("titleRow.appendChild(ts);")
assert title_pos >= 0 and dot_pos >= 0 and ts_pos >= 0
assert title_pos < dot_pos < ts_pos, (
f"Order must be title → dot → ts in the title row "
f"(positions: {title_pos}, {dot_pos}, {ts_pos})"
)
def test_session_time_uses_flex_flow_not_absolute(self):
"""`.session-time` must use margin-left:auto in flex flow, not
position:absolute. Without this the title's flex:1 runs underneath
the absolute-positioned timestamp and the dot has no anchor."""
# Get the bare .session-time rule (not .session-time.is-hidden, not
# .session-item:hover .session-time)
idx = STYLE_CSS.find(".session-time{")
rule = STYLE_CSS[idx: STYLE_CSS.find("}", idx)]
assert "position:absolute" not in rule, (
".session-time must not be position:absolute — bug 2 requires "
"it to live in the flex flow of .session-title-row."
)
assert "margin-left:auto" in rule, (
".session-time must use margin-left:auto to push to the right "
"edge of the flex row."
)
def test_session_project_dot_no_inline_block_baggage(self):
"""`.session-project-dot` is now a flex sibling — the row's gap:6px
handles spacing, so the old `margin-left:4px` and
`vertical-align:middle` are unnecessary and only confuse layout."""
idx = STYLE_CSS.find(".session-project-dot{")
assert idx >= 0
rule = STYLE_CSS[idx: STYLE_CSS.find("}", idx)]
assert "margin-left:4px" not in rule, (
"Old margin-left:4px is unnecessary now — gap:6px on "
".session-title-row handles spacing"
)
assert "vertical-align:middle" not in rule, (
"vertical-align is meaningless inside flex flow"
)
assert "flex-shrink:0" in rule, (
"Dot must not shrink (would disappear at narrow sidebar widths)"
)
def test_session_item_padding_at_rest_no_longer_reserves_86px(self):
"""At rest (no hover, no streaming, no unread), the session item
no longer reserves 86px for the absolute timestamp — that space
was wasted now that the timestamp lives in flex flow."""
# Find the FIRST .session-item{ rule (the desktop one, not the
# mobile-touch override).
idx = STYLE_CSS.find(".session-item{padding:8px")
assert idx >= 0, "Could not find desktop .session-item padding rule"
rule = STYLE_CSS[idx: STYLE_CSS.find("}", idx)]
assert "padding:8px 8px" in rule, (
f"Expected 'padding:8px 8px' for at-rest session items, got: {rule!r}"
)
# Mobile also drops from 86px to 40px — the absolute timestamp is
# gone (now flex-flow), so only the always-visible action button's
# footprint (26px + 6px gap ≈ 32px, rounded to 40px) needs reservation.
assert ".session-item{min-height:44px;padding:10px 40px 10px 12px;}" in STYLE_CSS
def test_session_item_expands_padding_on_hover_and_attention(self):
v0.50.221: copy HTTP fix, inline images, mobile tap, custom providers x2 (#1117) * fix(#1096): copy buttons fall back to execCommand on HTTP contexts - Add _copyText() helper: tries navigator.clipboard first, falls back to document.execCommand('copy') with hidden textarea when not in secure context - Update copyMsg() and addCopyButtons() to use helper instead of direct navigator.clipboard.writeText() - Code block copy button now has .catch() handler (was silently failing) - Error messages use t('copy_failed') for i18n instead of hardcoded string - Add copy_failed key to all 6 locale blocks (en, ru, es, de, zh, zh-Hant) - Add 10 regression tests * fix(#1095): render pasted/dragged images as inline preview instead of paperclip badge - User message attachments with image extensions now render as <img> via api/media endpoint, with click-to-fullscreen support - Non-image attachments still show paperclip + filename badge - Extracts filename from full path for display - Add 5 regression tests * fix: hoist _IMAGE_EXTS to module scope, add avif (absorb fix) * fix: improve mobile touch responsiveness for session list items iPad Safari has known issues with the click/dblclick pattern on touch: - :hover-triggered padding-right layout shift causes the first tap click to target the wrong element (actions button that just appeared) - No touch-action:manipulation means iOS still delays taps for double-tap zoom detection - The old onclick+ondblclick pattern is designed for mouse, not touch Changes: - CSS: Remove :hover from padding-right rule to prevent layout shift - CSS: Add touch-action:manipulation and -webkit-tap-highlight-color to .session-item for immediate tap response - JS: Replace onclick/ondblclick with onpointerup + manual 350ms double-tap detection — works consistently on mouse and touch * fix(#1106): iterate custom_providers[].models dict keys for dropdown population - After reading singular 'model' field, also iterate 'models' dict keys - Deduplicate: model field value not repeated if also in models dict - Skip non-string keys gracefully - Works for both named and unnamed custom_providers entries - Add 7 regression tests * fix(#1105): allow custom_providers hostnames through SSRF check - Build trusted hostname set from custom_providers[].base_url in config.yaml - These are user-explicitly configured endpoints — not SSRF risks - Hardcoded allowlist (ollama, localhost, 127.0.0.1, lmstudio) still active - Unknown private IPs still blocked - Add 7 tests (5 source analysis + 2 functional with mocked socket) * fix(tests): update hover padding assertions for #1110 touch fix (absorb) * fix(css): restore hover padding via @media (hover:hover) for mouse devices (absorb) * fix: filter right/middle-click from pointerup handler (absorb) * docs: v0.50.221 release notes and version bump --------- Co-authored-by: bergeouss <bergeouss@users.noreply.github.com> Co-authored-by: nesquena-hermes <nesquena-hermes@users.noreply.github.com> Co-authored-by: sheng <378978764@qq.com>
2026-04-26 17:36:59 +00:00
"""PR #1110: Touch layout-shift fix — :hover removed from the COMBINED
padding-right selector. Touch devices (iPad, phone) see hover:none so
they skip the @media (hover:hover) block below. Mouse devices see
hover:hover and get the padding-right on hover.
streaming/unread/focus-within/menu-open expand to 40px for all devices."""
# Touch-safe combined rule (no :hover in this one)
v0.50.220: workspace panel collapse + project color dot fix (#1090) * fix(ui): workspace panel collapse priority + visible project color dot Two related sidebar UI bugs from project-ui-bugs.md: 1. Workspace panel header had no collapse priority. As the right panel narrowed, all three header children (Workspace label, git badge, icon buttons) compressed at the same rate because `.panel-header` used `justify-content:space-between` with no flex-shrink ratios. The icon buttons -- the actual primary controls -- could disappear before the git badge (which is least-essential metadata). Fix: declare `.rightpanel` as a `container-type:inline-size` container. Replace `justify-content:space-between` with `gap:6px` plus `margin-left:auto` on `.panel-actions`. Set flex-shrink:0 on `.panel-actions` (icons never shrink), flex-shrink:2 on the label, flex-shrink:3 on `.git-badge` (shrinks fastest), and `min-width:0;text-overflow:ellipsis` for graceful intermediate shrink. Add @container queries that crisply set `display:none` on the git badge below 220px and on the label below 160px. 2. Project color dot was appended INSIDE the `.session-title` span, which is `overflow:hidden;text-overflow:ellipsis`. Long titles clipped the dot off entirely -- hiding the project marker exactly when it was most needed. The timestamp was also `position:absolute`, so the title's `flex:1` ran underneath it and there was nowhere coherent to anchor the dot. Fix: in sessions.js, append the dot to `titleRow` between title and timestamp (a flex sibling, not inside the truncating title span). In style.css, move `.session-time` from absolute positioning to `margin-left:auto` in the flex row. Drop the `margin-left:4px/vertical-align:middle` from `.session-project-dot` (gap:6px on the row handles spacing). Reduce `.session-item` padding-right at rest from 86px (which was reserving space for the absolute timestamp) to 8px; expand to 40px on hover/streaming/unread/menu-open/focus-within so the absolute action button + attention indicator still have room. Tests: - tests/test_workspace_panel_session_list.py (14 new tests) - tests/test_issue856_pinned_indicator_layout.py updated to reflect the new flex-flow timestamp + reduced rest-padding Full suite: 2433 passed, 47 skipped, 0 PR-related failures. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * fix(ui): remove duplicate margin-left:auto from .git-badge With .panel-actions already carrying margin-left:auto, both .git-badge and .panel-actions having auto margins split the free space equally, centering the badge instead of keeping it adjacent to the label. Remove margin-left:auto and margin-right:4px from .git-badge. The panel-header gap:6px handles label→badge spacing; panel-actions margin-left:auto owns the right-push. Layout: [label][badge][→][actions]. * fix(ui): mobile session-item padding 86px → 40px + git-badge margin fix Two fixes from Opus independent review of #1089: 1. Mobile padding regression: .session-item mobile override had padding:10px 86px 10px 12px — the 86px was reserving space for the old position:absolute timestamp. Since the timestamp now lives in the flex flow of .session-title-row (margin-left:auto), that 86px reservation is wasted and pushes the timestamp ~76px from the right edge, leaving dead space between it and the always-visible action button. Fixed: 86px → 40px (matching desktop hover/attention rule, only enough for the absolute action button at right:6px + 26px wide). 2. Duplicate margin-left:auto on .git-badge: the old rule from master had margin-left:auto on .git-badge (for the old space-between layout). With .panel-actions also having margin-left:auto, the two auto margins split free space equally, floating the badge to the middle of the header instead of keeping it flush against the label. Removed margin-left:auto and margin-right:4px from .git-badge; gap:6px on .panel-header handles label→badge spacing; .panel-actions margin-left:auto owns the right-push. Updated tests: - test_workspace_panel_session_list.py: assert 40px mobile padding - test_issue856_pinned_indicator_layout.py: assert 40px mobile padding Verified by Playwright visual QA: - Desktop 250px: badge hidden, Workspace label visible, icons visible ✓ - Desktop 150px: badge hidden, label hidden, icons only ✓ - Project dots visible on long-title sessions (outside truncating title span) ✓ - Mobile: padding-right=40px, no layout overflow ✓ * docs: v0.50.220 release notes, test count 2481, roadmap --------- Co-authored-by: Nathan Esquenazi <nesquena@gmail.com> Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com> Co-authored-by: nesquena-hermes <nesquena-hermes@users.noreply.github.com>
2026-04-26 07:19:05 +00:00
sel = (
".session-item.streaming,.session-item.unread,"
v0.50.221: copy HTTP fix, inline images, mobile tap, custom providers x2 (#1117) * fix(#1096): copy buttons fall back to execCommand on HTTP contexts - Add _copyText() helper: tries navigator.clipboard first, falls back to document.execCommand('copy') with hidden textarea when not in secure context - Update copyMsg() and addCopyButtons() to use helper instead of direct navigator.clipboard.writeText() - Code block copy button now has .catch() handler (was silently failing) - Error messages use t('copy_failed') for i18n instead of hardcoded string - Add copy_failed key to all 6 locale blocks (en, ru, es, de, zh, zh-Hant) - Add 10 regression tests * fix(#1095): render pasted/dragged images as inline preview instead of paperclip badge - User message attachments with image extensions now render as <img> via api/media endpoint, with click-to-fullscreen support - Non-image attachments still show paperclip + filename badge - Extracts filename from full path for display - Add 5 regression tests * fix: hoist _IMAGE_EXTS to module scope, add avif (absorb fix) * fix: improve mobile touch responsiveness for session list items iPad Safari has known issues with the click/dblclick pattern on touch: - :hover-triggered padding-right layout shift causes the first tap click to target the wrong element (actions button that just appeared) - No touch-action:manipulation means iOS still delays taps for double-tap zoom detection - The old onclick+ondblclick pattern is designed for mouse, not touch Changes: - CSS: Remove :hover from padding-right rule to prevent layout shift - CSS: Add touch-action:manipulation and -webkit-tap-highlight-color to .session-item for immediate tap response - JS: Replace onclick/ondblclick with onpointerup + manual 350ms double-tap detection — works consistently on mouse and touch * fix(#1106): iterate custom_providers[].models dict keys for dropdown population - After reading singular 'model' field, also iterate 'models' dict keys - Deduplicate: model field value not repeated if also in models dict - Skip non-string keys gracefully - Works for both named and unnamed custom_providers entries - Add 7 regression tests * fix(#1105): allow custom_providers hostnames through SSRF check - Build trusted hostname set from custom_providers[].base_url in config.yaml - These are user-explicitly configured endpoints — not SSRF risks - Hardcoded allowlist (ollama, localhost, 127.0.0.1, lmstudio) still active - Unknown private IPs still blocked - Add 7 tests (5 source analysis + 2 functional with mocked socket) * fix(tests): update hover padding assertions for #1110 touch fix (absorb) * fix(css): restore hover padding via @media (hover:hover) for mouse devices (absorb) * fix: filter right/middle-click from pointerup handler (absorb) * docs: v0.50.221 release notes and version bump --------- Co-authored-by: bergeouss <bergeouss@users.noreply.github.com> Co-authored-by: nesquena-hermes <nesquena-hermes@users.noreply.github.com> Co-authored-by: sheng <378978764@qq.com>
2026-04-26 17:36:59 +00:00
".session-item:focus-within,"
v0.50.220: workspace panel collapse + project color dot fix (#1090) * fix(ui): workspace panel collapse priority + visible project color dot Two related sidebar UI bugs from project-ui-bugs.md: 1. Workspace panel header had no collapse priority. As the right panel narrowed, all three header children (Workspace label, git badge, icon buttons) compressed at the same rate because `.panel-header` used `justify-content:space-between` with no flex-shrink ratios. The icon buttons -- the actual primary controls -- could disappear before the git badge (which is least-essential metadata). Fix: declare `.rightpanel` as a `container-type:inline-size` container. Replace `justify-content:space-between` with `gap:6px` plus `margin-left:auto` on `.panel-actions`. Set flex-shrink:0 on `.panel-actions` (icons never shrink), flex-shrink:2 on the label, flex-shrink:3 on `.git-badge` (shrinks fastest), and `min-width:0;text-overflow:ellipsis` for graceful intermediate shrink. Add @container queries that crisply set `display:none` on the git badge below 220px and on the label below 160px. 2. Project color dot was appended INSIDE the `.session-title` span, which is `overflow:hidden;text-overflow:ellipsis`. Long titles clipped the dot off entirely -- hiding the project marker exactly when it was most needed. The timestamp was also `position:absolute`, so the title's `flex:1` ran underneath it and there was nowhere coherent to anchor the dot. Fix: in sessions.js, append the dot to `titleRow` between title and timestamp (a flex sibling, not inside the truncating title span). In style.css, move `.session-time` from absolute positioning to `margin-left:auto` in the flex row. Drop the `margin-left:4px/vertical-align:middle` from `.session-project-dot` (gap:6px on the row handles spacing). Reduce `.session-item` padding-right at rest from 86px (which was reserving space for the absolute timestamp) to 8px; expand to 40px on hover/streaming/unread/menu-open/focus-within so the absolute action button + attention indicator still have room. Tests: - tests/test_workspace_panel_session_list.py (14 new tests) - tests/test_issue856_pinned_indicator_layout.py updated to reflect the new flex-flow timestamp + reduced rest-padding Full suite: 2433 passed, 47 skipped, 0 PR-related failures. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * fix(ui): remove duplicate margin-left:auto from .git-badge With .panel-actions already carrying margin-left:auto, both .git-badge and .panel-actions having auto margins split the free space equally, centering the badge instead of keeping it adjacent to the label. Remove margin-left:auto and margin-right:4px from .git-badge. The panel-header gap:6px handles label→badge spacing; panel-actions margin-left:auto owns the right-push. Layout: [label][badge][→][actions]. * fix(ui): mobile session-item padding 86px → 40px + git-badge margin fix Two fixes from Opus independent review of #1089: 1. Mobile padding regression: .session-item mobile override had padding:10px 86px 10px 12px — the 86px was reserving space for the old position:absolute timestamp. Since the timestamp now lives in the flex flow of .session-title-row (margin-left:auto), that 86px reservation is wasted and pushes the timestamp ~76px from the right edge, leaving dead space between it and the always-visible action button. Fixed: 86px → 40px (matching desktop hover/attention rule, only enough for the absolute action button at right:6px + 26px wide). 2. Duplicate margin-left:auto on .git-badge: the old rule from master had margin-left:auto on .git-badge (for the old space-between layout). With .panel-actions also having margin-left:auto, the two auto margins split free space equally, floating the badge to the middle of the header instead of keeping it flush against the label. Removed margin-left:auto and margin-right:4px from .git-badge; gap:6px on .panel-header handles label→badge spacing; .panel-actions margin-left:auto owns the right-push. Updated tests: - test_workspace_panel_session_list.py: assert 40px mobile padding - test_issue856_pinned_indicator_layout.py: assert 40px mobile padding Verified by Playwright visual QA: - Desktop 250px: badge hidden, Workspace label visible, icons visible ✓ - Desktop 150px: badge hidden, label hidden, icons only ✓ - Project dots visible on long-title sessions (outside truncating title span) ✓ - Mobile: padding-right=40px, no layout overflow ✓ * docs: v0.50.220 release notes, test count 2481, roadmap --------- Co-authored-by: Nathan Esquenazi <nesquena@gmail.com> Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com> Co-authored-by: nesquena-hermes <nesquena-hermes@users.noreply.github.com>
2026-04-26 07:19:05 +00:00
".session-item.menu-open"
)
idx = STYLE_CSS.find(sel)
assert idx >= 0, (
v0.50.221: copy HTTP fix, inline images, mobile tap, custom providers x2 (#1117) * fix(#1096): copy buttons fall back to execCommand on HTTP contexts - Add _copyText() helper: tries navigator.clipboard first, falls back to document.execCommand('copy') with hidden textarea when not in secure context - Update copyMsg() and addCopyButtons() to use helper instead of direct navigator.clipboard.writeText() - Code block copy button now has .catch() handler (was silently failing) - Error messages use t('copy_failed') for i18n instead of hardcoded string - Add copy_failed key to all 6 locale blocks (en, ru, es, de, zh, zh-Hant) - Add 10 regression tests * fix(#1095): render pasted/dragged images as inline preview instead of paperclip badge - User message attachments with image extensions now render as <img> via api/media endpoint, with click-to-fullscreen support - Non-image attachments still show paperclip + filename badge - Extracts filename from full path for display - Add 5 regression tests * fix: hoist _IMAGE_EXTS to module scope, add avif (absorb fix) * fix: improve mobile touch responsiveness for session list items iPad Safari has known issues with the click/dblclick pattern on touch: - :hover-triggered padding-right layout shift causes the first tap click to target the wrong element (actions button that just appeared) - No touch-action:manipulation means iOS still delays taps for double-tap zoom detection - The old onclick+ondblclick pattern is designed for mouse, not touch Changes: - CSS: Remove :hover from padding-right rule to prevent layout shift - CSS: Add touch-action:manipulation and -webkit-tap-highlight-color to .session-item for immediate tap response - JS: Replace onclick/ondblclick with onpointerup + manual 350ms double-tap detection — works consistently on mouse and touch * fix(#1106): iterate custom_providers[].models dict keys for dropdown population - After reading singular 'model' field, also iterate 'models' dict keys - Deduplicate: model field value not repeated if also in models dict - Skip non-string keys gracefully - Works for both named and unnamed custom_providers entries - Add 7 regression tests * fix(#1105): allow custom_providers hostnames through SSRF check - Build trusted hostname set from custom_providers[].base_url in config.yaml - These are user-explicitly configured endpoints — not SSRF risks - Hardcoded allowlist (ollama, localhost, 127.0.0.1, lmstudio) still active - Unknown private IPs still blocked - Add 7 tests (5 source analysis + 2 functional with mocked socket) * fix(tests): update hover padding assertions for #1110 touch fix (absorb) * fix(css): restore hover padding via @media (hover:hover) for mouse devices (absorb) * fix: filter right/middle-click from pointerup handler (absorb) * docs: v0.50.221 release notes and version bump --------- Co-authored-by: bergeouss <bergeouss@users.noreply.github.com> Co-authored-by: nesquena-hermes <nesquena-hermes@users.noreply.github.com> Co-authored-by: sheng <378978764@qq.com>
2026-04-26 17:36:59 +00:00
"Combined streaming/unread/focus-within/menu-open padding rule not found"
v0.50.220: workspace panel collapse + project color dot fix (#1090) * fix(ui): workspace panel collapse priority + visible project color dot Two related sidebar UI bugs from project-ui-bugs.md: 1. Workspace panel header had no collapse priority. As the right panel narrowed, all three header children (Workspace label, git badge, icon buttons) compressed at the same rate because `.panel-header` used `justify-content:space-between` with no flex-shrink ratios. The icon buttons -- the actual primary controls -- could disappear before the git badge (which is least-essential metadata). Fix: declare `.rightpanel` as a `container-type:inline-size` container. Replace `justify-content:space-between` with `gap:6px` plus `margin-left:auto` on `.panel-actions`. Set flex-shrink:0 on `.panel-actions` (icons never shrink), flex-shrink:2 on the label, flex-shrink:3 on `.git-badge` (shrinks fastest), and `min-width:0;text-overflow:ellipsis` for graceful intermediate shrink. Add @container queries that crisply set `display:none` on the git badge below 220px and on the label below 160px. 2. Project color dot was appended INSIDE the `.session-title` span, which is `overflow:hidden;text-overflow:ellipsis`. Long titles clipped the dot off entirely -- hiding the project marker exactly when it was most needed. The timestamp was also `position:absolute`, so the title's `flex:1` ran underneath it and there was nowhere coherent to anchor the dot. Fix: in sessions.js, append the dot to `titleRow` between title and timestamp (a flex sibling, not inside the truncating title span). In style.css, move `.session-time` from absolute positioning to `margin-left:auto` in the flex row. Drop the `margin-left:4px/vertical-align:middle` from `.session-project-dot` (gap:6px on the row handles spacing). Reduce `.session-item` padding-right at rest from 86px (which was reserving space for the absolute timestamp) to 8px; expand to 40px on hover/streaming/unread/menu-open/focus-within so the absolute action button + attention indicator still have room. Tests: - tests/test_workspace_panel_session_list.py (14 new tests) - tests/test_issue856_pinned_indicator_layout.py updated to reflect the new flex-flow timestamp + reduced rest-padding Full suite: 2433 passed, 47 skipped, 0 PR-related failures. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * fix(ui): remove duplicate margin-left:auto from .git-badge With .panel-actions already carrying margin-left:auto, both .git-badge and .panel-actions having auto margins split the free space equally, centering the badge instead of keeping it adjacent to the label. Remove margin-left:auto and margin-right:4px from .git-badge. The panel-header gap:6px handles label→badge spacing; panel-actions margin-left:auto owns the right-push. Layout: [label][badge][→][actions]. * fix(ui): mobile session-item padding 86px → 40px + git-badge margin fix Two fixes from Opus independent review of #1089: 1. Mobile padding regression: .session-item mobile override had padding:10px 86px 10px 12px — the 86px was reserving space for the old position:absolute timestamp. Since the timestamp now lives in the flex flow of .session-title-row (margin-left:auto), that 86px reservation is wasted and pushes the timestamp ~76px from the right edge, leaving dead space between it and the always-visible action button. Fixed: 86px → 40px (matching desktop hover/attention rule, only enough for the absolute action button at right:6px + 26px wide). 2. Duplicate margin-left:auto on .git-badge: the old rule from master had margin-left:auto on .git-badge (for the old space-between layout). With .panel-actions also having margin-left:auto, the two auto margins split free space equally, floating the badge to the middle of the header instead of keeping it flush against the label. Removed margin-left:auto and margin-right:4px from .git-badge; gap:6px on .panel-header handles label→badge spacing; .panel-actions margin-left:auto owns the right-push. Updated tests: - test_workspace_panel_session_list.py: assert 40px mobile padding - test_issue856_pinned_indicator_layout.py: assert 40px mobile padding Verified by Playwright visual QA: - Desktop 250px: badge hidden, Workspace label visible, icons visible ✓ - Desktop 150px: badge hidden, label hidden, icons only ✓ - Project dots visible on long-title sessions (outside truncating title span) ✓ - Mobile: padding-right=40px, no layout overflow ✓ * docs: v0.50.220 release notes, test count 2481, roadmap --------- Co-authored-by: Nathan Esquenazi <nesquena@gmail.com> Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com> Co-authored-by: nesquena-hermes <nesquena-hermes@users.noreply.github.com>
2026-04-26 07:19:05 +00:00
)
rule = STYLE_CSS[idx: STYLE_CSS.find("}", idx)]
assert "padding-right:40px" in rule
v0.50.221: copy HTTP fix, inline images, mobile tap, custom providers x2 (#1117) * fix(#1096): copy buttons fall back to execCommand on HTTP contexts - Add _copyText() helper: tries navigator.clipboard first, falls back to document.execCommand('copy') with hidden textarea when not in secure context - Update copyMsg() and addCopyButtons() to use helper instead of direct navigator.clipboard.writeText() - Code block copy button now has .catch() handler (was silently failing) - Error messages use t('copy_failed') for i18n instead of hardcoded string - Add copy_failed key to all 6 locale blocks (en, ru, es, de, zh, zh-Hant) - Add 10 regression tests * fix(#1095): render pasted/dragged images as inline preview instead of paperclip badge - User message attachments with image extensions now render as <img> via api/media endpoint, with click-to-fullscreen support - Non-image attachments still show paperclip + filename badge - Extracts filename from full path for display - Add 5 regression tests * fix: hoist _IMAGE_EXTS to module scope, add avif (absorb fix) * fix: improve mobile touch responsiveness for session list items iPad Safari has known issues with the click/dblclick pattern on touch: - :hover-triggered padding-right layout shift causes the first tap click to target the wrong element (actions button that just appeared) - No touch-action:manipulation means iOS still delays taps for double-tap zoom detection - The old onclick+ondblclick pattern is designed for mouse, not touch Changes: - CSS: Remove :hover from padding-right rule to prevent layout shift - CSS: Add touch-action:manipulation and -webkit-tap-highlight-color to .session-item for immediate tap response - JS: Replace onclick/ondblclick with onpointerup + manual 350ms double-tap detection — works consistently on mouse and touch * fix(#1106): iterate custom_providers[].models dict keys for dropdown population - After reading singular 'model' field, also iterate 'models' dict keys - Deduplicate: model field value not repeated if also in models dict - Skip non-string keys gracefully - Works for both named and unnamed custom_providers entries - Add 7 regression tests * fix(#1105): allow custom_providers hostnames through SSRF check - Build trusted hostname set from custom_providers[].base_url in config.yaml - These are user-explicitly configured endpoints — not SSRF risks - Hardcoded allowlist (ollama, localhost, 127.0.0.1, lmstudio) still active - Unknown private IPs still blocked - Add 7 tests (5 source analysis + 2 functional with mocked socket) * fix(tests): update hover padding assertions for #1110 touch fix (absorb) * fix(css): restore hover padding via @media (hover:hover) for mouse devices (absorb) * fix: filter right/middle-click from pointerup handler (absorb) * docs: v0.50.221 release notes and version bump --------- Co-authored-by: bergeouss <bergeouss@users.noreply.github.com> Co-authored-by: nesquena-hermes <nesquena-hermes@users.noreply.github.com> Co-authored-by: sheng <378978764@qq.com>
2026-04-26 17:36:59 +00:00
# Desktop hover padding restored via @media (hover:hover) — mouse devices only
assert "@media (hover:hover)" in STYLE_CSS
assert ".session-item:hover{padding-right:40px;}" in STYLE_CSS