Vela home

Vela

Tailwind-style className compilation for roblox-ts React interfaces.

vela-rbxts · v0.2.0 · pre-1.0

Vela adds className to roblox-ts React elements and compiles it away. A supported utility class becomes a Roblox property or a helper instance at build time — p-4 becomes a UIPadding child, rounded-lg becomes a UICorner, bg-slate-700 becomes BackgroundColor3. Nothing about Vela survives into the shipped Lua unless a class genuinely needs to be evaluated at runtime.

It is not Tailwind parity, and it does not try to be. Vela implements a Roblox-oriented slice of the utility vocabulary, mapped onto the instances Roblox actually gives you. On the compile-time path it reports a diagnostic for most of what it cannot lower, rather than quietly dropping it — but not for all of it. A few cases still fall through silently, such as a gradient stop set to transparent or a class the runtime host cannot resolve.

className in, Roblox props out.
<frame className="flex flex-col gap-4 p-4 w-80 rounded-lg bg-slate-800 border border-slate-700">
<textlabel className="text-lg font-semibold text-slate-50" Text="Party" />
<textbutton className="h-10 rounded-md bg-blue-600 text-white" Text="Invite" />
</frame>
Compiled, not interpreted
Static classes lower to Roblox props and helper instances during the roblox-ts build. No runtime cost, no generated folder.
Roblox-shaped, not Tailwind-shaped
Utilities map onto UIPadding, UIListLayout, UICorner, UIStroke, and the rest — the instances Roblox actually gives you.
Loud about its gaps
Unsupported families and unknown theme keys emit diagnostics instead of silently doing nothing.

Guides

Learn what lowers, and what doesn't.

Reference

Every class, value, and code.

Pre-1.0, and narrow on purpose.

Packages version in lockstep. Whole Tailwind families are not implemented, a dynamic className resolves against a much smaller utility set than a static one, and per-element restrictions are enforced by the editor rather than the compiler. Read the scope before you depend on a class.

Scope and status →