{"version":3,"file":"Button.mjs","sources":["../../../../src/components/Button/Button.tsx"],"sourcesContent":["import { css, cx } from '@emotion/css';\nimport { AnchorHTMLAttributes, ButtonHTMLAttributes } from 'react';\nimport * as React from 'react';\n\nimport { GrafanaTheme2, ThemeRichColor } from '@grafana/data';\n\nimport { useTheme2 } from '../../themes/ThemeContext';\nimport { getButtonFocusStyles, getMouseFocusStyles } from '../../themes/mixins';\nimport { IconName, IconSize, IconType } from '../../types/icon';\nimport { ComponentSize } from '../../types/size';\nimport { getPropertiesForButtonSize } from '../Forms/commonStyles';\nimport { Icon } from '../Icon/Icon';\nimport { Tooltip } from '../Tooltip/Tooltip';\nimport { PopoverContent, TooltipPlacement } from '../Tooltip/types';\n\nexport type ButtonVariant = 'primary' | 'secondary' | 'destructive' | 'success';\nexport const allButtonVariants: ButtonVariant[] = ['primary', 'secondary', 'destructive'];\nexport type ButtonFill = 'solid' | 'outline' | 'text';\nexport const allButtonFills: ButtonFill[] = ['solid', 'outline', 'text'];\n\ntype BaseProps = {\n  size?: ComponentSize;\n  variant?: ButtonVariant;\n  fill?: ButtonFill;\n  icon?: IconName | React.ReactElement<IconElementProps>;\n  className?: string;\n  fullWidth?: boolean;\n  type?: string;\n  tooltip?: PopoverContent;\n  tooltipPlacement?: TooltipPlacement;\n  /** Position of the icon */\n  iconPlacement?: 'left' | 'right';\n};\n\n// either aria-label or tooltip is required for buttons without children\ntype NoChildrenAriaLabel = BaseProps & {\n  children?: never;\n  'aria-label': string;\n};\ntype NoChildrenTooltip = BaseProps & {\n  children?: never;\n  tooltip: PopoverContent;\n  tooltipPlacement?: TooltipPlacement;\n};\n\ntype BasePropsWithChildren = BaseProps & {\n  children: React.ReactNode;\n};\n\ntype CommonProps = BasePropsWithChildren | NoChildrenTooltip | NoChildrenAriaLabel;\n\nexport type ButtonProps = CommonProps & ButtonHTMLAttributes<HTMLButtonElement>;\n\n/**\n * https://developers.grafana.com/ui/latest/index.html?path=/docs/inputs-button--docs\n */\nexport const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n  (\n    {\n      'aria-label': ariaLabel,\n      variant = 'primary',\n      size = 'md',\n      fill = 'solid',\n      icon,\n      fullWidth,\n      children,\n      className,\n      type = 'button',\n      tooltip,\n      disabled,\n      tooltipPlacement,\n      iconPlacement = 'left',\n      onClick,\n      ...otherProps\n    },\n    ref\n  ) => {\n    const theme = useTheme2();\n    const styles = getButtonStyles({\n      theme,\n      size,\n      variant,\n      fill,\n      fullWidth,\n      iconOnly: !children,\n    });\n\n    const buttonStyles = cx(\n      styles.button,\n      {\n        [styles.disabled]: disabled,\n      },\n      className\n    );\n\n    const hasTooltip = Boolean(tooltip);\n\n    const iconComponent = icon && <IconRenderer icon={icon} size={size} className={styles.icon} />;\n\n    // In order to standardise Button please always consider using IconButton when you need a button with an icon only\n    // When using tooltip, ref is forwarded to Tooltip component instead for https://github.com/grafana/grafana/issues/65632\n    const button = (\n      <button\n        className={buttonStyles}\n        type={type}\n        onClick={disabled ? undefined : onClick}\n        {...otherProps}\n        // In order for the tooltip to be accessible when disabled,\n        // we need to set aria-disabled instead of the native disabled attribute\n        aria-disabled={hasTooltip && disabled}\n        disabled={!hasTooltip && disabled}\n        ref={tooltip ? undefined : ref}\n        aria-label={ariaLabel ?? (!children && typeof tooltip === 'string' ? tooltip : undefined)}\n      >\n        {iconPlacement === 'left' && iconComponent}\n        {children && <span className={styles.content}>{children}</span>}\n        {iconPlacement === 'right' && iconComponent}\n      </button>\n    );\n\n    if (tooltip) {\n      return (\n        <Tooltip ref={ref} content={tooltip} placement={tooltipPlacement}>\n          {button}\n        </Tooltip>\n      );\n    }\n\n    return button;\n  }\n);\n\nButton.displayName = 'Button';\n\nexport type ButtonLinkProps = ButtonProps & Omit<AnchorHTMLAttributes<HTMLAnchorElement>, 'aria-label'>;\n\nexport const LinkButton = React.forwardRef<HTMLAnchorElement, ButtonLinkProps>(\n  (\n    {\n      'aria-label': ariaLabel,\n      variant = 'primary',\n      size = 'md',\n      fill = 'solid',\n      icon,\n      iconPlacement = 'left',\n      fullWidth,\n      children,\n      className,\n      onBlur,\n      onFocus,\n      disabled,\n      tooltip,\n      tooltipPlacement,\n      ...otherProps\n    },\n    ref\n  ) => {\n    const theme = useTheme2();\n    const styles = getButtonStyles({\n      theme,\n      fullWidth,\n      size,\n      variant,\n      fill,\n      iconOnly: !children,\n    });\n\n    const linkButtonStyles = cx(\n      styles.button,\n      {\n        [css(styles.disabled, {\n          pointerEvents: 'none',\n        })]: disabled,\n      },\n      className\n    );\n\n    const iconComponent = icon && <IconRenderer icon={icon} size={size} className={styles.icon} />;\n\n    // When using tooltip, ref is forwarded to Tooltip component instead for https://github.com/grafana/grafana/issues/65632\n    const button = (\n      <a\n        className={linkButtonStyles}\n        {...otherProps}\n        tabIndex={disabled ? -1 : 0}\n        aria-disabled={disabled}\n        ref={tooltip ? undefined : ref}\n        aria-label={ariaLabel ?? (!children && typeof tooltip === 'string' ? tooltip : undefined)}\n      >\n        {iconPlacement === 'left' && iconComponent}\n        {children && <span className={styles.content}>{children}</span>}\n        {iconPlacement === 'right' && iconComponent}\n      </a>\n    );\n\n    if (tooltip) {\n      return (\n        <Tooltip ref={ref} content={tooltip} placement={tooltipPlacement}>\n          {button}\n        </Tooltip>\n      );\n    }\n\n    return button;\n  }\n);\n\nLinkButton.displayName = 'LinkButton';\n\ntype IconElementProps = {\n  className?: string;\n  size?: IconSize;\n};\n\ninterface IconRendererProps {\n  icon?: IconName | React.ReactElement<IconElementProps>;\n  size?: IconSize;\n  className?: string;\n  iconType?: IconType;\n}\nexport const IconRenderer = ({ icon, size, className, iconType }: IconRendererProps) => {\n  if (!icon) {\n    return null;\n  }\n  if (React.isValidElement(icon)) {\n    return React.cloneElement(icon, {\n      className,\n      size,\n    });\n  }\n  return <Icon name={icon} size={size} className={className} type={iconType} />;\n};\n\nexport interface StyleProps {\n  size: ComponentSize;\n  variant: ButtonVariant;\n  fill?: ButtonFill;\n  iconOnly?: boolean;\n  theme: GrafanaTheme2;\n  fullWidth?: boolean;\n  narrow?: boolean;\n}\n\nexport const getButtonStyles = (props: StyleProps) => {\n  const { theme, variant, fill = 'solid', size, iconOnly, fullWidth } = props;\n  const { height, padding, fontSize } = getPropertiesForButtonSize(size, theme);\n  const variantStyles = getPropertiesForVariant(theme, variant, fill);\n  const disabledStyles = getPropertiesForDisabled(theme, variant, fill);\n  const focusStyle = getButtonFocusStyles(theme);\n  const paddingMinusBorder = theme.spacing.gridSize * padding - 1;\n\n  return {\n    button: css({\n      label: 'button',\n      display: 'inline-flex',\n      alignItems: 'center',\n      gap: theme.spacing(1),\n      fontSize: fontSize,\n      fontWeight: theme.typography.fontWeightMedium,\n      fontFamily: theme.typography.fontFamily,\n      padding: `0 ${paddingMinusBorder}px`,\n      height: theme.spacing(height),\n      // Deduct border from line-height for perfect vertical centering on windows and linux\n      lineHeight: `${theme.spacing.gridSize * height - 2}px`,\n      verticalAlign: 'middle',\n      cursor: 'pointer',\n      borderRadius: theme.shape.radius.default,\n      '&:focus': focusStyle,\n      '&:focus-visible': focusStyle,\n      '&:focus:not(:focus-visible)': getMouseFocusStyles(theme),\n      ...(fullWidth && {\n        flexGrow: 1,\n        justifyContent: 'center',\n      }),\n      ...variantStyles,\n      ':disabled': disabledStyles,\n      '&[disabled]': disabledStyles,\n\n      [theme.transitions.handleMotion('no-preference', 'reduce')]: {\n        transition: theme.transitions.create(['background-color', 'border-color', 'color'], {\n          duration: theme.transitions.duration.short,\n        }),\n      },\n    }),\n    disabled: css(disabledStyles, {\n      '&:hover': css(disabledStyles),\n    }),\n    img: css({\n      width: '16px',\n      height: '16px',\n      margin: theme.spacing(0, 1, 0, 0.5),\n    }),\n    icon: iconOnly\n      ? css({\n          // Important not to set margin bottom here as it would override internal icon bottom margin\n          marginRight: theme.spacing(-padding / 2),\n          marginLeft: theme.spacing(-padding / 2),\n        })\n      : undefined,\n    content: css({\n      display: 'flex',\n      flexDirection: 'row',\n      alignItems: 'center',\n      whiteSpace: 'nowrap',\n      overflow: 'hidden',\n      height: '100%',\n    }),\n  };\n};\n\nexport function getActiveButtonStyles(color: ThemeRichColor, fill: ButtonFill) {\n  return {\n    background: fill === 'solid' ? color.main : 'transparent',\n  };\n}\n\nexport function getButtonVariantStyles(theme: GrafanaTheme2, color: ThemeRichColor, fill: ButtonFill) {\n  let outlineBorderColor = color.border;\n  let borderColor = 'transparent';\n  let hoverBorderColor = 'transparent';\n\n  // Secondary button has some special rules as we lack the color token to\n  // specify border color for normal button vs border color for outline button\n  if (color.name === 'secondary') {\n    borderColor = color.border;\n    hoverBorderColor = theme.colors.emphasize(color.border, 0.25);\n    outlineBorderColor = theme.colors.border.strong;\n  }\n\n  if (fill === 'outline') {\n    return {\n      background: 'transparent',\n      color: color.text,\n      border: `1px solid ${outlineBorderColor}`,\n\n      '&:hover, &:focus': {\n        background: color.transparent,\n        borderColor: theme.colors.emphasize(outlineBorderColor, 0.25),\n        color: color.text,\n      },\n\n      '&:active': {\n        ...getActiveButtonStyles(color, fill),\n      },\n    };\n  }\n\n  if (fill === 'text') {\n    return {\n      background: 'transparent',\n      color: color.text,\n      border: '1px solid transparent',\n\n      '&:hover, &:focus': {\n        background: color.transparent,\n        textDecoration: 'none',\n        outline: 'none',\n      },\n\n      '&:active': {\n        ...getActiveButtonStyles(color, fill),\n      },\n    };\n  }\n\n  return {\n    background: color.main,\n    color: color.contrastText,\n    border: `1px solid ${borderColor}`,\n\n    '&:hover': {\n      background: color.shade,\n      color: color.contrastText,\n      boxShadow: theme.shadows.z1,\n      borderColor: hoverBorderColor,\n    },\n\n    '&:focus': {\n      background: color.shade,\n      color: color.contrastText,\n    },\n\n    '&:active': {\n      ...getActiveButtonStyles(color, fill),\n    },\n  };\n}\n\nfunction getPropertiesForDisabled(theme: GrafanaTheme2, variant: ButtonVariant, fill: ButtonFill) {\n  const disabledStyles = {\n    cursor: 'not-allowed',\n    boxShadow: 'none',\n    color: theme.colors.text.disabled,\n    transition: 'none',\n    background: theme.colors.action.disabledBackground,\n  };\n\n  if (fill === 'text') {\n    return {\n      ...disabledStyles,\n      background: 'transparent',\n      border: `1px solid transparent`,\n    };\n  }\n\n  if (fill === 'outline') {\n    return {\n      ...disabledStyles,\n      background: 'transparent',\n      border: `1px solid ${theme.colors.border.weak}`,\n    };\n  }\n\n  return {\n    ...disabledStyles,\n    background: theme.colors.action.disabledBackground,\n    border: `1px solid transparent`,\n  };\n}\n\nexport function getPropertiesForVariant(theme: GrafanaTheme2, variant: ButtonVariant, fill: ButtonFill) {\n  switch (variant) {\n    case 'secondary':\n      // The seconday button has some special handling as it's outline border is it's default color border\n      return getButtonVariantStyles(theme, theme.colors.secondary, fill);\n\n    case 'destructive':\n      return getButtonVariantStyles(theme, theme.colors.error, fill);\n\n    case 'success':\n      return getButtonVariantStyles(theme, theme.colors.success, fill);\n\n    case 'primary':\n    default:\n      return getButtonVariantStyles(theme, theme.colors.primary, fill);\n  }\n}\n\nexport const clearButtonStyles = (theme: GrafanaTheme2) => {\n  return css({\n    background: 'transparent',\n    color: theme.colors.text.primary,\n    border: 'none',\n    padding: 0,\n  });\n};\n\nexport const clearLinkButtonStyles = (theme: GrafanaTheme2) => {\n  return css({\n    background: 'transparent',\n    border: 'none',\n    padding: 0,\n    fontFamily: 'inherit',\n    color: 'inherit',\n    height: '100%',\n    cursor: 'context-menu',\n    '&:hover': {\n      background: 'transparent',\n      color: 'inherit',\n    },\n  });\n};\n"],"names":[],"mappings":"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"}