# stailwc (speedy tailwind compiler)
This is an experimental SWC transpiler to bring compile time
tailwind macros to SWC (and nextjs) a-la twin macro. The goal
is to give the same great compile-time ergonomics and flexibility
while performing considerably better than babel-based alternatives.
Supports both `emotion` and `styled-components` for CSS-in-JS, and
many build systems such as SWC, nextjs, Vite, etc.
## Compatibility Chart
We are currently testing against the following versions. Other versions outside these may still work, however.
| stailwc | NextJS | Emotion | Styled Components | swc | Vite |
| ------- | ------ | ------- | ----------------- | ------ | ----- |
| latest | 13.4.3 | 11.10.5 | 5.3.6 | 1.3.24 | 4.1.0 |
## Feature Chart
| Feature | Emotion | Styled Components |
| ------------------------------- | ------- | ----------------- |
| `tw` jsx attribute | ✅ | ✅ |
| `tw` template tag | ✅ | ✅ |
| `tw` component syntax | ✅ | ✅ |
| `tw` component extension syntax | ✅ | ✅ |
| Global styles | ✅ | ✅ |
| Plugin parameter suggestions | ✅ | ✅ |
## Getting started
```bash
> npm add -D stailwc
> yarn add -D stailwc
> pnpm add -D stailwc
```
To get started with NextJS, place the following in your next.config.js.
For other framworks / tools, please see the examples.
`next.config.js`
```js
const stailwc = require("stailwc/install");
/** @type {import('next').NextConfig} */
const nextConfig = {
reactStrictMode: true,
swcMinify: true,
experimental: {
swcPlugins: [
stailwc({
engine: "emotion", // or "styled-components"
}),
],
},
compiler: {
emotion: true,
// or
styledComponents: true,
},
};
module.exports = nextConfig;
```
Optionally, you can also include the tailwind normalizer + forms
plugin by including the `` component. Please see
the relevant examples.
`_document.tsx`
```tsx
import { TailwindStyle } from "stailwc";
export default function App({ Component, pageProps }) {
return (
<>
>
);
}
```
### Types
There is one step you need to take to get types working. You need to add `stailwc.d.ts` to the root of your source
folder.
## Usage
### The `tw` tag
You can interact with stailwc in two ways. The first is through
the `tw` JSW attribute, and the second is via the `tw` template
tag.
```tsx
import { useState } from "react";
export const ColorButton = () => {
const [clicked, setClicked] = useState(0);
return (
);
};
```
### Component syntax
You can also create styled components using the `tw` template tag.
This will automatically create the correct syntax for both `emotion`
and `styled-components`.
```tsx
export const StyledButton = tw.button`p-1 m-4 text-green bg-white hover:(bg-gray text-yellow md:text-red) border-3`;
export const ShadowButton = tw(StyledButton)`shadow-lg`;
```
## Examples
There are examples available for both `emotion` and `styled-components`.
You can run them by cloning the repo and running `yarn` followed by
`yarn dev` in the example directory. You will need to `stailwc` first.