When I joined Hasura as Design Director, I faced a challenging landscape.
Our design system was burdened with technical debt, and two previous attempts at revamping it had fallen short.
It was clear we needed a fresh approach.
Hasura's design system was at a crossroads. We couldn't afford another failed attempt.
So, what did we do?
We got smart. We got strategic. And we got our hands dirty with code.
I knew from experience that sweeping changes often lead to resistance and failure.
Instead, we opted for an incremental approach. Here's how we did it:
We also made sure to show value for each of the places where we worked on applying updates to the system.
Our secret weapons? Tailwind CSS and AlpineJS.
Tailwind's CDN allowed us to craft components quickly, without any build step.
AlpineJS handled interactions smoothly.
Together, they kept our design velocity high - barely slowing down our process to produce code-based artifacts.
We still used these internally, had lightweight systems built around them as well.
The main meat-and-potatoes of our work came from being able to meet our development team where they lived in code though.
Storybook became our go-to source for the source-of-truth for our components.
And the nice thing - if our team contributed changes to the components, it allowed the team to see changes across the app in real-time.
Tailwind's "flat" class system made these contributions more manageable, reducing cascading effects that plagued our previous SASS-based system.
Anything outside of Storybook (production) - we kept our own code-based style guide of assets and examples which we kept in-sync with Storybook's classes and styles.
Throughout Hasura V2's development, we successfully evolved our components multiple times.
We maintained a set of coded components, collaborating with developers to transform them into proper React components for Storybook.
When it came time for Hasura V3, we were ready.
We kept the familiar "feel" of the application but elevated it to new levels of polish and professionalism.
No process is perfect. Our main challenge?
Syncing changes from development back to design.
We experimented with UXPin as a potential solution.
While promising, it had some limitations. I believe there was still room for improvement for us here, to get this motion down.