Polymorphic react component with vanilla-extract

I started using vanilla-extract library as foundation to design system at work. All is going well, but I have one problem - I couldn’t find a good way to create polymorphic React components. I tried with React TypeScript Cheatsheet, but it didn’t work for me. I was looking for a solution for a while and I was recommended (thanks Jonatan) to check out this handy little library called dessert-box. What this library is doing? It uses a concept of vanilla-extract sprinkles and connect them together with polymorphic Box component.

Let’s say you have this sprinkles defined:

import { createSprinkles, defineProperties } from "@vanilla-extract/sprinkles";

const colorProperties = defineProperties({
  conditions: {
    lightMode: {},
    darkMode: { "@media": "(prefers-color-scheme: dark)" },
  },
  defaultCondition: "lightMode",
  properties: {
    color: [{ brand: "#00a98f" }],
  },
});

export const sprinkles = createSprinkles(colorProperties);

Now you want to pass those as atoms to your Box component. You can do it like this:

import { createBox } from "@dessert-box/react";

import { sprinkles } from "./sprinkles.css";

export const Box = createBox({ atoms: sprinkles });

Now you can use it like this:

<Box as="button" color="brand">
  Submit
</Box>

And it is all type-safe. You can’t pass different color than brand to the Box. Now you can build your own components on top of it and combine them into more complex molecules. It really helps to write as little custom CSS as possible and instead use typed props to style your components.