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