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 4: | Line 4: | ||
const menu = document.createElement("div"); | const menu = document.createElement("div"); | ||
menu.id = "mahitoMenu"; | menu.id = "mahitoMenu"; | ||
menu.style | Object.assign(menu.style, { | ||
position: "fixed", | |||
top: "20px", | |||
right: "20px", | |||
padding: "10px", | |||
backgroundColor: "#111", | |||
color: "#fff", | |||
border: "2px solid #666", | |||
zIndex: "9999", | |||
fontFamily: "monospace", | |||
borderRadius: "10px", | |||
boxShadow: "0 0 10px rgba(0,0,0,0.5)", | |||
userSelect: "none", | |||
touchAction: "none", | |||
transition: "transform 0.3s ease, opacity 0.3s ease" | |||
}); | |||
// Header | // Header | ||
const header = document.createElement("div"); | const header = document.createElement("div"); | ||
header.style | Object.assign(header.style, { | ||
cursor: "grab", | |||
display: "flex", | |||
justifyContent: "space-between", | |||
alignItems: "center", | |||
marginBottom: "8px" | |||
}); | |||
const title = document.createElement("div"); | const title = document.createElement("div"); | ||
Line 34: | Line 38: | ||
const minimizeBtn = document.createElement("button"); | const minimizeBtn = document.createElement("button"); | ||
minimizeBtn.textContent = "➖"; | minimizeBtn.textContent = "➖"; | ||
minimizeBtn.style | Object.assign(minimizeBtn.style, { | ||
background: "#333", | |||
color: "#fff", | |||
border: "none", | |||
cursor: "pointer", | |||
marginLeft: "10px" | |||
}); | |||
header.appendChild(minimizeBtn); | header.appendChild(minimizeBtn); | ||
menu.appendChild(header); | menu.appendChild(header); | ||
Line 44: | Line 50: | ||
// Content | // Content | ||
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"; | ||
openBtn.style | Object.assign(openBtn.style, { | ||
background: "#444", | |||
color: "#fff", | |||
border: "none", | |||
padding: "5px 10px", | |||
cursor: "pointer" | |||
}); | |||
openBtn.onclick = function () { | openBtn.onclick = function () { | ||
console.log("Open Explanation clicked"); | console.log("Open Explanation clicked"); | ||
Line 59: | Line 66: | ||
document.body.appendChild(menu); | document.body.appendChild(menu); | ||
// Minimized | // Minimized icon | ||
const minimizedIcon = document.createElement("img"); | const minimizedIcon = document.createElement("img"); | ||
minimizedIcon.src = minimizedImgURL; | minimizedIcon.src = minimizedImgURL; | ||
minimizedIcon.style | Object.assign(minimizedIcon.style, { | ||
position: "fixed", | |||
top: "20px", | |||
right: "20px", | |||
width: "30px", | |||
height: "30px", | |||
borderRadius: "5px", | |||
cursor: "pointer", | |||
display: "none", | |||
opacity: "0", | |||
zIndex: "9999", | |||
transition: "opacity 0.3s ease" | |||
}); | |||
document.body.appendChild(minimizedIcon); | document.body.appendChild(minimizedIcon); | ||
// Minimize logic | // Minimize logic | ||
minimizeBtn.onclick = function () { | minimizeBtn.onclick = function () { | ||
menu.style.display = "none"; | menu.style.transform = "scale(0.5)"; | ||
menu.style.opacity = "0"; | |||
setTimeout(() => { | |||
menu.style.display = "none"; | |||
menu.style.transform = "scale(1)"; | |||
menu.style.opacity = "1"; | |||
minimizedIcon.style.display = "block"; | |||
requestAnimationFrame(() => { | |||
minimizedIcon.style.opacity = "1"; | |||
}); | |||
}, 300); | |||
}; | }; | ||
// Restore logic | // Restore logic | ||
minimizedIcon.onclick = function () { | minimizedIcon.onclick = function () { | ||
minimizedIcon.style.opacity = "0"; | |||
minimizedIcon.style.display = "none"; | setTimeout(() => { | ||
minimizedIcon.style.display = "none"; | |||
menu.style.display = "block"; | |||
}, 300); | |||
}; | }; | ||
// | // Drag support (mouse + touch) | ||
let isDragging = false | let isDragging = false; | ||
let offsetX = 0; | |||
let offsetY = 0; | |||
function startDrag(x, y) { | function startDrag(x, y) { | ||
Line 110: | Line 133: | ||
// Mouse events | // Mouse events | ||
header.addEventListener("mousedown", e | header.addEventListener("mousedown", function (e) { | ||
startDrag(e.clientX, e.clientY); | startDrag(e.clientX, e.clientY); | ||
e.preventDefault(); | e.preventDefault(); | ||
}); | }); | ||
document.addEventListener("mousemove", e | document.addEventListener("mousemove", function (e) { | ||
doDrag(e.clientX, e.clientY); | |||
}); | |||
document.addEventListener("mouseup", stopDrag); | document.addEventListener("mouseup", stopDrag); | ||
// Touch events | // Touch events | ||
header.addEventListener("touchstart", e | header.addEventListener("touchstart", function (e) { | ||
const touch = e.touches[0]; | const touch = e.touches[0]; | ||
startDrag(touch.clientX, touch.clientY); | startDrag(touch.clientX, touch.clientY); | ||
e.preventDefault(); | e.preventDefault(); | ||
}); | }); | ||
document.addEventListener("touchmove", e | document.addEventListener("touchmove", function (e) { | ||
if (!isDragging) return; | if (!isDragging) return; | ||
const touch = e.touches[0]; | const touch = e.touches[0]; |