Safari 17+ needs dynamic viewport units, a 16px field floor, and clipboard helpers that still work on LAN HTTP.
64 lines
3.7 KiB
HTML
64 lines
3.7 KiB
HTML
<!doctype html>
|
|
<html lang="zh-CN" class="light" data-theme="light">
|
|
<head>
|
|
<meta charset="UTF-8" />
|
|
<link rel="icon" type="image/png" href="/logo.png" />
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover" />
|
|
<meta name="theme-color" content="#0ea5e9" />
|
|
<!-- WebUI is an admin surface; tell every compliant crawler to skip it. -->
|
|
<meta name="robots" content="noindex, nofollow, noarchive, nosnippet" />
|
|
<meta name="googlebot" content="noindex, nofollow, noarchive, nosnippet" />
|
|
<meta name="bingbot" content="noindex, nofollow, noarchive, nosnippet" />
|
|
<title>SnowLuma 控制台</title>
|
|
<!-- Pre-paint theme bootstrap: applies the cached appearance to <html>
|
|
before the bundle mounts, so dark/OLED/density/scale don't flash from
|
|
the default light theme. Mirrors a subset of ThemeContext.applyAppearance;
|
|
defensive (never breaks page load). The bundle re-applies authoritatively. -->
|
|
<script>
|
|
(function () {
|
|
try {
|
|
var raw = localStorage.getItem('snowluma_ui_appearance');
|
|
var a = raw ? JSON.parse(raw) : {};
|
|
if (!a || typeof a !== 'object') a = {};
|
|
var root = document.documentElement;
|
|
var mode = a.mode;
|
|
var pal = a.palette;
|
|
// A non-default palette fixes light/dark; these flavors are light, the rest dark.
|
|
var LIGHT_PAL = { 'catppuccin-latte': 1, 'rose-pine-dawn': 1, 'everforest-light': 1 };
|
|
var isPal = typeof pal === 'string' && pal.length > 0 && pal !== 'default';
|
|
var prefersDark = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches;
|
|
var resolved = isPal
|
|
? (LIGHT_PAL[pal] ? 'light' : 'dark')
|
|
: (mode === 'light' || mode === 'dark'
|
|
? mode
|
|
: (prefersDark ? 'dark' : 'light'));
|
|
root.classList.remove('light', 'dark');
|
|
root.classList.add(resolved);
|
|
root.setAttribute('data-theme', resolved);
|
|
root.style.colorScheme = resolved;
|
|
var themeMeta = document.querySelector('meta[name="theme-color"]');
|
|
if (themeMeta) themeMeta.setAttribute('content', resolved === 'dark' ? '#0a0f1a' : '#f4f7fb');
|
|
if (isPal) root.setAttribute('data-palette', pal);
|
|
if (a.density === 'compact' || a.density === 'cozy') root.setAttribute('data-density', a.density);
|
|
// A palette forces soft so the OLED "black" rule can't fight it.
|
|
var intensity = isPal ? 'soft' : a.darkIntensity;
|
|
if (intensity === 'black' || intensity === 'soft') root.setAttribute('data-dark-intensity', intensity);
|
|
if (a.sidebarStyle === 'follow' || a.sidebarStyle === 'panel' || a.sidebarStyle === 'accent') root.setAttribute('data-sidebar-style', a.sidebarStyle);
|
|
root.setAttribute('data-contrast', a.highContrast ? 'high' : 'normal');
|
|
var systemReduce = window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches;
|
|
root.setAttribute('data-reduce-motion', (a.reduceMotion || a.disableMotion || systemReduce) ? '1' : '0');
|
|
if (a.disableMotion) root.setAttribute('data-no-motion', '1');
|
|
if (typeof a.radius === 'number' && a.radius >= 0 && a.radius <= 2) root.style.setProperty('--radius', a.radius + 'rem');
|
|
if (typeof a.uiScale === 'number' && a.uiScale >= 0.5 && a.uiScale <= 2) {
|
|
root.style.fontSize = (Math.round(16 * a.uiScale * 100) / 100) + 'px';
|
|
}
|
|
} catch (e) { /* ignore — fall back to default theme */ }
|
|
})();
|
|
</script>
|
|
</head>
|
|
<body>
|
|
<div id="root"></div>
|
|
<script type="module" src="/src/main.tsx"></script>
|
|
</body>
|
|
</html>
|