@yhattav/react-component-cursor
Version:
A lightweight, TypeScript-first React library for creating beautiful custom cursors with SSR support, smooth animations, and zero dependencies. Perfect for interactive websites, games, and creative applications.
2 lines • 4.27 kB
JavaScript
import {b,a as a$1}from'./chunk-IYYPIASE.mjs';var e=class e{constructor(){this.subscribers=new Map;this.currentPosition=null;this.isListening=false;this.rafId=null;this.handleMouseMove=this.handleMouseMove.bind(this);}static getInstance(){return e.instance||(e.instance=new e),e.instance}subscribe(i){if(b())return ()=>{};let t={subscription:i,lastCallTime:0,timeoutId:null};return this.subscribers.set(i.id,t),this.isListening||this.startListening(),this.currentPosition&&setTimeout(()=>{this.subscribers.has(i.id)&&this.callSubscriber(t);},0),()=>{this.unsubscribe(i.id);}}unsubscribe(i){let t=this.subscribers.get(i);t!=null&&t.timeoutId&&clearTimeout(t.timeoutId),this.subscribers.delete(i),this.subscribers.size===0&&this.stopListening();}startListening(){this.isListening||b()||(document.addEventListener("mousemove",this.handleMouseMove),this.isListening=true,this.loadGlobalPosition());}stopListening(){this.isListening&&(document.removeEventListener("mousemove",this.handleMouseMove),this.isListening=false,this.rafId&&(cancelAnimationFrame(this.rafId),this.rafId=null));}handleMouseMove(i){let t={x:i.clientX,y:i.clientY};this.currentPosition=t,this.saveGlobalPosition(),this.rafId===null&&(this.rafId=requestAnimationFrame(()=>{this.notifySubscribers(),this.rafId=null;}));}notifySubscribers(){if(!this.currentPosition)return;let i=Date.now();this.subscribers.forEach(t=>{let{subscription:n,lastCallTime:o,timeoutId:c}=t,{throttleMs:u=0}=n;if(u>0){let b=i-o;b>=u?this.callSubscriber(t):(c&&clearTimeout(c),t.timeoutId=setTimeout(()=>{this.callSubscriber(t),t.timeoutId=null;},u-b));}else this.callSubscriber(t);});}callSubscriber(i){this.currentPosition&&(i.subscription.callback(this.currentPosition),i.lastCallTime=Date.now());}loadGlobalPosition(){try{let i=window.__mouseTrackerPosition__;i&&typeof i.x=="number"&&typeof i.y=="number"&&(this.currentPosition=i);}catch(i){}}saveGlobalPosition(){if(this.currentPosition)try{window.__mouseTrackerPosition__=a$1({},this.currentPosition);}catch(i){}}getCurrentPosition(){return this.currentPosition?a$1({},this.currentPosition):null}getSubscriberCount(){return this.subscribers.size}static resetInstance(){e.instance&&(e.instance.stopListening(),e.instance=null);}};e.instance=null;var a=e;var s=class s{constructor(){this.subscribers=new Map;this.currentGlobalPosition=null;this.isListening=false;this.rafId=null;this.mouseTracker=a.getInstance(),this.handleLayoutChange=this.handleLayoutChange.bind(this);}static getInstance(){return s.instance||(s.instance=new s),s.instance}subscribe(i){if(b())return ()=>{};let t={subscription:i,lastCallTime:0,timeoutId:null};this.subscribers.set(i.id,t),this.isListening||this.startListening();let n=this.mouseTracker.subscribe({id:`coordinator-${i.id}`,callback:o=>{this.updateGlobalPosition(o),this.notifyPositionChange(i.id,o);},throttleMs:i.throttleMs});return ()=>{n(),this.unsubscribe(i.id);}}unsubscribe(i){let t=this.subscribers.get(i);t!=null&&t.timeoutId&&clearTimeout(t.timeoutId),this.subscribers.delete(i),this.subscribers.size===0&&this.stopListening();}startListening(){this.isListening||b()||(document.addEventListener("scroll",this.handleLayoutChange,true),window.addEventListener("resize",this.handleLayoutChange),this.isListening=true);}stopListening(){this.isListening&&(document.removeEventListener("scroll",this.handleLayoutChange,true),window.removeEventListener("resize",this.handleLayoutChange),this.isListening=false,this.rafId&&(cancelAnimationFrame(this.rafId),this.rafId=null));}handleLayoutChange(){this.rafId===null&&(this.rafId=requestAnimationFrame(()=>{this.notifyAllSubscribersWithCurrentPosition(),this.rafId=null;}));}updateGlobalPosition(i){this.currentGlobalPosition=i;}notifyPositionChange(i,t){let n=this.subscribers.get(i);n&&n.subscription.onPositionChange(t);}notifyAllSubscribersWithCurrentPosition(){this.currentGlobalPosition&&this.subscribers.forEach(i=>{i.subscription.onPositionChange(this.currentGlobalPosition);});}getSubscriberCount(){return this.subscribers.size}static resetInstance(){s.instance&&(s.instance.stopListening(),s.instance=null);}};s.instance=null;var h=s;export{h as CursorCoordinator};//# sourceMappingURL=CursorCoordinator-M32HDHIO.mjs.map
//# sourceMappingURL=CursorCoordinator-M32HDHIO.mjs.map