Timetables riders read at a glance
Every crossing of the day on one screen, with the next boat first and the last one marked before it is too late.
Cards that pin and pile up as the page scrolls, each one behind shrinking and fading back a little.
Four projects from the Quillstone studio
Every crossing of the day on one screen, with the next boat first and the last one marked before it is too late.
Readers find the book they half remember. Loans went up in the first month, and the desk gets fewer calls.
Patients pick a reason, a day and a doctor. The receptionist sees the morning fill up before the phones ring.
Customers swap what they do not want and the farm knows how much to pick on Friday morning.
Before anyone comments on a screen, someone reads the problem out loud. Half of the feedback answers a question nobody asked.
Long names, empty lists, a price with six digits. A design that only works with the sample data is not finished.
Every review ends with one element taken out. If nobody misses it a week later, it stays out.
Five people who were not in the room try it while we watch, without a word from us.
npx shadcn@latest add https://ui.ndekocode.dev/r/motion-stacking-cards.jsonEach card gets a pinned frame as tall as the scrolling area. The deepest card ends at 90% of its size and the one on top stays at full size; the scale and the fade follow the scroll position directly, without re-rendering. With reduced motion, the cards are a plain list at full size.
| Prop | Type | Default | Description |
|---|---|---|---|
| children | React.ReactNode | The StackingCard elements. | |
| containerRef | RefObject<HTMLElement | null> | The scrolling element, when it is not the page. It needs a non-static position. | |
| frameClassName | string | h-svh | Classes of each pinned frame. Its height should match the scrolling area. |
| peek | number | 16 | How many pixels of each card stay visible above the next one. |
| className | string | undefined | Optional CSS class for the stack. |
| Prop | Type | Default | Description |
|---|---|---|---|
| children | React.ReactNode | The content of the card. Give every card the same height so the edges line up. | |
| className | string | undefined | Classes of the card surface: background, ring, radius and width. |