Skip to content

fix(ranui): snap chrome wash on open; hold floating until placed - #535

Open
chaxus wants to merge 10 commits into
mainfrom
cursor/home-flash-select-wash-11f0
Open

chaxus wants to merge 10 commits into
mainfrom
cursor/home-flash-select-wash-11f0

Conversation

@chaxus

@chaxus chaxus commented Nov 11, 2026 •

Copy link
Copy Markdown
Owner

Summary

Chrome wash was fading late / misaligned on preview, and Role’s panel briefly lost its surface. Converge on the Stripe / Radix rule: selection fill never eases opacity; geometry must be correct before first paint. Hard-refresh also showed invite-field captions appearing hundreds of ms after first paint. Menubar peer hops also left a dual-layer residual, and Role under glass could lose the stacking fight with the hero frost plate.

Changes

  • Wash CSS (select slotted fill, menubar viewport hover, docs hu__hover / sb__hover): transition transform / width / height only; opacity snaps.
  • Menubar: no first-open content fade; write shell size, place wash, then flush so the first painted frame has wash + rows aligned (avoids both late wash and the ~16px early-place miss). Peer hops drop the outgoing layer immediately and slide the incoming menu with transform only — no opacity cross-fade residual between English / System / Graphite.
  • FloatingController: afterPosition before enter transit; no visibility:hidden hold (that broke Role panel paint).
  • Input / select DSD: _preSerialize paints label / placeholder into closed shadow (SSR mocks gain insertBefore); invite example captions are present on first paint, not only after upgrade.
  • Role stacking: hero-live frost moves to ::before (same pattern as the glass header); select portal wrapper carries the dropdown z-index so Role hit-tests above the plate.
  • Docs: modulepreload for earlier client upgrade; regenerate style-token docs after wash CSS change.

Verify on preview

After Pages redeploys (latest head): hard-refresh home — invite card shows Work email / Role on first paint (no late label pop). Open English / System / Graphite — selected wash on first frame and aligned; hop peers — only one menu’s labels visible mid-transition. Open Role under Liquid glass — panel stays above the hero plate.

Open in Web Open in Cursor 

Menubar shared viewport no longer fades content on first open or hides
the selected wash until shell morph ends — both read as a late hover
fill. Harvest after one rAF. Floating panels stay visibility:hidden
until afterPosition writes geometry (and select wash), then reveal.
Docs head modulepreload starts the client bundle earlier to shorten
chrome upgrade flash on cold loads.

Co-authored-by: ZhouHang <hicaxs@gmail.com>
@cloudflare-workers-and-pages

cloudflare-workers-and-pages Bot commented Nov 11, 2026 •

Copy link
Copy Markdown

Deploying ran with  Cloudflare Pages  Cloudflare Pages

Latest commit: 02029d2
Status: ✅  Deploy successful!
Preview URL: https://7e9f09b6.ran-4ty.pages.dev
Branch Preview URL: https://cursor-home-flash-select-was.ran-4ty.pages.dev

View logs

cursoragent and others added 9 commits November 11, 2026 03:23
Industry pattern (Stripe / Radix): selection fill eases transform/size
only — opacity snaps, so open and row moves never read as a late fade.
Place menubar wash before fitAndShow's forced reflow. Drop the floating
visibility:hidden hold that left Role menus without a painted surface.

Co-authored-by: ZhouHang <hicaxs@gmail.com>
First-open wash must use post-fitAndShow geometry with data-instant —
early place left dy≈16px short of the selected row. Peer hops wait for
shell morph again, then snap (opacity has no transition). Regenerate
style-token docs after wash CSS change.

Co-authored-by: ZhouHang <hicaxs@gmail.com>
Place the selected wash after shell size is written but before the
instant transition flush, so the first painted frame has wash + rows
together at the correct clip-local box. Peer hops show wash immediately
with content and only re-snap after morph — never hide then re-fade.

Co-authored-by: ZhouHang <hicaxs@gmail.com>
Unformatted long argument list failed Lint & Type-check on CI.

Co-authored-by: ZhouHang <hicaxs@gmail.com>
SSR setAttribute never ran attributeChangedCallback, so invite-card
captions and placeholders only appeared after client upgrade. Call
label/placeholder sync from _preSerialize, teach ShadowRoot mocks
insertBefore, and assert DSD contains the caption nodes.

Co-authored-by: ZhouHang <hicaxs@gmail.com>
Peer hops removed the outgoing layer immediately and slide incoming content
with transform only, so English/System/Graphite no longer cross-fade as a
double menu. Hero frost moves to ::before (header pattern) and the select
portal wrapper carries the dropdown z-index so Role stays above the plate.

Co-authored-by: ZhouHang <hicaxs@gmail.com>
position:relative on the body portal wrapper shifted absolute panel coords
and blew popup bounds. Stacking stays on FloatingController + hero ::before.

Co-authored-by: ZhouHang <hicaxs@gmail.com>
elementFromPoint often lands inside r-dropdown's closed shadow; closest()
stops there, so the glass Role stacking guard falsely reported "other".

Co-authored-by: ZhouHang <hicaxs@gmail.com>
WebKit/Firefox briefly expose the listbox before FloatingController places
it; hit samples then land outside the viewport and read as null.

Co-authored-by: ZhouHang <hicaxs@gmail.com>

This branch has not been deployed

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants