commit 06fb22a38387f079b9b3bbfacfec4574a8a0ddeb Author: DylanBanta Date: Mon May 26 22:52:09 2025 -0400 Basic modal for user scripts diff --git a/dice-modal.js b/dice-modal.js new file mode 100644 index 0000000..a52c645 --- /dev/null +++ b/dice-modal.js @@ -0,0 +1,161 @@ +(function(global){ + 'use strict'; + + // make the modal draggable by its header + function makeDraggable(modal, header){ + let dragging = false, startX, startY, origX, origY; + + header.addEventListener('mousedown', function(e){ + dragging = true; + startX = e.clientX; + startY = e.clientY; + const rect = modal.getBoundingClientRect(); + origX = rect.left; + origY = rect.top; + e.preventDefault(); + }); + + document.addEventListener('mousemove', function(e){ + if(!dragging) return; + modal.style.left = origX + (e.clientX - startX) + 'px'; + modal.style.top = origY + (e.clientY - startY) + 'px'; + }); + + document.addEventListener('mouseup', function(){ + dragging = false; + }); + } + + // create the styled modal with inputs, code area, and output box + function createModal(){ + const modal = document.createElement('div'); + Object.assign(modal.style, { + position: 'fixed', + top: '75px', + left: '65px', + width: '620px', + backgroundColor:'#333', + color: '#fff', + padding: '10px', + borderRadius: '8px', + zIndex: '10000', + userSelect: 'none' + }); + + // header bar + const header = document.createElement('div'); + header.innerHTML = 'Dice Tracker'; + Object.assign(header.style, { + cursor: 'move', + paddingBottom: '10px', + borderBottom: '1px solid #555' + }); + modal.appendChild(header); + + // inputs container + const form = document.createElement('div'); + form.style.display = 'flex'; + form.style.gap = '10px'; + form.style.marginTop = '10px'; + + function labeledInput(labelText, id){ + const wrapper = document.createElement('div'); + wrapper.style.width = '45%'; + wrapper.style.marginBottom = '10px'; + + const label = document.createElement('label'); + label.textContent = labelText; + label.style.display = 'block'; + label.style.marginBottom = '5px'; + wrapper.appendChild(label); + + const input = document.createElement('input'); + input.type = 'text'; + input.id = id; + Object.assign(input.style, { + width: '100%', + backgroundColor: '#222', + color: '#fff', + border: '1px solid #555', + padding: '5px' + }); + wrapper.appendChild(input); + return wrapper; + } + + form.appendChild(labeledInput('Base Bet', 'baseBet')); + form.appendChild(labeledInput('Base Multiplier', 'baseMultiplier')); + modal.appendChild(form); + + // run/stop button + const runBtn = document.createElement('button'); + runBtn.id = 'run-button'; + runBtn.textContent = 'Run'; + Object.assign(runBtn.style, { + width: '100%', + marginTop: '10px', + padding: '10px', + backgroundColor: '#444', + color: '#fff', + border: '1px solid #555', + cursor: 'pointer' + }); + modal.appendChild(runBtn); + + // code textarea + const codeArea = document.createElement('textarea'); + codeArea.id = 'codeArea'; + codeArea.placeholder = '// your code here\n// use settings.baseBet & settings.baseMultiplier'; + Object.assign(codeArea.style, { + width: '600px', + height: '225px', + marginTop: '10px', + backgroundColor: '#222', + color: '#fff', + border: '1px solid #555', + padding: '10px' + }); + modal.appendChild(codeArea); + + // output box + const outputBox = document.createElement('div'); + outputBox.id = 'output-box'; + Object.assign(outputBox.style, { + width: '100%', + height: '150px', + overflowY: 'auto', + marginTop: '10px', + backgroundColor: '#222', + color: '#fff', + border: '1px solid #555', + padding: '10px' + }); + modal.appendChild(outputBox); + + document.body.appendChild(modal); + makeDraggable(modal, header); + } + + // write a line to the output box + function output(msg){ + const box = document.getElementById('output-box'); + if(!box) return; + const div = document.createElement('div'); + div.textContent = msg; + box.appendChild(div); + box.scrollTop = box.scrollHeight; + } + + // clear all lines from the output box + function clearOutput(){ + const box = document.getElementById('output-box'); + if(!box) return; + box.innerHTML = ''; + } + + // expose to global scope for the main script to use + global.createModal = createModal; + global.output = output; + global.clearOutput = clearOutput; + +})(window);