feat: update lake water data and refine WindChart component functionality

This commit is contained in:
David Fencl
2026-06-08 21:10:29 +02:00
parent 48b44cd642
commit cdb653d660
57 changed files with 1091 additions and 165 deletions
+18
View File
@@ -2389,5 +2389,23 @@
"volume": 0, "volume": 0,
"temperature": 23.9, "temperature": 23.9,
"precipitation": 0 "precipitation": 0
},
{
"timestamp": "2026-06-08T18:30:00.000Z",
"level": 97,
"flow": 9.076,
"inflow": 0,
"volume": 0,
"temperature": 23.9,
"precipitation": 0
},
{
"timestamp": "2026-06-08T18:40:00.000Z",
"level": 97,
"flow": 8.926,
"inflow": 0,
"volume": 0,
"temperature": 23.3,
"precipitation": 0
} }
] ]
+9
View File
@@ -2270,5 +2270,14 @@
"volume": 0, "volume": 0,
"temperature": 22.5, "temperature": 22.5,
"precipitation": 0 "precipitation": 0
},
{
"timestamp": "2026-06-08T18:50:00.000Z",
"level": 92,
"flow": 5.095,
"inflow": 0,
"volume": 0,
"temperature": 21.8,
"precipitation": 0
} }
] ]
+18
View File
@@ -2342,5 +2342,23 @@
"volume": 0, "volume": 0,
"temperature": 21.8, "temperature": 21.8,
"precipitation": 0 "precipitation": 0
},
{
"timestamp": "2026-06-08T18:30:00.000Z",
"level": 149,
"flow": 6.121,
"inflow": 0,
"volume": 0,
"temperature": 21.8,
"precipitation": 0
},
{
"timestamp": "2026-06-08T18:40:00.000Z",
"level": 149,
"flow": 6.079,
"inflow": 0,
"volume": 0,
"temperature": 21.1,
"precipitation": 0
} }
] ]
+18
View File
@@ -8260,5 +8260,23 @@
"volume": 0, "volume": 0,
"temperature": 22, "temperature": 22,
"precipitation": 0 "precipitation": 0
},
{
"timestamp": "2026-06-08T18:45:00.000Z",
"level": 463.42,
"flow": 0,
"inflow": 0,
"volume": 0,
"temperature": 22,
"precipitation": 0
},
{
"timestamp": "2026-06-08T19:00:00.000Z",
"level": 463.41,
"flow": 0,
"inflow": 0,
"volume": 0,
"temperature": 21.7,
"precipitation": 0
} }
] ]
+18
View File
@@ -8989,5 +8989,23 @@
"volume": 2.44, "volume": 2.44,
"temperature": 18.6, "temperature": 18.6,
"precipitation": 0 "precipitation": 0
},
{
"timestamp": "2026-06-08T18:50:00.000Z",
"level": 521.28,
"flow": 0.65,
"inflow": 0.6,
"volume": 2.44,
"temperature": 18.6,
"precipitation": 0
},
{
"timestamp": "2026-06-08T19:00:00.000Z",
"level": 521.28,
"flow": 0.64,
"inflow": 0.6,
"volume": 2.44,
"temperature": 18,
"precipitation": 0
} }
] ]
+18
View File
@@ -8953,5 +8953,23 @@
"volume": 0.09, "volume": 0.09,
"temperature": 20.8, "temperature": 20.8,
"precipitation": 0 "precipitation": 0
},
{
"timestamp": "2026-06-08T18:50:00.000Z",
"level": 416.72,
"flow": 0,
"inflow": 0,
"volume": 0.09,
"temperature": 20.8,
"precipitation": 0
},
{
"timestamp": "2026-06-08T19:00:00.000Z",
"level": 416.72,
"flow": 0,
"inflow": 0,
"volume": 0.09,
"temperature": 20.2,
"precipitation": 0
} }
] ]
+18
View File
@@ -8926,5 +8926,23 @@
"volume": 0.67, "volume": 0.67,
"temperature": 20.8, "temperature": 20.8,
"precipitation": 0 "precipitation": 0
},
{
"timestamp": "2026-06-08T18:50:00.000Z",
"level": 448.8,
"flow": 0,
"inflow": 0,
"volume": 0.67,
"temperature": 20.8,
"precipitation": 0
},
{
"timestamp": "2026-06-08T19:00:00.000Z",
"level": 448.8,
"flow": 0,
"inflow": 0,
"volume": 0.67,
"temperature": 20.2,
"precipitation": 0
} }
] ]
+1 -1
View File
@@ -8141,7 +8141,7 @@
"flow": 0, "flow": 0,
"inflow": 0, "inflow": 0,
"volume": 0.03, "volume": 0.03,
"temperature": 20.1, "temperature": 19.4,
"precipitation": 0 "precipitation": 0
} }
] ]
+18
View File
@@ -8998,5 +8998,23 @@
"volume": 1.68, "volume": 1.68,
"temperature": 19.6, "temperature": 19.6,
"precipitation": 0 "precipitation": 0
},
{
"timestamp": "2026-06-08T18:50:00.000Z",
"level": 447.1,
"flow": 0,
"inflow": 0.64,
"volume": 1.68,
"temperature": 19.6,
"precipitation": 0
},
{
"timestamp": "2026-06-08T19:00:00.000Z",
"level": 447.1,
"flow": 0.24,
"inflow": 0.64,
"volume": 1.68,
"temperature": 18.8,
"precipitation": 0
} }
] ]
+27
View File
@@ -9017,10 +9017,37 @@
{ {
"timestamp": "2026-06-08T18:30:00.000Z", "timestamp": "2026-06-08T18:30:00.000Z",
"level": 407.64, "level": 407.64,
"flow": 0.2,
"inflow": 0.4,
"volume": 0.14,
"temperature": 19.6,
"precipitation": 0
},
{
"timestamp": "2026-06-08T18:40:00.000Z",
"level": 407.64,
"flow": 0,
"temperature": 19.6,
"precipitation": 0,
"inflow": 0.4,
"volume": 0.14
},
{
"timestamp": "2026-06-08T18:50:00.000Z",
"level": 407.64,
"flow": 0, "flow": 0,
"inflow": 0.4, "inflow": 0.4,
"volume": 0.14, "volume": 0.14,
"temperature": 19.6, "temperature": 19.6,
"precipitation": 0 "precipitation": 0
},
{
"timestamp": "2026-06-08T19:00:00.000Z",
"level": 407.64,
"flow": 0,
"inflow": 0.4,
"volume": 0.14,
"temperature": 18.9,
"precipitation": 0
} }
] ]
+9
View File
@@ -8989,5 +8989,14 @@
"volume": 7.48, "volume": 7.48,
"temperature": 21, "temperature": 21,
"precipitation": 0 "precipitation": 0
},
{
"timestamp": "2026-06-08T18:50:00.000Z",
"level": 292.89,
"flow": 0,
"inflow": -0.03,
"volume": 7.48,
"temperature": 20.5,
"precipitation": 0
} }
] ]
+1 -1
View File
@@ -8267,7 +8267,7 @@
"flow": 0, "flow": 0,
"inflow": 0, "inflow": 0,
"volume": 0, "volume": 0,
"temperature": 19.5, "temperature": 19,
"precipitation": 0 "precipitation": 0
} }
] ]
+1 -1
View File
@@ -8267,7 +8267,7 @@
"flow": 0, "flow": 0,
"inflow": 0, "inflow": 0,
"volume": 0, "volume": 0,
"temperature": 19.8, "temperature": 19.3,
"precipitation": 0 "precipitation": 0
} }
] ]
+18
View File
@@ -8980,5 +8980,23 @@
"volume": 0.67, "volume": 0.67,
"temperature": 22.2, "temperature": 22.2,
"precipitation": 0 "precipitation": 0
},
{
"timestamp": "2026-06-08T18:50:00.000Z",
"level": 345.02,
"flow": 0.57,
"inflow": 0.59,
"volume": 0.67,
"temperature": 22.2,
"precipitation": 0
},
{
"timestamp": "2026-06-08T19:00:00.000Z",
"level": 345.02,
"flow": 0.57,
"inflow": 0.59,
"volume": 0.67,
"temperature": 21.7,
"precipitation": 0
} }
] ]
+18
View File
@@ -9016,5 +9016,23 @@
"volume": 0.73, "volume": 0.73,
"temperature": 20, "temperature": 20,
"precipitation": 0 "precipitation": 0
},
{
"timestamp": "2026-06-08T18:50:00.000Z",
"level": 640.64,
"flow": 0,
"inflow": 0.01,
"volume": 0.73,
"temperature": 20,
"precipitation": 0
},
{
"timestamp": "2026-06-08T19:00:00.000Z",
"level": 0,
"flow": 0.01,
"inflow": 0.01,
"volume": 0.73,
"temperature": 19.7,
"precipitation": 0
} }
] ]
+18
View File
@@ -2317,5 +2317,23 @@
"volume": 0, "volume": 0,
"temperature": 22.1, "temperature": 22.1,
"precipitation": 0 "precipitation": 0
},
{
"timestamp": "2026-06-08T18:50:00.000Z",
"level": 87,
"flow": 3.445,
"inflow": 0,
"volume": 0,
"temperature": 22.1,
"precipitation": 0
},
{
"timestamp": "2026-06-08T19:00:00.000Z",
"level": 84,
"flow": 3.056,
"inflow": 0,
"volume": 0,
"temperature": 21.6,
"precipitation": 0
} }
] ]
+18
View File
@@ -2031,5 +2031,23 @@
"volume": 0, "volume": 0,
"temperature": 21.6, "temperature": 21.6,
"precipitation": 0 "precipitation": 0
},
{
"timestamp": "2026-06-08T18:30:00.000Z",
"level": 50,
"flow": 3.7,
"temperature": 21.6,
"precipitation": 0,
"inflow": 0,
"volume": 0
},
{
"timestamp": "2026-06-08T18:40:00.000Z",
"level": 50,
"flow": 3.7,
"inflow": 0,
"volume": 0,
"temperature": 21,
"precipitation": 0
} }
] ]
+18
View File
@@ -9317,10 +9317,28 @@
{ {
"timestamp": "2026-06-08T18:40:00.000Z", "timestamp": "2026-06-08T18:40:00.000Z",
"level": 467.79, "level": 467.79,
"flow": 0.7,
"inflow": 1.6,
"volume": 26.61,
"temperature": 21.7,
"precipitation": 0
},
{
"timestamp": "2026-06-08T18:50:00.000Z",
"level": 467.79,
"flow": 0, "flow": 0,
"inflow": 1.6, "inflow": 1.6,
"volume": 26.61, "volume": 26.61,
"temperature": 21.7, "temperature": 21.7,
"precipitation": 0 "precipitation": 0
},
{
"timestamp": "2026-06-08T19:00:00.000Z",
"level": 467.79,
"flow": 0,
"inflow": 1.6,
"volume": 26.61,
"temperature": 21.1,
"precipitation": 0
} }
] ]
+27
View File
@@ -9340,5 +9340,32 @@
"volume": 32.1, "volume": 32.1,
"temperature": 22.7, "temperature": 22.7,
"precipitation": 0 "precipitation": 0
},
{
"timestamp": "2026-06-08T18:40:00.000Z",
"level": 352.78,
"flow": 2.52,
"temperature": 22.7,
"precipitation": 0,
"inflow": 1.42,
"volume": 32.1
},
{
"timestamp": "2026-06-08T18:50:00.000Z",
"level": 352.78,
"flow": 2.52,
"inflow": 1.42,
"volume": 32.1,
"temperature": 22.7,
"precipitation": 0
},
{
"timestamp": "2026-06-08T19:00:00.000Z",
"level": 352.78,
"flow": 0,
"inflow": 1.42,
"volume": 32.09,
"temperature": 22.1,
"precipitation": 0
} }
] ]
+18
View File
@@ -8989,5 +8989,23 @@
"volume": 2.92, "volume": 2.92,
"temperature": 20.2, "temperature": 20.2,
"precipitation": 0 "precipitation": 0
},
{
"timestamp": "2026-06-08T18:50:00.000Z",
"level": 530.66,
"flow": 0,
"inflow": 0.33,
"volume": 2.92,
"temperature": 20.2,
"precipitation": 0
},
{
"timestamp": "2026-06-08T19:00:00.000Z",
"level": 530.65,
"flow": 0.49,
"inflow": 0.33,
"volume": 2.92,
"temperature": 19.5,
"precipitation": 0
} }
] ]
+18
View File
@@ -8818,5 +8818,23 @@
"volume": 0.46, "volume": 0.46,
"temperature": 20.9, "temperature": 20.9,
"precipitation": 0 "precipitation": 0
},
{
"timestamp": "2026-06-08T18:40:00.000Z",
"level": 563.66,
"flow": 0,
"inflow": 0,
"volume": 0.46,
"temperature": 20.9,
"precipitation": 0
},
{
"timestamp": "2026-06-08T19:00:00.000Z",
"level": 0,
"flow": 0.02,
"inflow": 0,
"volume": 0.46,
"temperature": 20.5,
"precipitation": 0
} }
] ]
+18
View File
@@ -2324,5 +2324,23 @@
"volume": 0, "volume": 0,
"temperature": 22.5, "temperature": 22.5,
"precipitation": 0 "precipitation": 0
},
{
"timestamp": "2026-06-08T18:50:00.000Z",
"level": 44,
"flow": 4.93,
"inflow": 0,
"volume": 0,
"temperature": 22.5,
"precipitation": 0
},
{
"timestamp": "2026-06-08T19:00:00.000Z",
"level": 44,
"flow": 4.99,
"inflow": 0,
"volume": 0,
"temperature": 21.9,
"precipitation": 0
} }
] ]
+18
View File
@@ -2389,5 +2389,23 @@
"volume": 0, "volume": 0,
"temperature": 19.9, "temperature": 19.9,
"precipitation": 0 "precipitation": 0
},
{
"timestamp": "2026-06-08T18:30:00.000Z",
"level": 25,
"flow": 2.95,
"inflow": 0,
"volume": 0,
"temperature": 19.9,
"precipitation": 0
},
{
"timestamp": "2026-06-08T18:40:00.000Z",
"level": 25,
"flow": 2.95,
"inflow": 0,
"volume": 0,
"temperature": 19.2,
"precipitation": 0
} }
] ]
+1 -1
View File
@@ -8105,7 +8105,7 @@
"flow": 0, "flow": 0,
"inflow": 0, "inflow": 0,
"volume": 0, "volume": 0,
"temperature": 19.3, "temperature": 18.8,
"precipitation": 0 "precipitation": 0
} }
] ]
+18
View File
@@ -8983,11 +8983,29 @@
}, },
{ {
"timestamp": "2026-06-08T18:40:00.000Z", "timestamp": "2026-06-08T18:40:00.000Z",
"level": 313.42,
"flow": 1.03,
"inflow": 1.25,
"volume": 2.93,
"temperature": 22.7,
"precipitation": 0
},
{
"timestamp": "2026-06-08T18:50:00.000Z",
"level": 0, "level": 0,
"flow": 1.03, "flow": 1.03,
"inflow": 1.25, "inflow": 1.25,
"volume": 2.93, "volume": 2.93,
"temperature": 22.7, "temperature": 22.7,
"precipitation": 0 "precipitation": 0
},
{
"timestamp": "2026-06-08T19:00:00.000Z",
"level": 0,
"flow": 1.03,
"inflow": 1.25,
"volume": 2.93,
"temperature": 22.1,
"precipitation": 0
} }
] ]
+18
View File
@@ -2342,5 +2342,23 @@
"volume": 0, "volume": 0,
"temperature": 20.7, "temperature": 20.7,
"precipitation": 0 "precipitation": 0
},
{
"timestamp": "2026-06-08T18:30:00.000Z",
"level": 73,
"flow": 2.684,
"inflow": 0,
"volume": 0,
"temperature": 20.7,
"precipitation": 0
},
{
"timestamp": "2026-06-08T18:40:00.000Z",
"level": 73,
"flow": 2.684,
"inflow": 0,
"volume": 0,
"temperature": 19.9,
"precipitation": 0
} }
] ]
+18
View File
@@ -2299,5 +2299,23 @@
"volume": 0, "volume": 0,
"temperature": 20.6, "temperature": 20.6,
"precipitation": 0 "precipitation": 0
},
{
"timestamp": "2026-06-08T18:40:00.000Z",
"level": 44,
"flow": 4.145,
"temperature": 20.6,
"precipitation": 0,
"inflow": 0,
"volume": 0
},
{
"timestamp": "2026-06-08T18:50:00.000Z",
"level": 44,
"flow": 4.17,
"inflow": 0,
"volume": 0,
"temperature": 20,
"precipitation": 0
} }
] ]
+18
View File
@@ -8989,5 +8989,23 @@
"volume": 1.06, "volume": 1.06,
"temperature": 18.8, "temperature": 18.8,
"precipitation": 0 "precipitation": 0
},
{
"timestamp": "2026-06-08T18:50:00.000Z",
"level": 575.7,
"flow": 0.02,
"inflow": 0,
"volume": 1.06,
"temperature": 18.8,
"precipitation": 0
},
{
"timestamp": "2026-06-08T19:00:00.000Z",
"level": 575.7,
"flow": 0.02,
"inflow": 0,
"volume": 1.06,
"temperature": 18.1,
"precipitation": 0
} }
] ]
+18
View File
@@ -2342,5 +2342,23 @@
"volume": 0, "volume": 0,
"temperature": 20.3, "temperature": 20.3,
"precipitation": 0 "precipitation": 0
},
{
"timestamp": "2026-06-08T18:30:00.000Z",
"level": 25,
"flow": 1.47,
"inflow": 0,
"volume": 0,
"temperature": 20.3,
"precipitation": 0
},
{
"timestamp": "2026-06-08T18:40:00.000Z",
"level": 25,
"flow": 1.47,
"inflow": 0,
"volume": 0,
"temperature": 19.5,
"precipitation": 0
} }
] ]
+18
View File
@@ -2342,5 +2342,23 @@
"volume": 0, "volume": 0,
"temperature": 21.2, "temperature": 21.2,
"precipitation": 0 "precipitation": 0
},
{
"timestamp": "2026-06-08T18:30:00.000Z",
"level": 68,
"flow": 1.465,
"inflow": 0,
"volume": 0,
"temperature": 21.2,
"precipitation": 0
},
{
"timestamp": "2026-06-08T18:40:00.000Z",
"level": 68,
"flow": 1.47,
"inflow": 0,
"volume": 0,
"temperature": 20.5,
"precipitation": 0
} }
] ]
+18
View File
@@ -8992,11 +8992,29 @@
}, },
{ {
"timestamp": "2026-06-08T18:40:00.000Z", "timestamp": "2026-06-08T18:40:00.000Z",
"level": 534.7,
"flow": 0.06,
"inflow": 0.07,
"volume": 0.1,
"temperature": 20.6,
"precipitation": 0
},
{
"timestamp": "2026-06-08T18:50:00.000Z",
"level": 0, "level": 0,
"flow": 0.06, "flow": 0.06,
"inflow": 0.07, "inflow": 0.07,
"volume": 0.1, "volume": 0.1,
"temperature": 20.6, "temperature": 20.6,
"precipitation": 0 "precipitation": 0
},
{
"timestamp": "2026-06-08T19:00:00.000Z",
"level": 0,
"flow": 0.06,
"inflow": 0.07,
"volume": 0.1,
"temperature": 19.9,
"precipitation": 0
} }
] ]
+9
View File
@@ -8971,5 +8971,14 @@
"volume": 0.41, "volume": 0.41,
"temperature": 21.4, "temperature": 21.4,
"precipitation": 0 "precipitation": 0
},
{
"timestamp": "2026-06-08T18:50:00.000Z",
"level": 260.09,
"flow": 0.05,
"inflow": 0.07,
"volume": 0.41,
"temperature": 20.9,
"precipitation": 0
} }
] ]
+18
View File
@@ -8980,5 +8980,23 @@
"volume": 0.39, "volume": 0.39,
"temperature": 21.1, "temperature": 21.1,
"precipitation": 0 "precipitation": 0
},
{
"timestamp": "2026-06-08T18:40:00.000Z",
"level": 668.4,
"flow": 0,
"inflow": 0,
"volume": 0.39,
"temperature": 21.1,
"precipitation": 0
},
{
"timestamp": "2026-06-08T18:50:00.000Z",
"level": 668.4,
"flow": 0,
"inflow": 0,
"volume": 0.39,
"temperature": 20.5,
"precipitation": 0
} }
] ]
+18
View File
@@ -8701,5 +8701,23 @@
"volume": 0.84, "volume": 0.84,
"temperature": 19.7, "temperature": 19.7,
"precipitation": 0 "precipitation": 0
},
{
"timestamp": "2026-06-08T18:40:00.000Z",
"level": 385.01,
"flow": 0.02,
"inflow": 0,
"volume": 0.84,
"temperature": 19.7,
"precipitation": 0
},
{
"timestamp": "2026-06-08T18:50:00.000Z",
"level": 385.01,
"flow": 0.02,
"inflow": 0,
"volume": 0.84,
"temperature": 19.1,
"precipitation": 0
} }
] ]
+18
View File
@@ -8971,5 +8971,23 @@
"volume": 0.16, "volume": 0.16,
"temperature": 18.1, "temperature": 18.1,
"precipitation": 0 "precipitation": 0
},
{
"timestamp": "2026-06-08T18:40:00.000Z",
"level": 678.6,
"flow": 0,
"inflow": 0,
"volume": 0.16,
"temperature": 18.1,
"precipitation": 0
},
{
"timestamp": "2026-06-08T18:50:00.000Z",
"level": 678.6,
"flow": 0,
"inflow": 0,
"volume": 0.16,
"temperature": 17.8,
"precipitation": 0
} }
] ]
+18
View File
@@ -9028,11 +9028,29 @@
}, },
{ {
"timestamp": "2026-06-08T18:40:00.000Z", "timestamp": "2026-06-08T18:40:00.000Z",
"level": 588.39,
"flow": 0.08,
"inflow": 0,
"volume": 0.32,
"temperature": 20.2,
"precipitation": 0
},
{
"timestamp": "2026-06-08T18:50:00.000Z",
"level": 0, "level": 0,
"flow": 0.08, "flow": 0.08,
"inflow": 0, "inflow": 0,
"volume": 0.32, "volume": 0.32,
"temperature": 20.2, "temperature": 20.2,
"precipitation": 0 "precipitation": 0
},
{
"timestamp": "2026-06-08T19:00:00.000Z",
"level": 0,
"flow": 0.08,
"inflow": 0,
"volume": 0.32,
"temperature": 19.6,
"precipitation": 0
} }
] ]
+18
View File
@@ -8989,5 +8989,23 @@
"volume": 9.28, "volume": 9.28,
"temperature": 20.5, "temperature": 20.5,
"precipitation": 0 "precipitation": 0
},
{
"timestamp": "2026-06-08T18:50:00.000Z",
"level": 505.63,
"flow": 0.22,
"inflow": 0.05,
"volume": 9.28,
"temperature": 20.5,
"precipitation": 0
},
{
"timestamp": "2026-06-08T19:00:00.000Z",
"level": 505.63,
"flow": 0.22,
"inflow": 0.05,
"volume": 9.28,
"temperature": 20,
"precipitation": 0
} }
] ]
+18
View File
@@ -8974,11 +8974,29 @@
}, },
{ {
"timestamp": "2026-06-08T18:40:00.000Z", "timestamp": "2026-06-08T18:40:00.000Z",
"level": 580.52,
"flow": 0.05,
"inflow": 0,
"volume": 0.41,
"temperature": 18.9,
"precipitation": 0
},
{
"timestamp": "2026-06-08T18:50:00.000Z",
"level": 0, "level": 0,
"flow": 0.05, "flow": 0.05,
"inflow": 0, "inflow": 0,
"volume": 0.41, "volume": 0.41,
"temperature": 18.9, "temperature": 18.9,
"precipitation": 0 "precipitation": 0
},
{
"timestamp": "2026-06-08T19:00:00.000Z",
"level": 0,
"flow": 0.05,
"inflow": 0,
"volume": 0.41,
"temperature": 18.3,
"precipitation": 0
} }
] ]
+18
View File
@@ -9007,5 +9007,23 @@
"volume": 5.16, "volume": 5.16,
"temperature": 20.3, "temperature": 20.3,
"precipitation": 0 "precipitation": 0
},
{
"timestamp": "2026-06-08T18:50:00.000Z",
"level": 412.8,
"flow": 0.34,
"inflow": 0.34,
"volume": 5.16,
"temperature": 20.3,
"precipitation": 0
},
{
"timestamp": "2026-06-08T19:00:00.000Z",
"level": 412.8,
"flow": 0.34,
"inflow": 0.34,
"volume": 5.16,
"temperature": 19.6,
"precipitation": 0
} }
] ]
+18
View File
@@ -9002,10 +9002,28 @@
{ {
"timestamp": "2026-06-08T18:40:00.000Z", "timestamp": "2026-06-08T18:40:00.000Z",
"level": 520.32, "level": 520.32,
"flow": 0.72,
"inflow": 0.53,
"volume": 15.31,
"temperature": 17.8,
"precipitation": 0
},
{
"timestamp": "2026-06-08T18:50:00.000Z",
"level": 520.31,
"flow": 0, "flow": 0,
"inflow": 0.53, "inflow": 0.53,
"volume": 15.31, "volume": 15.31,
"temperature": 17.8, "temperature": 17.8,
"precipitation": 0 "precipitation": 0
},
{
"timestamp": "2026-06-08T19:00:00.000Z",
"level": 520.31,
"flow": 0,
"inflow": 0.53,
"volume": 15.31,
"temperature": 17.6,
"precipitation": 0
} }
] ]
+18
View File
@@ -2031,5 +2031,23 @@
"volume": 0, "volume": 0,
"temperature": 23.5, "temperature": 23.5,
"precipitation": 0 "precipitation": 0
},
{
"timestamp": "2026-06-08T18:30:00.000Z",
"level": 102,
"flow": 10.12,
"temperature": 23.5,
"precipitation": 0,
"inflow": 0,
"volume": 0
},
{
"timestamp": "2026-06-08T18:40:00.000Z",
"level": 101,
"flow": 10.12,
"inflow": 0,
"volume": 0,
"temperature": 23,
"precipitation": 0
} }
] ]
+18
View File
@@ -2315,5 +2315,23 @@
"volume": 0, "volume": 0,
"temperature": 24.6, "temperature": 24.6,
"precipitation": 0 "precipitation": 0
},
{
"timestamp": "2026-06-08T18:50:00.000Z",
"level": 46,
"flow": 52.52,
"inflow": 0,
"volume": 0,
"temperature": 24.6,
"precipitation": 0
},
{
"timestamp": "2026-06-08T19:00:00.000Z",
"level": 46,
"flow": 54.16,
"inflow": 0,
"volume": 0,
"temperature": 24.2,
"precipitation": 0
} }
] ]
+18
View File
@@ -9286,5 +9286,23 @@
"volume": 19.74, "volume": 19.74,
"temperature": 22.1, "temperature": 22.1,
"precipitation": 0 "precipitation": 0
},
{
"timestamp": "2026-06-08T18:50:00.000Z",
"level": 369.59,
"flow": 15.27,
"inflow": 0,
"volume": 19.74,
"temperature": 22.1,
"precipitation": 0
},
{
"timestamp": "2026-06-08T19:00:00.000Z",
"level": 369.59,
"flow": 15.27,
"inflow": 0,
"volume": 19.71,
"temperature": 21.5,
"precipitation": 0
} }
] ]
+18
View File
@@ -8989,5 +8989,23 @@
"volume": 10.33, "volume": 10.33,
"temperature": 21.6, "temperature": 21.6,
"precipitation": 0 "precipitation": 0
},
{
"timestamp": "2026-06-08T18:50:00.000Z",
"level": 283.01,
"flow": 300.3,
"inflow": 1.43,
"volume": 10.33,
"temperature": 21.6,
"precipitation": 0
},
{
"timestamp": "2026-06-08T19:00:00.000Z",
"level": 282.89,
"flow": 299.25,
"inflow": 1.43,
"volume": 9.74,
"temperature": 20.8,
"precipitation": 0
} }
] ]
+18
View File
@@ -9322,5 +9322,23 @@
"volume": 2.77, "volume": 2.77,
"temperature": 21.8, "temperature": 21.8,
"precipitation": 0 "precipitation": 0
},
{
"timestamp": "2026-06-08T18:50:00.000Z",
"level": 352.52,
"flow": 19.11,
"inflow": 15.72,
"volume": 2.77,
"temperature": 21.8,
"precipitation": 0
},
{
"timestamp": "2026-06-08T19:00:00.000Z",
"level": 352.51,
"flow": 19.11,
"inflow": 15.72,
"volume": 2.77,
"temperature": 21.2,
"precipitation": 0
} }
] ]
+19
View File
@@ -9302,10 +9302,29 @@
{ {
"timestamp": "2026-06-08T18:40:00.000Z", "timestamp": "2026-06-08T18:40:00.000Z",
"level": 723.06, "level": 723.06,
"flow": 87.3,
"inflow": -2.61,
"volume": 198.39,
"temperature": 19.8,
"precipitation": 0,
"qn": "> Q1"
},
{
"timestamp": "2026-06-08T18:50:00.000Z",
"level": 723.06,
"flow": 0, "flow": 0,
"inflow": -2.61, "inflow": -2.61,
"volume": 198.39, "volume": 198.39,
"temperature": 19.8, "temperature": 19.8,
"precipitation": 0 "precipitation": 0
},
{
"timestamp": "2026-06-08T19:00:00.000Z",
"level": 723.06,
"flow": 0,
"inflow": -2.61,
"volume": 198.39,
"temperature": 19.2,
"precipitation": 0
} }
] ]
+19 -1
View File
@@ -9299,7 +9299,7 @@
{ {
"timestamp": "2026-06-08T18:20:00.000Z", "timestamp": "2026-06-08T18:20:00.000Z",
"level": 560.11, "level": 560.11,
"flow": 0, "flow": 7.06,
"temperature": 21.5, "temperature": 21.5,
"precipitation": 0, "precipitation": 0,
"inflow": 2.61, "inflow": 2.61,
@@ -9322,5 +9322,23 @@
"volume": 0.67, "volume": 0.67,
"temperature": 19.5, "temperature": 19.5,
"precipitation": 0 "precipitation": 0
},
{
"timestamp": "2026-06-08T18:50:00.000Z",
"level": 560.56,
"flow": 0,
"inflow": 2.61,
"volume": 0.67,
"temperature": 19.5,
"precipitation": 0
},
{
"timestamp": "2026-06-08T19:00:00.000Z",
"level": 560.72,
"flow": 0,
"inflow": 2.61,
"volume": 0.91,
"temperature": 18.7,
"precipitation": 0
} }
] ]
+27
View File
@@ -9322,5 +9322,32 @@
"volume": 521.13, "volume": 521.13,
"temperature": 22.7, "temperature": 22.7,
"precipitation": 0 "precipitation": 0
},
{
"timestamp": "2026-06-08T18:40:00.000Z",
"level": 345.2,
"flow": 146.11,
"temperature": 22.7,
"precipitation": 0,
"inflow": 18.49,
"volume": 521.13
},
{
"timestamp": "2026-06-08T18:50:00.000Z",
"level": 345.2,
"flow": 146.29,
"inflow": 18.49,
"volume": 521.13,
"temperature": 22.7,
"precipitation": 0
},
{
"timestamp": "2026-06-08T19:00:00.000Z",
"level": 345.19,
"flow": 146.38,
"inflow": 18.49,
"volume": 521.13,
"temperature": 22.3,
"precipitation": 0
} }
] ]
+18
View File
@@ -9322,5 +9322,23 @@
"volume": 259.94, "volume": 259.94,
"temperature": 20.9, "temperature": 20.9,
"precipitation": 0 "precipitation": 0
},
{
"timestamp": "2026-06-08T18:50:00.000Z",
"level": 269.76,
"flow": 243.52,
"inflow": 1.16,
"volume": 259.94,
"temperature": 20.9,
"precipitation": 0
},
{
"timestamp": "2026-06-08T19:00:00.000Z",
"level": 269.75,
"flow": 244.67,
"inflow": 1.16,
"volume": 259.94,
"temperature": 20.2,
"precipitation": 0
} }
] ]
+18
View File
@@ -9322,5 +9322,23 @@
"volume": 8.22, "volume": 8.22,
"temperature": 20.6, "temperature": 20.6,
"precipitation": 0 "precipitation": 0
},
{
"timestamp": "2026-06-08T18:50:00.000Z",
"level": 217.46,
"flow": 159.36,
"inflow": 12.66,
"volume": 8.22,
"temperature": 20.6,
"precipitation": 0
},
{
"timestamp": "2026-06-08T19:00:00.000Z",
"level": 217.5,
"flow": 159.29,
"inflow": 12.66,
"volume": 8.22,
"temperature": 19.9,
"precipitation": 0
} }
] ]
+18
View File
@@ -2362,5 +2362,23 @@
"volume": 0, "volume": 0,
"temperature": 19.9, "temperature": 19.9,
"precipitation": 0 "precipitation": 0
},
{
"timestamp": "2026-06-08T18:30:00.000Z",
"level": 62,
"flow": 6.876,
"inflow": 0,
"volume": 0,
"temperature": 19.9,
"precipitation": 0
},
{
"timestamp": "2026-06-08T18:40:00.000Z",
"level": 62,
"flow": 6.808,
"inflow": 0,
"volume": 0,
"temperature": 19.1,
"precipitation": 0
} }
] ]
+18
View File
@@ -9025,5 +9025,23 @@
"volume": 9.13, "volume": 9.13,
"temperature": 21.5, "temperature": 21.5,
"precipitation": 0 "precipitation": 0
},
{
"timestamp": "2026-06-08T18:50:00.000Z",
"level": 199.37,
"flow": 39.78,
"inflow": 25.05,
"volume": 9.13,
"temperature": 21.5,
"precipitation": 0
},
{
"timestamp": "2026-06-08T19:00:00.000Z",
"level": 199.41,
"flow": 39.9,
"inflow": 25.05,
"volume": 9.13,
"temperature": 20.9,
"precipitation": 0
} }
] ]
+11 -2
View File
@@ -8957,7 +8957,7 @@
{ {
"timestamp": "2026-06-08T18:30:00.000Z", "timestamp": "2026-06-08T18:30:00.000Z",
"level": 375.12, "level": 375.12,
"flow": 0, "flow": 0.44,
"inflow": 0.58, "inflow": 0.58,
"volume": 240.58, "volume": 240.58,
"temperature": 21.9, "temperature": 21.9,
@@ -8966,10 +8966,19 @@
{ {
"timestamp": "2026-06-08T18:40:00.000Z", "timestamp": "2026-06-08T18:40:00.000Z",
"level": 375.12, "level": 375.12,
"flow": 0, "flow": 0.44,
"inflow": 0.58, "inflow": 0.58,
"volume": 240.58, "volume": 240.58,
"temperature": 21.2, "temperature": 21.2,
"precipitation": 0 "precipitation": 0
},
{
"timestamp": "2026-06-08T18:50:00.000Z",
"level": 375.12,
"flow": 0,
"inflow": 0.58,
"volume": 240.58,
"temperature": 20.6,
"precipitation": 0
} }
] ]
+134 -134
View File
@@ -15,8 +15,6 @@
"lat": 48.6322, "lat": 48.6322,
"lng": 14.2215, "lng": 14.2215,
"sparkline": [ "sparkline": [
723.07,
723.07,
723.06, 723.06,
723.06, 723.06,
723.06, 723.06,
@@ -26,6 +24,8 @@
723.06, 723.06,
723.06, 723.06,
723.06, 723.06,
723.06,
723.06,
723.06 723.06
], ],
"type": "lake" "type": "lake"
@@ -35,19 +35,17 @@
"name": "Lipno II", "name": "Lipno II",
"river": "Vltava", "river": "Vltava",
"priority": true, "priority": true,
"level": "560.41", "level": "560.72",
"capacity": 41.9, "capacity": 56.9,
"storageDiff": -2.29, "storageDiff": -1.98,
"inflow": "2.6", "inflow": "2.6",
"outflow": "0.0", "outflow": "0.0",
"volume": 0.67, "volume": 0.91,
"maxVolume": 1.6, "maxVolume": 1.6,
"navigationForbidden": false, "navigationForbidden": false,
"lat": 48.625, "lat": 48.625,
"lng": 14.318, "lng": 14.318,
"sparkline": [ "sparkline": [
559.63,
559.62,
559.61, 559.61,
559.6, 559.6,
559.58, 559.58,
@@ -57,7 +55,9 @@
560, 560,
560.11, 560.11,
560.27, 560.27,
560.41 560.41,
560.56,
560.72
], ],
"type": "lake" "type": "lake"
}, },
@@ -67,18 +67,16 @@
"river": "Vltava", "river": "Vltava",
"priority": true, "priority": true,
"level": "369.59", "level": "369.59",
"capacity": 93.6, "capacity": 93.4,
"storageDiff": -0.51, "storageDiff": -0.51,
"inflow": "0.0", "inflow": "0.0",
"outflow": "15.3", "outflow": "15.3",
"volume": 19.74, "volume": 19.71,
"maxVolume": 21.1, "maxVolume": 21.1,
"navigationForbidden": false, "navigationForbidden": false,
"lat": 49.183, "lat": 49.183,
"lng": 14.444, "lng": 14.444,
"sparkline": [ "sparkline": [
369.62,
369.61,
369.61, 369.61,
369.61, 369.61,
369.61, 369.61,
@@ -88,6 +86,8 @@
369.6, 369.6,
369.6, 369.6,
369.59, 369.59,
369.59,
369.59,
369.59 369.59
], ],
"type": "lake" "type": "lake"
@@ -97,9 +97,9 @@
"name": "Kořensko", "name": "Kořensko",
"river": "Vltava", "river": "Vltava",
"priority": true, "priority": true,
"level": "352.52", "level": "352.51",
"capacity": 98.9, "capacity": 98.9,
"storageDiff": -0.08, "storageDiff": -0.09,
"inflow": "15.7", "inflow": "15.7",
"outflow": "19.1", "outflow": "19.1",
"volume": 2.77, "volume": 2.77,
@@ -112,14 +112,14 @@
352.52, 352.52,
352.52, 352.52,
352.52, 352.52,
352.52,
352.52,
352.53, 352.53,
352.52, 352.52,
352.52, 352.52,
352.52, 352.52,
352.52, 352.52,
352.52 352.52,
352.52,
352.51
], ],
"type": "lake" "type": "lake"
}, },
@@ -128,20 +128,17 @@
"name": "Orlík", "name": "Orlík",
"river": "Vltava", "river": "Vltava",
"priority": true, "priority": true,
"level": "345.21", "level": "345.19",
"capacity": 72.7, "capacity": 72.7,
"storageDiff": -4.69, "storageDiff": -4.71,
"inflow": "18.5", "inflow": "18.5",
"outflow": "146.7", "outflow": "146.4",
"volume": 521.13, "volume": 521.13,
"maxVolume": 716.5, "maxVolume": 716.5,
"navigationForbidden": false, "navigationForbidden": false,
"lat": 49.606, "lat": 49.606,
"lng": 14.17, "lng": 14.17,
"sparkline": [ "sparkline": [
345.22,
345.22,
345.22,
345.23, 345.23,
345.22, 345.22,
345.22, 345.22,
@@ -150,7 +147,10 @@
345.21, 345.21,
345.21, 345.21,
345.21, 345.21,
345.21 345.21,
345.2,
345.2,
345.19
], ],
"type": "lake" "type": "lake"
}, },
@@ -159,19 +159,17 @@
"name": "Slapy", "name": "Slapy",
"river": "Vltava", "river": "Vltava",
"priority": true, "priority": true,
"level": "269.77", "level": "269.75",
"capacity": 96.5, "capacity": 96.5,
"storageDiff": -0.83, "storageDiff": -0.85,
"inflow": "1.2", "inflow": "1.2",
"outflow": "244.3", "outflow": "244.7",
"volume": 259.94, "volume": 259.94,
"maxVolume": 269.3, "maxVolume": 269.3,
"navigationForbidden": false, "navigationForbidden": false,
"lat": 49.822, "lat": 49.822,
"lng": 14.436, "lng": 14.436,
"sparkline": [ "sparkline": [
269.85,
269.83,
269.81, 269.81,
269.81, 269.81,
269.81, 269.81,
@@ -181,7 +179,9 @@
269.78, 269.78,
269.79, 269.79,
269.79, 269.79,
269.77 269.77,
269.76,
269.75
], ],
"type": "lake" "type": "lake"
}, },
@@ -190,19 +190,17 @@
"name": "Štěchovice", "name": "Štěchovice",
"river": "Vltava", "river": "Vltava",
"priority": true, "priority": true,
"level": "217.38", "level": "217.50",
"capacity": 73.4, "capacity": 73.4,
"storageDiff": -2.02, "storageDiff": -1.9,
"inflow": "12.7", "inflow": "12.7",
"outflow": "159.5", "outflow": "159.3",
"volume": 8.22, "volume": 8.22,
"maxVolume": 11.2, "maxVolume": 11.2,
"navigationForbidden": false, "navigationForbidden": false,
"lat": 49.845, "lat": 49.845,
"lng": 14.412, "lng": 14.412,
"sparkline": [ "sparkline": [
216.34,
216.32,
216.28, 216.28,
216.51, 216.51,
216.68, 216.68,
@@ -212,7 +210,9 @@
217.12, 217.12,
217.26, 217.26,
217.33, 217.33,
217.38 217.38,
217.46,
217.5
], ],
"type": "lake" "type": "lake"
}, },
@@ -256,16 +256,13 @@
"capacity": 56.6, "capacity": 56.6,
"storageDiff": -1.32, "storageDiff": -1.32,
"inflow": "1.4", "inflow": "1.4",
"outflow": "2.5", "outflow": "0.0",
"volume": 32.1, "volume": 32.09,
"maxVolume": 56.7, "maxVolume": 56.7,
"navigationForbidden": false, "navigationForbidden": false,
"lat": 49.789, "lat": 49.789,
"lng": 13.155, "lng": 13.155,
"sparkline": [ "sparkline": [
352.78,
352.78,
352.79,
352.79, 352.79,
352.78, 352.78,
352.79, 352.79,
@@ -274,6 +271,9 @@
352.78, 352.78,
352.78, 352.78,
352.78, 352.78,
352.78,
352.78,
352.78,
352.78 352.78
], ],
"type": "lake" "type": "lake"
@@ -314,19 +314,17 @@
"name": "Kamýk", "name": "Kamýk",
"river": "", "river": "",
"priority": false, "priority": false,
"level": "283.11", "level": "282.89",
"capacity": 80.7, "capacity": 76.1,
"storageDiff": -1.49, "storageDiff": -1.71,
"inflow": "1.4", "inflow": "1.4",
"outflow": "301.1", "outflow": "299.3",
"volume": 10.33, "volume": 9.74,
"maxVolume": 12.8, "maxVolume": 12.8,
"navigationForbidden": false, "navigationForbidden": false,
"lat": 49.638, "lat": 49.638,
"lng": 14.258, "lng": 14.258,
"sparkline": [ "sparkline": [
283.09,
283.09,
283.08, 283.08,
283.07, 283.07,
283.19, 283.19,
@@ -336,7 +334,9 @@
283.13, 283.13,
283.17, 283.17,
283.15, 283.15,
283.11 283.11,
283.01,
282.89
], ],
"type": "lake" "type": "lake"
}, },
@@ -345,19 +345,17 @@
"name": "Vrané", "name": "Vrané",
"river": "", "river": "",
"priority": false, "priority": false,
"level": "199.34", "level": "199.41",
"capacity": 82.3, "capacity": 82.3,
"storageDiff": -0.76, "storageDiff": -0.69,
"inflow": "25.1", "inflow": "25.1",
"outflow": "39.7", "outflow": "39.9",
"volume": 9.13, "volume": 9.13,
"maxVolume": 11.1, "maxVolume": 11.1,
"navigationForbidden": false, "navigationForbidden": false,
"lat": 49.939, "lat": 49.939,
"lng": 14.391, "lng": 14.391,
"sparkline": [ "sparkline": [
199.25,
199.27,
199.28, 199.28,
199.28, 199.28,
199.29, 199.29,
@@ -367,7 +365,9 @@
199.33, 199.33,
199.33, 199.33,
199.34, 199.34,
199.34 199.34,
199.37,
199.41
], ],
"type": "lake" "type": "lake"
}, },
@@ -380,7 +380,7 @@
"capacity": 42.8, "capacity": 42.8,
"storageDiff": -1.05, "storageDiff": -1.05,
"inflow": "0.6", "inflow": "0.6",
"outflow": "0.7", "outflow": "0.6",
"volume": 2.44, "volume": 2.44,
"maxVolume": 5.7, "maxVolume": 5.7,
"navigationForbidden": true, "navigationForbidden": true,
@@ -407,9 +407,9 @@
"name": "Nýrsko", "name": "Nýrsko",
"river": "", "river": "",
"priority": false, "priority": false,
"level": "520.32", "level": "520.31",
"capacity": 95.7, "capacity": 95.7,
"storageDiff": -1.23, "storageDiff": -1.24,
"inflow": "0.5", "inflow": "0.5",
"outflow": "0.0", "outflow": "0.0",
"volume": 15.31, "volume": 15.31,
@@ -426,10 +426,10 @@
520.32, 520.32,
520.32, 520.32,
520.32, 520.32,
520.32, 520.31,
520.32, 520.32,
520.31, 520.31,
520.32 520.31
], ],
"type": "lake" "type": "lake"
}, },
@@ -511,8 +511,6 @@
"lat": 49.715, "lat": 49.715,
"lng": 13.364, "lng": 13.364,
"sparkline": [ "sparkline": [
0,
313.42,
313.43, 313.43,
313.42, 313.42,
313.43, 313.43,
@@ -522,6 +520,8 @@
313.43, 313.43,
313.43, 313.43,
313.42, 313.42,
313.42,
0,
0 0
], ],
"type": "lake" "type": "lake"
@@ -566,7 +566,7 @@
"capacity": 88.4, "capacity": 88.4,
"storageDiff": -0.3, "storageDiff": -0.3,
"inflow": "0.6", "inflow": "0.6",
"outflow": "0.0", "outflow": "0.2",
"volume": 1.68, "volume": 1.68,
"maxVolume": 1.9, "maxVolume": 1.9,
"navigationForbidden": false, "navigationForbidden": false,
@@ -577,8 +577,8 @@
447.09, 447.09,
447.09, 447.09,
447.09, 447.09,
447.09, 447.1,
447.09, 447.1,
447.1, 447.1,
447.1, 447.1,
447.1, 447.1,
@@ -604,8 +604,6 @@
"lat": 49.805, "lat": 49.805,
"lng": 12.639, "lng": 12.639,
"sparkline": [ "sparkline": [
0,
530.66,
530.66, 530.66,
530.66, 530.66,
530.66, 530.66,
@@ -615,6 +613,8 @@
530.66, 530.66,
530.65, 530.65,
530.65, 530.65,
530.65,
530.66,
530.65 530.65
], ],
"type": "lake" "type": "lake"
@@ -686,9 +686,9 @@
"name": "Láz", "name": "Láz",
"river": "", "river": "",
"priority": false, "priority": false,
"level": "640.65", "level": "0.00",
"capacity": 91.3, "capacity": 91.3,
"storageDiff": -0.7, "storageDiff": 0,
"inflow": "0.0", "inflow": "0.0",
"outflow": "0.0", "outflow": "0.0",
"volume": 0.73, "volume": 0.73,
@@ -697,7 +697,6 @@
"lat": 49.664, "lat": 49.664,
"lng": 13.882, "lng": 13.882,
"sparkline": [ "sparkline": [
0,
640.65, 640.65,
640.65, 640.65,
640.65, 640.65,
@@ -708,7 +707,8 @@
640.65, 640.65,
640.65, 640.65,
640.65, 640.65,
640.65 640.64,
0
], ],
"type": "lake" "type": "lake"
}, },
@@ -717,9 +717,9 @@
"name": "Obecnice", "name": "Obecnice",
"river": "", "river": "",
"priority": false, "priority": false,
"level": "563.66", "level": "0.00",
"capacity": 76.7, "capacity": 76.7,
"storageDiff": -0.89, "storageDiff": 0,
"inflow": "0.0", "inflow": "0.0",
"outflow": "0.0", "outflow": "0.0",
"volume": 0.46, "volume": 0.46,
@@ -739,7 +739,7 @@
563.66, 563.66,
563.66, 563.66,
563.66, 563.66,
563.66 0
], ],
"type": "lake" "type": "lake"
}, },
@@ -759,8 +759,6 @@
"lat": 49.791, "lat": 49.791,
"lng": 14.004, "lng": 14.004,
"sparkline": [ "sparkline": [
0,
588.39,
588.39, 588.39,
588.39, 588.39,
588.39, 588.39,
@@ -770,6 +768,8 @@
588.39, 588.39,
588.39, 588.39,
588.39, 588.39,
588.39,
0,
0 0
], ],
"type": "lake" "type": "lake"
@@ -852,8 +852,6 @@
"lat": 48.784, "lat": 48.784,
"lng": 14.735, "lng": 14.735,
"sparkline": [ "sparkline": [
0,
534.69,
534.69, 534.69,
534.7, 534.7,
534.7, 534.7,
@@ -863,6 +861,8 @@
534.7, 534.7,
534.7, 534.7,
534.69, 534.69,
534.7,
0,
0 0
], ],
"type": "lake" "type": "lake"
@@ -883,17 +883,17 @@
"lat": 49.575, "lat": 49.575,
"lng": 15.952, "lng": 15.952,
"sparkline": [ "sparkline": [
580.52,
580.52,
580.52,
580.52,
580.52,
580.52,
580.52,
580.52,
580.52,
580.52,
0, 0,
580.52,
580.52,
580.52,
580.52,
580.52,
580.52,
580.52,
580.52,
580.52,
580.52,
0 0
], ],
"type": "lake" "type": "lake"
@@ -976,8 +976,6 @@
"lat": 49.805, "lat": 49.805,
"lng": 13.851, "lng": 13.851,
"sparkline": [ "sparkline": [
448.81,
448.8,
448.8, 448.8,
448.8, 448.8,
448.81, 448.81,
@@ -987,6 +985,8 @@
448.8, 448.8,
448.8, 448.8,
448.8, 448.8,
448.8,
448.8,
448.8 448.8
], ],
"type": "lake" "type": "lake"
@@ -996,9 +996,9 @@
"name": "Bílsko", "name": "Bílsko",
"river": "", "river": "",
"priority": false, "priority": false,
"level": "463.42", "level": "463.41",
"capacity": 4.6, "capacity": 4.4,
"storageDiff": -0.61, "storageDiff": -0.62,
"inflow": "0.0", "inflow": "0.0",
"outflow": "0.0", "outflow": "0.0",
"volume": 0, "volume": 0,
@@ -1018,7 +1018,7 @@
463.42, 463.42,
463.42, 463.42,
463.42, 463.42,
463.42 463.41
], ],
"type": "lake" "type": "lake"
}, },
@@ -1217,15 +1217,13 @@
"capacity": 0, "capacity": 0,
"storageDiff": 0, "storageDiff": 0,
"inflow": "0.0", "inflow": "0.0",
"outflow": "53.9", "outflow": "54.2",
"volume": 0, "volume": 0,
"maxVolume": 0, "maxVolume": 0,
"navigationForbidden": false, "navigationForbidden": false,
"lat": 50.0294, "lat": 50.0294,
"lng": 14.3986, "lng": 14.3986,
"sparkline": [ "sparkline": [
47,
47,
46, 46,
49, 49,
46, 46,
@@ -1235,6 +1233,8 @@
46, 46,
45, 45,
45, 45,
46,
46,
46 46
], ],
"type": "river" "type": "river"
@@ -1244,19 +1244,17 @@
"name": "České Budějovice", "name": "České Budějovice",
"river": "Vltava", "river": "Vltava",
"priority": false, "priority": false,
"level": "105.00", "level": "101.00",
"capacity": 0, "capacity": 0,
"storageDiff": 0, "storageDiff": 0,
"inflow": "0.0", "inflow": "0.0",
"outflow": "10.2", "outflow": "10.1",
"volume": 0, "volume": 0,
"maxVolume": 0, "maxVolume": 0,
"navigationForbidden": false, "navigationForbidden": false,
"lat": 48.9712, "lat": 48.9712,
"lng": 14.4714, "lng": 14.4714,
"sparkline": [ "sparkline": [
100,
101,
101, 101,
98, 98,
101, 101,
@@ -1266,7 +1264,9 @@
106, 106,
108, 108,
108, 108,
105 105,
102,
101
], ],
"type": "river" "type": "river"
}, },
@@ -1279,7 +1279,7 @@
"capacity": 0, "capacity": 0,
"storageDiff": 0, "storageDiff": 0,
"inflow": "0.0", "inflow": "0.0",
"outflow": "9.1", "outflow": "8.9",
"volume": 0, "volume": 0,
"maxVolume": 0, "maxVolume": 0,
"navigationForbidden": false, "navigationForbidden": false,
@@ -1289,8 +1289,8 @@
96, 96,
96, 96,
96, 96,
96, 97,
96, 97,
97, 97,
97, 97,
97, 97,
@@ -1310,7 +1310,7 @@
"capacity": 0, "capacity": 0,
"storageDiff": 0, "storageDiff": 0,
"inflow": "0.0", "inflow": "0.0",
"outflow": "4.1", "outflow": "4.2",
"volume": 0, "volume": 0,
"maxVolume": 0, "maxVolume": 0,
"navigationForbidden": false, "navigationForbidden": false,
@@ -1348,8 +1348,6 @@
"lat": 49.3083, "lat": 49.3083,
"lng": 14.1436, "lng": 14.1436,
"sparkline": [ "sparkline": [
45,
45,
44, 44,
43, 43,
43, 43,
@@ -1359,6 +1357,8 @@
44, 44,
46, 46,
46, 46,
44,
44,
44 44
], ],
"type": "river" "type": "river"
@@ -1368,11 +1368,11 @@
"name": "Sušice", "name": "Sušice",
"river": "Otava", "river": "Otava",
"priority": false, "priority": false,
"level": "26.00", "level": "25.00",
"capacity": 0, "capacity": 0,
"storageDiff": 0, "storageDiff": 0,
"inflow": "0.0", "inflow": "0.0",
"outflow": "3.2", "outflow": "3.0",
"volume": 0, "volume": 0,
"maxVolume": 0, "maxVolume": 0,
"navigationForbidden": false, "navigationForbidden": false,
@@ -1383,14 +1383,14 @@
25, 25,
25, 25,
25, 25,
25,
25,
26, 26,
26, 26,
25, 25,
25, 25,
25, 25,
26 26,
25,
25
], ],
"type": "river" "type": "river"
}, },
@@ -1399,19 +1399,17 @@
"name": "Bechyně", "name": "Bechyně",
"river": "Lužnice", "river": "Lužnice",
"priority": false, "priority": false,
"level": "85.00", "level": "84.00",
"capacity": 0, "capacity": 0,
"storageDiff": 0, "storageDiff": 0,
"inflow": "0.0", "inflow": "0.0",
"outflow": "3.2", "outflow": "3.1",
"volume": 0, "volume": 0,
"maxVolume": 0, "maxVolume": 0,
"navigationForbidden": false, "navigationForbidden": false,
"lat": 49.2931, "lat": 49.2931,
"lng": 14.4758, "lng": 14.4758,
"sparkline": [ "sparkline": [
85,
84,
83, 83,
81, 81,
82, 82,
@@ -1421,7 +1419,9 @@
81, 81,
81, 81,
82, 82,
85 85,
87,
84
], ],
"type": "river" "type": "river"
}, },
@@ -1448,8 +1448,8 @@
51, 51,
51, 51,
51, 51,
51, 50,
51, 50,
50, 50,
50, 50,
50 50
@@ -1503,8 +1503,6 @@
"lat": 49.6677, "lat": 49.6677,
"lng": 15.4048, "lng": 15.4048,
"sparkline": [ "sparkline": [
27,
26,
26, 26,
26, 26,
26, 26,
@@ -1514,6 +1512,8 @@
25, 25,
25, 25,
25, 25,
25,
25,
25 25
], ],
"type": "river" "type": "river"
@@ -1539,8 +1539,8 @@
74, 74,
74, 74,
74, 74,
74, 73,
74, 73,
73, 73,
73, 73,
73, 73,
@@ -1558,15 +1558,13 @@
"capacity": 0, "capacity": 0,
"storageDiff": 0, "storageDiff": 0,
"inflow": "0.0", "inflow": "0.0",
"outflow": "6.2", "outflow": "6.1",
"volume": 0, "volume": 0,
"maxVolume": 0, "maxVolume": 0,
"navigationForbidden": false, "navigationForbidden": false,
"lat": 50.0436, "lat": 50.0436,
"lng": 13.9189, "lng": 13.9189,
"sparkline": [ "sparkline": [
152,
151,
151, 151,
151, 151,
151, 151,
@@ -1576,6 +1574,8 @@
150, 150,
150, 150,
150, 150,
149,
149,
149 149
], ],
"type": "river" "type": "river"
@@ -1596,7 +1596,6 @@
"lat": 49.7731, "lat": 49.7731,
"lng": 13.3986, "lng": 13.3986,
"sparkline": [ "sparkline": [
87,
88, 88,
89, 89,
89, 89,
@@ -1607,6 +1606,7 @@
91, 91,
91, 91,
92, 92,
92,
92 92
], ],
"type": "river" "type": "river"
@@ -1616,11 +1616,11 @@
"name": "Vyšší Brod", "name": "Vyšší Brod",
"river": "Vltava", "river": "Vltava",
"priority": false, "priority": false,
"level": "63.00", "level": "62.00",
"capacity": 0, "capacity": 0,
"storageDiff": 0, "storageDiff": 0,
"inflow": "0.0", "inflow": "0.0",
"outflow": "7.1", "outflow": "6.8",
"volume": 0, "volume": 0,
"maxVolume": 0, "maxVolume": 0,
"navigationForbidden": false, "navigationForbidden": false,
@@ -1636,9 +1636,9 @@
65, 65,
65, 65,
65, 65,
65, 63,
65, 62,
63 62
], ],
"type": "river" "type": "river"
} }
+5 -2
View File
@@ -493,8 +493,11 @@
} }
.chart-tooltip { .chart-tooltip {
padding: 0.6rem !important; padding: 0.4rem 0.5rem !important;
max-width: 280px !important; max-width: 200px !important;
background-color: rgba(15, 23, 42, 0.85) !important;
backdrop-filter: blur(4px);
border: 1px solid rgba(255, 255, 255, 0.1) !important;
} }
.chart-tooltip p, .chart-tooltip p,
+45 -13
View File
@@ -31,13 +31,15 @@ interface Props {
windUnit?: 'kmh' | 'ms'; windUnit?: 'kmh' | 'ms';
} }
const CustomTooltip = ({ active, payload, label, language, isWeather, isRiver }: any) => { const CustomTooltip = ({ active, payload, label, language, isWeather, isRiver, coordinate, viewBox }: any) => {
if (active && payload && payload.length) { if (active && payload && payload.length) {
const dict = t[language as Language].chart; const dict = t[language as Language].chart;
const isLeft = coordinate && viewBox && coordinate.x > viewBox.width / 2;
const tooltipClass = `chart-tooltip ${isLeft ? 'tooltip-left' : 'tooltip-right'}`;
if (isWeather) { if (isWeather) {
return ( return (
<div className="chart-tooltip" style={{ backgroundColor: 'var(--bg-card)', padding: '1rem', border: '1px solid var(--border-color)', borderRadius: '0.5rem', boxShadow: '0 4px 6px -1px rgba(0, 0, 0, 0.1)' }}> <div className={tooltipClass} style={{ backgroundColor: 'var(--bg-card)', padding: '0.4rem 0.6rem', border: '1px solid var(--border-color)', borderRadius: '0.5rem', boxShadow: '0 4px 6px -1px rgba(0, 0, 0, 0.1)', fontSize: '0.8rem' }}>
<p style={{ margin: '0 0 0.5rem 0', fontWeight: 'bold', color: 'var(--text-main)' }}>{label}</p> <p style={{ margin: '0 0 0.25rem 0', fontWeight: 'bold', color: 'var(--text-main)', fontSize: '0.85rem' }}>{label}</p>
{payload.map((entry: any, index: number) => { {payload.map((entry: any, index: number) => {
const isTemp = entry.name === 'temperature' || entry.dataKey === 'temperature'; const isTemp = entry.name === 'temperature' || entry.dataKey === 'temperature';
return ( return (
@@ -50,8 +52,8 @@ const CustomTooltip = ({ active, payload, label, language, isWeather, isRiver }:
); );
} }
return ( return (
<div className="chart-tooltip" style={{ backgroundColor: 'var(--bg-card)', padding: '1rem', border: '1px solid var(--border-color)', borderRadius: '0.5rem', boxShadow: '0 4px 6px -1px rgba(0, 0, 0, 0.1)' }}> <div className={tooltipClass} style={{ backgroundColor: 'var(--bg-card)', padding: '0.4rem 0.6rem', border: '1px solid var(--border-color)', borderRadius: '0.5rem', boxShadow: '0 4px 6px -1px rgba(0, 0, 0, 0.1)', fontSize: '0.8rem' }}>
<p style={{ margin: '0 0 0.5rem 0', fontWeight: 'bold', color: 'var(--text-main)' }}>{label}</p> <p style={{ margin: '0 0 0.25rem 0', fontWeight: 'bold', color: 'var(--text-main)', fontSize: '0.85rem' }}>{label}</p>
{[...payload].sort((a: any, b: any) => { {[...payload].sort((a: any, b: any) => {
const order = ['level', 'inflow', 'outflow', 'temperature', 'precipitation']; const order = ['level', 'inflow', 'outflow', 'temperature', 'precipitation'];
const indexA = order.indexOf(a.dataKey); const indexA = order.indexOf(a.dataKey);
@@ -90,18 +92,18 @@ const CustomTooltip = ({ active, payload, label, language, isWeather, isRiver }:
if (!labelStr || entry.value === null || entry.value === undefined) return null; if (!labelStr || entry.value === null || entry.value === undefined) return null;
return ( return (
<div key={index} style={{ margin: 0, color: 'var(--text-main)', display: 'flex', alignItems: 'center', marginBottom: '4px' }}> <div key={index} style={{ margin: 0, color: 'var(--text-main)', display: 'flex', alignItems: 'center', marginBottom: '2px' }}>
<span style={{ display: 'inline-block', width: '8px', height: '8px', borderRadius: '50%', backgroundColor: color, marginRight: '8px' }}></span> <span style={{ display: 'inline-block', width: '6px', height: '6px', borderRadius: '50%', backgroundColor: color, marginRight: '6px' }}></span>
{labelStr}: <span style={{ fontWeight: 'bold', marginLeft: '4px' }}>{entry.value.toFixed(entry.dataKey === 'level' ? (isRiver ? 0 : 2) : 1)} {unit}</span> {labelStr}: <span style={{ fontWeight: 'bold', marginLeft: '4px' }}>{entry.value.toFixed(entry.dataKey === 'level' ? (isRiver ? 0 : 2) : 1)} {unit}</span>
</div> </div>
); );
})} })}
{payload[0]?.payload?.qn ? ( {payload[0]?.payload?.qn ? (
<div style={{ marginTop: '8px', paddingTop: '8px', borderTop: '1px solid var(--border-color)', fontSize: '0.8rem', color: '#f59e0b', display: 'flex', alignItems: 'center', gap: '4px' }}> <div style={{ marginTop: '3px', paddingTop: '3px', borderTop: '1px solid var(--border-color)', fontSize: '0.75rem', color: '#f59e0b', display: 'flex', alignItems: 'center', gap: '4px', lineHeight: '1' }}>
{language === 'cs' ? 'Neověřené měření' : 'Unverified measurement'} {language === 'cs' ? 'Neověřené měření' : 'Unverified measurement'}
</div> </div>
) : ( ) : (
<div style={{ marginTop: '8px', paddingTop: '8px', borderTop: '1px solid var(--border-color)', fontSize: '0.8rem', color: 'var(--color-green)', display: 'flex', alignItems: 'center', gap: '4px' }}> <div style={{ marginTop: '3px', paddingTop: '3px', borderTop: '1px solid var(--border-color)', fontSize: '0.75rem', color: 'var(--color-green)', display: 'flex', alignItems: 'center', gap: '4px', lineHeight: '1' }}>
{language === 'cs' ? 'Měření ověřeno' : 'Measurement verified'} {language === 'cs' ? 'Měření ověřeno' : 'Measurement verified'}
</div> </div>
)} )}
@@ -129,6 +131,8 @@ const LakeDetail = ({ language, lakeId, windUnit = 'kmh' }: Props) => {
const [isMobile, setIsMobile] = useState(false); const [isMobile, setIsMobile] = useState(false);
const [leftCustomDomain, setLeftCustomDomain] = useState<[number, number] | null>(null); const [leftCustomDomain, setLeftCustomDomain] = useState<[number, number] | null>(null);
const [rightCustomDomain, setRightCustomDomain] = useState<[number, number] | null>(null); const [rightCustomDomain, setRightCustomDomain] = useState<[number, number] | null>(null);
const [tooltipY, setTooltipY] = useState<number | undefined>(undefined);
const [weatherTooltipY, setWeatherTooltipY] = useState<number | undefined>(undefined);
useEffect(() => { useEffect(() => {
const handleResize = () => setIsMobile(window.innerWidth <= 768); const handleResize = () => setIsMobile(window.innerWidth <= 768);
@@ -609,7 +613,18 @@ const LakeDetail = ({ language, lakeId, windUnit = 'kmh' }: Props) => {
<div style={{ flex: 1, minHeight: '300px', width: '100%', marginTop: '0', position: 'relative' }}> <div style={{ flex: 1, minHeight: '300px', width: '100%', marginTop: '0', position: 'relative' }}>
<ResponsiveContainer width="100%" height="100%"> <ResponsiveContainer width="100%" height="100%">
<ComposedChart data={chartData} margin={isMobile ? { top: 5, right: 5, left: 5, bottom: 0 } : { top: 5, right: 0, left: 10, bottom: 0 }}> <ComposedChart
data={chartData}
margin={isMobile ? { top: 5, right: 5, left: 5, bottom: 0 } : { top: 5, right: 0, left: 10, bottom: 0 }}
onMouseMove={(state: any) => {
if (state && state.chartY !== undefined) {
const isBottomHalf = state.chartY > 150;
const targetY = isBottomHalf ? 5 : 180;
if (tooltipY !== targetY) setTooltipY(targetY);
}
}}
onMouseLeave={() => setTooltipY(undefined)}
>
<defs> <defs>
<linearGradient id="colorLevel" x1="0" y1="0" x2="0" y2="1"> <linearGradient id="colorLevel" x1="0" y1="0" x2="0" y2="1">
<stop offset="5%" stopColor="var(--color-cyan)" stopOpacity={0.5}/> <stop offset="5%" stopColor="var(--color-cyan)" stopOpacity={0.5}/>
@@ -621,7 +636,10 @@ const LakeDetail = ({ language, lakeId, windUnit = 'kmh' }: Props) => {
<YAxis yAxisId="right" orientation="right" domain={rightCustomDomain || [0, (dataMax: number) => Math.max(dataMax, 1)]} stroke={(visibleSeries.outflow || visibleSeries.inflow) ? "var(--text-muted)" : "transparent"} tick={{fill: (visibleSeries.outflow || visibleSeries.inflow) ? 'var(--text-muted)' : 'transparent', fontSize: isMobile ? 10 : 12}} tickLine={(visibleSeries.outflow || visibleSeries.inflow) ? { stroke: 'var(--text-muted)' } : { stroke: 'transparent' }} axisLine={(visibleSeries.outflow || visibleSeries.inflow) ? { stroke: 'var(--text-muted)' } : { stroke: 'transparent' }} width={isMobile ? 35 : 60} tickFormatter={(v) => v.toFixed(1)} /> <YAxis yAxisId="right" orientation="right" domain={rightCustomDomain || [0, (dataMax: number) => Math.max(dataMax, 1)]} stroke={(visibleSeries.outflow || visibleSeries.inflow) ? "var(--text-muted)" : "transparent"} tick={{fill: (visibleSeries.outflow || visibleSeries.inflow) ? 'var(--text-muted)' : 'transparent', fontSize: isMobile ? 10 : 12}} tickLine={(visibleSeries.outflow || visibleSeries.inflow) ? { stroke: 'var(--text-muted)' } : { stroke: 'transparent' }} axisLine={(visibleSeries.outflow || visibleSeries.inflow) ? { stroke: 'var(--text-muted)' } : { stroke: 'transparent' }} width={isMobile ? 35 : 60} tickFormatter={(v) => v.toFixed(1)} />
<CartesianGrid strokeDasharray="3 3" stroke="rgba(255,255,255,0.05)" vertical={false} /> <CartesianGrid strokeDasharray="3 3" stroke="rgba(255,255,255,0.05)" vertical={false} />
<Tooltip content={<CustomTooltip language={language} isRiver={isRiver} />} /> <Tooltip
content={<CustomTooltip language={language} isRiver={isRiver} />}
position={tooltipY !== undefined ? { y: tooltipY } : undefined}
/>
{/* Data Series */} {/* Data Series */}
{visibleSeries.level && limits && limits.map((limit, idx) => ( {visibleSeries.level && limits && limits.map((limit, idx) => (
@@ -752,13 +770,27 @@ const LakeDetail = ({ language, lakeId, windUnit = 'kmh' }: Props) => {
<div style={{ flex: 1, minHeight: '200px', width: '100%', marginTop: '0' }}> <div style={{ flex: 1, minHeight: '200px', width: '100%', marginTop: '0' }}>
<ResponsiveContainer width="100%" height="100%"> <ResponsiveContainer width="100%" height="100%">
<ComposedChart data={chartData} margin={isMobile ? { top: 5, right: 5, left: 5, bottom: 0 } : { top: 5, right: 0, left: 10, bottom: 0 }}> <ComposedChart
data={chartData}
margin={isMobile ? { top: 5, right: 5, left: 5, bottom: 0 } : { top: 5, right: 0, left: 10, bottom: 0 }}
onMouseMove={(state: any) => {
if (state && state.chartY !== undefined) {
const isBottomHalf = state.chartY > 100;
const targetY = isBottomHalf ? 5 : 110;
if (weatherTooltipY !== targetY) setWeatherTooltipY(targetY);
}
}}
onMouseLeave={() => setWeatherTooltipY(undefined)}
>
<XAxis dataKey="date" stroke="var(--text-muted)" tick={{fill: 'var(--text-muted)', fontSize: isMobile ? 10 : 12}} minTickGap={50} /> <XAxis dataKey="date" stroke="var(--text-muted)" tick={{fill: 'var(--text-muted)', fontSize: isMobile ? 10 : 12}} minTickGap={50} />
<YAxis yAxisId="temp" domain={['auto', 'auto']} stroke={visibleWeatherSeries.temp ? "var(--text-muted)" : "transparent"} tick={{fill: visibleWeatherSeries.temp ? 'var(--text-muted)' : 'transparent', fontSize: isMobile ? 10 : 12}} tickLine={visibleWeatherSeries.temp ? { stroke: 'var(--text-muted)' } : { stroke: 'transparent' }} axisLine={visibleWeatherSeries.temp ? { stroke: 'var(--text-muted)' } : { stroke: 'transparent' }} width={isMobile ? 42 : 60} tickFormatter={(v) => v.toFixed(1)} /> <YAxis yAxisId="temp" domain={['auto', 'auto']} stroke={visibleWeatherSeries.temp ? "var(--text-muted)" : "transparent"} tick={{fill: visibleWeatherSeries.temp ? 'var(--text-muted)' : 'transparent', fontSize: isMobile ? 10 : 12}} tickLine={visibleWeatherSeries.temp ? { stroke: 'var(--text-muted)' } : { stroke: 'transparent' }} axisLine={visibleWeatherSeries.temp ? { stroke: 'var(--text-muted)' } : { stroke: 'transparent' }} width={isMobile ? 42 : 60} tickFormatter={(v) => v.toFixed(1)} />
<YAxis yAxisId="precip" orientation="right" domain={[0, 'auto']} stroke={visibleWeatherSeries.precip ? "var(--text-muted)" : "transparent"} tick={{fill: visibleWeatherSeries.precip ? 'var(--text-muted)' : 'transparent', fontSize: isMobile ? 10 : 12}} tickLine={visibleWeatherSeries.precip ? { stroke: 'var(--text-muted)' } : { stroke: 'transparent' }} axisLine={visibleWeatherSeries.precip ? { stroke: 'var(--text-muted)' } : { stroke: 'transparent' }} width={isMobile ? 35 : 60} /> <YAxis yAxisId="precip" orientation="right" domain={[0, 'auto']} stroke={visibleWeatherSeries.precip ? "var(--text-muted)" : "transparent"} tick={{fill: visibleWeatherSeries.precip ? 'var(--text-muted)' : 'transparent', fontSize: isMobile ? 10 : 12}} tickLine={visibleWeatherSeries.precip ? { stroke: 'var(--text-muted)' } : { stroke: 'transparent' }} axisLine={visibleWeatherSeries.precip ? { stroke: 'var(--text-muted)' } : { stroke: 'transparent' }} width={isMobile ? 35 : 60} />
<CartesianGrid strokeDasharray="3 3" stroke="rgba(255,255,255,0.05)" vertical={false} /> <CartesianGrid strokeDasharray="3 3" stroke="rgba(255,255,255,0.05)" vertical={false} />
<Tooltip content={<CustomTooltip language={language} isWeather={true} />} /> <Tooltip
content={<CustomTooltip language={language} isWeather={true} />}
position={weatherTooltipY !== undefined ? { y: weatherTooltipY } : undefined}
/>
<Bar yAxisId="precip" dataKey="precipitation" fill="var(--color-cyan)" fillOpacity={0.6} isAnimationActive={animate} hide={!visibleWeatherSeries.precip} /> <Bar yAxisId="precip" dataKey="precipitation" fill="var(--color-cyan)" fillOpacity={0.6} isAnimationActive={animate} hide={!visibleWeatherSeries.precip} />
<Line yAxisId="temp" type={curveType} dataKey="temperature" stroke="var(--color-red)" strokeWidth={2} dot={true} isAnimationActive={animate} hide={!visibleWeatherSeries.temp} /> <Line yAxisId="temp" type={curveType} dataKey="temperature" stroke="var(--color-red)" strokeWidth={2} dot={true} isAnimationActive={animate} hide={!visibleWeatherSeries.temp} />
+26 -9
View File
@@ -27,28 +27,30 @@ const getCompassDirection = (degrees: number, language: 'cs' | 'en') => {
return directions[index]; return directions[index];
}; };
const CustomWindTooltip = ({ active, payload, label, language, windUnit = 'kmh' }: any) => { const CustomWindTooltip = ({ active, payload, label, language, windUnit = 'kmh', coordinate, viewBox }: any) => {
if (active && payload && payload.length) { if (active && payload && payload.length) {
const isLeft = coordinate && viewBox && coordinate.x > viewBox.width / 2;
const tooltipClass = `chart-tooltip ${isLeft ? 'tooltip-left' : 'tooltip-right'}`;
const data = payload[0].payload; const data = payload[0].payload;
const date = new Date(label); const date = new Date(label);
const dateStr = date.toLocaleDateString(language === 'cs' ? 'cs-CZ' : 'en-GB', { day: '2-digit', month: '2-digit', year: 'numeric' }); const dateStr = date.toLocaleDateString(language === 'cs' ? 'cs-CZ' : 'en-GB', { day: '2-digit', month: '2-digit', year: 'numeric' });
const timeStr = date.toLocaleTimeString(language === 'cs' ? 'cs-CZ' : 'en-GB', { hour: '2-digit', minute: '2-digit' }); const timeStr = date.toLocaleTimeString(language === 'cs' ? 'cs-CZ' : 'en-GB', { hour: '2-digit', minute: '2-digit' });
return ( return (
<div style={{ backgroundColor: 'rgba(30, 41, 59, 0.95)', border: '1px solid var(--border-color)', borderRadius: '8px', padding: '12px', boxShadow: '0 10px 15px -3px rgba(0, 0, 0, 0.5)', color: 'var(--text-main)', fontSize: '0.9rem', zIndex: 100 }}> <div className={tooltipClass} style={{ backgroundColor: 'var(--bg-card)', border: '1px solid var(--border-color)', borderRadius: '8px', padding: '8px 10px', boxShadow: '0 10px 15px -3px rgba(0, 0, 0, 0.5)', color: 'var(--text-main)', fontSize: '0.8rem', zIndex: 100 }}>
<div style={{ fontWeight: 'bold', marginBottom: '8px', borderBottom: '1px solid rgba(255,255,255,0.1)', paddingBottom: '4px' }}> <div style={{ fontWeight: 'bold', marginBottom: '6px', borderBottom: '1px solid rgba(255,255,255,0.1)', paddingBottom: '3px', fontSize: '0.85rem' }}>
{dateStr} {timeStr} {dateStr} {timeStr}
</div> </div>
<div style={{ display: 'flex', flexDirection: 'column', gap: '4px' }}> <div style={{ display: 'flex', flexDirection: 'column', gap: '2px' }}>
<div style={{ display: 'flex', alignItems: 'center', gap: '6px' }}> <div style={{ display: 'flex', alignItems: 'center', gap: '6px' }}>
<span style={{ color: 'var(--color-cyan)', fontSize: '1.2rem' }}></span> <span style={{ color: 'var(--color-cyan)', fontSize: '1rem' }}></span>
<span>{language === 'cs' ? 'Rychlost větru' : 'Wind Speed'}: <strong>{data.speed} {windUnit === 'kmh' ? 'km/h' : 'm/s'}</strong></span> <span>{language === 'cs' ? 'Rychlost větru' : 'Wind Speed'}: <strong>{data.speed} {windUnit === 'kmh' ? 'km/h' : 'm/s'}</strong></span>
</div> </div>
<div style={{ display: 'flex', alignItems: 'center', gap: '6px' }}> <div style={{ display: 'flex', alignItems: 'center', gap: '6px' }}>
<span style={{ color: 'var(--color-purple)', fontSize: '1.2rem' }}></span> <span style={{ color: 'var(--color-purple)', fontSize: '1rem' }}></span>
<span>{language === 'cs' ? 'Nárazy větru' : 'Wind Gusts'}: <strong>{data.gusts} {windUnit === 'kmh' ? 'km/h' : 'm/s'}</strong></span> <span>{language === 'cs' ? 'Nárazy větru' : 'Wind Gusts'}: <strong>{data.gusts} {windUnit === 'kmh' ? 'km/h' : 'm/s'}</strong></span>
</div> </div>
<div style={{ display: 'flex', alignItems: 'center', gap: '6px', marginTop: '4px', color: 'var(--text-muted)' }}> <div style={{ display: 'flex', alignItems: 'center', gap: '6px', marginTop: '2px', color: 'var(--text-muted)' }}>
<FiWind /> <FiWind />
<span>{language === 'cs' ? 'Směr' : 'Direction'}: <strong>{data.dirStr} ({data.dir}°)</strong></span> <span>{language === 'cs' ? 'Směr' : 'Direction'}: <strong>{data.dirStr} ({data.dir}°)</strong></span>
</div> </div>
@@ -82,6 +84,7 @@ export const WindChart = ({ lat, lng, language, timeRange = '7d', windUnit = 'km
const [currentSpeed, setCurrentSpeed] = useState(0); const [currentSpeed, setCurrentSpeed] = useState(0);
const [maxGust, setMaxGust] = useState(0); const [maxGust, setMaxGust] = useState(0);
const [isMobile, setIsMobile] = useState(false); const [isMobile, setIsMobile] = useState(false);
const [tooltipY, setTooltipY] = useState<number | undefined>(undefined);
useEffect(() => { useEffect(() => {
const handleResize = () => setIsMobile(window.innerWidth <= 768); const handleResize = () => setIsMobile(window.innerWidth <= 768);
@@ -224,7 +227,18 @@ export const WindChart = ({ lat, lng, language, timeRange = '7d', windUnit = 'km
<div style={{ flex: 1, minHeight: '280px', width: '100%', marginTop: '0' }}> <div style={{ flex: 1, minHeight: '280px', width: '100%', marginTop: '0' }}>
<ResponsiveContainer width="100%" height="100%"> <ResponsiveContainer width="100%" height="100%">
<ComposedChart data={data} margin={isMobile ? { top: 5, right: 5, left: 5, bottom: 0 } : { top: 5, right: 0, left: -20, bottom: 0 }}> <ComposedChart
data={data}
margin={isMobile ? { top: 5, right: 5, left: 5, bottom: 0 } : { top: 5, right: 0, left: -20, bottom: 0 }}
onMouseMove={(state: any) => {
if (state && state.chartY !== undefined) {
const isBottomHalf = state.chartY > 140;
const targetY = isBottomHalf ? 5 : 160;
if (tooltipY !== targetY) setTooltipY(targetY);
}
}}
onMouseLeave={() => setTooltipY(undefined)}
>
<defs> <defs>
<linearGradient id="colorWind" x1="0" y1="0" x2="0" y2="1"> <linearGradient id="colorWind" x1="0" y1="0" x2="0" y2="1">
<stop offset="5%" stopColor="var(--color-cyan)" stopOpacity={0.4}/> <stop offset="5%" stopColor="var(--color-cyan)" stopOpacity={0.4}/>
@@ -248,7 +262,10 @@ export const WindChart = ({ lat, lng, language, timeRange = '7d', windUnit = 'km
tickFormatter={(v) => v.toFixed(1)} tickFormatter={(v) => v.toFixed(1)}
/> />
<CartesianGrid strokeDasharray="3 3" stroke="rgba(255,255,255,0.05)" vertical={false} /> <CartesianGrid strokeDasharray="3 3" stroke="rgba(255,255,255,0.05)" vertical={false} />
<Tooltip content={<CustomWindTooltip language={language} windUnit={windUnit} />} /> <Tooltip
content={<CustomWindTooltip language={language} windUnit={windUnit} />}
position={tooltipY !== undefined ? { y: tooltipY } : undefined}
/>
<Area <Area
type="monotone" type="monotone"