Config 2025: Building design systems together with Jake Albaugh & Chad Bergman | Figma
By Figma
Summary
Topics Covered
- Design Is Important: A Controversial Figma Take
- Pixel perfect code is often the wrong code
- Shared understanding is the real design system unlock
- Bring Developers into Design Early to Uncover Hidden Opportunities
- Alignment Is Constant — Patterns Emerge from Shared Decisions
Full Transcript
[Music] [Applause] [Music] We're so excited to be here.
Hello, my name is Chad. I am a designer advocate here at Figma. And I'm Jake, a developer advocate at Figma. And as advocates, we work in the
Figma. And as advocates, we work in the community with customers, sharing best practices while learning how folks are working with Figma so we can bring that back to our product
teams. Today, we're going to be talking about building design systems together. We're going to break it up
together. We're going to break it up into two sections. In this first half, we're
sections. In this first half, we're going to be talking about design and design systems. And in the second half, we're going to hop into some files and the codebase to see how it all plays out.
So, let's get started. All right, Jake. So, design
started. All right, Jake. So, design
systems, huh? They're drivers of consistency, efficiency. We don't have to reimagine
efficiency. We don't have to reimagine everything every time. But sometimes we
time. But sometimes we do. We do, right?
do. We do, right?
Why is it just because we want to? Or
maybe we don't really have a system yet. Today we're going to be talking
yet. Today we're going to be talking about building design systems, but we're not going to talk about starting from scratch. All right, defining our color
scratch. All right, defining our color and our type ramps, building our very first components because there's already a ton of fantastic content out there around that. Whether that lives on
around that. Whether that lives on Figma's blog, Shortcut, designsystems.com, and so many places all over the internet, where maybe you've even created some of that content
and shared it with the world. But Chad, before we go any
world. But Chad, before we go any further, I've got something I'd like to get off my chest. All right, Jake, I'm going to let you get to that.
Amazing. The future is very exciting.
We have so much to look forward to in product design and in development. But the
development. But the present, it's kind of feeling a little bit chaotic. New
chaotic. New technologies shifting paradigms, artificial job applicants, and an alarming number of sci-fi plot
points playing out in real life.
We're left asking ourselves what changes, what stays the same, and I think most
existentially, what is our place in it all? Well, we have some
all? Well, we have some answers. We know that design is
answers. We know that design is important. I know. I know. Controversial
important. I know. I know. Controversial
take for a Figma conference.
pick those jaws up off the floor. But in
a time where so much about what we do and how we do it is rapidly changing, I think it's important to start with the one thing that will
always stay the same.
Design is important to designers, to developers, and to those who hear the phrase boolean properties and
think. I don't know if I've seen that
think. I don't know if I've seen that one yet. We all desire to be
yet. We all desire to be considered and good design is considerate. And this is a deeply human
considerate. And this is a deeply human thing.
And that's why design is bigger than simply the way things look. Design brings
look. Design brings consideration into a product. And this
is so much greater than a theme or something you can just handwave around and dismiss its core purpose. We also know it's never been
purpose. We also know it's never been easier to make something. And that's
incredible news, too. But we know standing things up is
too. But we know standing things up is the easy part, but making meaningful things is hard. What delights a user? What enders
hard. What delights a user? What enders
them to our products? Well, we know that touch makes
products? Well, we know that touch makes products meaningful. Touch is how we
products meaningful. Touch is how we consider the experiences of those that we design for.
So when we ask ourselves what should be automated, a framing that I prefer is what should be left to touch. And boy is that a question we
touch. And boy is that a question we hear all the time in design systems. Walking the line of flexibility and
consistency is hard and ultimately a question of touch.
So design is important, arguably more now than ever before, and design systems are the abstractions that help make that design
real. That's the good
real. That's the good news. But let's be honest, design can
news. But let's be honest, design can often be a very inefficient a part of product product development. Despite its importance,
development. Despite its importance, design intent can be hard to see through to production. And this is because
production. And this is because designing and building are different. Product design requires
different. Product design requires expression discovery iteration. It's far easier to iterate on
iteration. It's far easier to iterate on things in a malleable state, and design tooling provides that flexibility. With
new tools like Figma make code can also be a medium for discovery and increase the fidelity of the experience. But that's very different
experience. But that's very different than production code. Production code is about precision
code. Production code is about precision and execution more than it is exploration. And in this sense, two
exploration. And in this sense, two distinct environments are required to make a good product real. And this is why pixel perfect code
real. And this is why pixel perfect code is often not the right code. The perfect
code is aligned to design intent, not pixels. Here's a simple
pixels. Here's a simple example. There are many ways to describe
example. There are many ways to describe these four columns visually. We can see fill container 400 pixels quarter
25%. There are also many ways to
25%. There are also many ways to describe this in code. If we were to refer to this kind of flexible behavior with flex and CSS, we can account for
that with something like flexbox. Or we can do calculations that
flexbox. Or we can do calculations that account for the size of those three two REM gaps between each column. But these quarters might
column. But these quarters might transform into thirds on different devices. And now our nice round values
devices. And now our nice round values are looking pretty gnarly. In code, we have to now go and
gnarly. In code, we have to now go and change these values that are in our calculation cuz this is now two gaps split three ways. And so what ends up happening is
ways. And so what ends up happening is we abstract this on the code side. And
our calculation might look something more like this. It's more flexible. It's
more complicated, but it's more flexible. And as we can see, this has
flexible. And as we can see, this has made quite a departure from the paradigm that we had in design.
It's because design and code are optimized differently. Even in that last
optimized differently. Even in that last example, the patterns we build around design and development had discrepancies and variance. This isn't a
variance. This isn't a problem. It's actually a good
problem. It's actually a good [Music] thing. We're approaching the same
thing. We're approaching the same destination from different points of origin.
Therefore, not all of our routes towards that destination are going to be parallel. While our abstractions may
parallel. While our abstractions may occasionally be at odds, it's helpful to recognize that we actually share a love for patterns. There's nothing worse than
patterns. There's nothing worse than spending a bunch of time crafting something than changing your mind and needing to manually update things across many different places. patterns. Get
this out of that problem. We make abstractions to make
problem. We make abstractions to make building easier. Whether this is
building easier. Whether this is behavioral patterns, typography patterns, file structures, naming conventions, information architecture, these are all examples of the ways
designers and developers build abstractions.
Patterns also make things usable for people and that is a human- centered pursuit. In the case of design systems,
pursuit. In the case of design systems, designers and developers, we consider the future maintenance of what we are creating that some future designer or
developer are going to have to perform on our code or our design.
We also consider the experience of the people that will be using those same patterns as users in the product. Design
product. Design systems are where we can apply our consideration for people and passion for patterns towards
a shared outcome. They're a perfect blend of codebase and design abstraction that when executed well are easy to
maintain, iterate on, and hand off to others. So, what is an approach to this
others. So, what is an approach to this look like? I'll hand it to you,
look like? I'll hand it to you, Chad. Thank you, Jake. That was awesome.
Chad. Thank you, Jake. That was awesome.
Oh thanks Chad.
All right. So, as Jake was saying, the first
right. So, as Jake was saying, the first thing we can do is start recognizing and leading into the patterns around
us because patterns create efficiency. They stem from our aligned,
efficiency. They stem from our aligned, repeatable decisions that were made at least at some point along the way. And
when we can repeat things, it helps us to get faster, hopefully with less frustration because it's already been done at least once. All right, question for y'all.
once. All right, question for y'all.
Raise your hand if you've reused a color, a button, spacing, value, whether this is in design or
code. All right, seems a lot of us have
code. All right, seems a lot of us have reused stuff, right? Well, great. You've
used a repeatable pattern. And after
all, as Jake said, designers and developers, we love patterns. We're both
pattern-minded. We design our reusable patterns around things like typography, spacing, scale, layout, and color. And
then we reusable patterns to make our design language come to life in a product.
And though design and code are different languages, we have the same goal and we're building the same thing. As designers, developers, we want
thing. As designers, developers, we want to reduce rework. We want to make sure that we are staying consistent in the work we're doing. And we ultimately want
to move faster as we build. I think it's safe to say that we want to make it so that the next thing is easier to build than the last.
So instead of orienting our perspective around, well maybe I'll get 70% of what I intended with this design, we should think about achieving
100% of what we can build when we do it together. And yeah, design systems are
together. And yeah, design systems are great for helping with this. Whether
we're building a system or we're consuming assets from a system in our designs, if we're working together towards the same goals, we should be
able to get to 100% of what we intended when we're doing it together. All right, one more question
together. All right, one more question for you. Do you have a design system?
for you. Do you have a design system?
We've reused patterns, but raise your hand if you work with a formal recognized design system with your organization. Maybe you have some
organization. Maybe you have some dedicated resources including teams of one. All right, awesome. Now raise your
one. All right, awesome. Now raise your hand if you have something that maybe it's not a formal design system. Maybe
it's something scrappy or informal. You
question if it's a system or not, but it helps you out. All right. Awesome.
out. All right. Awesome.
Well, like I said, if it's repeatable pattern of some kind, if it helps bring efficiency to your work, it's kind of a system in some way, shape, or form. And
I think we can say that we're kind of all on a design systems journey in one way or another. Maybe right now you have a
another. Maybe right now you have a halfozen, maybe a dozen color styles.
You might have some variables, handful of components, t-shirt size, naming conventions. Your buttons, they might be
conventions. Your buttons, they might be blue. Not for any given reason other
blue. Not for any given reason other than your brand team said, "Hey, let's have blue buttons." And it may not look like other
buttons." And it may not look like other design systems that we learn from. UI
kits in the Figma community. Checking
out public-f facing code repos and documentation sites. The ones that we
documentation sites. The ones that we love to gain inspiration from semantically named variables, intuitive component architecture, clear guidance
documentation with product use cases already accounted for. The dream or is it? Keep in mind that your design system
it? Keep in mind that your design system in whatever state it's in, it's real and it's addressing your current needs and those for your organization at this
point in time today. That's what's
important. Solving for the needs of today. You don't need to build out a
today. You don't need to build out a meticulous system in anticipation of any future well what if use cases that may
not actually come to be. After all, I mean, product teams,
be. After all, I mean, product teams, they're generally going to move faster than design system teams. So, if you're working on a design system, it's okay to address those future needs as they
happen in the future once you know what those real use cases are.
And no matter what size or shape that your system starts in, there's going to be time at some point, whether that's months later, weeks, maybe even days or
hours, your system will run into some new use cases and it's going to need to grow. And I think it's important to
grow. And I think it's important to acknowledge that when a system is growing, it could introduce friction.
You know, things they start to happen one by one. They may seem innocent. We
start to add some variables to the library. Maybe we create a few new
library. Maybe we create a few new components. Those blue buttons now have
components. Those blue buttons now have eight more variants for use in different product areas. And our t-shirt sizing scale. We
areas. And our t-shirt sizing scale. We
need to add a new value in between medium and large. I mean, we could shift our values, but that could break things, right? Well, we'll just introduce a new
right? Well, we'll just introduce a new size like midarge. Or what about when we need
midarge. Or what about when we need something that has to exist outside of any existing convention in our system because marketing experimentation,
right? The system starts to hit its
right? The system starts to hit its limits in its current state because it's shifting to meet the real use cases of those who are using the system. It
doesn't mean that the system is broken.
It's all right. It means that the system is maturing because hitting the limit can be a sign of growth.
After all, we're not just reusing colors or components anymore, but we're starting to build these larger, more connected, more composable patterns. Things we think of like maybe
patterns. Things we think of like maybe different variations and treatments for cards, modals that have different behaviors or notifications that need to show a specific icon or call to action
depending on the context that they're used within. These are just a few examples
within. These are just a few examples that we may be familiar with. really the
list can go on and on. And as we start to increase that
on. And as we start to increase that complexity, it it's okay. It can feel a bit overwhelming because now you make a change in just one place and it might touch five
others. That little simple variable
others. That little simple variable update, well, it might break a pattern or a new variation. We have to make sure that we're accounting that it'll work
across a light mode, dark mode, high, low, contrast, maybe four different densities, all while ensuring that all of our accessibility standards are
met. So when systems are evolving,
met. So when systems are evolving, collaboration and alignment become even more essential. So where are some areas that
essential. So where are some areas that we can align as we start to evolve our system?
Well, first and foremost, we need to make sure there's alignment around the scope of these updates and our responsibilities. How are decisions
responsibilities. How are decisions going to be made? Like Jake said, what's flexible and what's fixed? What makes a pattern useful and scalable? And also the question of, hey,
scalable? And also the question of, hey, should this even exist in our design system or should a product team own this for the time being?
We also need to make sure that we have alignment on working within our constraints. What that means is planning
constraints. What that means is planning for the impact of cascading changes across the system and anywhere that those are used in designs. We ultimately
want to mitigate breaking changes as much as possible. Think about typography as an example. If we change our base font weight from regular to medium,
that's going to cascade through nearly everything in the system. Also, we need alignment on how
system. Also, we need alignment on how we're going to plan for and address invisible states. Teams, they implement
invisible states. Teams, they implement forms differently across different features or what happens when there's user provided content that maybe we
haven't considered in our design systems concepts.
And finally, you know, make sure that we're aligned on how we're optimizing our patterns for where and how people are going to interact with them. If
we're building something responsively, is it pixels or percentages, flexbox or grid? How are we going to refflow
grid? How are we going to refflow content across different screen sizes?
We also need to align on items that are often not factored in to our designs, but they're required in code. focused
visible states, tab ordering, Arya labels and roles. We need to make sure we have alignment around this because ultimately what I'm trying to say is we want to make better
decisions for our design systems together. And that's one of the real
together. And that's one of the real unlocks for a mature system. It's not just making more
system. It's not just making more components to have a bunch in there, variables, tokens. While automation
variables, tokens. While automation documentation is cool, it's not that either. It's the shared understanding
either. It's the shared understanding and responsibilities between us as designers and developers as we're working
together. So, let's take a look at what
together. So, let's take a look at what this collaboration can look like in practice. Yay, demo
practice. Yay, demo time. Nice job, Chad. Thank you,
time. Nice job, Chad. Thank you,
Jake. All
right, so here's what we're building. Chad and
I put together a nice little uh company called VHS Vault where you can rent VHS tapes through physical mail. Um you
might have seen some trailers for these movies uh and and be interested in watching later. Um but we also have in
watching later. Um but we also have in addition to a homepage, we have a nice product page. We can see Boolean
product page. We can see Boolean Properties 2 just came out. That's
exciting.
Um, we also have a checkout flow uh and uh an account page as well. We're using
grid in here which is really exciting.
Um, but in addition to kind of these product designs um we also have it working over here. So we've built out a very basic design system in code using
web components to represent this. Um, we
didn't build an entire design system.
That would be a really wild idea to try and do that before config. Who in their right mind would do that? I don't think we're at that scale. But we do have kind of a basic one right here. Um, and so we have just a couple components that we're going to talk about today as well as
some text styles represented. But let's go back over to
represented. But let's go back over to the design file and introduce you to rewind, our design system for VHS vault.
Um, so this is rewind. Uh, and we're gonna rewind back in time historically to the beginning of our design system, Chad, where we were doing styles and color palettes. Ah, it was a much
color palettes. Ah, it was a much simpler time. It was a simpler time.
simpler time. It was a simpler time.
Remember, it was like it was yesterday.
I know. I mean, I think you know these styles we had this color palette. It was
very easy. Oh, that naming very simple green 300. It was perfect. But as we
green 300. It was perfect. But as we started to grow, we realized that on the development side, we had already started to factor in dark mode and we were using
design tokens. So we started to think,
design tokens. So we started to think, should we maybe introduce some parody in our design assets and go start introducing variables? You know, we were
introducing variables? You know, we were okay at the time having a little bit of a difference there, but we decided that we're we're going to hit fast forward.
we're going to need to introduce our light and dark mode in our design files as well. So, we started to create variables
well. So, we started to create variables and look at that, we started to have some semantic naming in there, drawing inspiration from the code that we already had. But where this started to
already had. But where this started to introduce some complexity for designers is that we have the same colors
represented multiple places.
So, we wanted to make it so that way we could make it easy to find what colors designers needed to use. And this is where with our library, we decided, let's scope these so that way when
people are using them, they're only going to see the colors that they need to see in that moment. For example, here we have our container. And if we scroll
down here, we're using a color background primary, but we still have a hex value here for the stroke. I'm going
to go ahead and pull this up. And we can see I'm only seeing my border variables here, which is perfect. That's all we want people to see. So, we can easily
apply that. Same thing if we were to go
apply that. Same thing if we were to go into the text and maybe want to change it. We have just our text showing here
it. We have just our text showing here for us. Now, this didn't mean that we had to
us. Now, this didn't mean that we had to completely get rid of our styles yet because they're still in use across some other explorations. But what we did do
other explorations. But what we did do to optimize the designer experience is we applied those variables as the background for each of these styles. So
when we decide in the future that we're going to deprecate those color styles, we can make sure we push on update. We
can remove those and then those consuming files will have the variables right there. Now the other thing that we have
there. Now the other thing that we have with this and everything being bound is if we flip over to dev mode right here and we start to take a look, you know, I
changed this to our we're in swift UI right now. Ah I was doing some special
right now. Ah I was doing some special demo work earlier today. Let's switch
over to CSS. Yeah, we're not ready to build a mobile app yet. Not yet. We
don't even have a mobile screen design.
So, we will get there. Yeah. And so, we can see here we've got our variable. All
right. Color, text, brand. We've got our fallback here. I mean, Jake, this is all
fallback here. I mean, Jake, this is all we need, right? You would think so, Chad. You would think so. So, we've got
Chad. You would think so. So, we've got some cool little variables over here.
and and Figma's kind of default code syntax is pretty great to have, especially if we're going to be creating these tokens over on the codebase side, but I'm going to rewind a little bit to
kind of where we started on the code side. And a lot of times teams that find
side. And a lot of times teams that find themselves in this place where they have styles in Figma and are using hex codes over in the codebase somewhere. Your
developers are likely creating their own patterns, whether you know it or not, around these things at that early stage.
Now, as design systems people, we might look at that and be like, well, that's, you know, that's design systems for babies, but this is actually emblematic of a app and a stage in an app's growth
where you're considering the user, you're iterating, you're learning exactly what it is you're building. Um,
and so I think it's actually a really healthy thing to find yourself in this sort of a state. Um, so on the code side, we have some variables representing those styles that we had.
um as well as kind of the color palette for some of those primitive colors. Um
but eventually Chad, we're going to move over to something that looks a little bit more like this where we have these custom properties described for our um primitives, but then we use aliasing and
map custom properties in CSS to other custom properties. Um this is what
custom properties. Um this is what aliasing looks like if you uh know the if you're familiar with it in Figma, but not in code. Um, but then we also have our dark mode defined here as well. Um,
with the same tokens described just within the context of of dark mode, uh, as well as some typography down here.
But for a lot of folks, these files can get pretty massive, right? And so I've actually using the plug-in API written a script that can export all of our
variables as JSON. And then I wrote a script that can parse that and create this file for us. So that's a way where collaborating across design and development can help create some of these patterns on the code side. They're
a lot easier to maintain once you're in this initial state. But also, you may have noticed
state. But also, you may have noticed that we have a prefix in here, the RW for rewind. And this is something that
for rewind. And this is something that happens all the time in code bases. We
have lots of variables describing lots of things and only some of them are scoped to the design system. So we add a prefix to them to make sure that everybody knows this is the one from the design system. It's easier to keep
design system. It's easier to keep things organized that way. But when we come over to Figma, Figma doesn't have any idea that that concept exists, right? And so one school of thought would be, well, we
should just force Chad to start adding that prefix arbitrarily on the Figma side in order to kind of have that autogeneration map. We don't need to do
autogeneration map. We don't need to do that. Um, we have a feature inside of
that. Um, we have a feature inside of Figma called code syntax. Anyone aware
of code syntax? It's my favorite Figma feature. Um, you can kind of come in
feature. Um, you can kind of come in here and for any of your variables, I saw like four hands. That's amazing. Um,
and in the variable editing dialogue, you can manually add code syntax for all the different platforms we have. Um, uh,
native codegen support for. So, the web one, we could come in here and we could start writing uh, we could say var rw brand subtle if we wanted to. Um but
doing that for every single one of our variables little time consuming. So on
the code side when I have a script that generates this file that script knows what the name of the variable is. So,
one of its other outputs is this handy dandy little plug-in API uh piece of a uh plug-in API that we can now copy and we can come over to Figma and we can
open the JavaScript console which is my favorite Figma feature and we can run this and we have just set code syntax programmatically for every single one of
these variables. And isn't that nice?
these variables. And isn't that nice?
Now, when we come over here and we click on this container, thank you for the clap.
No more clapping. There's so many other things. Okay. So now we can see over in
things. Okay. So now we can see over in dev mode our uh CSS code generation in Figma now has the context of your codebase, right? Which is often very
codebase, right? Which is often very different than the context that only lives inside of Figma. Um we can click on these which is awesome. So if we want to see how these variables behave and different themes um we can see any code
syntax that's been applied to them here which is super exciting.
I'm checking my notes. I want to make sure I'm not forgetting anything. So,
Chad, we've replaced styles kind of with variables here. What what why do we
variables here. What what why do we still have styles? Oh, I mean, we could probably get rid of the color ones, but you know, we'd still have a good use for them. And that is with typography. I
them. And that is with typography. I
mean, typography. So, typography is a great place for us to still use styles because our styles kind of act like composite tokens. We can have multiple
composite tokens. We can have multiple variables bundled together and they are distributed via a style. Now, on the designer experience side, nothing really
changes. We still apply our styles
changes. We still apply our styles exactly as we would. If we want to change our display here to title, we could. But let's just change that back
could. But let's just change that back to display. But what we have is the
to display. But what we have is the ability to use some variables in there.
So we have our font family set. We have
our font weight. But maybe we want precision to always say that our line height is going to be fixed at 56. Or we
could put a percentage there. Maybe our
letter spacing is going to be a negative percentage. We can combine variables and
percentage. We can combine variables and raw values. put them together in a style
raw values. put them together in a style and they're used just the same as they are today. But there is a bit of a
today. But there is a bit of a difference here when it comes to applying typography in code. While we
have friendly titles for our styles in Figma, we're usually going to apply them via a CSS class name in code. So we
documented that in our library here. And
that's great if we are working with semantic HTML and CSS, but it can be a bit different. It's a completely
bit different. It's a completely different medium, right? So here we have an H1 and that has meaning for both the hierarchy and for
accessibility. Just because it's an H1,
accessibility. Just because it's an H1, it doesn't mean, hey, this is big text.
that H1, it could be our display style, it could be our title, it could be our heading. It all depends on the context
heading. It all depends on the context that it's used within. So here we've applied a class to
within. So here we've applied a class to make the H1 our heading style. But then
we also have things like our paragraph tag or strong or M where they're going to likely inherit our base body style by
default. So we don't need to apply a
default. So we don't need to apply a class for that. But our developers, they might
that. But our developers, they might also build out components for typography. And in this case, it's not
typography. And in this case, it's not using that class name directly. Rather,
it's going to apply a prop. And that may have a very similar name to our style in Figma. So we make sure that our designer
Figma. So we make sure that our designer experience hasn't really changed using styles in there. You know, Jake, how does this improve our developer experience? So, people build typography
experience? So, people build typography stuff in so many different ways in codebases, and it's often aligned to what is most easiest for developers to
author text styled the right way most easily. Um, and I think that like this
easily. Um, and I think that like this is a great example that we're looking at here of how, you know, we optimize to the same thing from very different
points of origin, right? Um, so yeah, I I have another component that I think we should we should dig into. Are you cool with that, Jake? I thought we weren't going to do that. Okay. Well, now it's
time for everybody's oversimplification of design systems in one component, and that is the button. All right. So, I'm actually
button. All right. So, I'm actually going to start over here in the codebase. And we've described this
codebase. And we've described this button. And this button has a few
button. And this button has a few different variants, a disabled state, and it also has this state with an icon.
The developers in the room might be like, "Yeah, no big deal. I see you."
Um, but one little interesting thing here is that the padding on the left hand side of this button is different when there's an icon than when there is an icon. We have this optical alignment
an icon. We have this optical alignment here. When we think about how this is
here. When we think about how this is constructed over in Figma, as we go to add this to our button, as a developer, this is all I'm really thinking about,
Chad. I'm thinking about what is the
Chad. I'm thinking about what is the padding left for the button by default.
In this case, it's a variable we called button padding x. And then when there's an icon, we just do a calculation that cuts it in half. We could also assign a smaller
half. We could also assign a smaller padding there, too. True. But it's
ultimately this simple. How are you thinking about it? Well, I'm glad that we talked about this and you know, I I agree. You know, let's let's take a look
agree. You know, let's let's take a look at what this looks like in practice here. So, we have our button. Yeah, in
here. So, we have our button. Yeah, in
here chevron. All right. Well, that
doesn't look great. And I agree, you know, it looks a lot better and I'm glad that we're going to go ahead and change that. Now, on the design side, it's
that. Now, on the design side, it's optimized differently, right? So we have a few different ways to think about this. We could take the approach of
this. We could take the approach of creating a variant because it is a completely different visual approach to it. Variants are appropriate when you
it. Variants are appropriate when you have visual changes. But when we think about this
changes. But when we think about this and we look at our instance right here and we want to change it, it's not immediately clear if we can add an icon
to our button. you know, if we're coming into the library, it's being used as a sticker sheet. Sure, we know that we
sticker sheet. Sure, we know that we have icons there, but maybe it lives in design here. Okay, cool. There's a
design here. Okay, cool. There's a
primary and an icon. But if we rewind and we think
icon. But if we rewind and we think that, hey, we need to add those additional colors, right? We're now
going from having 16 variants in our button. Do the math. We're now looking
button. Do the math. We're now looking at 80 variants to have an icon there.
And what if we want to do an icon at the end and we're already down that path of the variant approach? Well, we now have 160 variants that we need to maintain.
That's nuts. And I guess what if you did both? Well, we'll let you do the math
both? Well, we'll let you do the math there, right? So, we're likely going to
there, right? So, we're likely going to go with more an approach like this where it's more similar to code and we're using props. Now, this does create some
using props. Now, this does create some burden for us on the design system side of it because we have to think how we're going to do that. We can't just simply
drop an icon into the button and say, well, if it has an icon, let's then change the padding on there. So, we're
going to put the icon in a frame here and then we're going to offset it. So,
you know, we'll do that in the system.
So, that way designers don't have to override things or start detaching it, but we can see that it's self-documenting in a way that all right, does the button have an icon? All
right, it does. It's there. We can also add that instance swap prop on there.
Change out the icon. And
perfect. Now, let's see. That's a lot more line to code. Absolutely. And if we take a look at what that looks like in practice here, let's go
in. It looks like here we've got our
in. It looks like here we've got our buttons and we click into that. Awesome.
We can change that out. Maybe go to a cart instead of the basket. And if we toggle into dev mode
there, code connect. Yeah.
So, we have that in there. And you know, while we're here, let's just go ahead and take a look around at may what else we can take a look at
here. Uh oh. Uh oh. All right, Jake. I
here. Uh oh. Uh oh. All right, Jake. I
know we don't have this as a background.
Yeah, I don't recognize that either. Who
did that? Let's take a look. Uh oh.
Detach component on there.
M but I mean I I think that you know we go back and we look at the library here and we
default to that success state and we have a warning here we have or an alert we have danger on there. Um we can't
default to success but it looks like maybe we need to look at adding another variation here. Um Jake what does this
variation here. Um Jake what does this look like on the code side? What are we doing by default today? Well, I've taken a preview peak and it's actually kind of
gnarly, Chad. Um, so if we look over at
gnarly, Chad. Um, so if we look over at how this has been implemented, a developer actually ended up creating this, which is great on their end. They
did technically do what was designed.
Um, but there are some things here. They
actually ended up finding a workaround in order to achieve this. When we go and we look over at how the developer built this out, they are using the right
component here with our little notification. But they've used the CSS
notification. But they've used the CSS custom properties to override the internal style to bring in that custom hex color. They're using our system.
hex color. They're using our system.
They're using tokens. Good on them. Um,
but they've kind of exposed a little bit of an exploit in how this component was actually defined in the codebase. And
what it is, when we come back over here to the library, we'll see that there's this weird no man's land zone for this
notification component. And in this
notification component. And in this state, there's no real background color, but you can customize the icon in a way that you can't with these other three.
It turns out in our system, we've associated an icon with the emphasis variant, which is the color, and we don't want that to change. But some
developer realized if you don't provide an emphasis, you can actually provide a custom icon. I don't know who wrote that
custom icon. I don't know who wrote that code, but that's something that we want to consider when we think about the designer and developer experiences and why designers are creating notifications
with custom icons. But what we want to do is we want to make it so that that pattern is considered in our system. And
what we would probably want to do in this case is continue the three patterns we have of enforcing that an emphasis and an icon are an important pairing,
but then create another variant for maybe custom notifications that might have distinct icons and distinct text.
But we don't necessarily want it to look like this. What we probably want it to
like this. What we probably want it to look like would be something like this that I have pre-baked. And I'm just going to add a custom info variant
here. Oh, I'm sorry.
here. Oh, I'm sorry.
Emphasis. Thank you,
co-pilot. There we go. Right. So, this
is what we're going to try to build. And
within that, we can still change the icon. So, if I come in here and I write
icon. So, if I come in here and I write lock, we get the lock. But if a developer comes in here and tries to do something sneaky and say the emphasis is
success, that gets defaulted back to the icon that is associated with that. Now,
how hard, Chad, is it for you to build a pattern like this in Figma? Well, I
mean, the system is growing, so I think we need to do that. And, you know, if we were to jump back over here and take a look at our library, it's actually pretty straightforward for me to do
this. Yes. Do you want me to do a
this. Yes. Do you want me to do a countdown? Let's go for it. All right.
countdown? Let's go for it. All right.
Three, two, I'm done. Ah, that was easy. All
right. So, actually, I already made them, but still, we're just adding another variant in this case, and we are applying our variables to it. Now, this
gives us the flexibility where we can add that icon swap on there. So, similar
to in code, we can specify a different icon for it. So, if we were to I'm just going to take a copy from right here and let's go into our
designs and we will go ahead here and replace
that keyboard shortcuts. The keyboard
shortcuts. So, we have right here our old notification. Let's just paste our
old notification. Let's just paste our new one in there. There it is.
And we have that new notification in there. We could go ahead and customize
there. We could go ahead and customize that. We can change out that icon to
that. We can change out that icon to something else that we want to have on there. Uh we could go ahead and fill the
there. Uh we could go ahead and fill the container and start to build this out.
Yeah. But like Jake showed, you know, maybe we want to ensure that this is the only one that has our instance swap.
Now, we didn't have that available to us on our other ones. So if we do the same thing and switch over to success, we can see that it's still showing us our check
mark there. So we can start to align our
mark there. So we can start to align our pattern here between design and code.
And if we switch this back and let's go to that info and we switch over to dev mode here, we can see ah look at that.
I've already written code connect for it. So we already have that there. We
it. So we already have that there. We
now have par on the design side and the code side. It's pretty
code side. It's pretty cool. So, one more thing. Let's like
cool. So, one more thing. Let's like
let's get into something a little bit more complex as well and how we might actually look at building this.
So, I got a uh request to take a look at the image gallery here. And, you know, curious about could this maybe be turned
into a pattern for the library? And I
think that there's some different pieces that we're going to need to think through here. You know, we have some
through here. You know, we have some images right here, but what happens if maybe there's eight images? Do we
continue to wrap this? Um what does that experience look like on mobile? you
know, I think we can start to define the requirements for it, but maybe we just want to get some ideas of what we could possibly do. So, I'm just going to copy
possibly do. So, I'm just going to copy this and I'm glad that uh we have make now and maybe we'll just use this to get some inspiration for alternate ways that
we can approach this.
So, I'm going to just take that design that we already have, and I have a prompt here already to say, maybe give me a few new ways to consider approaching this with an accessible
image carousel that can have up to eight images and shows the selected image at 16x9. Now, we'll let that do its thing.
16x9. Now, we'll let that do its thing.
And if we come back and we take a look at the design, you know, I I think Jake, here is where we start to think, well, how would we maybe design this? How
would we build this?
Like do we show all the images? I, you
know, this is something we talk to product designers and developers about all the time is when you're designing something new, one of the best things you can do is bring your developer in
early to expose opportunities for design, right? opportunities to consider
design, right? opportunities to consider end users um and potential limitations that you might run into down the road.
Because the last thing you want to do is design something and go down a road and then find out when you hand it off that it's gone in the wrong direction or that there's some limitation or some area
that you haven't considered from a design perspective. And so bringing
design perspective. And so bringing developers in early can help you do that. Make can actually help to that
that. Make can actually help to that exact same goal, right? It can help you uncover opportunities for design early.
You know, in the case of this gallery, let's see if it comes up with any. But
there's there might be some buttons for toggling things back and forth. There
might be keyboard interactivity that this will show us uh either through its omission or through its presence. The
things that we're going to want to have be specked out as we're designing this experience. This is a great way to kind
experience. This is a great way to kind of sandbox those ideas to give yourself the most opportunity to design something. Yeah. And I think that this
something. Yeah. And I think that this is where it comes into the touch side as well, right? Like we can just use this
well, right? Like we can just use this to get some quick ideas out there and then ultimately apply the touch of our system to make it feel like it's all one
cohesive piece here. All right, it looks like we are going to get something here.
All right, so Jake, great. We got a carousel here. How many options did it
carousel here. How many options did it give us? It looks like it gave us uh
give us? It looks like it gave us uh three options here. So we have a carousel gallery on here. Uh, we can use keyboard navigation on there. That's
nice. Um, but you know, I think it has the images at the bottom. And what is it going to do? Is it going to continue to shrink the previews? Maybe we want to do
an overflow container there. Do we want to snap the scroll so that it locks to the thumbnail? That's another thing.
the thumbnail? That's another thing.
Yeah, I think also then we need to figure out well, however wide it is, how wide should each preview be? How do we ensure that we have enough peak there?
Um, let's actually see what else we have for just some inspiration here. Full
screen fingers. Full screen gallery.
There we get the arrows on hover. That's
that's kind of cool. And then these buttons don't exist, but should they exist? That's another opportunity for
exist? That's another opportunity for design. All right. So, kind of similar
design. All right. So, kind of similar there. Yeah. Maybe uh I kind of like
there. Yeah. Maybe uh I kind of like when we're in full screen, it has the count of how many there are. Maybe we
could look at putting the count into our component. At the very least, we can
component. At the very least, we can make a decision about it. Absolutely.
Yeah. And then a masonry gallery. Well,
this is kind of what we have today.
Well, this is going to really expand that. I don't think this is quite what
that. I don't think this is quite what we are looking for here. I hope not. So,
but I think we can use some of these learnings to actually build this. So,
let's go into our work in progress here.
And look at that. We've already started to build our component. We're going to do that overflow on there. And we've
assigned some props on here. And I think if we do this on the code side as well, you know, let's just show those nav controls on hover. Um, I think account would be a good idea to include in
there. Sure. So, if we were to go and
there. Sure. So, if we were to go and put this into our design instead, let's uh get rid of that gallery and we will
use our component here instead. We can
actually see we took some inspiration from what we got and we incorporated account into there. We have those. Um ah
Jake, I think we need to make sure that we're still showing the cover on there.
Oh yeah, there was uh there was that interesting dynamic of the uh the portrait photo on top of the blurred background photo. Do we still have that
background photo. Do we still have that functionality? Yeah, I called it show
functionality? Yeah, I called it show cover focus. Oh, nice. So there we We
cover focus. Oh, nice. So there we We can just toggle that prop on if we want to show the cover, apply that blur background on there. And yeah, what we do from here is obviously we've designed
it. We've talked through what we need to
it. We've talked through what we need to consider as we're building this in code.
You know, I think we would build this out and decide is this in the system or is the product team who is doing the product detail page going to continue to
own this. Very
own this. Very cool. All right. So Jake, I think that
cool. All right. So Jake, I think that we've addressed some of these growing needs for our system and I think the key thing is that we're ensuring we're
optimizing for designer experience and developer experience at as many touch points as we can throughout it. So you
know Jake, I think are there other benefits of having aligned systems?
Yeah, one great example that I'd love to plug is the simple design system. Has
everyone heard of the simple design system? Shout out Louie who's out there
system? Shout out Louie who's out there somewhere. Louie and I built this
somewhere. Louie and I built this together both in design and code for last year's config and we've been using it a ton to test out all these things.
Um, but this is a great example I think Chad of like a bunch of integrations matched with a bunch of variables that are aligned between design and code.
Components that are perfectly aligned between design and code that that state that's more aspirational for most folks.
It's kind of like our little Tonka truck sandbox version of a design system.
There's a lot of cool stuff out there.
Uh you can go to github.com/figmads if you want to play
github.com/figmads if you want to play with any of that stuff. Look at the plug-in API code to do some of the stuff we were doing today. Um or REST API integration examples. Um but yeah,
integration examples. Um but yeah, that's uh that's all we have here.
There's also a whole bunch of code connect in there, which is my favorite thing. Um but yeah, let's move on over.
thing. Um but yeah, let's move on over.
Yeah. All right.
All right. So, kind of wrapping things up, you know, when we build out our design systems and we have alignment.
You know, I think if we recap what we've done here today, um let's hit next slide. We want to acknowledge and
slide. We want to acknowledge and remember that design is important because it makes a product meaningful, right? Design is deeply human and it's
right? Design is deeply human and it's not just the way that things look as Jay said at the beginning right it's at the core of the code we write and the
experiences that we curate and friction is inevitable but it's there for good reason design and development are different things. Design
is arguably more important now than ever before. So making it efficient is also
before. So making it efficient is also very important. Anything you do today to
very important. Anything you do today to make it easier for people to use your system will help will be helpful for any tools that you end up using as
well. And we talked a lot about
well. And we talked a lot about alignment and how alignment is not a one-time thing. It's essential for us to
one-time thing. It's essential for us to have alignment with one another before we design or build things, during, even afterwards.
And our alignment, it has to be constant, especially from a systems perspective because our aligned decisions, they are what become our patterns. And leaning into those
patterns. And leaning into those patterns is what's going to help us move faster, hopefully less friction, and give us more confidence. They're what's going to help
confidence. They're what's going to help us make the next thing easier to build than the last.
And design systems are the best way to make that design intent real at scale.
They make meaningful decisions repeatable, not just through tangible assets, but by fostering a culture of shared understanding. And while shared
understanding. And while shared understanding is key for a design system, it really applies to all of product development as a whole because it's oriented around considering the
experiences of people, whether they're designers, developers, or the ones that hear boolean operation, and think, "Oh, wow. I
haven't seen that one yet either." Well, Jake, I have a spoiler.
either." Well, Jake, I have a spoiler.
The ending is that our best work is done together. We even wrote an article about
together. We even wrote an article about this Chad about working better together. The article, it's a tactical
together. The article, it's a tactical guide for designers and developers all the way through handoff.
And it talks about some common pitfalls you may encounter, some practical tips for collaboration, and guidance on when to lean in on one another's expertise.
You can check out that article if you haven't already on our Figma blog shortcut by scanning the QR code here or using this handy link that Jake you uh
you had a great idea on this. Yeah,
design systems deep dive 25. And that's
actually the color if you're interested in what that is as a hex color. All
right, thank you everyone. Thank you.
[Music]
Loading video analysis...