Search Kaotypr Design System

Search tokens, pages and quick actions

Writing

Voice, icons & motion

The non-token decisions that still need a system. Copy that sounds like the same product across surfaces, icons that don't fight each other, motion that earns its frame budget.

Content & copy

Don't

“Oops! Something went wrong. We're sorry for the inconvenience.”

“Welcome to the future of productivity!”

“Loading awesomeness…”

“Houston, we have a problem 🚀”

Do

“Server didn't answer. It gets like this sometimes — try again.”

“A design system, built because the others kept making me angry.”

“One sec — pretending to do math.”

“Couldn't reach the server. This is fine. Probably.”

Don't

“Something went wrong.” (too vague)

“Whoopsie!” (try-hard)

“Oh no, looks like you broke something.” (blames the user)

“Error 500.” (useless)

Do

“Session expired. Sign in and we'll act like nothing happened.”

“Email's already taken. Sign in or pick a new one.”

“Server's not answering. It does this sometimes — try again.”

“That file's too big. Trim it under 10MB or summon more cloud.”

Iconography

Don't

Icon-only buttons without aria-label. Screen readers announce nothing.

Two icons with similar silhouettes side-by-side (e.g. Pencil + Note). Pick one.

Icon + label where the icon is purely decorative for verbose actions (“View detailed report” — the icon adds noise, not signal).

Do

Icon-only with aria-label="Close" for universal affordances (close, expand, drag).

Icon + label for primary actions in a row of competing buttons (Add, Filter, Sort, Export).

Status icons paired with a status surface, always. Never status icon alone on a neutral surface.

Motion narrative

<motion.div
  initial={{ opacity: 0, y: 16 }}
  animate={{ opacity: 1, y: 0 }}
  transition={{ duration: 0.4 }}
  className="motion-reduce:!duration-(--duration-instant)"
/>