In this guide, we'll demonstrate how to build a structured design system, ensuring consistency, scalability, and efficiency in both design and development.
A common mistake in UI design is creating elements “from gut”, choosing spacing, font sizes, and colours arbitrarily. While this can sometimes lead to visually appealing designs, it introduces serious issues:
To avoid this, we use variables for standardised design tokens and components to create reusable elements.
Before designing components, we first need to define core variables:
Instead of defining font sizes individually, we use predefined text styles.
These styles ensure scalability and readability across all screens.
We will use the popular Inter font family throughout the project.
A structured colour system eliminates inconsistencies, and makes updating, and maintaining the design system easier.
We aimed for simplicity by keeping only a limited set of colours. A smaller palette is easier to maintain, and prevents visual clutter by providing a more consistent appearance.
We define colours under three categories:
By using design tokens (e.g., g500, p700), rather than hardcoded hex values, we ensure that updates happen system-wide without breaking UI consistency.
Sizes define the dimensions of components such as buttons, modals, and containers.
Defined size values: xxl, xl, lg, md, sm, xs, xxs
Use cases:
By keeping a fixed scale, designs remain balanced and predictable.
Spacing defines the gaps between elements, ensuring consistent layouts.
Defined spacing values: xxl, xl, lg, md, sm, xs, xxs
Use cases:
Using a consistent spacing system prevents arbitrary values and keeps layouts aligned.
Once variables are defined, we use them to create reusable components.
Buttons are essential interactive elements in any UI, allowing users to perform actions.
Defined properties:
By leaving the text empty on the button, with this component we can also create icon buttons.
Inputs must be consistent and accessible across forms.
Key features:
We've created two variants - outline and underline - and two sizes for different scenarios.
Checkboxes allow users to make clear, binary selections.
Properties:
Each checkbox should include labels for accessibility.
Modals provide structured overlays for user interactions.
Modal structure:
To prevent usability issues, modals should trap focus and support keyboard navigation.
A design system is only effective if it’s followed. Small deviations can lead to inconsistencies and hard-to-maintain code. To keep the system intact:
Avoid hardcoding values in documentation. Instead, reference the Figma design file or token system.
Example: Instead of p500 = #007AFF, use p500 - Primary Colour (See Figma).
Developers should mirror the same tokens and components from the design system in the codebase.
This eliminates the need to recalculate padding, font sizes, or colours manually.
Full designs can be found in the Figma file:
Wiki of the design system can be found in this ClickUp document.
Now that everything is ready in the design system for us to style the wireframes of the app, we are going to design each component of the tasklist app following the instructions in the user stories.
In the meantime development has been implementing the design system to code in sync with design, and we will continue to work in parallel on the user stories as well.
In the next post we will see how the design system has been implemented in code, so stay tuned!