feat(extra) : add branded export background
CI / Verify (push) Successful in 1m13s
CI / Build immutable images and deploy (push) Successful in 2m11s

This commit is contained in:
2026-09-05 13:48:03 +07:00 Unverified
parent 912c94c298
commit 20ca7f6303
+36 -6
View File
@@ -305,7 +305,7 @@ function GuideSection({
return <ConstellationSection guide={guide} />; return <ConstellationSection guide={guide} />;
if (section === "team") return <TeamSection guide={guide} />; if (section === "team") return <TeamSection guide={guide} />;
const extra = guide.extras.find((item) => item.slug === section); const extra = guide.extras.find((item) => item.slug === section);
return extra ? <ExtraSection extra={extra} /> : null; return extra ? <ExtraSection guide={guide} extra={extra} /> : null;
} }
function metric(value: string | null) { function metric(value: string | null) {
@@ -1179,13 +1179,20 @@ function TeamSection({ guide }: { guide: PublicGuide }) {
); );
} }
function ExtraSection({ extra }: { extra: PublicGuide["extras"][number] }) { function ExtraSection({
guide,
extra,
}: {
guide: PublicGuide;
extra: PublicGuide["extras"][number];
}) {
return ( return (
<ExtraSectionContent <ExtraSectionContent
guide={guide}
extra={extra} extra={extra}
action={ action={
<GuideImageExport fileName={`${extra.title}.png`} captureClassName="p-0"> <GuideImageExport fileName={`${extra.title}.png`} captureClassName="p-0">
<ExtraSectionContent extra={extra} exporting /> <ExtraSectionContent guide={guide} extra={extra} exporting />
</GuideImageExport> </GuideImageExport>
} }
/> />
@@ -1193,22 +1200,45 @@ function ExtraSection({ extra }: { extra: PublicGuide["extras"][number] }) {
} }
function ExtraSectionContent({ function ExtraSectionContent({
guide,
extra, extra,
action, action,
exporting = false, exporting = false,
}: { }: {
guide: PublicGuide;
extra: PublicGuide["extras"][number]; extra: PublicGuide["extras"][number];
action?: React.ReactNode; action?: React.ReactNode;
exporting?: boolean; exporting?: boolean;
}) { }) {
return ( return (
<section className={cn("flex flex-col gap-6", exporting && "bg-background p-10")}> <section className={cn("flex flex-col gap-6", exporting && "relative isolate overflow-hidden bg-[#070b20] p-10 text-white")}>
<header className="flex flex-col items-center gap-3 text-center"> {exporting ? (
<>
<Image
src={guide.character.splashImageUrl ?? guide.coverUrl}
alt=""
fill
loading="eager"
sizes="1200px"
className="object-cover"
/>
<div className="absolute inset-0 bg-[#050817]/65" />
<Image
src="/icon/Watermark.png"
alt=""
width={180}
height={101}
loading="eager"
className="absolute top-4 right-4 z-30 h-auto w-[180px] object-contain drop-shadow-[0_4px_3px_rgba(0,0,0,0.8)]"
/>
</>
) : null}
<header className="relative z-10 flex flex-col items-center gap-3 text-center">
<p className="text-sm font-medium text-primary">คู่มือเสริม</p> <p className="text-sm font-medium text-primary">คู่มือเสริม</p>
<h1 className="font-heading text-4xl font-semibold">{extra.title}</h1> <h1 className="font-heading text-4xl font-semibold">{extra.title}</h1>
{action} {action}
</header> </header>
<div className={cn("grid gap-5 md:grid-cols-2", exporting && "grid-cols-2")}> <div className={cn("relative z-10 grid gap-5 md:grid-cols-2", exporting && "grid-cols-2")}>
{extra.rows.map((row) => ( {extra.rows.map((row) => (
<Card <Card
key={row.id} key={row.id}