perf(booth): optimize assets and result flow

WebP reduces UI payload; JPEG keeps portrait saves compatible.\nFinish ends the visit without prompting another portrait.
This commit is contained in:
Ajasra committed 2026-10-30 00:00:16 +08:00
1 parent 56da9c86d2
commit 6772e0cf37
41 files changed
+225 -97

No files matched your search

+32
View File
@@ -0,0 +1,32 @@
"use client";
import React from "react";
import { Check } from "lucide-react";
import { MascotGuide } from "@/components/MascotGuide";
import { useI18n } from "@/lib/i18n";
export const FinishedScreen: React.FC = () => {
const { t } = useI18n();
return (
<div className="relative flex-1 flex flex-col items-center justify-center gap-5 p-6 text-center select-none">
<div className="w-16 h-16 rounded-full bg-emerald-500/15 border-2 border-emerald-400/70 text-emerald-300 flex items-center justify-center shadow-[0_0_28px_rgba(52,211,153,0.2)]">
<Check size={34} className="stroke-[3]" />
</div>
<div className="max-w-sm space-y-3">
<h1 className="text-2xl sm:text-3xl font-black text-amber-100 drop-shadow-[0_3px_8px_rgba(0,0,0,0.9)]">
{t({ en: "Thanks for visiting!", zh: "感谢到访!" })}
</h1>
<p className="text-base leading-relaxed font-semibold text-amber-100/90">
{t({
en: "Your portrait is ready to take with you. You can close this page now.",
zh: "您的万圣武道照已准备好带回家,现在可以关闭此页面。",
})}
</p>
</div>
<MascotGuide pose="bow" size="sm" animate={false} />
</div>
);
};