buttonClasses function

String buttonClasses({
  1. ButtonVariant variant = ButtonVariant.primary,
  2. ButtonSize size = ButtonSize.md,
  3. String extraClassName = '',
})

Resolves CSS classes for ButtonVariant and ButtonSize.

Implementation

String buttonClasses({
  ButtonVariant variant = ButtonVariant.primary,
  ButtonSize size = ButtonSize.md,
  String extraClassName = '',
}) {
  const base =
      'inline-flex items-center justify-center gap-1.5 font-medium transition-colors '
      'select-none focus-visible:outline-none focus-visible:ring-2 '
      'focus-visible:ring-[var(--ring)] focus-visible:ring-offset-2 '
      'disabled:opacity-50 disabled:pointer-events-none rounded-[var(--radius-md)]';

  String sizeClass;
  switch (size) {
    case ButtonSize.sm:
      sizeClass = 'h-8 px-2.5 text-xs';
      break;
    case ButtonSize.md:
      sizeClass = 'h-9 px-4 py-2 text-sm';
      break;
    case ButtonSize.lg:
      sizeClass = 'h-10 px-5 text-base';
      break;
    case ButtonSize.icon:
      sizeClass = 'h-9 w-9 p-0';
      break;
  }

  String variantClass;
  switch (variant) {
    case ButtonVariant.primary:
      variantClass =
          'bg-[var(--primary)] text-[var(--primary-foreground)] hover:bg-[var(--primary-hover)]';
      break;
    case ButtonVariant.secondary:
      variantClass =
          'bg-[var(--secondary)] text-[var(--secondary-foreground)] hover:bg-[var(--secondary-hover)]';
      break;
    case ButtonVariant.outline:
      variantClass =
          'border border-[var(--border)] bg-transparent text-[var(--text)] hover:bg-[var(--bg-muted)]';
      break;
    case ButtonVariant.ghost:
      variantClass =
          'bg-transparent text-[var(--text)] hover:bg-[var(--bg-muted)]';
      break;
    case ButtonVariant.destructive:
      variantClass =
          'bg-[var(--destructive)] text-[var(--destructive-foreground)] hover:bg-[var(--danger-hover)]';
      break;
    case ButtonVariant.link:
      variantClass =
          'text-[var(--primary)] underline-offset-4 hover:underline bg-transparent p-0 h-auto';
      break;
  }

  return cn([base, sizeClass, variantClass, extraClassName]);
}