/
indievid
/
Meteo
Обзор
Документация
Войти
/
indievid
/
Meteo
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
dev
src/lib/weather-data.ts
474 строки
15 KB
studio-agent
Squash 'studio-workflow-seed-2bc9e30d-af89-4ec8-ab40-a8a1622fbb2f' into dev
24 июл 2026, 19:13
24 июл 2026, 19:13
4328f1c
Код
Авторство
О чём код?
import type { WeatherKind } from "@/components/weather-icon"; export type HourPoint = { hour: number; temp: number; kind: WeatherKind; precip: number; }; export type DayPoint = { weekday: string; date: string; high: number; low: number; kind: WeatherKind; precip: number; }; export type CityWeather = { id: string; name: string; country: string; region: string; timezone: string; localTime: string; isDay: boolean; current: { temp: number; feelsLike: number; kind: WeatherKind; summary: string; description: string; high: number; low: number; humidity: number; wind: { speed: number; dir: string; gust: number }; pressure: number; uv: number; visibility: number; dewPoint: number; sunrise: string; sunset: string; cloudCover: number; airQuality: { label: string; value: number }; }; hourly: HourPoint[]; daily: DayPoint[]; }; const HOURS = (start: number, pattern: Array<[number, WeatherKind, number]>): HourPoint[] => pattern.map(([temp, kind, precip], i) => ({ hour: (start + i) % 24, temp, kind, precip, })); export const cities: CityWeather[] = [ { id: "msk", name: "Москва", country: "Россия", region: "Московская область", timezone: "Europe/Moscow", localTime: "14:20", isDay: true, current: { temp: 18, feelsLike: 17, kind: "partly", summary: "Переменная облачность", description: "Мягкий день с прояснениями, лёгкий северо-западный ветер.", high: 21, low: 12, humidity: 58, wind: { speed: 4, dir: "СЗ", gust: 7 }, pressure: 761, uv: 5, visibility: 16, dewPoint: 9, sunrise: "04:12", sunset: "21:08", cloudCover: 45, airQuality: { label: "Хорошо", value: 32 }, }, hourly: HOURS(8, [ [14, "partly", 0], [15, "partly", 0], [16, "sunny", 0], [17, "sunny", 0], [18, "partly", 5], [19, "cloudy", 10], [20, "cloudy", 15], [21, "rainy", 60], [22, "rainy", 80], [23, "rainy", 70], [24 % 24, "cloudy", 20], [1, "cloudy", 10], [2, "partly", 0], [3, "partly", 0], [4, "sunny", 0], [5, "sunny", 0], [6, "sunny", 0], [7, "sunny", 0], [8, "partly", 0], [9, "partly", 0], [10, "cloudy", 10], [11, "cloudy", 15], [12, "rainy", 40], [13, "rainy", 55], ]), daily: [ { weekday: "Сегодня", date: "12 мая", high: 21, low: 12, kind: "partly", precip: 20 }, { weekday: "Ср", date: "13 мая", high: 19, low: 11, kind: "rainy", precip: 70 }, { weekday: "Чт", date: "14 мая", high: 17, low: 9, kind: "rainy", precip: 80 }, { weekday: "Пт", date: "15 мая", high: 20, low: 10, kind: "cloudy", precip: 30 }, { weekday: "Сб", date: "16 мая", high: 23, low: 13, kind: "sunny", precip: 5 }, { weekday: "Вс", date: "17 мая", high: 25, low: 15, kind: "sunny", precip: 0 }, { weekday: "Пн", date: "18 мая", high: 22, low: 14, kind: "partly", precip: 15 }, ], }, { id: "spb", name: "Санкт-Петербург", country: "Россия", region: "Северо-Запад", timezone: "Europe/Moscow", localTime: "14:20", isDay: true, current: { temp: 14, feelsLike: 12, kind: "rainy", summary: "Небольшой дождь", description: "Пасмурно, моросящий дождь. Возьмите зонт.", high: 16, low: 9, humidity: 86, wind: { speed: 7, dir: "З", gust: 12 }, pressure: 752, uv: 1, visibility: 6, dewPoint: 11, sunrise: "04:48", sunset: "21:42", cloudCover: 95, airQuality: { label: "Средне", value: 58 }, }, hourly: HOURS(8, [ [12, "rainy", 70], [13, "rainy", 80], [14, "rainy", 75], [15, "rainy", 65], [16, "cloudy", 40], [17, "cloudy", 30], [18, "cloudy", 25], [19, "cloudy", 20], [20, "partly", 15], [21, "partly", 10], [22, "cloudy", 25], [23, "rainy", 60], [24 % 24, "rainy", 70], [1, "rainy", 80], [2, "storm", 90], [3, "storm", 85], [4, "rainy", 70], [5, "rainy", 60], [6, "cloudy", 40], [7, "cloudy", 30], [8, "cloudy", 20], [9, "partly", 15], [10, "partly", 10], [11, "cloudy", 20], ]), daily: [ { weekday: "Сегодня", date: "12 мая", high: 16, low: 9, kind: "rainy", precip: 80 }, { weekday: "Ср", date: "13 мая", high: 15, low: 8, kind: "storm", precip: 90 }, { weekday: "Чт", date: "14 мая", high: 17, low: 10, kind: "rainy", precip: 70 }, { weekday: "Пт", date: "15 мая", high: 19, low: 11, kind: "cloudy", precip: 40 }, { weekday: "Сб", date: "16 мая", high: 21, low: 12, kind: "partly", precip: 20 }, { weekday: "Вс", date: "17 мая", high: 22, low: 13, kind: "sunny", precip: 5 }, { weekday: "Пн", date: "18 мая", high: 20, low: 12, kind: "partly", precip: 25 }, ], }, { id: "sochi", name: "Сочи", country: "Россия", region: "Черноморское побережье", timezone: "Europe/Moscow", localTime: "14:20", isDay: true, current: { temp: 24, feelsLike: 26, kind: "sunny", summary: "Солнечно", description: "Тёплый солнечный день, идеально для пляжа.", high: 26, low: 18, humidity: 64, wind: { speed: 3, dir: "Ю", gust: 5 }, pressure: 764, uv: 8, visibility: 20, dewPoint: 17, sunrise: "05:05", sunset: "20:24", cloudCover: 5, airQuality: { label: "Отлично", value: 22 }, }, hourly: HOURS(8, [ [24, "sunny", 0], [25, "sunny", 0], [25, "sunny", 0], [24, "sunny", 0], [23, "sunny", 0], [22, "partly", 0], [21, "partly", 0], [20, "partly", 0], [19, "night-clear", 0], [18, "night-clear", 0], [18, "night-clear", 0], [18, "night-clear", 0], [17, "night-clear", 0], [17, "night-clear", 0], [18, "night-clear", 0], [19, "sunny", 0], [21, "sunny", 0], [23, "sunny", 0], [24, "sunny", 0], [25, "sunny", 0], [25, "sunny", 0], [26, "sunny", 0], [26, "sunny", 0], [25, "sunny", 0], ]), daily: [ { weekday: "Сегодня", date: "12 мая", high: 26, low: 18, kind: "sunny", precip: 0 }, { weekday: "Ср", date: "13 мая", high: 27, low: 19, kind: "sunny", precip: 0 }, { weekday: "Чт", date: "14 мая", high: 25, low: 18, kind: "partly", precip: 10 }, { weekday: "Пт", date: "15 мая", high: 24, low: 17, kind: "partly", precip: 20 }, { weekday: "Сб", date: "16 мая", high: 26, low: 18, kind: "sunny", precip: 0 }, { weekday: "Вс", date: "17 мая", high: 28, low: 20, kind: "sunny", precip: 0 }, { weekday: "Пн", date: "18 мая", high: 27, low: 19, kind: "sunny", precip: 5 }, ], }, { id: "ykt", name: "Якутск", country: "Россия", region: "Восточная Сибирь", timezone: "Asia/Yakutsk", localTime: "20:20", isDay: false, current: { temp: -4, feelsLike: -9, kind: "night-clear", summary: "Ясная ночь", description: "Холодно и ясно, лёгкий северный ветер.", high: 4, low: -7, humidity: 52, wind: { speed: 5, dir: "С", gust: 8 }, pressure: 770, uv: 0, visibility: 25, dewPoint: -12, sunrise: "03:18", sunset: "22:48", cloudCover: 10, airQuality: { label: "Отлично", value: 14 }, }, hourly: HOURS(20, [ [-4, "night-clear", 0], [-5, "night-clear", 0], [-6, "night-clear", 0], [-7, "night-clear", 0], [-7, "night-clear", 0], [-6, "night-clear", 0], [-5, "night-cloudy", 5], [-3, "night-cloudy", 10], [-1, "sunny", 0], [1, "sunny", 0], [2, "sunny", 0], [3, "sunny", 0], [4, "partly", 5], [4, "partly", 5], [3, "cloudy", 15], [2, "cloudy", 15], [1, "snow", 50], [0, "snow", 60], [-1, "snow", 70], [-2, "snow", 65], [-3, "night-cloudy", 30], [-4, "night-cloudy", 25], [-5, "night-clear", 0], [-5, "night-clear", 0], ]), daily: [ { weekday: "Сегодня", date: "12 мая", high: 4, low: -7, kind: "snow", precip: 60 }, { weekday: "Ср", date: "13 мая", high: 3, low: -8, kind: "cloudy", precip: 30 }, { weekday: "Чт", date: "14 мая", high: 6, low: -5, kind: "sunny", precip: 0 }, { weekday: "Пт", date: "15 мая", high: 8, low: -3, kind: "sunny", precip: 0 }, { weekday: "Сб", date: "16 мая", high: 7, low: -4, kind: "partly", precip: 15 }, { weekday: "Вс", date: "17 мая", high: 5, low: -6, kind: "snow", precip: 55 }, { weekday: "Пн", date: "18 мая", high: 9, low: -2, kind: "sunny", precip: 0 }, ], }, { id: "kazan", name: "Казань", country: "Россия", region: "Поволжье", timezone: "Europe/Moscow", localTime: "14:20", isDay: true, current: { temp: 16, feelsLike: 15, kind: "fog", summary: "Туман", description: "Утренний туман постепенно рассеивается.", high: 19, low: 10, humidity: 88, wind: { speed: 2, dir: "В", gust: 4 }, pressure: 758, uv: 2, visibility: 3, dewPoint: 13, sunrise: "04:32", sunset: "20:46", cloudCover: 80, airQuality: { label: "Средне", value: 65 }, }, hourly: HOURS(8, [ [15, "fog", 20], [16, "cloudy", 25], [17, "cloudy", 20], [18, "partly", 10], [18, "partly", 5], [17, "partly", 5], [16, "partly", 0], [14, "night-clear", 0], [13, "night-clear", 0], [12, "night-clear", 0], [11, "night-clear", 0], [11, "night-cloudy", 10], [10, "night-cloudy", 15], [10, "cloudy", 25], [11, "cloudy", 30], [12, "rainy", 50], [13, "rainy", 60], [14, "rainy", 70], [15, "rainy", 65], [16, "cloudy", 40], [17, "partly", 20], [18, "partly", 10], [19, "sunny", 0], [19, "sunny", 0], ]), daily: [ { weekday: "Сегодня", date: "12 мая", high: 19, low: 10, kind: "fog", precip: 30 }, { weekday: "Ср", date: "13 мая", high: 17, low: 9, kind: "rainy", precip: 75 }, { weekday: "Чт", date: "14 мая", high: 18, low: 10, kind: "cloudy", precip: 35 }, { weekday: "Пт", date: "15 мая", high: 21, low: 12, kind: "partly", precip: 20 }, { weekday: "Сб", date: "16 мая", high: 23, low: 14, kind: "sunny", precip: 5 }, { weekday: "Вс", date: "17 мая", high: 24, low: 15, kind: "sunny", precip: 0 }, { weekday: "Пн", date: "18 мая", high: 22, low: 13, kind: "partly", precip: 15 }, ], }, { id: "vlk", name: "Владивосток", country: "Россия", region: "Приморский край", timezone: "Asia/Vladivostok", localTime: "21:20", isDay: false, current: { temp: 12, feelsLike: 11, kind: "night-cloudy", summary: "Облачно с прояснениями", description: "Вечером прохладно, море шумит за окном.", high: 15, low: 9, humidity: 78, wind: { speed: 6, dir: "ЮВ", gust: 10 }, pressure: 759, uv: 0, visibility: 14, dewPoint: 8, sunrise: "06:01", sunset: "20:32", cloudCover: 70, airQuality: { label: "Хорошо", value: 38 }, }, hourly: HOURS(20, [ [12, "night-cloudy", 15], [12, "night-cloudy", 15], [11, "night-cloudy", 20], [11, "night-cloudy", 25], [10, "rainy", 55], [10, "rainy", 65], [9, "rainy", 70], [9, "night-cloudy", 35], [10, "cloudy", 25], [11, "cloudy", 20], [12, "partly", 10], [13, "partly", 5], [14, "sunny", 0], [14, "sunny", 0], [15, "sunny", 0], [14, "partly", 5], [14, "partly", 10], [13, "cloudy", 20], [13, "cloudy", 25], [12, "night-cloudy", 20], [12, "night-cloudy", 20], [11, "night-cloudy", 25], [11, "night-clear", 5], [10, "night-clear", 0], ]), daily: [ { weekday: "Сегодня", date: "12 мая", high: 15, low: 9, kind: "rainy", precip: 60 }, { weekday: "Ср", date: "13 мая", high: 14, low: 8, kind: "cloudy", precip: 35 }, { weekday: "Чт", date: "14 мая", high: 16, low: 10, kind: "partly", precip: 15 }, { weekday: "Пт", date: "15 мая", high: 17, low: 11, kind: "sunny", precip: 5 }, { weekday: "Сб", date: "16 мая", high: 18, low: 12, kind: "sunny", precip: 0 }, { weekday: "Вс", date: "17 мая", high: 17, low: 11, kind: "partly", precip: 20 }, { weekday: "Пн", date: "18 мая", high: 16, low: 10, kind: "rainy", precip: 55 }, ], }, ]; export function findCity(id: string) { return cities.find((c) => c.id === id) ?? cities[0]; } export const SEARCH_SUGGESTIONS = [ { id: "msk", label: "Москва", sub: "Россия" }, { id: "spb", label: "Санкт-Петербург", sub: "Россия" }, { id: "sochi", label: "Сочи", sub: "Россия" }, { id: "kazan", label: "Казань", sub: "Россия" }, { id: "ykt", label: "Якутск", sub: "Россия" }, { id: "vlk", label: "Владивосток", sub: "Россия" }, { id: "ekb", label: "Екатеринбург", sub: "Россия", disabled: true }, { id: "nsk", label: "Новосибирск", sub: "Россия", disabled: true }, { id: "krd", label: "Краснодар", sub: "Россия", disabled: true }, { id: "minsk", label: "Минск", sub: "Беларусь", disabled: true }, { id: "alm", label: "Алматы", sub: "Казахстан", disabled: true }, { id: "tb", label: "Тбилиси", sub: "Грузия", disabled: true }, ]; export function formatHour(h: number) { return `${String(h).padStart(2, "0")}:00`; } export function uvLabel(uv: number) { if (uv <= 2) return "Низкий"; if (uv <= 5) return "Умеренный"; if (uv <= 7) return "Высокий"; if (uv <= 10) return "Очень высокий"; return "Экстремальный"; } export function aqiColor(value: number) { if (value <= 50) return "text-emerald-600 dark:text-emerald-400"; if (value <= 100) return "text-amber-600 dark:text-amber-400"; return "text-rose-600 dark:text-rose-400"; }