From 59a17cbeccdbdbf6266d792d5a50ccfada372d4b Mon Sep 17 00:00:00 2001 From: LearnPrompt <131418633+LearnPrompt@users.noreply.github.com> Date: Tue, 28 Jul 2026 23:24:25 +0900 Subject: [PATCH 1/2] feat: add three-column case gallery --- src/app/[lang]/cases/loading.tsx | 4 +- src/app/[lang]/cases/page.tsx | 3 +- src/components/case-card-prompt.tsx | 22 ++++- src/components/case-card.tsx | 123 ++++++++++++++++++++++------ 4 files changed, 121 insertions(+), 31 deletions(-) diff --git a/src/app/[lang]/cases/loading.tsx b/src/app/[lang]/cases/loading.tsx index 8a256fe..125f5c7 100644 --- a/src/app/[lang]/cases/loading.tsx +++ b/src/app/[lang]/cases/loading.tsx @@ -27,13 +27,13 @@ export default function CasesLoading() { ))} -
+
{SKELETON_KEYS.map((key) => (
-
+
diff --git a/src/app/[lang]/cases/page.tsx b/src/app/[lang]/cases/page.tsx index 224b2a6..49c3fe6 100644 --- a/src/app/[lang]/cases/page.tsx +++ b/src/app/[lang]/cases/page.tsx @@ -170,10 +170,11 @@ export default async function CasesPage({
) : ( -
+
{caseItems.map((item) => ( +

{messages.card.method} / {messages.card.code}

@@ -75,12 +81,16 @@ export function CaseCardPrompt({ } return ( -
+

{messages.card.prompt}

- {availableLanguages.length > 1 ? ( + {!compact && availableLanguages.length > 1 ? (
{availableLanguages.map((value) => (
-

+

{prompt.text}

diff --git a/src/components/case-card.tsx b/src/components/case-card.tsx index 24537f1..3349ba7 100644 --- a/src/components/case-card.tsx +++ b/src/components/case-card.tsx @@ -32,11 +32,14 @@ export type CaseCardItem = { export function CaseCard({ item, actions, + variant = "default", }: { item: CaseCardItem; actions?: ReactNode; + variant?: "default" | "gallery"; }) { const messages = useMessages(); + const isGallery = variant === "gallery"; const label = messages.category[item.category as keyof typeof messages.category] || item.category; @@ -47,7 +50,9 @@ export function CaseCard({
{item.mediaUrl ? ( item.mediaType === "image" ? ( @@ -55,8 +60,12 @@ export function CaseCard({ src={item.mediaUrl} alt={item.title} fill - sizes="(min-width: 1536px) 31vw, (min-width: 768px) 48vw, 100vw" - className="object-cover grayscale transition duration-300 group-hover:grayscale-0" + sizes="(min-width: 1280px) 31vw, (min-width: 768px) 48vw, 100vw" + className={`transition duration-300 ${ + isGallery + ? "object-contain group-hover:scale-[1.015]" + : "object-cover grayscale group-hover:grayscale-0" + }`} /> ) : ( @@ -72,44 +85,81 @@ export function CaseCard({ ) : null} -
+
{label} {item.source} - {item.creator && creatorSlug ? ( + {!isGallery && item.creator && creatorSlug ? ( {item.creator} → - ) : item.creator ? ( + ) : !isGallery && item.creator ? ( {item.creator} ) : null}
- -

+ +

{item.title}

+ + {isGallery && item.creator ? ( +

+ {messages.common.creator}{" "} + {creatorSlug ? ( + + {item.creator} → + + ) : ( + {item.creator} + )} +

+ ) : null} + {summary ? ( -

+

{summary}

) : null} {item.skills?.length ? (
- {item.skills.map((skill) => ( - - Skill · {skill.title} - - ))} + {item.skills + .slice(0, isGallery ? 1 : item.skills.length) + .map((skill) => ( + + Skill · {skill.title} + + ))} + {isGallery && item.skills.length > 1 ? ( + +{item.skills.length - 1} + ) : null}
) : null} @@ -118,16 +168,41 @@ export function CaseCard({ contentLocale={item.contentLocale} promptTranslationZh={item.promptTranslationZh} promptTranslationEn={item.promptTranslationEn} + compact={isGallery} /> -
-
+
+
{messages.card.sourceHeat}
-
{item.sourceHeatScore ?? "—"}
+
+ {item.sourceHeatScore ?? "—"} +
-
+
{messages.card.stability}
-
+
{formatStabilityScore(item.stabilityScore)}
From 153ea47e4ef1de692ec841778731fb9e3666579d Mon Sep 17 00:00:00 2001 From: LearnPrompt <131418633+LearnPrompt@users.noreply.github.com> Date: Tue, 28 Jul 2026 23:40:31 +0900 Subject: [PATCH 2/2] fix: soften gallery media letterboxing --- src/components/case-card.tsx | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/src/components/case-card.tsx b/src/components/case-card.tsx index 3349ba7..e7a755a 100644 --- a/src/components/case-card.tsx +++ b/src/components/case-card.tsx @@ -45,6 +45,11 @@ export function CaseCard({ item.category; const summary = getCaseCardSummary(item.summary); const creatorSlug = item.creator ? slugifyCreatorName(item.creator) : ""; + const galleryBackdropUrl = isGallery + ? item.mediaType === "image" + ? item.mediaUrl + : item.posterUrl + : null; return (
@@ -54,6 +59,23 @@ export function CaseCard({ isGallery ? "aspect-[16/10]" : "aspect-[4/3]" }`} > + {galleryBackdropUrl ? ( + <> + +