This commit is contained in:
2026-03-11 20:41:03 +08:00
commit c5af0cc946
21 changed files with 5831 additions and 0 deletions

View File

@@ -0,0 +1,89 @@
/**
* 根据 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);
}
})();