cx method

String cx(
  1. List<Object?> parts
)

Composes a class list resolving author class names to their scoped equivalents.

Evaluates each part in parts:

  • null and false values 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();
}