File size: 1,637 Bytes
9dbdcb2
1e8952a
 
 
9dbdcb2
 
 
1e8952a
9dbdcb2
 
 
 
 
 
 
 
 
 
 
 
1e8952a
 
9dbdcb2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a3e21c6
 
9dbdcb2
 
 
 
 
 
 
 
 
1e8952a
9dbdcb2
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
const ScoreField = (score, minScore, maxScore) => {
  let percentage = 100
  let barColor = "rgba(210, 106, 255, 0.1)" // light violet for missing data
  if (score !== null) {
  // Calculate percentage based on the provided min and max scores
  // This normalizes the score to a 0-100 range for visualization
  const normalizedScore = Math.min(Math.max(score, minScore), maxScore)
  percentage =
    ((normalizedScore - minScore) / (maxScore - minScore)) * 100

  // Continuous color gradient from red to green based on score
  // For a smooth transition, calculate the RGB values directly

  // Red component decreases as score increases
  const red = Math.round(255 * (1 - percentage / 100))
  // Green component increases as score increases
  const green = Math.round(255 * (percentage / 100))
  // Use a low opacity for subtlety (0.1-0.2 range)
  const opacity = 0.1 + (percentage / 100) * 0.1

  barColor = `rgba(${red}, ${green}, 0, ${opacity.toFixed(2)})`
  }

  return (
    <div
      style={{
        width: '100%',
        height: '100%',
        position: 'relative',
        padding: '0.5rem'
      }}
    >
      <div
        style={{
          position: 'absolute',
          top: 0,
          left: 0,
          height: '100%',
          width: `${percentage}%`,
          backgroundColor: barColor,
          zIndex: 0,
          transition: 'width 0.3s, background-color 0.3s'
        }}
      />

      <span
        style={{
          position: 'relative',
          zIndex: 1
        }}
      >
        {score !== null ? (score * 100).toFixed(1)+"%" : '–'}
      </span>
    </div>
  )
}

export default ScoreField