@grafana/ui
Version:
Grafana Components Library
1 lines • 20.1 kB
Source Map (JSON)
{"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 { getFocusStyles, 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 CommonProps = {\n size?: ComponentSize;\n variant?: ButtonVariant;\n fill?: ButtonFill;\n icon?: IconName | React.ReactElement;\n className?: string;\n children?: React.ReactNode;\n fullWidth?: boolean;\n type?: string;\n /** Tooltip content to display on hover */\n tooltip?: PopoverContent;\n /** Position of the tooltip */\n tooltipPlacement?: TooltipPlacement;\n /** Position of the icon */\n iconPlacement?: 'left' | 'right';\n};\n\nexport type ButtonProps = CommonProps & ButtonHTMLAttributes<HTMLButtonElement>;\n\nexport const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\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 >\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 = CommonProps &\n ButtonHTMLAttributes<HTMLButtonElement> &\n AnchorHTMLAttributes<HTMLAnchorElement>;\n\nexport const LinkButton = React.forwardRef<HTMLAnchorElement, ButtonLinkProps>(\n (\n {\n variant = 'primary',\n size = 'md',\n fill = 'solid',\n icon,\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 // 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 >\n <IconRenderer icon={icon} size={size} className={styles.icon} />\n {children && <span className={styles.content}>{children}</span>}\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\ninterface IconRendererProps {\n icon?: IconName | React.ReactElement<{ className?: string; size?: IconSize }>;\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 = getFocusStyles(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 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\nfunction 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 theem 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 transition: theme.transitions.create(['background-color', 'border-color', 'color'], {\n duration: theme.transitions.duration.short,\n }),\n\n '&:hover': {\n background: color.transparent,\n borderColor: theme.colors.emphasize(outlineBorderColor, 0.25),\n color: color.text,\n },\n };\n }\n\n if (fill === 'text') {\n return {\n background: 'transparent',\n color: color.text,\n border: '1px solid transparent',\n transition: theme.transitions.create(['background-color', 'color'], {\n duration: theme.transitions.duration.short,\n }),\n\n '&:focus': {\n outline: 'none',\n textDecoration: 'none',\n },\n\n '&:hover': {\n background: color.transparent,\n textDecoration: 'none',\n },\n };\n }\n\n return {\n background: color.main,\n color: color.contrastText,\n border: `1px solid ${borderColor}`,\n transition: theme.transitions.create(['background-color', 'box-shadow', 'border-color', 'color'], {\n duration: theme.transitions.duration.short,\n }),\n\n '&:hover': {\n background: color.shade,\n color: color.contrastText,\n boxShadow: theme.shadows.z1,\n borderColor: hoverBorderColor,\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 };\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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"}