We are on our way to have a castle of pixel perfect pretty mockups. Will that castle be but an illusion? Sorry, for being so dramatic. What I am trying to say is, we need a plan on how to build it. And here are just some of my thoughts about it π
- Have the mockups ready
- Then someone, with some knowledge of how code works, will slice it up into tickets.
- Design-person coordinates on making sure every ticket owner has what he/she/zhe needs. Hey, where do I get this font? Is this the latest icon set?
- Design-person crosschecks when itβs done. It goes up and live.
- Someone finds we used a different button somewhere. We have a ticket. Which then needs to be taken up by someone. And before we know it, we have huge piles of UX-debt. I feel this is a very probably scenario, seeing the huge scale of projects we have.
To maintain uniformity, static HTML/CSS document with all the components, buttons, colors, icons in it. Even code snippets with it. Developers can just copy paste from it. Something like this.
- As soon as itβs completed, it will be outdated. Something would have had changed by then.
- Say, we decide to make the all buttons round on MetaBrainz. We change it in our style guide. Changes donβt reflect everywhere. Some developers donβt even know, something needs to be changed.
- It will be a pain to maintain it.
So what do we do about it? We want all our projects, which have been built as independent silos over time,
to now have same cohesive user experience. They need to belong to one family.
- Shared, single source of truth. If itβs there, itβs the one.
- Organised. I know exactly where I can find that one dropdown.
- In-sync. Changes should be updated real-time.
- Self-contained. Changes to it, shouldnβt break anything else.
On doing some (actually lot of) research, I figured what we need is a component-driven design system. Okay, what is that now. Let me explain it to you.
It is a lot like the principles we are following in React. So designers still make mockups keeping the overall user flow in mind. They then break it down into elements and components.
We have elements. The Heading, links, grid icon, etc will all be treated as an element here.
And together, they make a βcomponentβ
Before
Designer: This is the new feature. We have several same looking headers.
Developer: Hmm.
After
Designer: For this new feature, letβs plug in the card_header component here.
Developer: Okay!
- All components are independent and reusable across various contexts. They speak the same design language.
- The designers can use components as the primary means of sharing the UI with application developers, instead of wireframes, mockups, style guides, or prototypes. We have a common language.
- We avoid the handoff process from designer to developer, it becomes continuous.Β
- A lot less dependency on designers.
- It will encourage contributors to contribute more freely to the library.
Very simply put, design system is a story about how we design and build products. This is how we use colors, this is how we use icons, this is how dropdowns are supposed to be, this is how buttons are to be. So if a new developer or designer comes in, it acts as a guide for them.
So now I hope, component-driven design system makes sense to you. Next thing will be how to implement it.
After exploring various options, the best suited way for our context is to have a GitHub repo with all the React components, colors, iconography, typography, guidelines, etc. We can either
- publish it as an npm package using semantic versioning
- reference git repos in package.json without publishing to npm (pushing versions as tags)
I suggest it to be something like this.
βββ README.md
βββ Design Guidelines
β βββ design_guidelines.md
βββ Assets
β βββ Colors
β β βββ colors.less
β β βββ colorspalette.ase
β β βββ color_guideline.md
β β βββ colors.less
β βββ Typography
β β βββ font_guideline.md
β β βββ font.ttf
β βββ Grids
β β βββ grid_guideline.md
βββ Components
β βββ Images
β β βββ entity
β β βββ favicons
β β βββ flags
β β βββ icons
β β βββ leaflet
β β βββ licenses
β β βββ logos
β βββ Layout
β β βββ UI Elements
β β β βββ buttons
β β β βββ links
β β β βββ ..
β β βββ UI Components
β β β βββ Cards
β β β βββ Modals
β β β βββ ..
β β βββ UI Patterns
β β β βββ Forms
β β β βββ Authentication
β β β βββ ..
β β βββ Page Templates
β β β βββ Home
β β β βββ Entity_page
β β β βββ ..
βββ package.json
βββ .gitignore
For building the React components, we can use a third-party UI library, probably Bootstrap. The design guidelines will be a set of guidelines which define how we design and build our component library.
I have not researched this part well, but we will probably use Selenium tests for impl. atoms/components
After initial setup phase, we should hope to release this for contributions and downloads. Guidelines will come in handy here to monitor the contributions we get. Once we have this for MusicBrainz, other Brainz project can possibly fork and use similar design systems for their development.
Hope this made sense. Happy Feedbacking π