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
    1. Ines Moreau, 07:52.Dock two is loaded. Pallet 4471 still held.
    1. Rui Baptista, 08:12.Whoever packed 4471 cannot count. Useless.
    2. Rui Baptista, 08:13.Same thing happened on the Basinworks run.
    3. Rui Baptista, 08:14.Someone should own up to it.
    1. Marta Ferreira, 08:31.Waylight Pay cleared it. Paperwork is on the desk.
    1. Ines Moreau, 08:40.Good. Rui, take dock three from nine.
    1. 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.