ecd4f25700
Generate PNG icons from favicon.svg at build time so manifest icons resolve, replace legacy font tags with div wrappers, and tighten mobile layout so long text wraps instead of clipping. Co-authored-by: Cursor <cursoragent@cursor.com>
38 lines
1.3 KiB
JavaScript
38 lines
1.3 KiB
JavaScript
import fs from 'node:fs'
|
|
import path from 'node:path'
|
|
import { fileURLToPath } from 'node:url'
|
|
import sharp from 'sharp'
|
|
import toIco from 'to-ico'
|
|
|
|
const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..')
|
|
const siteDir = path.join(root, 'assets', 'site')
|
|
const sourcePng = path.join(siteDir, 'apple-touch-icon.png')
|
|
const sourceSvg = path.join(siteDir, 'favicon.svg')
|
|
|
|
function resolveSource() {
|
|
if (fs.existsSync(sourcePng)) return sourcePng
|
|
if (fs.existsSync(sourceSvg)) return sourceSvg
|
|
return null
|
|
}
|
|
|
|
const source = resolveSource()
|
|
if (!source) {
|
|
console.warn('[generate-icons] 跳过:未找到 apple-touch-icon.png 或 favicon.svg')
|
|
process.exit(0)
|
|
}
|
|
|
|
async function resizePng(size) {
|
|
return sharp(source, { density: 300 }).resize(size, size).png().toBuffer()
|
|
}
|
|
|
|
const icoSizes = [16, 32, 48, 64, 128, 256]
|
|
const icoBuffers = await Promise.all(icoSizes.map((size) => resizePng(size)))
|
|
const icoBuffer = await toIco(icoBuffers)
|
|
|
|
fs.writeFileSync(path.join(siteDir, 'favicon.ico'), icoBuffer)
|
|
fs.writeFileSync(path.join(siteDir, 'icon-192.png'), await resizePng(192))
|
|
fs.writeFileSync(path.join(siteDir, 'icon-512.png'), await resizePng(512))
|
|
fs.writeFileSync(path.join(siteDir, 'favicon.png'), await resizePng(512))
|
|
|
|
console.log(`[generate-icons] 已从 ${path.basename(source)} 生成 favicon.ico、icon-192.png、icon-512.png`)
|