Search Raihin Design System

Search tokens, pages and quick actions

Writing

Voice, icons & motion

The decisions that don't fit in a token file but still need a system. Copy that sounds like the same product across surfaces, icons that share a visual rhythm, and motion that earns the frame budget it spends.

Content & copy

Don't

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

“Welcome to the future of productivity!”

“Loading awesomeness…”

“Hey there, friend! Ready to get started?”

Do

“The server didn't respond. Try again in a moment.”

“A design system built around clear tokens and steady rules.”

“One moment — loading your data.”

“Welcome back. Pick up where you left off.”

Don't

“Something went wrong.” (too vague)

“Whoops!” (cute, but offers no information)

“Looks like you broke something.” (blames the reader)

“Error 500.” (no actionable detail)

Do

“Your session expired. Sign in to continue.”

“That email is already in use. Sign in or use a different address.”

“The server didn't respond. Please try again in a moment.”

“That file is over the 10 MB limit. Try a smaller file.”

Iconography

Don't

Use icon-only buttons without an aria-label. Screen readers announce nothing.

Place two icons with similar silhouettes side-by-side (for example, Pencil and Note). Choose one.

Pair a decorative icon with a verbose action label — the icon adds visual noise, not signal.

Do

Use icon-only with aria-label="Close" for universal affordances such as close, expand, or drag.

Pair icon and label for primary actions in a row of competing buttons (Add, Filter, Sort, Export).

Always pair status icons with a status surface. Never place a status icon alone on a neutral background.

Motion guidelines

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