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.
<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>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.