button function

BloomNode button({
  1. required String text,
  2. BloomEventHandler? onClick,
  3. String? href,
  4. ButtonVariant variant = ButtonVariant.primary,
  5. ButtonSize size = ButtonSize.md,
  6. bool disabled = false,
  7. String? icon,
  8. bool loading = false,
  9. String extraClassName = '',
  10. Map<String, String> attrs = const {},
  11. List<BloomNode>? children,
})

Generic Button primitive for Bloom UI.

Implementation

BloomNode button({
  required String text,
  BloomEventHandler? onClick,
  String? href,
  ButtonVariant variant = ButtonVariant.primary,
  ButtonSize size = ButtonSize.md,
  bool disabled = false,
  String? icon,
  bool loading = false,
  String extraClassName = '',
  Map<String, String> attrs = const {},
  List<BloomNode>? children,
}) {
  final isInactive = disabled || loading;
  final className = buttonClasses(
    variant: variant,
    size: size,
    extraClassName: isInactive
        ? cn(['opacity-50 pointer-events-none', extraClassName])
        : extraClassName,
  );

  final content = <BloomNode>[
    if (loading)
      uiIcon('spinner', className: 'w-4 h-4 animate-spin')
    else if (icon != null)
      uiIcon(icon, className: 'w-4 h-4'),
    if (text.isNotEmpty) Text(text),
    if (children != null) ...children,
  ];

  if (href != null && !isInactive) {
    return Link(
      href: href,
      className: className,
      attrs: attrs,
      onClick: onClick,
      children: content,
    );
  }

  return El(
    'button',
    attrs: {
      'type': 'button',
      if (isInactive) 'disabled': 'true',
      if (isInactive) 'aria-disabled': 'true',
      ...attrs,
    },
    className: className,
    onClick: isInactive ? null : onClick,
    children: content,
  );
}