{"version":3,"file":"AlertLabel.cjs","sources":["../../../../../../src/grafana/rules/components/labels/AlertLabel.tsx"],"sourcesContent":["import { css, cx } from '@emotion/css';\nimport { CSSProperties, HTMLAttributes, useMemo } from 'react';\nimport tinycolor2 from 'tinycolor2';\nimport { MergeExclusive } from 'type-fest';\n\nimport { GrafanaTheme2, IconName } from '@grafana/data';\nimport { Icon, Stack, getTagColorsFromName, useStyles2 } from '@grafana/ui';\n\nexport type LabelSize = 'md' | 'sm' | 'xs';\n\ninterface BaseProps extends Omit<HTMLAttributes<HTMLDivElement>, 'onClick' | 'className'> {\n  icon?: IconName;\n  labelKey?: string;\n  value?: string;\n  size?: LabelSize;\n  onClick?: ([value, key]: [string | undefined, string | undefined]) => void;\n}\n\ntype Props = BaseProps & MergeExclusive<{ color?: string }, { colorBy?: 'key' | 'value' | 'both' }>;\n\nconst AlertLabel = (props: Props) => {\n  const { labelKey, value, icon, color, colorBy, size = 'md', onClick, ...rest } = props;\n  const theColor = getColorFromProps({ color, colorBy, labelKey, value });\n  const styles = useStyles2(getStyles, theColor, size);\n\n  const ariaLabel = `${labelKey}: ${value}`;\n  const keyless = !Boolean(labelKey);\n\n  const innerLabel = useMemo(\n    () => (\n      <Stack direction=\"row\" gap={0} alignItems=\"stretch\">\n        {labelKey && (\n          <div className={styles.label}>\n            <Stack direction=\"row\" gap={0.5} alignItems=\"center\">\n              {icon && <Icon name={icon} />}\n              {labelKey && (\n                <span className={styles.labelText} title={labelKey.toString()}>\n                  {labelKey ?? ''}\n                </span>\n              )}\n            </Stack>\n          </div>\n        )}\n        <div className={cx(styles.value, keyless && styles.valueWithoutKey)} title={value?.toString()}>\n          {value ?? '-'}\n        </div>\n      </Stack>\n    ),\n    [labelKey, styles.label, styles.labelText, styles.value, styles.valueWithoutKey, icon, keyless, value]\n  );\n\n  return (\n    <div className={styles.wrapper} aria-label={ariaLabel} data-testid=\"label-value\" {...rest}>\n      {onClick && (labelKey || value) ? (\n        <button\n          type=\"button\"\n          className={styles.clickable}\n          key={`${labelKey ?? ''}${value ?? ''}`}\n          onClick={() => onClick?.([value ?? '', labelKey ?? ''])}\n        >\n          {innerLabel}\n        </button>\n      ) : (\n        innerLabel\n      )}\n    </div>\n  );\n};\n\nfunction getAccessibleTagColor(name?: string): string | undefined {\n  if (!name) {\n    return;\n  }\n  const attempts = Array.from({ length: 6 }, (_, i) => name + '-'.repeat(i));\n  const readableAttempt = attempts.find((attempt) => {\n    const candidate = getTagColorsFromName(attempt).color;\n    return (\n      tinycolor2.isReadable(candidate, '#000', { level: 'AA', size: 'small' }) ||\n      tinycolor2.isReadable(candidate, '#fff', { level: 'AA', size: 'small' })\n    );\n  });\n  const chosen = readableAttempt ?? name;\n  return getTagColorsFromName(chosen).color;\n}\n\nfunction getColorFromProps({\n  color,\n  colorBy,\n  labelKey,\n  value,\n}: Pick<Props, 'color' | 'colorBy' | 'labelKey' | 'value'>) {\n  if (color) {\n    return getAccessibleTagColor(color);\n  }\n\n  if (colorBy === 'key') {\n    return getAccessibleTagColor(labelKey);\n  }\n\n  if (colorBy === 'value') {\n    return getAccessibleTagColor(value);\n  }\n\n  if (colorBy === 'both' && labelKey && value) {\n    return getAccessibleTagColor(labelKey + value);\n  }\n\n  return;\n}\n\nfunction getReadableFontColor(bg: string, fallback: string): string {\n  // First: explicitly check black\n  if (tinycolor2.isReadable(bg, '#000', { level: 'AA', size: 'small' })) {\n    return '#000';\n  }\n\n  // Then: explicitly check white\n  if (tinycolor2.isReadable(bg, '#fff', { level: 'AA', size: 'small' })) {\n    return '#fff';\n  }\n\n  // Then: try fallback if it’s readable\n  if (tinycolor2.isReadable(bg, fallback, { level: 'AA', size: 'small' })) {\n    return tinycolor2(fallback).toHexString();\n  }\n\n  // Last resort: pick the \"most readable\", even if not AA-compliant\n  return tinycolor2\n    .mostReadable(bg, ['#000', '#fff', fallback], {\n      includeFallbackColors: true,\n    })\n    .toHexString();\n}\n\nconst getStyles = (theme: GrafanaTheme2, color?: string, size?: string) => {\n  const backgroundColor = color ?? theme.colors.secondary.main;\n\n  const borderColor = theme.isDark\n    ? tinycolor2(backgroundColor).lighten(5).toString()\n    : tinycolor2(backgroundColor).darken(5).toString();\n\n  const valueBackgroundColor = theme.isDark\n    ? tinycolor2(backgroundColor).darken(5).toString()\n    : tinycolor2(backgroundColor).lighten(5).toString();\n\n  const labelFontColor = color\n    ? getReadableFontColor(backgroundColor, theme.colors.text.primary)\n    : theme.colors.text.primary;\n\n  const valueFontColor = color\n    ? getReadableFontColor(valueBackgroundColor, theme.colors.text.primary)\n    : theme.colors.text.primary;\n\n  let padding: CSSProperties['padding'] = theme.spacing(0.33, 1);\n\n  switch (size) {\n    case 'sm':\n      padding = theme.spacing(0.2, 0.6);\n      break;\n    case 'xs':\n      padding = theme.spacing(0, 0.5);\n      break;\n    default:\n      break;\n  }\n\n  return {\n    wrapper: css({\n      fontSize: theme.typography.bodySmall.fontSize,\n      borderRadius: theme.shape.borderRadius(2),\n    }),\n    labelText: css({\n      whiteSpace: 'nowrap',\n      overflow: 'hidden',\n      textOverflow: 'ellipsis',\n      maxWidth: '300px',\n    }),\n    label: css({\n      display: 'flex',\n      alignItems: 'center',\n      color: labelFontColor,\n\n      padding: padding,\n      background: backgroundColor,\n\n      border: `solid 1px ${borderColor}`,\n      borderTopLeftRadius: theme.shape.borderRadius(2),\n      borderBottomLeftRadius: theme.shape.borderRadius(2),\n    }),\n    clickable: css({\n      border: 'none',\n      background: 'none',\n      outline: 'none',\n      boxShadow: 'none',\n\n      padding: 0,\n      margin: 0,\n\n      '&:hover': {\n        opacity: 0.8,\n        cursor: 'pointer',\n      },\n    }),\n    value: css({\n      color: valueFontColor,\n      padding: padding,\n      background: valueBackgroundColor,\n      border: `solid 1px ${borderColor}`,\n      borderLeft: 'none',\n      borderTopRightRadius: theme.shape.borderRadius(2),\n      borderBottomRightRadius: theme.shape.borderRadius(2),\n      whiteSpace: 'pre',\n      overflow: 'hidden',\n      textOverflow: 'ellipsis',\n      maxWidth: '300px',\n    }),\n    valueWithoutKey: css({\n      borderTopLeftRadius: theme.shape.borderRadius(2),\n      borderBottomLeftRadius: theme.shape.borderRadius(2),\n      borderLeft: `solid 1px ${borderColor}`,\n    }),\n  };\n};\n\nexport { AlertLabel };\nexport type AlertLabelProps = Props;\n"],"names":["useStyles2","useMemo","Stack","jsx","jsxs","Icon","cx","getTagColorsFromName","tinycolor2","css"],"mappings":"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"}