Skip to content

Content Guidelines

Content is part of the design system. These guidelines ensure that text across your application is clear, consistent, and helpful — regardless of who writes it.

Tessera UI’s content voice is:

  • Clear — Say exactly what you mean. Avoid jargon, marketing language, and ambiguity.
  • Concise — Use the fewest words that convey the message completely. Every word should earn its place.
  • Helpful — Guide the user toward their goal. Tell them what to do, not just what happened.
ContextToneExample
SuccessWarm, confirming”Your changes have been saved.”
ErrorCalm, solution-oriented”That email address is already in use. Try signing in instead.”
WarningDirect, informative”Unsaved changes will be lost if you leave this page.”
Neutral / InfoFactual, brief”You have 3 pending invitations.”
Empty stateEncouraging, actionable”No projects yet. Create your first project to get started.”

Use strong, specific verbs for action labels. The label should describe what will happen when the user interacts.

DoDon’tWhy
SaveSubmit”Save” is more intuitive for preserving work
DeleteRemove”Delete” conveys permanence more clearly
CreateAdd”Create” implies something new coming into existence
Sign inLog in”Sign in” is the more widely understood term
Sign outLog outConsistent with “Sign in”
CancelClose / Nevermind”Cancel” is the standard destructive-avoidance term
ContinueNext / Proceed”Continue” feels natural in multi-step flows
DownloadGet / Fetch”Download” is specific and unambiguous
UploadAttach”Upload” is specific when files are sent to a server
  • Primary action: Verb + noun — “Create Project”, “Save Changes”, “Send Invitation”
  • Secondary action: Single verb — “Cancel”, “Skip”, “Back”
  • Icon-only buttons: Always include an aria-label with verb + noun — aria-label="Delete item"

Error messages must answer two questions: What happened? and What should the user do?

[What went wrong]. [What to do about it].
DoDon’t
”That email is already in use. Try signing in instead.""Error: duplicate email"
"Password must be at least 8 characters.""Invalid password"
"Unable to load your data. Check your connection and try again.""Network error"
"File must be smaller than 10 MB.""File too large"
"Enter a valid phone number, like (555) 123-4567.""Invalid input”
  • Never use technical error codes as the primary message (e.g., “Error 422”)
  • Do not blame the user — say “That email is already in use” not “You entered a duplicate email”
  • Provide a recovery path whenever possible
  • Use inline validation (below the field) for form errors, not just a summary at the top

Empty states are opportunities to guide users. Always include:

  1. A clear explanation of what belongs here
  2. A primary action to fill the empty state
┌────────────────────────────┐
│ │
│ 📋 No tasks yet │
│ │
│ Create a task to start │
│ tracking your work. │
│ │
│ [ Create Task ] │
│ │
└────────────────────────────┘

Do not leave empty states completely blank. An empty table with just headers and no explanation is confusing.

Confirmation dialogs protect users from accidental destructive actions. Keep them focused:

  • Title: State the action — “Delete this project?”
  • Body: Explain the consequence — “This will permanently delete ‘My Project’ and all its tasks. This action cannot be undone.”
  • Primary action: Use the destructive verb, not “OK” — “Delete Project”
  • Secondary action: “Cancel”
Use confirmationSkip confirmation
Deleting data permanentlySaving changes
Cancelling a multi-step processClosing a non-destructive modal
Removing a team memberDismissing a notification
Sending a communication to many peopleNavigation between pages

Use sentence case for all UI text. This means capitalizing only the first word and proper nouns.

Do (Sentence case)Don’t (Title Case)
Create new projectCreate New Project
Save changesSave Changes
Account settingsAccount Settings
Last modifiedLast Modified

Exceptions:

  • Product names and brand terms maintain their official capitalization
  • Acronyms remain uppercase (API, URL, ID)
  • Proper nouns are capitalized (GitHub, Google)

Placeholder text in inputs should show the format of expected input, not repeat the label.

DoDon’t
placeholder="jane@example.com"placeholder="Enter your email"
placeholder="(555) 123-4567"placeholder="Phone Number"
placeholder="Search by name or ID..."placeholder="Search"

Guidelines:

  • Placeholder text disappears on focus — it must not contain essential information
  • Always use a visible <label> alongside placeholder text
  • Placeholder color uses --ts-color-text-tertiary for clear visual distinction from entered text

These are guidelines for keeping text effective within component contexts:

ContextRecommended LengthMaximum
Button label1–3 words4 words
Input label1–4 words6 words
Input help text1 sentence2 sentences
Error message1–2 sentences3 sentences
Tooltip1 sentence2 sentences
Alert message1–2 sentences3 sentences
Modal title2–6 words8 words
Modal body1–3 sentences1 paragraph
Empty state heading2–5 words6 words
Empty state body1–2 sentences3 sentences
Badge label1 word or number2 words
Toast message1 sentence2 sentences

Exceeding these lengths is not a hard error, but it usually indicates the copy needs editing. Short, scannable text is always more effective in UI.