Bootstrap and Material Design are incredibly thorough systems, so it stands to reason that many of our clients ask whether or not it’s worth the effort to create a design system from scratch as opposed to using an already mature platform.
Here’s the answer we typically give:
Start with Bootstrap or Material Design if:
Start creating a design system from scratch if:
We’ve found that teams tend to outgrow OPLs—Other People’s Libraries—at about the 3 year mark. (In this context, “outgrow” means you find yourself overriding or removing more of the library than actually using it.)
Let’s see how this works with a simple example. Say you wanted to showcase your headphone product in a card. Using Bootstrap out-of-the-box, you can use this HTML…
<div class="card" style="width: 18rem;">
<img src="headphones.png" class="card-img-top" alt="Beats Solo(3) Wireless" />
<div class="card-body">
<h5 class="card-title">Beats Solo<sup>3</sup> Wireless</h5>
<p class="card-text">$199.95</p>
<a
href="/products/headphones/beats-solo-3-wireless/"
class="btn btn-primary"
>Add to cart</a
>
</div>
</div>
…to create a card that looks like this:
If you’re satisfied with that, great! Bootstrap is a good candidate to jumpstart your design system.
But your team might not be able to live with that, because you need or want your card to look more custom:
Perhaps you’d like your brand typeface for the card heading, so you add a font-family: 'Graphik';
declaration to the card. You use an 8-point grid elsewhere, so you change all of your type sizes, padding, and margin to multiples of 8. And your house coding style is to use a BEM-like syntax, so you modify the markup from <div class="card">
to <div class="c-card">
. And you don’t want your cards so contained, so you ditch the borders.
Just for those small amount of changes, we’ve had to touch all but 2 lines of our HTML…
- <div class="card" style="width: 18rem;">
+ <div class="c-card" style="width: 18rem;">
- <img src="headphones.png" class="card-img-top" alt="Beats Solo(3) Wireless" />
+ <img src="headphones.png" class="c-card_img--top" alt="Beats Solo(3) Wireless" />
- <div class="card-body">
+ <div class="c-card_body">
- <h5 class="card-title">Beats Solo<sup>3</sup> Wireless</h5>
+ <h5 class="c-card_title">Beats Solo<sup>3</sup> Wireless</h5>
- <p class="card-text">$199.95</p>
+ <p class="c-card_text">$199.95</p>
- <a href="/products/headphones/beats-solo-3-wireless/" class="btn btn-primary">Add to cart</a>
+ <a href="/products/headphones/beats-solo-3-wireless/" class="c-btn c-btn--primary">Add to cart</a>
</div>
</div>
…and all of this CSS:
html {
- font-family: sans-serif;
+ font-family: 'Graphik', Helvetica, Arial, sans-serif;
}
- .card {
+ .c-card {
- border: 1px solid rgba(0, 0, 0, 0.125);
- border-radius: 0.25rem;
}
+ .c-card_image--top {
+ background: #deebf2;
+ border-radius: 8px;
+ }
- .card-body {
+ .c-card_body {
- padding: 1.25rem;
+ padding: 1.25rem 0;
}
- .card-title {
+ .c-card_title {
- margin-bottom: 0.75rem;
}
+ .c-card_text {
+ margin-bottom: 0;
+ }
- .btn {
+ .c-btn {
- padding: 0.375rem 0.75rem;
}
- .btn-primary {
+ .c-btn--primary {
- color: #fff;
+ color: #198ec8;
}
+ .c-btn--primary:before {
+ content: "+";
+ font-size: 1.5em;
+ margin-right: 0.3em;
+ position: relative;
+ top: 1px;
+ }
- .btn:hover {
+ .c-btn:hover {
- color: #212529;
}
- .btn-primary:hover {
+ .c-btn--primary:hover {
- color: #fff;
+ color: #0056b3;
- background-color: #0069d9;
- border-color: #0062cc;
}
And that’s all just for 1 component. Bootstrap has 24 components in it, so the lift to modify every component isn’t insignificant.
For all that effort, you might as well roll your own.
Lee Nelson has written a counterpoint to this article.
Read Next