Press it!

PlopUI: Hand-drawn UI, imperfect on purpose.Lay it on the cutting mat

Wobbly lines, colors by instinct. It breaks the design rulebook, never the accessibility one.

Get startednpm i @plop-ui/react
PlopUI themedSticker PackReal components / Hand-drawn / Open source
Wild idea
  1. Sketched, done
  2. Inked, done
  3. Colored, current step
  4. Shipped, not started
Sketch posted
In progress
6min left
3
From Lark <3

Hey builder!
Who said UI has to be perfect?

Most interfaces look the same now: the same grid, the same radius, the same safe palette. Clean, correct and forgettable.

PlopUI goes the other way. Lines wobble, stickers sit a little crooked, and the colors come from instinct, not strategy. Every imperfection is on purpose, an experiment rather than a rule.

Break the visual rulebook all you like. The rules that keep the door open, like contrast, keyboard and screen readers, stay put. They’re what lets everyone join the fun.

Creativity is the brain having fun. This kit is mine. Go make it yours.

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

Made of paper.
Built like software.

Polaroids, tickets and notebook pages, each one a real component.

ButtonSquishes when you press it.
Piece no. 02

Tag

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

Wild ideaIn progressShipped
Admit one

Status timeline

Sketched, inked, colored, shipped. The current step boils so eyes find it.

  1. Sketched, done
  2. Inked, done
  3. Colored, current step
  4. Shipped, 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.
Zero rulers.

Drawn freehand over accessible elements. Try any of them in the playground.

How it works

Drawn by hand.
Shipped as code.

  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.
Same wobble.

Pick the paper your app sits on. Text colors adjust so it all stays readable, light or dark.

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

export default function Page() {
  return (
    <PlopProvider surface="poster">
      <Button variant="tomato" buddy>
        Post sketch
      </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.