Restructure into modules/ with single-process CTP and config/ layout.
Move business code under modules/, env template to config/, PM2 single qihuo process, and _legacy shims for old imports. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -0,0 +1,102 @@
|
||||
/* Copyright (c) 2025-2026 马建军. All rights reserved.
|
||||
* 专有软件 — 未经授权禁止复制、传播、转售。
|
||||
* 详见 LICENSE.zh-CN.txt
|
||||
*/
|
||||
(function () {
|
||||
function isCoarsePointer() {
|
||||
return window.matchMedia('(hover: none) and (pointer: coarse)').matches;
|
||||
}
|
||||
|
||||
function isTabletUa() {
|
||||
var ua = navigator.userAgent || '';
|
||||
if (/iPad/i.test(ua)) return true;
|
||||
if (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1) return true;
|
||||
if (/Android/i.test(ua) && !/Mobile/i.test(ua)) return true;
|
||||
if (/Tablet|PlayBook|Silk/i.test(ua)) return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
function isPhoneUa() {
|
||||
var ua = navigator.userAgent || '';
|
||||
if (isTabletUa()) return false;
|
||||
if (/iPhone|iPod/i.test(ua)) return true;
|
||||
if (/Android/i.test(ua) && /Mobile/i.test(ua)) return true;
|
||||
if (/HarmonyOS|OpenHarmony/i.test(ua) && !/Tablet/i.test(ua)) return true;
|
||||
if (/Mobile|Windows Phone|IEMobile|BlackBerry/i.test(ua)) return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
function screenShortSide() {
|
||||
return Math.min(window.screen.width || 0, window.screen.height || 0);
|
||||
}
|
||||
|
||||
function detectLayout() {
|
||||
var shortSide = screenShortSide();
|
||||
var coarse = isCoarsePointer();
|
||||
|
||||
if (isPhoneUa()) return 'phone';
|
||||
if (isTabletUa()) return 'tablet';
|
||||
|
||||
if (shortSide > 0 && shortSide < 600) return 'phone';
|
||||
if (shortSide >= 600 && shortSide <= 1100 && coarse) return 'tablet';
|
||||
if (window.innerWidth <= 767) return 'phone';
|
||||
if (window.innerWidth <= 1100 && coarse) return 'tablet';
|
||||
return 'desktop';
|
||||
}
|
||||
|
||||
function updateLayoutState() {
|
||||
var root = document.documentElement;
|
||||
var layout = detectLayout();
|
||||
var isPhone = layout === 'phone';
|
||||
var landscape = window.innerWidth > window.innerHeight;
|
||||
|
||||
root.dataset.layout = layout;
|
||||
root.dataset.mobile = isPhone ? '1' : '0';
|
||||
root.dataset.orientation = isPhone ? 'portrait' : (landscape ? 'landscape' : 'portrait');
|
||||
root.classList.toggle('layout-phone', isPhone);
|
||||
root.classList.toggle('layout-tablet', layout === 'tablet');
|
||||
|
||||
var nav = document.getElementById('site-nav');
|
||||
var userBar = document.querySelector('.user-bar');
|
||||
if (nav && userBar && isPhone) {
|
||||
nav.setAttribute('data-user-label', (userBar.textContent || '').replace(/\s+/g, ' ').trim());
|
||||
}
|
||||
|
||||
var overlay = document.getElementById('orientation-lock');
|
||||
var msg = document.getElementById('orientation-lock-msg');
|
||||
if (!overlay) return;
|
||||
|
||||
if (isPhone) {
|
||||
if (landscape) {
|
||||
overlay.hidden = false;
|
||||
if (msg) msg.textContent = '请竖屏使用';
|
||||
} else {
|
||||
overlay.hidden = true;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (layout === 'tablet' && root.dataset.orientation === 'portrait') {
|
||||
overlay.hidden = false;
|
||||
if (msg) msg.textContent = '平板请旋转至横屏使用';
|
||||
return;
|
||||
}
|
||||
|
||||
overlay.hidden = true;
|
||||
}
|
||||
|
||||
window.qihuoLayout = {
|
||||
isPhone: function () { return document.documentElement.dataset.mobile === '1'; },
|
||||
isTablet: function () { return document.documentElement.dataset.layout === 'tablet'; },
|
||||
refresh: updateLayoutState,
|
||||
};
|
||||
|
||||
updateLayoutState();
|
||||
window.addEventListener('resize', updateLayoutState);
|
||||
window.addEventListener('orientationchange', function () {
|
||||
setTimeout(updateLayoutState, 150);
|
||||
});
|
||||
document.addEventListener('visibilitychange', function () {
|
||||
if (!document.hidden) updateLayoutState();
|
||||
});
|
||||
})();
|
||||
Reference in New Issue
Block a user