
Tailwind to StyleX Guide: Convert Design Tokens without Losing Intent
A Tailwind-to-StyleX migration should preserve design decisions before it changes component syntax. Colors, spacing, typography, radii, shadows, breakpoints, and motion values form the stable layer between the two systems.
The FindUtils Tailwind to StyleX Converter turns custom theme data into StyleX constants. It accepts Tailwind CSS v4 @theme variables, ordinary CSS custom properties, JSON tokens, and static theme objects from Tailwind config files. It generates tokens.stylex.js and tokens.stylex.d.ts.
The converter is independent from the tailwind-stylex package. That package publishes StyleX constants for Tailwind's default tokens. The FindUtils tool converts your custom source into a compatible constant-group structure.
Why Start with Tokens?
Tailwind utilities mix token selection and property application:
<class="text-rose-400">button class="rounded-lg bg-blue-600 px-4 py-2 text-white shadow-sm"> Save </class="text-rose-400">button>
StyleX moves the property rules into JavaScript, while constants keep the shared values stable:
import * as stylex from '@stylexjs/stylex'; import { colors, radii, shadows, spacing } from './tokens.stylex'; const styles = stylex.create({ button: { backgroundColor: colors.blue600, borderRadius: radii.lg, boxShadow: shadows.sm, paddingBlock: spacing[2], paddingInline: spacing[4], color: '#fff', }, });
The component syntax changes. The source values and their meaning remain traceable.
Supported Input Formats
Tailwind CSS v4 Theme Variables
@import "tailwindcss";
@theme {
--color-brand-500: oklch(62% 0.2 255);
--color-action: var(--color-brand-500);
--spacing: 0.25rem;
--radius-card: 1rem;
--breakpoint-tablet: 52rem;
}Tailwind v4 maps theme variable namespaces to utilities. The converter maps common namespaces into StyleX groups.
JSON Design Tokens
{
"colors": {
"brand": {
"500": "#2563eb",
"700": "#1d4ed8"
}
},
"radii": {
"card": { "$value": "1rem" }
}
}Nested keys become stable JavaScript property names. Token objects with $value are also supported.
Static Tailwind Config Theme
export default { theme: { extend: { colors: { brand: '#2563eb' }, borderRadius: { card: '1rem' } } } };
The parser reads static values only. It does not execute the file.
How to Convert the Theme
1. Choose the Canonical Source
Do not merge three conflicting token files during conversion. Select the source that currently defines production values.
2. Remove Unrelated Code
You can upload a complete static config, but a focused theme block is easier to review. Keep plugins, build settings, and content paths outside the token migration when possible.
3. Generate the Files
Open the Tailwind to StyleX Converter. Paste or upload the source. Keep automatic format detection, or choose a format for a small fragment.
4. Review Groups and Warnings
The output can include groups for colors, spacing, fonts, font sizes, font weights, radii, shadows, breakpoints, transitions, and generic tokens.
Warnings identify values that need manual work, such as:
- Unresolved CSS variables.
- Dynamic JavaScript expressions.
- Functions and plugin-generated values.
- Template expressions.
- Complex breakpoint objects.
- Keyframes.
5. Download Both Files
Download tokens.stylex.js for runtime use. Download tokens.stylex.d.ts for TypeScript names and group shapes.
6. Migrate One Component Family
Start with a small, repeated surface such as buttons or badges. Map its Tailwind utilities to StyleX rules that reference the generated constants.
7. Compare the Real States
Check light mode, dark mode, hover, focus, disabled state, small screens, and reduced motion. Token conversion cannot prove visual equivalence by itself.
Namespace Mapping
| Tailwind source | StyleX group |
|---|---|
--color-* or theme.colors | colors |
--spacing-* or theme.spacing | spacing |
--font-* or theme.fontFamily | fonts |
--text-* or theme.fontSize | fontSizes |
--font-weight-* | fontWeights |
--radius-* or theme.borderRadius | radii |
--shadow-* or theme.boxShadow | shadows |
--breakpoint-* or theme.screens | breakpoints and mediaQueries |
--ease-* | easings |
| Other custom properties | tokens |
Safe Parsing: Why Config Files Are Not Executed
A Tailwind config is JavaScript. It can import modules, read files, access environment variables, start processes, or run arbitrary code. An online converter should not execute an unknown config.
The FindUtils converter extracts a supported static theme object and parses data literals. It rejects functions, identifiers that require execution, template expressions, and dynamic spreads. This means some advanced configurations require manual conversion. It also means an uploaded config does not run as a program.
Preserve Semantic Tokens
Raw palette names describe appearance:
blue500 gray900
Semantic names describe purpose:
actionPrimary surfaceRaised textMuted borderDanger
Keep both layers when the design system uses them. A component should usually reference a semantic role. That role can point to a palette value. This makes future theme changes smaller.
Manual Review Cases
Theme Functions
Values such as theme => ({ ... }) depend on execution. Rewrite them as static tokens or migrate the logic deliberately.
Plugin Tokens
A plugin can add utilities without putting values in the theme object. Inspect the generated CSS or plugin source.
Keyframes
Keyframes are behavior, not simple constants. Migrate animation definitions separately.
Arbitrary Values
Inline classes such as w-[37px] do not exist in the central theme. Search component code for them and decide whether each value deserves a token.
Responsive Variants
Breakpoints can become constants and media-query strings. Component-specific responsive rules still need manual conversion.
FAQ
Does the tool convert Tailwind component classes to StyleX rules?
No. It converts the shared token layer. Component rules need a separate migration.
Can I upload TypeScript?
Yes, when the theme data is static. Type annotations and dynamic expressions may require manual cleanup.
Does the tool support Tailwind v3?
It supports static theme and theme.extend objects commonly used in Tailwind config files. It does not execute plugins or theme functions.
Is the generated file tied to FindUtils?
No. The generated module imports StyleX and contains your converted values.
Sources and Further Reading
- Tailwind CSS: Theme variables
- StyleX: defineConsts
- tailwind-stylex project
- FindUtils Tailwind to StyleX Converter
Next Step
Open the Tailwind to StyleX Converter. Generate the token files, review every warning, and migrate one component family first.