Tags: Mobile edit Mobile web edit Advanced mobile edit |
Tags: Reverted Mobile edit Mobile web edit Advanced mobile edit |
Line 22: |
Line 22: |
| }; | | }; |
|
| |
|
| const settings = JSON.parse(localStorage.getItem("mahitoMenuSettings")) || defaultSettings; | | let settings = JSON.parse(localStorage.getItem("mahitoMenuSettings")) || defaultSettings; |
| const prefs = JSON.parse(localStorage.getItem("mahitoMenuPrefs")) || defaultPrefs; | | let prefs = JSON.parse(localStorage.getItem("mahitoMenuPrefs")) || defaultPrefs; |
|
| |
|
| function saveSettings() { | | function saveSettings() { |
Line 32: |
Line 32: |
| } | | } |
|
| |
|
| const menu = document.createElement("div"); | | // ... (rest of your menu creation code here, unchanged) |
| menu.id = "mahitoMenu";
| |
| Object.assign(menu.style, {
| |
| position: "fixed",
| |
| top: "20px",
| |
| right: "20px",
| |
| background: settings.backgroundColor,
| |
| color: settings.textColor,
| |
| border: `2px solid ${settings.borderColor}`,
| |
| borderRadius: "10px",
| |
| padding: "10px",
| |
| fontFamily: "monospace",
| |
| zIndex: "99999",
| |
| boxShadow: "0 0 10px black",
| |
| width: "200px",
| |
| userSelect: "none"
| |
| });
| |
| | |
| function makeDraggable(el) {
| |
| let offsetX = 0, offsetY = 0, isDragging = false;
| |
| | |
| el.addEventListener("mousedown", startDrag);
| |
| el.addEventListener("touchstart", startDrag);
| |
| | |
| function startDrag(e) {
| |
| isDragging = true;
| |
| const evt = e.type.startsWith("touch") ? e.touches[0] : e;
| |
| offsetX = evt.clientX - el.offsetLeft;
| |
| offsetY = evt.clientY - el.offsetTop;
| |
| | |
| document.addEventListener("mousemove", onDrag);
| |
| document.addEventListener("mouseup", stopDrag);
| |
| document.addEventListener("touchmove", onDrag);
| |
| document.addEventListener("touchend", stopDrag);
| |
| }
| |
| | |
| function onDrag(e) {
| |
| if (!isDragging) return;
| |
| const evt = e.type.startsWith("touch") ? e.touches[0] : e;
| |
| el.style.left = evt.clientX - offsetX + "px";
| |
| el.style.top = evt.clientY - offsetY + "px";
| |
| el.style.right = "auto";
| |
| }
| |
| | |
| function stopDrag() {
| |
| isDragging = false;
| |
| document.removeEventListener("mousemove", onDrag);
| |
| document.removeEventListener("mouseup", stopDrag);
| |
| document.removeEventListener("touchmove", onDrag);
| |
| document.removeEventListener("touchend", stopDrag);
| |
| }
| |
| }
| |
| | |
| makeDraggable(menu);
| |
| | |
| const header = document.createElement("div");
| |
| header.style.display = "flex";
| |
| header.style.justifyContent = "space-between";
| |
| header.style.alignItems = "center";
| |
| header.style.marginBottom = "8px";
| |
| | |
| const titleWrap = document.createElement("div");
| |
| titleWrap.style.display = "flex";
| |
| titleWrap.style.alignItems = "center";
| |
| titleWrap.style.gap = "6px";
| |
| | |
| const leftIcon = document.createElement("img");
| |
| leftIcon.src = settings.iconURL;
| |
| leftIcon.width = settings.iconSize;
| |
| leftIcon.height = settings.iconSize;
| |
| | |
| const title = document.createElement("div");
| |
| title.textContent = settings.menuTitle;
| |
| title.style.fontWeight = "bold";
| |
| title.style.color = settings.textColor;
| |
| | |
| const rightIcon = document.createElement("img");
| |
| rightIcon.src = settings.iconURL;
| |
| rightIcon.width = settings.iconSize;
| |
| rightIcon.height = settings.iconSize;
| |
| | |
| titleWrap.appendChild(leftIcon);
| |
| titleWrap.appendChild(title);
| |
| titleWrap.appendChild(rightIcon);
| |
|
| |
|
| const minimizeBtn = document.createElement("button"); | | // -- Snippet for Preferences Panel -- |
| minimizeBtn.textContent = "–";
| |
| Object.assign(minimizeBtn.style, {
| |
| background: settings.buttonColor,
| |
| border: "none",
| |
| color: settings.textColor,
| |
| cursor: "pointer",
| |
| borderRadius: "5px",
| |
| width: "25px",
| |
| height: "25px"
| |
| });
| |
| | |
| header.appendChild(titleWrap);
| |
| header.appendChild(minimizeBtn);
| |
| | |
| const minimizedIcon = document.createElement("img");
| |
| minimizedIcon.src = settings.iconURL;
| |
| Object.assign(minimizedIcon.style, {
| |
| position: "fixed",
| |
| top: "20px",
| |
| right: "20px",
| |
| zIndex: "99999",
| |
| display: "none",
| |
| cursor: "pointer",
| |
| borderRadius: "8px", // rounded square
| |
| width: settings.minimizedSize + "px",
| |
| height: settings.minimizedSize + "px"
| |
| });
| |
| | |
| minimizedIcon.addEventListener("click", () => {
| |
| minimizedIcon.style.display = "none";
| |
| menu.style.display = "block";
| |
| });
| |
| | |
| minimizeBtn.addEventListener("click", () => {
| |
| menu.style.display = "none";
| |
| minimizedIcon.style.display = "block";
| |
| });
| |
| | |
| makeDraggable(minimizedIcon);
| |
| | |
| function makeButton(text, action) {
| |
| const btn = document.createElement("button");
| |
| btn.textContent = text;
| |
| btn.onclick = action;
| |
| Object.assign(btn.style, {
| |
| marginBottom: "6px",
| |
| width: "100%",
| |
| cursor: "pointer",
| |
| background: settings.buttonColor,
| |
| color: settings.textColor,
| |
| border: "none",
| |
| padding: "5px 10px",
| |
| borderRadius: "5px"
| |
| });
| |
| return btn;
| |
| }
| |
| | |
| const btnMassUndo = makeButton("Mass undo", () => {
| |
| navigator.clipboard.writeText(
| |
| "mw.loader.load('//en.wikipedia.org/w/index.php?title=User:Alexis_Jazz/Kill-It-With-Fire.js&action=raw&ctype=text/javascript');"
| |
| );
| |
| alert("Go to your common.js and paste what was just copied!");
| |
| });
| |
| | |
| const btnExplain = makeButton("Open Explanation", () => {
| |
| window.open("https://hpd0v2.mimo.run/index.html", "_blank");
| |
| });
| |
| | |
| const btnEncouragement = makeButton("Encouragement", () => {
| |
| ytContainer.style.display = ytContainer.style.display === "none" ? "block" : "none";
| |
| });
| |
| | |
| const btnYujify = makeButton("YUJIFY", () => {
| |
| const confirmKill = confirm("Are you sure you want to YUJIFY this menu? This will kill the script.");
| |
| if (!confirmKill) return;
| |
| | |
| console.log("I'll admit it, mahito, I am you. (script killed)");
| |
| menu.remove();
| |
| minimizedIcon.remove();
| |
| ytContainer.remove();
| |
| prefsPanel.remove();
| |
| watermark.remove();
| |
| });
| |
| | |
| const btnCustomize = makeButton("Customize Menu", () => {
| |
| const newTitle = prompt("New menu title:", settings.menuTitle);
| |
| const newIcon = prompt("New icon URL:", settings.iconURL);
| |
| const newBg = prompt("Background color (hex):", settings.backgroundColor);
| |
| const newBtn = prompt("Button color (hex):", settings.buttonColor);
| |
| const newTxt = prompt("Text color (hex):", settings.textColor);
| |
| const newBorder = prompt("Border color (hex):", settings.borderColor);
| |
| | |
| if (newTitle) settings.menuTitle = newTitle;
| |
| if (newIcon) settings.iconURL = newIcon;
| |
| if (newBg) settings.backgroundColor = newBg;
| |
| if (newBtn) settings.buttonColor = newBtn;
| |
| if (newTxt) settings.textColor = newTxt;
| |
| if (newBorder) settings.borderColor = newBorder;
| |
| | |
| saveSettings();
| |
| alert("Changes saved! Refresh to apply.");
| |
| });
| |
| | |
| const btnReset = makeButton("Undo Changes", () => {
| |
| const confirmReset = confirm("Are you sure you want to undo all customizations?");
| |
| if (!confirmReset) return;
| |
| | |
| localStorage.removeItem("mahitoMenuSettings");
| |
| alert("Customizations reset! Reloading...");
| |
| location.reload();
| |
| });
| |
| | |
| // Preferences Button (always visible)
| |
| const btnPreferences = makeButton("Preferences", () => {
| |
| if (prefsPanel.style.display === "block") {
| |
| prefsPanel.style.display = "none";
| |
| } else {
| |
| prefsPanel.style.display = "block";
| |
| }
| |
| });
| |
| | |
| // Preferences Panel
| |
| const prefsPanel = document.createElement("div"); | | const prefsPanel = document.createElement("div"); |
| Object.assign(prefsPanel.style, { | | Object.assign(prefsPanel.style, { |
Line 282: |
Line 77: |
| prefsPanel.appendChild(createCheckbox("Show Watermark Footer", "showWatermark")); | | prefsPanel.appendChild(createCheckbox("Show Watermark Footer", "showWatermark")); |
|
| |
|
| function applyPreferences() { | | // Add Reset Preferences Button |
| btnMassUndo.style.display = prefs.showMassUndo ? "block" : "none";
| | const resetPrefsBtn = document.createElement("button"); |
| btnExplain.style.display = prefs.showExplanation ? "block" : "none";
| | resetPrefsBtn.textContent = "Reset Preferences"; |
| btnEncouragement.style.display = prefs.showEncouragement ? "block" : "none";
| | Object.assign(resetPrefsBtn.style, { |
| btnYujify.style.display = prefs.showYujify ? "block" : "none";
| | background: "#cc4444", |
| btnCustomize.style.display = prefs.showCustomize ? "block" : "none";
| | color: "#fff", |
| btnReset.style.display = prefs.showUndoChanges ? "block" : "none";
| | border: "none", |
| // Always show preferences button, ignore pref so you can never hide it for real
| | borderRadius: "5px", |
| btnPreferences.style.display = "block";
| | padding: "6px 10px", |
| watermark.style.display = prefs.showWatermark ? "block" : "none";
| | marginTop: "10px", |
| } | | cursor: "pointer", |
| | | width: "100%" |
| // Create YouTube encouragement container
| |
| const ytContainer = document.createElement("div");
| |
| Object.assign(ytContainer.style, { | |
| position: "fixed", | |
| right: "20px", | |
| top: "150px", | |
| zIndex: "99998", | |
| display: "none", | |
| background: "#000", | |
| padding: "5px", | |
| borderRadius: "10px", | |
| boxShadow: "0 0 10px black"
| |
| }); | | }); |
| | resetPrefsBtn.addEventListener("click", () => { |
| | if (confirm("Are you sure you want to reset all preferences to default?")) { |
| | prefs = {...defaultPrefs}; // reset to default |
| | savePrefs(); |
| | applyPreferences(); |
|
| |
|
| const ytIframe = document.createElement("iframe");
| | // Update all checkboxes to reflect defaults |
| ytIframe.width = "280";
| | [...prefsPanel.querySelectorAll("input[type=checkbox]")].forEach(input => { |
| ytIframe.height = "157";
| | input.checked = prefs[input.parentNode.textContent.trim().toLowerCase().includes("mass undo") ? "showMassUndo" : |
| ytIframe.src = "https://www.youtube.com/embed/VKfyq_hOL0c?autoplay=1";
| | input.parentNode.textContent.trim().toLowerCase().includes("explanation") ? "showExplanation" : |
| ytIframe.title = "Self Embodiment of Perfection OST";
| | input.parentNode.textContent.trim().toLowerCase().includes("encouragement") ? "showEncouragement" : |
| ytIframe.frameBorder = "0";
| | input.parentNode.textContent.trim().toLowerCase().includes("yujify") ? "showYujify" : |
| ytIframe.allow = "accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture";
| | input.parentNode.textContent.trim().toLowerCase().includes("customize") ? "showCustomize" : |
| ytIframe.allowFullscreen = true;
| | input.parentNode.textContent.trim().toLowerCase().includes("undo changes") ? "showUndoChanges" : |
| ytContainer.appendChild(ytIframe);
| | input.parentNode.textContent.trim().toLowerCase().includes("preferences") ? "showPreferences" : |
| | | input.parentNode.textContent.trim().toLowerCase().includes("watermark") ? "showWatermark" : "" |
| // Transparent watermark footer
| | ]; |
| const watermark = document.createElement("div");
| | }); |
| watermark.textContent = "Mahito Menu. Made by Radarhump/Washweans. Do not republish, do not reskin and republish.";
| | } |
| Object.assign(watermark.style, {
| |
| position: "fixed",
| |
| bottom: "2px",
| |
| left: "5px",
| |
| fontSize: "10px",
| |
| color: "#ffffff",
| |
| opacity: "0.05",
| |
| zIndex: "9999",
| |
| pointerEvents: "none",
| |
| fontFamily: "monospace" | |
| }); | | }); |
| | prefsPanel.appendChild(resetPrefsBtn); |
|
| |
|
| // Append buttons and elements | | // ... (append prefsPanel and other elements to menu as in your full code) |
| menu.appendChild(header);
| |
| menu.appendChild(btnMassUndo);
| |
| menu.appendChild(btnExplain);
| |
| menu.appendChild(btnEncouragement);
| |
| menu.appendChild(btnYujify);
| |
| menu.appendChild(btnCustomize);
| |
| menu.appendChild(btnReset);
| |
| menu.appendChild(btnPreferences);
| |
| menu.appendChild(prefsPanel);
| |
| | |
| // Append everything to body
| |
| document.body.appendChild(menu);
| |
| document.body.appendChild(minimizedIcon);
| |
| document.body.appendChild(ytContainer);
| |
| document.body.appendChild(watermark);
| |
|
| |
|
| // Apply preferences initially | | // (rest of your applyPreferences function, menu setup, button creation, etc. stays the same) |
| applyPreferences();
| |
| })(); | | })(); |