cx method
Composes a class list resolving author class names to their scoped equivalents.
Evaluates each part in parts:
nullandfalsevalues are ignored, enabling concise conditional classes.- Space-separated strings (e.g.
'card active') are split into individual tokens. - Tokens present in classes are replaced with their scoped class name.
- Unmatched string tokens (e.g. utility classes like
'p-4','flex','text-sm') are preserved as-is. - Joins all resolved tokens with single spaces.
Safe for both SSR and client-side DOM mounting.
final isActive = true;
final isDisabled = false;
final className = styles.cx([
'card',
isActive && 'active',
isDisabled && 'disabled',
'p-4 flex items-center',
]);
// => 'card_card__a1b2c3d card_active__a1b2c3d p-4 flex items-center'
Implementation
String cx(List<Object?> parts) {
final out = StringBuffer();
for (final part in parts) {
if (part == null || part == false) continue;
final s = part.toString().trim();
if (s.isEmpty) continue;
final tokens = s.split(RegExp(r'\s+'));
for (final token in tokens) {
if (token.isEmpty) continue;
final resolved = classes[token] ?? token;
if (out.isNotEmpty) out.write(' ');
out.write(resolved);
}
}
return out.toString();
}