Basic modal for user scripts

This commit is contained in:
DylanBanta 2025-05-26 22:52:09 -04:00
commit 06fb22a383

161
dice-modal.js Normal file
View File

@ -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 = '<strong>Dice Tracker</strong>';
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);