UNPKG

@grafana/ui

Version:
1 lines • 22.1 kB
{"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;\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 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 aria-label={ariaLabel ?? (!children && typeof tooltip === 'string' ? tooltip : undefined)}\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 = 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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"}