Spaces:
Running
Running
yeah
Browse files- src/components/charts.ts +29 -19
- 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 |
-
//
|
| 17 |
-
|
| 18 |
-
|
| 19 |
-
|
| 20 |
-
|
| 21 |
-
//
|
| 22 |
-
|
| 23 |
-
|
| 24 |
-
const
|
| 25 |
-
const
|
| 26 |
-
|
| 27 |
-
const
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 28 |
|
| 29 |
let hue: number;
|
| 30 |
-
if (value <
|
| 31 |
-
hue =
|
| 32 |
} else if (value <= greenCenter) {
|
| 33 |
-
hue = lerp(
|
| 34 |
} else if (value <= orangeCenter) {
|
| 35 |
-
hue = lerp(
|
| 36 |
-
} else if (value <=
|
| 37 |
-
hue = lerp(
|
| 38 |
} else {
|
| 39 |
-
hue =
|
| 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:
|
| 521 |
-
border: 2px solid
|
| 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 {
|