diff --git a/AGENTS.md b/AGENTS.md index fd7fb22..2bca59b 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -37,7 +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. +- Route handler prognozy pobiera godzinowe dane Open-Meteo dla pełnych 7 dni. Dashboard pokazuje najbliższe 24 przyszłe godziny oraz wykresy pełnego bieżącego dnia, 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ą. diff --git a/README.md b/README.md index a9838d1..33f8b4f 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. Każdy dzień prognozy można otworzyć w animowanym widoku szczegółowym z przebiegiem godzinowym oraz wykresami temperatury i opadu. +`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. Dashboard pokazuje wykresy temperatury i opadu dla bieżącego dnia. Każdy dzień prognozy można także otworzyć w animowanym widoku szczegółowym z przebiegiem godzinowym oraz wykresami. 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. diff --git a/components/forecast/forecast-panel.tsx b/components/forecast/forecast-panel.tsx index e48da4b..8b9cd51 100644 --- a/components/forecast/forecast-panel.tsx +++ b/components/forecast/forecast-panel.tsx @@ -3,6 +3,7 @@ import { useCallback, useState } from "react"; import { motion } from "framer-motion"; import { CalendarDays, ChevronRight, Clock3, CloudSun, Droplets, ExternalLink, RefreshCw } from "lucide-react"; +import { DayForecastCharts } from "@/components/charts/day-forecast-charts"; import { DayForecastModal } from "@/components/forecast/day-forecast-modal"; import { ForecastIcon } from "@/components/forecast/forecast-icon"; import { LoadingSkeleton } from "@/components/states/loading-skeleton"; @@ -65,6 +66,7 @@ export function ForecastPanel({ latitude, longitude, locationName }: { latitude? const [selectedDay, setSelectedDay] = useState(null); const closeDayDetails = useCallback(() => setSelectedDay(null), []); const upcomingHours = forecast ? getUpcomingHourlyForecast(forecast.hourly) : []; + const todayHours = forecast?.daily[0] ? getHourlyForecastForDay(forecast.hourly, forecast.daily[0].date) : []; const selectedDayHours = forecast && selectedDay ? getHourlyForecastForDay(forecast.hourly, selectedDay.date) : []; return ( @@ -88,33 +90,36 @@ export function ForecastPanel({ latitude, longitude, locationName }: { latitude? ) : !forecast.hourly.length || !forecast.daily.length ? ( ) : ( -
- -

{t("forecast.hourly")}

-
-
    - {upcomingHours.map((hour, index) => ( - -

    {formatHour(hour.time)}

    - -

    {formatForecastTemperature(hour.temperature, language)}

    -

    {hour.precipitationProbability === null ? "—" : `${hour.precipitationProbability}%`}

    -
    - ))} -
-
-
- -

{t("forecast.daily")}

-
    {forecast.daily.map((day, index) => )}
-
+
+
+ +

{t("forecast.hourly")}

+
+
    + {upcomingHours.map((hour, index) => ( + +

    {formatHour(hour.time)}

    + +

    {formatForecastTemperature(hour.temperature, language)}

    +

    {hour.precipitationProbability === null ? "—" : `${hour.precipitationProbability}%`}

    +
    + ))} +
+
+
+ +

{t("forecast.daily")}

+
    {forecast.daily.map((day, index) => )}
+
+
+
)}