Press it!

Hand-drawn UI for apps that can’t wait.Lay it on the cutting mat

Sticker buttons, washi-tape tags and status timelines for dispatch, field service and ticketing. Accessible, server-rendered, and they squish.

Get startednpm i @plop-ui/react
PlopUI themedSticker PackReal components / Hand-drawn / Open source
Critical
  1. Called, done
  2. Sent, done
  3. On scene, current step
  4. Done, not started
Report sent
En route
6min
3
From Lark <3

Hey builder!
Your users are having a rough day.

You 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.

Why PlopUI

Fun to look at.
Serious underneath.

A sticker on the outside, a careful component on the inside. Here's what you get with every piece.

  • 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.

  • Real elements underneath

    Buttons are buttons, switches are switches. Keyboard, focus and screen readers work before the drawing does.

  • Server first

    Static pieces are Server Components, and every wobble comes from a seed, so the server and the browser draw the same thing.

  • Every press answers

    Press a sticker and it squishes, springs back, and buzzes on a phone. Cancel shakes its head instead of throwing confetti.

  • Papers, not themes

    Poster, cutting mat, notebook, kraft and riso, light and dark. Colors, type and motion all come from tokens.

  • Kind on rough days

    Turn on reduced motion and every animation in the kit stops. State changes still show, just instantly.

What’s in the pack

Every piece is a little paper object.

Polaroids, tickets, notebook pages. Rugged on the outside, readable inside.

ButtonSquishes when you press it.
Piece no. 02

Tag

Status, as strips of washi tape. Removable ones peel off and fly away.

CriticalEn routeResolved
Admit one

Status timeline

Reported, dispatched, en route, resolved. The current step boils so eyes find it.

  1. Reported, done
  2. Dispatched, done
  3. En route, current step
  4. Resolved, not started

Switch & checkbox

The switch knob sleeps when off and wakes up when on. Ticks are drawn in one stroke.

AvatarDrawn from a name. Rosa always looks like Rosa.
Contrast receipt
EVERY FILL / ITS TEXT

  • Ink6.6:1
  • Tomato4.6:1
  • Periwinkle5.8:1
  • Mint7.1:1
  • Mustard7.1:1
  • Paper6.9:1

Total failures0
Thank you for reading every word.
The whole pack

Thirty pieces, one ink.

Each one a thin hand-drawn layer over an accessible primitive. Try any of them in the playground.

How it works

How a piece is made

  1. Drawn by hand

    Every piece starts as one cobalt marker line, with a little wobble left in on purpose.

  2. Cut like a sticker

    A paper border and a soft offset shadow, like a die-cut sheet you could peel.

  3. Real HTML underneath

    Peel one back and there's a native element: keyboard, focus and screen readers already work.

  4. Press it

    It squishes into the paper, springs back and buzzes on a phone. Go on, it's a real Button.

  5. Ship it

    Install it, put a PlopProvider at the root, and your pages render on the server with Next.js.

    npm i @plop-ui/react
Surfaces

Five papers, one ink.

Pick the paper your app sits on. Stickers stay the same; text colors adjust so everything stays readable, in light and dark.

app/page.tsx
import { PlopProvider, Button } from "@plop-ui/react";

export default function Page() {
  return (
    <PlopProvider surface="poster">
      <Button variant="tomato" buddy>
        Send report
      </Button>
    </PlopProvider>
  );
}
Five stamps!

All aboard.

You took the whole tour. Here's Holo Pip, a foil sticker for riders who finish. It's in your playground tray now, for good.