Atlas
pacifio/ui
Atlas — a design language and UI guide system for agent interfaces.
Migrate TailwindCSS to StyleX. An agent skill from shadcn-labs/shadcn-cssinjs.
$ npx skills add shadcn-labs/shadcn-cssinjs --skill tailwind-to-stylex -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install shadcn-labs/shadcn-cssinjs tailwind-to-stylex --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/shadcn-labs/shadcn-cssinjs.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/tailwind-to-stylex .claude/skills/tailwind-to-stylex && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "tailwind-to-stylex" agent skill from https://github.com/shadcn-labs/shadcn-cssinjs/tree/main/.agents/skills/tailwind-to-stylex into .claude/skills/tailwind-to-stylex/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "tailwind-to-stylex", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/shadcn-labs/shadcn-cssinjs/tree/main/.agents/skills/tailwind-to-stylexType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add shadcn-labs/shadcn-cssinjs --skill tailwind-to-stylex -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install shadcn-labs/shadcn-cssinjs tailwind-to-stylex --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/shadcn-labs/shadcn-cssinjs.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/tailwind-to-stylex .agents/skills/tailwind-to-stylex && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "tailwind-to-stylex" agent skill from https://github.com/shadcn-labs/shadcn-cssinjs/tree/main/.agents/skills/tailwind-to-stylex into .agents/skills/tailwind-to-stylex/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "tailwind-to-stylex", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add shadcn-labs/shadcn-cssinjs --skill tailwind-to-stylex -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install shadcn-labs/shadcn-cssinjs tailwind-to-stylex --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/shadcn-labs/shadcn-cssinjs.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/tailwind-to-stylex .cursor/skills/tailwind-to-stylex && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "tailwind-to-stylex" agent skill from https://github.com/shadcn-labs/shadcn-cssinjs/tree/main/.agents/skills/tailwind-to-stylex into .cursor/skills/tailwind-to-stylex/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "tailwind-to-stylex", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/shadcn-labs/shadcn-cssinjs.git --path .agents/skills/tailwind-to-stylex--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add shadcn-labs/shadcn-cssinjs --skill tailwind-to-stylex -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install shadcn-labs/shadcn-cssinjs tailwind-to-stylex --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/shadcn-labs/shadcn-cssinjs.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/tailwind-to-stylex .gemini/skills/tailwind-to-stylex && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "tailwind-to-stylex" agent skill from https://github.com/shadcn-labs/shadcn-cssinjs/tree/main/.agents/skills/tailwind-to-stylex into .gemini/skills/tailwind-to-stylex/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "tailwind-to-stylex", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install shadcn-labs/shadcn-cssinjs tailwind-to-stylexInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add shadcn-labs/shadcn-cssinjs --skill tailwind-to-stylex -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/shadcn-labs/shadcn-cssinjs.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/tailwind-to-stylex .github/skills/tailwind-to-stylex && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "tailwind-to-stylex" agent skill from https://github.com/shadcn-labs/shadcn-cssinjs/tree/main/.agents/skills/tailwind-to-stylex into .github/skills/tailwind-to-stylex/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "tailwind-to-stylex", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add shadcn-labs/shadcn-cssinjs --skill tailwind-to-stylex -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install shadcn-labs/shadcn-cssinjs tailwind-to-stylex --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/shadcn-labs/shadcn-cssinjs.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/tailwind-to-stylex .opencode/skills/tailwind-to-stylex && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "tailwind-to-stylex" agent skill from https://github.com/shadcn-labs/shadcn-cssinjs/tree/main/.agents/skills/tailwind-to-stylex into .opencode/skills/tailwind-to-stylex/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "tailwind-to-stylex", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
tailwind-to-stylexMigrate TailwindCSS to StyleX. An agent skill from shadcn-labs/shadcn-cssinjs.
Tailwind To Stylex is an agent skill from shadcn-labs/shadcn-cssinjs. Migrate TailwindCSS to StyleX. Use when converting Tailwind className utility strings into StyleX stylex.create + stylex.props/stylex.attrs — a single component or a whole codebase, in React/JSX/TSX, react-strict-dom, or any JS framework StyleX supports (Solid, Svelte, Vue, Qwik, Preact, …) — when the user mentions tailwind-to-stylex or tw-to-stylex, or when they have something "in Tailwind" and want it "in StyleX", even if they don't name this skill.
Its SKILL.md is about 2.7k tokens, which your agent loads only when the skill is triggered. The skill folder holds 23 other files, including reference files (for example `evals/evals.json`, `evals/files/button/package.json` and `evals/files/button/src/lib/utils.ts`). Compatibility notes: Any JavaScript-framework project (React, Preact, Solid, Svelte, Vue, Qwik, react-strict-dom, …) with StyleX (@stylexjs/stylex) and its compiler plugin…
It sits in Frontend & Design, covering CSS and styling and React components. It works with Tailwind CSS, React, Preact and Svelte. The repository describes itself as: CSS-in-JS port of shadcn/ui, built on StyleX. The licence is MIT.
7 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 08a2e9f. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Ships script files (TypeScript, from the files we listed), which the agent can run.
From the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Any JavaScript-framework project (React, Preact, Solid, Svelte, Vue, Qwik, react-strict-dom, …) with StyleX (@stylexjs/stylex) and its compiler plugin configured. If StyleX isn't set up yet, see references/stylex-rules.md ("Project setup").
From compatibility in the SKILL.md frontmatter.
Tailwind To Stylex loads about 2.7k tokens when it runs, and up to ~6.5k if it reads all its reference files. Until then it costs about 121 tokens; SKILL.md has 1,091 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from shadcn-labs/shadcn-cssinjs at commit 08a2e9f, republished under its MIT licence (© shadcn-labs). 1,091 words, ~2,652 tokens.
.claude/skills/tailwind-to-stylex/SKILL.md (or your agent's skills folder). This skill also uses 14 other files; get the full folder from GitHub.Convert Tailwind utility classes into StyleX styles: replace className="..." strings
with entries in a stylex.create({...}) call, and apply them with stylex.props(...).
This is a behavior-preserving refactor, not a redesign. The rendered pixels should not change. Don't drop styles you can't cleanly convert — flag them (see Step 6) so the user can decide, rather than silently changing the design.
The reliable way to convert a class string is the same one the tw-to-stylex codemod
uses under the hood: resolve each class to the CSS it actually produces, then reshape
that CSS into a StyleX object. Don't pattern-match class names to guesses — think in
the computed CSS, because that's what has to stay identical.
"px-4 py-2 text-sm font-medium hover:bg-blue-600"
│
▼ resolve to CSS (mind the project's Tailwind version + config)
padding-inline: 1rem; padding-block: .5rem;
font-size: .875rem; line-height: 1.25rem; font-weight: 500;
:hover { background-color: #2563eb }
│
▼ reshape to StyleX (camelCase, conditions as values)
{
paddingInline: '1rem',
paddingBlock: '0.5rem',
fontSize: '0.875rem',
lineHeight: '1.25rem',
fontWeight: 500,
backgroundColor: { default: null, ':hover': '#2563eb' },
}If a class uses arbitrary values (w-[37px]), the project's custom theme, or a plugin,
resolving-to-CSS still works — you read the value straight out of the class or the
config. When unsure what a class computes to (custom config, unfamiliar plugin), check
the project's tailwind.config / CSS @theme, or resolve it rather than guessing.
1. StyleX conditions are values, not rules. Tailwind spreads state and responsive
variants across separate rules (hover:, md:, dark:). StyleX instead nests the
condition inside the property value, and the default key is required whenever a
property has any condition (use null when there's no base value). This is the single
biggest shape difference — get it wrong and styles silently don't apply.
// md:flex hover:opacity-80 -> conditions live on each property
display: { default: 'block', '@media (min-width: 768px)': 'flex' },
opacity: { default: 1, ':hover': 0.8 },2. Some Tailwind utilities compile to selectors StyleX can't express on one element.
space-x-*, divide-*, group/group-hover:*, peer/peer-*:*, and typography's
prose all rely on descendant, sibling, or ancestor-state selectors. StyleX styles a
single element, so these don't map 1:1. Don't fake them — restructure (e.g. space-x →
gap on the flex parent; group-hover → lift state into React or a CSS variable) and
tell the user. See references/mapping.md for each case.
Work one component (file) at a time so each stays reviewable.
StyleX needs its compiler plugin wired into the bundler (Babel/Vite/Next/Webpack/rspack)
and @stylexjs/stylex installed — otherwise stylex.props returns nothing at runtime
and the migration looks broken. Check package.json and the bundler config. If it isn't
set up, read references/stylex-rules.md → "Project setup" and either configure it or
tell the user what's missing before converting. Note whether the target is React DOM or
react-strict-dom (React Native) — it changes how styles are applied (see the
react-strict-dom note in references/stylex-rules.md → "Project setup").
Locate every className/class in the file, including dynamic ones: cn(...),
clsx(...), twMerge(...), template literals, and ternaries. You need the complete
set of classes that can apply to each element, and under which conditions, to convert
faithfully.
stylex.create objectCreate one named entry per distinct element/variant (base, label, iconActive…) —
descriptive names beat $1, $2. For each, resolve its classes to CSS and reshape
(the core mechanic). Apply the StyleX authoring rules that differ from raw CSS:
border-radius → borderRadius).border: '1px solid red' →
borderWidth: 1, borderStyle: 'solid', borderColor: 'red'; a two-value padding →
paddingBlock / paddingInline. A single-value shorthand (padding: 16) is fine.width: 24 means 24px. Keep other units as strings ('1.5rem',
'50%', '100vh').default (see gotcha 1). Mobile-first: the
unprefixed class is default; sm/md/lg/xl/2xl become @media (min-width: …) keys.first/last, before/after,
arbitrary values, gradients, animations) lives in references/mapping.md — read it
whenever you hit anything past plain utilities.Steps 1–3 are identical for every framework — StyleX is framework-agnostic, and only applying the result differs. First pick the applicator for the target:
react-strict-dom): spread
stylex.props(...), which returns { className, style }.stylex.attrs(...)
instead — it returns a plain class string and a string style value to bind onto the
element. Which styles you pass and in what order is exactly the same as props.Then, whichever applicator you use:
div, span, button — lowercase): apply the result directly,
replacing the old className / class.stylex.props/attrs output directly.
Pass the style tokens down (e.g. a style prop) and let the component apply them on its
own host element. Don't just dump the applicator output onto a component and assume it works.cn(...). So cn('base', isActive && 'active') becomes
stylex.props(styles.base, isActive && styles.active) (or stylex.attrs(...)), and a
passed-in override stays last so callers can still win.If the same theme value (a brand color, a spacing step) recurs across the file or the
project uses semantic tokens, consider stylex.defineVars in a .stylex.ts file instead
of hardcoding — this is also the clean answer to class-based dark: theming
(createTheme). See references/stylex-rules.md → "Theming with variables". Don't force
this for one-off values.
Call out, in your summary, anything you couldn't map 1:1: the selector-based utilities from gotcha 2, any class you couldn't resolve, and any place you restructured markup. Losing a hover/dark/responsive style silently is the failure that matters most here.
Typecheck and run the linter on the changed files. If the project has the StyleX ESLint
plugin, it catches invalid shorthands, missing default, and unknown properties — fix
what it reports. Confirm no stray className / Tailwind imports remain on migrated
elements, and remove Tailwind directives/config only once the whole codebase is migrated
(not per-file). If deps aren't installed in your environment, say so and mark the check
as structural rather than claiming it runs.
// Before
import { cn } from '@/lib/utils'
export function Badge({ active, className }: Props) {
return (
<span
className={cn(
'inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-semibold',
active ? 'bg-green-100 text-green-800' : 'bg-gray-100 text-gray-600',
className,
)}
>
Status
</span>
)
}// After
import * as stylex from '@stylexjs/stylex'
const styles = stylex.create({
base: {
display: 'inline-flex',
alignItems: 'center',
borderRadius: '9999px',
paddingInline: '0.625rem',
paddingBlock: '0.125rem',
fontSize: '0.75rem',
lineHeight: '1rem',
fontWeight: 600,
},
active: { backgroundColor: '#dcfce7', color: '#166534' },
inactive: { backgroundColor: '#f3f4f6', color: '#4b5563' },
})
export function Badge({ active, style }: Props) {
return (
<span
{...stylex.props(styles.base, active ? styles.active : styles.inactive, style)}
>
Status
</span>
)
}Note what changed: text-xs carried two declarations (font-size and
line-height) — both were kept. The caller override moved from className to style
(StyleX passes styles, not class strings). The cn ternary became a stylex.props
ternary with identical last-wins order. This example is React; in Solid/Svelte/Vue/Qwik the
styles object is byte-for-byte the same — only the stylex.props call becomes
stylex.attrs and you bind the returned class/style the way that framework binds attributes.
references/mapping.md — Tailwind modifier/variant → StyleX condition table, and how
to handle the tricky utilities (space-x, divide, group/peer, dark mode,
arbitrary values, gradients, before/after, animations, sr-only). Read it for
anything beyond plain single-value utilities.references/stylex-rules.md — StyleX authoring rules, common mistakes, project setup,
framework support (stylex.props vs stylex.attrs), and theming with
defineVars/createTheme. Read it when setting up StyleX, migrating a non-React
framework, or when the ESLint plugin flags something.© shadcn-labs, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 14 other files (references) in .agents/skills/tailwind-to-stylex of shadcn-labs/shadcn-cssinjs.
Open the folder on GitHubat commit 08a2e9f
Tailwind To Stylex next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Tailwind To Stylex this skillshadcn-labs/shadcn-cssinjs | 124 | — | ~2.7k | Automated safety check: Pass | MIT | |
| Atlaspacifio/ui | 154 | — | ~2.5k | Automated safety check: Pass | MIT | |
| Kill AI Slopyetone/kill-ai-slop | 1.3k | — | ~1.4k | Automated safety check: Pass | Apache-2.0 | |
| Design StyleCastor6/tactus | 376 | 1 repos | ~2.1k | Automated safety check: Pass | Apache-2.0 | |
| UI UX Pro Maxsundial-org/awesome-openclaw-skills | 663 | 2 repos | ~657 | Automated safety check: Pass | None | |
| GlideSrivarsanK/Glide | 120 | — | ~1.7k | Automated safety check: Pass | Apache-2.0 |
pacifio/ui
Atlas — a design language and UI guide system for agent interfaces.
yetone/kill-ai-slop
Find and remove AI slop — the generic, machine-default visual and copy tics of vibe-coded products — from a web project.
Castor6/tactus
A skill your agent uses whenever the user asks to build, create, design, develop, improve, or style any frontend interface or visual element.
sundial-org/awesome-openclaw-skills
UI/UX design intelligence and implementation guidance for building polished interfaces.
SrivarsanK/Glide
Authoritative guide and toolset for AI agents to operate, configure, and visually design applications using Glide (@srivarsank/glide).
ever-works/ever-works
Provides comprehensive Tailwind CSS utility-first styling patterns including responsive design, layout utilities, flexbox, grid, spacing, typography, colors, and modern CSS best practices.
Categories
Migrate TailwindCSS to StyleX. An agent skill from shadcn-labs/shadcn-cssinjs. Tailwind To Stylex is an agent skill from shadcn-labs/shadcn-cssinjs. Migrate TailwindCSS to StyleX.
Tailwind To Stylex fits situations like: converting Tailwind className utility strings into StyleX stylex.create + stylex.props/stylex.attrs — a single component; A whole codebase; in React/JSX/TSX; React-strict-dom.
Run `npx skills add shadcn-labs/shadcn-cssinjs --skill tailwind-to-stylex -a claude-code`. Or copy the skill folder (.agents/skills/tailwind-to-stylex in shadcn-labs/shadcn-cssinjs) into .claude/skills/tailwind-to-stylex in your project. Claude Code loads it when a task matches its description.
Run `npx skills add shadcn-labs/shadcn-cssinjs --skill tailwind-to-stylex -a codex`. Or copy the skill folder (.agents/skills/tailwind-to-stylex in shadcn-labs/shadcn-cssinjs) into .agents/skills/tailwind-to-stylex in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add shadcn-labs/shadcn-cssinjs --skill tailwind-to-stylex -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/tailwind-to-stylex, .gemini/skills/tailwind-to-stylex, .github/skills/tailwind-to-stylex and .opencode/skills/tailwind-to-stylex in your project.
Going by SKILL.md and its folder, Tailwind To Stylex needs TypeScript for the scripts in its folder. Our summary lists: Node.js. Compatibility (from SKILL.md): Any JavaScript-framework project (React, Preact, Solid, Svelte, Vue, Qwik, react-strict-dom, …) with StyleX (@stylexjs/stylex) and its compiler plugin configured. If StyleX isn't set up yet, see references/stylex-rules.md ("Project setup")..
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Tailwind To Stylex is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 2.7k tokens (SKILL.md is roughly 11k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 3.8k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Tailwind To Stylex: Atlas (pacifio/ui, 154 stars), Kill AI Slop (yetone/kill-ai-slop, 1.3k stars), Design Style (Castor6/tactus, 376 stars) and UI UX Pro Max (sundial-org/awesome-openclaw-skills, 663 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
shadcn-labs (a GitHub organization) maintains it in shadcn-labs/shadcn-cssinjs, which has 124 GitHub stars. The repository was last updated on September 11, 2026.
Source: shadcn-labs/shadcn-cssinjs on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.