diff --git a/app/api/teams/[teamId]/image/route.tsx b/app/api/teams/[teamId]/image/route.tsx index 2f713b7..d5f6bc1 100644 --- a/app/api/teams/[teamId]/image/route.tsx +++ b/app/api/teams/[teamId]/image/route.tsx @@ -18,7 +18,8 @@ const anuphanFonts = Promise.all( const response = await fetch( `https://unpkg.com/@fontsource/anuphan@5.3.0/files/anuphan-${subset}-${weight}-normal.woff`, ); - if (!response.ok) throw new Error(`Unable to load Anuphan ${subset} ${weight}`); + if (!response.ok) + throw new Error(`Unable to load Anuphan ${subset} ${weight}`); return { name: "Anuphan", data: await response.arrayBuffer(), @@ -29,7 +30,9 @@ const anuphanFonts = Promise.all( ).catch(() => []); function amount(value: number): string { - return new Intl.NumberFormat("en-US", { maximumFractionDigits: 0 }).format(value); + return new Intl.NumberFormat("en-US", { maximumFractionDigits: 0 }).format( + value, + ); } async function pngDataUrl(url: string): Promise { @@ -37,7 +40,7 @@ async function pngDataUrl(url: string): Promise { const response = await fetch(url); if (!response.ok) return null; const png = await sharp(Buffer.from(await response.arrayBuffer())) - .resize(156, 156, { fit: "cover" }) + .resize(300, 300, { fit: "cover" }) .png() .toBuffer(); return `data:image/png;base64,${png.toString("base64")}`; @@ -63,14 +66,14 @@ export async function GET( const [fonts, memberAssets] = await Promise.all([ anuphanFonts, Promise.all( - team.members.map(async (member) => { - const [character, weapon, artifact] = await Promise.all([ - pngDataUrl(member.character.imageUrl), - member.weapon ? pngDataUrl(member.weapon.imageUrl) : null, - member.artifact ? pngDataUrl(member.artifact.imageUrl) : null, - ]); - return { character, weapon, artifact }; - }), + team.members.map(async (member) => { + const [character, weapon, artifact] = await Promise.all([ + pngDataUrl(member.character.imageUrl), + member.weapon ? pngDataUrl(member.weapon.imageUrl) : null, + member.artifact ? pngDataUrl(member.artifact.imageUrl) : null, + ]); + return { character, weapon, artifact }; + }), ), ]); @@ -83,105 +86,313 @@ export async function GET( flexDirection: "column", color: "#f7f7f7", background: "#05060a", - border: "2px solid #34343d", - padding: "34px 36px", + border: "3px solid #34343d", + padding: "48px 52px", fontFamily: "Anuphan", position: "relative", }} > -
-
-
- {team.guideName} +
+
+
+ {team.guideName} +
+
+ {team.title} · ระยะเวลาโรเทชั่น{" "} + {seconds.toLocaleString(undefined, { maximumFractionDigits: 2 })} วิ +
-
- {team.title} · ระยะเวลาโรเทชั่น {seconds.toLocaleString(undefined, { maximumFractionDigits: 2 })} วิ -
-
-
- {team.members.map((member, index) => { - const damage = Number(member.damage); - const percent = total > 0 ? (damage / total) * 100 : 0; - return ( -
-
- {memberAssets[index].character ? ( - - ) : ( -
- {member.character.name.slice(0, 1)} -
- )} -
- C{member.constellation} -
-
-
- {member.weapon && memberAssets[index].weapon ? ( -
- -
- R{member.refinement} -
-
- ) : null} - {member.artifact && memberAssets[index].artifact ? ( -
- -
- ) : null} -
-
-
-
{member.character.name}
-
{amount(damage)}
-
-
-
+
+ {team.members.map((member, index) => { + const damage = Number(member.damage); + const percent = total > 0 ? (damage / total) * 100 : 0; + return ( +
+
+ {memberAssets[index].character ? ( + + ) : (
+ > + {member.character.name.slice(0, 1)} +
+ )} +
+ C{member.constellation}
-
- {percent.toFixed(1)}% +
+
+ {member.weapon && memberAssets[index].weapon ? ( +
+ +
+ R{member.refinement} +
+
+ ) : null} + {member.artifact && memberAssets[index].artifact ? ( +
+ +
+ ) : null} +
+
+
+
+ {member.character.name} +
+
+ {amount(damage)} +
+
+
+
+
+
+
+ {percent.toFixed(1)}% +
-
- ); - })} -
+ ); + })} +
-
-
Rotation
-
{team.combo}
-
-
- DPS): {amount(dps)} - | - DPR: {amount(total)} -
-
- By YT เกนชินไม่ใช่เกมมือถือ -
+
+
{team.combo}
+
+
+ DPS: {amount(dps)} + | + DPR: {amount(total)} +
+
+ By YT เกนชินไม่ใช่เกมมือถือ +
, { - width: 550, - height: 776, + width: 1080, + height: 1350, fonts: fonts.length ? fonts : undefined, headers: { "Cache-Control": "no-store", diff --git a/components/public/structured-guide.tsx b/components/public/structured-guide.tsx index 9e9c5b2..f617441 100644 --- a/components/public/structured-guide.tsx +++ b/components/public/structured-guide.tsx @@ -337,6 +337,7 @@ function ArtifactSection({ guide }: { guide: PublicGuide }) { ) : null} +
{guide.artifactGroups.map((group) => ( @@ -393,6 +394,7 @@ function ArtifactSection({ guide }: { guide: PublicGuide }) { ))} +
{profile ? (
diff --git a/package.json b/package.json index 51e5b65..ba81f37 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "version": "0.1.0", "private": true, "scripts": { - "dev": "next dev", + "dev": "next dev --turbopack", "build": "next build", "start": "next start", "lint": "eslint .",