Calliper Design System

Calliper Design System

Building a design system that's user-friendly and also fosters team collaboration.

Building a design system that's user-friendly and also fosters team collaboration.

Overview

We decided to update the UI and UX of the whole app. To do it efficiently we created the Calliper Design System. It's the strong base for all our design work, making things consistent and work well across different parts of the app.

We created it with slot system. Imagine it like fitting puzzle pieces together: small components fitting into slots in pages, cards etc.

We wanted Calliper to not only make the app consistent but also make designing easier for us by ensuring better designer onboarding, and design collaboration between design, engineering and product managers.

Role

Designer

Team

Uendel Quintela, Lead Designer

Uttkarsh M, Designer

Meghann Chawla, Designer

Eduardo Roisman, Design Operations Lead

Company

Popup - a no-code e-commerce store building app

Year

2022 - 2023

Highlights

Context

We needed a transformation.

We needed a transformation.

Users were confused.

Users were confused.

We received user feedback highlighting confusion due to inconsistencies in the app. This prompted the Admin 2.0 project, where our goal was to revamp the admin view's appearance and to enhance the overall user experience.

Problem

Designing without a proper system is like juggling in the dark.

Designing without a proper system is like juggling in the dark.

Lack of clear structure and consistency.

Lack of clear structure and consistency.

As we worked on improving Popup's look and feel, we noticed some issues.

Inconsistent UI. Improper visual hierarchy in terms of colors and texts.

User Confusion. Different patterns for doing similar things confused the users.

Popup’s old UI

Need for reusable and flexible design elements.

Need for reusable and flexible design elements.

As Popup was gaining more users we found ourselves frequently tweaking and adding new features.

Detached instances. Lots of Figma instances were detached from it’s component to fit new needs.

Slow Design and Development. Starting from scratch for improvements or new features was time-consuming.

THE CHALLENGE

Build a system that's not just easy on the eyes, consistent for users, but also seamlessly reusable and flexible, creating the perfect playground for team collaboration.

Build a system that's not just easy on the eyes, consistent for users, but also seamlessly reusable and flexible, creating the perfect playground for team collaboration.

Now the next steps were:

Now the next steps were:

Screen Audit. Check all screens to figure out what layout and components we needed.

Design System Foundation. Formulate the colors, typography, the whole shebang.

Component Library Creation. Build the component library with slot system.

Documentation. Create proper documentation for easy collaboration.

Workflow. Roll out a workflow for using and creating components.

Foundation

Fixing the basics.

Fixing the basics.

We need more colors..and better naming conventions.

We need more colors..and better naming conventions.

Colors are a big deal for any interface and we noticed we only had a few shades of grey - that wasn't cutting it for a solid visual hierarchy.

The naming conventions relied on generic names like Neutral Light, Neutral Dark, and simply Neutral. While easy to recognise, this method was not scalable as we wanted to add more colors.

Old neutral styles

Cooler, cohesive and accessible colors.

Cooler feel. Tweaked the base grey a bit towards blue and upped the saturation for a slightly cooler feel.

Cohesive Palette. Used HSL to generate more colors ensuring a cohesive palette.

Accessibility. Validated the colors with WCAG 2.0 rules to maintain proper contrast and accessibility.

Updated neutral styles

Scalable and tokenised names.

Scalable and tokenised names.

Scalable names. Introduced incremental numbers to our names, maintaining a 100-gap between adjacent places to easily inject values inbetween.

Tokens. Converted it to tokens to ensure that designers and developers use the same language to refer elements for clear communication.

Neutral styles with new naming convention

Hello Purple!

Hello Purple!

And for a bit of fun, we decided to say goodbye to the usual blue and welcomed a fun purple as our primary color.

New primary styles

Cleaning the text styles.

Cleaning the text styles.

We identified and removed unused and rarely used text styles, keeping only those essential for our needs.

Old text styles

New text styles

Tokenised text styles.

Tokenised text styles.

Finally, converting names to tokens gave us clear and concise text styles—ta-da!

Tokenised text styles

Layouts

The Big Bang Theory

The Big Bang Theory

LAYOUT

LAYOUT

The layout audit.

The layout audit.

We finally had to face the devil, over 10 page layouts that were confusing and redundant. We dove into each layout, meticulously found the things they had in common, and merged the similar ones.

Layout study to identify commonalities

Less layouts = better consistency and velocity.

Less layouts = better consistency and velocity.

We narrowed it down to 3 page layouts that could help us design and build with consistency and velocity.

Index Page Layouts. Layouts for showing indexes across different domains.


Resource Page Layouts. Layouts for displaying items found in the index pages.


Settings Page Layouts: Layouts for managing account settings, preferences, and store configurations.

Streamlined layouts

Library

Creating components from scratch.

Creating components from scratch.

Existing components were outdated.

Existing components were outdated.

Figma introduced 3 new Component Properties in their Config 2022 conference. It was introduced to reduce variant proliferation and code align your design system for a smoother handoff.

As the existing components were built before this release, it only had variant properties.

For a better system, we needed to create everything from scratch – from buttons, input fields to tables and everything in between with the new properties.

Old button component with many variants

Creating components from scratch.

Creating components from scratch.

For a better system, we needed to create everything from scratch – from buttons, input fields to tables and everything in between with the new properties.

We created a total of 70 components. I’ll document some important components in the sections below.

List of components in Calliper system

Appropriate properties = better collaboration.

Appropriate properties = better collaboration.

Along with variant property, we designed components with the 3 new properties - text, boolean and instance swap. This improved how components are handled and used by the team.

Leaner file. It reduces the number of variants needed for each component, keeping the library file leaner.

Better onboarding. It will be much easier for new designers to understand which parts of a component can be changed.

Bridges the gap. These properties are closer to the attributes used by developers leading to a better alignment between design and code.

New button component

Button specifications and component properties

Workflow

A solid system is not just styles and components but also an efficient workflow.

A solid system is not just styles and components but also an efficient workflow.

Every pixel deserves a safe space.

Every pixel deserves a safe space.

Working in a team of designers, having a well-defined workflow is crucial for ensuring better collaboration and velocity.

To keep the main file safe from unintentional loss or edits, we utilized Figma branches to make edits to the main file. Each component was created in a branch and merged once completed.

Screenshot of branches from a year ago

Better organisation.

Better organisation.

We organized components, styles, and icons into separate files within the design system folder for easy maintenance and access by all stakeholders.

Design system file organization

A checklist to keep us in order.

A checklist to keep us in order.

Along with other steps in our workflow, we maintain a checklist of over 10 items for each component task on ClickUp.

For instance, to maintain low Figma memory usage, instead of creating variants for Switch component with and without Label, the checklist urges us to use boolean properties to manage Label visibility.

Switch component with variant property for Label

Switch component with variant property for Label

Switch component with boolean visibility property for Label

Switch component with boolean visibility property for Label

Reduced file memory usage.

Reduced file memory usage.

This approach significantly trims the number of layers in a component, consequently reducing the memory usage of the component library file and the files in other projects where we use these components.

Figma doesn't just load the instance variant you've added to a file; it also loads all other variants of the component, increasing the file's memory usage.

Less memory usage in files means faster loading times and smoother merging, reducing the risk of 'file out of memory' errors.

Number of layers in Switch component with variant property for Label

Number of layers in Switch component with variant property for Label

Number of layers in Switch component with variant property for Label

Number of layers in Switch component with boolean visibility property for Label

Number of layers in Switch component with boolean visibility property for Label

Number of layers in Switch component with boolean visibility property for Label

Every step in our workflow fosters team collaboration.

Every step in our workflow fosters team collaboration.

It's not a one-time fix; we continuously update it to address the new challenges we encounter.

Clean and Safe. Name and lock all layers to ensure component integrity.

The leaner the better. Utilize boolean and instance swap properties to reduce memory usage.

Documentation. Provide detailed specifications and component properties.

Branch discipline. Always update from the main file in branches to prevent loss of merged work.

Branch link. Link branches to ClickUp tasks for easy access to all stakeholders.

Request Review. Lead Designer, Lead Developer and PM review and approve the branch for validation.

Component creation workflow

THE HIGHLIGHT

In our component creation workflow, every step is a building block for stronger collaboration within the design team and beyond.

In our component creation workflow, every step is a building block for stronger collaboration within the design team and beyond.

Slot system

Building a system that would fix things now but also work well for future updates.

Building a system that would fix things now but also work well for future updates.

One component, multiple applications.

One component, multiple applications.

We use the Resource List component to present different types of resources—products, users, payment accounts, etc. With the help of slots and boolean properties, we can customise it for different contexts in a way that design systems allows us – without the need to detach instances.

Thanks to Figma's Auto Layout, our components dynamically resize and space themselves based on their content when updating the content of a slot component.

Using Resource List component for different contexts

Slots bind the design system together.

Slots bind the design system together.

The slot system is built using placeholders (slots), making it super easy to make our own complex component instances by swapping placeholders with small components.

This flexibility will save us from starting from scratch every time we wanted to improve an existing feature or create a new one.

Flexible. Ability to customise components for different contexts without the need to detach instances.

Consistent. Ensures a consistent layout structure and spacing while accommodating varying content.

Time efficient. Structure and layout are already ready to roll. Designers just swap components in the slots based on requirements.

Swapping a slot with different components in Card component

Section component.

Section component.

The Section component is a key nested component in cards, modals, and slideovers, featuring a title, description, action, and multiple row placeholders.

Section component properties

Placeholders.

The row placeholders are component instances allowing us to swap them with various components like text inputs, banners, tables, resource lists, etc., based on specific needs.

A row placeholder can also be swapped with a
stack row placeholder component to group elements in a section.

Row placeholder components

Card, modal and slideover.

Card, modal and slideover.

Card, modal and slideover components are built with multiple sections nested inside. This gives us the ability to customise these components based on specific needs.

Card, modal and slideover components

Using appropriate properties to get the most out of the slot system.

Using appropriate properties to get the most out of the slot system.

We added appropriate component properties to all these components to seamlessly utilize them across different areas within the product.

Boolean properties. To show or hide title, description, action, and each row as needed.

Instance swap properties. To quickly swap rows with different components.

Text property. To easily edit content in title and description as all layers are locked.

Nested properties. To easily edit nested instances we exposed nested instance properties as all layers are locked.

Card component instances used in the app

Page component.

Page component.

We created the page component with multiple card components nested inside.

This allows us to create pages for different contexts using the same component.

Page component variant and Order page created using the variant

Page component variants.

Page component variants.

In response to additional requirements from Admin 2.0, we introduced three additional variants to the component.

Index Page Layout. Layouts for showing indexes across different domains.

Table Index Page Layout. Layouts for showing table indexes and empty states across different domains.


Resource Page Layout. Layouts for displaying items found in the index pages.


Settings Page Layout. Layouts for managing account settings, preferences, and store configurations.

Sub-page Layout. Layouts for sub-flows across different domains

Single Column Layout. Layout variant for small screens.

Page component

Hierarchy.

Hierarchy.

Row placeholders (slots) are part of sections, nested inside cards, which, in turn, are nested within pages.

Nested component hierarchy

High memory usage and merging errors.

High memory usage and merging errors.

One significant challenge with the slot system is its tendency to result in high memory usage, especially with components nested inside one another.

While working on the Admin 2.0 project, we encountered difficulties merging branches due to this high memory usage.

‘File out of memory’ error encountered in Admin 2.0 project

We did some investigation..

We did some investigation..

And guess who was the culprit? Yep, the page component.

It featured six variants, each with multiple nested cards, and each card contained multiple nested sections.

Consequently, every time we added a page instance to a file, it loaded around 20000 layers!

Layers in page component with nested cards

Replaced cards with placeholders.

Replaced cards with placeholders.

Turns out, we didn't even need all those cards every time. Usually, just 3 or 4 did the trick.

So, to fix this mess, we replaced the cards with slots. Now we only add the cards into those slots when we need them.

This brought the layer count down to 5000, significantly reducing the Figma memory usage.

Layers in page component with nested slot placeholders

THE HIGHLIGHT

The slot system with boolean component properties allow us to use these components for all scenarios in the app without detaching any.

The slot system with boolean component properties allow us to use these components for all scenarios in the app without detaching any.

Pages created using Page component

Documentation

Bridging gaps with documentation.

Bridging gaps with documentation.

Clarity on component structure and behaviour.

Clarity on component structure and behaviour.

Documenting components is crucial for collaboration.

Each component's specifications, properties, and instance matrix are detailed on its dedicated page, serving as a reference for clarity on structure and behavior.

It includes intended use, design specifications, and instance matrix for consistent implementation by the team.

Documentation for Thumbnail component

Documentation for Checkbox component

Documentation for Combobox component

Versions and changelog.

Versions and changelog.

We also added versioning and changelog to document the changes we make to the components.

This helped us and the engineers track modification and ensure alignment between the designed and developed components.

Documentation for Combobox component

Enhancement

Need for a touch up in the workflow.

We needed new components.

We needed new components.

As the Admin 2.0 project unfolded, despite our efforts to adapt existing components, we recognized the necessity of introducing new components to our library for some use cases.

Moreover, the implementation of these components in the project exposed bugs/issues in them.

A workflow to request new components and report bugs.

A workflow to request new components and report bugs.

As a result, we identified the need for a subflow in our component creation workflow to request new components and report bugs.


The goal was to ensure that the Admin 2.0 project wouldn't be hindered by the requirement for new components.

New components. Workflow to request and add new components.

Bugs/issues. Workflow to report and fix bugs in components.

Time efficient. Needs to be time efficient to ensure no delay in project timeline.

THE CHALLENGE

Create a workflow for adding new components, fixing bugs in existing ones, all while ensuring no delays in the Admin 2.0 project.

Create a workflow for adding new components, fixing bugs in existing ones, all while ensuring no delays in the Admin 2.0 project.

Introducing the concept of Proposals.

Introducing the concept of Proposals.

Recognizing that the process of creating, validating, and adding a new component to the library could take some time, we were determined not to cause delays for designers working on Admin 2.0.

To address this, we introduced the concept of Proposals.

Picture this: You identify the need for a new component, inform the design system team, and while they work on the official version, you swiftly put together a rough component (Proposal) for immediate use.

The proposals are named with the prefix 'Proposal' for easy identification in the Admin 2.0 project files.

A proposal component to show plan details

Swift and simple.

Swift and simple.

This allows designers to continue their work seamlessly without waiting for the final component and it can be quickly put together and validated through comments.

Proposals also act as a reference for the design system team.

Validating the proposal with the product manager in Figma comments

The Component Library Task.

The Component Library Task.

We made a form on ClickUp - Component Library Task. When you submit it, a task is automatically generated in the Component Library project board.


This form serves a dual purpose, allowing us to request new components and report bugs in existing ones.

Screenshot of the Component Library Task form from ClickUp

The updated workflow.

The updated workflow.

With the addition of proposals and the form to our workflow, Admin 2.0 projects proceed seamlessly without delays.

Updated component workflow

Retrospective

This was the longest, one of the most challenging and best project I’ve ever worked on!

This was the longest, one of the most challenging and best project I’ve ever worked on!

We underestimated the time it would take a build a system like this.

We underestimated the time it would take a build a system like this.

When we started the project we underestimated how much time this would take. It took 100% effort from each member of the team for about a year to reach the here. This project has been one of the most challenging and undoubtedly one of the best projects I've worked on.

Screenshot of a meme about the project during a Town Hall meeting

Takeways:

Takeways:

Over-communicate. Communication is key, especially in remote work. I make sure to share as much details as possible in my messages and comments because it's easy for information to get misinterpreted.

Keep everyone in the loop. When we encounter edge cases and find creative solutions, it’s crucial to share these experiences with the team so that everyone understands why we tackled them the way we did.

Workflows are time-efficient in the long-run. Creating a ClickUp task for every change, checking off each item on the checklist, creating a Figma branch for every task, etc seemed repetitive and time-consuming at first. But with a big team, these steps are important. They keep everyone in the loop and help us collaborate better.

File organisation. Keeping the files organised and tidy from the start saves a load of time and chaos.

© Priyanka Raja, 2024

Made with love and lots of coffee.

© Priyanka Raja, 2024

Made with love and lots of coffee.

© Priyanka Raja, 2024

Made with love and lots of coffee.

© Priyanka Raja, 2024

Made with love and lots of coffee.