Quick answer: Browser fullscreen drops cursor customizations (style, pointer lock). Re-apply them on the “On fullscreen change” trigger, not just on start of layout.
A custom cursor sprite hides the OS cursor at start of layout. Entering fullscreen restores the OS cursor; exiting fullscreen leaves it hidden — reset logic only ran at start.
Use the Fullscreen Change Trigger
On fullscreen changed:
Browser → Set mouse cursor style to None
Mouse → Set custom cursor sprite_cursor
This trigger fires whenever the user enters or exits fullscreen — via your button or the Esc key. Re-apply whatever cursor state you want.
Pointer Lock Too
If you used pointer lock for FPS-style aim, fullscreen exits release it. Re-request on focus/resume:
On any click (while playing):
Browser → Request pointer lock
The browser only grants pointer lock on a user gesture, so don’t request it cold — tie to a click.
Reset on Visibility Change
Tab focus loss can also reset cursor state. Subscribe to “On resumed” / visibility change and re-apply if your game pauses-and-resumes seamlessly.
Verifying
Toggle fullscreen with F11 or your in-game button. The custom cursor and pointer lock state persist across the transition. ESC out of fullscreen still shows your cursor correctly.
“Fullscreen and focus changes reset cursor state. Re-apply on every transition trigger.”
Browsers tighten autoplay/pointer-lock rules constantly — rely on triggers, not start-of-layout, for anything user-gesture-gated.