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 { placeholderImageList } from '@/assets';
import { ProjectCarousel } from '@/ui/components/carousel/project-carousel';
 
const slides = placeholderImageList.map((image, index) => ({
  altText: image.alt ?? `Slide ${index + 1}`,
  heading: `Project ${index + 1}`,
  year: String(2019 + (index % 6)),
  description: `Project ${index + 1} description`,
  image,
}));
 
<ProjectCarousel
  title="Selected works"
  backgroundColor="black"
  slides={slides}
/>