Staaarter

Sticky Feature List with Images

A sticky left-hand intro (eyebrow, heading, description) stays in view alongside a stacked, numbered list of feature blocks on the right, each pairing a small image with a title and description. Built with pure CSS position:sticky, no client-side JavaScript needed.

By Staaarter Team
Feature
Docs
Live preview

Docs

Installation

A real shadcn registry command, not a copy-paste stand-in: it fetches this block plus its media-slot dependencies and any missing npm packages, and installs them straight into your project.

npx shadcn add https://staaarter.com/r/sticky-feature-list-with-images.json

Prefer not to use the CLI? Copy the source from the Code toggle above into src/components/blocks/feature/feature42.tsx instead.

Usage

The file also exports feature42Demo, the exact props behind the preview above. Spread it to get a working section in one line, then replace it with your own data.

import { Feature42, feature42Demo } from "@/components/blocks/feature/feature42";

export default function Page() {
  return <Feature42 {...feature42Demo} />;
}

Props

PropTypeDefaultDescription
eyebrowstringundefinedSmall label above the heading; omitted entirely when unset.
headingReactNodenoneSection heading.
descriptionstringundefinedSupporting copy under the heading.
itemsStickyFeatureListItem[]noneNumbered feature entries rendered in array order.
classNamestringundefinedExtra classes for the outer section element.

Types

type StickyFeatureListItem = {
  title: string;
  description: string;
  image: { src: string; alt: string };
};

Behavior notes

  • Plain server component with no interactivity; the sticky positioning is pure CSS (`lg:sticky lg:top-24`) and needs no client-side JavaScript.
  • The left intro column is not sticky on mobile, where the layout stacks into a single column in reading order.
  • Item numbers are zero-padded (01, 02, ...) and computed from array position, not stored per item.