diff --git a/packages/grafana-ui/src/components/RadialGauge/RadialColorDefs.tsx b/packages/grafana-ui/src/components/RadialGauge/RadialColorDefs.tsx index 5a8c14d529f..9e42d7b1bc2 100644 --- a/packages/grafana-ui/src/components/RadialGauge/RadialColorDefs.tsx +++ b/packages/grafana-ui/src/components/RadialGauge/RadialColorDefs.tsx @@ -22,7 +22,7 @@ export interface RadialColorDefsOptions { displayProcessor: DisplayProcessor; } -const CONTRAST_THRESHOLD_MAX = 7.5; +const CONTRAST_THRESHOLD_MAX = 4.5; const getGuideDotColor = (color: string): string => { const darkColor = '#111217'; // gray05 const lightColor = '#fbfbfb'; // gray90 @@ -70,15 +70,16 @@ export class RadialColorDefs { )); + // circular gradients are a little awkward today. we don't exactly have the result we + // want for continuous color modes, which would be to have the radial bar fill from the top + // around the circle. But SVG doesn't support that kind of gradient on stroke paths out-of-the-box, + // we'd need to implement something like https://gist.github.com/mbostock/4163057 + // Handle continusous color modes first // If it's a segment color we don't want to do continuous gradients if (colorMode.isContinuous && colorMode.getColors && !forSegment) { - // this linear gradient doesn't work well for the circular shape yoday for what we actually - // want for continuous color modes, which would be to have the radial bar fill from the top - // around the circle. But SVG doesn't support that kind of gradient on stroke paths out-of-the-box, - // we'd need to implement something like https://gist.github.com/mbostock/4163057 this.defs.push( - + {stops} ); @@ -89,12 +90,13 @@ export class RadialColorDefs { // For value based colors we want to stay more true to the specific color // So a radial gradient that adds a bit of light and shade works best if (colorMode.isByValue) { + const x2 = shape === 'circle' ? 0 : 1 / valuePercent; + const y2 = shape === 'circle' ? 1 : 0; this.defs.push( - + {stops} ); - return returnColor; } @@ -103,23 +105,8 @@ export class RadialColorDefs { const x2 = shape === 'circle' ? 0 : dimensions.centerX + dimensions.radius; const y2 = shape === 'circle' ? dimensions.centerY + dimensions.radius : 0; - // this makes it so the gradient is always brightest at the current value - const transform = - shape === 'circle' - ? `rotate(${360 * valuePercent - 180} ${dimensions.centerX} ${dimensions.centerY})` - : `translate(-${dimensions.radius * 2 * (1 - valuePercent)}, 0)`; - this.defs.push( - + {stops} ); @@ -184,11 +171,21 @@ export class RadialColorDefs { } getGuideDotColors(): [string, string] { - const { fieldDisplay } = this.options; + const { dimensions, fieldDisplay, shape } = this.options; const gradient = this.getGradient(); let valuePercent = fieldDisplay.display.percent ?? 0; + // the linear gradient used in circular gradients means that we want to use the + // y position of the edge of the bar to determine the color. If we ever address + // that shortcoming, we could delete this block. + if (shape === 'circle') { + const angleDeg = ((valuePercent - 0.25) % 1) * 360; + const angleRad = (angleDeg * Math.PI) / 180; + const yPos = dimensions.centerY + dimensions.radius * Math.sin(angleRad); + valuePercent = yPos / (dimensions.centerY * 2); + } + let startColor = gradient[0].color; let endColor = gradient[gradient.length - 1].color;