KQ-912 · BLOCK/FOLD
Block Fold
Blocking a member folds their messages instead of tearing a hole in the thread. Each run of consecutive messages holds two faces in one box — the messages and a single folded line — and one ResizeObserver measures whichever is in flow, so the run glides between the two heights on glide while the messages leave on the exit ease. The folded line is a button that peeks that run open without unblocking anyone, and the roster switches read as sentences.
KQ-912 · BLOCK/FOLD
- Ines Moreau, 07:52.Dock two is loaded. Pallet 4471 still held.
- Rui Baptista, 08:12.Whoever packed 4471 cannot count. Useless.
- Rui Baptista, 08:13.Same thing happened on the Basinworks run.
- Rui Baptista, 08:14.Someone should own up to it.
- Marta Ferreira, 08:31.Waylight Pay cleared it. Paperwork is on the desk.
- Ines Moreau, 08:40.Good. Rui, take dock three from nine.
- Marta Ferreira, 08:44.Coldbrook closes Thursday from noon.
nobody blocked · 7 showing
Install
One command — the source lands in your repo. Or copy it from the Code tab.
$ pnpm dlx shadcn@latest add @kinetiq/block-fold
Props
- members
- BlockMember[]
- default —
- The roster, in the order given; each member gets a switch.
- messages
- BlockMessage[]
- default —
- The thread, oldest first; consecutive messages from one author form a run.
- blocked / defaultBlocked
- string[]
- default []
- Controlled or initial blocked member ids.
- onBlockedChange
- (ids: string[]) => void
- default —
- Fires with the next set from either switch direction.
- onBlock
- (id: string) => void
- default —
- Fires when a member is blocked.
- onUnblock
- (id: string) => void
- default —
- Fires when a member is unblocked.
- onPeekChange
- (runId: string, open: boolean) => void
- default —
- Fires when a folded run is peeked open or folded back, and once per peek dropped by an unblock.
- maxHeight
- number
- default 280
- Tallest the thread grows before it scrolls inside its own box.
- foldedNoun
- string
- default "message"
- The word the folded line counts; pluralised for anything but one.
- label
- string
- default —
- Names the thread for assistive technology.
- rosterLabel
- string
- default "Room members"
- Names the roster group.
| Prop | Type | Default | Description |
|---|---|---|---|
| members | BlockMember[] | — | The roster, in the order given; each member gets a switch. |
| messages | BlockMessage[] | — | The thread, oldest first; consecutive messages from one author form a run. |
| blocked / defaultBlocked | string[] | [] | Controlled or initial blocked member ids. |
| onBlockedChange | (ids: string[]) => void | — | Fires with the next set from either switch direction. |
| onBlock | (id: string) => void | — | Fires when a member is blocked. |
| onUnblock | (id: string) => void | — | Fires when a member is unblocked. |
| onPeekChange | (runId: string, open: boolean) => void | — | Fires when a folded run is peeked open or folded back, and once per peek dropped by an unblock. |
| maxHeight | number | 280 | Tallest the thread grows before it scrolls inside its own box. |
| foldedNoun | string | "message" | The word the folded line counts; pluralised for anything but one. |
| label | string | — | Names the thread for assistive technology. |
| rosterLabel | string | "Room members" | Names the roster group. |