Skip to content

Feat/arian carousel cherry pick - #55

Open
AntoniaStr wants to merge 1 commit into
feat/animations-libraryfrom
feat/arian-carousel-cherry-pick
Open

Feat/arian carousel cherry pick#55
AntoniaStr wants to merge 1 commit into
feat/animations-libraryfrom
feat/arian-carousel-cherry-pick

Conversation

@AntoniaStr

Copy link
Copy Markdown

No description provided.

@vercel

vercel Bot commented Jun 30, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
taylorui Ready Ready Preview, Comment Jul 2, 2026 12:26pm

@klupsky klupsky left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@AntoniaStr i polished this a bit and addred a code snippet and descriptions

@klupsky
klupsky marked this pull request as draft July 2, 2026 08:37
@klupsky
klupsky force-pushed the feat/arian-carousel-cherry-pick branch from 554c6a0 to 83c1989 Compare July 2, 2026 09:06
@klupsky
klupsky marked this pull request as ready for review July 2, 2026 09:07
Co-Authored-By: Cursor <cursoragent@cursor.com>

@functn-monitoring functn-monitoring Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 Code Agent review

The PR adds a new project carousel component, a showcase page, a snippet test wrapper, and a nav entry. The implementation is structurally sound with good attention to Embla-based carousel primitives, animation handling, and responsive layout. Three findings are flagged: an accessibility concern with the title markup, a React key anti-pattern in the crossfade stack, and a type duplication that could confuse downstream consumers.

Filtered 1 docs file(s) from review. LLM excluded 1 likely-irrelevant file(s): src/assets/index.ts.

Found 3 item(s) — 3 as inline comment(s) below.

Generated by code-agent (OpenCode + DeepSeek) · view review logs

isBlack ? 'text-white' : '',
)}
>
{collectionLabel}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟠 MEDIUM — Carousel title rendered as

instead of a heading element

The carousel's collection label and title are wrapped in a <p> tag (lines 329–342). Screen readers navigating by heading will skip this content. Since SlideContentBlock already uses <h2> for per-slide headings, the outer title should also be a heading (e.g. <h2>) to establish a meaningful heading hierarchy. Consider changing the outer container to <h2> (or the appropriate level for the page context) while keeping the same visual styling.

>
{items.map((item, i) => (
<MotionTag
key={i}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 LOW · 🧹 quality — CrossfadeStack uses array index as React key

In the CrossfadeStack component (line 118) items are keyed by array index (key={i}). While this works for the current usage (a static carousel that never reorders/filters slides), it is a React anti-pattern that can cause stale animation state or incorrect reconciliation if the list ever changes dynamically. The CarouselTrack in the same file correctly uses key={index} for the image track, so the same pattern is inconsistent here. Consider using a stable unique identifier from the slide data (e.g. slide.altText or a synthetic id field) if available.

heading?: string;
year?: string;
description?: string;
image: StaticImageData & { alt?: string };

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 LOW · 🧹 quality — ProjectCarouselSlide type duplicates existing ProjectCarouselSlideData with a narrower image type

The new ProjectCarouselSlide type (line 29) defines image: StaticImageData & { alt?: string }, while src/assets/index.ts already exports ProjectCarouselSlideData with image: ImageMedia (which is { type: 'image' } & StaticImageData & { alt?: string }). The showcase.tsx passes placeholderProjectList (typed as ProjectCarouselSlideData[]) to ProjectCarousel, which works structurally but relies on type: 'image' being silently ignored by next/image. Downstream consumers looking at the component's exported type will expect a static-import shape, whereas the canonical data in @/assets has an extra discriminator field. Consider either importing and reusing ProjectCarouselSlideData from @/assets (if the component is tied to that data shape) or renaming the component's type to differentiate it and documenting the expected image shape.

@functn-monitoring
functn-monitoring Bot removed the request for review from functnbot July 6, 2026 11:32
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants