diff --git a/app/favicon.ico b/app/favicon.ico index 718d6fe..ad59426 100644 Binary files a/app/favicon.ico and b/app/favicon.ico differ diff --git a/app/layout.tsx b/app/layout.tsx index 4b550a8..0be7cf8 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -9,26 +9,19 @@ export const metadata: Metadata = { description: "随时了解长辈的近况,查看留言、使用动态,给长辈写问候。", manifest: "/manifest.webmanifest", icons: { - icon: [ - { - url: "/pwa/icon-192x192.png", - sizes: "192x192", - type: "image/png", - }, - { - url: "/pwa/icon-512x512.png", - sizes: "512x512", - type: "image/png", - }, - ], + icon: { + url: "/app-icon.webp", + sizes: "512x512", + type: "image/webp", + }, apple: [ { - url: "/pwa/apple-touch-icon.png", + url: "/pwa/apple-touch-icon.webp", sizes: "180x180", - type: "image/png", + type: "image/webp", }, ], - shortcut: "/pwa/icon-192x192.png", + shortcut: "/app-icon.webp", }, appleWebApp: { capable: true, diff --git a/app/login/page.tsx b/app/login/page.tsx index fcd51fa..bbe6300 100644 --- a/app/login/page.tsx +++ b/app/login/page.tsx @@ -1,3 +1,4 @@ +import Image from "next/image"; import { redirect } from "next/navigation"; import { AccountAuthForm } from "@/components/account-auth-form"; @@ -15,7 +16,14 @@ export default async function LoginPage({ searchParams }: PageProps<"/login">) {
-
+ 安智伴

安智伴 家属端

用同一个账号,在每一台设备上继续守护。长辈的留言、对话与动态都按账号归属。

diff --git a/app/manifest.ts b/app/manifest.ts index c05e269..81e7632 100644 --- a/app/manifest.ts +++ b/app/manifest.ts @@ -13,21 +13,21 @@ export default function manifest(): MetadataRoute.Manifest { categories: ["utilities", "lifestyle", "health"], icons: [ { - src: "/pwa/icon-192x192.png", + src: "/pwa/icon-192x192.webp", sizes: "192x192", - type: "image/png", + type: "image/webp", }, { - src: "/pwa/icon-512x512.png", + src: "/pwa/icon-512x512.webp", sizes: "512x512", - type: "image/png", + type: "image/webp", }, { - src: "/pwa/icon-maskable-512x512.png", + src: "/pwa/icon-maskable-512x512.webp", sizes: "512x512", - type: "image/png", + type: "image/webp", purpose: "maskable", }, ], }; -} \ No newline at end of file +} diff --git a/bun.lock b/bun.lock index 43bf644..5e655a3 100644 --- a/bun.lock +++ b/bun.lock @@ -1,6 +1,5 @@ { "lockfileVersion": 1, - "configVersion": 0, "workspaces": { "": { "name": "digital-human-monitor-v2", @@ -31,6 +30,10 @@ "tailwindcss": "^4", "typescript": "^5", }, + "optionalDependencies": { + "@tailwindcss/oxide-darwin-arm64": "4.2.2", + "lightningcss-darwin-arm64": "1.32.0", + }, }, }, "trustedDependencies": [ @@ -208,6 +211,8 @@ "@tailwindcss/oxide": ["@tailwindcss/oxide@4.2.2", "", { "optionalDependencies": { "@tailwindcss/oxide-win32-x64-msvc": "4.2.2" } }, ""], + "@tailwindcss/oxide-darwin-arm64": ["@tailwindcss/oxide-darwin-arm64@4.2.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-iq9Qjr6knfMpZHj55/37ouZeykwbDqF21gPFtfnhCCKGDcPI/21FKC9XdMO/XyBM7qKORx6UIhGgg6jLl7BZlg=="], + "@tailwindcss/oxide-win32-x64-msvc": ["@tailwindcss/oxide-win32-x64-msvc@4.2.2", "", { "os": "win32", "cpu": "x64" }, ""], "@tailwindcss/postcss": ["@tailwindcss/postcss@4.2.2", "", { "dependencies": { "@alloc/quick-lru": "^5.2.0", "@tailwindcss/node": "4.2.2", "@tailwindcss/oxide": "4.2.2", "postcss": "^8.5.6", "tailwindcss": "4.2.2" } }, ""], @@ -704,6 +709,8 @@ "lightningcss": ["lightningcss@1.32.0", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-win32-x64-msvc": "1.32.0" } }, ""], + "lightningcss-darwin-arm64": ["lightningcss-darwin-arm64@1.32.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ=="], + "lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.32.0", "", { "os": "win32", "cpu": "x64" }, ""], "locate-path": ["locate-path@6.0.0", "", { "dependencies": { "p-locate": "^5.0.0" } }, ""], diff --git a/package.json b/package.json index dde5d3d..2a6fbf0 100644 --- a/package.json +++ b/package.json @@ -36,6 +36,10 @@ "tailwindcss": "^4", "typescript": "^5" }, + "optionalDependencies": { + "@tailwindcss/oxide-darwin-arm64": "4.2.2", + "lightningcss-darwin-arm64": "1.32.0" + }, "ignoreScripts": [ "sharp", "unrs-resolver" diff --git a/public/app-icon.webp b/public/app-icon.webp new file mode 100644 index 0000000..2e56931 Binary files /dev/null and b/public/app-icon.webp differ diff --git a/public/pwa/apple-touch-icon.png b/public/pwa/apple-touch-icon.png deleted file mode 100644 index a67db77..0000000 Binary files a/public/pwa/apple-touch-icon.png and /dev/null differ diff --git a/public/pwa/apple-touch-icon.webp b/public/pwa/apple-touch-icon.webp new file mode 100644 index 0000000..c5ccdfa Binary files /dev/null and b/public/pwa/apple-touch-icon.webp differ diff --git a/public/pwa/badge-96x96.png b/public/pwa/badge-96x96.png deleted file mode 100644 index ce8b23c..0000000 Binary files a/public/pwa/badge-96x96.png and /dev/null differ diff --git a/public/pwa/badge-96x96.webp b/public/pwa/badge-96x96.webp new file mode 100644 index 0000000..02fe228 Binary files /dev/null and b/public/pwa/badge-96x96.webp differ diff --git a/public/pwa/icon-192x192.png b/public/pwa/icon-192x192.png deleted file mode 100644 index e609959..0000000 Binary files a/public/pwa/icon-192x192.png and /dev/null differ diff --git a/public/pwa/icon-192x192.webp b/public/pwa/icon-192x192.webp new file mode 100644 index 0000000..38cc437 Binary files /dev/null and b/public/pwa/icon-192x192.webp differ diff --git a/public/pwa/icon-512x512.png b/public/pwa/icon-512x512.png deleted file mode 100644 index 8c3772b..0000000 Binary files a/public/pwa/icon-512x512.png and /dev/null differ diff --git a/public/pwa/icon-512x512.webp b/public/pwa/icon-512x512.webp new file mode 100644 index 0000000..f133e85 Binary files /dev/null and b/public/pwa/icon-512x512.webp differ diff --git a/public/pwa/icon-maskable-512x512.png b/public/pwa/icon-maskable-512x512.png deleted file mode 100644 index af6b95b..0000000 Binary files a/public/pwa/icon-maskable-512x512.png and /dev/null differ diff --git a/public/pwa/icon-maskable-512x512.webp b/public/pwa/icon-maskable-512x512.webp new file mode 100644 index 0000000..23fd319 Binary files /dev/null and b/public/pwa/icon-maskable-512x512.webp differ diff --git a/public/sw.js b/public/sw.js index c2df92e..bd2efd9 100644 --- a/public/sw.js +++ b/public/sw.js @@ -3,8 +3,8 @@ self.addEventListener("push", (event) => { title: "安智伴 家人连线台", body: "收到一条新的家人留言。", url: "/", - icon: "/pwa/icon-192x192.png", - badge: "/pwa/badge-96x96.png", + icon: "/pwa/icon-192x192.webp", + badge: "/pwa/badge-96x96.webp", tag: "digital-human-message", }; @@ -63,4 +63,4 @@ self.addEventListener("notificationclick", (event) => { }, ), ); -}); \ No newline at end of file +}); diff --git a/scripts/generate-icons.mjs b/scripts/generate-icons.mjs index ad26064..2675760 100644 --- a/scripts/generate-icons.mjs +++ b/scripts/generate-icons.mjs @@ -7,7 +7,7 @@ import sharp from "sharp"; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); const projectRoot = path.resolve(__dirname, ".."); -const sourceIconPath = path.join(projectRoot, "icon.png"); +const sourceIconPath = path.join(projectRoot, "app", "icon.png"); const pwaOutputDir = path.join(projectRoot, "public", "pwa"); const androidResArg = process.argv.find((arg) => @@ -25,16 +25,19 @@ function createCircleMask(size) { `); } -async function writePng(size, outputPath) { - await sharp(sourceIconPath).resize(size, size).png().toFile(outputPath); +async function writeWebp(size, outputPath) { + await sharp(sourceIconPath) + .resize(size, size) + .webp({ quality: 88, effort: 6 }) + .toFile(outputPath); } -async function writeMaskablePng(size, outputPath) { +async function writeMaskableWebp(size, outputPath) { const foreground = await sharp(sourceIconPath) .resize(Math.round(size * 0.82), Math.round(size * 0.82), { fit: "contain", }) - .png() + .webp({ quality: 88, effort: 6 }) .toBuffer(); await sharp({ @@ -51,7 +54,7 @@ async function writeMaskablePng(size, outputPath) { gravity: "center", }, ]) - .png() + .webp({ quality: 88, effort: 6 }) .toFile(outputPath); } @@ -92,15 +95,15 @@ async function writeAndroidIcons(resDir) { await mkdir(pwaOutputDir, { recursive: true }); await Promise.all([ - writePng(192, path.join(pwaOutputDir, "icon-192x192.png")), - writePng(512, path.join(pwaOutputDir, "icon-512x512.png")), - writePng(180, path.join(pwaOutputDir, "apple-touch-icon.png")), - writePng(96, path.join(pwaOutputDir, "badge-96x96.png")), - writeMaskablePng(512, path.join(pwaOutputDir, "icon-maskable-512x512.png")), + writeWebp(192, path.join(pwaOutputDir, "icon-192x192.webp")), + writeWebp(512, path.join(pwaOutputDir, "icon-512x512.webp")), + writeWebp(180, path.join(pwaOutputDir, "apple-touch-icon.webp")), + writeWebp(96, path.join(pwaOutputDir, "badge-96x96.webp")), + writeMaskableWebp(512, path.join(pwaOutputDir, "icon-maskable-512x512.webp")), ]); if (androidResDir) { await writeAndroidIcons(androidResDir); } -console.log("Icons generated successfully."); \ No newline at end of file +console.log("Icons generated successfully.");