glutamatt HF Staff commited on
Commit
e309e25
·
verified ·
1 Parent(s): 4ffc435
Files changed (2) hide show
  1. src/components/charts.ts +29 -19
  2. src/style.css +2 -2
src/components/charts.ts CHANGED
@@ -13,30 +13,40 @@ let caloriesChart: Chart | null = null;
13
  function getACWRColor(value: number | null): string {
14
  if (value === null || value === undefined) return 'rgba(148, 163, 184, 0.3)';
15
 
16
- // Map ACWR value to hue (0-360)
17
- // 0.0 -> 240 (blue)
18
- // 0.8 -> 240 (blue)
19
- // 1.0 -> 120 (green)
20
- // 1.3 -> 120 (green)
21
- // 1.5 -> 30 (orange)
22
- // 2.0+ -> 0 (red)
23
-
24
- const greenCenter = 0.8 + (1.3 - 0.8) / 2;
25
- const orangeCenter = 1.3 + (1.5 - 1.3) / 2;
26
-
27
- const lerp = (x: number, y: number, a: number) => x * (1 - a) + y * a;
 
 
 
 
 
 
 
 
 
 
28
 
29
  let hue: number;
30
- if (value < 0.8) {
31
- hue = 240;
32
  } else if (value <= greenCenter) {
33
- hue = lerp(240, 120, (value - 0.8) / (greenCenter - 0.8)); // to green
34
  } else if (value <= orangeCenter) {
35
- hue = lerp(120, 30, (value - greenCenter) / (orangeCenter - greenCenter)); // to orange
36
- } else if (value <= 1.5) {
37
- hue = lerp(30, 0, (value - orangeCenter) / (1.5 - orangeCenter)); // to red
38
  } else {
39
- hue = 0;
40
  }
41
 
42
  return `hsla(${hue}, 85%, 55%, 0.9)`;
 
13
  function getACWRColor(value: number | null): string {
14
  if (value === null || value === undefined) return 'rgba(148, 163, 184, 0.3)';
15
 
16
+ // ACWR thresholds for color zones
17
+ const BLUE_THRESHOLD = 0.8; // Below this: detraining risk (blue)
18
+ const GREEN_START = 0.8; // Green zone start (optimal range)
19
+ const GREEN_END = 1.3; // Green zone end
20
+ const ORANGE_END = 1.5; // Orange zone end (warning)
21
+ // Above ORANGE_END: injury risk (red)
22
+
23
+ // Hue values for colors
24
+ const HUE_BLUE = 240;
25
+ const HUE_GREEN = 120;
26
+ const HUE_ORANGE = 40;
27
+ const HUE_RED = 0;
28
+
29
+ // Calculate transition centers
30
+ const greenCenter = GREEN_START + (GREEN_END - GREEN_START) / 2;
31
+ const orangeCenter = GREEN_END + (ORANGE_END - GREEN_END) / 2;
32
+
33
+ // Linear interpolation helper with automatic normalization
34
+ const lerp = (start: number, end: number, value: number, rangeStart: number, rangeEnd: number): number => {
35
+ const t = (value - rangeStart) / (rangeEnd - rangeStart);
36
+ return start * (1 - t) + end * t;
37
+ };
38
 
39
  let hue: number;
40
+ if (value < BLUE_THRESHOLD) {
41
+ hue = HUE_BLUE;
42
  } else if (value <= greenCenter) {
43
+ hue = lerp(HUE_BLUE, HUE_GREEN, value, GREEN_START, greenCenter);
44
  } else if (value <= orangeCenter) {
45
+ hue = lerp(HUE_GREEN, HUE_ORANGE, value, greenCenter, orangeCenter);
46
+ } else if (value <= ORANGE_END) {
47
+ hue = lerp(HUE_ORANGE, HUE_RED, value, orangeCenter, ORANGE_END);
48
  } else {
49
+ hue = HUE_RED;
50
  }
51
 
52
  return `hsla(${hue}, 85%, 55%, 0.9)`;
src/style.css CHANGED
@@ -517,8 +517,8 @@ h2 {
517
  }
518
 
519
  .legend-color.warning {
520
- background-color: rgba(249, 115, 22, 0.3);
521
- border: 2px solid rgba(249, 115, 22, 0.9);
522
  }
523
 
524
  .legend-color.high {
 
517
  }
518
 
519
  .legend-color.warning {
520
+ background-color: hsl(40deg 95% 53% / 30%);
521
+ border: 2px solid hsl(40deg 95% 53% / 90%);
522
  }
523
 
524
  .legend-color.high {