KQ-1560 · PATERNOSTER/CARDS

Paternoster Cards

Cards ride the open cabins of an endless lift: up the left shaft, over the top on the drive wheel's half circle (receding into the machine room so close cabins pass behind each other) and down the right, the loop longer than the frame so it never stops and never jumps. The chain runs by itself and crawls while a cabin is level with the landing; there the cabin's lamp warms and its card swings out on springs.snap while it travels and grows to full size on springs.glide, its detail printing in line by line, then tucks back on an exit tween as the cabin moves on. Drag drives the chain 1:1 (up on either shaft moves the cabins under the finger), a flick settles on the nearest landing on glide with the release velocity; Up and Right bring the next cabin, Down and Left the previous, Home and End the ends, Enter or Space hold the landing card and Escape lets it go.

KQ-1560 · PATERNOSTER/CARDS

Fieldline Archive · reading floors

Up and Right bring the next cabin to the landing, Down and Left the previous one. Home and End go to the first and last card. Enter holds the card at the landing and Escape lets it go.

Floor 1 · Map room

Maps & charts

Coastal surveys and hand-drawn contour sheets, flat in the plan chests by the windows.

1,240 sheetsAt landing

landing · floor 1 of 8 · maps & charts

Install

One command — the source lands in your repo. Or copy it from the Code tab.

$ pnpm dlx shadcn@latest add @kinetiq/paternoster-cards

Props

items
PaternosterCard[]
default defaultPaternosterCards
The cards riding the lift: { title, kicker?, detail?, meta?, src?, alt?, art?, href? }. They repeat round a chain that needs more cabins than there are cards.
value / defaultValue
number
default 0
The card at the landing, controlled or initial.
onValueChange
(index: number) => void
default —
Fires as a new card reaches the landing — from the run, a drag, a key or a click.
held / defaultHeld
boolean
default false
The landing card held out with the chain stopped, controlled or initial.
onHeldChange
(held: boolean) => void
default —
Fires from the press, key or click that held or released the landing card.
spacing
number
default 16
Gap between one cabin and the next, px; sets how many cabins ride the loop.
speed
number
default 0.6
How fast the chain runs by itself, 0 to 2; 0 leaves it still.
dwell
number
default 0.75
How much the chain slows while a cabin is level with the landing, 0 to 1.
cabinTone
"brass" | "oak" | "steel" | "enamel"
default "brass"
The cabins' material.
landing
number
default 0.55
The landing's height, as a fraction of the frame from the top.
reverse
boolean
default false
Run the chain the other way: down the left shaft, up the right.
paused
boolean
default false
Stops the run without touching the visitor's own Stop button.
pauseOnHover
boolean
default true
A pointer over the lift, or keyboard focus inside it, rests the run so a card can be read.
wheel
boolean
default true
The wheel drives the chain once the visitor has rested on, clicked or tabbed into the lift.
lampColor
string
default "var(--warn)"
The landing lamp's colour, used as a pigment so it reads in both themes.
height
number
default 520
Height of the lift, px.
label
string
default "Lift"
The lift's accessible name.
disabled
boolean
default false
Stops every gesture and key.
className
string
default —
Classes for the outer frame.