User:Stumblean/common.js: Difference between revisions
No edit summary Tags: Mobile edit Mobile web edit Advanced mobile edit |
No edit summary Tags: Mobile edit Mobile web edit Advanced mobile edit |
||
Line 1: | Line 1: | ||
(function() { | (function() { | ||
const menu = document.createElement("div"); | const menu = document.createElement("div"); | ||
menu.id = "mahitoMenu"; | menu.id = "mahitoMenu"; | ||
Line 15: | Line 14: | ||
menu.style.boxShadow = "0 0 10px rgba(0,0,0,0.5)"; | menu.style.boxShadow = "0 0 10px rgba(0,0,0,0.5)"; | ||
menu.style.userSelect = "none"; | menu.style.userSelect = "none"; | ||
menu.style.touchAction = "none"; // prevents weird scrolling glitches | |||
// | // Header for dragging and minimizing | ||
const header = document.createElement("div"); | const header = document.createElement("div"); | ||
header.style.cursor = " | header.style.cursor = "grab"; | ||
header.style.display = "flex"; | header.style.display = "flex"; | ||
header.style.justifyContent = "space-between"; | header.style.justifyContent = "space-between"; | ||
Line 24: | Line 24: | ||
header.style.marginBottom = "8px"; | header.style.marginBottom = "8px"; | ||
const title = document.createElement("div"); | const title = document.createElement("div"); | ||
title.textContent = "💀 Mahito Menu 💀"; | title.textContent = "💀 Mahito Menu 💀"; | ||
Line 30: | Line 29: | ||
header.appendChild(title); | header.appendChild(title); | ||
const minimizeBtn = document.createElement("button"); | const minimizeBtn = document.createElement("button"); | ||
minimizeBtn.textContent = "➖"; | minimizeBtn.textContent = "➖"; | ||
Line 44: | Line 42: | ||
menu.appendChild(header); | menu.appendChild(header); | ||
const content = document.createElement("div"); | const content = document.createElement("div"); | ||
const openBtn = document.createElement("button"); | const openBtn = document.createElement("button"); | ||
openBtn.textContent = "Open Explanation"; | openBtn.textContent = "Open Explanation"; | ||
Line 63: | Line 59: | ||
document.body.appendChild(menu); | document.body.appendChild(menu); | ||
// | // Dragging support for mouse + touch | ||
let isDragging = false, offsetX = 0, offsetY = 0; | let isDragging = false, offsetX = 0, offsetY = 0; | ||
function startDrag(x, y) { | |||
isDragging = true; | isDragging = true; | ||
offsetX = | const rect = menu.getBoundingClientRect(); | ||
offsetY = | offsetX = x - rect.left; | ||
offsetY = y - rect.top; | |||
} | menu.style.right = "auto"; | ||
} | |||
function doDrag(x, y) { | |||
if (isDragging) { | if (isDragging) { | ||
menu.style.left = ( | menu.style.left = (x - offsetX) + "px"; | ||
menu.style.top = ( | menu.style.top = (y - offsetY) + "px"; | ||
} | } | ||
} | |||
function stopDrag() { | |||
isDragging = false; | |||
} | |||
// Mouse events | |||
header.addEventListener("mousedown", e => { | |||
startDrag(e.clientX, e.clientY); | |||
e.preventDefault(); | |||
}); | }); | ||
document.addEventListener("mousemove", e => doDrag(e.clientX, e.clientY)); | |||
document.addEventListener("mouseup", stopDrag); | |||
// Touch events (for mobile) | |||
isDragging = | header.addEventListener("touchstart", e => { | ||
const touch = e.touches[0]; | |||
startDrag(touch.clientX, touch.clientY); | |||
e.preventDefault(); | |||
}); | |||
document.addEventListener("touchmove", e => { | |||
if (!isDragging) return; | |||
const touch = e.touches[0]; | |||
doDrag(touch.clientX, touch.clientY); | |||
}); | }); | ||
document.addEventListener("touchend", stopDrag); | |||
})(); | })(); |