{"version":3,"file":"gradientFills.mjs","sources":["../../../../../src/components/uPlot/config/gradientFills.ts"],"sourcesContent":["import tinycolor from 'tinycolor2';\nimport uPlot from 'uplot';\n\nimport {\n  colorManipulator,\n  FieldColorMode,\n  FieldColorModeId,\n  GrafanaTheme2,\n  ThresholdsConfig,\n  ThresholdsMode,\n} from '@grafana/data';\nimport { ScaleOrientation } from '@grafana/schema';\n\nimport { getCanvasContext } from '../../../utils/measureText';\n\nfunction makeDirectionalGradient(direction: GradientDirection, bbox: uPlot.BBox, ctx: CanvasRenderingContext2D) {\n  let x0 = 0,\n    y0 = 0,\n    x1 = 0,\n    y1 = 0;\n\n  if (direction === GradientDirection.Down) {\n    y0 = bbox.top;\n    y1 = bbox.top + bbox.height;\n  } else if (direction === GradientDirection.Left) {\n    x0 = bbox.left + bbox.width;\n    x1 = bbox.left;\n  } else if (direction === GradientDirection.Up) {\n    y0 = bbox.top + bbox.height;\n    y1 = bbox.top;\n  } else if (direction === GradientDirection.Right) {\n    x0 = bbox.left;\n    x1 = bbox.left + bbox.width;\n  }\n\n  return ctx.createLinearGradient(x0, y0, x1, y1);\n}\n\nexport function getOpacityGradientFn(\n  color: string,\n  opacity: number\n): (self: uPlot, seriesIdx: number) => CanvasGradient {\n  return (plot: uPlot, seriesIdx: number) => {\n    const ctx = getCanvasContext();\n    const gradient = makeDirectionalGradient(\n      plot.scales.x!.ori === ScaleOrientation.Horizontal ? GradientDirection.Down : GradientDirection.Left,\n      plot.bbox,\n      ctx\n    );\n\n    gradient.addColorStop(0, colorManipulator.alpha(color, opacity));\n    gradient.addColorStop(1, colorManipulator.alpha(color, 0));\n\n    return gradient;\n  };\n}\n\nexport function getHueGradientFn(\n  color: string,\n  opacity: number,\n  theme: GrafanaTheme2\n): (self: uPlot, seriesIdx: number) => CanvasGradient {\n  return (plot: uPlot, seriesIdx: number) => {\n    const ctx = getCanvasContext();\n    const gradient = makeDirectionalGradient(\n      plot.scales.x!.ori === ScaleOrientation.Horizontal ? GradientDirection.Down : GradientDirection.Left,\n      plot.bbox,\n      ctx\n    );\n\n    const color1 = tinycolor(color).spin(-25).darken(5);\n    const color2 = tinycolor(color).saturate(20).spin(20).brighten(10);\n\n    if (theme.isDark) {\n      gradient.addColorStop(0, color2.lighten(10).setAlpha(opacity).toString());\n      gradient.addColorStop(1, color1.darken(10).setAlpha(opacity).toString());\n    } else {\n      gradient.addColorStop(0, color2.lighten(10).setAlpha(opacity).toString());\n      gradient.addColorStop(1, color1.setAlpha(opacity).toString());\n    }\n\n    return gradient;\n  };\n}\n\nexport enum GradientDirection {\n  Right = 0,\n  Up = 1,\n  Left = 2,\n  Down = 3,\n}\n\ntype ValueStop = [value: number, color: string];\n\ntype ScaleValueStops = ValueStop[];\n\nexport function scaleGradient(u: uPlot, scaleKey: string, scaleStops: ScaleValueStops, discrete = false) {\n  let scale = u.scales[scaleKey];\n\n  // we want the stop below or at the scaleMax\n  // and the stop below or at the scaleMin, else the stop above scaleMin\n  let minStopIdx: number | null = null;\n  let maxStopIdx: number | null = null;\n\n  for (let i = 0; i < scaleStops.length; i++) {\n    let stopVal = scaleStops[i][0];\n\n    if (stopVal <= scale.min! || minStopIdx == null) {\n      minStopIdx = i;\n    }\n\n    maxStopIdx = i;\n\n    if (stopVal >= scale.max!) {\n      break;\n    }\n  }\n\n  if (minStopIdx === maxStopIdx) {\n    return scaleStops[minStopIdx!][1];\n  }\n\n  let minStopVal = scaleStops[minStopIdx!][0];\n  let maxStopVal = scaleStops[maxStopIdx!][0];\n\n  if (minStopVal === -Infinity) {\n    minStopVal = scale.min!;\n  }\n\n  if (maxStopVal === Infinity) {\n    maxStopVal = scale.max!;\n  }\n\n  let minStopPos = Math.round(u.valToPos(minStopVal, scaleKey, true));\n  let maxStopPos = Math.round(u.valToPos(maxStopVal, scaleKey, true));\n\n  let range = minStopPos - maxStopPos;\n\n  if (range === 0) {\n    return scaleStops[maxStopIdx!][1];\n  }\n\n  let x0, y0, x1, y1;\n\n  if (u.scales.x!.ori === ScaleOrientation.Horizontal) {\n    x0 = x1 = 0;\n    y0 = minStopPos;\n    y1 = maxStopPos;\n  } else {\n    y0 = y1 = 0;\n    x0 = minStopPos;\n    x1 = maxStopPos;\n  }\n\n  let ctx = getCanvasContext();\n\n  let grd = ctx.createLinearGradient(x0, y0, x1, y1);\n\n  let prevColor: string;\n\n  for (let i = minStopIdx!; i <= maxStopIdx!; i++) {\n    let s = scaleStops[i];\n\n    let stopPos =\n      i === minStopIdx ? minStopPos : i === maxStopIdx ? maxStopPos : Math.round(u.valToPos(s[0], scaleKey, true));\n\n    let pct = (minStopPos - stopPos) / range;\n\n    if (discrete && i > minStopIdx!) {\n      grd.addColorStop(pct, prevColor!);\n    }\n\n    grd.addColorStop(pct, (prevColor = s[1]));\n  }\n\n  return grd;\n}\n\nexport function getDataRange(plot: uPlot, scaleKey: string) {\n  let sc = plot.scales[scaleKey];\n\n  let min = Infinity;\n  let max = -Infinity;\n\n  plot.series.forEach((ser, seriesIdx) => {\n    if (ser.show && ser.scale === scaleKey) {\n      // uPlot skips finding data min/max when a scale has a pre-defined range\n      if (ser.min == null) {\n        let data = plot.data[seriesIdx];\n        for (let i = 0; i < data.length; i++) {\n          if (data[i] != null) {\n            min = Math.min(min, data[i]!);\n            max = Math.max(max, data[i]!);\n          }\n        }\n      } else {\n        min = Math.min(min, ser.min!);\n        max = Math.max(max, ser.max!);\n      }\n    }\n  });\n\n  if (max === min) {\n    min = sc.min!;\n    max = sc.max!;\n  }\n\n  return [min, max];\n}\n\nexport function getGradientRange(\n  u: uPlot,\n  scaleKey: string,\n  hardMin?: number | null,\n  hardMax?: number | null,\n  softMin?: number | null,\n  softMax?: number | null\n) {\n  let min = hardMin ?? softMin ?? null;\n  let max = hardMax ?? softMax ?? null;\n\n  if (min == null || max == null) {\n    let [dataMin, dataMax] = getDataRange(u, scaleKey);\n\n    min = min ?? dataMin ?? 0;\n    max = max ?? dataMax ?? 100;\n  }\n\n  return [min, max];\n}\n\nfunction isStepTransparent(color: string) {\n  // steps are stored as names or 8-char hex\n  return color === 'transparent' || (color[0] === '#' && color.slice(-2) === '00');\n}\n\nexport function getScaleGradientFn(\n  opacity: number,\n  theme: GrafanaTheme2,\n  colorMode?: FieldColorMode,\n  thresholds?: ThresholdsConfig,\n  hardMin?: number | null,\n  hardMax?: number | null,\n  softMin?: number | null,\n  softMax?: number | null\n): (self: uPlot, seriesIdx: number) => CanvasGradient | string {\n  if (!colorMode) {\n    throw Error('Missing colorMode required for color scheme gradients');\n  }\n\n  if (!thresholds) {\n    throw Error('Missing thresholds required for color scheme gradients');\n  }\n\n  return (plot: uPlot, seriesIdx: number) => {\n    let scaleKey = plot.series[seriesIdx].scale!;\n\n    let gradient: CanvasGradient | string = '';\n\n    if (colorMode.id === FieldColorModeId.Thresholds) {\n      if (thresholds.mode === ThresholdsMode.Absolute) {\n        const valueStops: ValueStop[] = thresholds.steps.map((step) => [\n          step.value,\n          isStepTransparent(step.color)\n            ? '#0000'\n            : colorManipulator.alpha(theme.visualization.getColorByName(step.color), opacity),\n        ]);\n        gradient = scaleGradient(plot, scaleKey, valueStops, true);\n      } else {\n        const [min, max] = getGradientRange(plot, scaleKey, hardMin, hardMax, softMin, softMax);\n        const range = max - min;\n        const valueStops: ValueStop[] = thresholds.steps.map((step) => [\n          min + range * (step.value / 100),\n          colorManipulator.alpha(theme.visualization.getColorByName(step.color), opacity),\n        ]);\n        gradient = scaleGradient(plot, scaleKey, valueStops, true);\n      }\n    } else if (colorMode.getColors) {\n      const colors = colorMode.getColors(theme);\n      const [min, max] = getGradientRange(plot, scaleKey, hardMin, hardMax, softMin, softMax);\n      const range = max - min;\n      const valueStops: ValueStop[] = colors.map((color, i) => [\n        min + range * (i / (colors.length - 1)),\n        colorManipulator.alpha(theme.visualization.getColorByName(color), opacity),\n      ]);\n      gradient = scaleGradient(plot, scaleKey, valueStops, false);\n    }\n\n    return gradient;\n  };\n}\n"],"names":[],"mappings":"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"}