Skip to content

fix(gui): stop the mobile topbar and integration cards overflowing - #3174

Merged
lidge-jun merged 10 commits into
devfrom
codex/260902-multiplatform-qa
Sep 1, 2026
Merged

lidge-jun merged 10 commits into
devfrom
codex/260902-multiplatform-qa

Conversation

@lidge-jun

@lidge-jun lidge-jun commented Sep 1, 2026 •

Copy link
Copy Markdown
Owner

Summary

Two responsive defects on the dashboard, both found by measuring real geometry through the Chrome DevTools Protocol rather than by reading CSS.

The mobile topbar overlapped itself. At a 320px viewport the version badge ended at x=245 while the action orbs began at x=206, so the power orb sat on top of the badge. A flex item only shrinks below its content size when it carries min-width: 0 itself; .mobile-topbar .brand had it but its children did not, so .name held its intrinsic width and pushed .ver under the actions.

Shrinking .name is necessary but not sufficient — the row budget at the narrowest width is 44 (menu) + 26 (logo) + 56 (badge) + 94 (actions) plus gaps, leaving the name about 38px, which rendered as op…. The badge is dropped instead: the same brand node is mounted again in the drawer head, and the live value is also on the dashboard Version stat.

The integration cards overflowed the page. .integration-cards used repeat(auto-fill, minmax(260px, 1fr)). A bare 260px floor is wider than the content box of a 320px viewport, so the track could not shrink and the card went with it — the Settings button measured left=326, right=409 against a 320px page, and again at 375px and 736px. min(260px, 100%) keeps the multi-column intent while letting a narrow viewport fall back.

UI change

Before — 320px, the version badge sits under the power orb, and the integration cards push their action row off the page:

opencodex dashboard at a 320px viewport before the fix, version badge overlapped by the power button in the top bar

After — 375px, the brand, badge and orbs each hold their own space (name.right=179, ver 189-245, actions.left=261):

opencodex dashboard at a 375px viewport after the fix, top bar showing logo, name, version badge and two action orbs without overlap

At and below 360px the badge is dropped so the product name stays readable; from 375px up it returns.

What review changed

A read-only review pass caught the first attempt inventing @media (max-width: 400px) — the only 400px rule in the file, covering an unmeasured 375-399 band. It is folded into the existing 360px tiny-phone breakpoint instead. The measurement confirms the reviewer was right: at 375px the badge is back and ver.right=245 < act.left=261, so a 400px rule would have hidden it for no reason.

Also in this PR

The devlog unit 260902_multiplatform_qa_and_gui records a 3-OS deployment QA sweep run alongside this fix: dev was deployed to a macOS source checkout, a Linux npm global, a clean macOS host, and a Windows MINGW64 host, exercised with the adversarial classes, and each host restored to its own original install shape. The runtime contract matched across all three platforms (exit 0/1/4, healthz/readyz 200, 404, GUI 200); the differences were all in the restore procedures.

Verification

No full suite, per the no-local-suite policy.

  • cd gui && bun test tests/mobile-topbar-layout.test.ts tests/integrations-card-overflow.test.ts — 5 pass, 0 fail. Both files were driven red against the unfixed CSS first.
  • CDP overflow scan after the change: 5 viewports (320/375/414/736/1024) × 5 pages — zero elements outside the viewport. The same scan before the change reported the Settings button at 320px, 375px and 736px.
  • Topbar geometry at 320/360/375/414/736: name.right <= actions.left in every case.
  • bun run privacy:scan — passes; remote home paths in the devlog were anonymised after the scan flagged them.

Checklist

  • Scope stays focused and avoids unrelated cleanup.
  • Docs or release notes were updated when needed — devlog unit records the Design Read, the measurements, and what review changed.
  • Security-sensitive changes were reviewed for secrets, auth, and unsafe defaults — CSS and docs only; no auth or credential surface touched.

@lidge-jun
lidge-jun requested a review from Ingwannu as a code owner September 1, 2026 16:40
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Sep 1, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-09-01T16:44:58.263680Z 786262c PR opened
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@github-actions

github-actions Bot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

✅ Deterministic PR hygiene checks passed.

@github-actions github-actions Bot added the bug Something isn't working label Sep 1, 2026
@github-actions

github-actions Bot commented Sep 1, 2026 •

Copy link
Copy Markdown
Contributor

✅ READY

  • this PR is ready for review.

@github-actions
github-actions Bot marked this pull request as draft September 1, 2026 16:40

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 786262c71d

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread gui/src/styles.css
in the drawer head, so the version stays one tap away, and the live value is
also on the dashboard Version stat. Folded into the existing tiny-phone
breakpoint rather than inventing a 400px one for an unmeasured 375-399 band. */
.mobile-topbar .brand .ver { display: none; }

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Size the badge breakpoint for all three action orbs

In a connected runtime with a shared dashboard session, App.tsx:265-279 renders logout, disconnect, and restart controls, making .mobile-topbar-actions 144px wide rather than the 94px assumed by this breakpoint. Just above 360px the badge therefore returns with very little brand space; normal versions truncate opencodex, while longer supported x.y.z-preview.* versions can make the non-shrinking badge overlap the controls again. Base the breakpoint on the three-button state and preview-version width, or hide the badge conditionally when that state is active.

AGENTS.md reference: AGENTS.md:L267-L272

Useful? React with 👍 / 👎.

@lidge-jun

lidge-jun commented Sep 1, 2026 •

Copy link
Copy Markdown
Owner Author

리뷰 · 우선순위 61 / 80

이 PR은 현재 dev에서 실제로 넘치는 두 GUI 화면을 고칩니다. 첫째, 320px처럼 아주 좁은 화면에서는 모바일 상단 바의 제품 이름과 버전 배지가 오른쪽 전원 버튼 영역까지 밀려 들어갑니다. 둘째, Integrations 카드 그리드의 최소 너비가 260px로 고정되어 있어서 화면 안쪽 실제 공간이 그보다 좁으면 카드와 Settings 버튼이 페이지 밖으로 나갑니다. PR 본문의 CDP 실측값이 원인과 결과를 연결하고 있고, 현재 dev의 gui/src/styles.css와 gui/src/styles-integrations.css에는 아직 이 수정이 없어서 방향도 맞습니다.

상단 바 수정은 제품 이름이 실제로 줄어들 수 있도록 min-width: 0과 말줄임 처리를 넣고, 액션 버튼의 44px 터치 영역은 그대로 지킵니다. 360px 이하에서는 버전 배지만 숨기는데, 버전은 서랍과 Dashboard Version 통계에서도 볼 수 있으므로 제품 이름과 버튼을 겹치게 두는 것보다 안전합니다. 새 400px 기준을 만들지 않고 이미 있던 360px tiny-phone 기준을 사용했고, 375px에서는 배지가 다시 보여도 겹치지 않는다는 측정도 있어 경계 선택이 설명과 일치합니다.

Integrations 쪽은 minmax(260px, 1fr)의 고정 바닥을 minmax(min(260px, 100%), 1fr)로 바꿉니다. 넓은 화면에서는 기존 여러 열 배치를 유지하고, 좁은 화면에서는 카드가 실제 사용 가능한 너비까지 줄어듭니다. 액션 줄에도 줄바꿈과 min-width: 0을 더해서 긴 번역이나 버튼 문구가 다시 카드 밖으로 미는 경로를 막았습니다. 현재 변경 범위는 CSS와 회귀 테스트라서 인증, 설정 스키마, 런타임 라우팅에는 영향을 주지 않습니다.

gui/src/styles.css:2269-2371 - 실제 문제를 찾지 못했습니다. 이름 축소, 44px 액션 영역 유지, 360px 이하 버전 숨김이 서로 충돌하지 않고 PR에 기록된 320/360/375/414/736px 실측 결과와 맞습니다.
gui/src/styles-integrations.css:17-48 - 실제 문제를 찾지 못했습니다. 그리드 최소값을 사용 가능한 너비로 제한하고 액션 줄을 감싸는 수정이 현재 dev의 overflow 원인을 직접 제거합니다.
gui/tests/mobile-topbar-layout.test.ts / gui/tests/integrations-card-overflow.test.ts - 테스트는 렌더러 자체가 아니라 CSS 계약을 고정하는 source-oracle이지만, PR 본문에 별도로 CDP 실측과 변경 전 red 검증이 있어 이번 작은 CSS 회귀를 막는 용도로는 충분합니다.

메인테이너의 판단이 필요한 지점

  • 360px 이하에서 상단 바 버전 배지를 숨기고 서랍과 Dashboard 통계로 대신하는 제품 선택을 그대로 받을지 결정하면 됩니다.
  • 이 CSS 수정과 함께 260902 멀티플랫폼 QA 계획 문서 다섯 개를 같은 PR에 싣는 범위를 받을지 결정하면 됩니다. 문서는 수정이 나온 측정 과정과 복구 계약을 기록하고 있어 무관한 정리로 보이지는 않습니다.
  • types.ts/config.ts 분리 작업과 겹치지 않고, 현재 dev에 그대로 적용할 수 있으므로 close-don't-rebase 대상은 아닙니다.

너의 추천
현재 형태로 머지하는 것을 추천합니다. 실제 viewport 측정으로 발견한 두 overflow를 작은 CSS 변경으로 막고, 변경 전 실패하는 회귀 테스트와 여러 화면 크기의 사후 측정이 함께 있습니다. CI에서 GUI 테스트가 통과하면 별도 수정 없이 넣어도 됩니다.

이 댓글은 grok-bot이 작성했습니다

jun added 7 commits September 2, 2026 01:52
Two responsive defects, both found by measuring real geometry through CDP
rather than by reading CSS.

The mobile topbar overlapped itself. At 320px the version badge ended at
x=245 while the action orbs began at x=206, so the power orb sat on top of
the badge. A flex item only shrinks below its content size when it carries
min-width: 0 itself; .mobile-topbar .brand had it but its children did not,
so .name held its intrinsic width and pushed .ver under the actions.

Shrinking .name is necessary but not sufficient. The row budget at the
narrowest width is 44 (menu) + 26 (logo) + 56 (badge) + 94 (actions) plus
gaps, which leaves the name about 38px - it rendered as "op...". The badge
is dropped instead: the same brand node is mounted again in the drawer head,
and the live version is also on the dashboard Version stat.

A review pass caught the first attempt inventing @media (max-width: 400px),
which was the only 400px rule in the file and covered an unmeasured 375-399
band. It is folded into the existing 360px tiny-phone breakpoint instead.

The integration cards overflowed the page. .integration-cards used
repeat(auto-fill, minmax(260px, 1fr)); a bare 260px floor is wider than the
content box of a 320px viewport, so the track could not shrink and the card
went with it - the Settings button measured left=326, right=409 against a
320px page, and again at 375px and 736px. min(260px, 100%) keeps the
multi-column intent while letting a narrow viewport fall back.

Verified after the change across 5 viewports x 5 pages: zero elements
outside the viewport. Topbar at 320/360/375/414/736: name always ends before
the actions begin, badge returns at 375.

Both regression tests were driven red against the unfixed CSS first.
@lidge-jun
lidge-jun force-pushed the codex/260902-multiplatform-qa branch from 786262c to 38b5612 Compare September 1, 2026 16:52
@github-actions
github-actions Bot marked this pull request as ready for review September 1, 2026 16:59
@lidge-jun
lidge-jun merged commit e582aee into dev Sep 1, 2026
24 of 25 checks passed
@lidge-jun
lidge-jun deleted the codex/260902-multiplatform-qa branch September 1, 2026 17:07
tarunravi pushed a commit to tarunravi/opencodex that referenced this pull request Sep 14, 2026
…idge-jun#3174)

* docs(devlog): plan the 3-OS QA sweep, the restore contract, and the GUI pass

* docs(devlog): fix the QA evidence layout and scenario id scheme

* fix(gui): stop the mobile topbar and integration cards overflowing

Two responsive defects, both found by measuring real geometry through CDP
rather than by reading CSS.

The mobile topbar overlapped itself. At 320px the version badge ended at
x=245 while the action orbs began at x=206, so the power orb sat on top of
the badge. A flex item only shrinks below its content size when it carries
min-width: 0 itself; .mobile-topbar .brand had it but its children did not,
so .name held its intrinsic width and pushed .ver under the actions.

Shrinking .name is necessary but not sufficient. The row budget at the
narrowest width is 44 (menu) + 26 (logo) + 56 (badge) + 94 (actions) plus
gaps, which leaves the name about 38px - it rendered as "op...". The badge
is dropped instead: the same brand node is mounted again in the drawer head,
and the live version is also on the dashboard Version stat.

A review pass caught the first attempt inventing @media (max-width: 400px),
which was the only 400px rule in the file and covered an unmeasured 375-399
band. It is folded into the existing 360px tiny-phone breakpoint instead.

The integration cards overflowed the page. .integration-cards used
repeat(auto-fill, minmax(260px, 1fr)); a bare 260px floor is wider than the
content box of a 320px viewport, so the track could not shrink and the card
went with it - the Settings button measured left=326, right=409 against a
320px page, and again at 375px and 736px. min(260px, 100%) keeps the
multi-column intent while letting a narrow viewport fall back.

Verified after the change across 5 viewports x 5 pages: zero elements
outside the viewport. Topbar at 320/360/375/414/736: name always ends before
the actions begin, badge returns at 375.

Both regression tests were driven red against the unfixed CSS first.

* docs(devlog): record the two responsive defects and what the review changed

* docs(devlog): record the macmini deploy, QA classes, and the detached-HEAD restore miss

* docs(devlog): record the linux and macbook QA, and the start-time Codex injection found on a clean host

* docs(devlog): record the QA verdicts and teardown receipts (evidence itself is gitignored)

* docs(devlog): record the windows QA, the version-skew warning, and the EPERM restore

* docs(devlog): synthesise the unit - three defects, all found by measurement

* docs(devlog): anonymise remote home paths the privacy scan flagged

---------

Co-authored-by: jun <jun@lidge.dev>
agentHits pushed a commit to agentHits/opencodex that referenced this pull request Sep 17, 2026
…idge-jun#3174)

* docs(devlog): plan the 3-OS QA sweep, the restore contract, and the GUI pass

* docs(devlog): fix the QA evidence layout and scenario id scheme

* fix(gui): stop the mobile topbar and integration cards overflowing

Two responsive defects, both found by measuring real geometry through CDP
rather than by reading CSS.

The mobile topbar overlapped itself. At 320px the version badge ended at
x=245 while the action orbs began at x=206, so the power orb sat on top of
the badge. A flex item only shrinks below its content size when it carries
min-width: 0 itself; .mobile-topbar .brand had it but its children did not,
so .name held its intrinsic width and pushed .ver under the actions.

Shrinking .name is necessary but not sufficient. The row budget at the
narrowest width is 44 (menu) + 26 (logo) + 56 (badge) + 94 (actions) plus
gaps, which leaves the name about 38px - it rendered as "op...". The badge
is dropped instead: the same brand node is mounted again in the drawer head,
and the live version is also on the dashboard Version stat.

A review pass caught the first attempt inventing @media (max-width: 400px),
which was the only 400px rule in the file and covered an unmeasured 375-399
band. It is folded into the existing 360px tiny-phone breakpoint instead.

The integration cards overflowed the page. .integration-cards used
repeat(auto-fill, minmax(260px, 1fr)); a bare 260px floor is wider than the
content box of a 320px viewport, so the track could not shrink and the card
went with it - the Settings button measured left=326, right=409 against a
320px page, and again at 375px and 736px. min(260px, 100%) keeps the
multi-column intent while letting a narrow viewport fall back.

Verified after the change across 5 viewports x 5 pages: zero elements
outside the viewport. Topbar at 320/360/375/414/736: name always ends before
the actions begin, badge returns at 375.

Both regression tests were driven red against the unfixed CSS first.

* docs(devlog): record the two responsive defects and what the review changed

* docs(devlog): record the macmini deploy, QA classes, and the detached-HEAD restore miss

* docs(devlog): record the linux and macbook QA, and the start-time Codex injection found on a clean host

* docs(devlog): record the QA verdicts and teardown receipts (evidence itself is gitignored)

* docs(devlog): record the windows QA, the version-skew warning, and the EPERM restore

* docs(devlog): synthesise the unit - three defects, all found by measurement

* docs(devlog): anonymise remote home paths the privacy scan flagged

---------

Co-authored-by: jun <jun@lidge.dev>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant