This site runs best with JavaScript enabled.
Listen on Apple Podcasts AppleListen on Google Podcasts GoogleListen on Spotify SpotifySubscribe via RSS RSS

Michael Chan Encapsulates State

Michael Chan talks about co-location, encapsulation, and CSS grid.

One of the things Michael loves about React is that it's a lot easier to make a black box of abstraction with iron-clad React components that don't leak.

Something that concerns Michael deeply about any technology is when we put too much inside of it. We saw this pretty early on in React, where everyone was taking all manner of state and putting it into Redux. We have to think about the principle of co-location and the fact that the closer you put related things together, the easier it will be to maintain in the longterm.

In React, we've got this excellent encapsulation model that allows us to do this thing for the first time. But, you have to be very strict about what you let in there. The encapsulation model is only as good as you are at encapsulating a single piece of information.

Homework

  • Michael Chan

    Michael Chan


    Transcript

    Kent C. Dodds:
    Hey friends, this is your friend, Kent C. Dodds, and I'm joined by my dear friend, Michael Chan. Say hi, Michael.

    Michael Chan:
    Hey, how's it going?

    Kent C. Dodds:
    So good. So happy to have you here again. For those of you who listened to Michael's other episode already, then this will be a review, because Michael's already a good friend of yours. But for those of you who haven't, so I just barely, actually minutes ago recorded an episode with Michael, and we just had so much to talk about. I wanted to talk about some more stuff with him. So, we're doing the second episode. But yeah, so definitely go listen to that other one, especially if you want to get into Michael and my shared love of show choirs.

    Michael Chan:
    Do you have pictures? I have pictures.

    Kent C. Dodds:
    Oh yeah, I've got ... I'm looking around my room. I don't have them hanging up, but I used to have a picture on my wall. So, Michael, why don't you just give us a quick intro to yourself, and then we can jump into our subject for this episode.

    Michael Chan:
    Yeah, so I'm Michael Chan. I go by Chantastic, almost everywhere. Host the React podcast at reactpodcast.com. I guess for context of this episode, I got into React super early. I think I wrote my first component in November or Christmas break of 2013.

    Kent C. Dodds:
    Wow, that is super early.

    Michael Chan:
    And immediately, one of the first things that I did, was to put my CSS in the style attribute of my component. So me and CSS and React components have a long, long history. Anyway, I thought I'd get that out of the way in the intro.

    Kent C. Dodds:
    Yeah, I love that. Yeah, I think that's great. And 2013, even at the tail end, that's like very, very early days React. That's impressive. I didn't really start getting serious about it until 2015, so you're a bit older than I am in React years.

    Michael Chan:
    In both years, probably.

    Kent C. Dodds:
    Yeah. So Michael, actually one of the first things that I remember watching of your educational content was, you had this website, it was something React beginner something, where you showed making a component that encapsulates its styles. Do you know what I'm talking about?

    Michael Chan:
    Oh, yeah, yeah. It was probably at learnreact.com which I have not updated in a really a long time. But yeah, it talked about style encapsulation and components.

    Kent C. Dodds:
    Yeah, yeah. I'm pretty sure that's where that was and it resonated a lot with me because one of the things that I love about React is the black box nature of it.

    Michael Chan:
    Yeah.

    Kent C. Dodds:
    When we're talking about components, even with AngularJS where I was working before, before I got into React, I treated my directives as components. And this was before Angular dot component came around. And so I just made these things, and I wanted to encapsulate everything into this black box. And just by the nature of the design of the framework, it was kind of difficult to make a black box that didn't leak a lot.

    Michael Chan:
    Sure, yeah.

    Kent C. Dodds:
    So, that was tricky, and you had to be really intentional about doing that. And one of the things I love about React is that it's a lot easier to make a black box of abstraction with React components that don't leak, that are iron-clad. And that's the pit of success, and of course, you can do the wrong things that are not idiomatic but with that, talking about using encapsulating styles into these components comes with so many benefits.

    Kent C. Dodds:
    Do you want to talk about... Why do you think CSS and JS has just exploded in popularity in the React ecosystem?

    Michael Chan:
    Well, yeah. I think what you said is totally right on. There's something about the encapsulation model of React components that is just brilliant, and it works in a way that we haven't really seen in other places. I think one of my favorite examples, I have this tiny, tiny, tiny component. It's called React SVG spinner, or something like that. And the thing that I love about it is not that it's particularly well-designed, or has a good API, or any of that kind of stuff, but it's a React component that renders out an SVG element that it fully draws inside of the component, and then some CSS just inside of the component, like a local style tag, that it uses to style and animate the SVG.

    Michael Chan:
    I just remember thinking it was magical that I could make this one NPM install that did all of those kinds of things, instead of having to be like, "Hey, add this style sheet, and import this SVG from this other thing." It's just like, if you're running React, you have this one thing, and it just puts up a spinner, and does all of the things that you need to do, baked into it.

    Kent C. Dodds:
    It's brilliant. Yes. It's so awesome. Anybody who's new to this, it's just like, Yeah, that's life, right? But before, you're like, "Okay, now you have to add this Babel loader, or this Webpack loader, or you have to add this script tag," or all of this nonsense that was like, "Well, I can't really do that, because my built system is such and such." There's so many hoops you have to jump through. But being able to put it all into just, you can copy paste this file, and now you don't even have to take the whole file. Just like take the code. It is a totally different paradigm that was, yeah, fantastic. Absolutely.

    Michael Chan:
    Yeah. And I know for me, coming from Rails, so much of this stuff was really irritating, because maybe you had all of those things, but you had to package it up into a gem, which was totally aware of the Rails system, and how things were bundled. And then you had to have three different parts where you imported the JavaScript into one JavaScript manifest, and the CSS into a CSS manifest. And now you have this gem sitting around. It has nothing to do with Rails. It's just like a bunch of CSS and JavaScript. And it's like, yeah, I love where we're at, in terms of encapsulation right now because it's just what, I think we wanted for a really long time.

    Kent C. Dodds:
    Absolutely. And I think that React just got the ball rolling, when it was like, "Hey, listen. This whole separation of concerns thing is pretty cool and all, but you're separating the wrong things and you defined concerns wrong and as it happens, a button..." Like let's take a toggle button for example. A toggle button isn't a toggle button without the Markup, the behavior and the styling. You can't have it without all of those things. So let's just put them all together, and it will start with JSX, and then CSS and JS comes around, and we just marry it all. And when we do that, we just acknowledge the reality, and then we can have some really powerful things with that reality, right?

    Michael Chan:
    Yeah.

    Kent C. Dodds:
    So, with that in mind, we are going to talk a little bit, or we want to get into a little bit, why you might want to not get a divorce in that sort of marriage, but why you might want to be a little more intentional about how you create this design system in a way that is leveraging the modern platforms that we're building on.

    Michael Chan:
    Yeah. So, a lot of the work that I do is in frontend architecture, and then design systems. And most of what I do is helping designers and developers communicate. I'd say if I had one job over the last 10 years, it has very little to do with code or design or anything. It's just like trying to figure out the areas that we can agree and move forward on. So, I'm really bullish on communication across the wall.

    Michael Chan:
    And I think that something that concerns me deeply about any technology, is when we put too much inside of it. And I think that we saw this early. To draw a corollary, inside the React universe, I think we saw this pretty early on in React, where everyone was taking their state, all manner of state, and putting it into Redux, or some flux implementation. I don't want to single out Redux. Putting everything inside of some global state management. And I say that because I think that we have, over the last three years, been crawling out of that in our applications. Would you agree with that?

    Kent C. Dodds:
    Oh, my goodness, yeah. I agree so much, so much, yeah.

    Michael Chan:
    Because I know that this is something that you have to talk about a lot. Now that everything can be in a component. We've got this really nice encapsulation model that allows us to do this thing for the first time. You have to be very strict about what you let in there. And this can be really hard, because it's extremely nuanced, and I think for a lot of people, like they want the rule, they want the ESLint rule that says, do this, don't do the other thing. And that's just not how this works. Sometimes it takes a huge amount of experience and having gone through transitions from one platform to another platform. To have an intuition I guess, about what is too much. And yeah, it's tricky because you see the component and you see all these capabilities that we baked into it.

    Michael Chan:
    And I feel like we've largely solved the performance issue in CSS and JS now. And it's really good now and it's hard not to just throw everything.

    Kent C. Dodds:
    It's true.

    Michael Chan:
    What would you say, the biggest takeaway from... Because I know that you've taught and guided a lot of people in this transition of thinking away from just putting everything inside of a global store, like from that as an example. What are some of those nuances or what are some of the areas that have been hard to communicate to people in dividing that line between what should be local state, what should be global state, et cetera.

    Kent C. Dodds:
    Yeah, I think that in general, I try to develop a principle for these nuanced things that we're teaching people and these principles typically can't be encoded in an ESLint rule, which I know lots of people have a lot of trouble with. But the principle is co-location and this applies to global state, it applies to where your files are laid out in the file system, where you put your tests, all of this stuff. If you think about the principle of co-location and the fact that the closer you put related things together, the easier it will be to maintain on the longterm. And in some cases the more performance it will be as well. Then global state actually does fit into that because I have this state and the closest it could possibly be to where it's related is actually at the top because literally everything needs it, right?

    Kent C. Dodds:
    So, that's still co-location and so yeah, that's kind of where the real struggle that I've had though is people do want to have an ESLint rule that just says, okay, do this, don't do that. And when we're talking about something like co-location, the only thing that will always "work" is putting everything global. And so you make ESLint rule against React state and that's how we got here. And so yeah, taking a more nuanced approach, more principles based approach. I think we're really good at lifting state, less good at going the opposite direction and co-locating state. And bringing it back around to CSS, I think we've just really fallen in love with this ability to encapsulate our styles because we really don't like having global styles, but for some reason we're okay having global state.

    Kent C. Dodds:
    I'm not exactly sure I understand that. We're like these two things are passing on the highway. It's like, wait a second, where are you going?

    Michael Chan:
    So I bring up the Redux thing because I think that it's such a good example of putting too much inside, redirecting too much into the wrong place. And I think one thing that I've always been on about with components is that the encapsulation model is only as good as you are at encapsulating a single piece of information. Right? I think Hooks are really good at this because they make it difficult to encapsulate more than one concept. They're kind of like biased against that a little bit. But let's say like every design system on the planet has a button. Right?

    Michael Chan:
    And I think this goes back to maybe that first lesson that you had seen of mine, but I do all of my componentry a little bit differently in that when I create a button component, I don't want it to think about size. I don't want to think to about color or anything. All it thinks about is just how to display the minimum viable button. And then if I want a button that is a certain size or a certain color, I make another button that composes that button. Right? And kind of works together. This is composition versus everything that we've seen, like every design system that's kind of post bootstrap, where it's like a single component has all of these ideas of size and all that kind of stuff baked into it.

    Kent C. Dodds:
    Like 13 props.

    Michael Chan:
    Right? Exactly. I feel like as React developers who kind of latched on to the notion of design systems and largely co-opted it from the field of design, I feel like we've done it wrong. And when I say the industry, I don't mean we, because I feel like I'm still doing it right by just having the one components that compose each other but it's something that I'm deeply concerned with. Because I feel like we put more and more into these components.

    Michael Chan:
    So many systems, React based design systems have a box now, which is basically every single component in those systems inherits from box. And we're in this position again with design systems where we have kind of taken the easiest route and pushed everything into one place like global state. And it's concerning to me as someone who is actively migrating systems from one place to another, from Rails to React. To think like in 10 years we're going to have all this legacy React code that was super hot in 2020 that is immobile, like cannot be moved to the next thing. And we're in a position where we have to like rewrite everything, which sucks.

    Kent C. Dodds:
    Yeah, definitely. Definitely not fun. So, what is your... I'm not going to say perfect, nothing's perfect, but what's your ideal design system like then? I imagine lots of people listening to this are like, yeah, my whole design system is styled components and it's amazing. And they've got the theme stuff and they got media queries all magically working together in something that they feel is working super well for them. And so here we are talking about how maybe there's potentially a better way, a more portable way. So, what is that way? How would you recommend people go about creating design systems that are framework free?

    Michael Chan:
    Yeah, that's a good question. I like framework free. It's like free range design systems. So, first of all, both of us love CSS and JS for certain projects. I'm not going to beat around the bush. My first talk was at React Europe, encouraging people to start using CSS and JS. And as we focus more and more on accessbility in the React space. You realize how important these components are because CSS and JavaScript and Markup are entangled when it comes to styling things that are accessble. And so I don't want to discard all of that because I think that's super important. But you look at libraries like Reach UI and they're still exporting like a CSS thing, which is easy to override. And I feel like this is a good model because open source, like more than anything has to be, I guess, extensible.

    Michael Chan:
    And I feel like if we look at open source is kind of a model for how we should be designing our closed source. I feel like that is a really good model of like, Hey, we know that these things are intertwined. We're going to give you the minimum viable implementation to make it work, right? To make sure that these interactive elements show in the right place, et cetera-

    Kent C. Dodds:
    Right.

    Michael Chan:
    [crosstalk 00:17:44] you can easily override them. I think my feeling is that design systems as well as open source that's going to transcend React really has to be thinking about the browser as a target and not React as a target. And kind of relooking at what's capable in the browser now. I think predominantly the killer features are going to be CSS custom properties/variables and CSS grid and kind of determine a strategy for their apps or their open source on how they want to leverage those things and how they're going to maybe support legacy applications if they want to at all. In kind of betting on standards in the future. Because I think that at some point Internet Explorer is going to be end of life. Right?

    Kent C. Dodds:
    It has to be, please tell me that it will be, even if it won't, I just need to hear those words.

    Michael Chan:
    It will, it will. And CSS custom properties and CSS grid have such... I think we've gotten so obsessed with React. We've missed all of the innovation that's happened there and browser support for grid and CSS custom properties is almost as good as Flexbox, if maybe not better in some cases. And so, if you're already using Flexbox for stuff and all of these things are really good at overriding the properties that you would have used for a legacy systems anyways, like floats and all that kind of stuff.

    Michael Chan:
    So, I don't know, I'm super bullish on standards pretty much always.

    Kent C. Dodds:
    Yeah.

    Michael Chan:
    Yeah.

    Kent C. Dodds:
    So, in your mind, the ideal design system today would be one where it's leveraging mostly pretty much all CSS, like regular style sheets that people would then import the style sheet for the styles, but then there would be an accompanying React component that has props and stuff that people can use, so that they say, okay, just include this style sheet, include this button component and use that button component. You don't have to worry about class names, you just, I need to have that style sheet on the page. Is that what you're [crosstalk 00:20:10]?

    Michael Chan:
    Yeah. Yeah. And I think that the boundaries are going to be different for every person. And this was my feeling in terms of transitioning to CSS and JS is that there's no way to make a clear boundary about this. Like we were talking about with ESLint rules and whatnot. If you want to make one decision, you going to be stuck on one side or the other. But if you're willing to bridge the gap, I think there's so much cool stuff that you can do in maybe not even using class names, right? Like just defining a bunch of like custom properties that are used with values and then having components consume those. Right? One of the things that everybody hates about CSS is the fact that you have to give something a name first and that's one of the two hardest problems in computer science. Right?

    Michael Chan:
    And I think that with this you can just define a specification for an avatar or whatever. And now if you want to do everything in React, you just have a React component that consumes those custom properties.You have another React component that modifies those custom properties to put a ring around the avatar or a border or make it so it can overlap other avatars in a group and so you can still leverage the component model while also taking advantage of the latest features in CSS. Which makes these things very customizable, very easily overrided, overwritten?

    Kent C. Dodds:
    Either way, I think we all understand.

    Michael Chan:
    And then yeah, CSS grid, there's so many bespoke grid systems out there and that's just built into the browser now. It's like just learn that, it's so much more powerful than every other grid system I've ever seen before, yeah.

    Kent C. Dodds:
    Mm-hmm (affirmative). Absolutely. So, actually on that one, would you suggest that application or people who build design systems just to expose class names that use those things and then application developers would use those class names? Or would you also expose grid components that are built on top of regular CSS grid? Because there's a lot of value in scoping down the amount of things that you can do, right?

    Michael Chan:
    Yeah.

    Kent C. Dodds:
    When it comes to a design system.

    Michael Chan:
    Yeah. It's tricky say for any given team. I hope that people just explore it and find out what the boundaries are for them. I still expose classes because my work happens largely between Rails and React and there isn't... I have to have some type of handle for the Rails code to target. Right?

    Kent C. Dodds:
    Right.

    Michael Chan:
    And so we use classes for that. If you were strictly in React, you could still set up all these custom properties and then just consume them in React. But grids are rad. They're so ridiculously powerful and I think we've been conditioned to want to build the generic grid system for our applications instead of saying, I need a grid for this particular layout or I need a grid for even one small form setup, right? Make a thousand grids and use those instead of having a generic thing that has 50,000 props on it and allows you to do stuff in a bespoke way of your application that isn't leveraging the browser technology.

    Kent C. Dodds:
    Yeah. Yeah. So, related to this, when I was at PayPal, the very last thing that... Big effort that I was working on before I left was what was called PP React, which PayPal PP, it's unfortunate. I didn't want to do PayPal React. That's too long of a module name, but I was working really close... It was a component library for all of PayPal. Everybody who was using React, which is pretty much everybody was either on React or moving to React. But I was working really closely with its design system team and they really wanted me to work on something that would work regardless of the framework. And I pushed back so hard. I was like, literally everybody here at the company is either using or moving to React. So, we could build... Web Components came up and I would love to hear your thoughts on Web Components in relation to all of this but I shot that down very fast.

    Kent C. Dodds:
    And yeah, so I just really was pushing like, "Let's just do CSS and JS. You can give me your tokens, whatever as a packet, I'll import that as JSON and grab all the values I want." But they were like, "We still have lots of people who are on old stuff and we want to make this work for the future." And so, eventually I was finally convinced and just started making... One of my big problems and the reason that I decided to work on this, was because I would look at PayPal and applications and almost every single one of them, you'd pull up their coverage numbers that Google Chrome dev tools would show you. And I'd click around and open modals and everything and I could never get our CSS coverage down below 90% unused CSS.

    Michael Chan:
    Yeah. Yeah.

    Kent C. Dodds:
    This is not a small amount of CSS. And so I was like, we've got to have something that's code splittable. We've got to have something that once you remove that component, the CSS is also gone. That was such a huge an important thing to me. And so, what we developed was, they created regular CSS classes and in my package, up on our internal NPM thing in the built version, it would have import statements for CSS. And so then, you you want to bring in the button component? Well, sure that'll bring its CSS along with it. If you want the modal but that's code split, that'll come later and the CSS is all just magically code split along with that.

    Kent C. Dodds:
    And so, I felt that struck a really great balance of the ability for us to get scoped down CSS for components, componentized CSS. We get all the benefits of components and code splitability and everything, but also being able to deliver that same CSS for non React applications. And I left the company before it really got a lot of adoption. But I've heard since that it has gotten a lot of adoption, which is validating. But what do you think about that approach? Is there anything that you can tell our listeners that like, Oh, maybe consider this before doing something like that?

    Michael Chan:
    Yeah, I think that's a really great approach and that's the approach that libraries like Reach UI are taking where they have kind of this CSS. And it's cool because you can handle all of that as part of the build. So, you're doing that as part of the build, you're kind of encapsulating all of that. I think one nice thing about CSS custom properties is that they don't necessarily have to be exposed as a class name. Right? And so, if you really do have a... If your task is to make a global design system, having these CSS custom properties, those are your tokens, right? And if you can just rely on those as the undercurrent of you your design system, then you can consume them however you want in your componentry or your CSS classes or whatever you want to do.

    Kent C. Dodds:
    That's fascinating. A big takeaway for me is go learn about CSS custom properties because I know nothing about this stuff.

    Michael Chan:
    Yeah, they're really nifty. I'm actually doing a... What is it? We talked about egg head earlier, but I have an egg head collection that I'm working on that is going through some of the... I guess more like intricacies of custom properties and how they're useful. Because at first you're just like, Oh, they're CSS variables and yeah, but there are so many cool things you can do and there are so many ways that you can compose them and take them as a variable and extract other values from them. And it's just really neat.

    Kent C. Dodds:
    That's fascinating. Well, one of the thing that I wanted to make sure that is clear and maybe we'll disagree on this, I'm not sure. But when I was building that component library and design system, I was also working on PayPal scripts. That one, I didn't use PP, I guess didn't come up with that later, but PayPal scripts, basically like React scripts, a whole build tool chain, all in just one tool. You update that dependency and all of a sudden your build is faster.

    Kent C. Dodds:
    It was awesome and that also had a lot of adoption, but in that tool I had built in support for emotion for CSS and JS and specifically the CSS prop and that's how I was telling everybody to style their applications. I would say use PP React for all of our built in design system components and then use the CSS prop for all your bespoke application specific stuff. What are your thoughts on that? Do you feel like it would be better to just go full hog on CSS and CSS custom properties for our applications as well? Or do you see any value in CSS and JS from an applications perspective?

    Michael Chan:
    Oh, I definitely see value in... Was it CSS and JS from an application perspective? I think from that first talk at React Europe, I presented the idea of CSS and JS as a continuum. And I think for me, it's so important to develop flexibility in your thinking. That allows you to focus on the exceptions and the nuance as a tension you just have to live in. Right? And I think I've been in a fortunate position where I have had to support simultaneously modern systems and legacy systems. And I think when you accept that is a constraint, like a persistent constraint, not just a temporal constraint where it's like once we get to the modern system, we're good for the rest of time. But the legacy system that you're migrating from, that was the modern system at one point.

    Michael Chan:
    And you're just building the next legacy system. If you can build something that transcends both of your existing systems, well, then you're in a much better spot to move easily to the next thing. And so, yeah, I couldn't say specifically what the best approach is for any given team, but I think, kind of a tangential theme in this conversation is, don't try to make a single rule that works everywhere. Try to live in that tension a little bit and ask yourself... Determine the nuance a little bit. I think state derived styles are so much better to write in a component that is already maintaining that state. But your design system on the other hand, maybe that should be in a technology that's standardized and can transcend whatever web technology you're using.

    Kent C. Dodds:
    Yeah, I think that's just fantastic advice and we're coming down to the end of our time, but I really am curious about your answer to this question about if we're leveraging the platform for our CSS, we're using CSS grid and CSS properties so that we don't have to do all of that in JavaScript for our design systems. At some point, some of those things need to be applied to HTML elements and you're going to be having components that render that with JSX. Is there value in the same vein of using something like Web Components, which technically is the standard for components on the web?

    Michael Chan:
    Man you got to hit me with that one right at the end. Fortunately we're basically out of time so... Man that's such a sticky thing. I know that at least it seems like Web Components as they've been specified or kind of in maintenance mode. That doesn't seem like there's a lot of future outlook on that. And Chrome and teams at Google have been investing a lot into Next and working with React and trying to figure out the values of the declarative component model and how we can integrate that kind of thinking into the browser. So, I don't know, it's really tricky. I feel like Web Components are kind of maybe a little bit stuck and this is just my feeling as an outsider. I have no privileged information about this.

    Kent C. Dodds:
    Nobody rage tweet at Chantastic for you.

    Michael Chan:
    And I wish that they weren't and I wish that React had better integration for them. Because I feel like that would be... If React and Web Components worked perfectly together and like you didn't have to work around the edge cases. That feels like the natural path forward, right? Of just do your design system and Web Components and then wrap them in whatever framework you want them to be in. But it feels like we're not there and it's a real big pain in the butt for people who attempt to do that.

    Kent C. Dodds:
    Yeah, absolutely. I think that the thing that I wanted to mention about this is that, just because something's a standard, doesn't necessarily mean it's the one that we want to use. Right? Before React came around, if the folks on the React team were like, "Well, here are the standards that we have. So we'll just use those things." Then React never would have come around. The same could be said of anything. And the fact that Web Components came after React, it doesn't necessarily mean that it is going to work for your use cases better. To be Frank, I'm not afraid to share my opinion on this is that Web Components was a bit of a failure in addressing the needs of modern web application development. Which is a real shame and I wish that's not the case.

    Kent C. Dodds:
    And maybe eventually we'll get something that is less of a failure in my mind. But yeah. One last thing that I wanted to mention as we're talking about let's make our code as framework free as possible. Because I do think there's a lot of value in that. I just don't think that we've been able to really accomplish that with our Markup yet. But Logic can absolutely be framework free as well. And since you've mentioned Reach UI, one thing that you'll find that's interesting in digging through Reach UI code is that actually a lot of the Logic lives in state machines. They don't use xstate or anything but they have their own kind of state machine little thing. And what's cool about that is Logic is actually often the hardest part of all of this. And so putting that into something that is framework free allows for them to say, Oh let's let's make a Vue Reach UI and let's make an Angular Reach UI.

    Kent C. Dodds:
    And because they've separated their CSS and their state or their Logic and their Markup, they can just find and replace or switch out the Markup for each one of these frameworks. And I think there's a lot of value in that. When we're talking about design systems, I don't think that this same thing applies with applications. Absolutely not. I don't think anybody should build an abstraction on top of their applications so they can swap out Markup frameworks but with a design system that seems to make a lot of sense to me.

    Michael Chan:
    Yeah I'm glad that you went there with Reach UI, because I just tell people like, Oh Reach UI is great on so many levels, just knowing that they're going to get the benefit of this like framework free implementation. And I totally agree with you, it's so hard to draw the lines. Sometimes on when you should use a standard, when you shouldn't, when you want to leverage the power of a framework and when you should back off the gas a little bit. But I do feel like you touched on at least some of the nuance there, which is like the more general something is, probably the more likely you want to reach for a standard. And then the more specific it is to your domain like yeah, leverage the kind of framework specific stuff that gives you that extra boost.

    Kent C. Dodds:
    Yeah. That's such an awesome takeaway. Thanks for bringing that out. Because I think that when you're making a trade off by using the platform often, and that trade off often comes in the form of your time and productivity. The frameworks bring you just so much speed of development. But when we're talking about something that is so far reaching as a design system, you're willing to put in the extra cost of your speed in exchange for having longevity of that code. Whereas an application, we don't even know if we're going to be in business tomorrow. So, let's just get this thing shipped.

    Michael Chan:
    Yeah. And so much of this does come down to business trajectory because if you're just like working week to week, do it as fast as you can and figure out the longevity [inaudible 00:37:40].

    Kent C. Dodds:
    Yeah, absolutely. Well, cool. Michael, it's been awesome chatting with you, eight minutes overtime. Awesome. So, let's wrap this up here. So, our homework for folks is, we want you to take one of your small CSS and JS components and if you have them, if you don't then that's awesome. Good for you. Maybe for you, try CSS and JS for your apps because there's some really awesome things that you can do with that. But for those of you who are using CSS and JS for your design system, we want you to try and switch it out for a regular CSS solution to back it up. And see if you can do that in a way that doesn't like change your API or anything. You should be able to accomplish that, I think. Maybe you require people to include a CSS file or you can figure out some way to make it so they don't have to do that. But in any case, just explore the existing standards, especially for CSS that we've got and for my own personal homework is to go figure out what the CSS custom properties things. This is good stuff.

    Michael Chan:
    You will like them. You will like them.

    Kent C. Dodds:
    Yeah. Very good. Awesome. Hey Michael, how can people reach you?

    Michael Chan:
    Oh yeah, I'm a Chantastic, most places on the internet and if you want to hear some podcastage with some really cool React people and kind of React tangential people, React podcast is the place to do it.

    Kent C. Dodds:
    All right. Maybe we need a framework free podcast. No, I'm just kidding. We love React podcast [crosstalk 00:39:11]. Really strongly recommend that podcast. I always look forward to those episodes. They move up in my queue if I've got other things ahead of it. So, thank you so much. It's been such a pleasure to chat with you, Michael, and I hope everybody has a wonderful, safe, healthy rest of their day or evening or morning or whatever time it is you listen to this and yeah, we'll catch you all next time. Thanks.

    Michael Chan:
    Thanks.