Readable on every color
Each fill comes with the text color that passes WCAG AA on it, and onColor() picks one for colors you bring.
Sticker buttons, washi-tape tags and status timelines for dispatch, field service and ticketing. Accessible, server-rendered, and they squish.
npm i @plop-ui/reactYou build software for people on the line: a flooded street, a broken printer, a rider who’s late. They tap fast and read faster.
So every button should answer when it’s pressed. Every word should read on every color. And all of it should load quickly on a cheap phone.
That’s what PlopUI is for. Hand-drawn on the outside, accessible and dependable on the inside.
A sticker on the outside, a careful component on the inside. Here's what you get with every piece.
Each fill comes with the text color that passes WCAG AA on it, and onColor() picks one for colors you bring.
Buttons are buttons, switches are switches. Keyboard, focus and screen readers work before the drawing does.
Static pieces are Server Components, and every wobble comes from a seed, so the server and the browser draw the same thing.
Press a sticker and it squishes, springs back, and buzzes on a phone. Cancel shakes its head instead of throwing confetti.
Poster, cutting mat, notebook, kraft and riso, light and dark. Colors, type and motion all come from tokens.
Turn on reduced motion and every animation in the kit stops. State changes still show, just instantly.
Polaroids, tickets, notebook pages. Rugged on the outside, readable inside.
Status, as strips of washi tape. Removable ones peel off and fly away.
Reported, dispatched, en route, resolved. The current step boils so eyes find it.
The switch knob sleeps when off and wakes up when on. Ticks are drawn in one stroke.
Each one a thin hand-drawn layer over an accessible primitive. Try any of them in the playground.
Every piece starts as one cobalt marker line, with a little wobble left in on purpose.
A paper border and a soft offset shadow, like a die-cut sheet you could peel.
Peel one back and there's a native element: keyboard, focus and screen readers already work.
It squishes into the paper, springs back and buzzes on a phone. Go on, it's a real Button.
Install it, put a PlopProvider at the root, and your pages render on the server with Next.js.
npm i @plop-ui/reactPick the paper your app sits on. Stickers stay the same; text colors adjust so everything stays readable, in light and dark.
import { PlopProvider, Button } from "@plop-ui/react";
export default function Page() {
return (
<PlopProvider surface="poster">
<Button variant="tomato" buddy>
Send report
</Button>
</PlopProvider>
);
}