{"version":3,"file":"state-inspector.mjs","sources":["../../src/debug/state-inspector.ts"],"sourcesContent":["import { getDebugRoot, preferences, roomDebugInfo } from \"./core.ts\";\nimport { isCoarsePointer, isCompact } from \"./layout.ts\";\nimport { applyModalLayout, createModal, createModalHeader } from \"./modal.ts\";\nimport { StateTreeView } from \"./state-tree.ts\";\n\n\n// Create and open State Inspector modal\nexport function openStateInspectorModal(uniquePanelId) {\n    var debugInfo = roomDebugInfo.get(uniquePanelId);\n    if (!debugInfo || !debugInfo.room) {\n        console.warn('Room not found for panel:', uniquePanelId);\n        return;\n    }\n\n    var room = debugInfo.room;\n\n    // Remove existing modal if present\n    var existingModal = getDebugRoot().getElementById('debug-state-inspector-modal');\n    if (existingModal) {\n        existingModal.remove();\n    }\n\n    // Load saved position and size from localStorage\n    var savedStateInspectorPrefs = null;\n    try {\n        var saved = localStorage.getItem('colyseus-state-inspector-preferences');\n        if (saved) {\n            savedStateInspectorPrefs = JSON.parse(saved);\n        }\n    } catch (e) {\n        // Ignore localStorage errors\n    }\n\n    // Default values\n    var defaultWidth = 600;\n    var defaultHeight = 500;\n    var defaultLeft = '50%';\n    var defaultTop = '50%';\n    var defaultTransform = 'translate(-50%, -50%)';\n\n    // Use saved preferences if available\n    if (savedStateInspectorPrefs) {\n        if (savedStateInspectorPrefs.width && savedStateInspectorPrefs.width >= 300) {\n            defaultWidth = savedStateInspectorPrefs.width;\n        }\n        if (savedStateInspectorPrefs.height && savedStateInspectorPrefs.height >= 200) {\n            defaultHeight = savedStateInspectorPrefs.height;\n        }\n        if (savedStateInspectorPrefs.left !== undefined && savedStateInspectorPrefs.top !== undefined) {\n            // Constrain position to window boundaries\n            var maxLeft = window.innerWidth - defaultWidth;\n            var maxTop = window.innerHeight - defaultHeight;\n\n            var constrainedLeft = Math.max(0, Math.min(savedStateInspectorPrefs.left, maxLeft));\n            var constrainedTop = Math.max(0, Math.min(savedStateInspectorPrefs.top, maxTop));\n\n            defaultLeft = constrainedLeft + 'px';\n            defaultTop = constrainedTop + 'px';\n            defaultTransform = 'none';\n        }\n    }\n\n    // Function to save state inspector preferences\n    function saveStateInspectorPreferences() {\n        try {\n            var rect = modal.getBoundingClientRect();\n            var prefs = {\n                width: rect.width,\n                height: rect.height,\n                left: rect.left,\n                top: rect.top\n            };\n            localStorage.setItem('colyseus-state-inspector-preferences', JSON.stringify(prefs));\n        } catch (e) {\n            // Ignore localStorage errors\n        }\n    }\n\n    // Status dot reference\n    var statusDotRef: any = {};\n\n    // Function to update status dot color\n    const updateStateViewerStatusDot = () => {\n        if (statusDotRef.element) {\n            statusDotRef.element.style.backgroundColor = room.connection?.isOpen ? '#22c55e' : '#ef4444';\n        }\n    };\n\n    // Register the onLeave callback\n    room.onLeave(updateStateViewerStatusDot);\n\n    // Create modal using shared utility with automatic onLeave tracking\n    const modalOpts = {\n        id: 'debug-state-inspector-modal',\n        width: defaultWidth + 'px',\n        height: defaultHeight + 'px',\n        minWidth: '300px',\n        minHeight: '200px',\n        maxWidth: '90vw',\n        maxHeight: '90vh',\n        top: defaultTop,\n        left: defaultLeft,\n        transform: defaultTransform,\n        room: room,\n        trackOnLeave: true,\n        onLeaveCallback: updateStateViewerStatusDot\n    };\n    const modal = createModal(modalOpts);\n\n    // Create header using shared utility\n    const headerComponents = createModalHeader({\n        title: `${debugInfo.roomName} - State Viewer`,\n        modal: modal,\n        statusDot: true,\n        statusColor: room.connection?.isOpen ? '#22c55e' : '#ef4444',\n        statusDotRef: statusDotRef\n    });\n    const header = headerComponents.header;\n    const closeButton = headerComponents.closeButton;\n\n    modal.appendChild(header);\n\n    // Update status dot initially\n    updateStateViewerStatusDot();\n\n    // State content container\n    var contentContainer = document.createElement('div');\n    contentContainer.style.padding = '8px';\n    contentContainer.style.overflowY = 'auto';\n    contentContainer.style.flex = '1';\n    contentContainer.style.minHeight = '0';\n    contentContainer.style.backgroundColor = '#1e1e1e';\n    contentContainer.id = 'debug-state-content';\n\n    // Render the state tree and keep it in sync. StateTreeView patches primitive\n    // value changes in place (preserving clicks, selection, scroll and focus) and\n    // falls back to a throttled full re-render for structural changes.\n    var stateView = new StateTreeView(contentContainer, function() { return room.state || {}; });\n    stateView.render();\n\n    // Feed decoder changes into the view. Restored on close (see modal.remove below).\n    const originalTriggerChanges = room.serializer.decoder.triggerChanges;\n    room.serializer.decoder.triggerChanges = function(changes) {\n        originalTriggerChanges?.apply(this, arguments);\n        stateView.applyChanges(changes);\n    };\n\n    modal.appendChild(contentContainer);\n    getDebugRoot().appendChild(modal);\n\n    // Drag and resize state variables\n    var isDragging = false;\n    var dragStartX = 0;\n    var dragStartY = 0;\n    var modalStartX = 0;\n    var modalStartY = 0;\n    var isResizing = false;\n    var resizeHandle = null;\n    var resizeStartX = 0;\n    var resizeStartY = 0;\n    var resizeStartWidth = 0;\n    var resizeStartHeight = 0;\n    var resizeStartLeft = 0;\n    var resizeStartTop = 0;\n\n    // Pointer Events so drag and resize work under touch as well as a mouse.\n    // setPointerCapture keeps the stream flowing to the grabbed element; the events\n    // still bubble on to the document listeners below, which own the shared math.\n    header.setAttribute('data-drag', ''); // touch-action:none\n    header.addEventListener('pointerdown', function(e: PointerEvent) {\n        if (isCompact()) { return; } // full-screen sheet: nothing to drag\n        const target = e.target as HTMLElement;\n        // Don't drag if clicking on a resize handle\n        if (target.classList && target.classList.contains('resize-handle')) {\n            return;\n        }\n        if (target === closeButton || closeButton.contains(target)) {\n            return; // Don't drag when clicking close button\n        }\n        isDragging = true;\n        dragStartX = e.clientX;\n        dragStartY = e.clientY;\n        var rect = modal.getBoundingClientRect();\n        modalStartX = rect.left;\n        modalStartY = rect.top;\n        modal.style.cursor = 'move';\n        header.setPointerCapture(e.pointerId);\n        e.preventDefault();\n    });\n\n    var handleMouseMove = function(e) {\n        if (isResizing && resizeHandle) {\n            // Handle resize\n            var deltaX = e.clientX - resizeStartX;\n            var deltaY = e.clientY - resizeStartY;\n            var newWidth = resizeStartWidth;\n            var newHeight = resizeStartHeight;\n            var newLeft = resizeStartLeft;\n            var newTop = resizeStartTop;\n\n            if (resizeHandle.includes('e')) {\n                newWidth = resizeStartWidth + deltaX;\n            }\n            if (resizeHandle.includes('w')) {\n                newWidth = resizeStartWidth - deltaX;\n                newLeft = resizeStartLeft + deltaX;\n            }\n            if (resizeHandle.includes('s')) {\n                newHeight = resizeStartHeight + deltaY;\n            }\n            if (resizeHandle.includes('n')) {\n                newHeight = resizeStartHeight - deltaY;\n                newTop = resizeStartTop + deltaY;\n            }\n\n            // Apply constraints\n            newWidth = Math.max(parseInt(modal.style.minWidth) || 300, Math.min(newWidth, window.innerWidth - newLeft));\n            newHeight = Math.max(parseInt(modal.style.minHeight) || 200, Math.min(newHeight, window.innerHeight - newTop));\n\n            modal.style.width = newWidth + 'px';\n            modal.style.height = newHeight + 'px';\n            modal.style.left = newLeft + 'px';\n            modal.style.top = newTop + 'px';\n            modal.style.transform = 'none';\n        } else if (isDragging) {\n            // Handle drag\n            var deltaX = e.clientX - dragStartX;\n            var deltaY = e.clientY - dragStartY;\n            var newX = modalStartX + deltaX;\n            var newY = modalStartY + deltaY;\n\n            // Constrain to viewport\n            var maxX = window.innerWidth - modal.offsetWidth;\n            var maxY = window.innerHeight - modal.offsetHeight;\n            newX = Math.max(0, Math.min(newX, maxX));\n            newY = Math.max(0, Math.min(newY, maxY));\n\n            modal.style.left = newX + 'px';\n            modal.style.top = newY + 'px';\n            modal.style.transform = 'none';\n        }\n    };\n\n    document.addEventListener('pointermove', handleMouseMove);\n\n    var handleMouseUp = function() {\n        if (isDragging) {\n            isDragging = false;\n            modal.style.cursor = '';\n            saveStateInspectorPreferences();\n        }\n        if (isResizing) {\n            isResizing = false;\n            resizeHandle = null;\n            saveStateInspectorPreferences();\n        }\n    };\n\n    document.addEventListener('pointerup', handleMouseUp);\n    document.addEventListener('pointercancel', handleMouseUp);\n\n    // Resize functionality. A finger needs a bigger grab zone, but the north edge\n    // handle sits on top of the ~32px drag header — grow it too much and there is\n    // nothing left to drag by. Corners have no such neighbour, so they grow more.\n    var resizeHandleSize = isCoarsePointer() ? 12 : 8;\n    var cornerHandleSize = isCoarsePointer() ? 20 : 12; // Larger handles for corners to make them easier to grab\n\n    // Create edge handles first, then corner handles (so corners are on top)\n    var edgeHandles = ['n', 's', 'e', 'w'];\n    var cornerHandles = ['nw', 'ne', 'sw', 'se'];\n\n    // Create edge handles (leaving space for corners)\n    edgeHandles.forEach(function(handle) {\n        var handleEl = document.createElement('div');\n        handleEl.className = 'resize-handle resize-' + handle;\n        handleEl.style.position = 'absolute';\n        handleEl.style.backgroundColor = 'transparent';\n        handleEl.style.zIndex = '10000';\n        handleEl.style.pointerEvents = 'auto';\n\n        if (handle === 'n' || handle === 's') {\n            handleEl.style.height = resizeHandleSize + 'px';\n            handleEl.style.left = cornerHandleSize + 'px';\n            handleEl.style.right = cornerHandleSize + 'px';\n            if (handle === 'n') {\n                handleEl.style.top = '0';\n                handleEl.style.cursor = 'n-resize';\n            } else {\n                handleEl.style.bottom = '0';\n                handleEl.style.cursor = 's-resize';\n            }\n        } else {\n            handleEl.style.width = resizeHandleSize + 'px';\n            handleEl.style.top = cornerHandleSize + 'px';\n            handleEl.style.bottom = cornerHandleSize + 'px';\n            if (handle === 'e') {\n                handleEl.style.right = '0';\n                handleEl.style.cursor = 'e-resize';\n            } else {\n                handleEl.style.left = '0';\n                handleEl.style.cursor = 'w-resize';\n            }\n        }\n\n        handleEl.addEventListener('pointerdown', function(e: PointerEvent) {\n            e.stopPropagation();\n            e.preventDefault();\n            isResizing = true;\n            resizeHandle = handle;\n            resizeStartX = e.clientX;\n            resizeStartY = e.clientY;\n            var rect = modal.getBoundingClientRect();\n            resizeStartWidth = rect.width;\n            resizeStartHeight = rect.height;\n            resizeStartLeft = rect.left;\n            resizeStartTop = rect.top;\n            handleEl.setPointerCapture(e.pointerId);\n        });\n\n        modal.appendChild(handleEl);\n    });\n\n    // Create corner handles (higher z-index so they're on top)\n    cornerHandles.forEach(function(handle) {\n        var handleEl = document.createElement('div');\n        handleEl.className = 'resize-handle resize-' + handle;\n        handleEl.style.position = 'absolute';\n        handleEl.style.backgroundColor = 'transparent';\n        handleEl.style.zIndex = '10002';\n        handleEl.style.pointerEvents = 'auto';\n        handleEl.style.width = cornerHandleSize + 'px';\n        handleEl.style.height = cornerHandleSize + 'px';\n\n        if (handle === 'nw') {\n            handleEl.style.top = '0';\n            handleEl.style.left = '0';\n            handleEl.style.cursor = 'nw-resize';\n        } else if (handle === 'ne') {\n            handleEl.style.top = '0';\n            handleEl.style.right = '0';\n            handleEl.style.cursor = 'ne-resize';\n        } else if (handle === 'sw') {\n            handleEl.style.bottom = '0';\n            handleEl.style.left = '0';\n            handleEl.style.cursor = 'sw-resize';\n        } else if (handle === 'se') {\n            handleEl.style.bottom = '0';\n            handleEl.style.right = '0';\n            handleEl.style.cursor = 'se-resize';\n        }\n\n        handleEl.addEventListener('pointerdown', function(e: PointerEvent) {\n            e.stopPropagation();\n            e.preventDefault();\n            isResizing = true;\n            resizeHandle = handle;\n            resizeStartX = e.clientX;\n            resizeStartY = e.clientY;\n            var rect = modal.getBoundingClientRect();\n            resizeStartWidth = rect.width;\n            resizeStartHeight = rect.height;\n            resizeStartLeft = rect.left;\n            resizeStartTop = rect.top;\n            handleEl.setPointerCapture(e.pointerId);\n        });\n\n        modal.appendChild(handleEl);\n    });\n\n    // createModal ran before the handles existed, so it couldn't hide them.\n    applyModalLayout(modal, modalOpts);\n\n\n    // Remove state change listener when modal is closed\n    var originalRemove = modal.remove;\n    modal.remove = function() {\n        // Restore original trigger changes (stops all change processing) and\n        // detach the view's document-level listeners.\n        room.serializer.decoder.triggerChanges = originalTriggerChanges;\n        stateView.dispose();\n        document.removeEventListener('pointermove', handleMouseMove);\n        document.removeEventListener('pointerup', handleMouseUp);\n        document.removeEventListener('pointercancel', handleMouseUp);\n        originalRemove.call(this);\n    };\n}\n"],"names":[],"mappings":"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"}