From f35889f96684db6df405b08a3ca5230705dc6eb3 Mon Sep 17 00:00:00 2001 From: adilallo <39313955+adilallo@users.noreply.github.com> Date: Wed, 19 Aug 2026 14:52:54 -0600 Subject: [PATCH] Center leftover Learn cards on a short last row and keep thumbnail copy in the top half so it does not cover the artwork. Co-authored-by: Cursor --- app/(marketing)/learn/page.tsx | 10 ++++++---- .../ContentThumbnailTemplate.view.tsx | 6 +++--- tests/pages/learn.test.tsx | 8 ++++---- tests/unit/ContentThumbnailTemplate.test.jsx | 4 ++++ 4 files changed, 17 insertions(+), 11 deletions(-) diff --git a/app/(marketing)/learn/page.tsx b/app/(marketing)/learn/page.tsx index 38ada81..271cdb5 100644 --- a/app/(marketing)/learn/page.tsx +++ b/app/(marketing)/learn/page.tsx @@ -31,11 +31,13 @@ export default function LearnPage() { {/* * Single responsive render: ContentThumbnailTemplate variant="responsive" - * uses to swap horizontal/vertical art at smd (530px). The - * container switches from a vertical flex stack ( to swap horizontal/vertical art at smd (530px). Wrap and + * center leftover cards so a short last row is not left-aligned. */} -
+
{allPosts.map((post) => (
-
+
@@ -82,7 +82,7 @@ function ContentThumbnailTemplateView({ className="pointer-events-none size-full object-cover" />
-
+
@@ -124,7 +124,7 @@ function ContentThumbnailTemplateView({ className="pointer-events-none size-full object-cover" /> -
+
diff --git a/tests/pages/learn.test.tsx b/tests/pages/learn.test.tsx index 6011ff2..67645d2 100644 --- a/tests/pages/learn.test.tsx +++ b/tests/pages/learn.test.tsx @@ -83,12 +83,12 @@ describe("LearnPage", () => { }); it("renders one card per post (single responsive grid, no duplication)", () => { - const { container } = render(); + render(); - const grid = container.querySelector(".smd\\:grid"); - expect(grid).toBeTruthy(); + const grid = screen.getByTestId("learn-article-grid"); + expect(grid).toHaveClass("smd:justify-center", "smd:flex-wrap"); - const links = within(grid as HTMLElement).getAllByRole("link"); + const links = within(grid).getAllByRole("link"); expect(links).toHaveLength(mockPosts.length); expect(links[0]).toHaveAttribute( diff --git a/tests/unit/ContentThumbnailTemplate.test.jsx b/tests/unit/ContentThumbnailTemplate.test.jsx index 48636bc..0bb05ff 100644 --- a/tests/unit/ContentThumbnailTemplate.test.jsx +++ b/tests/unit/ContentThumbnailTemplate.test.jsx @@ -35,6 +35,8 @@ describe("ContentThumbnailTemplate", () => { const container = screen.getByRole("link"); const thumbnailDiv = container.querySelector("div.relative"); expect(thumbnailDiv).toHaveClass("aspect-[260/390]", "w-full"); + const copy = thumbnailDiv?.querySelector(".z-20"); + expect(copy).toHaveClass("max-h-[48%]", "overflow-hidden"); }); it("should display post title and description", () => { @@ -61,6 +63,8 @@ describe("ContentThumbnailTemplate", () => { const container = screen.getByRole("link"); const thumbnailDiv = container.querySelector("div.relative"); expect(thumbnailDiv).toHaveClass("aspect-[320/225.5]", "w-full"); + const copy = thumbnailDiv?.querySelector(".z-20"); + expect(copy).toHaveClass("max-h-[48%]", "overflow-hidden"); }); it("should render fixed vertical dimensions when sizing is fixed", () => {