diff --git a/AGENTS.md b/AGENTS.md
index df9b355..fd7fb22 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -37,6 +37,7 @@ Repozytorium nie ma obecnie skryptu testów, osobnego skryptu type-check ani for
- Dodawaj `"use client"` tylko tam, gdzie komponent lub moduł korzysta z hooków, stanu przeglądarki albo interakcji.
- Dane zewnętrzne pobieraj przez route handlery Next.js. Nie omijaj allowlisty w `app/api/imgw/[...path]/route.ts`.
- Traktuj IMGW jako źródło bieżących pomiarów, hydro i ostrzeżeń. Prognozę Open-Meteo pokazuj oddzielnie jako prognozę modelową. Nie generuj fikcyjnych danych ani nie przedstawiaj prognozy jako pomiaru IMGW.
+- Route handler prognozy pobiera godzinowe dane Open-Meteo dla pełnych 7 dni. Dashboard pokazuje najbliższe 24 przyszłe godziny, a widok szczegółowy dnia korzysta z pełnego zestawu godzin dla wybranej daty.
- `synop.suma_opadu` jest akumulowaną sumą opadu. Nie używaj jej jako sygnału, że pada w tej chwili, ani do sterowania animacją deszczu.
- GPS wymaga świadomej zgody użytkownika i HTTPS. Zaokrąglaj współrzędne przed użyciem i utrzymuj widoczną atrybucję OpenStreetMap dla reverse geocodingu Nominatim.
- Normalizuj zewnętrzne odpowiedzi i obsługuj `null`, puste pola oraz błędne wartości. Brak danych pokazuj jawnie zamiast uzupełniać estymacją.
@@ -44,6 +45,7 @@ Repozytorium nie ma obecnie skryptu testów, osobnego skryptu type-check ani for
- Teksty interfejsu dodawaj równolegle po polsku i angielsku w `lib/i18n.tsx`. Nazw stacji i treści IMGW nie tłumacz automatycznie.
- Trwałe preferencje użytkownika zapisuj przez istniejący store Zustand w `lib/store.ts` lub istniejące klucze `localStorage`.
- Zachowuj mobile-first UI, dostępność klawiatury, `aria-label`, focus states oraz spokojny styl glassmorphism.
+- Pełnoekranowe warstwy interaktywne zamykaj przyciskiem i klawiszem `Escape`, blokuj przewijanie tła oraz przywracaj fokus po zamknięciu.
- Nie edytuj ręcznie `next-env.d.ts`; plik jest generowany przez Next.js.
Obsługa błędów:
diff --git a/README.md b/README.md
index a9813ab..a9838d1 100644
--- a/README.md
+++ b/README.md
@@ -2,7 +2,7 @@
**Pogoda z danych IMGW. Prosto. Pięknie. Aktualnie.**
-`wtr.` to nowoczesna pogodowa PWA dla Polski oparta o publiczne dane IMGW i jawnie oznaczoną prognozę modelową Open-Meteo. Aplikacja prezentuje bieżące odczyty synoptyczne, prognozę godzinową i 7-dniową, stacje hydrologiczne oraz ostrzeżenia w spokojnym, mobilnym interfejsie z gradientami, kartami glassmorphism i subtelnymi animacjami.
+`wtr.` to nowoczesna pogodowa PWA dla Polski oparta o publiczne dane IMGW i jawnie oznaczoną prognozę modelową Open-Meteo. Aplikacja prezentuje bieżące odczyty synoptyczne, prognozę godzinową i 7-dniową, stacje hydrologiczne oraz ostrzeżenia w spokojnym, mobilnym interfejsie z gradientami, kartami glassmorphism i subtelnymi animacjami. Każdy dzień prognozy można otworzyć w animowanym widoku szczegółowym z przebiegiem godzinowym oraz wykresami temperatury i opadu.
Interfejs jest dostępny po polsku i angielsku. Wybrany język jest zapisywany lokalnie w przeglądarce. Oryginalne treści ostrzeżeń oraz nazwy stacji pochodzą bezpośrednio z API IMGW i nie są automatycznie tłumaczone.
@@ -73,6 +73,7 @@ Czas aktualizacji parametrów hydrologicznych może się różnić. Interfejs po
```text
app/ routing, layout, proxy danych, offline fallback
components/forecast/ prognoza godzinowa i dzienna Open-Meteo
+components/charts/ wykresy odczytów i szczegółów prognozy
components/dashboard dashboard aplikacji
components/weather/ hero, stacje, metryki i szczegóły
components/warnings/ alerty meteo i hydro
diff --git a/app/api/forecast/route.ts b/app/api/forecast/route.ts
index 0a03a0d..a9fbfff 100644
--- a/app/api/forecast/route.ts
+++ b/app/api/forecast/route.ts
@@ -22,7 +22,6 @@ export async function GET(request: Request) {
hourly: "temperature_2m,apparent_temperature,precipitation_probability,precipitation,weather_code,wind_speed_10m",
daily: "weather_code,temperature_2m_max,temperature_2m_min,precipitation_probability_max,precipitation_sum,sunrise,sunset",
timezone: "Europe/Warsaw",
- forecast_hours: "24",
forecast_days: "7",
wind_speed_unit: "ms",
});
diff --git a/app/globals.css b/app/globals.css
index 6cb35a2..6e0cbbd 100644
--- a/app/globals.css
+++ b/app/globals.css
@@ -65,6 +65,7 @@ select {
.weather-scrollbar::-webkit-scrollbar {
height: 0.65rem;
+ width: 0.65rem;
}
.weather-scrollbar::-webkit-scrollbar-track {
diff --git a/components/charts/day-forecast-charts.tsx b/components/charts/day-forecast-charts.tsx
new file mode 100644
index 0000000..83c0b49
--- /dev/null
+++ b/components/charts/day-forecast-charts.tsx
@@ -0,0 +1,74 @@
+"use client";
+
+import { Bar, CartesianGrid, ComposedChart, Legend, Line, ResponsiveContainer, Tooltip, XAxis, YAxis } from "recharts";
+import { Card } from "@/components/ui/card";
+import { useI18n } from "@/lib/i18n";
+import { formatForecastRainfall, formatForecastTemperature } from "@/lib/forecast-utils";
+import type { HourlyForecast } from "@/types/forecast";
+
+function formatHour(value: string) {
+ return value.slice(11, 16);
+}
+
+export function DayForecastCharts({ hours }: { hours: HourlyForecast[] }) {
+ const { language, t } = useI18n();
+ const rows = hours.map((hour) => ({
+ time: formatHour(hour.time),
+ temperature: hour.temperature,
+ feelsLike: hour.feelsLike,
+ precipitation: hour.precipitation,
+ precipitationProbability: hour.precipitationProbability,
+ }));
+
+ return (
+