Showcase

Animations from past Functn projects, adapted for TaylorUI. Copy the components into your project and wire them up to your own data.


Adapted from the Arian project: functndev/arian. The TaylorUI version keeps the same interaction pattern (image carousel + animated metadata + progress) but is restructured into reusable TaylorUI primitives and typed props.

How it works

ProjectCarousel is data-driven: pass slides and it renders the image track, previous/next controls, crossfading text (heading, year, description), and a progress bar based on the active index.

Technology used

  • Carousel* TaylorUI primitives (CarouselRoot, CarouselTrack, CarouselItem, nav buttons)
  • Embla-based controller (useCarouselController) used under the carousel primitives
  • Framer Motion (AnimatePresence, motion) for metadata transitions
  • next/image for optimized images
  • Tailwind utility classes for responsive layout and styling

Accessibility status

The implementation uses accessible carousel semantics from TaylorUI (aria-label, aria-roledescription, per-slide labels, keyboard-focusable controls). It is implemented with accessibility in mind, but it has not been formally audited against WCAG in this docs page yet.

Project Collection / Selected works

What to copy from TaylorUI to make this work

For the snippet below to work in another project, copy these files:

  • src/ui/components/carousel/project-carousel.tsx
  • src/ui/components/carousel/carousel.tsx
  • src/ui/components/carousel/use-carousel-controller.ts
  • src/lib/cn.ts

Install runtime dependencies used by this component:

  • framer-motion
  • next / react
  • embla-carousel-react

If your project already has TaylorUI carousel primitives, you usually only need to copy project-carousel.tsx and its slide data shape.

import { placeholderProjectList } from '@/assets';
import { ProjectCarousel } from '@/ui/components/carousel/project-carousel';
 
<ProjectCarousel
  title="Selected works"
  backgroundColor="black"
  slides={placeholderProjectList}
/>

To customise slide content, map your data to the ProjectCarouselSlideData type from @/assets:

import type { ProjectCarouselSlideData } from '@/assets';
 
const slides: ProjectCarouselSlideData[] = items.map((item) => ({
  altText: item.title,
  heading: item.title,
  year: item.year,
  description: item.description,
  image: item.image,
}));