Design Systems.
Build scalable design systems that ensure consistency across all touchpoints.
Below is a complete, working design system for Officiti, a B2B platform for sharing and booking workspace. It starts from the six colors and Roboto type scale in the original case study, then fixes accessibility gaps and adds tokens, components and patterns based on established UX laws and WCAG 2.2.
- Version
- 1.0
- Platforms
- iOS · Android · Web
- Typeface
- Roboto
- Base grid
- 4 pt
- Standard
- WCAG 2.2 AA
Six rules every decision is tested against.
Officiti serves working professionals who book desks, rooms and visitors on the go, often one-handed and in a hurry. These principles turn established UX research into constraints that the components below obey.
Clear before clever
Every element earns its place. Plain labels, generous space and one focal point per screen.
Aesthetic-Usability · Minimalist designFewer choices, faster decisions
Break booking into short steps and reveal detail progressively. Keep menus to five items or fewer.
Hick's Law · Miller's LawWithin reach
Primary actions live in the thumb zone with targets of at least 48 px and 8 px between them.
Fitts's LawFamiliar patterns
Use platform conventions for navigation, forms and pickers so nobody has to learn Officiti first.
Jakob's Law · ConsistencyAlways show status
Respond within 400 ms, show progress for anything longer, and confirm every result in words.
Doherty Threshold · Visibility of statusAccessible by default
Contrast, focus, labels and touch size are built into each token and component, not added later.
WCAG 2.2 AA · Inclusive designSame brand, accessible in use.
The original style guide defined six colors. They are kept as the brand identity. Testing them against WCAG showed that several cannot carry text or white labels, so each gets a darker functional variant for text and controls.
Brand colors
Use brand colors for illustration, highlights, large graphics and date tiles. Use the functional scales below for text, icons and controls.
Functional scales
What changed from the case study, and why
| Use | Was | Now | Reason |
|---|---|---|---|
| Buttons, links | #5D6DFF | #4351E8 (action-600) | White text on #5D6DFF is 4.12:1, below the 4.5:1 minimum for 14 px text. |
| Error text, destructive | #E8553E | #B5301E text, #C83E2A fill | #E8553E on white is 3.62:1. The darker steps reach 6.17:1 and 5.03:1. |
| Secondary and placeholder text | #BDBDBD | #5C5C5C / #6B6B6B | #BDBDBD on white is 1.88:1 and was hard to read in ticket details. |
| Input borders | Light gray fill only | #8A8A8A 1.5 px border | Controls need 3:1 against the background to be found (WCAG 1.4.11). |
| Text on amber and green | White | Ink #2D2D2D | White on #FFAE02 is 1.86:1 and on #89C053 is 2.16:1. Ink reaches 7.42:1 and 6.38:1. |
| Status meaning | Color only | Color + icon + word | Color alone fails WCAG 1.4.1 and excludes color-blind users. |
Contrast matrix (calculated live)
Normal text needs 4.5:1, large text and UI components 3:1, and AAA text 7:1.
| Pair | Sample | Ratio | AA text | AA large / UI | AAA text |
|---|---|---|---|---|---|
Roboto, tuned for small screens.
Roboto stays as the single typeface. It is designed for mobile, has excellent numerals for times and dates, and ships in every weight the app needs. The original scale is kept and completed, with one change: the 10 px sizes are raised to 11 px because text under 11 px is hard to read on phones.
28 / 36 · Bold
20 / 28 · Bold
16 / 24 · Bold
14 / 20 · Medium
14 / 20 · Regular, Medium
12 / 16 · Bold
12 / 16 · Regular
11 / 14 · Medium (was 10)
One 4-point grid, everywhere.
Related items sit closer than unrelated ones (Law of Proximity). Use 8 inside a component, 16 between fields, 24 to 32 between groups.
Interactive area is at least 48 × 48 px, even when the visible icon is 24 px. Keep at least 8 px between neighboring targets to prevent mis-taps (Fitts's Law, WCAG 2.5.8).
buttons, inputs
cards
sheets
avatars, FAB
cards, inputs
sticky bars, menus
dialogs, FAB, toast
One icon family, drawn on a 24 px grid.
The original set (wifi, visitors, tickets, alerts, notifications, attachments, home, calendar, dropdown, more, support, lock, back) is redrawn as a consistent outline family with a 2 px stroke and round caps, and completed with the icons needed for status, search and scanning.
Mobile first, three breakpoints.
| Breakpoint | Width | Columns | Margin | Gutter |
|---|---|---|---|---|
| Mobile | 360 to 767 | 4 | 16 | 16 |
| Tablet | 768 to 1199 | 8 | 24 | 24 |
| Desktop web | 1200 and up | 12, max width 1200 | 32 | 24 |
Fast enough to feel instant.
| Token | Time | Use |
|---|---|---|
| motion-fast | 100 ms | Press, toggle, hover |
| motion-base | 200 ms | Fields, chips, menus |
| motion-slow | 300 ms | Sheets, dialogs, toasts |
Easing is cubic-bezier(.2, 0, 0, 1): quick start, soft landing.
Every component, live and interactive.
These are real, working components built with the tokens above. Tab through them, press them and read the specs. Each states the UX rule behind it.
Buttons
aria-busy.Form fields
Selection controls
Cards and status
| State | Tile | Text on tile |
|---|---|---|
| Upcoming / info | action-600 | White · 5.86:1 |
| Resolved | green-500 | Ink · 6.38:1 |
| Pending | amber-500 | Ink · 7.42:1 |
| Not resolved | danger-600 | White · 5.03:1 |
Navigation
Feedback and status
Guests added after 6 pm are approved by the front desk.
Conference call room, 22 Dec, 1:00 pm to 3:00 pm.
Only 1 meeting room is left for this time.
Board room is booked 1 to 3 pm. Choose another time or room.
No meetings today
Book a room for a call or a catch-up with your team.
Dialogs
Components combined into real journeys.
Book a room in three short steps
The original create-meeting screen shows every field at once. Splitting it into three steps lowers the number of decisions on screen (Hick's Law), keeps chunks small (Miller's Law) and shows progress, which encourages completion (goal-gradient effect).
Ticket status system
| State | Tile | Icon + word | What it means | Next action |
|---|---|---|---|---|
| Pending | 23 | Pending | Received, waiting for the workspace team. | View details, add a note |
| Resolved | 22 | Resolved | The team marked it done. | Confirm it works or reopen |
| Not resolved | 22 | Not resolved | Member says the problem remains. | Escalate to support |
Visitor access with a QR code
- 1. Add visitor. Name, email, date, time and purpose. Fields already known are prefilled (WCAG 3.3.7, no redundant entry).
- 2. Share the QR code. Visitor receives a code with name, date and time window. It carries a lock icon and expiry so it is clear it is private.
- 3. Scan at the door. The host or front desk scans from the always-visible scan button.
- 4. Check-in confirmed. A clear success state names the visitor and host and closes the loop (Peak-End rule).
Empty, loading, error and success
Writing for the interface
Where each law shapes the system.
| Law or heuristic | What it says | How Officiti applies it |
|---|---|---|
| Hick's Law | More options mean slower decisions. | Five-item tab bar, three-step booking, one primary button per screen. |
| Miller's Law | Working memory holds a limited number of items. | Forms grouped into short chunks. Ticket details split into labeled sections. |
| Fitts's Law | Bigger, closer targets are faster to hit. | 48 px targets, 8 px gaps, full-width primary buttons at the bottom, scan button at thumb center. |
| Jakob's Law | Users expect familiar patterns. | Bottom tabs, top-left back arrow, native date and time pickers, labels above fields. |
| Doherty Threshold | Responses under about 400 ms keep flow. | 100 to 300 ms motion, skeletons after 400 ms, instant toast confirmation. |
| Von Restorff Effect | The distinct item is remembered. | Ink scan button and the single filled action button stand out from the rest. |
| Proximity and Common Region | Nearby, enclosed items read as related. | 8, 16, 24 spacing steps and cards that group a meeting's details. |
| Aesthetic-Usability Effect | Attractive interfaces feel easier to use. | Consistent radius, spacing and a restrained palette across all components. |
| Goal-Gradient Effect | People try harder as the goal gets closer. | Step progress bar in the booking flow. |
| Peak-End Rule | Experiences are judged by the peak and the end. | Confirmed booking and confirmed check-in states with clear next actions. |
| Postel's Law | Be liberal in what you accept. | Phone and time inputs accept common formats and normalize them. |
| Visibility of system status | Always tell users what is going on. | Loading, success, error and pending states on every async action. |
| Error prevention and recovery | Stop mistakes, then help fix them. | Confirm dialogs for destructive actions, Undo on toasts, inline fixes in error text. |
| Recognition over recall | Show options instead of asking users to remember. | Visible labels, attendee search with avatars, recent rooms listed first. |
Built to WCAG 2.2 AA.
- Text contrast 4.5:1 (3:1 for large text). Enforced by the functional color scales.
- UI contrast 3:1 for input borders, icons and focus rings (WCAG 1.4.11).
- Target size. 48 px minimum interactive area, well above the 24 px AA requirement (2.5.8).
- Keyboard and switch access. Every action reachable in a logical order, no drag-only interactions (2.1.1, 2.5.7).
- Visible focus. 3 px ring with 2 px offset on every interactive element (2.4.7, 2.4.11).
- Labels and names. Visible labels on fields and accessible names on icon-only buttons (1.3.1, 4.1.2).
- Errors identified in text with an icon and a suggested fix, linked with
aria-describedby(3.3.1, 3.3.3). - Not by color alone. Status uses color, icon and words together (1.4.1).
- Zoom and reflow. Layout works at 200% text size and 320 px width without horizontal scroll (1.4.4, 1.4.10).
- Reduced motion. Animations are removed when the user asks for less motion (2.3.3).
- Consistent help. Support stays in the same place on every screen (3.2.6).
- Easy sign-in. Password managers and paste work, and QR sign-in has an alternative (3.3.8).
- Expiring QR codes. Show the expiry time and allow a refresh, so timing is adjustable (2.2.1).
- Redundant entry. Known details such as company and email are prefilled (3.3.7).
One source of truth, ready to ship.
These are the exact custom properties powering every component on this page. They are read straight from this page's stylesheet, so the code below can never drift from what you see. Map the same names to Figma variables and to platform themes.
Keeping it consistent as it grows.
- 0 · Cover and changelog
- 1 · Foundations. Color, type, space, radius, elevation, icons, motion.
- 2 · Components. Variants for state, size and type, built with auto layout.
- 3 · Patterns. Booking, tickets, visitor access, states.
- 4 · Templates. Mobile and web page starters.
color/primary/600, space/4, radius/sm, type/bodyButton / Primary / Default, Field / Text / Error--color-* or --primary-* tokens and of-* component classes.- 1. Propose. Describe the user problem and where it appears.
- 2. Check reuse. Can an existing component or variant solve it?
- 3. Design and review. Include all states and pass the accessibility checklist above.
- 4. Document. Add usage, specs, do and don't, and the UX rule it follows.
- 5. Release. Publish with a changelog entry and notify design and engineering.