// pangolin_button.dart — 胶囊按钮(primary / secondary / ghost / danger) import 'package:flutter/material.dart'; import '../pangolin_theme.dart'; enum PangolinButtonVariant { primary, secondary, ghost, danger } class PangolinButton extends StatelessWidget { const PangolinButton({ super.key, required this.label, this.onPressed, this.icon, this.variant = PangolinButtonVariant.primary, this.expand = false, }); final String label; final VoidCallback? onPressed; final IconData? icon; final PangolinButtonVariant variant; final bool expand; @override Widget build(BuildContext context) { final c = context.pangolin; final disabled = onPressed == null; late final Color bg, fg; Border? border; switch (variant) { case PangolinButtonVariant.primary: bg = c.accent; fg = c.fgOnAccent; break; case PangolinButtonVariant.secondary: bg = c.surface; fg = c.fg1; border = Border.all(color: c.borderStrong, width: 1.5); break; case PangolinButtonVariant.ghost: bg = Colors.transparent; fg = c.accent; break; case PangolinButtonVariant.danger: bg = c.dangerSubtle; fg = c.danger; break; } final child = Row( mainAxisSize: expand ? MainAxisSize.max : MainAxisSize.min, mainAxisAlignment: MainAxisAlignment.center, children: [ if (icon != null) ...[Icon(icon, size: 18, color: fg), const SizedBox(width: 8)], Text(label, style: PangolinText.sm.copyWith(color: fg, fontWeight: FontWeight.w600, fontSize: 15)), ], ); return Opacity( opacity: disabled ? 0.45 : 1, child: Material( color: bg, shape: StadiumBorder(side: border?.top ?? BorderSide.none), clipBehavior: Clip.antiAlias, child: InkWell( onTap: onPressed, child: Padding( padding: const EdgeInsets.symmetric(horizontal: 22, vertical: 13), child: child, ), ), ), ); } }