{
  "version": 3,
  "sources": ["../../../plugins/pointer/shared-events.js", "../../../plugins/pointer/touch.js", "../../../plugins/pointer/press.js", "../../../plugins/pointer/mouse.js", "../../../plugins/pointer/index.js"],
  "sourcesContent": ["/**\n * Shared event helper utilities for the Pointer plugin.\n */\n\n\"use strict\";\n\nexport function createEventHelpers( pluginApi ) {\n\t\n\tconst utils = pluginApi.utils;\n\t\n\tfunction onevent(\n\t\tmode, fn, once, hitBox, modes, name, listenerArr, extraId, extraData, customData\n\t) {\n\t\tlet modeFound = false;\n\t\t\n\t\tfor( let i = 0; i < modes.length; i++ ) {\n\t\t\tif( mode === modes[ i ] ) {\n\t\t\t\tmodeFound = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\t\n\t\tif( !modeFound ) {\n\t\t\tconst error = new Error(\n\t\t\t\t`${name}: mode needs to be one of the following: ${modes.join( \", \" )}.`\n\t\t\t);\n\t\t\terror.code = \"INVALID_MODE\";\n\t\t\tthrow error;\n\t\t}\n\t\t\n\t\tonce = !!( once );\n\t\t\n\t\tif( typeof fn !== \"function\" ) {\n\t\t\tconst error = new Error( `${name}: fn is not a valid function.` );\n\t\t\terror.code = \"INVALID_FUNCTION\";\n\t\t\tthrow error;\n\t\t}\n\t\t\n\t\tif( hitBox ) {\n\t\t\tif(\n\t\t\t\t!Number.isInteger( hitBox.x ) ||\n\t\t\t\t!Number.isInteger( hitBox.y ) ||\n\t\t\t\t!Number.isInteger( hitBox.width ) ||\n\t\t\t\t!Number.isInteger( hitBox.height )\n\t\t\t) {\n\t\t\t\tconst error = new Error(\n\t\t\t\t\t`${name}: hitBox must have properties x, y, width, and height whose values ` +\n\t\t\t\t\t\"are integers.\"\n\t\t\t\t);\n\t\t\t\terror.code = \"INVALID_HITBOX\";\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\t\t\n\t\tsetTimeout( () => {\n\t\t\tconst originalFn = fn;\n\t\t\tlet newMode = mode;\n\t\t\t\n\t\t\tif( typeof extraId === \"string\" ) {\n\t\t\t\tnewMode = mode + extraId;\n\t\t\t}\n\t\t\t\n\t\t\tlet wrappedFn = fn;\n\t\t\tif( once ) {\n\t\t\t\twrappedFn = ( data, customData ) => {\n\t\t\t\t\toffevent( mode, originalFn, modes, name, listenerArr, extraId );\n\t\t\t\t\toriginalFn( data, customData );\n\t\t\t\t};\n\t\t\t}\n\t\t\t\n\t\t\tif( !listenerArr[ newMode ] ) {\n\t\t\t\tlistenerArr[ newMode ] = [];\n\t\t\t}\n\t\t\t\n\t\t\tlistenerArr[ newMode ].push( {\n\t\t\t\t\"fn\": wrappedFn,\n\t\t\t\t\"hitBox\": hitBox,\n\t\t\t\t\"extraData\": extraData,\n\t\t\t\t\"clickDown\": false,\n\t\t\t\t\"originalFn\": originalFn,\n\t\t\t\t\"customData\": customData\n\t\t\t} );\n\t\t}, 1 );\n\t\t\n\t\treturn true;\n\t}\n\t\n\tfunction offevent( mode, fn, modes, name, listenerArr, extraId ) {\n\t\tlet modeFound = false;\n\t\t\n\t\tfor( let i = 0; i < modes.length; i++ ) {\n\t\t\tif( mode === modes[ i ] ) {\n\t\t\t\tmodeFound = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\t\n\t\tif( !modeFound ) {\n\t\t\tconst error = new Error(\n\t\t\t\t`${name}: mode needs to be one of the following: ${modes.join( \", \" )}.`\n\t\t\t);\n\t\t\terror.code = \"INVALID_MODE\";\n\t\t\tthrow error;\n\t\t}\n\t\t\n\t\tif( typeof extraId === \"string\" ) {\n\t\t\tmode += extraId;\n\t\t}\n\t\t\n\t\tconst isClear = fn == null;\n\t\t\n\t\tif( !isClear && typeof fn !== \"function\" ) {\n\t\t\tconst error = new Error( `${name}: fn is not a valid function.` );\n\t\t\terror.code = \"INVALID_FUNCTION\";\n\t\t\tthrow error;\n\t\t}\n\t\t\n\t\tif( listenerArr[ mode ] ) {\n\t\t\tif( isClear ) {\n\t\t\t\tdelete listenerArr[ mode ];\n\t\t\t} else {\n\t\t\t\tfor( let i = listenerArr[ mode ].length - 1; i >= 0; i-- ) {\n\t\t\t\t\tif( listenerArr[ mode ][ i ].originalFn === fn ) {\n\t\t\t\t\t\tlistenerArr[ mode ].splice( i, 1 );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif( listenerArr[ mode ].length === 0 ) {\n\t\t\t\t\tdelete listenerArr[ mode ];\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\t\n\tfunction triggerEventListeners( mode, data, listenerArr, clickStatus ) {\n\t\tif( !listenerArr[ mode ] ) {\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tconst temp = listenerArr[ mode ].slice();\n\t\t\n\t\tfor( let i = 0; i < temp.length; i++ ) {\n\t\t\tconst listener = temp[ i ];\n\t\t\t\n\t\t\tif( clickStatus === \"up\" && !listener.clickDown ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t\n\t\t\tif( listener.hitBox ) {\n\t\t\t\tlet isHit = false;\n\t\t\t\tlet newData;\n\t\t\t\t\n\t\t\t\tif( Array.isArray( data ) ) {\n\t\t\t\t\tnewData = [];\n\t\t\t\t\tfor( let j = 0; j < data.length; j++ ) {\n\t\t\t\t\t\tconst pos = data[ j ];\n\t\t\t\t\t\tif( utils.inRange( pos, listener.hitBox ) ) {\n\t\t\t\t\t\t\tnewData.push( pos );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif( newData.length > 0 ) {\n\t\t\t\t\t\tisHit = true;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tnewData = data;\n\t\t\t\t\tif( utils.inRange( data, listener.hitBox ) ) {\n\t\t\t\t\t\tisHit = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif( isHit ) {\n\t\t\t\t\tif( clickStatus === \"down\" ) {\n\t\t\t\t\t\tlistener.clickDown = true;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlistener.clickDown = false;\n\t\t\t\t\t\tlistener.fn( newData, listener.customData );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tlistener.fn( data, listener.customData );\n\t\t\t}\n\t\t}\n\t}\n\t\n\treturn {\n\t\t\"onevent\": onevent,\n\t\t\"offevent\": offevent,\n\t\t\"triggerEventListeners\": triggerEventListeners\n\t};\n}\n\n\n", "/**\n * Touch registration for Pointer plugin.\n */\n\n\"use strict\";\n\nimport { triggerPressListeners, triggerClickListeners, getTouchPress } from \"./press.js\";\n\n// Module-level reference to startTouchInternal function\nlet m_startTouchInternal = null;\n\nexport function startTouchInternal( screenData ) {\n\tif( m_startTouchInternal ) {\n\t\tm_startTouchInternal( screenData );\n\t}\n}\n\nexport function registerTouch( pluginApi, helpers ) {\n\t\n\tconst m_onevent = helpers.onevent;\n\tconst m_offevent = helpers.offevent;\n\tconst m_triggerEventListeners = helpers.triggerEventListeners;\n\t\n\tpluginApi.addScreenDataItem( \"touchStopped\", false );\n\tpluginApi.addScreenDataItem( \"touchStarted\", false );\n\tpluginApi.addScreenDataItem( \"touches\", {} );\n\tpluginApi.addScreenDataItem( \"lastTouches\", {} );\n\tpluginApi.addScreenDataItem( \"touchEventListenersActive\", 0 );\n\tpluginApi.addScreenDataItem( \"onTouchEventListeners\", {} );\n\t\n\tpluginApi.addScreenInitFunction( initTouchData );\n\twindow.addEventListener( \"blur\", onWindowBlurTouch );\n\t\n\tpluginApi.addCommand( \"startTouch\", startTouch, true, [] );\n\tpluginApi.addCommand( \"stopTouch\", stopTouch, true, [] );\n\tpluginApi.addCommand( \"intouch\", intouch, true, [] );\n\tpluginApi.addCommand(\n\t\t\"ontouch\", ontouch, true, [ \"mode\", \"fn\", \"once\", \"hitBox\", \"customData\" ]\n\t);\n\tpluginApi.addCommand( \"offtouch\", offtouch, true, [ \"mode\", \"fn\" ] );\n\tpluginApi.addCommand( \"setPinchZoom\", setPinchZoom, false, [ \"isEnabled\" ] );\n\t\n\tfunction initTouchData( screenData ) {\n\t\tscreenData.onTouchEventListeners = {\n\t\t\t\"start\": [],\n\t\t\t\"end\": [],\n\t\t\t\"move\": []\n\t\t};\n\t}\n\t\n\tfunction startTouchInternal( screenData ) {\n\t\tif( !screenData.touchStopped ) {\n\t\t\tstartTouch( screenData );\n\t\t}\n\t}\n\t\n\t// Store reference for module-level export\n\tm_startTouchInternal = startTouchInternal;\n\n\tfunction startTouch( screenData ) {\n\n\t\t// Clear explicit touch stopped\n\t\tscreenData.touchStopped = false;\n\n\t\tif( !screenData.touchStarted ) {\n\t\t\tconst options = { \"passive\": false };\n\t\t\tscreenData.canvas.addEventListener( \"touchstart\", touchStart, options );\n\t\t\tscreenData.canvas.addEventListener( \"touchmove\", touchMove, options );\n\t\t\tscreenData.canvas.addEventListener( \"touchend\", touchEnd, options );\n\t\t\tscreenData.canvas.addEventListener( \"touchcancel\", touchEnd, options );\n\t\t\tscreenData.touchStarted = true;\n\t\t}\n\t}\n\t\n\tfunction stopTouch( screenData ) {\n\t\t\n\t\t//Clear explicit touchStopped\n\t\tscreenData.touchStopped = true;\n\n\t\tif( screenData.touchStarted ) {\n\t\t\tscreenData.canvas.removeEventListener( \"touchstart\", touchStart );\n\t\t\tscreenData.canvas.removeEventListener( \"touchmove\", touchMove );\n\t\t\tscreenData.canvas.removeEventListener( \"touchend\", touchEnd );\n\t\t\tscreenData.canvas.removeEventListener( \"touchcancel\", touchEnd );\n\t\t\tscreenData.touchStarted = false;\n\t\t}\n\t}\n\t\n\tfunction intouch( screenData ) {\n\t\tstartTouchInternal( screenData );\n\t\treturn getTouch( screenData );\n\t}\n\t\n\tfunction ontouch( screenData, options ) {\n\t\tconst mode = options.mode;\n\t\tconst fn = options.fn;\n\t\tconst once = options.once;\n\t\tconst hitBox = options.hitBox;\n\t\tconst customData = options.customData;\n\t\t\n\t\tconst isValid = m_onevent(\n\t\t\tmode, fn, once, hitBox, [ \"start\", \"end\", \"move\" ], \"ontouch\",\n\t\t\tscreenData.onTouchEventListeners, null, null, customData\n\t\t);\n\t\t\n\t\tif( isValid ) {\n\t\t\tstartTouchInternal( screenData );\n\t\t\tscreenData.touchEventListenersActive += 1;\n\t\t}\n\t}\n\t\n\tfunction offtouch( screenData, options ) {\n\t\tconst mode = options.mode;\n\t\tconst fn = options.fn;\n\t\t\n\t\tconst isValid = m_offevent(\n\t\t\tmode, fn, [ \"start\", \"end\", \"move\" ], \"offtouch\",\n\t\t\tscreenData.onTouchEventListeners\n\t\t);\n\t\t\n\t\tif( isValid ) {\n\t\t\tif( fn == null ) {\n\t\t\t\tscreenData.touchEventListenersActive = 0;\n\t\t\t} else {\n\t\t\t\tscreenData.touchEventListenersActive -= 1;\n\t\t\t\tif( screenData.touchEventListenersActive < 0 ) {\n\t\t\t\t\tscreenData.touchEventListenersActive = 0;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n\tfunction setPinchZoom( options ) {\n\t\tconst isEnabled = !!( options.isEnabled );\n\t\tif( isEnabled ) {\n\t\t\tdocument.body.style.touchAction = \"\";\n\t\t} else {\n\t\t\tdocument.body.style.touchAction = \"none\";\n\t\t}\n\t}\n\t\n\tfunction touchStart( e ) {\n\t\tconst screenData = getScreenDataFromEvent( e );\n\t\tif( screenData == null ) {\n\t\t\treturn;\n\t\t}\n\t\tupdateTouch( screenData, e, \"start\" );\n\t\tconst touchData = getTouch( screenData );\n\t\tif( screenData.touchEventListenersActive > 0 ) {\n\t\t\tm_triggerEventListeners( \"start\", touchData, screenData.onTouchEventListeners );\n\t\t}\n\t\ttriggerPressListeners( screenData, \"down\", getTouchPress( screenData ) );\n\t\te.preventDefault();\n\t\ttriggerClickListeners( screenData, getTouchPress( screenData ), \"down\" );\n\t}\n\t\n\tfunction touchMove( e ) {\n\t\tconst screenData = getScreenDataFromEvent( e );\n\t\tif( screenData == null ) {\n\t\t\treturn;\n\t\t}\n\t\tupdateTouch( screenData, e, \"move\" );\n\t\tconst touchData = getTouch( screenData );\n\t\tif( screenData.touchEventListenersActive > 0 ) {\n\t\t\tm_triggerEventListeners( \"move\", touchData, screenData.onTouchEventListeners );\n\t\t}\n\t\ttriggerPressListeners( screenData, \"move\", getTouchPress( screenData ) );\n\t}\n\t\n\tfunction touchEnd( e ) {\n\t\tconst screenData = getScreenDataFromEvent( e );\n\t\tif( screenData == null ) {\n\t\t\treturn;\n\t\t}\n\t\tupdateTouch( screenData, e, \"end\" );\n\t\tconst touchData = getTouch( screenData );\n\t\tif( screenData.touchEventListenersActive > 0 ) {\n\t\t\tm_triggerEventListeners( \"end\", touchData, screenData.onTouchEventListeners );\n\t\t}\n\t\ttriggerPressListeners( screenData, \"up\", getTouchPress( screenData ) );\n\t\ttriggerClickListeners( screenData, getTouchPress( screenData ), \"up\" );\n\t}\n\t\n\tfunction updateTouch( screenData, e, action ) {\n\t\tif( !screenData.clientRect ) {\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tconst newTouches = {};\n\t\tconst rect = screenData.clientRect;\n\t\t\n\t\tfor( let j = 0; j < e.touches.length; j++ ) {\n\t\t\tconst touch = e.touches[ j ];\n\t\t\tconst touchData = {};\n\t\t\ttouchData.x = Math.floor(\n\t\t\t\t( touch.clientX - rect.left ) / rect.width * screenData.width\n\t\t\t);\n\t\t\ttouchData.y = Math.floor(\n\t\t\t\t( touch.clientY - rect.top ) / rect.height * screenData.height\n\t\t\t);\n\t\t\ttouchData.id = touch.identifier;\n\t\t\tif( screenData.touches[ touchData.id ] ) {\n\t\t\t\ttouchData.lastX = screenData.touches[ touchData.id ].x;\n\t\t\t\ttouchData.lastY = screenData.touches[ touchData.id ].y;\n\t\t\t} else {\n\t\t\t\ttouchData.lastX = null;\n\t\t\t\ttouchData.lastY = null;\n\t\t\t}\n\t\t\ttouchData.action = action;\n\t\t\tnewTouches[ touchData.id ] = touchData;\n\t\t}\n\t\t\n\t\tscreenData.lastTouches = screenData.touches;\n\t\tscreenData.touches = newTouches;\n\t\tscreenData.lastEvent = \"touch\";\n\t}\n\t\n\tfunction getTouch( screenData ) {\n\t\tconst touchArr = [];\n\t\tfor( const i in screenData.touches ) {\n\t\t\tconst touch = screenData.touches[ i ];\n\t\t\tconst touchData = {\n\t\t\t\t\"x\": touch.x,\n\t\t\t\t\"y\": touch.y,\n\t\t\t\t\"id\": touch.id,\n\t\t\t\t\"lastX\": touch.lastX,\n\t\t\t\t\"lastY\": touch.lastY,\n\t\t\t\t\"action\": touch.action,\n\t\t\t\t\"type\": \"touch\"\n\t\t\t};\n\t\t\ttouchArr.push( touchData );\n\t\t}\n\t\treturn touchArr;\n\t}\n\t\n\tfunction getScreenDataFromEvent( e ) {\n\t\tconst screenId = e.target.dataset?.screenId;\n\t\tif( screenId === undefined ) {\n\t\t\treturn null;\n\t\t}\n\t\treturn pluginApi.getScreenData( \"touch-event\", screenId );\n\t}\n\t\n\tfunction onWindowBlurTouch() {\n\t\tconst allScreensData = pluginApi.getAllScreensData();\n\t\tfor( const screenData of allScreensData ) {\n\t\t\tscreenData.lastTouches = screenData.touches;\n\t\t\tscreenData.touches = {};\n\t\t}\n\t}\n\t\n\tfunction clearTouchEvents( screenData ) {\n\t\tscreenData.onTouchEventListeners = {};\n\t\tscreenData.touchEventListenersActive = 0;\n\t}\n\t\n\treturn {\n\t\t\"stopTouch\": stopTouch,\n\t\t\"clearTouchEvents\": clearTouchEvents\n\t};\n}\n\n\n", "/**\n * Press and Click registration for Pointer plugin.\n */\n\n\"use strict\";\n\nimport { startMouseInternal } from \"./mouse.js\";\nimport { startTouchInternal } from \"./touch.js\";\n\nexport function registerPress( pluginApi, helpers ) {\n\tconst onevent = helpers.onevent;\n\tconst offevent = helpers.offevent;\n\tconst triggerEventListenersLocal = helpers.triggerEventListeners;\n\t\n\t// Expose trigger for other modules via module-level binding\n\tm_triggerEventListeners = triggerEventListenersLocal;\n\t\n\tpluginApi.addScreenDataItem( \"pressEventListenersActive\", 0 );\n\tpluginApi.addScreenDataItem( \"onPressEventListeners\", {} );\n\tpluginApi.addScreenDataItem( \"clickEventListenersActive\", 0 );\n\tpluginApi.addScreenDataItem( \"onClickEventListeners\", {} );\n\t\n\tpluginApi.addScreenInitFunction( initPressData );\n\t\n\tpluginApi.addCommand( \"inpress\", inpress, true, [] );\n\tpluginApi.addCommand( \"onpress\", onpress, true, [ \"mode\", \"fn\", \"once\", \"hitBox\", \"customData\" ] );\n\tpluginApi.addCommand( \"offpress\", offpress, true, [ \"mode\", \"fn\" ] );\n\tpluginApi.addCommand( \"onclick\", onclick, true, [ \"fn\", \"once\", \"hitBox\", \"customData\" ] );\n\tpluginApi.addCommand( \"offclick\", offclick, true, [ \"fn\" ] );\n\t\n\tfunction initPressData( screenData ) {\n\t\tscreenData.onPressEventListeners = {\n\t\t\t\"down\": [],\n\t\t\t\"up\": [],\n\t\t\t\"move\": []\n\t\t};\n\t\tscreenData.onClickEventListeners = {\n\t\t\t\"click\": []\n\t\t};\n\t}\n\t\n\tfunction inpress( screenData ) {\n\t\tstartMouseInternal( screenData );\n\t\tstartTouchInternal( screenData );\n\t\tif( screenData.lastEvent === \"touch\" ) {\n\t\t\treturn getTouchPress( screenData );\n\t\t} else {\n\t\t\treturn screenData.api.inmouse();\n\t\t}\n\t}\n\t\n\tfunction onpress( screenData, options ) {\n\t\tconst mode = options.mode;\n\t\tconst fn = options.fn;\n\t\tconst once = options.once;\n\t\tconst hitBox = options.hitBox;\n\t\tconst customData = options.customData;\n\t\t\n\t\tconst isValid = onevent(\n\t\t\tmode, fn, once, hitBox, [ \"down\", \"up\", \"move\" ], \"onpress\",\n\t\t\tscreenData.onPressEventListeners, null, null, customData\n\t\t);\n\t\t\n\t\tif( isValid ) {\n\t\t\tstartMouseInternal( screenData );\n\t\t\tstartTouchInternal( screenData );\n\t\t\tscreenData.pressEventListenersActive += 1;\n\t\t}\n\t}\n\t\n\tfunction offpress( screenData, options ) {\n\t\tconst mode = options.mode;\n\t\tconst fn = options.fn;\n\t\t\n\t\tconst isValid = offevent(\n\t\t\tmode, fn, [ \"down\", \"up\", \"move\" ], \"offpress\",\n\t\t\tscreenData.onPressEventListeners\n\t\t);\n\t\t\n\t\tif( isValid ) {\n\t\t\tif( fn == null ) {\n\t\t\t\tscreenData.pressEventListenersActive = 0;\n\t\t\t} else {\n\t\t\t\tscreenData.pressEventListenersActive -= 1;\n\t\t\t\tif( screenData.pressEventListenersActive < 0 ) {\n\t\t\t\t\tscreenData.pressEventListenersActive = 0;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n\tfunction onclick( screenData, options ) {\n\t\tconst fn = options.fn;\n\t\tconst once = options.once;\n\t\tlet hitBox = options.hitBox;\n\t\tconst customData = options.customData;\n\t\t\n\t\tif( hitBox == null ) {\n\t\t\thitBox = {\n\t\t\t\t\"x\": 0,\n\t\t\t\t\"y\": 0,\n\t\t\t\t\"width\": screenData.width,\n\t\t\t\t\"height\": screenData.height\n\t\t\t};\n\t\t}\n\t\t\n\t\tconst isValid = onevent(\n\t\t\t\"click\", fn, once, hitBox, [ \"click\" ], \"onclick\",\n\t\t\tscreenData.onClickEventListeners, null, null, customData\n\t\t);\n\t\t\n\t\tif( isValid ) {\n\t\t\tstartMouseInternal( screenData );\n\t\t\tstartTouchInternal( screenData );\n\t\t\tscreenData.clickEventListenersActive += 1;\n\t\t}\n\t}\n\t\n\tfunction offclick( screenData, options ) {\n\t\tconst fn = options.fn;\n\t\tconst isValid = offevent(\n\t\t\t\"click\", fn, [ \"click\" ], \"offclick\",\n\t\t\tscreenData.onClickEventListeners\n\t\t);\n\t\t\n\t\tif( isValid ) {\n\t\t\tif( fn == null ) {\n\t\t\t\tscreenData.clickEventListenersActive = 0;\n\t\t\t} else {\n\t\t\t\tscreenData.clickEventListenersActive -= 1;\n\t\t\t\tif( screenData.clickEventListenersActive < 0 ) {\n\t\t\t\t\tscreenData.clickEventListenersActive = 0;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n\tfunction clearPressEvents( screenData ) {\n\t\tscreenData.onPressEventListeners = {};\n\t\tscreenData.pressEventListenersActive = 0;\n\t}\n\t\n\tfunction clearClickEvents( screenData ) {\n\t\tscreenData.onClickEventListeners = {};\n\t\tscreenData.clickEventListenersActive = 0;\n\t}\n\t\n\treturn {\n\t\t\"clearPressEvents\": clearPressEvents,\n\t\t\"clearClickEvents\": clearClickEvents\n\t};\n}\n\n// Module-level reference to event trigger helper\nlet m_triggerEventListeners = null;\n\nexport function triggerPressListeners( screenData, mode, data ) {\n\tif( screenData.pressEventListenersActive > 0 && m_triggerEventListeners ) {\n\t\tm_triggerEventListeners( mode, data, screenData.onPressEventListeners );\n\t}\n}\n\nexport function triggerClickListeners( screenData, data, clickStatus ) {\n\tif( screenData.clickEventListenersActive > 0 && m_triggerEventListeners ) {\n\t\tm_triggerEventListeners( \"click\", data, screenData.onClickEventListeners, clickStatus );\n\t}\n}\n\nexport function getTouchPress( screenData ) {\n\tfunction copyTouches( touches, touchArr, action ) {\n\t\tfor( const i in touches ) {\n\t\t\tconst touch = touches[ i ];\n\t\t\tconst touchData = {\n\t\t\t\t\"x\": touch.x,\n\t\t\t\t\"y\": touch.y,\n\t\t\t\t\"id\": touch.id,\n\t\t\t\t\"lastX\": touch.lastX,\n\t\t\t\t\"lastY\": touch.lastY,\n\t\t\t\t\"action\": touch.action,\n\t\t\t\t\"type\": \"touch\"\n\t\t\t};\n\t\t\tif( action !== undefined ) {\n\t\t\t\ttouchData.action = action;\n\t\t\t}\n\t\t\ttouchArr.push( touchData );\n\t\t}\n\t}\n\t\n\tconst touchArr = [];\n\tcopyTouches( screenData.touches, touchArr );\n\tif( touchArr.length === 0 ) {\n\t\tcopyTouches( screenData.lastTouches, touchArr, \"up\" );\n\t}\n\tif( touchArr.length > 0 ) {\n\t\tconst touchData = touchArr[ 0 ];\n\t\tif( touchData.action === \"up\" ) {\n\t\t\ttouchData.buttons = 0;\n\t\t} else {\n\t\t\ttouchData.buttons = 1;\n\t\t}\n\t\ttouchData.touches = touchArr;\n\t\treturn touchData;\n\t} else {\n\t\treturn {\n\t\t\t\"x\": -1,\n\t\t\t\"y\": -1,\n\t\t\t\"id\": -1,\n\t\t\t\"lastX\": -1,\n\t\t\t\"lastY\": -1,\n\t\t\t\"action\": \"none\",\n\t\t\t\"buttons\": 0,\n\t\t\t\"type\": \"touch\"\n\t\t};\n\t}\n}\n\n\n", "/**\n * Mouse registration for Pointer plugin.\n */\n\n\"use strict\";\n\nimport { triggerPressListeners, triggerClickListeners, getTouchPress } from \"./press.js\";\n\n// Module-level reference to startMouseInternal function\nlet m_startMouseInternal = null;\n\nexport function startMouseInternal( screenData ) {\n\tif( m_startMouseInternal ) {\n\t\tm_startMouseInternal( screenData );\n\t}\n}\n\nexport function registerMouse( pluginApi, helpers ) {\n\tconst m_onevent = helpers.onevent;\n\tconst m_offevent = helpers.offevent;\n\tconst m_triggerEventListeners = helpers.triggerEventListeners;\n\n\tpluginApi.addScreenDataItem( \"mouseStopped\", false );\n\tpluginApi.addScreenDataItem( \"mouseStarted\", false );\n\tpluginApi.addScreenDataItem( \"mouse\", null );\n\tpluginApi.addScreenDataItem( \"lastEvent\", null );\n\tpluginApi.addScreenDataItem( \"isContextMenuEnabled\", false );\n\tpluginApi.addScreenDataItem( \"mouseEventListenersActive\", 0 );\n\tpluginApi.addScreenDataItem( \"onMouseEventListeners\", {\n\t\t\"down\": [],\n\t\t\"up\": [],\n\t\t\"move\": []\n\t} );\n\t\n\tpluginApi.addScreenInitFunction( initMouseData );\n\twindow.addEventListener( \"blur\", onWindowBlurMouse );\n\t\n\tpluginApi.addCommand( \"startMouse\", startMouse, true, [] );\n\tpluginApi.addCommand( \"stopMouse\", stopMouse, true, [] );\n\tpluginApi.addCommand( \"inmouse\", inmouse, true, [] );\n\tpluginApi.addCommand( \"setEnableContextMenu\", setEnableContextMenu, true, [ \"isEnabled\" ] );\n\tpluginApi.addCommand(\n\t\t\"onmouse\", onmouse, true, [ \"mode\", \"fn\", \"once\", \"hitBox\", \"customData\" ]\n\t);\n\tpluginApi.addCommand( \"offmouse\", offmouse, true, [ \"mode\", \"fn\" ] );\n\t\n\tfunction initMouseData( screenData ) {\n\t\tscreenData.mouse = {\n\t\t\t\"x\": Math.floor( screenData.width / 2 ),\n\t\t\t\"y\": Math.floor( screenData.height / 2 ),\n\t\t\t\"lastX\": Math.floor( screenData.width / 2 ),\n\t\t\t\"lastY\": Math.floor( screenData.height / 2 ),\n\t\t\t\"buttons\": 0,\n\t\t\t\"action\": \"none\"\n\t\t};\n\t}\n\t\n\tfunction startMouseInternal( screenData ) {\n\n\t\t// Do not start mouse if explicitly stopped\n\t\tif( screenData.mouseStopped === false ) {\n\t\t\tstartMouse( screenData );\n\t\t}\n\t}\n\t\n\t// Store reference for module-level export\n\tm_startMouseInternal = startMouseInternal;\n\n\tfunction startMouse( screenData ) {\n\n\t\t//Clear explicit mouseStopped\n\t\tscreenData.mouseStopped = false;\n\n\t\tif( !screenData.mouseStarted ) {\n\t\t\tscreenData.canvas.addEventListener( \"mousemove\", mouseMove );\n\t\t\tscreenData.canvas.addEventListener( \"mousedown\", mouseDown );\n\t\t\tscreenData.canvas.addEventListener( \"mouseup\", mouseUp );\n\t\t\tscreenData.canvas.addEventListener( \"contextmenu\", onContextMenu );\n\t\t\tscreenData.mouseStarted = true;\n\t\t}\n\t}\n\t\n\tfunction stopMouse( screenData ) {\n\n\t\t// Explicitly set mouse to stoppedto prevent mouse commands from starting mouse when\n\t\t// use explicitly sets it to true\n\t\tscreenData.mouseStopped = true;\n\n\t\tif( screenData.mouseStarted ) {\n\t\t\tscreenData.canvas.removeEventListener( \"mousemove\", mouseMove );\n\t\t\tscreenData.canvas.removeEventListener( \"mousedown\", mouseDown );\n\t\t\tscreenData.canvas.removeEventListener( \"mouseup\", mouseUp );\n\t\t\tscreenData.canvas.removeEventListener( \"contextmenu\", onContextMenu );\n\t\t\tscreenData.mouseStarted = false;\n\t\t}\n\t}\n\t\n\tfunction getMouse( screenData ) {\n\t\tconst mouse = {};\n\t\tmouse.x = screenData.mouse.x;\n\t\tmouse.y = screenData.mouse.y;\n\t\tmouse.lastX = screenData.mouse.lastX;\n\t\tmouse.lastY = screenData.mouse.lastY;\n\t\tmouse.buttons = screenData.mouse.buttons;\n\t\tmouse.action = screenData.mouse.action;\n\t\tmouse.type = \"mouse\";\n\t\treturn mouse;\n\t}\n\t\n\tfunction inmouse( screenData ) {\n\t\tstartMouseInternal( screenData );\n\t\treturn getMouse( screenData );\n\t}\n\t\n\tfunction setEnableContextMenu( screenData, options ) {\n\t\tscreenData.isContextMenuEnabled = !!( options.isEnabled );\n\t\tstartMouseInternal( screenData );\n\t}\n\t\n\tfunction onmouse( screenData, options ) {\n\t\tconst mode = options.mode;\n\t\tconst fn = options.fn;\n\t\tconst once = options.once;\n\t\tconst hitBox = options.hitBox;\n\t\tconst customData = options.customData;\n\t\t\n\t\tconst isValid = m_onevent(\n\t\t\tmode, fn, once, hitBox, [ \"down\", \"up\", \"move\" ], \"onmouse\",\n\t\t\tscreenData.onMouseEventListeners, null, null, customData\n\t\t);\n\t\t\n\t\tif( isValid ) {\n\t\t\tstartMouseInternal( screenData );\n\t\t\tscreenData.mouseEventListenersActive += 1;\n\t\t}\n\t}\n\t\n\tfunction offmouse( screenData, options ) {\n\t\tconst mode = options.mode;\n\t\tconst fn = options.fn;\n\t\t\n\t\tconst isValid = m_offevent(\n\t\t\tmode, fn, [ \"down\", \"up\", \"move\" ], \"offmouse\",\n\t\t\tscreenData.onMouseEventListeners\n\t\t);\n\t\t\n\t\tif( isValid ) {\n\t\t\tif( fn == null ) {\n\t\t\t\tscreenData.mouseEventListenersActive = 0;\n\t\t\t} else {\n\t\t\t\tscreenData.mouseEventListenersActive -= 1;\n\t\t\t\tif( screenData.mouseEventListenersActive < 0 ) {\n\t\t\t\t\tscreenData.mouseEventListenersActive = 0;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n\tfunction clearMouseEvents( screenData ) {\n\t\tscreenData.onMouseEventListeners = {\n\t\t\t\"down\": [],\n\t\t\t\"up\": [],\n\t\t\t\"move\": []\n\t\t};\n\t\tscreenData.mouseEventListenersActive = 0;\n\t}\n\t\n\tfunction mouseMove( e ) {\n\t\tconst screenData = getScreenDataFromEvent( e );\n\t\tif( !screenData ) {\n\t\t\treturn;\n\t\t}\n\t\tupdateMouse( screenData, e, \"move\" );\n\t\tconst mouseData = getMouse( screenData );\n\t\tif( screenData.mouseEventListenersActive > 0 ) {\n\t\t\tm_triggerEventListeners( \"move\", mouseData, screenData.onMouseEventListeners );\n\t\t}\n\t\ttriggerPressListeners( screenData, \"move\", mouseData );\n\t}\n\t\n\tfunction mouseDown( e ) {\n\t\tconst screenData = getScreenDataFromEvent( e );\n\t\tif( !screenData ) {\n\t\t\treturn;\n\t\t}\n\t\tupdateMouse( screenData, e, \"down\" );\n\t\tconst mouseData = getMouse( screenData );\n\t\tif( screenData.mouseEventListenersActive > 0 ) {\n\t\t\tm_triggerEventListeners( \"down\", mouseData, screenData.onMouseEventListeners );\n\t\t}\n\t\ttriggerPressListeners( screenData, \"down\", mouseData );\n\t\ttriggerClickListeners( screenData, mouseData, \"down\" );\n\t}\n\t\n\tfunction mouseUp( e ) {\n\t\tconst screenData = getScreenDataFromEvent( e );\n\t\tif( !screenData ) {\n\t\t\treturn;\n\t\t}\n\t\tupdateMouse( screenData, e, \"up\" );\n\t\tconst mouseData = getMouse( screenData );\n\t\tif( screenData.mouseEventListenersActive > 0 ) {\n\t\t\tm_triggerEventListeners( \"up\", mouseData, screenData.onMouseEventListeners );\n\t\t}\n\t\ttriggerPressListeners( screenData, \"up\", mouseData );\n\t\ttriggerClickListeners( screenData, mouseData, \"up\" );\n\t}\n\t\n\tfunction onContextMenu( e ) {\n\t\tconst screenData = getScreenDataFromEvent( e );\n\t\tif( !screenData ) {\n\t\t\treturn;\n\t\t}\n\t\tif( !screenData.isContextMenuEnabled ) {\n\t\t\te.preventDefault();\n\t\t\treturn false;\n\t\t}\n\t}\n\t\n\tfunction updateMouse( screenData, e, action ) {\n\t\tconst rect = screenData.clientRect;\n\t\tconst x = Math.floor(\n\t\t\te.offsetX / rect.width * screenData.width\n\t\t);\n\t\tconst y = Math.floor(\n\t\t\te.offsetY / rect.height * screenData.height\n\t\t);\n\t\t\n\t\tlet lastX = x;\n\t\tlet lastY = y;\n\t\t\n\t\tif( screenData.mouse ) {\n\t\t\tif( screenData.mouse.x !== undefined ) {\n\t\t\t\tlastX = screenData.mouse.x;\n\t\t\t}\n\t\t\tif( screenData.mouse.y !== undefined ) {\n\t\t\t\tlastY = screenData.mouse.y;\n\t\t\t}\n\t\t}\n\t\t\n\t\tscreenData.mouse = {\n\t\t\t\"x\": x,\n\t\t\t\"y\": y,\n\t\t\t\"lastX\": lastX,\n\t\t\t\"lastY\": lastY,\n\t\t\t\"buttons\": e.buttons,\n\t\t\t\"action\": action\n\t\t};\n\t\tscreenData.lastEvent = \"mouse\";\n\t}\n\t\n\tfunction getScreenDataFromEvent( e ) {\n\t\tconst screenId = e.target.dataset?.screenId;\n\t\tif( screenId === undefined ) {\n\t\t\treturn null;\n\t\t}\n\t\treturn pluginApi.getScreenData( \"mouse-event\", screenId );\n\t}\n\t\n\tfunction onWindowBlurMouse() {\n\t\tconst allScreensData = pluginApi.getAllScreensData();\n\t\tfor( const screenData of allScreensData ) {\n\t\t\tscreenData.mouse.buttons = 0;\n\t\t\tscreenData.mouse.action = \"up\";\n\t\t}\n\t}\n\t\n\treturn {\n\t\t\"stopMouse\": stopMouse,\n\t\t\"clearMouseEvents\": clearMouseEvents\n\t};\n}\n\n\n", "/**\n * Pi.js - Pointer Plugin\n * \n * Mouse, touch, and press handling ported from alpha.1 as a plugin.\n * \n * @module plugins/pointer\n * @version 1.0.0\n */\n\n\"use strict\";\n\nimport { createEventHelpers } from \"./shared-events.js\";\nimport { registerMouse } from \"./mouse.js\";\nimport { registerTouch } from \"./touch.js\";\nimport { registerPress } from \"./press.js\";\n\n\n/***************************************************************************************************\n * Plugin Initialization\n **************************************************************************************************/\n\n\nexport default function pointerPlugin( pluginApi ) {\n\t\n\t// Create shared helpers (onevent/offevent/triggerEventListeners)\n\tconst helpers = createEventHelpers( pluginApi );\n\t\n\t// Register feature modules\n\tconst mouseApi = registerMouse( pluginApi, helpers );\n\tconst touchApi = registerTouch( pluginApi, helpers );\n\tconst pressApi = registerPress( pluginApi, helpers );\n\t\n\t// Register clearEvents handlers for mouse, touch, and press\n\tpluginApi.registerClearEvents( \"mouse\", ( screenData ) => {\n\t\tif( screenData !== null ) {\n\t\t\t\n\t\t\t// Clear mouse events for specific screen\n\t\t\tmouseApi.clearMouseEvents( screenData );\n\t\t} else {\n\t\t\t// Clear mouse events for all screens\n\t\t\tconst allScreensData = pluginApi.getAllScreensData();\n\t\t\tfor( const sd of allScreensData ) {\n\t\t\t\tmouseApi.clearMouseEvents( sd );\n\t\t\t}\n\t\t}\n\t} );\n\t\n\tpluginApi.registerClearEvents( \"touch\", ( screenData ) => {\n\t\tif( screenData !== null ) {\n\t\t\t// Clear touch events for specific screen\n\t\t\ttouchApi.clearTouchEvents( screenData );\n\t\t} else {\n\t\t\t// Clear touch events for all screens\n\t\t\tconst allScreensData = pluginApi.getAllScreensData();\n\t\t\tfor( const sd of allScreensData ) {\n\t\t\t\ttouchApi.clearTouchEvents( sd );\n\t\t\t}\n\t\t}\n\t} );\n\t\n\tpluginApi.registerClearEvents( \"press\", ( screenData ) => {\n\t\tif( screenData !== null ) {\n\t\t\t// Clear press and click events for specific screen\n\t\t\tpressApi.clearPressEvents( screenData );\n\t\t\tpressApi.clearClickEvents( screenData );\n\t\t} else {\n\t\t\t// Clear press and click events for all screens\n\t\t\tconst allScreensData = pluginApi.getAllScreensData();\n\t\t\tfor( const sd of allScreensData ) {\n\t\t\t\tpressApi.clearPressEvents( sd );\n\t\t\t\tpressApi.clearClickEvents( sd );\n\t\t\t}\n\t\t}\n\t} );\n\t\n\t// Screen cleanup\n\tpluginApi.addScreenCleanupFunction( ( screenData ) => {\n\t\tif( screenData.mouseStarted ) {\n\t\t\tmouseApi.stopMouse( screenData );\n\t\t}\n\t\tif( screenData.touchStarted ) {\n\t\t\ttouchApi.stopTouch( screenData );\n\t\t}\n\t\tmouseApi.clearMouseEvents( screenData );\n\t\ttouchApi.clearTouchEvents( screenData );\n\t\tpressApi.clearPressEvents( screenData );\n\t\tpressApi.clearClickEvents( screenData );\n\t} );\n}\n\n\n// Auto-register in IIFE mode (when loaded via <script> tag)\nif( typeof window !== \"undefined\" && window.pi ) {\n\twindow.pi.registerPlugin( {\n\t\t\"name\": \"pointer\",\n\t\t\"version\": \"1.0.0\",\n\t\t\"description\": \"Mouse and touch input handling for Pi.js\",\n\t\t\"init\": pointerPlugin\n\t} );\n}\n\n\n"],
  "mappings": "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",
  "names": ["createEventHelpers", "pluginApi", "utils", "onevent", "mode", "fn", "once", "hitBox", "modes", "name", "listenerArr", "extraId", "extraData", "customData", "modeFound", "i", "error", "originalFn", "newMode", "wrappedFn", "data", "offevent", "isClear", "triggerEventListeners", "clickStatus", "temp", "listener", "isHit", "newData", "j", "pos", "m_startTouchInternal", "startTouchInternal", "screenData", "registerTouch", "pluginApi", "helpers", "m_onevent", "m_offevent", "m_triggerEventListeners", "initTouchData", "onWindowBlurTouch", "startTouch", "stopTouch", "intouch", "ontouch", "offtouch", "setPinchZoom", "options", "touchStart", "touchMove", "touchEnd", "getTouch", "mode", "fn", "once", "hitBox", "customData", "e", "getScreenDataFromEvent", "updateTouch", "touchData", "triggerPressListeners", "getTouchPress", "triggerClickListeners", "action", "newTouches", "rect", "j", "touch", "touchArr", "i", "screenId", "allScreensData", "clearTouchEvents", "registerPress", "pluginApi", "helpers", "onevent", "offevent", "m_triggerEventListeners", "initPressData", "inpress", "onpress", "offpress", "onclick", "offclick", "screenData", "startMouseInternal", "startTouchInternal", "getTouchPress", "options", "mode", "fn", "once", "hitBox", "customData", "clearPressEvents", "clearClickEvents", "triggerPressListeners", "data", "triggerClickListeners", "clickStatus", "copyTouches", "touches", "touchArr", "action", "i", "touch", "touchData", "m_startMouseInternal", "startMouseInternal", "screenData", "registerMouse", "pluginApi", "helpers", "m_onevent", "m_offevent", "m_triggerEventListeners", "initMouseData", "onWindowBlurMouse", "startMouse", "stopMouse", "inmouse", "setEnableContextMenu", "onmouse", "offmouse", "mouseMove", "mouseDown", "mouseUp", "onContextMenu", "getMouse", "mouse", "options", "mode", "fn", "once", "hitBox", "customData", "clearMouseEvents", "e", "getScreenDataFromEvent", "updateMouse", "mouseData", "triggerPressListeners", "triggerClickListeners", "action", "rect", "x", "lastX", "lastY", "screenId", "allScreensData", "pointerPlugin", "pluginApi", "helpers", "createEventHelpers", "mouseApi", "registerMouse", "touchApi", "registerTouch", "pressApi", "registerPress", "screenData", "allScreensData", "sd"]
}
