152 lines
4.9 KiB
JavaScript
152 lines
4.9 KiB
JavaScript
// ========================================
|
||
// 移动端菜单模块
|
||
// ========================================
|
||
|
||
import { renderAllButtons } from './themeSetting.js';
|
||
|
||
/**
|
||
* 判断是否为移动端设备
|
||
* @returns {boolean} 是否为移动端
|
||
*/
|
||
const isPhone = () => {
|
||
return !!document.getElementById("editor");
|
||
};
|
||
|
||
/**
|
||
* 初始化移动端菜单
|
||
*/
|
||
const initMobileMenu = () => {
|
||
// 只在移动端设备上初始化
|
||
if (!isPhone()) return;
|
||
|
||
document.body.classList.add("body--mobile");
|
||
|
||
const waitForElement = (selector, timeout = 5000) => {
|
||
return new Promise((resolve) => {
|
||
if (document.querySelector(selector)) {
|
||
resolve(document.querySelector(selector));
|
||
return;
|
||
}
|
||
|
||
const observer = new MutationObserver(() => {
|
||
if (document.querySelector(selector)) {
|
||
observer.disconnect();
|
||
resolve(document.querySelector(selector));
|
||
}
|
||
});
|
||
|
||
observer.observe(document.body, {
|
||
childList: true,
|
||
subtree: true
|
||
});
|
||
|
||
setTimeout(() => {
|
||
observer.disconnect();
|
||
resolve(null);
|
||
}, timeout);
|
||
});
|
||
};
|
||
|
||
waitForElement("#toolbarMore").then(toolbarMore => {
|
||
if (!toolbarMore || document.getElementById("savorToolbar")) return;
|
||
|
||
const savorToolbar = document.createElement("div");
|
||
savorToolbar.id = "savorToolbar";
|
||
savorToolbar.style.cssText = `
|
||
position: fixed;
|
||
top: 56px;
|
||
right: 16px;
|
||
z-index: 9999;
|
||
background: var(--Sv-menu-background);
|
||
border-radius: 12px;
|
||
box-shadow: 0 2px 16px rgba(0,0,0,0.18);
|
||
padding: 10px 8px;
|
||
display: none;
|
||
min-width: 140px;
|
||
`;
|
||
|
||
if (!document.getElementById("savorToolbarToggle")) {
|
||
const toggleBtn = document.createElement("button");
|
||
toggleBtn.id = "savorToolbarToggle";
|
||
toggleBtn.innerHTML =
|
||
`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="var(--b3-theme-on-surface)" d="M20,8.18V3a1,1,0,0,0-2,0V8.18a3,3,0,0,0,0,5.64V21a1,1,0,0,0,2,0V13.82a3,3,0,0,0,0-5.64ZM19,12a1,1,0,1,1,1-1A1,1,0,0,1,19,12Zm-6,2.18V3a1,1,0,0,0-2,0V14.18a3,3,0,0,0,0,5.64V21a1,1,0,0,0,2,0V19.82a3,3,0,0,0,0-5.64ZM12,18a1,1,0,1,1,1-1A1,1,0,0,1,12,18ZM6,6.18V3A1,1,0,0,0,4,3V6.18a3,3,0,0,0,0,5.64V21a1,1,0,0,0,2,0V11.82A3,3,0,0,0,6,6.18ZM5,10A1,1,0,1,1,6,9,1,1,0,0,1,5,10Z"/></svg>`;
|
||
toggleBtn.style.cssText = `
|
||
background-color: transparent;
|
||
position: relative;
|
||
width: 32px;
|
||
height: 32px;
|
||
border: none;
|
||
top: 0;
|
||
right: 0;
|
||
border-radius: 6px;
|
||
display: flex;
|
||
align-items: center;
|
||
justify-content: center;
|
||
`;
|
||
|
||
toggleBtn.addEventListener("click", (e) => {
|
||
e.stopPropagation();
|
||
savorToolbar.style.display = (savorToolbar.style.display === "none" ? "grid" : "none");
|
||
});
|
||
|
||
toolbarMore.parentNode.insertBefore(toggleBtn, toolbarMore);
|
||
|
||
document.addEventListener("click", (e) => {
|
||
if (!savorToolbar.contains(e.target) && e.target !== toggleBtn) {
|
||
savorToolbar.style.display = "none";
|
||
}
|
||
});
|
||
}
|
||
|
||
toolbarMore.parentNode.insertBefore(savorToolbar, toolbarMore);
|
||
|
||
initMobileThemeButtons(savorToolbar);
|
||
});
|
||
};
|
||
|
||
/**
|
||
* 初始化移动端主题按钮
|
||
* @param {HTMLElement} savorToolbar - 工具栏容器元素
|
||
*/
|
||
const initMobileThemeButtons = (savorToolbar) => {
|
||
// 移动端也使用统一的按钮渲染
|
||
renderAllButtons(savorToolbar);
|
||
};
|
||
|
||
/**
|
||
* 初始化移动端和平台相关功能
|
||
*/
|
||
export const initMobileAndPlatformFeatures = () => {
|
||
// 添加移动端相关类名
|
||
if (isPhone()) {
|
||
document.body.classList.add("body--mobile");
|
||
// 延迟初始化移动端菜单,确保DOM元素已加载
|
||
setTimeout(() => {
|
||
initMobileMenu();
|
||
}, 1000);
|
||
}
|
||
|
||
// 添加Mac相关类名
|
||
if (navigator.platform.toUpperCase().indexOf("MAC") > -1) {
|
||
document.body.classList.add("body--mac");
|
||
}
|
||
};
|
||
|
||
// 清理移动端菜单功能
|
||
export const cleanupMobileMenu = () => {
|
||
// 移除添加的元素和类名
|
||
document.body.classList.remove("body--mobile");
|
||
document.body.classList.remove("body--mac");
|
||
|
||
// 移除移动端菜单元素
|
||
const savorToolbar = document.getElementById("savorToolbar");
|
||
if (savorToolbar) {
|
||
savorToolbar.remove();
|
||
}
|
||
|
||
const savorToolbarToggle = document.getElementById("savorToolbarToggle");
|
||
if (savorToolbarToggle) {
|
||
savorToolbarToggle.remove();
|
||
}
|
||
};
|