KQ-1113 · MELD/TAGS

Meld Tags

Tags you group by hand with a liquid that does the grouping: drag one near another tag or group and a neck of liquid reaches out between them, drawn analytically as a metaball bridge from motion values each frame; let go and the neck draws it in on a spring that carries the release velocity, and it melds with a gloop while the row reflows on the glide. Drag a member out of its group and it stretches against the neck until it tears with a pop and snaps back as a droplet, the group closing the gap; an unseated member springs home on the recoil. The keyboard picks a tag up with Enter, chooses its new group with the arrows and drops it with the same sound.

KQ-1113 · MELD/TAGS

Money trouble

One pill matches any of its tags

Drag onto another tag to group them, or out of a group to free it. Or press Enter to pick it up, Left and Right to choose where it goes, and Enter to drop it.

6 rules · billing or refunds

Install

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

$ pnpm dlx shadcn@latest add @kinetiq/meld-tags

Props

tags
{ id: string; label: string }[]
default —
Every tag, with its id and the label shown and spoken.
value / defaultValue
string[][]
default every tag on its own
The groups, in order, as arrays of tag ids; a tag on its own is a group of one. Controlled or uncontrolled.
onValueChange
(value: string[][], change: { kind: "meld" | "free"; id: string; group: string[] }) => void
default —
Fires from the drop or the key that changed the groups, with the new groups and what happened: the tag that moved and the group it is in now.
label
string
default "Tags"
The set's accessible name.
goo
number
default 0.5
How thick the liquid runs, 0 to 1: a thicker neck, a longer stretch before a member tears free, and a slower, bouncier settle.
radius
number
default 24
The meld radius in px, 8 to 48: how near a dragged tag must come before the neck reaches out and a drop melds.
tint
"mono" | "tint"
default "tint"
Groups in neutral ink, or each group in its own hue from the theme.
maxGroup
number
default 4
The most tags a group takes, 2 to 6. A full group grows no neck and shows a dashed ring instead.
sound
boolean
default false
A gloop when a tag melds (higher for bigger groups) and a pop when one tears free. Nothing plays, and no audio context exists, unless this is on.
disabled
boolean
default false
Dims the set and stops every drag and pick-up.
className
string
default —
Merged onto the panel's classes.