// ==UserScript==
// @name Mobile WebTool
// @namespace howardzhangdqs
// @version 1.0.0
// @author HowardZhangdqs
// @description 手机网页工具:全屏切换、页面缩放
// @license WTFPL
// @icon https://vitejs.dev/logo.svg
// @match *://*/*
// @run-at document-idle
// @downloadURL https://update.greasyfork.icu/scripts/570519/Mobile%20WebTool.user.js
// @updateURL https://update.greasyfork.icu/scripts/570519/Mobile%20WebTool.meta.js
// ==/UserScript==
(function () {
'use strict';
const styles = ":host{all:initial;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}.mwt-container{position:fixed;top:8px;left:8px;z-index:2147483647;user-select:none;-webkit-user-select:none;transition:opacity .3s}.mwt-btn{width:38px;height:38px;border-radius:10px;border:none;background:#0000008c;color:#fff;display:flex;align-items:center;justify-content:center;cursor:pointer;box-shadow:0 2px 8px #0000004d;transition:background .2s,transform .15s;-webkit-tap-highlight-color:transparent;padding:0;line-height:1}.mwt-btn svg{width:20px;height:20px}.mwt-btn:active{background:#000000bf;transform:scale(.92)}.mwt-menu{margin-top:6px;background:#1e1e1eeb;backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);border-radius:10px;padding:4px 0;min-width:120px;box-shadow:0 4px 16px #0006;overflow:hidden;opacity:0;transform:translateY(-8px) scale(.95);transition:opacity .2s,transform .2s;pointer-events:none}.mwt-menu.mwt-open{opacity:1;transform:translateY(0) scale(1);pointer-events:auto}.mwt-zoom-display{padding:6px 14px;text-align:center;font-size:12px;color:#ffffff80;border-bottom:1px solid rgba(255,255,255,.08);font-variant-numeric:tabular-nums}.mwt-menu-item{display:flex;align-items:center;gap:8px;width:100%;padding:9px 14px;border:none;background:none;color:#fff;font-size:14px;cursor:pointer;text-align:left;transition:background .15s;-webkit-tap-highlight-color:transparent;font-family:inherit}.mwt-menu-item:active{background:#ffffff1a}.mwt-menu-item+.mwt-menu-item{border-top:1px solid rgba(255,255,255,.06)}.mwt-menu-icon{width:18px;height:18px;flex-shrink:0;display:flex;align-items:center;justify-content:center}.mwt-menu-icon svg{width:100%;height:100%}";
const svgTool = '';
const svgFullscreen = '';
const svgZoomIn = '';
const svgZoomOut = '';
const svgReset = '';
const ZOOM_STEP = 10;
const ZOOM_MIN = 30;
const ZOOM_MAX = 200;
const AUTO_HIDE_MS = 1e4;
(() => {
let currentZoom = 100;
let menuOpen = false;
let hideTimer;
const host = document.createElement("div");
host.id = "mwt-root";
document.body.appendChild(host);
const shadow = host.attachShadow({ mode: "closed" });
const styleEl = document.createElement("style");
styleEl.textContent = styles;
shadow.appendChild(styleEl);
const container = document.createElement("div");
container.className = "mwt-container";
shadow.appendChild(container);
const btn = document.createElement("button");
btn.className = "mwt-btn";
btn.innerHTML = svgTool;
container.appendChild(btn);
const menu = document.createElement("div");
menu.className = "mwt-menu";
container.appendChild(menu);
const zoomDisplay = document.createElement("div");
zoomDisplay.className = "mwt-zoom-display";
zoomDisplay.textContent = `${currentZoom}%`;
menu.appendChild(zoomDisplay);
function createMenuItem(icon, label, onClick) {
const item = document.createElement("button");
item.className = "mwt-menu-item";
item.innerHTML = `${label}`;
item.addEventListener("click", (e) => {
e.stopPropagation();
resetHideTimer();
onClick();
});
menu.appendChild(item);
return item;
}
const fullscreenItem = createMenuItem(svgFullscreen, "全屏", toggleFullscreen);
createMenuItem(svgZoomIn, "放大", zoomIn);
createMenuItem(svgZoomOut, "缩小", zoomOut);
createMenuItem(svgReset, "重置缩放", zoomReset);
function resetHideTimer() {
clearTimeout(hideTimer);
hideTimer = setTimeout(() => {
container.style.opacity = "0";
container.style.pointerEvents = "none";
setTimeout(() => host.remove(), 300);
}, AUTO_HIDE_MS);
}
resetHideTimer();
function updateZoomDisplay() {
zoomDisplay.textContent = `${currentZoom}%`;
document.documentElement.style.zoom = `${currentZoom}%`;
}
function toggleFullscreen() {
if (document.fullscreenElement) {
document.exitFullscreen();
} else {
document.documentElement.requestFullscreen();
}
toggleMenu();
}
function updateFullscreenIcon() {
fullscreenItem.querySelector(".mwt-menu-icon").innerHTML = svgFullscreen;
}
function zoomIn() {
currentZoom = Math.min(currentZoom + ZOOM_STEP, ZOOM_MAX);
updateZoomDisplay();
}
function zoomOut() {
currentZoom = Math.max(currentZoom - ZOOM_STEP, ZOOM_MIN);
updateZoomDisplay();
}
function zoomReset() {
currentZoom = 100;
updateZoomDisplay();
}
function toggleMenu() {
menuOpen = !menuOpen;
menu.classList.toggle("mwt-open", menuOpen);
}
btn.addEventListener("click", (e) => {
e.stopPropagation();
toggleMenu();
resetHideTimer();
});
document.addEventListener("click", () => {
if (menuOpen) {
menuOpen = false;
menu.classList.remove("mwt-open");
}
});
document.addEventListener("fullscreenchange", () => {
updateFullscreenIcon();
});
})();
})();