{"version":3,"file":"fieldColor.cjs","sources":["../../../src/field/fieldColor.ts"],"sourcesContent":["import { interpolateRgbBasis } from 'd3-interpolate';\nimport {\n  interpolateViridis,\n  interpolateMagma,\n  interpolatePlasma,\n  interpolateInferno,\n  interpolateCividis,\n} from 'd3-scale-chromatic';\nimport stringHash from 'string-hash';\nimport tinycolor from 'tinycolor2';\n\nimport { t } from '@grafana/i18n';\n\nimport { getContrastRatio } from '../themes/colorManipulator';\nimport { GrafanaTheme2 } from '../themes/types';\nimport { reduceField } from '../transformations/fieldReducer';\nimport { Field } from '../types/dataFrame';\nimport { FALLBACK_COLOR, FieldColorModeId } from '../types/fieldColor';\nimport { Threshold } from '../types/thresholds';\nimport { Registry, RegistryItem } from '../utils/Registry';\n\nimport { getScaleCalculator, ColorScaleValue } from './scale';\nimport { fallBackThreshold } from './thresholds';\n\n/** @beta */\nexport type FieldValueColorCalculator = (value: number, percent: number, Threshold?: Threshold) => string;\n\n/** @beta */\nexport interface FieldColorMode extends RegistryItem {\n  getCalculator: (field: Field, theme: GrafanaTheme2) => FieldValueColorCalculator;\n  getColors?: (theme: GrafanaTheme2) => string[];\n  isContinuous?: boolean;\n  isByValue?: boolean;\n  useSeriesName?: boolean;\n  group?: string;\n}\n\n/** @internal */\nexport const fieldColorModeRegistry = new Registry<FieldColorMode>(() => {\n  const accessibleGroup = t('grafana-data.field.fieldColor.accessibleGroup', 'Accessible');\n  const otherGroup = t('grafana-data.field.fieldColor.otherGroup', 'Others');\n\n  return [\n    {\n      id: FieldColorModeId.Fixed,\n      name: 'Single color',\n      description: 'Set a specific color',\n      getCalculator: getFixedColor,\n    },\n    {\n      id: FieldColorModeId.Shades,\n      name: 'Shades of a color',\n      description: 'Select shades of a specific color',\n      getCalculator: getShadedColor,\n    },\n    {\n      id: FieldColorModeId.Thresholds,\n      name: 'From thresholds',\n      isByValue: true,\n      description: 'Derive colors from thresholds',\n      getCalculator: (_field, theme) => {\n        return (_value, _percent, threshold) => {\n          const thresholdSafe = threshold ?? fallBackThreshold;\n          return theme.visualization.getColorByName(thresholdSafe.color);\n        };\n      },\n    },\n    new FieldColorSchemeMode({\n      id: FieldColorModeId.PaletteClassic,\n      name: 'Classic palette',\n      isContinuous: false,\n      isByValue: false,\n      getColors: (theme: GrafanaTheme2) => {\n        return theme.visualization.palette;\n      },\n    }),\n    new FieldColorSchemeMode({\n      id: FieldColorModeId.PaletteClassicByName,\n      name: 'Classic palette (by series name)',\n      isContinuous: false,\n      isByValue: false,\n      useSeriesName: true,\n      getColors: (theme: GrafanaTheme2) => {\n        return theme.visualization.palette.filter(\n          (color) =>\n            getContrastRatio(theme.visualization.getColorByName(color), theme.colors.background.primary) >=\n            theme.colors.contrastThreshold\n        );\n      },\n    }),\n    new FieldColorSchemeMode({\n      id: FieldColorModeId.ContinuousViridis,\n      name: 'Viridis',\n      isContinuous: true,\n      isByValue: true,\n      interpolator: interpolateViridis,\n      group: accessibleGroup,\n    }),\n    new FieldColorSchemeMode({\n      id: FieldColorModeId.ContinuousMagma,\n      name: 'Magma',\n      isContinuous: true,\n      isByValue: true,\n      interpolator: interpolateMagma,\n      group: accessibleGroup,\n    }),\n    new FieldColorSchemeMode({\n      id: FieldColorModeId.ContinuousPlasma,\n      name: 'Plasma',\n      isContinuous: true,\n      isByValue: true,\n      interpolator: interpolatePlasma,\n      group: accessibleGroup,\n    }),\n    new FieldColorSchemeMode({\n      id: FieldColorModeId.ContinuousInferno,\n      name: 'Inferno',\n      isContinuous: true,\n      isByValue: true,\n      interpolator: interpolateInferno,\n      group: accessibleGroup,\n    }),\n    new FieldColorSchemeMode({\n      id: FieldColorModeId.ContinuousCividis,\n      name: 'Cividis',\n      isContinuous: true,\n      isByValue: true,\n      interpolator: interpolateCividis,\n      group: accessibleGroup,\n    }),\n    new FieldColorSchemeMode({\n      id: FieldColorModeId.ContinuousGrYlRd,\n      name: 'Green-Yellow-Red',\n      isContinuous: true,\n      isByValue: true,\n      getColors: (theme: GrafanaTheme2) => ['green', 'yellow', 'red'],\n      group: otherGroup,\n    }),\n    new FieldColorSchemeMode({\n      id: FieldColorModeId.ContinuousRdYlGr,\n      name: 'Red-Yellow-Green',\n      isContinuous: true,\n      isByValue: true,\n      getColors: (theme: GrafanaTheme2) => ['red', 'yellow', 'green'],\n      group: otherGroup,\n    }),\n    new FieldColorSchemeMode({\n      id: FieldColorModeId.ContinuousBlYlRd,\n      name: 'Blue-Yellow-Red',\n      isContinuous: true,\n      isByValue: true,\n      getColors: (theme: GrafanaTheme2) => ['dark-blue', 'super-light-yellow', 'dark-red'],\n      group: otherGroup,\n    }),\n    new FieldColorSchemeMode({\n      id: FieldColorModeId.ContinuousYlRd,\n      name: 'Yellow-Red',\n      isContinuous: true,\n      isByValue: true,\n      getColors: (theme: GrafanaTheme2) => ['super-light-yellow', 'dark-red'],\n      group: otherGroup,\n    }),\n    new FieldColorSchemeMode({\n      id: FieldColorModeId.ContinuousBlPu,\n      name: 'Blue-Purple',\n      isContinuous: true,\n      isByValue: true,\n      getColors: (theme: GrafanaTheme2) => ['blue', 'purple'],\n      group: otherGroup,\n    }),\n    new FieldColorSchemeMode({\n      id: FieldColorModeId.ContinuousYlBl,\n      name: 'Yellow-Blue',\n      isContinuous: true,\n      isByValue: true,\n      getColors: (theme: GrafanaTheme2) => ['super-light-yellow', 'dark-blue'],\n      group: otherGroup,\n    }),\n    new FieldColorSchemeMode({\n      id: FieldColorModeId.ContinuousBlues,\n      name: 'Blues',\n      isContinuous: true,\n      isByValue: true,\n      getColors: (theme: GrafanaTheme2) => ['panel-bg', 'dark-blue'],\n      group: otherGroup,\n    }),\n    new FieldColorSchemeMode({\n      id: FieldColorModeId.ContinuousReds,\n      name: 'Reds',\n      isContinuous: true,\n      isByValue: true,\n      getColors: (theme: GrafanaTheme2) => ['panel-bg', 'dark-red'],\n      group: otherGroup,\n    }),\n    new FieldColorSchemeMode({\n      id: FieldColorModeId.ContinuousGreens,\n      name: 'Greens',\n      isContinuous: true,\n      isByValue: true,\n      getColors: (theme: GrafanaTheme2) => ['panel-bg', 'dark-green'],\n      group: otherGroup,\n    }),\n    new FieldColorSchemeMode({\n      id: FieldColorModeId.ContinuousPurples,\n      name: 'Purples',\n      isContinuous: true,\n      isByValue: true,\n      getColors: (theme: GrafanaTheme2) => ['panel-bg', 'dark-purple'],\n      group: otherGroup,\n    }),\n  ];\n});\n\ninterface BaseFieldColorSchemeModeOptions {\n  id: FieldColorModeId;\n  name: string;\n  description?: string;\n  isContinuous: boolean;\n  isByValue: boolean;\n  useSeriesName?: boolean;\n  group?: string;\n}\n\ninterface FieldColorSchemeModeInterpolator extends BaseFieldColorSchemeModeOptions {\n  interpolator: (value: number) => string;\n  getColors?: never;\n}\n\ninterface FieldColorSchemeModeGetColors extends BaseFieldColorSchemeModeOptions {\n  getColors: (theme: GrafanaTheme2) => string[];\n  interpolator?: never;\n}\n\ntype FieldColorSchemeModeOptions = FieldColorSchemeModeGetColors | FieldColorSchemeModeInterpolator;\n\nexport class FieldColorSchemeMode implements FieldColorMode {\n  id: FieldColorModeId;\n  name: string;\n  description?: string;\n  isContinuous: boolean;\n  isByValue: boolean;\n  useSeriesName?: boolean;\n  colorCache?: string[];\n  colorCacheTheme?: GrafanaTheme2;\n  interpolator?: (value: number) => string;\n  getNamedColors?: (theme: GrafanaTheme2) => string[];\n  group?: string;\n\n  constructor(options: FieldColorSchemeModeOptions) {\n    this.id = options.id;\n    this.name = options.name;\n    this.description = options.description;\n    this.getNamedColors = options.getColors;\n    this.isContinuous = options.isContinuous;\n    this.isByValue = options.isByValue;\n    this.useSeriesName = options.useSeriesName;\n    this.interpolator = options.interpolator;\n    this.group = options.group;\n  }\n\n  getColors(theme: GrafanaTheme2): string[] {\n    if (!this.getNamedColors) {\n      if (!this.interpolator) {\n        return [];\n      }\n      this.getNamedColors = () => new Array(9).fill(0).map((_, i) => this.getInterpolator()(i / 8));\n    }\n\n    if (this.colorCache && this.colorCacheTheme === theme) {\n      return this.colorCache;\n    }\n\n    this.colorCache = this.getNamedColors(theme).map(theme.visualization.getColorByName);\n    this.colorCacheTheme = theme;\n\n    return this.colorCache;\n  }\n\n  private getInterpolator() {\n    if (!this.interpolator) {\n      this.interpolator = interpolateRgbBasis(this.colorCache!);\n    }\n\n    return this.interpolator;\n  }\n\n  getCalculator(field: Field, theme: GrafanaTheme2) {\n    const colors = this.getColors(theme);\n\n    if (this.isByValue) {\n      if (this.isContinuous) {\n        return (_: number, percent: number, _threshold?: Threshold) => {\n          return this.getInterpolator()(percent);\n        };\n      } else {\n        return (_: number, percent: number, _threshold?: Threshold) => {\n          return colors[percent * (colors.length - 1)];\n        };\n      }\n    } else if (this.useSeriesName) {\n      return (_: number, _percent: number, _threshold?: Threshold) => {\n        return getColorByStringHash(colors, field.state?.displayName ?? field.name);\n      };\n    } else {\n      return (_: number, _percent: number, _threshold?: Threshold) => {\n        const seriesIndex = field.state?.seriesIndex ?? 0;\n        return colors[seriesIndex % colors.length];\n      };\n    }\n  }\n}\n\n/** @beta */\nexport function getFieldColorModeForField(field: Field): FieldColorMode {\n  return (\n    fieldColorModeRegistry.getIfExists(field.config.color?.mode) ??\n    fieldColorModeRegistry.get(FieldColorModeId.Thresholds)\n  );\n}\n\n/** @beta */\nexport function getFieldColorMode(mode?: FieldColorModeId | string): FieldColorMode {\n  return fieldColorModeRegistry.getIfExists(mode) ?? fieldColorModeRegistry.get(FieldColorModeId.Thresholds);\n}\n\n/**\n * @alpha\n * Function that will return a series color for any given color mode. If the color mode is a by value color\n * mode it will use the field.config.color.seriesBy property to figure out which value to use\n */\nexport function getFieldSeriesColor(field: Field, theme: GrafanaTheme2): ColorScaleValue {\n  const mode = getFieldColorModeForField(field);\n\n  if (!mode.isByValue) {\n    return {\n      color: mode.getCalculator(field, theme)(0, 0),\n      threshold: fallBackThreshold,\n      percent: 1,\n    };\n  }\n\n  const scale = getScaleCalculator(field, theme);\n  const stat = field.config.color?.seriesBy ?? 'last';\n  const calcs = reduceField({ field, reducers: [stat] });\n  const value = calcs[stat] ?? 0;\n\n  return scale(value);\n}\n\nexport function getColorByStringHash(colors: string[], string: string) {\n  return colors[Math.abs(stringHash(string)) % colors.length];\n}\n\nfunction getFixedColor(field: Field, theme: GrafanaTheme2) {\n  return () => {\n    return theme.visualization.getColorByName(field.config.color?.fixedColor ?? FALLBACK_COLOR);\n  };\n}\n\nfunction getShadedColor(field: Field, theme: GrafanaTheme2) {\n  return () => {\n    const baseColorString: string = theme.visualization.getColorByName(\n      field.config.color?.fixedColor ?? FALLBACK_COLOR\n    );\n\n    const colors: string[] = [\n      baseColorString, // start with base color\n    ];\n\n    const shadesCount = 6;\n    const maxHueSpin = 10; // hue spin, max is 360\n    const maxDarken = 35; // max 100%\n    const maxBrighten = 35; // max 100%\n\n    for (let i = 1; i < shadesCount; i++) {\n      // push alternating darker and brighter shades\n      colors.push(\n        tinycolor(baseColorString)\n          .spin((i / shadesCount) * maxHueSpin)\n          .brighten((i / shadesCount) * maxDarken)\n          .toHexString()\n      );\n      colors.push(\n        tinycolor(baseColorString)\n          .spin(-(i / shadesCount) * maxHueSpin)\n          .darken((i / shadesCount) * maxBrighten)\n          .toHexString()\n      );\n    }\n\n    const seriesIndex = field.state?.seriesIndex ?? 0;\n    return colors[seriesIndex % colors.length];\n  };\n}\n"],"names":["Registry","t","FieldColorModeId","fallBackThreshold","getContrastRatio","interpolateViridis","interpolateMagma","interpolatePlasma","interpolateInferno","interpolateCividis","interpolateRgbBasis","scale","getScaleCalculator","reduceField","stringHash","FALLBACK_COLOR","tinycolor"],"mappings":"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"}