Skip to content

fix(web): preview modal fullscreen icon blank and sidebar handle click broken - #6821

Open
xxiaoxiong wants to merge 1 commit into
nexu-io:mainfrom
xxiaoxiong:fix/preview-fullscreen-icon-sidebar-handle
Open

fix(web): preview modal fullscreen icon blank and sidebar handle click broken#6821
xxiaoxiong wants to merge 1 commit into
nexu-io:mainfrom
xxiaoxiong:fix/preview-fullscreen-icon-sidebar-handle

Conversation

@xxiaoxiong

Copy link
Copy Markdown
Contributor

Fixes two preview-modal interaction bugs introduced by inheriting the global button primitive styles in apps/web/src/styles/viewer/composio.css.

Bug 1 — fullscreen icon invisible

The hover-revealed fullscreen toggle (.ds-modal-stage-fullscreen) is sized 32px × 32px but inherits the global button rule which sets padding: 0 var(--spacing-16, 16px). The 16px horizontal padding consumes the entire 32px frame and the SVG glyph is flexed into a 0-width column, leaving the button visually empty when hovered over the preview stage.

Fix: add padding: 0 so the inner SVG keeps its intrinsic 16px width.

Bug 2 — fullscreen click does nothing on press

The same button inherits the global button:active:not(:disabled) { transform: translateY(1px); } rule. Because the fullscreen button is absolutely positioned at top: 12px; right: 12px, the press-translate moves it down/left away from the pointer; if the user's pointer is on the bottom-right pixel the cursor is now off the button and the pointerup target is lost, so the click never completes.

Fix: override :active:not(:disabled) { transform: translateY(0) } for this control.

Bug 3 — sidebar seam handle click does nothing

The same global :active transform also fires on .ds-modal-stage-handle (the icon-only button sitting on the vertical seam between sidebar and preview). The handle is absolutely positioned at top: 50%; transform: translateY(-50%) to vertically center itself on the seam; the press translate overrides that, moving the handle 1px down. Combined with the pointer release happening on the empty pixel below, the click is silently dropped.

Fix: override :active:not(:disabled) { transform: none } for the handle.

Files touched

  • apps/web/src/styles/viewer/composio.css — bug 1, bug 2
  • apps/web/src/styles/primitives.css — bug 3 (scoped override, global rule preserved for every other button)

How verified

Manual repro: open any plugin preview → hover the top-right of the preview (fullscreen icon was blank before, now visible) → click it (click was dropped before, now enters fullscreen) → click the seam handle on the sidebar/preview boundary (click was dropped before, now toggles the sidebar).

Visual diff is 23 insertions across two CSS files — no component logic or JSX touched.

…k broken (nexu-io#6791)

- .ds-modal-stage-fullscreen: add padding:0 to restore the 32px icon
  frame. The global button primitive's 16px horizontal padding consumed
  the full frame width, collapsing the SVG glyph to 0px.

- .ds-modal-stage-fullscreen:active:not(:disabled): reset translateY(0)
  so the global button-press transform does not displace the fullscreen
  button from its top-right anchor mid-press.

- .ds-modal-stage-handle:active:not(:disabled): set transform:none so
  the global button-press transform does not shift the sidebar seam
  handle off the pointer and swallow the click.
@lefarcen
lefarcen requested a review from PerishCode August 13, 2026 06:07
@lefarcen lefarcen added size/S PR changes 20-100 lines risk/medium Medium risk: regular code changes type/bugfix Bug fix labels Aug 13, 2026
@lefarcen

Copy link
Copy Markdown
Contributor

Heads-up: #6792 by @kuigoo is also open against the same PreviewModal regressions. Both PRs touch apps/web/src/styles/viewer/composio.css and trace back to #6791, so it would be good to compare approaches before we land one of them.

@lefarcen lefarcen added the needs-validation Runtime change detected; needs human or /explore agent validation. label Aug 13, 2026
@lefarcen

Copy link
Copy Markdown
Contributor

🧪 This PR changes user-facing preview modal behavior, so we'll want a manual QA pass before merge. Please hold off self-merging for now; we'll loop QA in once it's merge-ready.

@lefarcen lefarcen left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Hey @xxiaoxiong — the bug write-up is very clear. Before pool review picks this up, could you reshape the description into the repo template with explicit Why, What users will see, Surface area (UI), and Validation sections? That makes the reviewer handoff much faster.

@PerishCode PerishCode left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I reviewed both changed CSS ranges. The preview-specific resets are scoped appropriately, but the primitives edit also removes the global press transform from every other button, which expands this focused fix into an app-wide interaction regression.

🔁 Powered by Looper · runner=reviewer · agent=codex · An autonomous AI dev team for your GitHub repos.

completes. We disable it for the handle since it is in
a completely different visual context (a sidebar seam handle,
not a button). */
.ds-modal-stage-handle:active:not(:disabled) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Restore the global active rule before adding this exception. This hunk replaces button:active:not(:disabled) { transform: translateY(1px); } with only the .ds-modal-stage-handle selector, so every other enabled button in the app loses its existing press feedback. That contradicts the PR's stated scoped behavior and causes an unrelated app-wide interaction regression. Keep the original button:active:not(:disabled) declaration, then place this higher-specificity handle override after it (or move the handle override to its component-owned stylesheet); add a focused CSS assertion that both declarations remain present.

🔁 Powered by Looper · runner=reviewer · agent=codex · An autonomous AI dev team for your GitHub repos.

@lefarcen

Copy link
Copy Markdown
Contributor

Thanks @xxiaoxiong@PerishCode's review captures the current blocker here: please restore the global button:active:not(:disabled) rule, then layer the .ds-modal-stage-handle exception on top so this stays a scoped fix instead of removing press feedback app-wide. Once that's updated, we can take the next pass from there.

💡 To drive this PR to merge hands-free, paste this to your AI coding agent (Claude Code / Codex / opencode / Cursor …):
Take over nexu-io/open-design#6821 until it merges — read https://raw.githubusercontent.com/nexu-io/looper/main/skills/pr-takeover/SKILL.md and follow it.

@github-actions

Copy link
Copy Markdown
Contributor

Visual regression review

Head: 4f432b2 · Base: a1d2796

7 changed · 42 unchanged · 0 new without baseline · 0 failed

Changed cases

Case Main PR Diff
visual-home
1,519 px (0.12%)
main pr diff
visual-home-plugin-use-staged
4,556 px (0.35%)
main pr diff
visual-home-staged-attachment
3,841 px (0.30%)
main pr diff
visual-topbar-byok-switcher
2,683 px (0.21%)
main pr diff
visual-topbar-execution-switcher
3,326 px (0.26%)
main pr diff
visual-topbar-local-cli-model-list
1,623 px (0.13%)
main pr diff
visual-topbar-open-design-model-picker
1,667 px (0.13%)
main pr diff
Unchanged cases
Case Main PR Diff
visual-avatar-local-agent-list
41 px (0.00%)
main pr diff
visual-avatar-local-agent-list-panel
0 px (0.00%)
main pr diff
visual-avatar-menu
232 px (0.02%)
main pr diff
visual-avatar-menu-panel
30 px (0.09%)
main pr diff
visual-avatar-open-design-model-picker
172 px (0.01%)
main pr diff
visual-critical-settings
0 px (0.00%)
main pr diff
visual-critical-workspace
69 px (0.01%)
main pr diff
visual-critical-workspace-preview
0 px (0.00%)
main pr diff
visual-design-system-detail
0 px (0.00%)
main pr diff
visual-design-systems
0 px (0.00%)
main pr diff
visual-home-catalog
0 px (0.00%)
main pr diff
visual-home-context-picker
134 px (0.01%)
main pr diff
visual-home-context-picker-popover
0 px (0.00%)
main pr diff
visual-home-plugin-filter
0 px (0.00%)
main pr diff
visual-home-plugin-use-with-query
0 px (0.00%)
main pr diff
visual-integrations
0 px (0.00%)
main pr diff
visual-integrations-mcp
0 px (0.00%)
main pr diff
visual-integrations-use-everywhere
0 px (0.00%)
main pr diff
visual-new-project-modal
0 px (0.00%)
main pr diff
visual-onboarding-cloud
0 px (0.00%)
main pr diff

Visual diff is advisory only and does not block merging.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

needs-validation Runtime change detected; needs human or /explore agent validation. risk/medium Medium risk: regular code changes size/S PR changes 20-100 lines type/bugfix Bug fix

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants