Skip to content

Components · shadcn badge, toggle

Tags, status and chips

Three kinds, each distinct from the others and from line badges: a neutral tag for categories, a status badge in words, and a capsule chip you press to filter.

Tags

A category: surface fill, muted type-kicker. Not interactive, so a small radius rather than a capsule.

Preview
SportsCultureCareersPanduan
Show code
<Badge>Sports</Badge>

Status badges

Status is always shown in words, from one shared table in @ppitsz/ui/lib/network, so every site says “Fully booked” the same way. Tinted tones carry a small leading dot.

Preview
UpcomingRegistration openFully bookedEndedAccepted · HumasNot selectedNew
Show code
<StatusBadge domain="event" value="registration_open" />
<StatusBadge domain="oprec" value="accepted" suffix="Humas" />
DomainValueLabelBadge
eventupcomingUpcomingUpcoming
eventregistration_openRegistration openRegistration open
eventfullFully bookedFully booked
eventpastEndedEnded
formopenOpenOpen
formclosedClosedClosed
formsubmittedSubmittedSubmitted
formattendedAttendedAttended
formdraftDraftDraft
formdoneEndedEnded
formupcomingOpening soonOpening soon
formfullFully bookedFully booked
formendedRegistration closedRegistration closed
formcancelledCanceledCanceled
oprecpendingUnder reviewUnder review
oprecscheduledInterview scheduledInterview scheduled
oprecacceptedAcceptedAccepted
oprecrejectedNot selectedNot selected
contentnewNewNew
campaigndraftDraftDraft
campaignopenOpenOpen
campaignclosedEndedEnded
campaignupcomingOpening soonOpening soon
campaignonlineOrdering onlineOrdering online
campaignboothAt the boothAt the booth
campaignendedOrders closedOrders closed
orderpending_paymentNot paidNot paid
orderawaiting_verificationNeeds checkingNeeds checking
orderpaidPaidPaid
orderpicked_upPicked upPicked up
ordersendingOn its wayOn its way
orderdeliveredDeliveredDelivered
orderexpiredExpiredExpired
ordercancelledCanceledCanceled

Filter chips

A capsule <button aria-pressed> in a role="group" with a label. Pressed fills with ink and gains a leading Check. Chips filter instantly, so there is no loading state; announce the result in a role="status" region.

Preview

Showing: Sports.

Show code
<FilterChipGroup aria-label="Filter event categories">
  <FilterChip pressed={on} onPressedChange={setOn}>Sports</FilterChip>
</FilterChipGroup>
Filtering by divisionLine badges are never buttons. To filter by division, put the badge inside a chip: the pressed chip fills with ink like any other, and the badge keeps its line color.
Preview
Show code
<FilterChip pressed={on} onPressedChange={setOn}><LineBadge code="humas" /></FilterChip>

Rules

  • Tags and badges are static. Chips: hover → surface-strong, focus-visible → global outline, pressed → ink fill, disabled → subtle text.
  • When a status changes live (after a booking), announce it in a role="status" region.