My Roles
Core Contributor
Import the Design System into Abstract
Expand Design System for iOS & Android
Getting Buy-ins for resources
Tools: Abstract + Sketch
Timeline: 2019 - 2020
Platforms: iOS, Android, and Web
Background
When I joined the company in the summer of 2018, AutoZone was in the process of building a brand new site for their B2C customers. This new "mobile-first" site will open the door for all the functionalities they wanted to add for years, updating the website to a new tech stack and expanding the backend to support the new features.
They started the project back in 2017 with a third-party digital agency (TigerSpike) on its redesign. When TigerSpike was there back in 2017, they helped our internal team start building a Design System for the new redesign, but once they left the project, the Design System's work got abandoned.
Core Challenges
Documentation
The initial work on the Design System by TigerSpike was mainly a component sheet inside a Sketch file. Most of the design has been changed after TigerSpike left, so everything that was documented was already outdated. There was a lack of user flow and no communication with the engineer on the functionality and states of the components.
Native Components
The Design System was built with desktop first in mind; there was no support for native apps. Expanding the Design System to support native apps requires a new way of building components inside of Sketch. We also had to rethink the foundations to align with Apple Human Interface Guideline and Google Material UI.
Stakeholders Buy-Ins
Not only I need get Buy-Ins from Stakeholders, I had the challenge to get Buy-Ins from my own Design Team. There was a great talk by Ed Chao on youtube on "The imposter's Design System" while he was at dropbox. Watching this talk gave me the insight to drive the conversations on continuing the work of the design system and eventually getting the resources we need to implement an enterprise-wide design system team.
“A design system acts as the connective tissue that holds together your entire platform.”
Drew Bridewell
The Prelude “The Why?”
Sketch, but also not Sketch
When I joined the company, they recently made a shift from using Photoshop to Sketch. TigerSpike recommended it as the industry standard and transitioned the entire design team from Windows-based machines to OSX. The problem was that there wasn't proper training for Sketch, so the whole design team used the same way they used Photoshop, which means that all the files had a somewhat different iteration of the same component, and there's no way to tell which file is the source of truth.
In the summer of 2018, Sketch had already added support for Nested Symbols and Link Libraries. We could've leveraged our Mircosoft OneDrive and build a shareable linked Library that hosted all the core components in theory.
Inconsistency & Inefficiency
With the lack of Documentation, there a significant issue of finding the source of truth. At the time, our team consisted of five designers working on the web. Each designer has a version of the design system they work off, but it's never synced to a central file. We were running into significant production issues where the same component would look different on different pages. Without proper guidelines to follow, the fonts, colors, and vertical rhythm looked different. Our team tried to address this issue numerous times, but it's hard, and often, we would fall back to our old ways.
Lack of Communication with Engineers
A Sketch symbol library is not a design system. Our team has no communication with the engineers that worked on the components. In result, it caused a a lot of friction between our design team and our third-party development team which was located in India. The lack of communication of engineers was one of the core factors that derail the project timeline and budget.
💡 The “Imposter” Design System
In 2019, I stumbled across a youtube video called "The Imposter's Design System," it was a talk by Ed Chao. Ed, at the time, was a product designer on dropbox's design system.
He mentioned a few key points that resonated with me on building a design system. His advice on companies who currently don't have a design system was to "fake it while you make it," basically hijack a project and let that project be the base of the new design system.
Well, that was easy. It seems all I need to fix our design system was to hijack a project. About a month after watching that video, what do you know? That opportunity came to me. 😎
The Mobile App Project
Long story short, Our Mobile Apps hasn't had a significant update since 2010. It was getting hard to add new features as the apps needs a completely refresh from the ground up. Since our web project was using React, it was an opportunity to rewrite both the iOS and Android App in React Native. Ideally, it would save time for cross-platform features and have sharable components between iOS, Android, and Web. I got assigned to be the Lead Product Designer for that project, and it was through that project, that I took the opportunity to "hijack" it and started a new chapter for the internal design system.
🏠 Abstract
Lucky at the beginning of the App Project, our team got Abstract approved from Leadership for internal use; its sole purpose was to solve our issues with syncing files and made sure we are all working on the latest version of the design system. Abstract was a lifesaver. As soon as we got the approval from leadership, I took a dive deep into testing and see how it would work within our workflow.
A New Beginning
Before importing our outdated design system into abstract, I wanted to revalue the time and resources of import the old design system into Abstract compared to just start over. I took the app project as a testing ground to see how the abstract sketch files should be structured. At the time, we have the whole design system in one file, causing Sketch to crash like crazy due to the nature of the file sizes.
Sketch has also introduced a bunch new features like Auto Layout and Components view, so I wanted to take advantage of those new features when it comes to building out the new revised Design System. There was a great article on Medium by Joe Woodward in how his team at Microsoft uses Abstract Link.
Components
One of our main objective for the new mobile app refresh was to give both apps a native look and feel to their respected platforms. This means we need to follow the guidelines provided by Apple and Google, along with building out the native components inside of Sketch.
I did an initial check of the core components and realized we are missing almost all of the native iOS and Android components. It's clear that, along with building the web components in Abstract, I would have also build out the native iOS and Android components. Thankfully, Inside Sketch, you can download the official Apple UI Library, and Google does provide a plugin for Sketch to get their latest UIkit for Material UI.
Native First, then Merge with the Web
My strategy was to first focus solely on the native components, since both Apple and Google does provide excellent documentation, I can use that as the base of the revised design system. I also dive into many other great open source Design System from IBM, Atlasssian, and Shopify. Each gave great inspiration on how to write documentation and how they manage their files.
I wanted to keep the system small, so it's easy to maintain. Remember, this was at the time just a side project of mine. Many of the foundation components are shared between the apps and the web, which also mean that the Documentation I am writing for the Mobile App can be share across platforms. My hope is that at later time, that the work I am doing now can be merge with the web to have consistency across the board.
Approval from PM
It was essential to me that all of this side work is getting tracked. I talked to my PM and Engineers, who all agreed to open tickets inside of JIRA to track the work. In each of the sprint ticket, I would list all the Design System work I would like to tackle and size it accordingly to my overall workload.
File Structure
Before Abstract, All of our symbols were inside one sketch document, along with the UI. As time goes on, these files were getting hard to maintain. With Abstract, I wanted to define a new file structure for the team. Something that simple to follow, but most importantly, easy to maintain. I divided the new file structure into four tiers.
Foundation
In the Foundation file, it have all the core "atom" components of the Design System. Include Typography, Icons, and Colors. Ideally, if any significant changes in the future, we only needed to change them here, and then they will get updated across all the files.
Platform Components
For Platform-specific components, these files will include all the native components to their respected platform. For example, iOS and Android have different navbars and modals.
Complex Components
Tier three includes all the page components built from using the foundation and platforms library. It also consists of the different states of the component and its Documentations.
UI Comps
Finally, tier four consist of the final comps ready for Dev Handoff. In this file, you can also find the user flows or any documentation that’s useful for the devs. We normally uploading everything in this file to Zeplin, which then the dev can comment and ask questions.
💎 The Revised Design System
The Foundation
Having a clean canvas allows me to rethink and rebuild that leverage all the functionalities that Sketch offered. Building complex components with overrides was a very time-consuming, but it became a time saver as we started building multiple flows with many pages.
To fix any problem, you need starts at the core. Beside inconsistency, our current design system had many issue dealing with accessibility. My goal is to build a newly revised design system that have accessibility at the foundation.
As I started building our typography system inside of Sketch, there was a huge realization, and it's that we don't own the license for Helvetica Neue. To save time and development costs, the Devs and I agreed that we will leverage the system font for both iOS and Android.
For iOS, San Fransico was recently replaced Helvetica Neue on macOS and iOS. Both Apple and Google has taken the time and resources to build out a font that’s scalable. One of major advantage of using a system font is the ability to use Dynamic Type Size, which mean it will scale to what the user had set in their accessibility setting. By using the system font, we are able to account for future development like an iPadOS app or a watchOS app.
In Sketch, I split the Typography Styles into iOS, Android, and Web with the Re-naming plugin. its easy to navigate and I have build out all the alignment as well, it does come handy when building out symbols that have text that’s center aligned or right aligned.
Since we don’t have storybook at the time, the documentations was built into the sketch file, but it was also uploaded to Zeplin for easy viewing. View the documentation for Typography below.
As for the Color System, I took the time to expand our existing color palette to have more shades and taken into consideration for Dark Mode. Along with the video by Ed Chao on Design System, I also discovered a video on Color System at Lyft by Linda Dong.
Linda talked great length on their color system at Lyft. One of the primary key points I got from Linda's talk was that each of devices can emit light differently, and that effects how color renders on those displays. Coming from a print background, this isn't new, as color accuracy is also essential when it comes to printing. Screen technology has come a long way; from the old CRTs to now OLED, there's a wide range of display technology, along with color profiles.
The color profiles are probably the hardest to tackle. When I was working on the Web, our VP had our entire top navigation color changed just because he can't see it on his screen. We later found out that his display was poorly calibrated and that the light gray we used was showing up white on the screen. Looking at our data from analytics, we have many users who still using the older iPhones and Android phones, along with a lot user who still uses an older PC operating system that probably also uses an older screen. I'm hoping to address a lot of these issues when it comes to this revised design system.
At AutoZone, we have a very limited color palette. Our core colors, you probably can guess, it's red and Orange. It was tough to design around the color orange, plus we have no complementary colors in our brand guideline 🙄. So it was either Orange or some shade of grey. My goal was to at least expand our color pallets with different shades of orange and red, plus expand our core colors to include complementary colors.
Most of the time, when using white on orange it doesn't pass ADA Compliant, and black on range doesn't look pleasing. Building UI with only Orange, Black, and 5 Shades of grey can be challenging and at time frustrating. My proposal for the Color Expansion was first to expand our current colors into shades, so we have various Orange to work with in term of “Branding the UI”
Thanks to the talk by Linda, I discovered that one for the developer at Lyft had created a tool to help create color scales. It's called Colorbox. This tool has became super helpful in creating the expansion colors for the design system.
The scale was based on Primary Color’s Saturation and Brightness, which make sense since it’s how the real world expresses shades through light. The tool also helped with colors that work well in Dark Mode. The complete Documentation can be view below.
We also leverage color tokens that can be associated with multiple roles and theme. This allows for uniform color application across themes while maintaining full styling flexibility.
“Design system tokens are meant to be flexible and work cross-platform, which means different teams, different implementations, and different libraries will name things differently. This is where this specification would fit in. A lot of interoperability could be realized, if we all, for example, named our color palette colors
and named the font sizes we use fontSizes
. What you do beyond that and what data format you use to store these values, is up to you. It’s trivial to convert JSON to ES modules to YAML or even TOML, if that’s your thing. It’s also just a data structure, so transforming between other data structures (e.g. design tools or a GraphQL API) should also be possible. This standard also wouldn’t try to solve the extremely complex problems of how to name the colors themselves.” CSS-Tricks
📁 Naming Conventions
Good Design is also Smart Design; at the beginning of this project, our entire design group didn't have a naming convention for building symbols. Every file mainly was consisted of a bunch of nested folders named "Group #."
For the new revised Design System, which will now consist of complex nested symbols, having a clean file with the correct naming convention is critical. We came up with an Emoji system when it comes to naming the symbols.
🛠 Building Nested Symbols
We decided not to import our existing design file into Abstract and build from scratch to save time. It was an opportunity to rethink how we can make these complex components in a new way that we can accommodate all the different states and styles.
The above Form input Component might look simple, but once you click on it and see the overrides, it will give a better sense how the component was structured. The goal for a complex symbol is to take into consideration all the attributes of that components. Below I will go over how we structure and build these complex components.
Base Component
We start with the foundation. For the Input Field, we begin with the background layer, which includes attributes that include Border Radius, Background color, Border Color, and Elevation Level. This base component will be the base for all input fields. In the future, if we do need to change any of the attributes, instead of manually fixing all the components, we only need this make changes to this based component.
State Components
To account for all the different states of the input field, we will split those into their symbols. For the Input Field, we split the component into Left and Right. The left and the right component will have all different states nested into that one symbol, so you can change to another state in the override panel. Along with the component states, you can also override the typography.
Complex Components
By combining both the base and state components, we now have a fully complex component for the input field. A single component can now account for all the different states and platform-specific fonts.
Overrides
Here look at the overrides. The naming convention really helps with understanding which of the attributes you are changing. Building these complex components really make one think how complex to implement the simplest components like buttons and input fields. But these components are the foundation, and its important to think to build for scale.
Documentation
At the near end of the project, our entire team was pulled to help out the web project to get it to the finish line. The documentation we wrote for the App can be applied to the Web as well since both the Web and App are using the same endpoint. All the flows and logic can be shared between the different platforms. In some way, we were able to kill two birds with one stone, which brought many dated web documentation up to speed.
Components Audit
By merging with the web, we did an audit for a lot of components like buttons and input fields and we able to address all the major inconsistency.
One of most complex component is the Button (Above). There were so many different buttons styles and type from the web. We were able to consolidate and come up with singular solution for both Web and Mobile. We listed all the categories and its variants and compared across platforms. Below is the outcome, a much simplified approach, each button also has different sizes to account for Desktop and Mobile.
Integrate with Storybook
To make sure the code and Design are in sync, we started leverage Storybook on the web project. In Storybook, we were able to have both the Design and Engineer documentation living under one roof. It was so cool to see our design component and the live component side by side. Storybook speed up the UI and brought source of truth to the overall project.
Source of Truth
With Merge with the Web and The Apps we finally for first have an source of truth that we can reference. Our Q&A team was having a difficult time validating in the past as there was no documentation on the components. Be able to provide a complete PDF of the Documentation that includes the component states and Do's and Don'ts in a JIRA ticket made the validation go much smoother. It really speed the development process as we wrote the Documentation with the developers. In result, the docs were able to save a lot time from development and QA.
The Aftermath
The "Imposter Design System" approach worked. By mid-way through the mobile app project, the work on the revised design system was finally getting traction and seeing the result. Our Design and Development time got cut in half, which we're able to pull more tickets into the sprint.
We can do iterations on the Design with the saved time and finally user testing to validate our designs. For me, all of this work was to build a case study to provide to Leadership that we need dedicated resources for the future of the Design System.
The work on the design system also helped the web project to get back on track and successfully shipped (After 4 Years). The work on the Design System was getting buy-ins from all the major cross-functional teams, even our B2B team. I'm happy to report at the time of this writing. We now have a dedicated third-party resource that is helping us to expand and continue the work of the Design System 🎉.
Lesson Learned
One of my most take awhile from working on the design system is you can't work in a silo. A Design System is a team effort, and in some cases, it's a product within the self. A Design System is useless if no one uses it. Yes, we do need the resources to guard what goes in the system, but everyone on the team can influence and improve the system. The system should reflect the overall design philosophy of the Team.
Collaboration with our engineers taught me so much about how these components behave in code. I feel I am just scratching the surface; there is so much to learn and explore on this topic. My initial reading of Brad Frost's book on Atomic Design to building the components inside Sketch has taught me a lot about System Design and System Design thinking. Sometimes, minor things like Fonts and Colors can have a huge ripple effect across the entire product.
Impacts Summary
🎯 Increase the Efficiency of Design and Development
🎯 Reusable Component Library (React & React Native)
🎯 Consistency Design Across Platforms
🎯 Approved Dedicated resources for Design System