fix(web): preview modal fullscreen icon blank and sidebar handle click broken - #6821
fix(web): preview modal fullscreen icon blank and sidebar handle click broken#6821xxiaoxiong wants to merge 1 commit into
Conversation
…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.
|
🧪 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
left a comment
There was a problem hiding this comment.
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
left a comment
There was a problem hiding this comment.
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) { |
There was a problem hiding this comment.
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.
|
Thanks @xxiaoxiong — @PerishCode's review captures the current blocker here: please restore the global
|


































































Fixes two preview-modal interaction bugs introduced by inheriting the global
buttonprimitive styles in apps/web/src/styles/viewer/composio.css.Bug 1 — fullscreen icon invisible
The hover-revealed fullscreen toggle (
.ds-modal-stage-fullscreen) is sized32px × 32pxbut inherits the globalbuttonrule which setspadding: 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: 0so 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 attop: 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
:activetransform 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 attop: 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
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.