90 lines
3.5 KiB
JavaScript
90 lines
3.5 KiB
JavaScript
/**
|
||
* 根据 config.js 应用站点名称到页面标题、meta、标题元素,并动态生成 PWA manifest
|
||
* 需在 config.js 之后加载
|
||
*/
|
||
(function () {
|
||
var name = window.SITE_NAME || '萌芽导航';
|
||
var shortName = window.SITE_SHORT_NAME || '萌芽';
|
||
var desc = window.SITE_DESCRIPTION || (name + ' - 轻量好用的网址导航');
|
||
|
||
document.title = name;
|
||
var metaDesc = document.querySelector('meta[name="description"]');
|
||
if (metaDesc) metaDesc.setAttribute('content', desc);
|
||
var metaApp = document.querySelector('meta[name="apple-mobile-web-app-title"]');
|
||
if (metaApp) metaApp.setAttribute('content', name);
|
||
|
||
var siteTitle = document.getElementById('site-title');
|
||
if (siteTitle) siteTitle.textContent = '\u2728 ' + name;
|
||
var adminTitle = document.getElementById('admin-title');
|
||
if (adminTitle) adminTitle.textContent = name + '-管理后台';
|
||
var offlineTitle = document.getElementById('offline-title');
|
||
if (offlineTitle) {
|
||
document.title = name + ' - 离线';
|
||
offlineTitle.textContent = name + ' - 离线';
|
||
}
|
||
var offlineLogo = document.getElementById('offline-logo');
|
||
if (offlineLogo) offlineLogo.textContent = shortName.charAt(0);
|
||
|
||
var glassOpacity = window.SITE_GLASS_OPACITY;
|
||
if (typeof glassOpacity === 'number' && glassOpacity >= 0 && glassOpacity <= 1) {
|
||
document.documentElement.style.setProperty('--site-glass-opacity', String(glassOpacity));
|
||
}
|
||
|
||
var isMobile = window.matchMedia('(max-width: 767px)').matches;
|
||
var bgImages = isMobile
|
||
? window.SITE_MOBILE_BACKGROUND_IMAGES
|
||
: window.SITE_DESKTOP_BACKGROUND_IMAGES;
|
||
if (!Array.isArray(bgImages) || bgImages.length === 0) {
|
||
bgImages = isMobile ? window.SITE_DESKTOP_BACKGROUND_IMAGES : window.SITE_MOBILE_BACKGROUND_IMAGES;
|
||
}
|
||
if (Array.isArray(bgImages) && bgImages.length > 0) {
|
||
var imgUrl = bgImages[Math.floor(Math.random() * bgImages.length)];
|
||
var applyBg = function () {
|
||
if (!document.body) return;
|
||
var bgEl = document.createElement('div');
|
||
bgEl.className = 'site-bg';
|
||
bgEl.setAttribute('aria-hidden', 'true');
|
||
bgEl.style.backgroundImage = 'url(' + imgUrl + ')';
|
||
document.body.insertBefore(bgEl, document.body.firstChild);
|
||
};
|
||
if (document.body) {
|
||
applyBg();
|
||
} else {
|
||
document.addEventListener('DOMContentLoaded', applyBg);
|
||
}
|
||
}
|
||
|
||
var manifest = {
|
||
name: name,
|
||
short_name: shortName,
|
||
description: desc,
|
||
lang: 'zh-CN',
|
||
dir: 'ltr',
|
||
id: '/',
|
||
start_url: '/?source=pwa',
|
||
scope: '/',
|
||
display: 'standalone',
|
||
display_override: ['standalone', 'minimal-ui', 'browser'],
|
||
orientation: 'portrait-primary',
|
||
theme_color: '#10b981',
|
||
background_color: '#f8fafc',
|
||
categories: ['productivity', 'utilities'],
|
||
prefer_related_applications: false,
|
||
icons: [
|
||
{ src: '/logo.png', type: 'image/png', sizes: '2048x2048', purpose: 'any' },
|
||
{ src: '/logo.png', type: 'image/png', sizes: '2048x2048', purpose: 'maskable' },
|
||
{ src: '/favicon.ico', type: 'image/x-icon', sizes: '16x16 24x24 32x32 48x48 64x64', purpose: 'any' }
|
||
]
|
||
};
|
||
var blob = new Blob([JSON.stringify(manifest)], { type: 'application/json' });
|
||
var url = URL.createObjectURL(blob);
|
||
var link = document.querySelector('link[rel="manifest"]');
|
||
if (link) link.href = url;
|
||
else {
|
||
link = document.createElement('link');
|
||
link.rel = 'manifest';
|
||
link.href = url;
|
||
document.head.appendChild(link);
|
||
}
|
||
})();
|