From 2d31df88f0c9de9ef144058aa4dd752c34d0d2a2 Mon Sep 17 00:00:00 2001 From: terraputix Date: Wed, 7 Jan 2026 22:24:02 +0100 Subject: [PATCH] initial commit --- .gitignore | 23 + .npmrc | 1 + .prettierignore | 9 + .prettierrc | 16 + .vscode/settings.json | 5 + README.md | 38 + components.json | 16 + eslint.config.js | 41 + package-lock.json | 4749 +++++++++++++++++ package.json | 57 + src/app.d.ts | 13 + src/app.html | 11 + src/demo.spec.ts | 7 + src/lib/assets/favicon.svg | 1 + .../location/location-search.svelte | 266 + .../ui/alert/alert-description.svelte | 23 + .../components/ui/alert/alert-title.svelte | 20 + src/lib/components/ui/alert/alert.svelte | 44 + src/lib/components/ui/alert/index.ts | 14 + src/lib/components/ui/button/button.svelte | 82 + src/lib/components/ui/button/index.ts | 17 + .../components/ui/checkbox/checkbox.svelte | 36 + src/lib/components/ui/checkbox/index.ts | 6 + .../components/ui/dialog/dialog-close.svelte | 7 + .../ui/dialog/dialog-content.svelte | 45 + .../ui/dialog/dialog-description.svelte | 17 + .../components/ui/dialog/dialog-footer.svelte | 20 + .../components/ui/dialog/dialog-header.svelte | 20 + .../ui/dialog/dialog-overlay.svelte | 20 + .../components/ui/dialog/dialog-portal.svelte | 7 + .../components/ui/dialog/dialog-title.svelte | 17 + .../ui/dialog/dialog-trigger.svelte | 7 + src/lib/components/ui/dialog/dialog.svelte | 7 + src/lib/components/ui/dialog/index.ts | 34 + src/lib/components/ui/input/index.ts | 7 + src/lib/components/ui/input/input.svelte | 52 + src/lib/components/ui/label/index.ts | 7 + src/lib/components/ui/label/label.svelte | 20 + src/lib/components/ui/select/index.ts | 37 + .../ui/select/select-content.svelte | 45 + .../ui/select/select-group-heading.svelte | 21 + .../components/ui/select/select-group.svelte | 7 + .../components/ui/select/select-item.svelte | 38 + .../components/ui/select/select-label.svelte | 20 + .../components/ui/select/select-portal.svelte | 7 + .../select/select-scroll-down-button.svelte | 20 + .../ui/select/select-scroll-up-button.svelte | 20 + .../ui/select/select-separator.svelte | 18 + .../ui/select/select-trigger.svelte | 29 + src/lib/components/ui/select/select.svelte | 11 + src/lib/components/ui/separator/index.ts | 7 + .../components/ui/separator/separator.svelte | 21 + src/lib/components/ui/switch/index.ts | 7 + src/lib/components/ui/switch/switch.svelte | 29 + src/lib/index.ts | 1 + src/lib/stores/settings.ts | 45 + src/lib/stores/url-hash-store.ts | 23 + src/lib/utils.ts | 20 + src/lib/utils/meteo.ts | 7 + src/routes/+layout.svelte | 9 + src/routes/+page.svelte | 8 + src/routes/layout.css | 121 + src/routes/page.svelte.spec.ts | 13 + src/routes/weather/+layout.svelte | 97 + src/routes/weather/+layout.ts | 20 + src/routes/weather/+page.svelte | 703 +++ src/routes/weather/14-day/+layout.ts | 14 + src/routes/weather/14-day/+page.svelte | 331 ++ src/routes/weather/14-day/options.ts | 33 + src/routes/weather/canvas/cloud-cover.ts | 78 + src/routes/weather/canvas/daylight.ts | 20 + src/routes/weather/canvas/precip.ts | 20 + src/routes/weather/canvas/raster.ts | 42 + src/routes/weather/canvas/temp-gradient.ts | 60 + src/routes/weather/compare/+layout.ts | 14 + src/routes/weather/compare/+page.svelte | 434 ++ src/routes/weather/compare/highcharts.css | 1172 ++++ src/routes/weather/compare/options.ts | 33 + src/routes/weather/config.d.ts | 8 + .../weather/locations/city-names10.json | 12 + .../weather/locations/city-names100.json | 102 + src/routes/weather/options.ts | 64 + src/routes/weather/utils/color-scale-hex.ts | 102 + src/routes/weather/utils/colors.ts | 51 + .../weather/utils/colour-gradient.ipynb | 191 + src/routes/weather/utils/weather-codes.ts | 81 + src/routes/weather/week/+layout.ts | 14 + src/routes/weather/week/+page.svelte | 0 src/routes/weather/week/+page.ts | 25 + .../weather/week/[location]/+page.svelte | 9 + src/routes/weather/week/[location]/+page.ts | 77 + static/images/weather-icons/wi-alien.svg | 16 + static/images/weather-icons/wi-barometer.svg | 15 + static/images/weather-icons/wi-celsius.svg | 18 + static/images/weather-icons/wi-cloud-down.svg | 18 + .../images/weather-icons/wi-cloud-refresh.svg | 21 + static/images/weather-icons/wi-cloud-up.svg | 18 + static/images/weather-icons/wi-cloud.svg | 13 + .../images/weather-icons/wi-cloudy-gusts.svg | 22 + .../images/weather-icons/wi-cloudy-windy.svg | 19 + static/images/weather-icons/wi-cloudy.svg | 18 + static/images/weather-icons/wi-day-clear.svg | 27 + .../weather-icons/wi-day-cloudy-gusts.svg | 35 + .../weather-icons/wi-day-cloudy-high.svg | 26 + .../weather-icons/wi-day-cloudy-windy.svg | 33 + static/images/weather-icons/wi-day-cloudy.svg | 26 + static/images/weather-icons/wi-day-fog.svg | 31 + static/images/weather-icons/wi-day-hail.svg | 42 + static/images/weather-icons/wi-day-haze.svg | 33 + .../weather-icons/wi-day-light-wind.svg | 32 + .../images/weather-icons/wi-day-lightning.svg | 29 + .../images/weather-icons/wi-day-rain-mix.svg | 49 + .../images/weather-icons/wi-day-rain-wind.svg | 40 + static/images/weather-icons/wi-day-rain.svg | 35 + .../images/weather-icons/wi-day-showers.svg | 43 + .../weather-icons/wi-day-sleet-storm.svg | 40 + static/images/weather-icons/wi-day-sleet.svg | 46 + .../wi-day-snow-thunderstorm.svg | 37 + .../images/weather-icons/wi-day-snow-wind.svg | 40 + static/images/weather-icons/wi-day-snow.svg | 40 + .../images/weather-icons/wi-day-sprinkle.svg | 33 + .../weather-icons/wi-day-storm-showers.svg | 38 + .../weather-icons/wi-day-sunny-overcast.svg | 29 + static/images/weather-icons/wi-day-sunny.svg | 27 + .../weather-icons/wi-day-thunderstorm.svg | 34 + static/images/weather-icons/wi-day-windy.svg | 36 + static/images/weather-icons/wi-degrees.svg | 10 + .../weather-icons/wi-direction-down-left.svg | 10 + .../weather-icons/wi-direction-down-right.svg | 9 + .../weather-icons/wi-direction-down.svg | 9 + .../weather-icons/wi-direction-left.svg | 9 + .../weather-icons/wi-direction-right.svg | 10 + .../weather-icons/wi-direction-up-left.svg | 9 + .../weather-icons/wi-direction-up-right.svg | 9 + .../images/weather-icons/wi-direction-up.svg | 9 + static/images/weather-icons/wi-dust.svg | 31 + static/images/weather-icons/wi-earthquake.svg | 16 + static/images/weather-icons/wi-fahrenheit.svg | 13 + static/images/weather-icons/wi-fire.svg | 22 + static/images/weather-icons/wi-flood.svg | 22 + static/images/weather-icons/wi-fog.svg | 18 + .../images/weather-icons/wi-gale-warning.svg | 6 + static/images/weather-icons/wi-hail.svg | 30 + .../images/weather-icons/wi-horizon-alt.svg | 24 + static/images/weather-icons/wi-horizon.svg | 17 + static/images/weather-icons/wi-hot.svg | 56 + static/images/weather-icons/wi-humidity.svg | 23 + .../weather-icons/wi-hurricane-warning.svg | 7 + static/images/weather-icons/wi-hurricane.svg | 17 + static/images/weather-icons/wi-lightning.svg | 9 + .../images/weather-icons/wi-lunar-eclipse.svg | 11 + static/images/weather-icons/wi-meteor.svg | 17 + .../wi-moon-alt-first-quarter.svg | 10 + .../images/weather-icons/wi-moon-alt-full.svg | 11 + .../images/weather-icons/wi-moon-alt-new.svg | 8 + .../wi-moon-alt-third-quarter.svg | 10 + .../wi-moon-alt-waning-crescent-1.svg | 10 + .../wi-moon-alt-waning-crescent-2.svg | 10 + .../wi-moon-alt-waning-crescent-3.svg | 10 + .../wi-moon-alt-waning-crescent-4.svg | 11 + .../wi-moon-alt-waning-crescent-5.svg | 11 + .../wi-moon-alt-waning-crescent-6.svg | 11 + .../wi-moon-alt-waning-gibbous-1.svg | 11 + .../wi-moon-alt-waning-gibbous-2.svg | 12 + .../wi-moon-alt-waning-gibbous-3.svg | 12 + .../wi-moon-alt-waning-gibbous-4.svg | 11 + .../wi-moon-alt-waning-gibbous-5.svg | 11 + .../wi-moon-alt-waning-gibbous-6.svg | 10 + .../wi-moon-alt-waxing-crescent-1.svg | 10 + .../wi-moon-alt-waxing-crescent-2.svg | 10 + .../wi-moon-alt-waxing-crescent-3.svg | 10 + .../wi-moon-alt-waxing-crescent-4.svg | 10 + .../wi-moon-alt-waxing-crescent-5.svg | 10 + .../wi-moon-alt-waxing-crescent-6.svg | 10 + .../wi-moon-alt-waxing-gibbous-1.svg | 11 + .../wi-moon-alt-waxing-gibbous-2.svg | 11 + .../wi-moon-alt-waxing-gibbous-3.svg | 11 + .../wi-moon-alt-waxing-gibbous-4.svg | 11 + .../wi-moon-alt-waxing-gibbous-5.svg | 11 + .../wi-moon-alt-waxing-gibbous-6.svg | 12 + .../weather-icons/wi-moon-first-quarter.svg | 7 + static/images/weather-icons/wi-moon-full.svg | 8 + static/images/weather-icons/wi-moon-new.svg | 11 + .../weather-icons/wi-moon-third-quarter.svg | 7 + .../wi-moon-waning-crescent-1.svg | 7 + .../wi-moon-waning-crescent-2.svg | 7 + .../wi-moon-waning-crescent-3.svg | 7 + .../wi-moon-waning-crescent-4.svg | 8 + .../wi-moon-waning-crescent-5.svg | 8 + .../wi-moon-waning-crescent-6.svg | 9 + .../wi-moon-waning-gibbous-1.svg | 8 + .../wi-moon-waning-gibbous-2.svg | 8 + .../wi-moon-waning-gibbous-3.svg | 8 + .../wi-moon-waning-gibbous-4.svg | 8 + .../wi-moon-waning-gibbous-5.svg | 7 + .../wi-moon-waning-gibbous-6.svg | 7 + .../images/weather-icons/wi-moon-waxing-6.svg | 7 + .../wi-moon-waxing-crescent-1.svg | 9 + .../wi-moon-waxing-crescent-2.svg | 8 + .../wi-moon-waxing-crescent-3.svg | 8 + .../wi-moon-waxing-crescent-4.svg | 8 + .../wi-moon-waxing-crescent-5.svg | 7 + .../wi-moon-waxing-gibbous-1.svg | 7 + .../wi-moon-waxing-gibbous-2.svg | 7 + .../wi-moon-waxing-gibbous-3.svg | 8 + .../wi-moon-waxing-gibbous-4.svg | 8 + .../wi-moon-waxing-gibbous-5.svg | 8 + .../wi-moon-waxing-gibbous-6.svg | 8 + static/images/weather-icons/wi-moonrise.svg | 13 + static/images/weather-icons/wi-moonset.svg | 14 + static/images/weather-icons/wi-na.svg | 8 + .../wi-night-alt-cloudy-gusts.svg | 28 + .../wi-night-alt-cloudy-high.svg | 16 + .../wi-night-alt-cloudy-windy.svg | 25 + .../weather-icons/wi-night-alt-cloudy.svg | 19 + .../weather-icons/wi-night-alt-hail.svg | 34 + .../weather-icons/wi-night-alt-lightning.svg | 21 + .../wi-night-alt-partly-cloudy.svg | 19 + .../weather-icons/wi-night-alt-rain-mix.svg | 42 + .../weather-icons/wi-night-alt-rain-wind.svg | 32 + .../weather-icons/wi-night-alt-rain.svg | 27 + .../weather-icons/wi-night-alt-showers.svg | 34 + .../wi-night-alt-sleet-storm.svg | 32 + .../weather-icons/wi-night-alt-sleet.svg | 38 + .../wi-night-alt-snow-thunderstorm.svg | 30 + .../weather-icons/wi-night-alt-snow-wind.svg | 33 + .../weather-icons/wi-night-alt-snow.svg | 32 + .../weather-icons/wi-night-alt-sprinkle.svg | 26 + .../wi-night-alt-storm-showers.svg | 31 + .../wi-night-alt-thunderstorm.svg | 25 + .../images/weather-icons/wi-night-clear.svg | 13 + .../weather-icons/wi-night-cloudy-gusts.svg | 25 + .../weather-icons/wi-night-cloudy-high.svg | 17 + .../weather-icons/wi-night-cloudy-windy.svg | 22 + .../images/weather-icons/wi-night-cloudy.svg | 15 + static/images/weather-icons/wi-night-fog.svg | 22 + static/images/weather-icons/wi-night-hail.svg | 32 + .../weather-icons/wi-night-lightning.svg | 18 + .../weather-icons/wi-night-partly-cloudy.svg | 16 + .../weather-icons/wi-night-rain-mix.svg | 41 + .../weather-icons/wi-night-rain-wind.svg | 29 + static/images/weather-icons/wi-night-rain.svg | 24 + .../images/weather-icons/wi-night-showers.svg | 32 + .../weather-icons/wi-night-sleet-storm.svg | 29 + .../images/weather-icons/wi-night-sleet.svg | 34 + .../wi-night-snow-thunderstorm.svg | 27 + .../weather-icons/wi-night-snow-wind.svg | 29 + static/images/weather-icons/wi-night-snow.svg | 29 + .../weather-icons/wi-night-sprinkle.svg | 23 + .../weather-icons/wi-night-storm-showers.svg | 28 + .../weather-icons/wi-night-thunderstorm.svg | 22 + static/images/weather-icons/wi-rain-mix.svg | 37 + static/images/weather-icons/wi-rain-wind.svg | 28 + static/images/weather-icons/wi-rain.svg | 23 + static/images/weather-icons/wi-raindrop.svg | 9 + static/images/weather-icons/wi-raindrops.svg | 13 + .../images/weather-icons/wi-refresh-alt.svg | 11 + static/images/weather-icons/wi-refresh.svg | 12 + static/images/weather-icons/wi-sandstorm.svg | 31 + static/images/weather-icons/wi-showers.svg | 31 + static/images/weather-icons/wi-sleet.svg | 35 + .../weather-icons/wi-small-craft-advisory.svg | 6 + static/images/weather-icons/wi-smog.svg | 13 + static/images/weather-icons/wi-smoke.svg | 17 + static/images/weather-icons/wi-snow-wind.svg | 27 + static/images/weather-icons/wi-snow.svg | 27 + .../weather-icons/wi-snowflake-cold.svg | 30 + .../images/weather-icons/wi-solar-eclipse.svg | 28 + static/images/weather-icons/wi-sprinkle.svg | 20 + static/images/weather-icons/wi-stars.svg | 15 + .../images/weather-icons/wi-storm-showers.svg | 26 + .../images/weather-icons/wi-storm-warning.svg | 6 + .../images/weather-icons/wi-strong-wind.svg | 15 + static/images/weather-icons/wi-sunrise.svg | 25 + static/images/weather-icons/wi-sunset.svg | 25 + .../weather-icons/wi-thermometer-exterior.svg | 12 + .../weather-icons/wi-thermometer-internal.svg | 9 + .../images/weather-icons/wi-thermometer.svg | 15 + .../images/weather-icons/wi-thunderstorm.svg | 21 + static/images/weather-icons/wi-time-1.svg | 13 + static/images/weather-icons/wi-time-10.svg | 13 + static/images/weather-icons/wi-time-11.svg | 13 + static/images/weather-icons/wi-time-12.svg | 12 + static/images/weather-icons/wi-time-2.svg | 13 + static/images/weather-icons/wi-time-3.svg | 13 + static/images/weather-icons/wi-time-4.svg | 13 + static/images/weather-icons/wi-time-5.svg | 13 + static/images/weather-icons/wi-time-6.svg | 12 + static/images/weather-icons/wi-time-7.svg | 13 + static/images/weather-icons/wi-time-8.svg | 13 + static/images/weather-icons/wi-time-9.svg | 13 + static/images/weather-icons/wi-tornado.svg | 25 + static/images/weather-icons/wi-train.svg | 26 + static/images/weather-icons/wi-tsunami.svg | 26 + static/images/weather-icons/wi-umbrella.svg | 23 + static/images/weather-icons/wi-volcano.svg | 23 + .../weather-icons/wi-wind-beaufort-0.svg | 21 + .../weather-icons/wi-wind-beaufort-1.svg | 15 + .../weather-icons/wi-wind-beaufort-10.svg | 21 + .../weather-icons/wi-wind-beaufort-11.svg | 16 + .../weather-icons/wi-wind-beaufort-12.svg | 21 + .../weather-icons/wi-wind-beaufort-2.svg | 21 + .../weather-icons/wi-wind-beaufort-3.svg | 22 + .../weather-icons/wi-wind-beaufort-4.svg | 16 + .../weather-icons/wi-wind-beaufort-5.svg | 20 + .../weather-icons/wi-wind-beaufort-6.svg | 23 + .../weather-icons/wi-wind-beaufort-7.svg | 16 + .../weather-icons/wi-wind-beaufort-8.svg | 26 + .../weather-icons/wi-wind-beaufort-9.svg | 23 + static/images/weather-icons/wi-wind-deg.svg | 12 + static/images/weather-icons/wi-windy.svg | 14 + static/robots.txt | 3 + svelte.config.js | 13 + tsconfig.json | 20 + vite.config.ts | 42 + 315 files changed, 14484 insertions(+) create mode 100644 .gitignore create mode 100644 .npmrc create mode 100644 .prettierignore create mode 100644 .prettierrc create mode 100644 .vscode/settings.json create mode 100644 README.md create mode 100644 components.json create mode 100644 eslint.config.js create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 src/app.d.ts create mode 100644 src/app.html create mode 100644 src/demo.spec.ts create mode 100644 src/lib/assets/favicon.svg create mode 100644 src/lib/components/location/location-search.svelte create mode 100644 src/lib/components/ui/alert/alert-description.svelte create mode 100644 src/lib/components/ui/alert/alert-title.svelte create mode 100644 src/lib/components/ui/alert/alert.svelte create mode 100644 src/lib/components/ui/alert/index.ts create mode 100644 src/lib/components/ui/button/button.svelte create mode 100644 src/lib/components/ui/button/index.ts create mode 100644 src/lib/components/ui/checkbox/checkbox.svelte create mode 100644 src/lib/components/ui/checkbox/index.ts create mode 100644 src/lib/components/ui/dialog/dialog-close.svelte create mode 100644 src/lib/components/ui/dialog/dialog-content.svelte create mode 100644 src/lib/components/ui/dialog/dialog-description.svelte create mode 100644 src/lib/components/ui/dialog/dialog-footer.svelte create mode 100644 src/lib/components/ui/dialog/dialog-header.svelte create mode 100644 src/lib/components/ui/dialog/dialog-overlay.svelte create mode 100644 src/lib/components/ui/dialog/dialog-portal.svelte create mode 100644 src/lib/components/ui/dialog/dialog-title.svelte create mode 100644 src/lib/components/ui/dialog/dialog-trigger.svelte create mode 100644 src/lib/components/ui/dialog/dialog.svelte create mode 100644 src/lib/components/ui/dialog/index.ts create mode 100644 src/lib/components/ui/input/index.ts create mode 100644 src/lib/components/ui/input/input.svelte create mode 100644 src/lib/components/ui/label/index.ts create mode 100644 src/lib/components/ui/label/label.svelte create mode 100644 src/lib/components/ui/select/index.ts create mode 100644 src/lib/components/ui/select/select-content.svelte create mode 100644 src/lib/components/ui/select/select-group-heading.svelte create mode 100644 src/lib/components/ui/select/select-group.svelte create mode 100644 src/lib/components/ui/select/select-item.svelte create mode 100644 src/lib/components/ui/select/select-label.svelte create mode 100644 src/lib/components/ui/select/select-portal.svelte create mode 100644 src/lib/components/ui/select/select-scroll-down-button.svelte create mode 100644 src/lib/components/ui/select/select-scroll-up-button.svelte create mode 100644 src/lib/components/ui/select/select-separator.svelte create mode 100644 src/lib/components/ui/select/select-trigger.svelte create mode 100644 src/lib/components/ui/select/select.svelte create mode 100644 src/lib/components/ui/separator/index.ts create mode 100644 src/lib/components/ui/separator/separator.svelte create mode 100644 src/lib/components/ui/switch/index.ts create mode 100644 src/lib/components/ui/switch/switch.svelte create mode 100644 src/lib/index.ts create mode 100644 src/lib/stores/settings.ts create mode 100644 src/lib/stores/url-hash-store.ts create mode 100644 src/lib/utils.ts create mode 100644 src/lib/utils/meteo.ts create mode 100644 src/routes/+layout.svelte create mode 100644 src/routes/+page.svelte create mode 100644 src/routes/layout.css create mode 100644 src/routes/page.svelte.spec.ts create mode 100644 src/routes/weather/+layout.svelte create mode 100644 src/routes/weather/+layout.ts create mode 100644 src/routes/weather/+page.svelte create mode 100644 src/routes/weather/14-day/+layout.ts create mode 100644 src/routes/weather/14-day/+page.svelte create mode 100644 src/routes/weather/14-day/options.ts create mode 100644 src/routes/weather/canvas/cloud-cover.ts create mode 100644 src/routes/weather/canvas/daylight.ts create mode 100644 src/routes/weather/canvas/precip.ts create mode 100644 src/routes/weather/canvas/raster.ts create mode 100644 src/routes/weather/canvas/temp-gradient.ts create mode 100644 src/routes/weather/compare/+layout.ts create mode 100644 src/routes/weather/compare/+page.svelte create mode 100644 src/routes/weather/compare/highcharts.css create mode 100644 src/routes/weather/compare/options.ts create mode 100644 src/routes/weather/config.d.ts create mode 100644 src/routes/weather/locations/city-names10.json create mode 100644 src/routes/weather/locations/city-names100.json create mode 100644 src/routes/weather/options.ts create mode 100644 src/routes/weather/utils/color-scale-hex.ts create mode 100644 src/routes/weather/utils/colors.ts create mode 100644 src/routes/weather/utils/colour-gradient.ipynb create mode 100644 src/routes/weather/utils/weather-codes.ts create mode 100644 src/routes/weather/week/+layout.ts create mode 100644 src/routes/weather/week/+page.svelte create mode 100644 src/routes/weather/week/+page.ts create mode 100644 src/routes/weather/week/[location]/+page.svelte create mode 100644 src/routes/weather/week/[location]/+page.ts create mode 100644 static/images/weather-icons/wi-alien.svg create mode 100644 static/images/weather-icons/wi-barometer.svg create mode 100644 static/images/weather-icons/wi-celsius.svg create mode 100644 static/images/weather-icons/wi-cloud-down.svg create mode 100644 static/images/weather-icons/wi-cloud-refresh.svg create mode 100644 static/images/weather-icons/wi-cloud-up.svg create mode 100644 static/images/weather-icons/wi-cloud.svg create mode 100644 static/images/weather-icons/wi-cloudy-gusts.svg create mode 100644 static/images/weather-icons/wi-cloudy-windy.svg create mode 100644 static/images/weather-icons/wi-cloudy.svg create mode 100644 static/images/weather-icons/wi-day-clear.svg create mode 100644 static/images/weather-icons/wi-day-cloudy-gusts.svg create mode 100644 static/images/weather-icons/wi-day-cloudy-high.svg create mode 100644 static/images/weather-icons/wi-day-cloudy-windy.svg create mode 100644 static/images/weather-icons/wi-day-cloudy.svg create mode 100644 static/images/weather-icons/wi-day-fog.svg create mode 100644 static/images/weather-icons/wi-day-hail.svg create mode 100644 static/images/weather-icons/wi-day-haze.svg create mode 100644 static/images/weather-icons/wi-day-light-wind.svg create mode 100644 static/images/weather-icons/wi-day-lightning.svg create mode 100644 static/images/weather-icons/wi-day-rain-mix.svg create mode 100644 static/images/weather-icons/wi-day-rain-wind.svg create mode 100644 static/images/weather-icons/wi-day-rain.svg create mode 100644 static/images/weather-icons/wi-day-showers.svg create mode 100644 static/images/weather-icons/wi-day-sleet-storm.svg create mode 100644 static/images/weather-icons/wi-day-sleet.svg create mode 100644 static/images/weather-icons/wi-day-snow-thunderstorm.svg create mode 100644 static/images/weather-icons/wi-day-snow-wind.svg create mode 100644 static/images/weather-icons/wi-day-snow.svg create mode 100644 static/images/weather-icons/wi-day-sprinkle.svg create mode 100644 static/images/weather-icons/wi-day-storm-showers.svg create mode 100644 static/images/weather-icons/wi-day-sunny-overcast.svg create mode 100644 static/images/weather-icons/wi-day-sunny.svg create mode 100644 static/images/weather-icons/wi-day-thunderstorm.svg create mode 100644 static/images/weather-icons/wi-day-windy.svg create mode 100644 static/images/weather-icons/wi-degrees.svg create mode 100644 static/images/weather-icons/wi-direction-down-left.svg create mode 100644 static/images/weather-icons/wi-direction-down-right.svg create mode 100644 static/images/weather-icons/wi-direction-down.svg create mode 100644 static/images/weather-icons/wi-direction-left.svg create mode 100644 static/images/weather-icons/wi-direction-right.svg create mode 100644 static/images/weather-icons/wi-direction-up-left.svg create mode 100644 static/images/weather-icons/wi-direction-up-right.svg create mode 100644 static/images/weather-icons/wi-direction-up.svg create mode 100644 static/images/weather-icons/wi-dust.svg create mode 100644 static/images/weather-icons/wi-earthquake.svg create mode 100644 static/images/weather-icons/wi-fahrenheit.svg create mode 100644 static/images/weather-icons/wi-fire.svg create mode 100644 static/images/weather-icons/wi-flood.svg create mode 100644 static/images/weather-icons/wi-fog.svg create mode 100644 static/images/weather-icons/wi-gale-warning.svg create mode 100644 static/images/weather-icons/wi-hail.svg create mode 100644 static/images/weather-icons/wi-horizon-alt.svg create mode 100644 static/images/weather-icons/wi-horizon.svg create mode 100644 static/images/weather-icons/wi-hot.svg create mode 100644 static/images/weather-icons/wi-humidity.svg create mode 100644 static/images/weather-icons/wi-hurricane-warning.svg create mode 100644 static/images/weather-icons/wi-hurricane.svg create mode 100644 static/images/weather-icons/wi-lightning.svg create mode 100644 static/images/weather-icons/wi-lunar-eclipse.svg create mode 100644 static/images/weather-icons/wi-meteor.svg create mode 100644 static/images/weather-icons/wi-moon-alt-first-quarter.svg create mode 100644 static/images/weather-icons/wi-moon-alt-full.svg create mode 100644 static/images/weather-icons/wi-moon-alt-new.svg create mode 100644 static/images/weather-icons/wi-moon-alt-third-quarter.svg create mode 100644 static/images/weather-icons/wi-moon-alt-waning-crescent-1.svg create mode 100644 static/images/weather-icons/wi-moon-alt-waning-crescent-2.svg create mode 100644 static/images/weather-icons/wi-moon-alt-waning-crescent-3.svg create mode 100644 static/images/weather-icons/wi-moon-alt-waning-crescent-4.svg create mode 100644 static/images/weather-icons/wi-moon-alt-waning-crescent-5.svg create mode 100644 static/images/weather-icons/wi-moon-alt-waning-crescent-6.svg create mode 100644 static/images/weather-icons/wi-moon-alt-waning-gibbous-1.svg create mode 100644 static/images/weather-icons/wi-moon-alt-waning-gibbous-2.svg create mode 100644 static/images/weather-icons/wi-moon-alt-waning-gibbous-3.svg create mode 100644 static/images/weather-icons/wi-moon-alt-waning-gibbous-4.svg create mode 100644 static/images/weather-icons/wi-moon-alt-waning-gibbous-5.svg create mode 100644 static/images/weather-icons/wi-moon-alt-waning-gibbous-6.svg create mode 100644 static/images/weather-icons/wi-moon-alt-waxing-crescent-1.svg create mode 100644 static/images/weather-icons/wi-moon-alt-waxing-crescent-2.svg create mode 100644 static/images/weather-icons/wi-moon-alt-waxing-crescent-3.svg create mode 100644 static/images/weather-icons/wi-moon-alt-waxing-crescent-4.svg create mode 100644 static/images/weather-icons/wi-moon-alt-waxing-crescent-5.svg create mode 100644 static/images/weather-icons/wi-moon-alt-waxing-crescent-6.svg create mode 100644 static/images/weather-icons/wi-moon-alt-waxing-gibbous-1.svg create mode 100644 static/images/weather-icons/wi-moon-alt-waxing-gibbous-2.svg create mode 100644 static/images/weather-icons/wi-moon-alt-waxing-gibbous-3.svg create mode 100644 static/images/weather-icons/wi-moon-alt-waxing-gibbous-4.svg create mode 100644 static/images/weather-icons/wi-moon-alt-waxing-gibbous-5.svg create mode 100644 static/images/weather-icons/wi-moon-alt-waxing-gibbous-6.svg create mode 100644 static/images/weather-icons/wi-moon-first-quarter.svg create mode 100644 static/images/weather-icons/wi-moon-full.svg create mode 100644 static/images/weather-icons/wi-moon-new.svg create mode 100644 static/images/weather-icons/wi-moon-third-quarter.svg create mode 100644 static/images/weather-icons/wi-moon-waning-crescent-1.svg create mode 100644 static/images/weather-icons/wi-moon-waning-crescent-2.svg create mode 100644 static/images/weather-icons/wi-moon-waning-crescent-3.svg create mode 100644 static/images/weather-icons/wi-moon-waning-crescent-4.svg create mode 100644 static/images/weather-icons/wi-moon-waning-crescent-5.svg create mode 100644 static/images/weather-icons/wi-moon-waning-crescent-6.svg create mode 100644 static/images/weather-icons/wi-moon-waning-gibbous-1.svg create mode 100644 static/images/weather-icons/wi-moon-waning-gibbous-2.svg create mode 100644 static/images/weather-icons/wi-moon-waning-gibbous-3.svg create mode 100644 static/images/weather-icons/wi-moon-waning-gibbous-4.svg create mode 100644 static/images/weather-icons/wi-moon-waning-gibbous-5.svg create mode 100644 static/images/weather-icons/wi-moon-waning-gibbous-6.svg create mode 100644 static/images/weather-icons/wi-moon-waxing-6.svg create mode 100644 static/images/weather-icons/wi-moon-waxing-crescent-1.svg create mode 100644 static/images/weather-icons/wi-moon-waxing-crescent-2.svg create mode 100644 static/images/weather-icons/wi-moon-waxing-crescent-3.svg create mode 100644 static/images/weather-icons/wi-moon-waxing-crescent-4.svg create mode 100644 static/images/weather-icons/wi-moon-waxing-crescent-5.svg create mode 100644 static/images/weather-icons/wi-moon-waxing-gibbous-1.svg create mode 100644 static/images/weather-icons/wi-moon-waxing-gibbous-2.svg create mode 100644 static/images/weather-icons/wi-moon-waxing-gibbous-3.svg create mode 100644 static/images/weather-icons/wi-moon-waxing-gibbous-4.svg create mode 100644 static/images/weather-icons/wi-moon-waxing-gibbous-5.svg create mode 100644 static/images/weather-icons/wi-moon-waxing-gibbous-6.svg create mode 100644 static/images/weather-icons/wi-moonrise.svg create mode 100644 static/images/weather-icons/wi-moonset.svg create mode 100644 static/images/weather-icons/wi-na.svg create mode 100644 static/images/weather-icons/wi-night-alt-cloudy-gusts.svg create mode 100644 static/images/weather-icons/wi-night-alt-cloudy-high.svg create mode 100644 static/images/weather-icons/wi-night-alt-cloudy-windy.svg create mode 100644 static/images/weather-icons/wi-night-alt-cloudy.svg create mode 100644 static/images/weather-icons/wi-night-alt-hail.svg create mode 100644 static/images/weather-icons/wi-night-alt-lightning.svg create mode 100644 static/images/weather-icons/wi-night-alt-partly-cloudy.svg create mode 100644 static/images/weather-icons/wi-night-alt-rain-mix.svg create mode 100644 static/images/weather-icons/wi-night-alt-rain-wind.svg create mode 100644 static/images/weather-icons/wi-night-alt-rain.svg create mode 100644 static/images/weather-icons/wi-night-alt-showers.svg create mode 100644 static/images/weather-icons/wi-night-alt-sleet-storm.svg create mode 100644 static/images/weather-icons/wi-night-alt-sleet.svg create mode 100644 static/images/weather-icons/wi-night-alt-snow-thunderstorm.svg create mode 100644 static/images/weather-icons/wi-night-alt-snow-wind.svg create mode 100644 static/images/weather-icons/wi-night-alt-snow.svg create mode 100644 static/images/weather-icons/wi-night-alt-sprinkle.svg create mode 100644 static/images/weather-icons/wi-night-alt-storm-showers.svg create mode 100644 static/images/weather-icons/wi-night-alt-thunderstorm.svg create mode 100644 static/images/weather-icons/wi-night-clear.svg create mode 100644 static/images/weather-icons/wi-night-cloudy-gusts.svg create mode 100644 static/images/weather-icons/wi-night-cloudy-high.svg create mode 100644 static/images/weather-icons/wi-night-cloudy-windy.svg create mode 100644 static/images/weather-icons/wi-night-cloudy.svg create mode 100644 static/images/weather-icons/wi-night-fog.svg create mode 100644 static/images/weather-icons/wi-night-hail.svg create mode 100644 static/images/weather-icons/wi-night-lightning.svg create mode 100644 static/images/weather-icons/wi-night-partly-cloudy.svg create mode 100644 static/images/weather-icons/wi-night-rain-mix.svg create mode 100644 static/images/weather-icons/wi-night-rain-wind.svg create mode 100644 static/images/weather-icons/wi-night-rain.svg create mode 100644 static/images/weather-icons/wi-night-showers.svg create mode 100644 static/images/weather-icons/wi-night-sleet-storm.svg create mode 100644 static/images/weather-icons/wi-night-sleet.svg create mode 100644 static/images/weather-icons/wi-night-snow-thunderstorm.svg create mode 100644 static/images/weather-icons/wi-night-snow-wind.svg create mode 100644 static/images/weather-icons/wi-night-snow.svg create mode 100644 static/images/weather-icons/wi-night-sprinkle.svg create mode 100644 static/images/weather-icons/wi-night-storm-showers.svg create mode 100644 static/images/weather-icons/wi-night-thunderstorm.svg create mode 100644 static/images/weather-icons/wi-rain-mix.svg create mode 100644 static/images/weather-icons/wi-rain-wind.svg create mode 100644 static/images/weather-icons/wi-rain.svg create mode 100644 static/images/weather-icons/wi-raindrop.svg create mode 100644 static/images/weather-icons/wi-raindrops.svg create mode 100644 static/images/weather-icons/wi-refresh-alt.svg create mode 100644 static/images/weather-icons/wi-refresh.svg create mode 100644 static/images/weather-icons/wi-sandstorm.svg create mode 100644 static/images/weather-icons/wi-showers.svg create mode 100644 static/images/weather-icons/wi-sleet.svg create mode 100644 static/images/weather-icons/wi-small-craft-advisory.svg create mode 100644 static/images/weather-icons/wi-smog.svg create mode 100644 static/images/weather-icons/wi-smoke.svg create mode 100644 static/images/weather-icons/wi-snow-wind.svg create mode 100644 static/images/weather-icons/wi-snow.svg create mode 100644 static/images/weather-icons/wi-snowflake-cold.svg create mode 100644 static/images/weather-icons/wi-solar-eclipse.svg create mode 100644 static/images/weather-icons/wi-sprinkle.svg create mode 100644 static/images/weather-icons/wi-stars.svg create mode 100644 static/images/weather-icons/wi-storm-showers.svg create mode 100644 static/images/weather-icons/wi-storm-warning.svg create mode 100644 static/images/weather-icons/wi-strong-wind.svg create mode 100644 static/images/weather-icons/wi-sunrise.svg create mode 100644 static/images/weather-icons/wi-sunset.svg create mode 100644 static/images/weather-icons/wi-thermometer-exterior.svg create mode 100644 static/images/weather-icons/wi-thermometer-internal.svg create mode 100644 static/images/weather-icons/wi-thermometer.svg create mode 100644 static/images/weather-icons/wi-thunderstorm.svg create mode 100644 static/images/weather-icons/wi-time-1.svg create mode 100644 static/images/weather-icons/wi-time-10.svg create mode 100644 static/images/weather-icons/wi-time-11.svg create mode 100644 static/images/weather-icons/wi-time-12.svg create mode 100644 static/images/weather-icons/wi-time-2.svg create mode 100644 static/images/weather-icons/wi-time-3.svg create mode 100644 static/images/weather-icons/wi-time-4.svg create mode 100644 static/images/weather-icons/wi-time-5.svg create mode 100644 static/images/weather-icons/wi-time-6.svg create mode 100644 static/images/weather-icons/wi-time-7.svg create mode 100644 static/images/weather-icons/wi-time-8.svg create mode 100644 static/images/weather-icons/wi-time-9.svg create mode 100644 static/images/weather-icons/wi-tornado.svg create mode 100644 static/images/weather-icons/wi-train.svg create mode 100644 static/images/weather-icons/wi-tsunami.svg create mode 100644 static/images/weather-icons/wi-umbrella.svg create mode 100644 static/images/weather-icons/wi-volcano.svg create mode 100644 static/images/weather-icons/wi-wind-beaufort-0.svg create mode 100644 static/images/weather-icons/wi-wind-beaufort-1.svg create mode 100644 static/images/weather-icons/wi-wind-beaufort-10.svg create mode 100644 static/images/weather-icons/wi-wind-beaufort-11.svg create mode 100644 static/images/weather-icons/wi-wind-beaufort-12.svg create mode 100644 static/images/weather-icons/wi-wind-beaufort-2.svg create mode 100644 static/images/weather-icons/wi-wind-beaufort-3.svg create mode 100644 static/images/weather-icons/wi-wind-beaufort-4.svg create mode 100644 static/images/weather-icons/wi-wind-beaufort-5.svg create mode 100644 static/images/weather-icons/wi-wind-beaufort-6.svg create mode 100644 static/images/weather-icons/wi-wind-beaufort-7.svg create mode 100644 static/images/weather-icons/wi-wind-beaufort-8.svg create mode 100644 static/images/weather-icons/wi-wind-beaufort-9.svg create mode 100644 static/images/weather-icons/wi-wind-deg.svg create mode 100644 static/images/weather-icons/wi-windy.svg create mode 100644 static/robots.txt create mode 100644 svelte.config.js create mode 100644 tsconfig.json create mode 100644 vite.config.ts diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3b462cb --- /dev/null +++ b/.gitignore @@ -0,0 +1,23 @@ +node_modules + +# Output +.output +.vercel +.netlify +.wrangler +/.svelte-kit +/build + +# OS +.DS_Store +Thumbs.db + +# Env +.env +.env.* +!.env.example +!.env.test + +# Vite +vite.config.js.timestamp-* +vite.config.ts.timestamp-* diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..b6f27f1 --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +engine-strict=true diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..7d74fe2 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,9 @@ +# Package Managers +package-lock.json +pnpm-lock.yaml +yarn.lock +bun.lock +bun.lockb + +# Miscellaneous +/static/ diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..819fa57 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,16 @@ +{ + "useTabs": true, + "singleQuote": true, + "trailingComma": "none", + "printWidth": 100, + "plugins": ["prettier-plugin-svelte", "prettier-plugin-tailwindcss"], + "overrides": [ + { + "files": "*.svelte", + "options": { + "parser": "svelte" + } + } + ], + "tailwindStylesheet": "./src/routes/layout.css" +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..bc31e15 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "files.associations": { + "*.css": "tailwindcss" + } +} diff --git a/README.md b/README.md new file mode 100644 index 0000000..75842c4 --- /dev/null +++ b/README.md @@ -0,0 +1,38 @@ +# sv + +Everything you need to build a Svelte project, powered by [`sv`](https://github.com/sveltejs/cli). + +## Creating a project + +If you're seeing this, you've probably already done this step. Congrats! + +```sh +# create a new project in the current directory +npx sv create + +# create a new project in my-app +npx sv create my-app +``` + +## Developing + +Once you've created a project and installed dependencies with `npm install` (or `pnpm install` or `yarn`), start a development server: + +```sh +npm run dev + +# or start the server and open the app in a new browser tab +npm run dev -- --open +``` + +## Building + +To create a production version of your app: + +```sh +npm run build +``` + +You can preview the production build with `npm run preview`. + +> To deploy your app, you may need to install an [adapter](https://svelte.dev/docs/kit/adapters) for your target environment. diff --git a/components.json b/components.json new file mode 100644 index 0000000..c8f04c6 --- /dev/null +++ b/components.json @@ -0,0 +1,16 @@ +{ + "$schema": "https://shadcn-svelte.com/schema.json", + "tailwind": { + "css": "src/routes/layout.css", + "baseColor": "slate" + }, + "aliases": { + "components": "$lib/components", + "utils": "$lib/utils", + "ui": "$lib/components/ui", + "hooks": "$lib/hooks", + "lib": "$lib" + }, + "typescript": true, + "registry": "https://shadcn-svelte.com/registry" +} diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 0000000..7df665d --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,41 @@ +import prettier from 'eslint-config-prettier'; +import { fileURLToPath } from 'node:url'; +import { includeIgnoreFile } from '@eslint/compat'; +import js from '@eslint/js'; +import svelte from 'eslint-plugin-svelte'; +import { defineConfig } from 'eslint/config'; +import globals from 'globals'; +import ts from 'typescript-eslint'; +import svelteConfig from './svelte.config.js'; + +const gitignorePath = fileURLToPath(new URL('./.gitignore', import.meta.url)); + +export default defineConfig( + includeIgnoreFile(gitignorePath), + js.configs.recommended, + ...ts.configs.recommended, + ...svelte.configs.recommended, + prettier, + ...svelte.configs.prettier, + { + languageOptions: { globals: { ...globals.browser, ...globals.node } }, + + rules: { + // typescript-eslint strongly recommend that you do not use the no-undef lint rule on TypeScript projects. + // see: https://typescript-eslint.io/troubleshooting/faqs/eslint/#i-get-errors-from-the-no-undef-rule-about-global-variables-not-being-defined-even-though-there-are-no-typescript-errors + 'no-undef': 'off' + } + }, + { + files: ['**/*.svelte', '**/*.svelte.ts', '**/*.svelte.js'], + + languageOptions: { + parserOptions: { + projectService: true, + extraFileExtensions: ['.svelte'], + parser: ts.parser, + svelteConfig + } + } + } +); diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..64531c5 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,4749 @@ +{ + "name": "open-meteo-weather", + "version": "0.0.1", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "open-meteo-weather", + "version": "0.0.1", + "dependencies": { + "highcharts": "^12.4.0", + "mode-watcher": "^1.1.0", + "openmeteo": "^1.2.3" + }, + "devDependencies": { + "@eslint/compat": "^1.4.0", + "@eslint/js": "^9.39.1", + "@internationalized/date": "^3.10.1", + "@lucide/svelte": "^0.561.0", + "@sveltejs/adapter-static": "^3.0.10", + "@sveltejs/kit": "^2.49.1", + "@sveltejs/vite-plugin-svelte": "^6.2.1", + "@tailwindcss/vite": "^4.1.17", + "@types/node": "^24", + "@vitest/browser-playwright": "^4.0.15", + "bits-ui": "^2.15.4", + "clsx": "^2.1.1", + "eslint": "^9.39.1", + "eslint-config-prettier": "^10.1.8", + "eslint-plugin-svelte": "^3.13.1", + "globals": "^16.5.0", + "playwright": "^1.57.0", + "prettier": "^3.7.4", + "prettier-plugin-svelte": "^3.4.0", + "prettier-plugin-tailwindcss": "^0.7.2", + "svelte": "^5.45.6", + "svelte-check": "^4.3.4", + "svelte-persisted-store": "^0.12.0", + "tailwind-merge": "^3.4.0", + "tailwind-variants": "^3.2.2", + "tailwindcss": "^4.1.17", + "tw-animate-css": "^1.4.0", + "typescript": "^5.9.3", + "typescript-eslint": "^8.48.1", + "vite": "^7.2.6", + "vitest": "^4.0.15", + "vitest-browser-svelte": "^2.0.1" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz", + "integrity": "sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.2.tgz", + "integrity": "sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.2.tgz", + "integrity": "sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.2.tgz", + "integrity": "sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.2.tgz", + "integrity": "sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.2.tgz", + "integrity": "sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.2.tgz", + "integrity": "sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.2.tgz", + "integrity": "sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.2.tgz", + "integrity": "sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.2.tgz", + "integrity": "sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.2.tgz", + "integrity": "sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.2.tgz", + "integrity": "sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.2.tgz", + "integrity": "sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.2.tgz", + "integrity": "sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.2.tgz", + "integrity": "sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.2.tgz", + "integrity": "sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.2.tgz", + "integrity": "sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.2.tgz", + "integrity": "sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.2.tgz", + "integrity": "sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.2.tgz", + "integrity": "sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.2.tgz", + "integrity": "sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.2.tgz", + "integrity": "sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.2.tgz", + "integrity": "sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.2.tgz", + "integrity": "sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.2.tgz", + "integrity": "sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.2.tgz", + "integrity": "sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/compat": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@eslint/compat/-/compat-1.4.1.tgz", + "integrity": "sha512-cfO82V9zxxGBxcQDr1lfaYB7wykTa0b00mGa36FrJl7iTFd0Z2cHfEYuxcBRP/iNijCsWsEkA+jzT8hGYmv33w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "peerDependencies": { + "eslint": "^8.40 || 9" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", + "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.7", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.3.tgz", + "integrity": "sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.1", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "9.39.2", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.2.tgz", + "integrity": "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.3.tgz", + "integrity": "sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.10" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.4.tgz", + "integrity": "sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.7.3", + "@floating-ui/utils": "^0.2.10" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.10.tgz", + "integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@internationalized/date": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@internationalized/date/-/date-3.10.1.tgz", + "integrity": "sha512-oJrXtQiAXLvT9clCf1K4kxp3eKsQhIaZqxEyowkBcsvZDdZkbWrVmnGknxs5flTD0VGsxrxKgBCZty1EzoiMzA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@swc/helpers": "^0.5.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@lucide/svelte": { + "version": "0.561.0", + "resolved": "https://registry.npmjs.org/@lucide/svelte/-/svelte-0.561.0.tgz", + "integrity": "sha512-vofKV2UFVrKE6I4ewKJ3dfCXSV6iP6nWVmiM83MLjsU91EeJcEg7LoWUABLp/aOTxj1HQNbJD1f3g3L0JQgH9A==", + "dev": true, + "license": "ISC", + "peerDependencies": { + "svelte": "^5" + } + }, + "node_modules/@openmeteo/sdk": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@openmeteo/sdk/-/sdk-1.23.0.tgz", + "integrity": "sha512-haGK9vDCYkSq/ikp68NJwgZS1jT9LqUeJEq/tTKqO18g5e/V1m0qKs1Cqt3c7elws2/hbTvX7VLvt8gqoMxU2w==", + "license": "MIT", + "dependencies": { + "flatbuffers": "^25.9.23" + }, + "engines": { + "node": ">=12.0" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.29", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", + "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.55.1.tgz", + "integrity": "sha512-9R0DM/ykwfGIlNu6+2U09ga0WXeZ9MRC2Ter8jnz8415VbuIykVuc6bhdrbORFZANDmTDvq26mJrEVTl8TdnDg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.55.1.tgz", + "integrity": "sha512-eFZCb1YUqhTysgW3sj/55du5cG57S7UTNtdMjCW7LwVcj3dTTcowCsC8p7uBdzKsZYa8J7IDE8lhMI+HX1vQvg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.55.1.tgz", + "integrity": "sha512-p3grE2PHcQm2e8PSGZdzIhCKbMCw/xi9XvMPErPhwO17vxtvCN5FEA2mSLgmKlCjHGMQTP6phuQTYWUnKewwGg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.55.1.tgz", + "integrity": "sha512-rDUjG25C9qoTm+e02Esi+aqTKSBYwVTaoS1wxcN47/Luqef57Vgp96xNANwt5npq9GDxsH7kXxNkJVEsWEOEaQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.55.1.tgz", + "integrity": "sha512-+JiU7Jbp5cdxekIgdte0jfcu5oqw4GCKr6i3PJTlXTCU5H5Fvtkpbs4XJHRmWNXF+hKmn4v7ogI5OQPaupJgOg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.55.1.tgz", + "integrity": "sha512-V5xC1tOVWtLLmr3YUk2f6EJK4qksksOYiz/TCsFHu/R+woubcLWdC9nZQmwjOAbmExBIVKsm1/wKmEy4z4u4Bw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.55.1.tgz", + "integrity": "sha512-Rn3n+FUk2J5VWx+ywrG/HGPTD9jXNbicRtTM11e/uorplArnXZYsVifnPPqNNP5BsO3roI4n8332ukpY/zN7rQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.55.1.tgz", + "integrity": "sha512-grPNWydeKtc1aEdrJDWk4opD7nFtQbMmV7769hiAaYyUKCT1faPRm2av8CX1YJsZ4TLAZcg9gTR1KvEzoLjXkg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.55.1.tgz", + "integrity": "sha512-a59mwd1k6x8tXKcUxSyISiquLwB5pX+fJW9TkWU46lCqD/GRDe9uDN31jrMmVP3feI3mhAdvcCClhV8V5MhJFQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.55.1.tgz", + "integrity": "sha512-puS1MEgWX5GsHSoiAsF0TYrpomdvkaXm0CofIMG5uVkP6IBV+ZO9xhC5YEN49nsgYo1DuuMquF9+7EDBVYu4uA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.55.1.tgz", + "integrity": "sha512-r3Wv40in+lTsULSb6nnoudVbARdOwb2u5fpeoOAZjFLznp6tDU8kd+GTHmJoqZ9lt6/Sys33KdIHUaQihFcu7g==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.55.1.tgz", + "integrity": "sha512-MR8c0+UxAlB22Fq4R+aQSPBayvYa3+9DrwG/i1TKQXFYEaoW3B5b/rkSRIypcZDdWjWnpcvxbNaAJDcSbJU3Lw==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.55.1.tgz", + "integrity": "sha512-3KhoECe1BRlSYpMTeVrD4sh2Pw2xgt4jzNSZIIPLFEsnQn9gAnZagW9+VqDqAHgm1Xc77LzJOo2LdigS5qZ+gw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.55.1.tgz", + "integrity": "sha512-ziR1OuZx0vdYZZ30vueNZTg73alF59DicYrPViG0NEgDVN8/Jl87zkAPu4u6VjZST2llgEUjaiNl9JM6HH1Vdw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.55.1.tgz", + "integrity": "sha512-uW0Y12ih2XJRERZ4jAfKamTyIHVMPQnTZcQjme2HMVDAHY4amf5u414OqNYC+x+LzRdRcnIG1YodLrrtA8xsxw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.55.1.tgz", + "integrity": "sha512-u9yZ0jUkOED1BFrqu3BwMQoixvGHGZ+JhJNkNKY/hyoEgOwlqKb62qu+7UjbPSHYjiVy8kKJHvXKv5coH4wDeg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.55.1.tgz", + "integrity": "sha512-/0PenBCmqM4ZUd0190j7J0UsQ/1nsi735iPRakO8iPciE7BQ495Y6msPzaOmvx0/pn+eJVVlZrNrSh4WSYLxNg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.55.1.tgz", + "integrity": "sha512-a8G4wiQxQG2BAvo+gU6XrReRRqj+pLS2NGXKm8io19goR+K8lw269eTrPkSdDTALwMmJp4th2Uh0D8J9bEV1vg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.55.1.tgz", + "integrity": "sha512-bD+zjpFrMpP/hqkfEcnjXWHMw5BIghGisOKPj+2NaNDuVT+8Ds4mPf3XcPHuat1tz89WRL+1wbcxKY3WSbiT7w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.55.1.tgz", + "integrity": "sha512-eLXw0dOiqE4QmvikfQ6yjgkg/xDM+MdU9YJuP4ySTibXU0oAvnEWXt7UDJmD4UkYialMfOGFPJnIHSe/kdzPxg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.55.1.tgz", + "integrity": "sha512-xzm44KgEP11te3S2HCSyYf5zIzWmx3n8HDCc7EE59+lTcswEWNpvMLfd9uJvVX8LCg9QWG67Xt75AuHn4vgsXw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.55.1.tgz", + "integrity": "sha512-yR6Bl3tMC/gBok5cz/Qi0xYnVbIxGx5Fcf/ca0eB6/6JwOY+SRUcJfI0OpeTpPls7f194as62thCt/2BjxYN8g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.55.1.tgz", + "integrity": "sha512-3fZBidchE0eY0oFZBnekYCfg+5wAB0mbpCBuofh5mZuzIU/4jIVkbESmd2dOsFNS78b53CYv3OAtwqkZZmU5nA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.55.1.tgz", + "integrity": "sha512-xGGY5pXj69IxKb4yv/POoocPy/qmEGhimy/FoTpTSVju3FYXUQQMFCaZZXJVidsmGxRioZAwpThl/4zX41gRKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.55.1.tgz", + "integrity": "sha512-SPEpaL6DX4rmcXtnhdrQYgzQ5W2uW3SCJch88lB2zImhJRhIIK44fkUrgIV/Q8yUNfw5oyZ5vkeQsZLhCb06lw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@standard-schema/spec": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@sveltejs/acorn-typescript": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@sveltejs/acorn-typescript/-/acorn-typescript-1.0.8.tgz", + "integrity": "sha512-esgN+54+q0NjB0Y/4BomT9samII7jGwNy/2a3wNZbT2A2RpmXsXwUt24LvLhx6jUq2gVk4cWEvcRO6MFQbOfNA==", + "license": "MIT", + "peerDependencies": { + "acorn": "^8.9.0" + } + }, + "node_modules/@sveltejs/adapter-static": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@sveltejs/adapter-static/-/adapter-static-3.0.10.tgz", + "integrity": "sha512-7D9lYFWJmB7zxZyTE/qxjksvMqzMuYrrsyh1f4AlZqeZeACPRySjbC3aFiY55wb1tWUaKOQG9PVbm74JcN2Iew==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@sveltejs/kit": "^2.0.0" + } + }, + "node_modules/@sveltejs/kit": { + "version": "2.49.3", + "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.49.3.tgz", + "integrity": "sha512-luTmE2Isk9GRJnitqanLoByKBiyLdfLpV2qV9a25JMxjbQt919TVqG8pibJDkxTvX9+w2k/9IL7o+/RtG++3QA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "@sveltejs/acorn-typescript": "^1.0.5", + "@types/cookie": "^0.6.0", + "acorn": "^8.14.1", + "cookie": "^0.6.0", + "devalue": "^5.3.2", + "esm-env": "^1.2.2", + "kleur": "^4.1.5", + "magic-string": "^0.30.5", + "mrmime": "^2.0.0", + "sade": "^1.8.1", + "set-cookie-parser": "^2.6.0", + "sirv": "^3.0.0" + }, + "bin": { + "svelte-kit": "svelte-kit.js" + }, + "engines": { + "node": ">=18.13" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0", + "@sveltejs/vite-plugin-svelte": "^3.0.0 || ^4.0.0-next.1 || ^5.0.0 || ^6.0.0-next.0", + "svelte": "^4.0.0 || ^5.0.0-next.0", + "typescript": "^5.3.3", + "vite": "^5.0.3 || ^6.0.0 || ^7.0.0-beta.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/@sveltejs/vite-plugin-svelte": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-6.2.3.tgz", + "integrity": "sha512-a+uxqQ9j6Lxmq4plbGaNdM9hgDCZyxAv/yvuyF5iWoA2H5icZkqD3rdK155ZQgFLX2lc3NvahHG4OgKpYqYPiQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sveltejs/vite-plugin-svelte-inspector": "^5.0.0", + "deepmerge": "^4.3.1", + "magic-string": "^0.30.21", + "obug": "^2.1.0", + "vitefu": "^1.1.1" + }, + "engines": { + "node": "^20.19 || ^22.12 || >=24" + }, + "peerDependencies": { + "svelte": "^5.0.0", + "vite": "^6.3.0 || ^7.0.0" + } + }, + "node_modules/@sveltejs/vite-plugin-svelte-inspector": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-5.0.2.tgz", + "integrity": "sha512-TZzRTcEtZffICSAoZGkPSl6Etsj2torOVrx6Uw0KpXxrec9Gg6jFWQ60Q3+LmNGfZSxHRCZL7vXVZIWmuV50Ig==", + "dev": true, + "license": "MIT", + "dependencies": { + "obug": "^2.1.0" + }, + "engines": { + "node": "^20.19 || ^22.12 || >=24" + }, + "peerDependencies": { + "@sveltejs/vite-plugin-svelte": "^6.0.0-next.0", + "svelte": "^5.0.0", + "vite": "^6.3.0 || ^7.0.0" + } + }, + "node_modules/@swc/helpers": { + "version": "0.5.18", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.18.tgz", + "integrity": "sha512-TXTnIcNJQEKwThMMqBXsZ4VGAza6bvN4pa41Rkqoio6QBKMvo+5lexeTMScGCIxtzgQJzElcvIltani+adC5PQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/@tailwindcss/node": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.18.tgz", + "integrity": "sha512-DoR7U1P7iYhw16qJ49fgXUlry1t4CpXeErJHnQ44JgTSKMaZUdf17cfn5mHchfJ4KRBZRFA/Coo+MUF5+gOaCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.4", + "enhanced-resolve": "^5.18.3", + "jiti": "^2.6.1", + "lightningcss": "1.30.2", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.1.18" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.18.tgz", + "integrity": "sha512-EgCR5tTS5bUSKQgzeMClT6iCY3ToqE1y+ZB0AKldj809QXk1Y+3jB0upOYZrn9aGIzPtUsP7sX4QQ4XtjBB95A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.1.18", + "@tailwindcss/oxide-darwin-arm64": "4.1.18", + "@tailwindcss/oxide-darwin-x64": "4.1.18", + "@tailwindcss/oxide-freebsd-x64": "4.1.18", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.18", + "@tailwindcss/oxide-linux-arm64-gnu": "4.1.18", + "@tailwindcss/oxide-linux-arm64-musl": "4.1.18", + "@tailwindcss/oxide-linux-x64-gnu": "4.1.18", + "@tailwindcss/oxide-linux-x64-musl": "4.1.18", + "@tailwindcss/oxide-wasm32-wasi": "4.1.18", + "@tailwindcss/oxide-win32-arm64-msvc": "4.1.18", + "@tailwindcss/oxide-win32-x64-msvc": "4.1.18" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.18.tgz", + "integrity": "sha512-dJHz7+Ugr9U/diKJA0W6N/6/cjI+ZTAoxPf9Iz9BFRF2GzEX8IvXxFIi/dZBloVJX/MZGvRuFA9rqwdiIEZQ0Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.18.tgz", + "integrity": "sha512-Gc2q4Qhs660bhjyBSKgq6BYvwDz4G+BuyJ5H1xfhmDR3D8HnHCmT/BSkvSL0vQLy/nkMLY20PQ2OoYMO15Jd0A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.18.tgz", + "integrity": "sha512-FL5oxr2xQsFrc3X9o1fjHKBYBMD1QZNyc1Xzw/h5Qu4XnEBi3dZn96HcHm41c/euGV+GRiXFfh2hUCyKi/e+yw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.18.tgz", + "integrity": "sha512-Fj+RHgu5bDodmV1dM9yAxlfJwkkWvLiRjbhuO2LEtwtlYlBgiAT4x/j5wQr1tC3SANAgD+0YcmWVrj8R9trVMA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.18.tgz", + "integrity": "sha512-Fp+Wzk/Ws4dZn+LV2Nqx3IilnhH51YZoRaYHQsVq3RQvEl+71VGKFpkfHrLM/Li+kt5c0DJe/bHXK1eHgDmdiA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.18.tgz", + "integrity": "sha512-S0n3jboLysNbh55Vrt7pk9wgpyTTPD0fdQeh7wQfMqLPM/Hrxi+dVsLsPrycQjGKEQk85Kgbx+6+QnYNiHalnw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.18.tgz", + "integrity": "sha512-1px92582HkPQlaaCkdRcio71p8bc8i/ap5807tPRDK/uw953cauQBT8c5tVGkOwrHMfc2Yh6UuxaH4vtTjGvHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.18.tgz", + "integrity": "sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.18.tgz", + "integrity": "sha512-bhJ2y2OQNlcRwwgOAGMY0xTFStt4/wyU6pvI6LSuZpRgKQwxTec0/3Scu91O8ir7qCR3AuepQKLU/kX99FouqQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.18.tgz", + "integrity": "sha512-LffYTvPjODiP6PT16oNeUQJzNVyJl1cjIebq/rWWBF+3eDst5JGEFSc5cWxyRCJ0Mxl+KyIkqRxk1XPEs9x8TA==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1", + "@emnapi/wasi-threads": "^1.1.0", + "@napi-rs/wasm-runtime": "^1.1.0", + "@tybys/wasm-util": "^0.10.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.18.tgz", + "integrity": "sha512-HjSA7mr9HmC8fu6bdsZvZ+dhjyGCLdotjVOgLA2vEqxEBZaQo9YTX4kwgEvPCpRh8o4uWc4J/wEoFzhEmjvPbA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.18.tgz", + "integrity": "sha512-bJWbyYpUlqamC8dpR7pfjA0I7vdF6t5VpUGMWRkXVE3AXgIZjYUYAK7II1GNaxR8J1SSrSrppRar8G++JekE3Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/vite": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.1.18.tgz", + "integrity": "sha512-jVA+/UpKL1vRLg6Hkao5jldawNmRo7mQYrZtNHMIVpLfLhDml5nMRUo/8MwoX2vNXvnaXNNMedrMfMugAVX1nA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tailwindcss/node": "4.1.18", + "@tailwindcss/oxide": "4.1.18", + "tailwindcss": "4.1.18" + }, + "peerDependencies": { + "vite": "^5.2.0 || ^6 || ^7" + } + }, + "node_modules/@types/chai": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", + "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/deep-eql": "*", + "assertion-error": "^2.0.1" + } + }, + "node_modules/@types/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/deep-eql": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "24.10.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.4.tgz", + "integrity": "sha512-vnDVpYPMzs4wunl27jHrfmwojOGKya0xyM3sH+UE5iv5uPS6vX7UIoh6m+vQc5LGBq52HBKPIn/zcSZVzeDEZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.52.0.tgz", + "integrity": "sha512-okqtOgqu2qmZJ5iN4TWlgfF171dZmx2FzdOv2K/ixL2LZWDStL8+JgQerI2sa8eAEfoydG9+0V96m7V+P8yE1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.52.0", + "@typescript-eslint/type-utils": "8.52.0", + "@typescript-eslint/utils": "8.52.0", + "@typescript-eslint/visitor-keys": "8.52.0", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.52.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.52.0.tgz", + "integrity": "sha512-iIACsx8pxRnguSYhHiMn2PvhvfpopO9FXHyn1mG5txZIsAaB6F0KwbFnUQN3KCiG3Jcuad/Cao2FAs1Wp7vAyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.52.0", + "@typescript-eslint/types": "8.52.0", + "@typescript-eslint/typescript-estree": "8.52.0", + "@typescript-eslint/visitor-keys": "8.52.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.52.0.tgz", + "integrity": "sha512-xD0MfdSdEmeFa3OmVqonHi+Cciab96ls1UhIF/qX/O/gPu5KXD0bY9lu33jj04fjzrXHcuvjBcBC+D3SNSadaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.52.0", + "@typescript-eslint/types": "^8.52.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.52.0.tgz", + "integrity": "sha512-ixxqmmCcc1Nf8S0mS0TkJ/3LKcC8mruYJPOU6Ia2F/zUUR4pApW7LzrpU3JmtePbRUTes9bEqRc1Gg4iyRnDzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.52.0", + "@typescript-eslint/visitor-keys": "8.52.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.52.0.tgz", + "integrity": "sha512-jl+8fzr/SdzdxWJznq5nvoI7qn2tNYV/ZBAEcaFMVXf+K6jmXvAFrgo/+5rxgnL152f//pDEAYAhhBAZGrVfwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.52.0.tgz", + "integrity": "sha512-JD3wKBRWglYRQkAtsyGz1AewDu3mTc7NtRjR/ceTyGoPqmdS5oCdx/oZMWD5Zuqmo6/MpsYs0wp6axNt88/2EQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.52.0", + "@typescript-eslint/typescript-estree": "8.52.0", + "@typescript-eslint/utils": "8.52.0", + "debug": "^4.4.3", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.52.0.tgz", + "integrity": "sha512-LWQV1V4q9V4cT4H5JCIx3481iIFxH1UkVk+ZkGGAV1ZGcjGI9IoFOfg3O6ywz8QqCDEp7Inlg6kovMofsNRaGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.52.0.tgz", + "integrity": "sha512-XP3LClsCc0FsTK5/frGjolyADTh3QmsLp6nKd476xNI9CsSsLnmn4f0jrzNoAulmxlmNIpeXuHYeEQv61Q6qeQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.52.0", + "@typescript-eslint/tsconfig-utils": "8.52.0", + "@typescript-eslint/types": "8.52.0", + "@typescript-eslint/visitor-keys": "8.52.0", + "debug": "^4.4.3", + "minimatch": "^9.0.5", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.52.0.tgz", + "integrity": "sha512-wYndVMWkweqHpEpwPhwqE2lnD2DxC6WVLupU/DOt/0/v+/+iQbbzO3jOHjmBMnhu0DgLULvOaU4h4pwHYi2oRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.52.0", + "@typescript-eslint/types": "8.52.0", + "@typescript-eslint/typescript-estree": "8.52.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.52.0.tgz", + "integrity": "sha512-ink3/Zofus34nmBsPjow63FP5M7IGff0RKAgqR6+CFpdk22M7aLwC9gOcLGYqr7MczLPzZVERW9hRog3O4n1sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.52.0", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@vitest/browser": { + "version": "4.0.16", + "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-4.0.16.tgz", + "integrity": "sha512-t4toy8X/YTnjYEPoY0pbDBg3EvDPg1elCDrfc+VupPHwoN/5/FNQ8Z+xBYIaEnOE2vVEyKwqYBzZ9h9rJtZVcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/mocker": "4.0.16", + "@vitest/utils": "4.0.16", + "magic-string": "^0.30.21", + "pixelmatch": "7.1.0", + "pngjs": "^7.0.0", + "sirv": "^3.0.2", + "tinyrainbow": "^3.0.3", + "ws": "^8.18.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "vitest": "4.0.16" + } + }, + "node_modules/@vitest/browser-playwright": { + "version": "4.0.16", + "resolved": "https://registry.npmjs.org/@vitest/browser-playwright/-/browser-playwright-4.0.16.tgz", + "integrity": "sha512-I2Fy/ANdphi1yI46d15o0M1M4M0UJrUiVKkH5oKeRZZCdPg0fw/cfTKZzv9Ge9eobtJYp4BGblMzXdXH0vcl5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/browser": "4.0.16", + "@vitest/mocker": "4.0.16", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "playwright": "*", + "vitest": "4.0.16" + }, + "peerDependenciesMeta": { + "playwright": { + "optional": false + } + } + }, + "node_modules/@vitest/expect": { + "version": "4.0.16", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.16.tgz", + "integrity": "sha512-eshqULT2It7McaJkQGLkPjPjNph+uevROGuIMJdG3V+0BSR2w9u6J9Lwu+E8cK5TETlfou8GRijhafIMhXsimA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "@types/chai": "^5.2.2", + "@vitest/spy": "4.0.16", + "@vitest/utils": "4.0.16", + "chai": "^6.2.1", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/mocker": { + "version": "4.0.16", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.16.tgz", + "integrity": "sha512-yb6k4AZxJTB+q9ycAvsoxGn+j/po0UaPgajllBgt1PzoMAAmJGYFdDk0uCcRcxb3BrME34I6u8gHZTQlkqSZpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "4.0.16", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0-0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@vitest/pretty-format": { + "version": "4.0.16", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.16.tgz", + "integrity": "sha512-eNCYNsSty9xJKi/UdVD8Ou16alu7AYiS2fCPRs0b1OdhJiV89buAXQLpTbe+X8V9L6qrs9CqyvU7OaAopJYPsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "4.0.16", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.16.tgz", + "integrity": "sha512-VWEDm5Wv9xEo80ctjORcTQRJ539EGPB3Pb9ApvVRAY1U/WkHXmmYISqU5E79uCwcW7xYUV38gwZD+RV755fu3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "4.0.16", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "4.0.16", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.16.tgz", + "integrity": "sha512-sf6NcrYhYBsSYefxnry+DR8n3UV4xWZwWxYbCJUt2YdvtqzSPR7VfGrY0zsv090DAbjFZsi7ZaMi1KnSRyK1XA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.0.16", + "magic-string": "^0.30.21", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "4.0.16", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.16.tgz", + "integrity": "sha512-4jIOWjKP0ZUaEmJm00E0cOBLU+5WE0BpeNr3XN6TEF05ltro6NJqHWxXD0kA8/Zc8Nh23AT8WQxwNG+WeROupw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "4.0.16", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.16.tgz", + "integrity": "sha512-h8z9yYhV3e1LEfaQ3zdypIrnAg/9hguReGZoS7Gl0aBG5xgA410zBqECqmaF/+RkTggRsfnzc1XaAHA6bmUufA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.0.16", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/bits-ui": { + "version": "2.15.4", + "resolved": "https://registry.npmjs.org/bits-ui/-/bits-ui-2.15.4.tgz", + "integrity": "sha512-7H9YUfp03KOk1LVDh8wPYSRPxlZgG/GRWLNSA8QC73/8Z8ytun+DWJhIuibyFyz7A0cP/RANVcB4iDrbY8q+Og==", + "dev": true, + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.7.1", + "@floating-ui/dom": "^1.7.1", + "esm-env": "^1.1.2", + "runed": "^0.35.1", + "svelte-toolbelt": "^0.10.6", + "tabbable": "^6.2.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/huntabyte" + }, + "peerDependencies": { + "@internationalized/date": "^3.8.1", + "svelte": "^5.33.0" + } + }, + "node_modules/bits-ui/node_modules/runed": { + "version": "0.35.1", + "resolved": "https://registry.npmjs.org/runed/-/runed-0.35.1.tgz", + "integrity": "sha512-2F4Q/FZzbeJTFdIS/PuOoPRSm92sA2LhzTnv6FXhCoENb3huf5+fDuNOg1LNvGOouy3u/225qxmuJvcV3IZK5Q==", + "dev": true, + "funding": [ + "https://github.com/sponsors/huntabyte", + "https://github.com/sponsors/tglide" + ], + "license": "MIT", + "dependencies": { + "dequal": "^2.0.3", + "esm-env": "^1.0.0", + "lz-string": "^1.5.0" + }, + "peerDependencies": { + "@sveltejs/kit": "^2.21.0", + "svelte": "^5.7.0" + }, + "peerDependenciesMeta": { + "@sveltejs/kit": { + "optional": true + } + } + }, + "node_modules/bits-ui/node_modules/svelte-toolbelt": { + "version": "0.10.6", + "resolved": "https://registry.npmjs.org/svelte-toolbelt/-/svelte-toolbelt-0.10.6.tgz", + "integrity": "sha512-YWuX+RE+CnWYx09yseAe4ZVMM7e7GRFZM6OYWpBKOb++s+SQ8RBIMMe+Bs/CznBMc0QPLjr+vDBxTAkozXsFXQ==", + "dev": true, + "funding": [ + "https://github.com/sponsors/huntabyte" + ], + "dependencies": { + "clsx": "^2.1.1", + "runed": "^0.35.1", + "style-to-object": "^1.0.8" + }, + "engines": { + "node": ">=18", + "pnpm": ">=8.7.0" + }, + "peerDependencies": { + "svelte": "^5.30.2" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/chai": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", + "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/devalue": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.6.1.tgz", + "integrity": "sha512-jDwizj+IlEZBunHcOuuFVBnIMPAEHvTsJj0BcIp94xYguLRVBcXO853px/MyIJvbVzWdsGvrRweIUWJw8hBP7A==", + "license": "MIT" + }, + "node_modules/enhanced-resolve": { + "version": "5.18.4", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.4.tgz", + "integrity": "sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/es-module-lexer": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "dev": true, + "license": "MIT" + }, + "node_modules/esbuild": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.2.tgz", + "integrity": "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.2", + "@esbuild/android-arm": "0.27.2", + "@esbuild/android-arm64": "0.27.2", + "@esbuild/android-x64": "0.27.2", + "@esbuild/darwin-arm64": "0.27.2", + "@esbuild/darwin-x64": "0.27.2", + "@esbuild/freebsd-arm64": "0.27.2", + "@esbuild/freebsd-x64": "0.27.2", + "@esbuild/linux-arm": "0.27.2", + "@esbuild/linux-arm64": "0.27.2", + "@esbuild/linux-ia32": "0.27.2", + "@esbuild/linux-loong64": "0.27.2", + "@esbuild/linux-mips64el": "0.27.2", + "@esbuild/linux-ppc64": "0.27.2", + "@esbuild/linux-riscv64": "0.27.2", + "@esbuild/linux-s390x": "0.27.2", + "@esbuild/linux-x64": "0.27.2", + "@esbuild/netbsd-arm64": "0.27.2", + "@esbuild/netbsd-x64": "0.27.2", + "@esbuild/openbsd-arm64": "0.27.2", + "@esbuild/openbsd-x64": "0.27.2", + "@esbuild/openharmony-arm64": "0.27.2", + "@esbuild/sunos-x64": "0.27.2", + "@esbuild/win32-arm64": "0.27.2", + "@esbuild/win32-ia32": "0.27.2", + "@esbuild/win32-x64": "0.27.2" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.39.2", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.2.tgz", + "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.1", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.39.2", + "@eslint/plugin-kit": "^0.4.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-config-prettier": { + "version": "10.1.8", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz", + "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", + "dev": true, + "license": "MIT", + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "funding": { + "url": "https://opencollective.com/eslint-config-prettier" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-svelte": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-svelte/-/eslint-plugin-svelte-3.13.1.tgz", + "integrity": "sha512-Ng+kV/qGS8P/isbNYVE3sJORtubB+yLEcYICMkUWNaDTb0SwZni/JhAYXh/Dz/q2eThUwWY0VMPZ//KYD1n3eQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.6.1", + "@jridgewell/sourcemap-codec": "^1.5.0", + "esutils": "^2.0.3", + "globals": "^16.0.0", + "known-css-properties": "^0.37.0", + "postcss": "^8.4.49", + "postcss-load-config": "^3.1.4", + "postcss-safe-parser": "^7.0.0", + "semver": "^7.6.3", + "svelte-eslint-parser": "^1.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" + }, + "peerDependencies": { + "eslint": "^8.57.1 || ^9.0.0", + "svelte": "^3.37.0 || ^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "svelte": { + "optional": true + } + } + }, + "node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esm-env": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.2.2.tgz", + "integrity": "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==", + "license": "MIT" + }, + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrap": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/esrap/-/esrap-2.2.1.tgz", + "integrity": "sha512-GiYWG34AN/4CUyaWAgunGt0Rxvr1PTMlGC0vvEov/uOQYWne2bpN03Um+k8jT+q3op33mKouP2zeJ6OlM+qeUg==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expect-type": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", + "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatbuffers": { + "version": "25.9.23", + "resolved": "https://registry.npmjs.org/flatbuffers/-/flatbuffers-25.9.23.tgz", + "integrity": "sha512-MI1qs7Lo4Syw0EOzUl0xjs2lsoeqFku44KpngfIduHBYvzm8h2+7K8YMQh1JtVVVrUvhLpNwqVi4DERegUJhPQ==", + "license": "Apache-2.0" + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "16.5.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.5.0.tgz", + "integrity": "sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/highcharts": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/highcharts/-/highcharts-12.4.0.tgz", + "integrity": "sha512-o6UxxfChSUrvrZUbWrAuqL1HO/+exhAUPcZY6nnqLsadZQlnP16d082sg7DnXKZCk1gtfkyfkp6g3qkIZ9miZg==", + "license": "https://www.highcharts.com/license" + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inline-style-parser": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.7.tgz", + "integrity": "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==", + "license": "MIT" + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-reference": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.3.tgz", + "integrity": "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.6" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/jiti": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/known-css-properties": { + "version": "0.37.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.37.0.tgz", + "integrity": "sha512-JCDrsP4Z1Sb9JwG0aJ8Eo2r7k4Ou5MwmThS/6lcIe1ICyb7UBJKGRIUUdqc2ASdE/42lgz6zFUnzAIhtXnBVrQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lightningcss": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.2.tgz", + "integrity": "sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.30.2", + "lightningcss-darwin-arm64": "1.30.2", + "lightningcss-darwin-x64": "1.30.2", + "lightningcss-freebsd-x64": "1.30.2", + "lightningcss-linux-arm-gnueabihf": "1.30.2", + "lightningcss-linux-arm64-gnu": "1.30.2", + "lightningcss-linux-arm64-musl": "1.30.2", + "lightningcss-linux-x64-gnu": "1.30.2", + "lightningcss-linux-x64-musl": "1.30.2", + "lightningcss-win32-arm64-msvc": "1.30.2", + "lightningcss-win32-x64-msvc": "1.30.2" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.30.2.tgz", + "integrity": "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.2.tgz", + "integrity": "sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.2.tgz", + "integrity": "sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.2.tgz", + "integrity": "sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.2.tgz", + "integrity": "sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.2.tgz", + "integrity": "sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.2.tgz", + "integrity": "sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.2.tgz", + "integrity": "sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.2.tgz", + "integrity": "sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.2.tgz", + "integrity": "sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.2.tgz", + "integrity": "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/locate-character": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz", + "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==", + "license": "MIT" + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/lz-string": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", + "dev": true, + "license": "MIT", + "bin": { + "lz-string": "bin/bin.js" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mode-watcher": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mode-watcher/-/mode-watcher-1.1.0.tgz", + "integrity": "sha512-mUT9RRGPDYenk59qJauN1rhsIMKBmWA3xMF+uRwE8MW/tjhaDSCCARqkSuDTq8vr4/2KcAxIGVjACxTjdk5C3g==", + "license": "MIT", + "dependencies": { + "runed": "^0.25.0", + "svelte-toolbelt": "^0.7.1" + }, + "peerDependencies": { + "svelte": "^5.27.0" + } + }, + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/mrmime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/obug": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz", + "integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==", + "dev": true, + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], + "license": "MIT" + }, + "node_modules/openmeteo": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/openmeteo/-/openmeteo-1.2.3.tgz", + "integrity": "sha512-3updmgCMnCAAjAgV3RfhMdIBPi/43RtbjQ4CizHGn52RP9SpgmVCDRpun+Ex75NG3jTF3pZp+d1BPlP9DWMHiQ==", + "license": "MIT", + "dependencies": { + "@openmeteo/sdk": "^1.23.0", + "flatbuffers": "^25.9.23" + }, + "engines": { + "node": ">=12.0" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pixelmatch": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-7.1.0.tgz", + "integrity": "sha512-1wrVzJ2STrpmONHKBy228LM1b84msXDUoAzVEl0R8Mz4Ce6EPr+IVtxm8+yvrqLYMHswREkjYFaMxnyGnaY3Ng==", + "dev": true, + "license": "ISC", + "dependencies": { + "pngjs": "^7.0.0" + }, + "bin": { + "pixelmatch": "bin/pixelmatch" + } + }, + "node_modules/playwright": { + "version": "1.57.0", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.57.0.tgz", + "integrity": "sha512-ilYQj1s8sr2ppEJ2YVadYBN0Mb3mdo9J0wQ+UuDhzYqURwSoW4n1Xs5vs7ORwgDGmyEh33tRMeS8KhdkMoLXQw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright-core": "1.57.0" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/playwright-core": { + "version": "1.57.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.57.0.tgz", + "integrity": "sha512-agTcKlMw/mjBWOnD6kFZttAAGHgi/Nw0CZ2o6JqWSbMlI219lAFLZZCyqByTsvVAJq5XA5H8cA6PrvBRpBWEuQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/pngjs": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-7.0.0.tgz", + "integrity": "sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.19.0" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-load-config": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", + "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", + "dev": true, + "license": "MIT", + "dependencies": { + "lilconfig": "^2.0.5", + "yaml": "^1.10.2" + }, + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-load-config/node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss-safe-parser": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-7.0.1.tgz", + "integrity": "sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss-safe-parser" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-scss": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.9.tgz", + "integrity": "sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss-scss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.4.29" + } + }, + "node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.7.4.tgz", + "integrity": "sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-plugin-svelte": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/prettier-plugin-svelte/-/prettier-plugin-svelte-3.4.1.tgz", + "integrity": "sha512-xL49LCloMoZRvSwa6IEdN2GV6cq2IqpYGstYtMT+5wmml1/dClEoI0MZR78MiVPpu6BdQFfN0/y73yO6+br5Pg==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "prettier": "^3.0.0", + "svelte": "^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0" + } + }, + "node_modules/prettier-plugin-tailwindcss": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.7.2.tgz", + "integrity": "sha512-LkphyK3Fw+q2HdMOoiEHWf93fNtYJwfamoKPl7UwtjFQdei/iIBoX11G6j706FzN3ymX9mPVi97qIY8328vdnA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.19" + }, + "peerDependencies": { + "@ianvs/prettier-plugin-sort-imports": "*", + "@prettier/plugin-hermes": "*", + "@prettier/plugin-oxc": "*", + "@prettier/plugin-pug": "*", + "@shopify/prettier-plugin-liquid": "*", + "@trivago/prettier-plugin-sort-imports": "*", + "@zackad/prettier-plugin-twig": "*", + "prettier": "^3.0", + "prettier-plugin-astro": "*", + "prettier-plugin-css-order": "*", + "prettier-plugin-jsdoc": "*", + "prettier-plugin-marko": "*", + "prettier-plugin-multiline-arrays": "*", + "prettier-plugin-organize-attributes": "*", + "prettier-plugin-organize-imports": "*", + "prettier-plugin-sort-imports": "*", + "prettier-plugin-svelte": "*" + }, + "peerDependenciesMeta": { + "@ianvs/prettier-plugin-sort-imports": { + "optional": true + }, + "@prettier/plugin-hermes": { + "optional": true + }, + "@prettier/plugin-oxc": { + "optional": true + }, + "@prettier/plugin-pug": { + "optional": true + }, + "@shopify/prettier-plugin-liquid": { + "optional": true + }, + "@trivago/prettier-plugin-sort-imports": { + "optional": true + }, + "@zackad/prettier-plugin-twig": { + "optional": true + }, + "prettier-plugin-astro": { + "optional": true + }, + "prettier-plugin-css-order": { + "optional": true + }, + "prettier-plugin-jsdoc": { + "optional": true + }, + "prettier-plugin-marko": { + "optional": true + }, + "prettier-plugin-multiline-arrays": { + "optional": true + }, + "prettier-plugin-organize-attributes": { + "optional": true + }, + "prettier-plugin-organize-imports": { + "optional": true + }, + "prettier-plugin-sort-imports": { + "optional": true + }, + "prettier-plugin-svelte": { + "optional": true + } + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/rollup": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.55.1.tgz", + "integrity": "sha512-wDv/Ht1BNHB4upNbK74s9usvl7hObDnvVzknxqY/E/O3X6rW1U1rV1aENEfJ54eFZDTNo7zv1f5N4edCluH7+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.55.1", + "@rollup/rollup-android-arm64": "4.55.1", + "@rollup/rollup-darwin-arm64": "4.55.1", + "@rollup/rollup-darwin-x64": "4.55.1", + "@rollup/rollup-freebsd-arm64": "4.55.1", + "@rollup/rollup-freebsd-x64": "4.55.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.55.1", + "@rollup/rollup-linux-arm-musleabihf": "4.55.1", + "@rollup/rollup-linux-arm64-gnu": "4.55.1", + "@rollup/rollup-linux-arm64-musl": "4.55.1", + "@rollup/rollup-linux-loong64-gnu": "4.55.1", + "@rollup/rollup-linux-loong64-musl": "4.55.1", + "@rollup/rollup-linux-ppc64-gnu": "4.55.1", + "@rollup/rollup-linux-ppc64-musl": "4.55.1", + "@rollup/rollup-linux-riscv64-gnu": "4.55.1", + "@rollup/rollup-linux-riscv64-musl": "4.55.1", + "@rollup/rollup-linux-s390x-gnu": "4.55.1", + "@rollup/rollup-linux-x64-gnu": "4.55.1", + "@rollup/rollup-linux-x64-musl": "4.55.1", + "@rollup/rollup-openbsd-x64": "4.55.1", + "@rollup/rollup-openharmony-arm64": "4.55.1", + "@rollup/rollup-win32-arm64-msvc": "4.55.1", + "@rollup/rollup-win32-ia32-msvc": "4.55.1", + "@rollup/rollup-win32-x64-gnu": "4.55.1", + "@rollup/rollup-win32-x64-msvc": "4.55.1", + "fsevents": "~2.3.2" + } + }, + "node_modules/runed": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/runed/-/runed-0.25.0.tgz", + "integrity": "sha512-7+ma4AG9FT2sWQEA0Egf6mb7PBT2vHyuHail1ie8ropfSjvZGtEAx8YTmUjv/APCsdRRxEVvArNjALk9zFSOrg==", + "funding": [ + "https://github.com/sponsors/huntabyte", + "https://github.com/sponsors/tglide" + ], + "dependencies": { + "esm-env": "^1.0.0" + }, + "peerDependencies": { + "svelte": "^5.7.0" + } + }, + "node_modules/sade": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", + "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "mri": "^1.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/set-cookie-parser": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz", + "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==", + "dev": true, + "license": "MIT" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true, + "license": "ISC" + }, + "node_modules/sirv": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.2.tgz", + "integrity": "sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/std-env": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", + "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", + "dev": true, + "license": "MIT" + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/style-to-object": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.14.tgz", + "integrity": "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==", + "license": "MIT", + "dependencies": { + "inline-style-parser": "0.2.7" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/svelte": { + "version": "5.46.1", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.46.1.tgz", + "integrity": "sha512-ynjfCHD3nP2el70kN5Pmg37sSi0EjOm9FgHYQdC4giWG/hzO3AatzXXJJgP305uIhGQxSufJLuYWtkY8uK/8RA==", + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.4", + "@jridgewell/sourcemap-codec": "^1.5.0", + "@sveltejs/acorn-typescript": "^1.0.5", + "@types/estree": "^1.0.5", + "acorn": "^8.12.1", + "aria-query": "^5.3.1", + "axobject-query": "^4.1.0", + "clsx": "^2.1.1", + "devalue": "^5.5.0", + "esm-env": "^1.2.1", + "esrap": "^2.2.1", + "is-reference": "^3.0.3", + "locate-character": "^3.0.0", + "magic-string": "^0.30.11", + "zimmerframe": "^1.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/svelte-check": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-4.3.5.tgz", + "integrity": "sha512-e4VWZETyXaKGhpkxOXP+B/d0Fp/zKViZoJmneZWe/05Y2aqSKj3YN2nLfYPJBQ87WEiY4BQCQ9hWGu9mPT1a1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "chokidar": "^4.0.1", + "fdir": "^6.2.0", + "picocolors": "^1.0.0", + "sade": "^1.7.4" + }, + "bin": { + "svelte-check": "bin/svelte-check" + }, + "engines": { + "node": ">= 18.0.0" + }, + "peerDependencies": { + "svelte": "^4.0.0 || ^5.0.0-next.0", + "typescript": ">=5.0.0" + } + }, + "node_modules/svelte-eslint-parser": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/svelte-eslint-parser/-/svelte-eslint-parser-1.4.1.tgz", + "integrity": "sha512-1eqkfQ93goAhjAXxZiu1SaKI9+0/sxp4JIWQwUpsz7ybehRE5L8dNuz7Iry7K22R47p5/+s9EM+38nHV2OlgXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-scope": "^8.2.0", + "eslint-visitor-keys": "^4.0.0", + "espree": "^10.0.0", + "postcss": "^8.4.49", + "postcss-scss": "^4.0.9", + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0", + "pnpm": "10.24.0" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" + }, + "peerDependencies": { + "svelte": "^3.37.0 || ^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "svelte": { + "optional": true + } + } + }, + "node_modules/svelte-persisted-store": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/svelte-persisted-store/-/svelte-persisted-store-0.12.0.tgz", + "integrity": "sha512-BdBQr2SGSJ+rDWH8/aEV5GthBJDapVP0GP3fuUCA7TjYG5ctcB+O9Mj9ZC0+Jo1oJMfZUd1y9H68NFRR5MyIJA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.14" + }, + "peerDependencies": { + "svelte": "^3.48.0 || ^4 || ^5" + } + }, + "node_modules/svelte-toolbelt": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/svelte-toolbelt/-/svelte-toolbelt-0.7.1.tgz", + "integrity": "sha512-HcBOcR17Vx9bjaOceUvxkY3nGmbBmCBBbuWLLEWO6jtmWH8f/QoWmbyUfQZrpDINH39en1b8mptfPQT9VKQ1xQ==", + "funding": [ + "https://github.com/sponsors/huntabyte" + ], + "dependencies": { + "clsx": "^2.1.1", + "runed": "^0.23.2", + "style-to-object": "^1.0.8" + }, + "engines": { + "node": ">=18", + "pnpm": ">=8.7.0" + }, + "peerDependencies": { + "svelte": "^5.0.0" + } + }, + "node_modules/svelte-toolbelt/node_modules/runed": { + "version": "0.23.4", + "resolved": "https://registry.npmjs.org/runed/-/runed-0.23.4.tgz", + "integrity": "sha512-9q8oUiBYeXIDLWNK5DfCWlkL0EW3oGbk845VdKlPeia28l751VpfesaB/+7pI6rnbx1I6rqoZ2fZxptOJLxILA==", + "funding": [ + "https://github.com/sponsors/huntabyte", + "https://github.com/sponsors/tglide" + ], + "dependencies": { + "esm-env": "^1.0.0" + }, + "peerDependencies": { + "svelte": "^5.7.0" + } + }, + "node_modules/tabbable": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.4.0.tgz", + "integrity": "sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tailwind-merge": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.4.0.tgz", + "integrity": "sha512-uSaO4gnW+b3Y2aWoWfFpX62vn2sR3skfhbjsEnaBI81WD1wBLlHZe5sWf0AqjksNdYTbGBEd0UasQMT3SNV15g==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, + "node_modules/tailwind-variants": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/tailwind-variants/-/tailwind-variants-3.2.2.tgz", + "integrity": "sha512-Mi4kHeMTLvKlM98XPnK+7HoBPmf4gygdFmqQPaDivc3DpYS6aIY6KiG/PgThrGvii5YZJqRsPz0aPyhoFzmZgg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16.x", + "pnpm": ">=7.x" + }, + "peerDependencies": { + "tailwind-merge": ">=3.0.0", + "tailwindcss": "*" + }, + "peerDependenciesMeta": { + "tailwind-merge": { + "optional": true + } + } + }, + "node_modules/tailwindcss": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.18.tgz", + "integrity": "sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw==", + "dev": true, + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", + "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyrainbow": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", + "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/totalist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/ts-api-utils": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz", + "integrity": "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, + "node_modules/tw-animate-css": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/tw-animate-css/-/tw-animate-css-1.4.0.tgz", + "integrity": "sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Wombosvideo" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.52.0.tgz", + "integrity": "sha512-atlQQJ2YkO4pfTVQmQ+wvYQwexPDOIgo+RaVcD7gHgzy/IQA+XTyuxNM9M9TVXvttkF7koBHmcwisKdOAf2EcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.52.0", + "@typescript-eslint/parser": "8.52.0", + "@typescript-eslint/typescript-estree": "8.52.0", + "@typescript-eslint/utils": "8.52.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "dev": true, + "license": "MIT" + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/vite": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.1.tgz", + "integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.27.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/vitefu": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.1.1.tgz", + "integrity": "sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ==", + "dev": true, + "license": "MIT", + "workspaces": [ + "tests/deps/*", + "tests/projects/*", + "tests/projects/workspace/packages/*" + ], + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/vitest": { + "version": "4.0.16", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.16.tgz", + "integrity": "sha512-E4t7DJ9pESL6E3I8nFjPa4xGUd3PmiWDLsDztS2qXSJWfHtbQnwAWylaBvSNY48I3vr8PTqIZlyK8TE3V3CA4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "4.0.16", + "@vitest/mocker": "4.0.16", + "@vitest/pretty-format": "4.0.16", + "@vitest/runner": "4.0.16", + "@vitest/snapshot": "4.0.16", + "@vitest/spy": "4.0.16", + "@vitest/utils": "4.0.16", + "es-module-lexer": "^1.7.0", + "expect-type": "^1.2.2", + "magic-string": "^0.30.21", + "obug": "^2.1.1", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "std-env": "^3.10.0", + "tinybench": "^2.9.0", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "tinyrainbow": "^3.0.3", + "vite": "^6.0.0 || ^7.0.0", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@opentelemetry/api": "^1.9.0", + "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "4.0.16", + "@vitest/browser-preview": "4.0.16", + "@vitest/browser-webdriverio": "4.0.16", + "@vitest/ui": "4.0.16", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser-playwright": { + "optional": true + }, + "@vitest/browser-preview": { + "optional": true + }, + "@vitest/browser-webdriverio": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "node_modules/vitest-browser-svelte": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/vitest-browser-svelte/-/vitest-browser-svelte-2.0.1.tgz", + "integrity": "sha512-z7GFio7vxaOolY+xwPUMEKuwL4KcPzB8+bepA9F0Phqag/TJ4j7IAGSwm4Y/FBh7KznsP+7aEIllMay0qDpFXw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "svelte": "^3 || ^4 || ^5 || ^5.0.0-next.0", + "vitest": "^4.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ws": { + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", + "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zimmerframe": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/zimmerframe/-/zimmerframe-1.1.4.tgz", + "integrity": "sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ==", + "license": "MIT" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..cc36e3b --- /dev/null +++ b/package.json @@ -0,0 +1,57 @@ +{ + "name": "open-meteo-weather", + "private": true, + "version": "0.0.1", + "type": "module", + "scripts": { + "dev": "vite dev", + "build": "vite build", + "preview": "vite preview", + "prepare": "svelte-kit sync || echo ''", + "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", + "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", + "format": "prettier --write .", + "lint": "prettier --check . && eslint .", + "test:unit": "vitest", + "test": "npm run test:unit -- --run" + }, + "devDependencies": { + "@eslint/compat": "^1.4.0", + "@eslint/js": "^9.39.1", + "@internationalized/date": "^3.10.1", + "@lucide/svelte": "^0.561.0", + "@sveltejs/adapter-static": "^3.0.10", + "@sveltejs/kit": "^2.49.1", + "@sveltejs/vite-plugin-svelte": "^6.2.1", + "@tailwindcss/vite": "^4.1.17", + "@types/node": "^24", + "@vitest/browser-playwright": "^4.0.15", + "bits-ui": "^2.15.4", + "clsx": "^2.1.1", + "eslint": "^9.39.1", + "eslint-config-prettier": "^10.1.8", + "eslint-plugin-svelte": "^3.13.1", + "globals": "^16.5.0", + "playwright": "^1.57.0", + "prettier": "^3.7.4", + "prettier-plugin-svelte": "^3.4.0", + "prettier-plugin-tailwindcss": "^0.7.2", + "svelte": "^5.45.6", + "svelte-check": "^4.3.4", + "svelte-persisted-store": "^0.12.0", + "tailwind-merge": "^3.4.0", + "tailwind-variants": "^3.2.2", + "tailwindcss": "^4.1.17", + "tw-animate-css": "^1.4.0", + "typescript": "^5.9.3", + "typescript-eslint": "^8.48.1", + "vite": "^7.2.6", + "vitest": "^4.0.15", + "vitest-browser-svelte": "^2.0.1" + }, + "dependencies": { + "highcharts": "^12.4.0", + "mode-watcher": "^1.1.0", + "openmeteo": "^1.2.3" + } +} diff --git a/src/app.d.ts b/src/app.d.ts new file mode 100644 index 0000000..da08e6d --- /dev/null +++ b/src/app.d.ts @@ -0,0 +1,13 @@ +// See https://svelte.dev/docs/kit/types#app.d.ts +// for information about these interfaces +declare global { + namespace App { + // interface Error {} + // interface Locals {} + // interface PageData {} + // interface PageState {} + // interface Platform {} + } +} + +export {}; diff --git a/src/app.html b/src/app.html new file mode 100644 index 0000000..f273cc5 --- /dev/null +++ b/src/app.html @@ -0,0 +1,11 @@ + + + + + + %sveltekit.head% + + +
%sveltekit.body%
+ + diff --git a/src/demo.spec.ts b/src/demo.spec.ts new file mode 100644 index 0000000..e07cbbd --- /dev/null +++ b/src/demo.spec.ts @@ -0,0 +1,7 @@ +import { describe, it, expect } from 'vitest'; + +describe('sum test', () => { + it('adds 1 + 2 to equal 3', () => { + expect(1 + 2).toBe(3); + }); +}); diff --git a/src/lib/assets/favicon.svg b/src/lib/assets/favicon.svg new file mode 100644 index 0000000..cc5dc66 --- /dev/null +++ b/src/lib/assets/favicon.svg @@ -0,0 +1 @@ +svelte-logo \ No newline at end of file diff --git a/src/lib/components/location/location-search.svelte b/src/lib/components/location/location-search.svelte new file mode 100644 index 0000000..fbc1bb3 --- /dev/null +++ b/src/lib/components/location/location-search.svelte @@ -0,0 +1,266 @@ + + + + { + e.preventDefault(); + dialogOpen = !dialogOpen; + }} + class="flex h-12 w-full cursor-pointer items-center justify-center rounded-md border border-border px-5 pr-6 duration-200 hover:bg-accent" + > + + + + {label} + + + + + + Search Locations + +
+
+ + +
+ {#await results} +
+ + Loading... + +
+ {:then results} + {#if results.results && results.results.length === 0} + {#if searchQuery.length < 2} + + Start typing to search for locations + + {:else} + + No locations found + + {/if} + {:else if !results.results} + + No locations found + + {:else} +
+
+ {#each results.results || [] as location, i (i)} + +
+ + {/each} +
+
+ {/if} + {:catch error} + + {error.message} + + {/await} + +
+
+
diff --git a/src/lib/components/ui/alert/alert-description.svelte b/src/lib/components/ui/alert/alert-description.svelte new file mode 100644 index 0000000..ceccee5 --- /dev/null +++ b/src/lib/components/ui/alert/alert-description.svelte @@ -0,0 +1,23 @@ + + +
+ {@render children?.()} +
diff --git a/src/lib/components/ui/alert/alert-title.svelte b/src/lib/components/ui/alert/alert-title.svelte new file mode 100644 index 0000000..8a35d09 --- /dev/null +++ b/src/lib/components/ui/alert/alert-title.svelte @@ -0,0 +1,20 @@ + + +
+ {@render children?.()} +
diff --git a/src/lib/components/ui/alert/alert.svelte b/src/lib/components/ui/alert/alert.svelte new file mode 100644 index 0000000..a7e6d06 --- /dev/null +++ b/src/lib/components/ui/alert/alert.svelte @@ -0,0 +1,44 @@ + + + + + diff --git a/src/lib/components/ui/alert/index.ts b/src/lib/components/ui/alert/index.ts new file mode 100644 index 0000000..5e0f854 --- /dev/null +++ b/src/lib/components/ui/alert/index.ts @@ -0,0 +1,14 @@ +import Root from './alert.svelte'; +import Description from './alert-description.svelte'; +import Title from './alert-title.svelte'; +export { alertVariants, type AlertVariant } from './alert.svelte'; + +export { + Root, + Description, + Title, + // + Root as Alert, + Description as AlertDescription, + Title as AlertTitle +}; diff --git a/src/lib/components/ui/button/button.svelte b/src/lib/components/ui/button/button.svelte new file mode 100644 index 0000000..fad512e --- /dev/null +++ b/src/lib/components/ui/button/button.svelte @@ -0,0 +1,82 @@ + + + + +{#if href} + + {@render children?.()} + +{:else} + +{/if} diff --git a/src/lib/components/ui/button/index.ts b/src/lib/components/ui/button/index.ts new file mode 100644 index 0000000..5414d9d --- /dev/null +++ b/src/lib/components/ui/button/index.ts @@ -0,0 +1,17 @@ +import Root, { + type ButtonProps, + type ButtonSize, + type ButtonVariant, + buttonVariants +} from './button.svelte'; + +export { + Root, + type ButtonProps as Props, + // + Root as Button, + buttonVariants, + type ButtonProps, + type ButtonSize, + type ButtonVariant +}; diff --git a/src/lib/components/ui/checkbox/checkbox.svelte b/src/lib/components/ui/checkbox/checkbox.svelte new file mode 100644 index 0000000..3a7817d --- /dev/null +++ b/src/lib/components/ui/checkbox/checkbox.svelte @@ -0,0 +1,36 @@ + + + + {#snippet children({ checked, indeterminate })} +
+ {#if checked} + + {:else if indeterminate} + + {/if} +
+ {/snippet} +
diff --git a/src/lib/components/ui/checkbox/index.ts b/src/lib/components/ui/checkbox/index.ts new file mode 100644 index 0000000..5c27671 --- /dev/null +++ b/src/lib/components/ui/checkbox/index.ts @@ -0,0 +1,6 @@ +import Root from './checkbox.svelte'; +export { + Root, + // + Root as Checkbox +}; diff --git a/src/lib/components/ui/dialog/dialog-close.svelte b/src/lib/components/ui/dialog/dialog-close.svelte new file mode 100644 index 0000000..e8a96a7 --- /dev/null +++ b/src/lib/components/ui/dialog/dialog-close.svelte @@ -0,0 +1,7 @@ + + + diff --git a/src/lib/components/ui/dialog/dialog-content.svelte b/src/lib/components/ui/dialog/dialog-content.svelte new file mode 100644 index 0000000..4511333 --- /dev/null +++ b/src/lib/components/ui/dialog/dialog-content.svelte @@ -0,0 +1,45 @@ + + + + + + {@render children?.()} + {#if showCloseButton} + + + Close + + {/if} + + diff --git a/src/lib/components/ui/dialog/dialog-description.svelte b/src/lib/components/ui/dialog/dialog-description.svelte new file mode 100644 index 0000000..7539190 --- /dev/null +++ b/src/lib/components/ui/dialog/dialog-description.svelte @@ -0,0 +1,17 @@ + + + diff --git a/src/lib/components/ui/dialog/dialog-footer.svelte b/src/lib/components/ui/dialog/dialog-footer.svelte new file mode 100644 index 0000000..c457d56 --- /dev/null +++ b/src/lib/components/ui/dialog/dialog-footer.svelte @@ -0,0 +1,20 @@ + + +
+ {@render children?.()} +
diff --git a/src/lib/components/ui/dialog/dialog-header.svelte b/src/lib/components/ui/dialog/dialog-header.svelte new file mode 100644 index 0000000..9b2701c --- /dev/null +++ b/src/lib/components/ui/dialog/dialog-header.svelte @@ -0,0 +1,20 @@ + + +
+ {@render children?.()} +
diff --git a/src/lib/components/ui/dialog/dialog-overlay.svelte b/src/lib/components/ui/dialog/dialog-overlay.svelte new file mode 100644 index 0000000..34166e1 --- /dev/null +++ b/src/lib/components/ui/dialog/dialog-overlay.svelte @@ -0,0 +1,20 @@ + + + diff --git a/src/lib/components/ui/dialog/dialog-portal.svelte b/src/lib/components/ui/dialog/dialog-portal.svelte new file mode 100644 index 0000000..a60a85e --- /dev/null +++ b/src/lib/components/ui/dialog/dialog-portal.svelte @@ -0,0 +1,7 @@ + + + diff --git a/src/lib/components/ui/dialog/dialog-title.svelte b/src/lib/components/ui/dialog/dialog-title.svelte new file mode 100644 index 0000000..7073699 --- /dev/null +++ b/src/lib/components/ui/dialog/dialog-title.svelte @@ -0,0 +1,17 @@ + + + diff --git a/src/lib/components/ui/dialog/dialog-trigger.svelte b/src/lib/components/ui/dialog/dialog-trigger.svelte new file mode 100644 index 0000000..ac04d9f --- /dev/null +++ b/src/lib/components/ui/dialog/dialog-trigger.svelte @@ -0,0 +1,7 @@ + + + diff --git a/src/lib/components/ui/dialog/dialog.svelte b/src/lib/components/ui/dialog/dialog.svelte new file mode 100644 index 0000000..c1444b2 --- /dev/null +++ b/src/lib/components/ui/dialog/dialog.svelte @@ -0,0 +1,7 @@ + + + diff --git a/src/lib/components/ui/dialog/index.ts b/src/lib/components/ui/dialog/index.ts new file mode 100644 index 0000000..9143f72 --- /dev/null +++ b/src/lib/components/ui/dialog/index.ts @@ -0,0 +1,34 @@ +import Root from './dialog.svelte'; +import Portal from './dialog-portal.svelte'; +import Title from './dialog-title.svelte'; +import Footer from './dialog-footer.svelte'; +import Header from './dialog-header.svelte'; +import Overlay from './dialog-overlay.svelte'; +import Content from './dialog-content.svelte'; +import Description from './dialog-description.svelte'; +import Trigger from './dialog-trigger.svelte'; +import Close from './dialog-close.svelte'; + +export { + Root, + Title, + Portal, + Footer, + Header, + Trigger, + Overlay, + Content, + Description, + Close, + // + Root as Dialog, + Title as DialogTitle, + Portal as DialogPortal, + Footer as DialogFooter, + Header as DialogHeader, + Trigger as DialogTrigger, + Overlay as DialogOverlay, + Content as DialogContent, + Description as DialogDescription, + Close as DialogClose +}; diff --git a/src/lib/components/ui/input/index.ts b/src/lib/components/ui/input/index.ts new file mode 100644 index 0000000..15c0933 --- /dev/null +++ b/src/lib/components/ui/input/index.ts @@ -0,0 +1,7 @@ +import Root from './input.svelte'; + +export { + Root, + // + Root as Input +}; diff --git a/src/lib/components/ui/input/input.svelte b/src/lib/components/ui/input/input.svelte new file mode 100644 index 0000000..9089134 --- /dev/null +++ b/src/lib/components/ui/input/input.svelte @@ -0,0 +1,52 @@ + + +{#if type === 'file'} + +{:else} + +{/if} diff --git a/src/lib/components/ui/label/index.ts b/src/lib/components/ui/label/index.ts new file mode 100644 index 0000000..808d141 --- /dev/null +++ b/src/lib/components/ui/label/index.ts @@ -0,0 +1,7 @@ +import Root from './label.svelte'; + +export { + Root, + // + Root as Label +}; diff --git a/src/lib/components/ui/label/label.svelte b/src/lib/components/ui/label/label.svelte new file mode 100644 index 0000000..7fef72e --- /dev/null +++ b/src/lib/components/ui/label/label.svelte @@ -0,0 +1,20 @@ + + + diff --git a/src/lib/components/ui/select/index.ts b/src/lib/components/ui/select/index.ts new file mode 100644 index 0000000..305c47a --- /dev/null +++ b/src/lib/components/ui/select/index.ts @@ -0,0 +1,37 @@ +import Root from './select.svelte'; +import Group from './select-group.svelte'; +import Label from './select-label.svelte'; +import Item from './select-item.svelte'; +import Content from './select-content.svelte'; +import Trigger from './select-trigger.svelte'; +import Separator from './select-separator.svelte'; +import ScrollDownButton from './select-scroll-down-button.svelte'; +import ScrollUpButton from './select-scroll-up-button.svelte'; +import GroupHeading from './select-group-heading.svelte'; +import Portal from './select-portal.svelte'; + +export { + Root, + Group, + Label, + Item, + Content, + Trigger, + Separator, + ScrollDownButton, + ScrollUpButton, + GroupHeading, + Portal, + // + Root as Select, + Group as SelectGroup, + Label as SelectLabel, + Item as SelectItem, + Content as SelectContent, + Trigger as SelectTrigger, + Separator as SelectSeparator, + ScrollDownButton as SelectScrollDownButton, + ScrollUpButton as SelectScrollUpButton, + GroupHeading as SelectGroupHeading, + Portal as SelectPortal +}; diff --git a/src/lib/components/ui/select/select-content.svelte b/src/lib/components/ui/select/select-content.svelte new file mode 100644 index 0000000..7c0bd44 --- /dev/null +++ b/src/lib/components/ui/select/select-content.svelte @@ -0,0 +1,45 @@ + + + + + + + {@render children?.()} + + + + diff --git a/src/lib/components/ui/select/select-group-heading.svelte b/src/lib/components/ui/select/select-group-heading.svelte new file mode 100644 index 0000000..3dc0282 --- /dev/null +++ b/src/lib/components/ui/select/select-group-heading.svelte @@ -0,0 +1,21 @@ + + + + {@render children?.()} + diff --git a/src/lib/components/ui/select/select-group.svelte b/src/lib/components/ui/select/select-group.svelte new file mode 100644 index 0000000..ed67413 --- /dev/null +++ b/src/lib/components/ui/select/select-group.svelte @@ -0,0 +1,7 @@ + + + diff --git a/src/lib/components/ui/select/select-item.svelte b/src/lib/components/ui/select/select-item.svelte new file mode 100644 index 0000000..e5b3124 --- /dev/null +++ b/src/lib/components/ui/select/select-item.svelte @@ -0,0 +1,38 @@ + + + + {#snippet children({ selected, highlighted })} + + {#if selected} + + {/if} + + {#if childrenProp} + {@render childrenProp({ selected, highlighted })} + {:else} + {label || value} + {/if} + {/snippet} + diff --git a/src/lib/components/ui/select/select-label.svelte b/src/lib/components/ui/select/select-label.svelte new file mode 100644 index 0000000..8849c2a --- /dev/null +++ b/src/lib/components/ui/select/select-label.svelte @@ -0,0 +1,20 @@ + + +
+ {@render children?.()} +
diff --git a/src/lib/components/ui/select/select-portal.svelte b/src/lib/components/ui/select/select-portal.svelte new file mode 100644 index 0000000..59c4b78 --- /dev/null +++ b/src/lib/components/ui/select/select-portal.svelte @@ -0,0 +1,7 @@ + + + diff --git a/src/lib/components/ui/select/select-scroll-down-button.svelte b/src/lib/components/ui/select/select-scroll-down-button.svelte new file mode 100644 index 0000000..3502148 --- /dev/null +++ b/src/lib/components/ui/select/select-scroll-down-button.svelte @@ -0,0 +1,20 @@ + + + + + diff --git a/src/lib/components/ui/select/select-scroll-up-button.svelte b/src/lib/components/ui/select/select-scroll-up-button.svelte new file mode 100644 index 0000000..3d35e04 --- /dev/null +++ b/src/lib/components/ui/select/select-scroll-up-button.svelte @@ -0,0 +1,20 @@ + + + + + diff --git a/src/lib/components/ui/select/select-separator.svelte b/src/lib/components/ui/select/select-separator.svelte new file mode 100644 index 0000000..bfd1eb7 --- /dev/null +++ b/src/lib/components/ui/select/select-separator.svelte @@ -0,0 +1,18 @@ + + + diff --git a/src/lib/components/ui/select/select-trigger.svelte b/src/lib/components/ui/select/select-trigger.svelte new file mode 100644 index 0000000..f7ac421 --- /dev/null +++ b/src/lib/components/ui/select/select-trigger.svelte @@ -0,0 +1,29 @@ + + + + {@render children?.()} + + diff --git a/src/lib/components/ui/select/select.svelte b/src/lib/components/ui/select/select.svelte new file mode 100644 index 0000000..b9bf9ba --- /dev/null +++ b/src/lib/components/ui/select/select.svelte @@ -0,0 +1,11 @@ + + + diff --git a/src/lib/components/ui/separator/index.ts b/src/lib/components/ui/separator/index.ts new file mode 100644 index 0000000..768efac --- /dev/null +++ b/src/lib/components/ui/separator/index.ts @@ -0,0 +1,7 @@ +import Root from './separator.svelte'; + +export { + Root, + // + Root as Separator +}; diff --git a/src/lib/components/ui/separator/separator.svelte b/src/lib/components/ui/separator/separator.svelte new file mode 100644 index 0000000..3828612 --- /dev/null +++ b/src/lib/components/ui/separator/separator.svelte @@ -0,0 +1,21 @@ + + + diff --git a/src/lib/components/ui/switch/index.ts b/src/lib/components/ui/switch/index.ts new file mode 100644 index 0000000..129f8f5 --- /dev/null +++ b/src/lib/components/ui/switch/index.ts @@ -0,0 +1,7 @@ +import Root from './switch.svelte'; + +export { + Root, + // + Root as Switch +}; diff --git a/src/lib/components/ui/switch/switch.svelte b/src/lib/components/ui/switch/switch.svelte new file mode 100644 index 0000000..9762142 --- /dev/null +++ b/src/lib/components/ui/switch/switch.svelte @@ -0,0 +1,29 @@ + + + + + diff --git a/src/lib/index.ts b/src/lib/index.ts new file mode 100644 index 0000000..856f2b6 --- /dev/null +++ b/src/lib/index.ts @@ -0,0 +1 @@ +// place files you want to import through the `$lib` alias in this folder. diff --git a/src/lib/stores/settings.ts b/src/lib/stores/settings.ts new file mode 100644 index 0000000..bb3417b --- /dev/null +++ b/src/lib/stores/settings.ts @@ -0,0 +1,45 @@ +import { persisted } from 'svelte-persisted-store'; + +export interface GeoLocation { + id: number; + name: string; + latitude: number; + longitude: number; + elevation: number; + feature_code: string; + country_code: string | undefined; + admin1_id: number | undefined; + admin3_id?: number | undefined; + admin4_id?: number | undefined; + timezone: string; + population: number | undefined; + postcodes: string[] | undefined; + country_id: number | undefined; + country: string | undefined; + admin1: string | undefined; + admin3?: string | undefined; + admin4?: string | undefined; +} + +export const defaultLocation: GeoLocation = { + id: 2950159, + name: 'Berlin', + latitude: 52.52437, + longitude: 13.41053, + elevation: 74, + feature_code: 'PPLC', + country_code: 'DE', + admin1_id: 2950157, + admin3_id: 6547383, + admin4_id: 6547539, + timezone: 'Europe/Berlin', + population: 3426354, + postcodes: ['10967', '13347'], + country_id: 2921044, + country: 'Germany', + admin1: 'Land Berlin', + admin3: 'Berlin, Stadt', + admin4: 'Berlin' +}; + +export const storedLocation = persisted('stored_location', defaultLocation as GeoLocation); diff --git a/src/lib/stores/url-hash-store.ts b/src/lib/stores/url-hash-store.ts new file mode 100644 index 0000000..274b75c --- /dev/null +++ b/src/lib/stores/url-hash-store.ts @@ -0,0 +1,23 @@ +import { writable } from 'svelte/store'; + +// Placeholder function for urlHashStore +// In a real application, this would handle URL hash parameters +// and return a Svelte store that reflects those parameters. +export function urlHashStore(initialValue: Record) { + const { subscribe, set, update } = writable(initialValue); + + // In a full implementation, you would add logic here to: + // 1. Read the URL hash on initialization + // 2. Parse the hash into an object + // 3. Update the store with these values + // 4. Listen for changes to the store and update the URL hash accordingly + // 5. Listen for URL hash changes (e.g., back/forward buttons) and update the store + + return { + subscribe, + set, + update, + // You might want to add methods to easily update specific hash parameters + updateParam: (key: string, value: any) => update((current) => ({ ...current, [key]: value })) + }; +} diff --git a/src/lib/utils.ts b/src/lib/utils.ts new file mode 100644 index 0000000..1ddc330 --- /dev/null +++ b/src/lib/utils.ts @@ -0,0 +1,20 @@ +import { clsx, type ClassValue } from 'clsx'; +import { twMerge } from 'tailwind-merge'; + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)); +} + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export type WithoutChild = T extends { child?: any } ? Omit : T; +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export type WithoutChildren = T extends { children?: any } ? Omit : T; +export type WithoutChildrenOrChild = WithoutChildren>; +export type WithElementRef = T & { ref?: U | null }; + +export const pad = (n: string | number) => { + if (n === null || n === undefined) { + return ''; + } + return ('0' + n).slice(-2); +}; diff --git a/src/lib/utils/meteo.ts b/src/lib/utils/meteo.ts new file mode 100644 index 0000000..cb08070 --- /dev/null +++ b/src/lib/utils/meteo.ts @@ -0,0 +1,7 @@ +export function geoLocationNameToRoute(name: string): string { + // Placeholder implementation + return name + .toLowerCase() + .replace(/[^a-z0-9]+/g, '-') + .replace(/^-*|-*$/g, ''); +} diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte new file mode 100644 index 0000000..0d8eb03 --- /dev/null +++ b/src/routes/+layout.svelte @@ -0,0 +1,9 @@ + + + +{@render children()} diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte new file mode 100644 index 0000000..8230d87 --- /dev/null +++ b/src/routes/+page.svelte @@ -0,0 +1,8 @@ + + +

Open-Meteo Weather

+

+ Weather Forecast +

diff --git a/src/routes/layout.css b/src/routes/layout.css new file mode 100644 index 0000000..b37c9b3 --- /dev/null +++ b/src/routes/layout.css @@ -0,0 +1,121 @@ +@import 'tailwindcss'; + +@import 'tw-animate-css'; + +@custom-variant dark (&:is(.dark *)); + +:root { + --radius: 0.625rem; + --background: oklch(1 0 0); + --foreground: oklch(0.129 0.042 264.695); + --card: oklch(1 0 0); + --card-foreground: oklch(0.129 0.042 264.695); + --popover: oklch(1 0 0); + --popover-foreground: oklch(0.129 0.042 264.695); + --primary: oklch(0.208 0.042 265.755); + --primary-foreground: oklch(0.984 0.003 247.858); + --secondary: oklch(0.968 0.007 247.896); + --secondary-foreground: oklch(0.208 0.042 265.755); + --muted: oklch(0.968 0.007 247.896); + --muted-foreground: oklch(0.554 0.046 257.417); + --accent: oklch(0.968 0.007 247.896); + --accent-foreground: oklch(0.208 0.042 265.755); + --destructive: oklch(0.577 0.245 27.325); + --border: oklch(0.929 0.013 255.508); + --input: oklch(0.929 0.013 255.508); + --ring: oklch(0.704 0.04 256.788); + --chart-1: oklch(0.646 0.222 41.116); + --chart-2: oklch(0.6 0.118 184.704); + --chart-3: oklch(0.398 0.07 227.392); + --chart-4: oklch(0.828 0.189 84.429); + --chart-5: oklch(0.769 0.188 70.08); + --sidebar: oklch(0.984 0.003 247.858); + --sidebar-foreground: oklch(0.129 0.042 264.695); + --sidebar-primary: oklch(0.208 0.042 265.755); + --sidebar-primary-foreground: oklch(0.984 0.003 247.858); + --sidebar-accent: oklch(0.968 0.007 247.896); + --sidebar-accent-foreground: oklch(0.208 0.042 265.755); + --sidebar-border: oklch(0.929 0.013 255.508); + --sidebar-ring: oklch(0.704 0.04 256.788); +} + +.dark { + --background: oklch(0.129 0.042 264.695); + --foreground: oklch(0.984 0.003 247.858); + --card: oklch(0.208 0.042 265.755); + --card-foreground: oklch(0.984 0.003 247.858); + --popover: oklch(0.208 0.042 265.755); + --popover-foreground: oklch(0.984 0.003 247.858); + --primary: oklch(0.929 0.013 255.508); + --primary-foreground: oklch(0.208 0.042 265.755); + --secondary: oklch(0.279 0.041 260.031); + --secondary-foreground: oklch(0.984 0.003 247.858); + --muted: oklch(0.279 0.041 260.031); + --muted-foreground: oklch(0.704 0.04 256.788); + --accent: oklch(0.279 0.041 260.031); + --accent-foreground: oklch(0.984 0.003 247.858); + --destructive: oklch(0.704 0.191 22.216); + --border: oklch(1 0 0 / 10%); + --input: oklch(1 0 0 / 15%); + --ring: oklch(0.551 0.027 264.364); + --chart-1: oklch(0.488 0.243 264.376); + --chart-2: oklch(0.696 0.17 162.48); + --chart-3: oklch(0.769 0.188 70.08); + --chart-4: oklch(0.627 0.265 303.9); + --chart-5: oklch(0.645 0.246 16.439); + --sidebar: oklch(0.208 0.042 265.755); + --sidebar-foreground: oklch(0.984 0.003 247.858); + --sidebar-primary: oklch(0.488 0.243 264.376); + --sidebar-primary-foreground: oklch(0.984 0.003 247.858); + --sidebar-accent: oklch(0.279 0.041 260.031); + --sidebar-accent-foreground: oklch(0.984 0.003 247.858); + --sidebar-border: oklch(1 0 0 / 10%); + --sidebar-ring: oklch(0.551 0.027 264.364); +} + +@theme inline { + --radius-sm: calc(var(--radius) - 4px); + --radius-md: calc(var(--radius) - 2px); + --radius-lg: var(--radius); + --radius-xl: calc(var(--radius) + 4px); + --color-background: var(--background); + --color-foreground: var(--foreground); + --color-card: var(--card); + --color-card-foreground: var(--card-foreground); + --color-popover: var(--popover); + --color-popover-foreground: var(--popover-foreground); + --color-primary: var(--primary); + --color-primary-foreground: var(--primary-foreground); + --color-secondary: var(--secondary); + --color-secondary-foreground: var(--secondary-foreground); + --color-muted: var(--muted); + --color-muted-foreground: var(--muted-foreground); + --color-accent: var(--accent); + --color-accent-foreground: var(--accent-foreground); + --color-destructive: var(--destructive); + --color-border: var(--border); + --color-input: var(--input); + --color-ring: var(--ring); + --color-chart-1: var(--chart-1); + --color-chart-2: var(--chart-2); + --color-chart-3: var(--chart-3); + --color-chart-4: var(--chart-4); + --color-chart-5: var(--chart-5); + --color-sidebar: var(--sidebar); + --color-sidebar-foreground: var(--sidebar-foreground); + --color-sidebar-primary: var(--sidebar-primary); + --color-sidebar-primary-foreground: var(--sidebar-primary-foreground); + --color-sidebar-accent: var(--sidebar-accent); + --color-sidebar-accent-foreground: var(--sidebar-accent-foreground); + --color-sidebar-border: var(--sidebar-border); + --color-sidebar-ring: var(--sidebar-ring); +} + +@layer base { + * { + @apply border-border outline-ring/50; + } + body { + @apply bg-background text-foreground; + } +} diff --git a/src/routes/page.svelte.spec.ts b/src/routes/page.svelte.spec.ts new file mode 100644 index 0000000..d54f00a --- /dev/null +++ b/src/routes/page.svelte.spec.ts @@ -0,0 +1,13 @@ +import { page } from 'vitest/browser'; +import { describe, expect, it } from 'vitest'; +import { render } from 'vitest-browser-svelte'; +import Page from './+page.svelte'; + +describe('/+page.svelte', () => { + it('should render h1', async () => { + render(Page); + + const heading = page.getByRole('heading', { level: 1 }); + await expect.element(heading).toBeInTheDocument(); + }); +}); diff --git a/src/routes/weather/+layout.svelte b/src/routes/weather/+layout.svelte new file mode 100644 index 0000000..f54836f --- /dev/null +++ b/src/routes/weather/+layout.svelte @@ -0,0 +1,97 @@ + + +
+ +
+ {@render children?.()} +
+
diff --git a/src/routes/weather/+layout.ts b/src/routes/weather/+layout.ts new file mode 100644 index 0000000..36592ae --- /dev/null +++ b/src/routes/weather/+layout.ts @@ -0,0 +1,20 @@ +import { get } from 'svelte/store'; + +import { storedLocation } from '$lib/stores/settings'; + +import type { LayoutLoad } from './$types'; + +const location = get(storedLocation); + +export const load: LayoutLoad = async () => { + return { + heroTitle: `Weather ${location.name}`, + heroDescription: location.admin1 ?? '' + ' ' + location.country, + heroImage: '/images/backgrounds/partly_cloudy.webp', + heroHeight: 400, + heroPrimaryButtonPath: null, + heroPrimaryButtonText: null, + heroSecondaryButtonPath: null, + heroSecondaryButtonText: null + }; +}; diff --git a/src/routes/weather/+page.svelte b/src/routes/weather/+page.svelte new file mode 100644 index 0000000..6322b8c --- /dev/null +++ b/src/routes/weather/+page.svelte @@ -0,0 +1,703 @@ + + + + Weather | Open-Meteo.com + + + + +
+
+
+ {#await weatherDaily then wd} + {#each wd.daily.time as time, index (index)} + {@const selected = time.getDate() === selectedDay.getDate()} + {#if !isNaN(wd.daily.temperature_2m_max.values(index).toFixed(1))} + + {/if} + {/each} + {:catch error} +

{error.message}

+ {/await} +
+
+

+ {selectedDay.toLocaleDateString('en-GB', { weekday: 'long' })} + + {selectedDay.getDate() === new Date(today.getTime() - 24 * 60 * 60 * 1000).getDate() + ? ' (Yesterday)' + : ''} + {selectedDay.getDate() === today.getDate() ? ' (Today)' : ''} + {selectedDay.getDate() === new Date(today.getTime() + 24 * 60 * 60 * 1000).getDate() + ? ' (Tomorrow)' + : ''} + +

+
+
+ + + + + {#await weather then weather} + + + {#each weather.indexes as index, j (j)} + + {/each} + + + + + {#each weather.indexes as index, j (j)} + {@const now = + weather.hourlyTime[index].getDate() === today.getDate() && + weather.hourlyTime[index].getHours() === today.getHours()} + + {/each} + + + + + + {#each weather.indexes as index, j (j)} + {@const temp = weather.entries[0].values[index]} + + {#if !isNaN(temp)} + + {/if} + {/each} + + {#each weather.entries as entry, i (i)} + + + + {#each weather.indexes as index, j (j)} + {#if !isNaN(entry.values[index])} + + {/if} + {/each} + + {/each} + {#if winddir} + + + + {#each weather.indexes as index, j (j)} + {#if !isNaN(weather.windDirections[index])} + + {/if} + {/each} + + {/if} + {/await} + +
Weather Week {location.name}
Time{weather.hourlyTime[index].getHours() < 10 ? '0' : ''}{weather.hourlyTime[ + index + ].getHours()}
Icons + +
Temp graph{temp.toFixed(0)}
{entry.title}{entry.name === 'precipitation' || entry.name === 'temperature_2m' + ? entry.values[index].toFixed(1) + : entry.values[index]}
Wind Dir. + +
+
+
+ {#await weatherDaily then wd} + {@const sunrise = new Date(Number(wd.daily.sunrise.valuesInt64(selectedDayIndex)) * 1000)} + {@const sunset = new Date(Number(wd.daily.sunset.valuesInt64(selectedDayIndex)) * 1000)} +
+
+ + + Sunrise: {pad(sunrise.getHours())}:{pad(sunrise.getMinutes())} +
+
+ + + + Sunset: {pad(sunset.getHours())}:{pad(sunset.getMinutes())} +
+
+ {/await} +
+
+
+ + {modelSelected?.label} + + {#each models as mo} + {mo.label} + {/each} + + + +
+
+ storedLocation.set(event.detail)} + label="Search Location" + /> +
+
+
+ +
+

Color scale example

+
+ {#if $params.temperature_unit == 'celsius'} + {#each [...Array(101).keys()].map((i) => -40 + i) as temp} +
= ($params.temperature_unit === 'celsius' ? 30 : 104) ? 'white' : 'black'}`} + > + {temp} °C
+ {getColor(temp, $params.temperature_unit)} +
+ {/each} + {:else} + {#each [...Array(91).keys()].map((i) => -40 + i * 2) as temp} +
= ($params.temperature_unit === 'celsius' ? 30 : 104) ? 'white' : 'black'}`} + > + {temp} + {$params.temperature_unit === 'celsius' ? '°C' : '°F'}
+ {getColor(temp, $params.temperature_unit)} +
+ {/each} + {/if} +
+
+
+ + diff --git a/src/routes/weather/14-day/+layout.ts b/src/routes/weather/14-day/+layout.ts new file mode 100644 index 0000000..55c9dc1 --- /dev/null +++ b/src/routes/weather/14-day/+layout.ts @@ -0,0 +1,14 @@ +import { get } from 'svelte/store'; + +import { storedLocation } from '$lib/stores/settings'; + +import type { LayoutLoad } from './$types'; + +const location = get(storedLocation); + +export const load: LayoutLoad = async () => { + return { + heroTitle: `14 Day Weather ${location.name}`, + heroDescription: location.admin1 ?? '' + ' ' + location.country + }; +}; diff --git a/src/routes/weather/14-day/+page.svelte b/src/routes/weather/14-day/+page.svelte new file mode 100644 index 0000000..22bfe61 --- /dev/null +++ b/src/routes/weather/14-day/+page.svelte @@ -0,0 +1,331 @@ + + + +
+
+
+ + + + +
+
+ +
+
+
+ { + storedLocation.set(event.detail); + window.location.reload(); + }} + label="Search Location" + /> +
+
+ { + $params.hourly = $params.hourly; + }} + /> + +
+
+ { + $params.hourly = $params.hourly; + }} + /> + +
+
+
diff --git a/src/routes/weather/14-day/options.ts b/src/routes/weather/14-day/options.ts new file mode 100644 index 0000000..8727075 --- /dev/null +++ b/src/routes/weather/14-day/options.ts @@ -0,0 +1,33 @@ +export const defaultParameters = { + daily: [], + hourly: [], + models: [], + current: [], + minutely_15: [], + + timezone: 'UTC', + location_mode: 'location_search', + csv_coordinates: undefined, + + time_mode: 'forecast_days', + past_days: '0', + forecast_days: '14', + + end_date: undefined, + start_date: undefined, + + past_hours: undefined, + cell_selection: undefined, + forecast_hours: undefined, + past_minutely_15: undefined, + temporal_resolution: undefined, + forecast_minutely_15: undefined, + + tilt: '0', + azimuth: '0', + + timeformat: 'iso8601', + wind_speed_unit: 'kmh', + temperature_unit: 'celsius', + precipitation_unit: 'mm' +}; diff --git a/src/routes/weather/canvas/cloud-cover.ts b/src/routes/weather/canvas/cloud-cover.ts new file mode 100644 index 0000000..7424a83 --- /dev/null +++ b/src/routes/weather/canvas/cloud-cover.ts @@ -0,0 +1,78 @@ +export default ( + ctx: CanvasRenderingContext2D | null | undefined, + config: ConfigInterface, + series: Float32Array | null | undefined, + canvasElement: HTMLCanvasElement | null +): void => { + if (ctx && series) { + ctx.beginPath(); + ctx.moveTo(0, 35 + (series[0] ** 1.5 / 1000) * 30); + for (const [index, value] of series.entries()) { + ctx.strokeStyle = '#444'; + ctx.lineWidth = 0.1; + const nextValue = series[index + 1]; + + const xc = + (index * config.deltaX + + 0.5 * config.deltaX + + (index * config.deltaX + 1.5 * config.deltaX)) / + 2; + const yc = (35 + (value ** 1.5 / 1000) * 30 + 35 + (nextValue ** 1.5 / 1000) * 30) / 2; + + ctx.quadraticCurveTo( + index * config.deltaX + 0.5 * config.deltaX, + 35 + (value ** 1.5 / 1000) * 30, + xc, + yc + ); + } + + ctx.quadraticCurveTo( + config.maxX, + 35 + (series[series.length - 1] ** 1.5 / 1000) * 30, + config.maxX, + 35 + (series[series.length - 1] ** 1.5 / 1000) * 30 + ); + ctx.quadraticCurveTo( + config.maxX, + 35 - (series[series.length - 1] ** 1.5 / 1000) * 30, + config.maxX, + 35 - (series[series.length - 1] ** 1.5 / 1000) * 30 + ); + + // same series but reversed + for (const [ind, v] of series.entries()) { + const index = series.length - 1 - ind; + const value = series[index]; + const nextValue = series[index - 1]; + + ctx.strokeStyle = '#444'; + ctx.lineWidth = 0.1; + + const xc = + (index * config.deltaX + + 0.5 * config.deltaX + + (index * config.deltaX - 0.5 * config.deltaX)) / + 2; + const yc = (35 - (value ** 2 / 10000) * 30 + (35 - (nextValue ** 2 / 10000) * 30)) / 2; + + ctx.quadraticCurveTo( + index * config.deltaX + 0.5 * config.deltaX, + 35 - (value ** 2 / 10000) * 30, + xc, + yc + ); + } + ctx.quadraticCurveTo( + 0.5 * config.deltaX, + 35 - (series[0] ** 1.5 / 1000) * 30, + 0, + 35 - (series[0] ** 1.5 / 1000) * 30 + ); + + ctx.closePath(); + //to fill the space in the shape + ctx.fillStyle = `hsla(${getComputedStyle(canvasElement).getPropertyValue('--muted-foreground').split(' ').join(',')}, 0.5)`; + ctx.fill(); + } +}; diff --git a/src/routes/weather/canvas/daylight.ts b/src/routes/weather/canvas/daylight.ts new file mode 100644 index 0000000..fa9cf63 --- /dev/null +++ b/src/routes/weather/canvas/daylight.ts @@ -0,0 +1,20 @@ +export default ( + ctx: CanvasRenderingContext2D | null | undefined, + config: ConfigInterface, + series: Date[] +): void => { + if (ctx) { + for (const [index, value] of series.entries()) { + if (value.getHours() > 6 && value.getHours() < 21) { + ctx.beginPath(); + ctx.moveTo(index * config.deltaX, config.maxY); + ctx.lineTo(index * config.deltaX, 0); + ctx.lineTo((index + 1) * config.deltaX, 0); + ctx.lineTo((index + 1) * config.deltaX, config.maxY); + ctx.closePath(); + ctx.fillStyle = '#f4ff0014'; + ctx.fill(); + } + } + } +}; diff --git a/src/routes/weather/canvas/precip.ts b/src/routes/weather/canvas/precip.ts new file mode 100644 index 0000000..11a4765 --- /dev/null +++ b/src/routes/weather/canvas/precip.ts @@ -0,0 +1,20 @@ +export default ( + ctx: CanvasRenderingContext2D | null | undefined, + config: ConfigInterface, + series: Float32Array | null | undefined, + canvasElement: HTMLCanvasElement | null +): void => { + if (ctx && series) { + for (const [index, value] of series.entries()) { + ctx.beginPath(); + ctx.moveTo(index * config.deltaX + 0.5 * config.deltaX, config.maxY); + + ctx.strokeStyle = `hsla(${getComputedStyle(canvasElement).getPropertyValue('--primary').split(' ').join(',')}, 1)`; + ctx.lineWidth = 12; + + ctx.lineTo(index * config.deltaX + 0.5 * config.deltaX, config.maxY - value ** 0.55 * 45); + ctx.stroke(); + ctx.closePath(); + } + } +}; diff --git a/src/routes/weather/canvas/raster.ts b/src/routes/weather/canvas/raster.ts new file mode 100644 index 0000000..c780bd8 --- /dev/null +++ b/src/routes/weather/canvas/raster.ts @@ -0,0 +1,42 @@ +export default ( + ctx: CanvasRenderingContext2D | null | undefined, + config: ConfigInterface, + series: Date[], + today: Date, + canvasElement: HTMLCanvasElement | null +): void => { + if (ctx && series) { + for (const [index, _] of series.entries()) { + ctx.beginPath(); + ctx.moveTo(index * config.deltaX, 0); + ctx.lineTo(index * config.deltaX, config.maxY); + if (series[index].getHours() === 0) { + ctx.strokeStyle = `hsla(${getComputedStyle(canvasElement).getPropertyValue('--border').split(' ').join(',')}, 1)`; + ctx.lineWidth = 3; + } else if ( + series[index].getDate() === today.getDate() && + series[index].getHours() === today.getHours() + ) { + // fill now line + // TODO: update this line every minute + ctx.stroke(); + ctx.closePath(); + ctx.beginPath(); + ctx.strokeStyle = 'red'; + ctx.lineWidth = 5; + let minutes = today.getMinutes(); + ctx.moveTo(index * config.deltaX + (config.deltaX / 60) * minutes, 0); + ctx.lineTo(index * config.deltaX + (config.deltaX / 60) * minutes, config.maxY); + ctx.stroke(); + ctx.closePath(); + ctx.strokeStyle = `hsla(${getComputedStyle(canvasElement).getPropertyValue('--border').split(' ').join(',')}, 0.75)`; + ctx.lineWidth = 1; + } else { + ctx.strokeStyle = `hsla(${getComputedStyle(canvasElement).getPropertyValue('--border').split(' ').join(',')}, 0.75)`; + ctx.lineWidth = 1; + } + ctx.stroke(); + ctx.closePath(); + } + } +}; diff --git a/src/routes/weather/canvas/temp-gradient.ts b/src/routes/weather/canvas/temp-gradient.ts new file mode 100644 index 0000000..4664c0b --- /dev/null +++ b/src/routes/weather/canvas/temp-gradient.ts @@ -0,0 +1,60 @@ +import { getColor } from '../utils/colors'; + +export default ( + ctx: CanvasRenderingContext2D | null | undefined, + config: ConfigInterface, + series: Float32Array | null | undefined, + unit = 'celsius' +): void => { + if (ctx && series) { + const tempGradientFill = ctx.createLinearGradient(0, 0, 0, config.maxY); + tempGradientFill.addColorStop(0, getColor(config.maxTemp.toFixed(0), unit) + '5c'); + tempGradientFill.addColorStop(0.25, getColor(config.maxTemp.toFixed(0), unit) + '5c'); + tempGradientFill.addColorStop(0.85, getColor(config.minTemp.toFixed(0), unit) + '06'); + tempGradientFill.addColorStop(1, getColor(config.minTemp.toFixed(0), unit) + '00'); + + ctx.beginPath(); + ctx.moveTo( + 0, + 0.25 * config.maxY + ((config.maxTemp - series[0]) / config.diffTemp) * 0.55 * config.maxY + ); + for (const [index, value] of series?.filter((t) => !isNaN(t)).entries()) { + const indexDiffTemp = config.maxTemp - value; + const indexDiffTempNext = config.maxTemp - series[index + 1]; + + ctx.strokeStyle = '#d3d3d3'; + ctx.lineWidth = 4; + + const xc = + (index * config.deltaX + + 0.5 * config.deltaX + + (index * config.deltaX + 1.5 * config.deltaX)) / + 2; + const yc = + (0.25 * config.maxY + + (indexDiffTemp / config.diffTemp) * 0.55 * config.maxY + + (0.25 * config.maxY + (indexDiffTempNext / config.diffTemp) * 0.55 * config.maxY)) / + 2; + + ctx.quadraticCurveTo( + index * config.deltaX + 0.5 * config.deltaX, + 0.25 * config.maxY + (indexDiffTemp / config.diffTemp) * 0.55 * config.maxY, + xc, + yc + ); + } + ctx.quadraticCurveTo( + config.maxX, + 0.25 * config.maxY + + ((config.maxTemp - series[series.length - 1]) / config.diffTemp) * 0.55 * config.maxY, + (config.maxX + config.maxX + config.deltaX) / 2, + 0.25 * config.maxY + + ((config.maxTemp - series[series.length - 1]) / config.diffTemp) * 0.55 * config.maxY + ); + ctx.lineTo(config.maxX, config.maxY); + ctx.lineTo(0, config.maxY); + ctx.closePath(); + ctx.fillStyle = tempGradientFill; + ctx.fill(); + } +}; diff --git a/src/routes/weather/compare/+layout.ts b/src/routes/weather/compare/+layout.ts new file mode 100644 index 0000000..6221814 --- /dev/null +++ b/src/routes/weather/compare/+layout.ts @@ -0,0 +1,14 @@ +import { get } from 'svelte/store'; + +import { storedLocation } from '$lib/stores/settings'; + +import type { LayoutLoad } from './$types'; + +const location = get(storedLocation); + +export const load: LayoutLoad = async () => { + return { + heroTitle: `Model Compare ${location.name}`, + heroDescription: location.admin1 ?? '' + ' ' + location.country + }; +}; diff --git a/src/routes/weather/compare/+page.svelte b/src/routes/weather/compare/+page.svelte new file mode 100644 index 0000000..e4e18dc --- /dev/null +++ b/src/routes/weather/compare/+page.svelte @@ -0,0 +1,434 @@ + + + +
+
+
+ + + + +
+
+ +
+
+
+ { + storedLocation.set(event.detail); + window.location.reload(); + }} + label="Search Location" + /> +
+
+ { + $params.hourly = $params.hourly; + }} + /> + +
+
+ { + $params.hourly = $params.hourly; + }} + /> + +
+
+
+ +
+
+

Models

+ {#if $params.models.length > 0} +
+
+ {$params.models.length} / {models.flat().length} +
+
+ {/if} +
+ +
+ {#each models as group, i (i)} +
+ {#each group as { value, label } (value)} +
+ { + if ($params.models?.includes(value)) { + $params.models = $params.models.filter((item) => { + return item !== value; + }); + } else if ($params.models) { + $params.models.push(value); + $params.models = $params.models; + } + }} + /> + +
+ {/each} +
+ {/each} +
+ + +
+
+

+ Hourly Weather Variables +

+ {#if $params.hourly.length > 0} +
+
+ {$params.hourly.length} / {hourly.flat().length} +
+
+ {/if} +
+ +
+ {#each hourly as group, i (i)} +
+ {#each group as { value, label } (value)} +
+ { + if ($params.hourly?.includes(value)) { + $params.hourly = $params.hourly.filter((item) => { + return item !== value; + }); + } else if ($params.hourly) { + $params.hourly.push(value); + $params.hourly = $params.hourly; + } + }} + /> + +
+ {/each} +
+ {/each} +
+
+
diff --git a/src/routes/weather/compare/highcharts.css b/src/routes/weather/compare/highcharts.css new file mode 100644 index 0000000..3463cb2 --- /dev/null +++ b/src/routes/weather/compare/highcharts.css @@ -0,0 +1,1172 @@ +:root, +.highcharts-light { + --highcharts-color-0: #2caffe; + --highcharts-color-1: #544fc5; + --highcharts-color-2: #00e272; + --highcharts-color-3: #fe6a35; + --highcharts-color-4: #6b8abc; + --highcharts-color-5: #d568fb; + --highcharts-color-6: #2ee0ca; + --highcharts-color-7: #fa4b42; + --highcharts-color-8: #feb56a; + --highcharts-color-9: #91e8e1; + --highcharts-background-color: #ffffff; + --highcharts-tooltip-color: #f6f6f6; + --highcharts-neutral-color-100: #000000; + --highcharts-neutral-color-80: #333333; + --highcharts-neutral-color-60: #666666; + --highcharts-neutral-color-40: #999999; + --highcharts-neutral-color-20: #cccccc; + --highcharts-neutral-color-10: #e6e6e6; + --highcharts-neutral-color-5: #f2f2f2; + --highcharts-neutral-color-3: #f7f7f7; + --highcharts-highlight-color-100: #0022ff; + --highcharts-highlight-color-80: #334eff; + --highcharts-highlight-color-60: #667aff; + --highcharts-highlight-color-20: #ccd3ff; + --highcharts-highlight-color-10: #e6e9ff; + --highcharts-positive-color: #06b535; + --highcharts-negative-color: #f21313; +} + +@media (prefers-color-scheme: dark) { + :root { + --highcharts-background-color: rgb(2, 8, 23); + --highcharts-neutral-color-100: rgb(255, 255, 255); + --highcharts-neutral-color-80: rgb(248, 250, 252); + --highcharts-neutral-color-60: rgb(173, 173, 173); + --highcharts-neutral-color-40: rgb(133, 133, 133); + --highcharts-neutral-color-20: rgb(92, 92, 92); + --highcharts-neutral-color-10: rgb(71, 71, 71); + --highcharts-neutral-color-5: rgb(61, 61, 61); + --highcharts-neutral-color-3: rgb(57, 57, 57); + --highcharts-highlight-color-100: rgb(122, 167, 255); + --highcharts-highlight-color-80: rgb(108, 144, 214); + --highcharts-highlight-color-60: rgb(94, 121, 173); + --highcharts-highlight-color-20: rgb(65, 74, 92); + --highcharts-highlight-color-10: rgb(58, 63, 71); + } +} + +.highcharts-dark { + /*--highcharts-background-color: rgb(48, 48, 48);*/ + --highcharts-background-color: rgb(2, 8, 23); + --highcharts-tooltip-color: rgb(57, 64, 70); + --highcharts-neutral-color-100: rgb(255, 255, 255); + --highcharts-neutral-color-80: rgb(214, 214, 214); + --highcharts-neutral-color-60: rgb(173, 173, 173); + --highcharts-neutral-color-40: rgb(133, 133, 133); + --highcharts-neutral-color-20: rgb(92, 92, 92); + --highcharts-neutral-color-10: rgb(71, 71, 71); + --highcharts-neutral-color-5: rgb(61, 61, 61); + --highcharts-neutral-color-3: rgb(57, 57, 57); + --highcharts-highlight-color-100: rgb(122, 167, 255); + --highcharts-highlight-color-80: rgb(108, 144, 214); + --highcharts-highlight-color-60: rgb(94, 121, 173); + --highcharts-highlight-color-20: rgb(65, 74, 92); + --highcharts-highlight-color-10: rgb(58, 63, 71); +} + +.highcharts-container { + position: relative; + overflow: hidden; + width: 100%; + height: 100%; + text-align: left; + line-height: normal; + z-index: 0; + -webkit-tap-highlight-color: transparent; + font-family: Helvetica, Arial, sans-serif; + font-size: 1rem; + user-select: none; + touch-action: manipulation; + outline: none; +} + +.highcharts-root { + display: block; +} + +.highcharts-root text { + stroke-width: 0; +} + +.highcharts-strong { + font-weight: 700; +} + +.highcharts-emphasized { + font-style: italic; +} + +.highcharts-anchor { + cursor: pointer; +} + +.highcharts-background { + fill: var(--highcharts-background-color); +} + +.highcharts-plot-border, +.highcharts-plot-background { + fill: none; +} + +.highcharts-label-box { + fill: none; +} + +.highcharts-label text { + fill: var(--highcharts-neutral-color-80); + font-size: 0.8em; +} + +.highcharts-button-box { + fill: inherit; +} + +.highcharts-tracker-line { + stroke-linejoin: round; + stroke: rgba(192, 192, 192, 0.0001); + stroke-width: 22; + fill: none; +} + +.highcharts-tracker-area { + fill: rgba(192, 192, 192, 0.0001); + stroke-width: 0; +} + +.highcharts-title { + fill: var(--highcharts-neutral-color-80); + font-size: 1.2em; + font-weight: 700; +} + +.highcharts-subtitle { + fill: var(--highcharts-neutral-color-60); + font-size: 0.8em; +} + +.highcharts-axis-line { + fill: none; + stroke: var(--highcharts-neutral-color-80); +} + +.highcharts-yaxis .highcharts-axis-line { + stroke-width: 0; +} + +.highcharts-axis-title { + fill: var(--highcharts-neutral-color-60); + font-size: 0.8em; +} + +.highcharts-axis-labels { + fill: var(--highcharts-neutral-color-80); + cursor: default; + font-size: 0.65em; +} + +.highcharts-grid-line { + fill: none; + stroke: var(--highcharts-neutral-color-10); +} + +.highcharts-xaxis-grid .highcharts-grid-line { + stroke-width: 0; +} + +.highcharts-tick { + stroke: var(--highcharts-neutral-color-80); +} + +.highcharts-yaxis .highcharts-tick { + stroke-width: 0; +} + +.highcharts-minor-grid-line { + stroke: var(--highcharts-neutral-color-5); +} + +.highcharts-crosshair-thin { + stroke-width: 1px; + stroke: var(--highcharts-neutral-color-20); +} + +.highcharts-crosshair-category { + stroke: var(--highcharts-highlight-color-20); + stroke-opacity: 0.25; +} + +.highcharts-credits { + cursor: pointer; + fill: var(--highcharts-neutral-color-40); + font-size: 0.6em; + transition: + fill 250ms, + font-size 250ms; +} + +.highcharts-credits:hover { + fill: var(--highcharts-neutral-color-100); + font-size: 0.7em; +} + +.highcharts-tooltip { + cursor: default; + pointer-events: none; + white-space: nowrap; + transition: stroke 150ms; +} + +.highcharts-tooltip text { + fill: var(--highcharts-neutral-color-80); + font-size: 0.8em; +} + +.highcharts-tooltip .highcharts-header { + font-size: 0.8em; +} + +.highcharts-tooltip-box { + stroke-width: 1px; + fill: var(--highcharts-tooltip-color); +} + +.highcharts-tooltip-box { + stroke-width: 0; + fill: var(--highcharts-tooltip-color); +} + +.highcharts-tooltip-box .highcharts-label-box { + fill: var(--highcharts-tooltip-color); +} + +div.highcharts-tooltip { + filter: none; + font-size: 0.8em; +} + +.highcharts-selection-marker { + fill: var(--highcharts-highlight-color-80); + fill-opacity: 0.25; +} + +.highcharts-graph { + fill: none; + stroke-width: 1.5px; + stroke-linecap: round; + stroke-linejoin: round; +} + +.highcharts-empty-series { + stroke-width: 1px; + fill: none; + stroke: var(--highcharts-neutral-color-20); +} + +.highcharts-state-hover .highcharts-graph { + stroke-width: 3; +} + +.highcharts-point-inactive { + opacity: 0.2; + transition: opacity 50ms; +} + +.highcharts-series-inactive { + opacity: 0.2; + transition: opacity 50ms; +} + +.highcharts-state-hover path { + transition: stroke-width 50ms; +} + +.highcharts-state-normal path { + transition: stroke-width 250ms; +} + +g.highcharts-series, +.highcharts-point, +.highcharts-markers, +.highcharts-data-labels { + transition: opacity 250ms; +} + +.highcharts-legend-series-active g.highcharts-series:not(.highcharts-series-hover), +.highcharts-legend-point-active .highcharts-point:not(.highcharts-point-hover), +.highcharts-legend-series-active .highcharts-markers:not(.highcharts-series-hover), +.highcharts-legend-series-active .highcharts-data-labels:not(.highcharts-series-hover) { + opacity: 0.2; +} + +.highcharts-color-0 { + fill: var(--highcharts-color-0); + stroke: var(--highcharts-color-0); +} + +.highcharts-color-1 { + fill: var(--highcharts-color-1); + stroke: var(--highcharts-color-1); +} + +.highcharts-color-2 { + fill: var(--highcharts-color-2); + stroke: var(--highcharts-color-2); +} + +.highcharts-color-3 { + fill: var(--highcharts-color-3); + stroke: var(--highcharts-color-3); +} + +.highcharts-color-4 { + fill: var(--highcharts-color-4); + stroke: var(--highcharts-color-4); +} + +.highcharts-color-5 { + fill: var(--highcharts-color-5); + stroke: var(--highcharts-color-5); +} + +.highcharts-color-6 { + fill: var(--highcharts-color-6); + stroke: var(--highcharts-color-6); +} + +.highcharts-color-7 { + fill: var(--highcharts-color-7); + stroke: var(--highcharts-color-7); +} + +.highcharts-color-8 { + fill: var(--highcharts-color-8); + stroke: var(--highcharts-color-8); +} + +.highcharts-color-9 { + fill: var(--highcharts-color-9); + stroke: var(--highcharts-color-9); +} + +.highcharts-area { + fill-opacity: 0.75; + stroke-width: 0; +} + +.highcharts-markers { + stroke-width: 1px; + stroke: var(--highcharts-background-color); +} + +.highcharts-a11y-markers-hidden + .highcharts-point:not(.highcharts-point-hover, .highcharts-a11y-marker-visible), +.highcharts-a11y-marker-hidden { + opacity: 0; +} + +.highcharts-point { + stroke-width: 1px; +} + +.highcharts-dense-data .highcharts-point { + stroke-width: 0; +} + +.highcharts-data-label text, +text.highcharts-data-label { + font-size: 0.7em; + font-weight: 700; +} + +.highcharts-data-label-box { + fill: none; + stroke-width: 0; +} + +.highcharts-data-label text, +text.highcharts-data-label { + fill: var(--highcharts-neutral-color-80); +} + +.highcharts-data-label-connector { + fill: none; +} + +.highcharts-data-label-hidden { + pointer-events: none; +} + +.highcharts-halo { + fill-opacity: 0.25; + stroke-width: 0; +} + +.highcharts-series-label text { + fill: inherit; + font-weight: 700; +} + +.highcharts-series:not(.highcharts-pie-series) .highcharts-point-select, +.highcharts-markers .highcharts-point-select { + fill: var(--highcharts-neutral-color-20); + stroke: var(--highcharts-neutral-color-100); +} + +.highcharts-column-series rect.highcharts-point { + stroke: var(--highcharts-background-color); +} + +.highcharts-column-series .highcharts-point { + transition: fill-opacity 250ms; +} + +.highcharts-column-series .highcharts-point-hover { + fill-opacity: 0.75; + transition: fill-opacity 50ms; +} + +.highcharts-pie-series .highcharts-point { + stroke-linejoin: round; + stroke: var(--highcharts-background-color); +} + +.highcharts-pie-series .highcharts-point-hover { + fill-opacity: 0.75; + transition: fill-opacity 50ms; +} + +.highcharts-funnel-series .highcharts-point { + stroke-linejoin: round; + stroke: var(--highcharts-background-color); +} + +.highcharts-funnel-series .highcharts-point-hover { + fill-opacity: 0.75; + transition: fill-opacity 50ms; +} + +.highcharts-funnel-series .highcharts-point-select { + fill: inherit; + stroke: inherit; +} + +.highcharts-pyramid-series .highcharts-point { + stroke-linejoin: round; + stroke: var(--highcharts-background-color); +} + +.highcharts-pyramid-series .highcharts-point-hover { + fill-opacity: 0.75; + transition: fill-opacity 50ms; +} + +.highcharts-pyramid-series .highcharts-point-select { + fill: inherit; + stroke: inherit; +} + +.highcharts-solidgauge-series .highcharts-point { + stroke-width: 0; +} + +.highcharts-treemap-series .highcharts-point { + stroke-width: 1px; + stroke: var(--highcharts-neutral-color-10); + transition: + stroke 250ms, + fill 250ms, + fill-opacity 250ms; +} + +.highcharts-treemap-series .highcharts-point-hover { + stroke: var(--highcharts-neutral-color-40); + transition: + stroke 25ms, + fill 25ms, + fill-opacity 25ms; +} + +.highcharts-treemap-series .highcharts-above-level { + display: none; +} + +.highcharts-treemap-series .highcharts-internal-node { + fill: none; +} + +.highcharts-treemap-series .highcharts-internal-node-interactive { + fill-opacity: 0.15; + cursor: pointer; +} + +.highcharts-treemap-series .highcharts-internal-node-interactive:hover { + fill-opacity: 0.75; +} + +.highcharts-vector-series .highcharts-point { + fill: none; + stroke-width: 2px; +} + +.highcharts-windbarb-series .highcharts-point { + fill: none; + stroke-width: 2px; +} + +.highcharts-lollipop-stem { + stroke: var(--highcharts-neutral-color-100); +} + +.highcharts-focus-border { + fill: none; + stroke-width: 2px; +} + +.highcharts-legend-item-hidden .highcharts-focus-border { + fill: none !important; +} + +.highcharts-legend-box { + fill: none; + stroke-width: 0; +} + +.highcharts-legend-item > text { + fill: var(--highcharts-neutral-color-80); + font-weight: 700; + font-size: 0.8em; + cursor: pointer; + stroke-width: 0; +} + +.highcharts-legend-item:hover text { + fill: var(--highcharts-neutral-color-100); +} + +.highcharts-legend-item-hidden * { + fill: var(--highcharts-neutral-color-60) !important; + stroke: var(--highcharts-neutral-color-60) !important; + transition: fill 250ms; + text-decoration: line-through; +} + +.highcharts-legend-nav-active { + fill: var(--highcharts-highlight-color-100); + cursor: pointer; +} + +.highcharts-legend-nav-inactive { + fill: var(--highcharts-neutral-color-20); +} + +circle.highcharts-legend-nav-active, +circle.highcharts-legend-nav-inactive { + fill: rgba(192, 192, 192, 0.0001); +} + +.highcharts-legend-title-box { + fill: none; + stroke-width: 0; +} + +.highcharts-bubble-legend-symbol { + stroke-width: 2; + fill-opacity: 0.5; +} + +.highcharts-bubble-legend-connectors { + stroke-width: 1; +} + +.highcharts-bubble-legend-labels { + fill: var(--highcharts-neutral-color-80); + font-size: 0.7em; +} + +.highcharts-loading { + position: absolute; + background-color: var(--highcharts-background-color); + opacity: 0.5; + text-align: center; + z-index: 10; + transition: opacity 250ms; +} + +.highcharts-loading-hidden { + height: 0 !important; + opacity: 0; + overflow: hidden; + transition: + opacity 250ms, + height 250ms step-end; +} + +.highcharts-loading-inner { + font-weight: 700; + position: relative; + top: 45%; +} + +.highcharts-plot-band, +.highcharts-pane { + fill: rgba(255, 255, 194, 0.5); +} + +.highcharts-dark .highcharts-plot-band, +.highcharts-dark .highcharts-pane { + fill: rgba(255, 255, 194, 0.1); +} + +.highcharts-plot-line { + fill: none; + stroke: var(--highcharts-neutral-color-40); + stroke-width: 1px; +} + +.highcharts-plot-line-label { + font-size: 0.8em; +} + +.highcharts-boxplot-box { + fill: var(--highcharts-background-color); +} + +.highcharts-boxplot-median { + stroke-width: 2px; +} + +.highcharts-bubble-series .highcharts-point { + fill-opacity: 0.5; +} + +.highcharts-errorbar-series .highcharts-point { + stroke: var(--highcharts-neutral-color-100); +} + +.highcharts-gauge-series .highcharts-data-label-box { + stroke: var(--highcharts-neutral-color-20); + stroke-width: 1px; +} + +.highcharts-gauge-series .highcharts-dial { + fill: var(--highcharts-neutral-color-100); + stroke-width: 0; +} + +.highcharts-polygon-series .highcharts-graph { + fill: inherit; + stroke-width: 0; +} + +.highcharts-waterfall-series .highcharts-graph { + stroke: var(--highcharts-neutral-color-80); + stroke-dasharray: 1, 3; +} + +.highcharts-sankey-series .highcharts-point { + stroke-width: 0; +} + +.highcharts-sankey-series .highcharts-link { + transition: + fill 250ms, + fill-opacity 250ms; + fill-opacity: 0.5; +} + +.highcharts-sankey-series .highcharts-point-hover.highcharts-link { + transition: + fill 50ms, + fill-opacity 50ms; + fill-opacity: 1; +} + +.highcharts-venn-series .highcharts-point { + fill-opacity: 0.75; + stroke: var(--highcharts-neutral-color-20); + transition: + stroke 250ms, + fill-opacity 250ms; +} + +.highcharts-venn-series .highcharts-point-hover { + fill-opacity: 1; + stroke: var(--highcharts-neutral-color-20); +} + +.highcharts-timeline-series .highcharts-graph { + stroke: var(--highcharts-neutral-color-20); +} + +.highcharts-navigator-mask-outside { + fill-opacity: 0; +} + +.highcharts-navigator-mask-inside { + fill: var(--highcharts-highlight-color-60); + fill-opacity: 0.25; + cursor: ew-resize; +} + +.highcharts-navigator-outline { + stroke: var(--highcharts-neutral-color-40); + fill: none; +} + +.highcharts-navigator-handle { + stroke: var(--highcharts-neutral-color-40); + fill: var(--highcharts-neutral-color-5); + cursor: ew-resize; +} + +.highcharts-navigator-series { + fill: var(--highcharts-highlight-color-80); + stroke: var(--highcharts-highlight-color-80); +} + +.highcharts-navigator-series .highcharts-graph { + stroke-width: 1px; +} + +.highcharts-navigator-series .highcharts-area { + fill-opacity: 0.05; +} + +.highcharts-navigator-xaxis .highcharts-axis-line { + stroke-width: 0; +} + +.highcharts-navigator-xaxis .highcharts-grid-line { + stroke-width: 1px; + stroke: var(--highcharts-neutral-color-10); +} + +.highcharts-navigator-xaxis.highcharts-axis-labels { + fill: var(--highcharts-neutral-color-100); + font-size: 0.7em; + opacity: 0.6; +} + +.highcharts-navigator-yaxis .highcharts-grid-line { + stroke-width: 0; +} + +.highcharts-scrollbar-thumb { + fill: var(--highcharts-neutral-color-20); + stroke: var(--highcharts-neutral-color-20); + stroke-width: 0; +} + +.highcharts-scrollbar-button { + fill: var(--highcharts-neutral-color-10); + stroke: var(--highcharts-neutral-color-20); + stroke-width: 1px; +} + +.highcharts-scrollbar-arrow { + fill: var(--highcharts-neutral-color-60); +} + +.highcharts-scrollbar-rifles { + stroke: none; + stroke-width: 1px; +} + +.highcharts-scrollbar-track { + fill: rgba(255, 255, 255, 0.001); + stroke: var(--highcharts-neutral-color-20); + stroke-width: 1px; +} + +.highcharts-button { + fill: var(--highcharts-neutral-color-3); + stroke: var(--highcharts-neutral-color-20); + cursor: default; + stroke-width: 1px; + transition: fill 250ms; +} + +.highcharts-button text { + fill: var(--highcharts-neutral-color-80); + font-size: 0.8em; +} + +.highcharts-button-hover { + transition: fill 0ms; + fill: var(--highcharts-neutral-color-10); + stroke: var(--highcharts-neutral-color-20); +} + +.highcharts-button-hover text { + fill: var(--highcharts-neutral-color-80); +} + +.highcharts-button-pressed { + font-weight: 700; + fill: var(--highcharts-highlight-color-10); + stroke: var(--highcharts-neutral-color-20); +} + +.highcharts-button-pressed text { + fill: var(--highcharts-neutral-color-80); + font-weight: 700; +} + +.highcharts-button-disabled text { + fill: var(--highcharts-neutral-color-80); +} + +.highcharts-range-selector-buttons .highcharts-button { + stroke-width: 0; +} + +.highcharts-range-label rect { + fill: none; +} + +.highcharts-range-label text { + fill: var(--highcharts-neutral-color-60); +} + +.highcharts-range-input rect { + fill: none; +} + +.highcharts-range-input text { + fill: var(--highcharts-neutral-color-80); + font-size: 0.8em; +} + +.highcharts-range-input { + stroke-width: 1px; + stroke: var(--highcharts-neutral-color-20); +} + +input.highcharts-range-selector { + position: absolute; + border: 0; + width: 1px; + height: 1px; + padding: 0; + text-align: center; + left: -9em; +} + +.highcharts-crosshair-label text { + fill: var(--highcharts-background-color); + font-size: 1.7em; +} + +.highcharts-crosshair-label .highcharts-label-box { + fill: inherit; +} + +.highcharts-candlestick-series .highcharts-point { + stroke: var(--highcharts-neutral-color-100); + stroke-width: 1px; +} + +.highcharts-candlestick-series .highcharts-point-up { + fill: var(--highcharts-background-color); +} + +.highcharts-hollowcandlestick-series .highcharts-point-down { + fill: var(--highcharts-negative-color); + stroke: var(--highcharts-negative-color); +} + +.highcharts-hollowcandlestick-series .highcharts-point-down-bearish-up { + fill: var(--highcharts-positive-color); + stroke: var(--highcharts-positive-color); +} + +.highcharts-hollowcandlestick-series .highcharts-point-up { + fill: transparent; + stroke: var(--highcharts-positive-color); +} + +.highcharts-ohlc-series .highcharts-point-hover { + stroke-width: 3px; +} + +.highcharts-flags-series .highcharts-point .highcharts-label-box { + stroke: var(--highcharts-neutral-color-40); + fill: var(--highcharts-background-color); + transition: fill 250ms; +} + +.highcharts-flags-series .highcharts-point-hover .highcharts-label-box { + stroke: var(--highcharts-neutral-color-100); + fill: var(--highcharts-highlight-color-20); +} + +.highcharts-flags-series .highcharts-point text { + fill: var(--highcharts-neutral-color-100); + font-size: 0.9em; + font-weight: 700; +} + +.highcharts-map-series .highcharts-point { + transition: + fill 500ms, + fill-opacity 500ms, + stroke-width 250ms; + stroke: var(--highcharts-neutral-color-20); + stroke-width: inherit; +} + +.highcharts-map-series .highcharts-point-hover { + transition: + fill 0ms, + fill-opacity 0ms; + fill-opacity: 0.5; +} + +.highcharts-mapline-series .highcharts-point { + fill: none; +} + +.highcharts-heatmap-series .highcharts-point { + stroke-width: 0; +} + +.highcharts-map-navigation { + font-size: 1.3em; + font-weight: 700; + text-align: center; +} + +.highcharts-map-navigation.highcharts-button { + fill: var(--highcharts-background-color); + stroke: var(--highcharts-neutral-color-10); +} + +.highcharts-map-navigation.highcharts-button:hover { + fill: var(--highcharts-neutral-color-10); +} + +.highcharts-map-navigation.highcharts-button .highcharts-button-symbol { + stroke-width: 2px; +} + +.highcharts-mapview-inset-border { + stroke: var(--highcharts-neutral-color-20); + stroke-width: 1px; + fill: none; +} + +.highcharts-coloraxis { + stroke-width: 0; +} + +.highcharts-coloraxis-marker { + fill: var(--highcharts-neutral-color-40); +} + +.highcharts-null-point { + fill: var(--highcharts-neutral-color-3); +} + +.highcharts-3d-frame { + fill: transparent; +} + +.highcharts-contextbutton { + fill: var(--highcharts-background-color); + stroke: none; + stroke-linecap: round; +} + +.highcharts-contextbutton:hover { + fill: var(--highcharts-neutral-color-10); + stroke: var(--highcharts-neutral-color-10); +} + +.highcharts-button-symbol { + stroke: var(--highcharts-neutral-color-60); + stroke-width: 3px; +} + +.highcharts-menu { + border: none; + background: var(--highcharts-background-color); + border-radius: 3px; + padding: 0.5em; + box-shadow: 3px 3px 10px #888; +} + +.highcharts-menu-item { + background: 0 0; + border-radius: 3px; + color: var(--highcharts-neutral-color-80); + cursor: pointer; + font-size: 0.8em; + list-style-type: none; + padding: 0.5em; + transition: + background 250ms, + color 250ms; +} + +.highcharts-menu-item:hover { + background: var(--highcharts-neutral-color-5); +} + +.highcharts-breadcrumbs-button { + fill: none; + stroke-width: 0; + cursor: pointer; +} + +.highcharts-breadcrumbs-separator { + fill: var(--highcharts-neutral-color-60); +} + +.highcharts-drilldown-point { + cursor: pointer; +} + +.highcharts-drilldown-data-label text, +text.highcharts-drilldown-data-label, +.highcharts-drilldown-axis-label { + cursor: pointer; + fill: var(--highcharts-highlight-color-100); + font-weight: 700; + text-decoration: underline; +} + +.highcharts-no-data text { + font-weight: 700; + font-size: 0.8em; + fill: var(--highcharts-neutral-color-60); +} + +.highcharts-axis-resizer { + cursor: ns-resize; + stroke: var(--highcharts-neutral-color-100); + stroke-width: 2px; +} + +.highcharts-bullet-target { + stroke-width: 0; +} + +.highcharts-lineargauge-target { + stroke-width: 1px; + stroke: var(--highcharts-neutral-color-80); +} + +.highcharts-lineargauge-target-line { + stroke-width: 1px; + stroke: var(--highcharts-neutral-color-80); +} + +.highcharts-annotation-label-box { + stroke-width: 1px; + stroke: var(--highcharts-neutral-color-100); + fill: var(--highcharts-neutral-color-100); + fill-opacity: 0.75; +} + +.highcharts-annotation-label text { + fill: var(--highcharts-neutral-color-10); + font-size: 0.8em; +} + +.highcharts-a11y-proxy-button { + border-width: 0; + background-color: transparent; + cursor: pointer; + outline: none; + opacity: 0.001; + z-index: 999; + overflow: hidden; + padding: 0; + margin: 0; + display: block; + position: absolute; +} + +.highcharts-a11y-proxy-group li { + list-style: none; +} + +.highcharts-visually-hidden { + position: absolute; + width: 1px; + height: 1px; + overflow: hidden; + white-space: nowrap; + clip: rect(1px, 1px, 1px, 1px); + margin-top: -3px; + opacity: 0.01; +} + +.highcharts-a11y-invisible { + visibility: hidden; +} + +.highcharts-a11y-proxy-container, +.highcharts-a11y-proxy-container-before, +.highcharts-a11y-proxy-container-after { + position: absolute; + white-space: nowrap; +} + +g.highcharts-series, +.highcharts-markers, +.highcharts-point { + outline: none; +} + +.highcharts-treegrid-node-collapsed, +.highcharts-treegrid-node-expanded { + cursor: pointer; +} + +.highcharts-point-connecting-path { + fill: none; +} + +.highcharts-grid-axis .highcharts-tick { + stroke-width: 1px; +} + +.highcharts-grid-axis .highcharts-axis-line { + stroke-width: 1px; +} + +.highcharts-average-series { + fill: rgb(110, 110, 110); + stroke: rgb(110, 110, 110); +} + +.highcharts-average-series .highcharts-graph { + stroke-width: 4; + stroke-dasharray: 3, 8, 1, 8, 3; + stroke-linecap: square; + stroke-dashoffset:; +} + +.highcharts-dark .highcharts-average-series { + fill: rgb(200, 200, 200); + stroke: rgb(200, 200, 200); +} + +.highcharts-spread-series { + fill: rgb(236, 190, 41); + stroke: rgb(236, 190, 41); +} + +.highcharts-spread-series .highcharts-graph { + stroke-width: 2; +} + +.highcharts-dark .highcharts-spread-series { + fill: rgb(201, 162, 35); + stroke: rgb(201, 162, 35); +} diff --git a/src/routes/weather/compare/options.ts b/src/routes/weather/compare/options.ts new file mode 100644 index 0000000..a0a4378 --- /dev/null +++ b/src/routes/weather/compare/options.ts @@ -0,0 +1,33 @@ +export const defaultParameters = { + daily: [], + hourly: [], + models: [], + current: [], + minutely_15: [], + + timezone: 'UTC', + location_mode: 'location_search', + csv_coordinates: undefined, + + time_mode: 'forecast_days', + past_days: '0', + forecast_days: '7', + + end_date: undefined, + start_date: undefined, + + past_hours: undefined, + cell_selection: undefined, + forecast_hours: undefined, + past_minutely_15: undefined, + temporal_resolution: undefined, + forecast_minutely_15: undefined, + + tilt: '0', + azimuth: '0', + + timeformat: 'iso8601', + wind_speed_unit: 'kmh', + temperature_unit: 'celsius', + precipitation_unit: 'mm' +}; diff --git a/src/routes/weather/config.d.ts b/src/routes/weather/config.d.ts new file mode 100644 index 0000000..afd3a51 --- /dev/null +++ b/src/routes/weather/config.d.ts @@ -0,0 +1,8 @@ +interface ConfigInterface { + maxX: number; + maxY: number; + deltaX: number; + minTemp: number; + maxTemp: number; + diffTemp: number; +} diff --git a/src/routes/weather/locations/city-names10.json b/src/routes/weather/locations/city-names10.json new file mode 100644 index 0000000..3b3cff6 --- /dev/null +++ b/src/routes/weather/locations/city-names10.json @@ -0,0 +1,12 @@ +[ + "kinshasa", + "shenzhen", + "shanghai", + "guangzhou", + "chengdu", + "beijing", + "mumbai", + "lagos", + "lahore", + "istanbul" +] diff --git a/src/routes/weather/locations/city-names100.json b/src/routes/weather/locations/city-names100.json new file mode 100644 index 0000000..7a5a4a1 --- /dev/null +++ b/src/routes/weather/locations/city-names100.json @@ -0,0 +1,102 @@ +[ + "dubai", + "kabul", + "sydney", + "melbourne", + "dhaka", + "chattogram", + "sao-paulo", + "rio-de-janeiro", + "kinshasa", + "abidjan", + "santiago", + "zhengzhou", + "xi'an", + "xiamen", + "wuxi", + "wuhan", + "tianjin", + "tangshan", + "taiyuan", + "shiyan", + "shijiazhuang", + "shenzhen", + "shantou", + "shanghai", + "qingdao", + "puyang", + "ningbo", + "nanning", + "nanjing", + "kunming", + "jinan", + "hefei", + "hangzhou", + "guangzhou", + "fuzhou", + "foshan", + "dongguan", + "dalian", + "chongqing", + "chengdu", + "beijing", + "suzhou", + "shenyang", + "harbin", + "changchun", + "zhongshan", + "bogota", + "berlin", + "cairo", + "giza", + "alexandria", + "addis-ababa", + "london", + "hong-kong", + "new-territories", + "jakarta", + "surat", + "chennai", + "hyderabad", + "delhi", + "kolkata", + "mumbai", + "bengaluru", + "ahmedabad", + "baghdad", + "tehran", + "yokohama", + "tokyo", + "nairobi", + "seoul", + "busan", + "casablanca", + "bamako", + "yangon", + "mexico-city", + "lagos", + "kano", + "ibadan", + "lima", + "peshawar", + "lahore", + "karachi", + "faisalabad", + "saint-petersburg", + "moscow", + "jeddah", + "riyadh", + "singapore", + "bangkok", + "ankara", + "istanbul", + "taipei", + "new-taipei-city", + "dar-es-salaam", + "new-york-city", + "los-angeles", + "ho-chi-minh-city", + "hanoi", + "johannesburg", + "cape-town" +] diff --git a/src/routes/weather/options.ts b/src/routes/weather/options.ts new file mode 100644 index 0000000..a58f330 --- /dev/null +++ b/src/routes/weather/options.ts @@ -0,0 +1,64 @@ +export const defaultParameters = { + timeformat: 'iso8601', + wind_speed_unit: 'kmh', + temperature_unit: 'celsius', + precipitation_unit: 'mm' +}; + +export const models = [ + { value: 'best_match', label: 'Best match' }, + { value: 'gfs_seamless', label: 'NCEP GFS Seamless' }, + { value: 'jma_seamless', label: 'JMA Seamless' }, + { value: 'kma_seamless', label: 'KMA Seamless' }, + { value: 'icon_seamless', label: 'DWD ICON Seamless' }, + { value: 'gem_seamless', label: 'GEM Seamless' }, + { value: 'meteofrance_seamless', label: 'Météo-France Seamless' }, + { value: 'arpae_cosmo_seamless', label: 'ARPAE Seamless' }, + { value: 'metno_seamless', label: 'MET Norway Seamless (with ECMWF)' }, + { value: 'knmi_seamless', label: 'KNMI Seamless (with ECMWF)' }, + { value: 'dmi_seamless', label: 'DMI Seamless (with ECMWF)' }, + { value: 'ukmo_seamless', label: 'UK Met Office Seamless' } +]; + +export const hourly = [ + [ + { value: 'temperature_2m', label: 'Temperature 2m' }, + { value: 'relative_humidity_2m', label: 'Relative Humidity 2m' }, + { value: 'dew_point_2m', label: 'Dew Point 2m' }, + { value: 'apparent_temperature', label: 'Apparent Temperature' }, + { value: 'precipitation_probability', label: 'Precipitation Probability' } + ], + [ + { value: 'precipitation', label: 'Precipitation' }, + { value: 'rain', label: 'Rain' }, + { value: 'showers', label: 'Showers' }, + { value: 'snowfall', label: 'Snowfall' }, + { value: 'weather_code', label: 'Weather Code' } + ], + [ + { value: 'pressure_msl', label: 'Pressure MSL' }, + { value: 'surface_pressure', label: 'Surface Pressure' }, + { value: 'cloud_cover', label: 'Cloud Cover' }, + { value: 'cloud_cover_low', label: 'Cloud Cover Low' }, + { value: 'cloud_cover_mid', label: 'Cloud Cover Mid' }, + { value: 'cloud_cover_high', label: 'Cloud Cover High' } + ], + [ + { value: 'et0_fao_evapotranspiration', label: 'Evapotranspiration' }, + { value: 'vapor_pressure_deficit', label: 'Vapor Pressure Deficit' }, + { value: 'wind_speed_10m', label: 'Wind Speed 10m' }, + { value: 'wind_speed_80m', label: 'Wind Speed 80m' }, + { value: 'wind_speed_120m', label: 'Wind Speed 120m' }, + { value: 'wind_speed_180m', label: 'Wind Speed 180m' }, + { value: 'wind_direction_10m', label: 'Wind Direction 10m' }, + { value: 'wind_direction_80m', label: 'Wind Direction 80m' }, + { value: 'wind_direction_120m', label: 'Wind Direction 120m' }, + { value: 'wind_direction_180m', label: 'Wind Direction 180m' }, + { value: 'wind_gusts_10m', label: 'Wind Gusts 10m' } + ], + [ + { value: 'temperature_80m', label: 'Temperature 80m' }, + { value: 'temperature_120m', label: 'Temperature 120m' }, + { value: 'temperature_180m', label: 'Temperature 180m' } + ] +]; diff --git a/src/routes/weather/utils/color-scale-hex.ts b/src/routes/weather/utils/color-scale-hex.ts new file mode 100644 index 0000000..5ee10bc --- /dev/null +++ b/src/routes/weather/utils/color-scale-hex.ts @@ -0,0 +1,102 @@ +export default [ + '#800080', + '#800083', + '#800087', + '#7f008a', + '#7f008d', + '#7e0090', + '#7d0094', + '#7c0097', + '#7a009a', + '#79009d', + '#7700a1', + '#7600a4', + '#7400a7', + '#7200aa', + '#6f00ae', + '#6d00b1', + '#6a00b4', + '#6700b7', + '#6400bb', + '#6100be', + '#5e00c1', + '#5b00c4', + '#5700c8', + '#5300cb', + '#4f00ce', + '#4b00d1', + '#4700d5', + '#4200d8', + '#3e00db', + '#3900de', + '#3400e2', + '#2f00e5', + '#2a00e8', + '#2400eb', + '#1f00ef', + '#1900f2', + '#1300f5', + '#0d00f8', + '#0600fc', + '#0000ff', + '#0000ff', + '#0021f7', + '#003fee', + '#005ce6', + '#0076dd', + '#008ed5', + '#00a3cc', + '#00b7c4', + '#00bbaf', + '#00b38f', + '#00aa72', + '#00a256', + '#00993d', + '#009127', + '#008812', + '#008000', + '#008000', + '#118c00', + '#259700', + '#3ca300', + '#56ae00', + '#72ba00', + '#92c500', + '#b4d100', + '#d9dc00', + '#e8cf00', + '#f3bb00', + '#ffa500', + '#ffa500', + '#ff9800', + '#ff8c00', + '#ff7f00', + '#ff7200', + '#ff6600', + '#ff5900', + '#ff4c00', + '#ff3f00', + '#ff3300', + '#ff2600', + '#ff1900', + '#ff0d00', + '#ff0000', + '#ff0000', + '#f8000f', + '#f0001c', + '#e90029', + '#e10035', + '#da0040', + '#d2004a', + '#cb0053', + '#c3005c', + '#bc0063', + '#b4006a', + '#ad0070', + '#a50075', + '#9e0079', + '#96007c', + '#8f007e', + '#870080', + '#800080' +]; diff --git a/src/routes/weather/utils/colors.ts b/src/routes/weather/utils/colors.ts new file mode 100644 index 0000000..6cb4404 --- /dev/null +++ b/src/routes/weather/utils/colors.ts @@ -0,0 +1,51 @@ +import colorScaleHex from './color-scale-hex'; + +function componentFromStr(numStr: string, percent: number) { + const num = Math.max(0, parseInt(numStr, 10)); + return percent ? Math.floor((255 * Math.min(100, num)) / 100) : Math.min(255, num); +} + +export function rgbToHex(rgb: string) { + const rgbRegex = /^rgb\(\s*(-?\d+)(%?)\s*,\s*(-?\d+)(%?)\s*,\s*(-?\d+)(%?)\s*\)$/; + let result, + r, + g, + b, + hex = ''; + if ((result = rgbRegex.exec(rgb))) { + r = componentFromStr(result[1], result[2]); + g = componentFromStr(result[3], result[4]); + b = componentFromStr(result[5], result[6]); + + hex = (0x1000000 + (r << 16) + (g << 8) + b).toString(16).slice(1); + } + if (!rgb) { + return '355522'; + } + return hex; +} + +export const getColor = (temp: number, unit = 'celsius'): string => { + let index = 0; + temp = Number(temp); + if (unit === 'celsius') { + if (temp <= -40) { + index = 0; + } else if (temp >= 60) { + index = colorScaleHex.length - 1; + } else { + index = temp + 40; + } + } else { + const tempInCelsius = Math.round(((temp - 32) * 5) / 9); + if (tempInCelsius <= -40) { + index = 0; + } else if (tempInCelsius >= 60) { + index = colorScaleHex.length - 1; + } else { + index = tempInCelsius + 40; + } + } + + return colorScaleHex[index]; +}; diff --git a/src/routes/weather/utils/colour-gradient.ipynb b/src/routes/weather/utils/colour-gradient.ipynb new file mode 100644 index 0000000..3f25f7d --- /dev/null +++ b/src/routes/weather/utils/colour-gradient.ipynb @@ -0,0 +1,191 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "8c554ac3-6dae-4561-b493-32943137a3ea", + "metadata": {}, + "source": [ + "## Generating colours" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "id": "ba97e928-85be-46bd-9429-e69f89c3ce13", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import json\n", + "from colour import Color\n", + "\n", + "def flatten(xss):\n", + " return [x for xs in xss for x in xs]\n", + "\n", + "deep_purple = Color(\"#4F00A3\")\n", + "dark_blue = Color(\"#0117DB\")\n", + "light_blue = Color(\"#01B1FF\")\n", + "light_green = Color(\"#00FFC2\")\n", + "dark_green = Color(\"#00D139\")\n", + "warm_green = Color(\"#FFFF00\")\n", + "light_orange = Color(\"#FFC600\")\n", + "middle_orange = Color(\"#FFA200\")\n", + "dark_orange = Color(\"#FF640A\")\n", + "deep_red = Color(\"#9E1500\")\n", + "\n", + "colors = [\n", + " list(deep_purple.range_to(dark_blue,15)),\n", + " list(dark_blue.range_to(light_blue,13)),\n", + " list(light_blue.range_to(light_green,13)),\n", + " list(light_green.range_to(dark_green,8)),\n", + " list(dark_green.range_to(warm_green,14)),\n", + " list(warm_green.range_to(light_orange,8)),\n", + " list(light_orange.range_to(middle_orange,9)),\n", + " list(middle_orange.range_to(dark_orange,10)),\n", + " list(dark_orange.range_to(deep_red,11)),\n", + "]\n", + "\n", + "colors = flatten(colors)\n", + "\n", + "color_list = []\n", + "rgb_list = []\n", + "hsl_list = []\n", + "hex_list = []\n", + "\n", + "temp_x= []\n", + "temp_height= []\n", + "\n", + "for [ind, color] in enumerate(colors):\n", + " x = -40 + ind\n", + " color_list.append(color.hex)\n", + " hex_list.append(color.hex)\n", + " rgb_list.append(color.rgb)\n", + " hsl_list.append(color.hsl)\n", + " temp_x.append(x)\n", + " temp_height.append(1)" + ] + }, + { + "cell_type": "markdown", + "id": "248a5151-772d-43e7-8fde-5d58511f30e8", + "metadata": {}, + "source": [ + "## Visualisation" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "id": "40b96c47-6025-41d1-a2cc-a46d9233efcf", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 37, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "4bf8047db9cf4060b54ccfff7857fbcb", + "version_major": 2, + "version_minor": 0 + }, + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvc2/+5QAAAAlwSFlzAAAPYQAAD2EBqD+naQAAGh9JREFUeJzt3X+MXXX5J/Bn2s7c6a+Z/qDM0O2ABVkKooItwogQwAk1cTcSKuqCkR9NUTNFoSZARUvGECpIKD8iLbBS0YWVEAMaCQhbCIk4CpYgNNgKi4Sm/c5QFeaWukw7nbt/LMx3R6rfQc70eu/zeiUn4Z5z5txnbkjuu8/zOWcaKpVKJQAASGNCtQsAAGD/EgABAJIRAAEAkhEAAQCSEQABAJIRAAEAkhEAAQCSEQABAJIRAAEAkhEAAQCSEQABAJIRAAEAkhEAAQCSEQABAJIRAAEAkhEAAQCSEQABAJIRAAEAkhEAAQCSEQABAJIRAAEAkhEAAQCSEQABAJIRAAEAkhEAAQCSEQABAJIRAAEAkhEAAQCSEQABAJIRAAEAkhEAAQCSEQABAJIRAAEAkhEAAQCSEQABAJIRAAEAkhEAAQCSEQABAJIRAAEAkhEAAQCSEQABAJIRAAEAkhEAAQCSEQABAJIRAAEAkhEAAQCSEQABAJIRAAEAkhEAAQCSEQABAJIRAAEAkhEAAQCSEQABAJIRAAEAkhEAAQCSEQABAJKZVO0Catnw8HBs3749pk+fHg0NDdUuBwAYg0qlEjt37oy5c+fGhAk5e2EC4Huwffv26OjoqHYZAMA/YevWrTFv3rxql1EVAuB7MH369Ii3/gdqaWmpdjkAwBiUy+Xo6OgY+R7PSAB8D94e+7a0tAiAAFBjMi/fyjn4BgBITAAEAEhGAAQASEYABABIRgAEAEhGAAQASEYABABIRgAEAEhGAAQASEYABABIRgAEAEhGAAQASKauA+C2bdviC1/4QsyePTsmT54cH/zgB+O3v/3tyPFKpRKrVq2Kgw46KCZPnhxdXV3xwgsvVLVmAIDxNqnaBYyX1157LU488cQ49dRT48EHH4w5c+bECy+8EDNnzhw559prr42bbrop7rzzzpg/f35861vfisWLF8fzzz8fzc3NY36v/3Foa0yu6ygNAPvX+a9Wql1CXavbAHjNNddER0dHrF+/fmTf/PnzR/67UqnEDTfcEN/85jfj05/+dERE/PCHP4y2tra4//774/Of/3xV6gYAGG9127f62c9+FosWLYqzzjorDjzwwDj22GPj9ttvHzn+xz/+Mfr6+qKrq2tkX2traxx//PHR29tbpaoBAMZf3QbAl156KdauXRuHH354/OIXv4ivfOUr8dWvfjXuvPPOiIjo6+uLiIi2trZRP9fW1jZy7G8NDg5GuVwetQEA1Jq6HQEPDw/HokWL4uqrr46IiGOPPTY2bdoU69ati3PPPfefuubq1aujp6fnHfunNEZMqdsoDQDUm7qNLQcddFAcddRRo/YdeeSR8corr0RERHt7e0RE9Pf3jzqnv79/5NjfWrlyZQwMDIxsW7duHbf6AQDGS90GwBNPPDG2bNkyat8f/vCHOOSQQyLeuiGkvb09NmzYMHK8XC7Hb37zm+js7NznNUulUrS0tIzaAABqTd2OgC+55JL42Mc+FldffXV89rOfjSeffDJuu+22uO222yIioqGhIS6++OK46qqr4vDDDx95DMzcuXPjjDPOeFfvNaXJCBgAqB11GwCPO+64uO+++2LlypXx7W9/O+bPnx833HBDnHPOOSPnXHrppbFr16648MIL4/XXX4+Pf/zj8dBDD72rZwACANSahkql4kmL/6RyuRytra1xz8E6gABQpP/yx/GLJ29/fw8MDKRdzlW3HcD9aUpTxNSJ1a4CAGBs9K0AAJIRAAEAkhEAAQCSsQawAFNK1gACALVDBxAAIBkBEAAgGSPgAkwpRUwxAgYAaoQOIABAMgIgAEAyRsAFmFKKmOqTBABqhA4gAEAyAiAAQDICIABAMlauFWBqszWAAEDt0AEEAEhGAAQASMbgsgBTmiOmNla7CgCAsdEBBABIRgAEAEjGCLgAUyZHTDECBgBqhA4gAEAyAiAAQDICIABAMtYAFqBh2uRoaGqodhkAAGOiAwgAkIwACACQjAAIAJCMAAgAkIwACACQjLuAi1CqRDRVuwgAgLHRAQQASEYABABIRgAEAEjGGsAiNFoDCADUDh1AAIBkBEAAgGSMgItQqkSUql0EAMDY6AACACQjAAIAJGMEXAQjYACghugAAgAkIwACACQjAAIAJGMNYBGahiNKDdWuAgBgTHQAAQCSEQABAJIxAi6Cx8AAADVEBxAAIBkBEAAgGSPgIjQZAQMAtUMHEAAgGQEQACAZARAAIBlrAIvgMTAAQA3RAQQASCZFAPzOd74TDQ0NcfHFF4/se/PNN6O7uztmz54d06ZNiyVLlkR/f39V6wQA2B/qfgT81FNPxa233hof+tCHRu2/5JJL4oEHHoh77703WltbY/ny5XHmmWfGE0888e7fpPTWGBgAoAbUdQfwjTfeiHPOOSduv/32mDlz5sj+gYGB+P73vx/XX399nHbaabFw4cJYv359/OpXv4pf//rXVa0ZAGC81XUA7O7ujk996lPR1dU1av/GjRtjz549o/YvWLAgDj744Ojt7f271xscHIxyuTxqAwCoNXU7Av7xj38cTz/9dDz11FPvONbX1xdNTU0xY8aMUfvb2tqir6/v715z9erV0dPTMy71AgDsL3XZAdy6dWt87Wtfi7vuuiuam5sLu+7KlStjYGBgZNu6dWth1wYA2F/qMgBu3LgxXn311fjIRz4SkyZNikmTJsXjjz8eN910U0yaNCna2tpi9+7d8frrr4/6uf7+/mhvb/+71y2VStHS0jJqAwCoNXU5Av7EJz4Rzz333Kh9559/fixYsCAuu+yy6OjoiMbGxtiwYUMsWbIkIiK2bNkSr7zySnR2dlapagCA/aMuA+D06dPj6KOPHrVv6tSpMXv27JH9S5cujRUrVsSsWbOipaUlLrrooujs7IwTTjjh3b/hxHr9JAGAepQ2tqxZsyYmTJgQS5YsicHBwVi8eHHccsst1S4LAGDcNVQqFU8w/ieVy+VobW2Ngf8e0TKl2tUAQB35b+MXT0a+vwcG0q7nT9sBLFTjWxsAQA2oy7uAAQD4+wRAAIBkjICLMMknCQDUDh1AAIBkBEAAgGQEQACAZKxcK4LHwAAANUQHEAAgGQEQACAZI+AiTPRJAgC1QwcQACAZARAAIBmDyyK4CxgAqCE6gAAAyQiAAADJCIAAAMlYA1iEST5JAKB26AACACQjAAIAJGNwWQSPgQEAaogOIABAMgIgAEAyAiAAQDICIABAMgIgAEAyAiAAQDIeA1OEUkQ0V7sIAICx0QEEAEhGAAQASMYIuAjNRsAAQO3QAQQASEYABABIxgi4CO4CBgBqiA4gAEAyAiAAQDICIABAMtYAFmHyWxsAQA3QAQQASEYABABIxgi4CB4DAwDUEB1AAIBkBEAAgGSMgIvQbAQMANQOHUAAgGQEQACAZIyAi2AEDADUEB1AAIBkBEAAgGQEQACAZARAAIBkBEAAgGQEQACAZDwGpgDbhiLKQ9WuAgDqxzwJZVzpAAIAJFO3AXD16tVx3HHHxfTp0+PAAw+MM844I7Zs2TLqnDfffDO6u7tj9uzZMW3atFiyZEn09/dXrWYAgP2hbhusjz/+eHR3d8dxxx0XQ0ND8Y1vfCNOP/30eP7552Pq1KkREXHJJZfEAw88EPfee2+0trbG8uXL48wzz4wnnnjiXb3X9r0RU/eO0y8CAAkZAY+vhkqlUql2EfvDjh074sADD4zHH388Tj755BgYGIg5c+bE3XffHZ/5zGciImLz5s1x5JFHRm9vb5xwwgn/4TXL5XK0trbG/3o1YmrLfvglACCJE0rjF0/e/v4eGBiIlpacX+B1OwL+WwMDAxERMWvWrIiI2LhxY+zZsye6urpGzlmwYEEcfPDB0dvbW7U6AQDGW4oG6/DwcFx88cVx4oknxtFHHx0REX19fdHU1BQzZswYdW5bW1v09fXt8zqDg4MxODg48rpcLo9z5QAAxUsRALu7u2PTpk3xy1/+8j1dZ/Xq1dHT0/OO/f82FDHFY2AAoDilahdQ3+p+BLx8+fL4+c9/Ho899ljMmzdvZH97e3vs3r07Xn/99VHn9/f3R3t7+z6vtXLlyhgYGBjZtm7dOu71AwAUrW4DYKVSieXLl8d9990Xjz76aMyfP3/U8YULF0ZjY2Ns2LBhZN+WLVvilVdeic7Ozn1es1QqRUtLy6gNAKDW1O0IuLu7O+6+++746U9/GtOnTx9Z19fa2hqTJ0+O1tbWWLp0aaxYsSJmzZoVLS0tcdFFF0VnZ+eY7gD+//3b3ojJHgMDANSIug2Aa9eujYiIU045ZdT+9evXx3nnnRcREWvWrIkJEybEkiVLYnBwMBYvXhy33HJLVeoFANhf0jwHcDy8/Ryha7dGTDYNBoDCLG/xHMDxVLcdwP2pbyii5C5gAKBG1O1NIAAA7JsACACQjAAIAJCMNYAF6BuOaPIYGACgRugAAgAkIwACACRjBFyAV4ciJnkMDABQI3QAAQCSEQABAJIxAi7Aq3sjJroLGACoETqAAADJCIAAAMkIgAAAyVgDWIAdQxETPAYGAKgROoAAAMkIgAAAyRgBF2DH3ogGj4EBAGqEDiAAQDICIABAMkbABRjaOyNiqKHaZQAAjIkOIABAMgIgAEAyAiAAQDLWABZh76yIvROrXQUAwJjoAAIAJCMAAgAkYwRchKHZEUM+SgCgNugAAgAkIwACACQjAAIAJCMAAgAkIwACACQjAAIAJOPZJUUozYgoNVa7CgCAMdEBBABIRgAEAEjGCLgIjTMjmpqqXQUAwJjoAAIAJCMAAgAkYwRchNLMiFKp2lUAAIyJDiAAQDICIABAMgIgAEAy1gAWoWl2RFNztasAABgTHUAAgGQEQACAZIyAi9A0O6I0udpVAACMiQ4gAEAyAiAAQDJGwEVomhPRNKXaVQAAjIkOIABAMgIgAEAyAiAAQDLWABahNCeiNLXaVQAAjIkOIABAMukD4Pe+97143/veF83NzXH88cfHk08+We2SAADGVeoAeM8998SKFSviyiuvjKeffjo+/OEPx+LFi+PVV1+tdmkAAOMmdQC8/vrrY9myZXH++efHUUcdFevWrYspU6bEHXfcUe3SAADGTdoAuHv37ti4cWN0dXWN7JswYUJ0dXVFb2/vPn9mcHAwyuXyqA0AoNakvQv4T3/6U+zduzfa2tpG7W9ra4vNmzfv82dWr14dPT09+zgyNSKmjVOlAADFStsB/GesXLkyBgYGRratW7dWuyQAgHctbQfwgAMOiIkTJ0Z/f/+o/f39/dHe3r7PnymVSlEqlfZThQAA4yNtB7CpqSkWLlwYGzZsGNk3PDwcGzZsiM7OzqrWBgAwntJ2ACMiVqxYEeeee24sWrQoPvrRj8YNN9wQu3btivPPP/9dXmnqWxsAwL++1AHwc5/7XOzYsSNWrVoVfX19ccwxx8RDDz30jhtDAADqSUOlUqlUu4haVS6Xo7W1NWJgY0SLu4ABoCiV+M/jdu23v78HBgaipaVl3N7nX1nqDmBxPAYGAKgdaW8CAQDISgAEAEjGCLgQU9wFDADUDB1AAIBkBEAAgGQEQACAZKwBLMQ0j4EBAGqGDiAAQDICIABAMkbARfg/EyMaJ1a7CgCoH5OrXUB90wEEAEhGAAQASMYIuAh/jWgwAQaA4hgBjysdQACAZARAAIBkBEAAgGSsASzCGxHRUO0iAKCOHFDtAuqbDiAAQDICIABAMkbARfirKA0A1A6xBQAgGQEQACAZI+Ai7Kp2AQAAY6cDCACQjAAIAJCMAAgAkIw1gEWwBhAAqCE6gAAAyQiAAADJGAEXYVdEVKpdBADA2OgAAgAkIwACACQjAAIAJCMAAgAkIwACACQjAAIAJOMxMEXYORyVoeFqVwEAdUSPajz5dAEAkhEAAQCSMQIuQnlvxJ691a4CAOqIHtV48ukCACQjAAIAJGMEXISdRsAAUKzGahdQ13QAAQCSEQABAJIRAAEAkrEGsAg790bstgYQAKgNOoAAAMkIgAAAyRgBF+ENI2AAoHboAAIAJCMAAgAkYwRchJ1D0dA0VO0qAADGRAcQACCZugyAL7/8cixdujTmz58fkydPjsMOOyyuvPLK2L1796jznn322TjppJOiubk5Ojo64tprr61azQAA+0tdjoA3b94cw8PDceutt8b73//+2LRpUyxbtix27doV1113XURElMvlOP3006OrqyvWrVsXzz33XFxwwQUxY8aMuPDCC6v9KwAAjJuGSqVSqXYR+8N3v/vdWLt2bbz00ksREbF27dq44ooroq+vL5qamiIi4vLLL4/7778/Nm/ePKZrlsvlaG1tjfiv/zsaGqePa/0AkMnwT+aM27Xf/v4eGBiIlpaWcXuff2V1OQLel4GBgZg1a9bI697e3jj55JNHwl9ExOLFi2PLli3x2muvValKAIDxlyIAvvjii3HzzTfHl770pZF9fX190dbWNuq8t1/39fXt8zqDg4NRLpdHbQAAtaam1gBefvnlcc011/zDc37/+9/HggULRl5v27YtPvnJT8ZZZ50Vy5Yte0/vv3r16ujp6XnngTf2Rkzyl0AAgNpQU2sAd+zYEX/+85//4TmHHnroyFh3+/btccopp8QJJ5wQP/jBD2LChH9veH7xi1+Mcrkc999//8i+xx57LE477bT4y1/+EjNnznzHtQcHB2NwcHDkdblcjo6OjohT/xANk6wBBICiDD/cPm7XtgawxjqAc+bMiTlzxrYodNu2bXHqqafGwoULY/369aPCX0REZ2dnXHHFFbFnz55obGyMiIhHHnkkjjjiiH2Gv4iIUqkUpVKpgN8EAKB6aioAjtW2bdvilFNOiUMOOSSuu+662LFjx8ix9vb/9y+Ks88+O3p6emLp0qVx2WWXxaZNm+LGG2+MNWvWvPs3NAIGAGpIXQbARx55JF588cV48cUXY968eaOOvT3xbm1tjYcffji6u7tj4cKFccABB8SqVas8AxAAqHs1tQbwX83IcwCP+701gABQoOFf/adxu7Y1gEkeAwMAwL+ryxHwfvfXvRETrQEEAGqDDiAAQDICIABAMkbARdi1N2KCETAAUBt0AAEAkhEAAQCSMQIughEwAFBDdAABAJIRAAEAkhEAAQCSEQABAJIRAAEAkhEAAQCS8RiYIry5N6JhqNpVAACMiQ4gAEAyAiAAQDJGwEX465ARMABQM3QAAQCSEQABAJIxAi5A496haDACBgBqhA4gAEAyAiAAQDICIABAMtYAFqA5hqIhrAEEAGqDDiAAQDICIABAMkbABSjF3phgBAwA1AgdQACAZARAAIBkjIAL0BxDRsAAQM3QAQQASEYABABIRgAEAEjGGsACNMVQTKxYAwgA1AYdQACAZARAAIBkjIALUIqhmOgxMABAjdABBABIRgAEAEjGCLgARsAAQC3RAQQASEYABABIRgAEAEjGGsACNMbemGQNIABQI3QAAQCSEQABAJIxAi5AUwwZAQMANUMHEAAgGQEQACAZI+ACGAEDALVEBxAAIBkBEAAgGQEQACAZawALMCmGotEaQACgRugAAgAkU/cBcHBwMI455phoaGiIZ555ZtSxZ599Nk466aRobm6Ojo6OuPbaa6tWJwDA/lL3I+BLL7005s6dG7/73e9G7S+Xy3H66adHV1dXrFu3Lp577rm44IILYsaMGXHhhRe+q/dojL1GwABAzajrAPjggw/Gww8/HD/5yU/iwQcfHHXsrrvuit27d8cdd9wRTU1N8YEPfCCeeeaZuP766991AAQAqCV1OwLu7++PZcuWxY9+9KOYMmXKO4739vbGySefHE1NTSP7Fi9eHFu2bInXXnttn9ccHByMcrk8agMAqDV12QGsVCpx3nnnxZe//OVYtGhRvPzyy+84p6+vL+bPnz9qX1tb28ixmTNnvuNnVq9eHT09Pe/Y/z8HPhctLS2F/g4AAOOlpjqAl19+eTQ0NPzDbfPmzXHzzTfHzp07Y+XKlYW+/8qVK2NgYGBk27p1a6HXBwDYH2qqA/j1r389zjvvvH94zqGHHhqPPvpo9Pb2RqlUGnVs0aJFcc4558Sdd94Z7e3t0d/fP+r426/b29v3ee1SqfSOawIA1JqaCoBz5syJOXPm/Ifn3XTTTXHVVVeNvN6+fXssXrw47rnnnjj++OMjIqKzszOuuOKK2LNnTzQ2NkZExCOPPBJHHHHEPse/AAD1oqYC4FgdfPDBo15PmzYtIiIOO+ywmDdvXkREnH322dHT0xNLly6Nyy67LDZt2hQ33nhjrFmzpio1AwDsL3UZAMeitbU1Hn744eju7o6FCxfGAQccEKtWrfIIGACg7jVUKpVKtYuoVeVyOVpbW2NgYMBdwABQI3x/19hdwAAAvHcCIABAMgIgAEAyAiAAQDICIABAMgIgAEAyAiAAQDICIABAMgIgAEAyaf8UXBHe/iMq5XK52qUAAGP09vd25j+GJgC+Bzt37oyIiI6OjmqXAgC8Szt37ozW1tZql1EV/hbwezA8PBzbt2+P6dOnR0NDQ7XLAQDGoFKpxM6dO2Pu3LkxYULO1XACIABAMjljLwBAYgIgAEAyAiAAQDICIABAMgIgAEAyAiAAQDICIABAMgIgAEAyAiAAQDICIABAMgIgAEAyAiAAQDICIABAMgIgAEAyAiAAQDICIABAMgIgAEAyAiAAQDICIABAMgIgAEAyAiAAQDICIABAMgIgAEAyAiAAQDICIABAMgIgAEAyAiAAQDICIABAMgIgAEAyAiAAQDICIABAMgIgAEAyAiAAQDICIABAMgIgAEAyAiAAQDICIABAMgIgAEAyAiAAQDICIABAMgIgAEAyAiAAQDICIABAMgIgAEAyAiAAQDICIABAMgIgAEAyAiAAQDICIABAMgIgAEAy/xdOvzqG8oXciwAAAABJRU5ErkJggg==", + "text/html": [ + "\n", + "
\n", + "
\n", + " Figure\n", + "
\n", + " \n", + "
\n", + " " + ], + "text/plain": [ + "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "%matplotlib ipympl\n", + "\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "\n", + "fig, ax = plt.subplots()\n", + "ax.axes.get_xaxis().set_visible(False)\n", + "ax.barh(temp_x, temp_height, color=list(color_list), align='edge', height=1)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "id": "5f0ba609-0885-42d3-9c6c-a1f3921aa5d7", + "metadata": {}, + "outputs": [], + "source": [ + "plt.close()" + ] + }, + { + "cell_type": "markdown", + "id": "7d242bca-18b1-4548-8118-c82110b56b57", + "metadata": {}, + "source": [ + "## Exporting" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "id": "9f338b99-a190-4025-8491-388094ced8f2", + "metadata": {}, + "outputs": [], + "source": [ + "# os.chdir(pwd)\n", + "\n", + "with open(\"color-scale-rgb.ts\", \"w+\") as f:\n", + " f.write(\"export default \")\n", + " f.write(json.dumps(hsl_list))\n", + "\n", + "with open(\"color-scale-hsl.ts\", \"w+\") as f:\n", + " f.write(\"export default \")\n", + " f.write(json.dumps(rgb_list))\n", + " \n", + "with open(\"color-scale-hex.ts\", \"w+\") as f:\n", + " f.write(\"export default \")\n", + " f.write(json.dumps(hex_list))" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.13.2" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/src/routes/weather/utils/weather-codes.ts b/src/routes/weather/utils/weather-codes.ts new file mode 100644 index 0000000..0ad67eb --- /dev/null +++ b/src/routes/weather/utils/weather-codes.ts @@ -0,0 +1,81 @@ +export default { + 0: 'clear', + 1: 'clear', + 2: 'cloudy', + 3: 'cloudy', + 4: 'fog', + 5: 'fog', + 10: 'fog', + 11: 'fog', + 12: 'lightning', + 18: 'strong-wind', + 20: 'fog', + 21: 'rain-mix', + 22: 'rain-mix', + 23: 'rain', + 24: 'snow', + 25: 'hail', + 26: 'thunderstorm', + 27: 'dust', + 28: 'dust', + 29: 'dust', + 30: 'fog', + 31: 'fog', + 32: 'fog', + 33: 'fog', + 34: 'fog', + 35: 'fog', + 40: 'rain-mix', + 41: 'sprinkle', + 42: 'rain', + 43: 'sprinkle', + 44: 'rain', + 45: 'hail', + 46: 'hail', + 47: 'snow', + 48: 'snow', + 50: 'sprinkle', + 51: 'sprinkle', + 52: 'rain', + 53: 'rain', + 54: 'snowflake-cold', + 55: 'snowflake-cold', + 56: 'snowflake-cold', + 57: 'sprinkle', + 58: 'rain', + 60: 'sprinkle', + 61: 'sprinkle', + 62: 'rain', + 63: 'rain', + 64: 'hail', + 65: 'hail', + 66: 'hail', + 67: 'rain-mix', + 68: 'rain-mix', + 70: 'snow', + 71: 'snow', + 72: 'snow', + 73: 'snow', + 74: 'snowflake-cold', + 75: 'snowflake-cold', + 76: 'snowflake-cold', + 77: 'snow', + 78: 'snowflake-cold', + 80: 'rain', + 81: 'sprinkle', + 82: 'rain', + 83: 'rain', + 84: 'storm-showers', + 85: 'rain-mix', + 86: 'rain-mix', + 87: 'rain-mix', + 89: 'hail', + 90: 'lightning', + 91: 'storm-showers', + 92: 'thunderstorm', + 93: 'thunderstorm', + 94: 'lightning', + 95: 'thunderstorm', + 96: 'thunderstorm', + 99: 'tornado' +}; diff --git a/src/routes/weather/week/+layout.ts b/src/routes/weather/week/+layout.ts new file mode 100644 index 0000000..ed0a534 --- /dev/null +++ b/src/routes/weather/week/+layout.ts @@ -0,0 +1,14 @@ +import { get } from 'svelte/store'; + +import { storedLocation } from '$lib/stores/settings'; + +import type { LayoutLoad } from './$types'; + +const location = get(storedLocation); + +export const load: LayoutLoad = async () => { + return { + heroTitle: `Weather Week ${location.name}`, + heroDescription: location.admin1 ?? '' + ' ' + location.country + }; +}; diff --git a/src/routes/weather/week/+page.svelte b/src/routes/weather/week/+page.svelte new file mode 100644 index 0000000..e69de29 diff --git a/src/routes/weather/week/+page.ts b/src/routes/weather/week/+page.ts new file mode 100644 index 0000000..db701ca --- /dev/null +++ b/src/routes/weather/week/+page.ts @@ -0,0 +1,25 @@ +import { get } from 'svelte/store'; + +import { redirect } from '@sveltejs/kit'; + +import { storedLocation } from '$lib/stores/settings'; + +import { geoLocationNameToRoute } from '$lib/utils/meteo'; + +import type { PageLoad } from '$types'; + +export const prerender = true; + +export const load = (async (event) => { + const location = get(storedLocation); + const locationRoute = geoLocationNameToRoute(location.name); + throw redirect( + 303, + '/en/weather/week/' + + (location.population + ? location.population > 543000 + ? locationRoute + : locationRoute + '_' + location.id + : locationRoute + '_' + location.id) + ); +}) satisfies PageLoad; diff --git a/src/routes/weather/week/[location]/+page.svelte b/src/routes/weather/week/[location]/+page.svelte new file mode 100644 index 0000000..3cb5c75 --- /dev/null +++ b/src/routes/weather/week/[location]/+page.svelte @@ -0,0 +1,9 @@ + + +

+ {location ? location.name : ''}, population: {location.population} +

diff --git a/src/routes/weather/week/[location]/+page.ts b/src/routes/weather/week/[location]/+page.ts new file mode 100644 index 0000000..c1867cc --- /dev/null +++ b/src/routes/weather/week/[location]/+page.ts @@ -0,0 +1,77 @@ +import { error, redirect } from '@sveltejs/kit'; + +import { type GeoLocation, storedLocation } from '$lib/stores/settings'; + +import { geoLocationNameToRoute } from '$lib/utils/meteo'; + +import type { PageLoad } from '$types'; + +export const prerender = true; + +export const load = (async (event) => { + const urlLocation = event.params.location; + let urlLocationSplit, urlLocationName, urlLocationId; + + if (urlLocation.includes('_')) { + urlLocationSplit = urlLocation.split('_'); + urlLocationName = urlLocationSplit[0]; + urlLocationId = urlLocationSplit[1]; + } else if (/^\d+$/.test(urlLocation)) { + // only numbers in location, must be geonames id + urlLocationName = ''; + urlLocationId = urlLocation; + } else if (/^[a-zA-Z]/.test(urlLocation)) { + // only letters in location, must be geonames query + urlLocationName = urlLocation; + urlLocationId = undefined; + } + + let location: GeoLocation; + + // lat, long coordinates + if (urlLocation.includes('N') && urlLocation.includes('E')) { + urlLocationSplit = urlLocation.split(/N|E/); + const latitude = urlLocationSplit[0]; + const longitude = urlLocationSplit[1]; + + location = { + //id: undefined, + name: `${latitude}N° ${longitude}E°`, + latitude: latitude, + longitude: longitude + }; + } else { + if (urlLocationId) { + const res = await event.fetch( + `https://geocoding-api.open-meteo.com/v1/get?id=${urlLocationId}` + ); + location = await res.json(); + } else { + const res = await event.fetch( + `https://geocoding-api.open-meteo.com/v1/search?name=${urlLocationName}&count=1&language=en&format=json` + ); + const geocodingResponse = await res.json(); + if (geocodingResponse.results) { + location = geocodingResponse.results[0]; + } else { + error(404, 'Location not found'); + } + } + + const locationRoute = geoLocationNameToRoute(location.name); + + if (location.population && location.population > 543000) { + // 1000 biggest cities + if (event.url.pathname !== `/en/weather/week/${locationRoute}`) { + throw redirect(303, `/en/weather/week/${locationRoute}`); + } + } else { + if (event.url.pathname !== `/en/weather/week/${locationRoute + '_' + location.id}`) { + throw redirect(303, `/en/weather/week/${locationRoute + '_' + location.id}`); + } + } + } + + storedLocation.set(location); + return { location: location }; +}) satisfies PageLoad; diff --git a/static/images/weather-icons/wi-alien.svg b/static/images/weather-icons/wi-alien.svg new file mode 100644 index 0000000..e9c0226 --- /dev/null +++ b/static/images/weather-icons/wi-alien.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/static/images/weather-icons/wi-barometer.svg b/static/images/weather-icons/wi-barometer.svg new file mode 100644 index 0000000..ced7e29 --- /dev/null +++ b/static/images/weather-icons/wi-barometer.svg @@ -0,0 +1,15 @@ + + + + + diff --git a/static/images/weather-icons/wi-celsius.svg b/static/images/weather-icons/wi-celsius.svg new file mode 100644 index 0000000..31dc639 --- /dev/null +++ b/static/images/weather-icons/wi-celsius.svg @@ -0,0 +1,18 @@ + + + + + diff --git a/static/images/weather-icons/wi-cloud-down.svg b/static/images/weather-icons/wi-cloud-down.svg new file mode 100644 index 0000000..dcd6678 --- /dev/null +++ b/static/images/weather-icons/wi-cloud-down.svg @@ -0,0 +1,18 @@ + + + + + diff --git a/static/images/weather-icons/wi-cloud-refresh.svg b/static/images/weather-icons/wi-cloud-refresh.svg new file mode 100644 index 0000000..3f3888f --- /dev/null +++ b/static/images/weather-icons/wi-cloud-refresh.svg @@ -0,0 +1,21 @@ + + + + + diff --git a/static/images/weather-icons/wi-cloud-up.svg b/static/images/weather-icons/wi-cloud-up.svg new file mode 100644 index 0000000..bff0317 --- /dev/null +++ b/static/images/weather-icons/wi-cloud-up.svg @@ -0,0 +1,18 @@ + + + + + diff --git a/static/images/weather-icons/wi-cloud.svg b/static/images/weather-icons/wi-cloud.svg new file mode 100644 index 0000000..fa77599 --- /dev/null +++ b/static/images/weather-icons/wi-cloud.svg @@ -0,0 +1,13 @@ + + + + + diff --git a/static/images/weather-icons/wi-cloudy-gusts.svg b/static/images/weather-icons/wi-cloudy-gusts.svg new file mode 100644 index 0000000..4300a1c --- /dev/null +++ b/static/images/weather-icons/wi-cloudy-gusts.svg @@ -0,0 +1,22 @@ + + + + + diff --git a/static/images/weather-icons/wi-cloudy-windy.svg b/static/images/weather-icons/wi-cloudy-windy.svg new file mode 100644 index 0000000..013929c --- /dev/null +++ b/static/images/weather-icons/wi-cloudy-windy.svg @@ -0,0 +1,19 @@ + + + + + diff --git a/static/images/weather-icons/wi-cloudy.svg b/static/images/weather-icons/wi-cloudy.svg new file mode 100644 index 0000000..c3eaf41 --- /dev/null +++ b/static/images/weather-icons/wi-cloudy.svg @@ -0,0 +1,18 @@ + + + + + diff --git a/static/images/weather-icons/wi-day-clear.svg b/static/images/weather-icons/wi-day-clear.svg new file mode 100644 index 0000000..eafcd77 --- /dev/null +++ b/static/images/weather-icons/wi-day-clear.svg @@ -0,0 +1,27 @@ + + + + + diff --git a/static/images/weather-icons/wi-day-cloudy-gusts.svg b/static/images/weather-icons/wi-day-cloudy-gusts.svg new file mode 100644 index 0000000..287acc9 --- /dev/null +++ b/static/images/weather-icons/wi-day-cloudy-gusts.svg @@ -0,0 +1,35 @@ + + + + + diff --git a/static/images/weather-icons/wi-day-cloudy-high.svg b/static/images/weather-icons/wi-day-cloudy-high.svg new file mode 100644 index 0000000..81649a0 --- /dev/null +++ b/static/images/weather-icons/wi-day-cloudy-high.svg @@ -0,0 +1,26 @@ + + + + + diff --git a/static/images/weather-icons/wi-day-cloudy-windy.svg b/static/images/weather-icons/wi-day-cloudy-windy.svg new file mode 100644 index 0000000..d1a49bf --- /dev/null +++ b/static/images/weather-icons/wi-day-cloudy-windy.svg @@ -0,0 +1,33 @@ + + + + + diff --git a/static/images/weather-icons/wi-day-cloudy.svg b/static/images/weather-icons/wi-day-cloudy.svg new file mode 100644 index 0000000..cf63543 --- /dev/null +++ b/static/images/weather-icons/wi-day-cloudy.svg @@ -0,0 +1,26 @@ + + + + + diff --git a/static/images/weather-icons/wi-day-fog.svg b/static/images/weather-icons/wi-day-fog.svg new file mode 100644 index 0000000..3da78ca --- /dev/null +++ b/static/images/weather-icons/wi-day-fog.svg @@ -0,0 +1,31 @@ + + + + + diff --git a/static/images/weather-icons/wi-day-hail.svg b/static/images/weather-icons/wi-day-hail.svg new file mode 100644 index 0000000..b813a6f --- /dev/null +++ b/static/images/weather-icons/wi-day-hail.svg @@ -0,0 +1,42 @@ + + + + + diff --git a/static/images/weather-icons/wi-day-haze.svg b/static/images/weather-icons/wi-day-haze.svg new file mode 100644 index 0000000..e19bf13 --- /dev/null +++ b/static/images/weather-icons/wi-day-haze.svg @@ -0,0 +1,33 @@ + + + + + diff --git a/static/images/weather-icons/wi-day-light-wind.svg b/static/images/weather-icons/wi-day-light-wind.svg new file mode 100644 index 0000000..535c6a4 --- /dev/null +++ b/static/images/weather-icons/wi-day-light-wind.svg @@ -0,0 +1,32 @@ + + + + + diff --git a/static/images/weather-icons/wi-day-lightning.svg b/static/images/weather-icons/wi-day-lightning.svg new file mode 100644 index 0000000..18413ed --- /dev/null +++ b/static/images/weather-icons/wi-day-lightning.svg @@ -0,0 +1,29 @@ + + + + + diff --git a/static/images/weather-icons/wi-day-rain-mix.svg b/static/images/weather-icons/wi-day-rain-mix.svg new file mode 100644 index 0000000..8a5582d --- /dev/null +++ b/static/images/weather-icons/wi-day-rain-mix.svg @@ -0,0 +1,49 @@ + + + + + diff --git a/static/images/weather-icons/wi-day-rain-wind.svg b/static/images/weather-icons/wi-day-rain-wind.svg new file mode 100644 index 0000000..db5b02b --- /dev/null +++ b/static/images/weather-icons/wi-day-rain-wind.svg @@ -0,0 +1,40 @@ + + + + + diff --git a/static/images/weather-icons/wi-day-rain.svg b/static/images/weather-icons/wi-day-rain.svg new file mode 100644 index 0000000..12b1219 --- /dev/null +++ b/static/images/weather-icons/wi-day-rain.svg @@ -0,0 +1,35 @@ + + + + + diff --git a/static/images/weather-icons/wi-day-showers.svg b/static/images/weather-icons/wi-day-showers.svg new file mode 100644 index 0000000..cd0cb0a --- /dev/null +++ b/static/images/weather-icons/wi-day-showers.svg @@ -0,0 +1,43 @@ + + + + + diff --git a/static/images/weather-icons/wi-day-sleet-storm.svg b/static/images/weather-icons/wi-day-sleet-storm.svg new file mode 100644 index 0000000..a7ff6e6 --- /dev/null +++ b/static/images/weather-icons/wi-day-sleet-storm.svg @@ -0,0 +1,40 @@ + + + + + diff --git a/static/images/weather-icons/wi-day-sleet.svg b/static/images/weather-icons/wi-day-sleet.svg new file mode 100644 index 0000000..42df1df --- /dev/null +++ b/static/images/weather-icons/wi-day-sleet.svg @@ -0,0 +1,46 @@ + + + + + diff --git a/static/images/weather-icons/wi-day-snow-thunderstorm.svg b/static/images/weather-icons/wi-day-snow-thunderstorm.svg new file mode 100644 index 0000000..b1e3f20 --- /dev/null +++ b/static/images/weather-icons/wi-day-snow-thunderstorm.svg @@ -0,0 +1,37 @@ + + + + + diff --git a/static/images/weather-icons/wi-day-snow-wind.svg b/static/images/weather-icons/wi-day-snow-wind.svg new file mode 100644 index 0000000..6a632dc --- /dev/null +++ b/static/images/weather-icons/wi-day-snow-wind.svg @@ -0,0 +1,40 @@ + + + + + diff --git a/static/images/weather-icons/wi-day-snow.svg b/static/images/weather-icons/wi-day-snow.svg new file mode 100644 index 0000000..c1f1c71 --- /dev/null +++ b/static/images/weather-icons/wi-day-snow.svg @@ -0,0 +1,40 @@ + + + + + diff --git a/static/images/weather-icons/wi-day-sprinkle.svg b/static/images/weather-icons/wi-day-sprinkle.svg new file mode 100644 index 0000000..5294fca --- /dev/null +++ b/static/images/weather-icons/wi-day-sprinkle.svg @@ -0,0 +1,33 @@ + + + + + diff --git a/static/images/weather-icons/wi-day-storm-showers.svg b/static/images/weather-icons/wi-day-storm-showers.svg new file mode 100644 index 0000000..0166299 --- /dev/null +++ b/static/images/weather-icons/wi-day-storm-showers.svg @@ -0,0 +1,38 @@ + + + + + diff --git a/static/images/weather-icons/wi-day-sunny-overcast.svg b/static/images/weather-icons/wi-day-sunny-overcast.svg new file mode 100644 index 0000000..4873b05 --- /dev/null +++ b/static/images/weather-icons/wi-day-sunny-overcast.svg @@ -0,0 +1,29 @@ + + + + + diff --git a/static/images/weather-icons/wi-day-sunny.svg b/static/images/weather-icons/wi-day-sunny.svg new file mode 100644 index 0000000..eafcd77 --- /dev/null +++ b/static/images/weather-icons/wi-day-sunny.svg @@ -0,0 +1,27 @@ + + + + + diff --git a/static/images/weather-icons/wi-day-thunderstorm.svg b/static/images/weather-icons/wi-day-thunderstorm.svg new file mode 100644 index 0000000..006a8e5 --- /dev/null +++ b/static/images/weather-icons/wi-day-thunderstorm.svg @@ -0,0 +1,34 @@ + + + + + diff --git a/static/images/weather-icons/wi-day-windy.svg b/static/images/weather-icons/wi-day-windy.svg new file mode 100644 index 0000000..ea09d42 --- /dev/null +++ b/static/images/weather-icons/wi-day-windy.svg @@ -0,0 +1,36 @@ + + + + + diff --git a/static/images/weather-icons/wi-degrees.svg b/static/images/weather-icons/wi-degrees.svg new file mode 100644 index 0000000..ba3de70 --- /dev/null +++ b/static/images/weather-icons/wi-degrees.svg @@ -0,0 +1,10 @@ + + + + + diff --git a/static/images/weather-icons/wi-direction-down-left.svg b/static/images/weather-icons/wi-direction-down-left.svg new file mode 100644 index 0000000..e5a46ff --- /dev/null +++ b/static/images/weather-icons/wi-direction-down-left.svg @@ -0,0 +1,10 @@ + + + + + diff --git a/static/images/weather-icons/wi-direction-down-right.svg b/static/images/weather-icons/wi-direction-down-right.svg new file mode 100644 index 0000000..ecf35cc --- /dev/null +++ b/static/images/weather-icons/wi-direction-down-right.svg @@ -0,0 +1,9 @@ + + + + + diff --git a/static/images/weather-icons/wi-direction-down.svg b/static/images/weather-icons/wi-direction-down.svg new file mode 100644 index 0000000..17d7048 --- /dev/null +++ b/static/images/weather-icons/wi-direction-down.svg @@ -0,0 +1,9 @@ + + + + + diff --git a/static/images/weather-icons/wi-direction-left.svg b/static/images/weather-icons/wi-direction-left.svg new file mode 100644 index 0000000..bf3f5be --- /dev/null +++ b/static/images/weather-icons/wi-direction-left.svg @@ -0,0 +1,9 @@ + + + + + diff --git a/static/images/weather-icons/wi-direction-right.svg b/static/images/weather-icons/wi-direction-right.svg new file mode 100644 index 0000000..8f02b00 --- /dev/null +++ b/static/images/weather-icons/wi-direction-right.svg @@ -0,0 +1,10 @@ + + + + + diff --git a/static/images/weather-icons/wi-direction-up-left.svg b/static/images/weather-icons/wi-direction-up-left.svg new file mode 100644 index 0000000..884b611 --- /dev/null +++ b/static/images/weather-icons/wi-direction-up-left.svg @@ -0,0 +1,9 @@ + + + + + diff --git a/static/images/weather-icons/wi-direction-up-right.svg b/static/images/weather-icons/wi-direction-up-right.svg new file mode 100644 index 0000000..45d8f72 --- /dev/null +++ b/static/images/weather-icons/wi-direction-up-right.svg @@ -0,0 +1,9 @@ + + + + + diff --git a/static/images/weather-icons/wi-direction-up.svg b/static/images/weather-icons/wi-direction-up.svg new file mode 100644 index 0000000..668a152 --- /dev/null +++ b/static/images/weather-icons/wi-direction-up.svg @@ -0,0 +1,9 @@ + + + + + diff --git a/static/images/weather-icons/wi-dust.svg b/static/images/weather-icons/wi-dust.svg new file mode 100644 index 0000000..aa90229 --- /dev/null +++ b/static/images/weather-icons/wi-dust.svg @@ -0,0 +1,31 @@ + + + + + diff --git a/static/images/weather-icons/wi-earthquake.svg b/static/images/weather-icons/wi-earthquake.svg new file mode 100644 index 0000000..c7c752d --- /dev/null +++ b/static/images/weather-icons/wi-earthquake.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/static/images/weather-icons/wi-fahrenheit.svg b/static/images/weather-icons/wi-fahrenheit.svg new file mode 100644 index 0000000..dffa947 --- /dev/null +++ b/static/images/weather-icons/wi-fahrenheit.svg @@ -0,0 +1,13 @@ + + + + + diff --git a/static/images/weather-icons/wi-fire.svg b/static/images/weather-icons/wi-fire.svg new file mode 100644 index 0000000..33b0502 --- /dev/null +++ b/static/images/weather-icons/wi-fire.svg @@ -0,0 +1,22 @@ + + + + + diff --git a/static/images/weather-icons/wi-flood.svg b/static/images/weather-icons/wi-flood.svg new file mode 100644 index 0000000..48e218e --- /dev/null +++ b/static/images/weather-icons/wi-flood.svg @@ -0,0 +1,22 @@ + + + + + diff --git a/static/images/weather-icons/wi-fog.svg b/static/images/weather-icons/wi-fog.svg new file mode 100644 index 0000000..cf06f8f --- /dev/null +++ b/static/images/weather-icons/wi-fog.svg @@ -0,0 +1,18 @@ + + + + + diff --git a/static/images/weather-icons/wi-gale-warning.svg b/static/images/weather-icons/wi-gale-warning.svg new file mode 100644 index 0000000..5e2f40d --- /dev/null +++ b/static/images/weather-icons/wi-gale-warning.svg @@ -0,0 +1,6 @@ + + + + + diff --git a/static/images/weather-icons/wi-hail.svg b/static/images/weather-icons/wi-hail.svg new file mode 100644 index 0000000..26c4b0d --- /dev/null +++ b/static/images/weather-icons/wi-hail.svg @@ -0,0 +1,30 @@ + + + + + diff --git a/static/images/weather-icons/wi-horizon-alt.svg b/static/images/weather-icons/wi-horizon-alt.svg new file mode 100644 index 0000000..ff423f3 --- /dev/null +++ b/static/images/weather-icons/wi-horizon-alt.svg @@ -0,0 +1,24 @@ + + + + + diff --git a/static/images/weather-icons/wi-horizon.svg b/static/images/weather-icons/wi-horizon.svg new file mode 100644 index 0000000..feef2ef --- /dev/null +++ b/static/images/weather-icons/wi-horizon.svg @@ -0,0 +1,17 @@ + + + + + diff --git a/static/images/weather-icons/wi-hot.svg b/static/images/weather-icons/wi-hot.svg new file mode 100644 index 0000000..66faa3a --- /dev/null +++ b/static/images/weather-icons/wi-hot.svg @@ -0,0 +1,56 @@ + + + + + diff --git a/static/images/weather-icons/wi-humidity.svg b/static/images/weather-icons/wi-humidity.svg new file mode 100644 index 0000000..9c75750 --- /dev/null +++ b/static/images/weather-icons/wi-humidity.svg @@ -0,0 +1,23 @@ + + + + + diff --git a/static/images/weather-icons/wi-hurricane-warning.svg b/static/images/weather-icons/wi-hurricane-warning.svg new file mode 100644 index 0000000..1365a44 --- /dev/null +++ b/static/images/weather-icons/wi-hurricane-warning.svg @@ -0,0 +1,7 @@ + + + + + diff --git a/static/images/weather-icons/wi-hurricane.svg b/static/images/weather-icons/wi-hurricane.svg new file mode 100644 index 0000000..3d2b4fd --- /dev/null +++ b/static/images/weather-icons/wi-hurricane.svg @@ -0,0 +1,17 @@ + + + + + diff --git a/static/images/weather-icons/wi-lightning.svg b/static/images/weather-icons/wi-lightning.svg new file mode 100644 index 0000000..0709cf3 --- /dev/null +++ b/static/images/weather-icons/wi-lightning.svg @@ -0,0 +1,9 @@ + + + + + diff --git a/static/images/weather-icons/wi-lunar-eclipse.svg b/static/images/weather-icons/wi-lunar-eclipse.svg new file mode 100644 index 0000000..7e86183 --- /dev/null +++ b/static/images/weather-icons/wi-lunar-eclipse.svg @@ -0,0 +1,11 @@ + + + + + diff --git a/static/images/weather-icons/wi-meteor.svg b/static/images/weather-icons/wi-meteor.svg new file mode 100644 index 0000000..4da65ab --- /dev/null +++ b/static/images/weather-icons/wi-meteor.svg @@ -0,0 +1,17 @@ + + + + + diff --git a/static/images/weather-icons/wi-moon-alt-first-quarter.svg b/static/images/weather-icons/wi-moon-alt-first-quarter.svg new file mode 100644 index 0000000..26d9400 --- /dev/null +++ b/static/images/weather-icons/wi-moon-alt-first-quarter.svg @@ -0,0 +1,10 @@ + + + + + diff --git a/static/images/weather-icons/wi-moon-alt-full.svg b/static/images/weather-icons/wi-moon-alt-full.svg new file mode 100644 index 0000000..20fd7b4 --- /dev/null +++ b/static/images/weather-icons/wi-moon-alt-full.svg @@ -0,0 +1,11 @@ + + + + + diff --git a/static/images/weather-icons/wi-moon-alt-new.svg b/static/images/weather-icons/wi-moon-alt-new.svg new file mode 100644 index 0000000..75b89ac --- /dev/null +++ b/static/images/weather-icons/wi-moon-alt-new.svg @@ -0,0 +1,8 @@ + + + + + diff --git a/static/images/weather-icons/wi-moon-alt-third-quarter.svg b/static/images/weather-icons/wi-moon-alt-third-quarter.svg new file mode 100644 index 0000000..964d559 --- /dev/null +++ b/static/images/weather-icons/wi-moon-alt-third-quarter.svg @@ -0,0 +1,10 @@ + + + + + diff --git a/static/images/weather-icons/wi-moon-alt-waning-crescent-1.svg b/static/images/weather-icons/wi-moon-alt-waning-crescent-1.svg new file mode 100644 index 0000000..5e7d3a4 --- /dev/null +++ b/static/images/weather-icons/wi-moon-alt-waning-crescent-1.svg @@ -0,0 +1,10 @@ + + + + + diff --git a/static/images/weather-icons/wi-moon-alt-waning-crescent-2.svg b/static/images/weather-icons/wi-moon-alt-waning-crescent-2.svg new file mode 100644 index 0000000..8386927 --- /dev/null +++ b/static/images/weather-icons/wi-moon-alt-waning-crescent-2.svg @@ -0,0 +1,10 @@ + + + + + diff --git a/static/images/weather-icons/wi-moon-alt-waning-crescent-3.svg b/static/images/weather-icons/wi-moon-alt-waning-crescent-3.svg new file mode 100644 index 0000000..aa2b4db --- /dev/null +++ b/static/images/weather-icons/wi-moon-alt-waning-crescent-3.svg @@ -0,0 +1,10 @@ + + + + + diff --git a/static/images/weather-icons/wi-moon-alt-waning-crescent-4.svg b/static/images/weather-icons/wi-moon-alt-waning-crescent-4.svg new file mode 100644 index 0000000..bb09c26 --- /dev/null +++ b/static/images/weather-icons/wi-moon-alt-waning-crescent-4.svg @@ -0,0 +1,11 @@ + + + + + diff --git a/static/images/weather-icons/wi-moon-alt-waning-crescent-5.svg b/static/images/weather-icons/wi-moon-alt-waning-crescent-5.svg new file mode 100644 index 0000000..0f5b9be --- /dev/null +++ b/static/images/weather-icons/wi-moon-alt-waning-crescent-5.svg @@ -0,0 +1,11 @@ + + + + + diff --git a/static/images/weather-icons/wi-moon-alt-waning-crescent-6.svg b/static/images/weather-icons/wi-moon-alt-waning-crescent-6.svg new file mode 100644 index 0000000..ff23247 --- /dev/null +++ b/static/images/weather-icons/wi-moon-alt-waning-crescent-6.svg @@ -0,0 +1,11 @@ + + + + + diff --git a/static/images/weather-icons/wi-moon-alt-waning-gibbous-1.svg b/static/images/weather-icons/wi-moon-alt-waning-gibbous-1.svg new file mode 100644 index 0000000..4e7a6f6 --- /dev/null +++ b/static/images/weather-icons/wi-moon-alt-waning-gibbous-1.svg @@ -0,0 +1,11 @@ + + + + + diff --git a/static/images/weather-icons/wi-moon-alt-waning-gibbous-2.svg b/static/images/weather-icons/wi-moon-alt-waning-gibbous-2.svg new file mode 100644 index 0000000..0a363af --- /dev/null +++ b/static/images/weather-icons/wi-moon-alt-waning-gibbous-2.svg @@ -0,0 +1,12 @@ + + + + + diff --git a/static/images/weather-icons/wi-moon-alt-waning-gibbous-3.svg b/static/images/weather-icons/wi-moon-alt-waning-gibbous-3.svg new file mode 100644 index 0000000..a8df601 --- /dev/null +++ b/static/images/weather-icons/wi-moon-alt-waning-gibbous-3.svg @@ -0,0 +1,12 @@ + + + + + diff --git a/static/images/weather-icons/wi-moon-alt-waning-gibbous-4.svg b/static/images/weather-icons/wi-moon-alt-waning-gibbous-4.svg new file mode 100644 index 0000000..8df81ae --- /dev/null +++ b/static/images/weather-icons/wi-moon-alt-waning-gibbous-4.svg @@ -0,0 +1,11 @@ + + + + + diff --git a/static/images/weather-icons/wi-moon-alt-waning-gibbous-5.svg b/static/images/weather-icons/wi-moon-alt-waning-gibbous-5.svg new file mode 100644 index 0000000..9a0354e --- /dev/null +++ b/static/images/weather-icons/wi-moon-alt-waning-gibbous-5.svg @@ -0,0 +1,11 @@ + + + + + diff --git a/static/images/weather-icons/wi-moon-alt-waning-gibbous-6.svg b/static/images/weather-icons/wi-moon-alt-waning-gibbous-6.svg new file mode 100644 index 0000000..fffae24 --- /dev/null +++ b/static/images/weather-icons/wi-moon-alt-waning-gibbous-6.svg @@ -0,0 +1,10 @@ + + + + + diff --git a/static/images/weather-icons/wi-moon-alt-waxing-crescent-1.svg b/static/images/weather-icons/wi-moon-alt-waxing-crescent-1.svg new file mode 100644 index 0000000..a6516f9 --- /dev/null +++ b/static/images/weather-icons/wi-moon-alt-waxing-crescent-1.svg @@ -0,0 +1,10 @@ + + + + + diff --git a/static/images/weather-icons/wi-moon-alt-waxing-crescent-2.svg b/static/images/weather-icons/wi-moon-alt-waxing-crescent-2.svg new file mode 100644 index 0000000..696ea78 --- /dev/null +++ b/static/images/weather-icons/wi-moon-alt-waxing-crescent-2.svg @@ -0,0 +1,10 @@ + + + + + diff --git a/static/images/weather-icons/wi-moon-alt-waxing-crescent-3.svg b/static/images/weather-icons/wi-moon-alt-waxing-crescent-3.svg new file mode 100644 index 0000000..6aff9d5 --- /dev/null +++ b/static/images/weather-icons/wi-moon-alt-waxing-crescent-3.svg @@ -0,0 +1,10 @@ + + + + + diff --git a/static/images/weather-icons/wi-moon-alt-waxing-crescent-4.svg b/static/images/weather-icons/wi-moon-alt-waxing-crescent-4.svg new file mode 100644 index 0000000..b5ef2bc --- /dev/null +++ b/static/images/weather-icons/wi-moon-alt-waxing-crescent-4.svg @@ -0,0 +1,10 @@ + + + + + diff --git a/static/images/weather-icons/wi-moon-alt-waxing-crescent-5.svg b/static/images/weather-icons/wi-moon-alt-waxing-crescent-5.svg new file mode 100644 index 0000000..e6cb75d --- /dev/null +++ b/static/images/weather-icons/wi-moon-alt-waxing-crescent-5.svg @@ -0,0 +1,10 @@ + + + + + diff --git a/static/images/weather-icons/wi-moon-alt-waxing-crescent-6.svg b/static/images/weather-icons/wi-moon-alt-waxing-crescent-6.svg new file mode 100644 index 0000000..8677cc4 --- /dev/null +++ b/static/images/weather-icons/wi-moon-alt-waxing-crescent-6.svg @@ -0,0 +1,10 @@ + + + + + diff --git a/static/images/weather-icons/wi-moon-alt-waxing-gibbous-1.svg b/static/images/weather-icons/wi-moon-alt-waxing-gibbous-1.svg new file mode 100644 index 0000000..41be53a --- /dev/null +++ b/static/images/weather-icons/wi-moon-alt-waxing-gibbous-1.svg @@ -0,0 +1,11 @@ + + + + + diff --git a/static/images/weather-icons/wi-moon-alt-waxing-gibbous-2.svg b/static/images/weather-icons/wi-moon-alt-waxing-gibbous-2.svg new file mode 100644 index 0000000..cc6c51d --- /dev/null +++ b/static/images/weather-icons/wi-moon-alt-waxing-gibbous-2.svg @@ -0,0 +1,11 @@ + + + + + diff --git a/static/images/weather-icons/wi-moon-alt-waxing-gibbous-3.svg b/static/images/weather-icons/wi-moon-alt-waxing-gibbous-3.svg new file mode 100644 index 0000000..2c969dc --- /dev/null +++ b/static/images/weather-icons/wi-moon-alt-waxing-gibbous-3.svg @@ -0,0 +1,11 @@ + + + + + diff --git a/static/images/weather-icons/wi-moon-alt-waxing-gibbous-4.svg b/static/images/weather-icons/wi-moon-alt-waxing-gibbous-4.svg new file mode 100644 index 0000000..4db9816 --- /dev/null +++ b/static/images/weather-icons/wi-moon-alt-waxing-gibbous-4.svg @@ -0,0 +1,11 @@ + + + + + diff --git a/static/images/weather-icons/wi-moon-alt-waxing-gibbous-5.svg b/static/images/weather-icons/wi-moon-alt-waxing-gibbous-5.svg new file mode 100644 index 0000000..68df9e6 --- /dev/null +++ b/static/images/weather-icons/wi-moon-alt-waxing-gibbous-5.svg @@ -0,0 +1,11 @@ + + + + + diff --git a/static/images/weather-icons/wi-moon-alt-waxing-gibbous-6.svg b/static/images/weather-icons/wi-moon-alt-waxing-gibbous-6.svg new file mode 100644 index 0000000..17ac239 --- /dev/null +++ b/static/images/weather-icons/wi-moon-alt-waxing-gibbous-6.svg @@ -0,0 +1,12 @@ + + + + + diff --git a/static/images/weather-icons/wi-moon-first-quarter.svg b/static/images/weather-icons/wi-moon-first-quarter.svg new file mode 100644 index 0000000..22ba6c6 --- /dev/null +++ b/static/images/weather-icons/wi-moon-first-quarter.svg @@ -0,0 +1,7 @@ + + + + + diff --git a/static/images/weather-icons/wi-moon-full.svg b/static/images/weather-icons/wi-moon-full.svg new file mode 100644 index 0000000..75b89ac --- /dev/null +++ b/static/images/weather-icons/wi-moon-full.svg @@ -0,0 +1,8 @@ + + + + + diff --git a/static/images/weather-icons/wi-moon-new.svg b/static/images/weather-icons/wi-moon-new.svg new file mode 100644 index 0000000..20fd7b4 --- /dev/null +++ b/static/images/weather-icons/wi-moon-new.svg @@ -0,0 +1,11 @@ + + + + + diff --git a/static/images/weather-icons/wi-moon-third-quarter.svg b/static/images/weather-icons/wi-moon-third-quarter.svg new file mode 100644 index 0000000..031a231 --- /dev/null +++ b/static/images/weather-icons/wi-moon-third-quarter.svg @@ -0,0 +1,7 @@ + + + + + diff --git a/static/images/weather-icons/wi-moon-waning-crescent-1.svg b/static/images/weather-icons/wi-moon-waning-crescent-1.svg new file mode 100644 index 0000000..7ae5d02 --- /dev/null +++ b/static/images/weather-icons/wi-moon-waning-crescent-1.svg @@ -0,0 +1,7 @@ + + + + + diff --git a/static/images/weather-icons/wi-moon-waning-crescent-2.svg b/static/images/weather-icons/wi-moon-waning-crescent-2.svg new file mode 100644 index 0000000..6e8ed9c --- /dev/null +++ b/static/images/weather-icons/wi-moon-waning-crescent-2.svg @@ -0,0 +1,7 @@ + + + + + diff --git a/static/images/weather-icons/wi-moon-waning-crescent-3.svg b/static/images/weather-icons/wi-moon-waning-crescent-3.svg new file mode 100644 index 0000000..b2224d0 --- /dev/null +++ b/static/images/weather-icons/wi-moon-waning-crescent-3.svg @@ -0,0 +1,7 @@ + + + + + diff --git a/static/images/weather-icons/wi-moon-waning-crescent-4.svg b/static/images/weather-icons/wi-moon-waning-crescent-4.svg new file mode 100644 index 0000000..c5f85fd --- /dev/null +++ b/static/images/weather-icons/wi-moon-waning-crescent-4.svg @@ -0,0 +1,8 @@ + + + + + diff --git a/static/images/weather-icons/wi-moon-waning-crescent-5.svg b/static/images/weather-icons/wi-moon-waning-crescent-5.svg new file mode 100644 index 0000000..350c227 --- /dev/null +++ b/static/images/weather-icons/wi-moon-waning-crescent-5.svg @@ -0,0 +1,8 @@ + + + + + diff --git a/static/images/weather-icons/wi-moon-waning-crescent-6.svg b/static/images/weather-icons/wi-moon-waning-crescent-6.svg new file mode 100644 index 0000000..e3fb6e7 --- /dev/null +++ b/static/images/weather-icons/wi-moon-waning-crescent-6.svg @@ -0,0 +1,9 @@ + + + + + diff --git a/static/images/weather-icons/wi-moon-waning-gibbous-1.svg b/static/images/weather-icons/wi-moon-waning-gibbous-1.svg new file mode 100644 index 0000000..ae14407 --- /dev/null +++ b/static/images/weather-icons/wi-moon-waning-gibbous-1.svg @@ -0,0 +1,8 @@ + + + + + diff --git a/static/images/weather-icons/wi-moon-waning-gibbous-2.svg b/static/images/weather-icons/wi-moon-waning-gibbous-2.svg new file mode 100644 index 0000000..558ba54 --- /dev/null +++ b/static/images/weather-icons/wi-moon-waning-gibbous-2.svg @@ -0,0 +1,8 @@ + + + + + diff --git a/static/images/weather-icons/wi-moon-waning-gibbous-3.svg b/static/images/weather-icons/wi-moon-waning-gibbous-3.svg new file mode 100644 index 0000000..17924cf --- /dev/null +++ b/static/images/weather-icons/wi-moon-waning-gibbous-3.svg @@ -0,0 +1,8 @@ + + + + + diff --git a/static/images/weather-icons/wi-moon-waning-gibbous-4.svg b/static/images/weather-icons/wi-moon-waning-gibbous-4.svg new file mode 100644 index 0000000..2e4c400 --- /dev/null +++ b/static/images/weather-icons/wi-moon-waning-gibbous-4.svg @@ -0,0 +1,8 @@ + + + + + diff --git a/static/images/weather-icons/wi-moon-waning-gibbous-5.svg b/static/images/weather-icons/wi-moon-waning-gibbous-5.svg new file mode 100644 index 0000000..db387c5 --- /dev/null +++ b/static/images/weather-icons/wi-moon-waning-gibbous-5.svg @@ -0,0 +1,7 @@ + + + + + diff --git a/static/images/weather-icons/wi-moon-waning-gibbous-6.svg b/static/images/weather-icons/wi-moon-waning-gibbous-6.svg new file mode 100644 index 0000000..edcc9d6 --- /dev/null +++ b/static/images/weather-icons/wi-moon-waning-gibbous-6.svg @@ -0,0 +1,7 @@ + + + + + diff --git a/static/images/weather-icons/wi-moon-waxing-6.svg b/static/images/weather-icons/wi-moon-waxing-6.svg new file mode 100644 index 0000000..6e9af39 --- /dev/null +++ b/static/images/weather-icons/wi-moon-waxing-6.svg @@ -0,0 +1,7 @@ + + + + + diff --git a/static/images/weather-icons/wi-moon-waxing-crescent-1.svg b/static/images/weather-icons/wi-moon-waxing-crescent-1.svg new file mode 100644 index 0000000..f510a0d --- /dev/null +++ b/static/images/weather-icons/wi-moon-waxing-crescent-1.svg @@ -0,0 +1,9 @@ + + + + + diff --git a/static/images/weather-icons/wi-moon-waxing-crescent-2.svg b/static/images/weather-icons/wi-moon-waxing-crescent-2.svg new file mode 100644 index 0000000..6b86718 --- /dev/null +++ b/static/images/weather-icons/wi-moon-waxing-crescent-2.svg @@ -0,0 +1,8 @@ + + + + + diff --git a/static/images/weather-icons/wi-moon-waxing-crescent-3.svg b/static/images/weather-icons/wi-moon-waxing-crescent-3.svg new file mode 100644 index 0000000..8560f6b --- /dev/null +++ b/static/images/weather-icons/wi-moon-waxing-crescent-3.svg @@ -0,0 +1,8 @@ + + + + + diff --git a/static/images/weather-icons/wi-moon-waxing-crescent-4.svg b/static/images/weather-icons/wi-moon-waxing-crescent-4.svg new file mode 100644 index 0000000..5f78502 --- /dev/null +++ b/static/images/weather-icons/wi-moon-waxing-crescent-4.svg @@ -0,0 +1,8 @@ + + + + + diff --git a/static/images/weather-icons/wi-moon-waxing-crescent-5.svg b/static/images/weather-icons/wi-moon-waxing-crescent-5.svg new file mode 100644 index 0000000..6e9af39 --- /dev/null +++ b/static/images/weather-icons/wi-moon-waxing-crescent-5.svg @@ -0,0 +1,7 @@ + + + + + diff --git a/static/images/weather-icons/wi-moon-waxing-gibbous-1.svg b/static/images/weather-icons/wi-moon-waxing-gibbous-1.svg new file mode 100644 index 0000000..1de651a --- /dev/null +++ b/static/images/weather-icons/wi-moon-waxing-gibbous-1.svg @@ -0,0 +1,7 @@ + + + + + diff --git a/static/images/weather-icons/wi-moon-waxing-gibbous-2.svg b/static/images/weather-icons/wi-moon-waxing-gibbous-2.svg new file mode 100644 index 0000000..842d4ac --- /dev/null +++ b/static/images/weather-icons/wi-moon-waxing-gibbous-2.svg @@ -0,0 +1,7 @@ + + + + + diff --git a/static/images/weather-icons/wi-moon-waxing-gibbous-3.svg b/static/images/weather-icons/wi-moon-waxing-gibbous-3.svg new file mode 100644 index 0000000..9f77ce3 --- /dev/null +++ b/static/images/weather-icons/wi-moon-waxing-gibbous-3.svg @@ -0,0 +1,8 @@ + + + + + diff --git a/static/images/weather-icons/wi-moon-waxing-gibbous-4.svg b/static/images/weather-icons/wi-moon-waxing-gibbous-4.svg new file mode 100644 index 0000000..e472de6 --- /dev/null +++ b/static/images/weather-icons/wi-moon-waxing-gibbous-4.svg @@ -0,0 +1,8 @@ + + + + + diff --git a/static/images/weather-icons/wi-moon-waxing-gibbous-5.svg b/static/images/weather-icons/wi-moon-waxing-gibbous-5.svg new file mode 100644 index 0000000..90860cb --- /dev/null +++ b/static/images/weather-icons/wi-moon-waxing-gibbous-5.svg @@ -0,0 +1,8 @@ + + + + + diff --git a/static/images/weather-icons/wi-moon-waxing-gibbous-6.svg b/static/images/weather-icons/wi-moon-waxing-gibbous-6.svg new file mode 100644 index 0000000..53f9b9e --- /dev/null +++ b/static/images/weather-icons/wi-moon-waxing-gibbous-6.svg @@ -0,0 +1,8 @@ + + + + + diff --git a/static/images/weather-icons/wi-moonrise.svg b/static/images/weather-icons/wi-moonrise.svg new file mode 100644 index 0000000..5d7ddb0 --- /dev/null +++ b/static/images/weather-icons/wi-moonrise.svg @@ -0,0 +1,13 @@ + + + + + diff --git a/static/images/weather-icons/wi-moonset.svg b/static/images/weather-icons/wi-moonset.svg new file mode 100644 index 0000000..d78fa29 --- /dev/null +++ b/static/images/weather-icons/wi-moonset.svg @@ -0,0 +1,14 @@ + + + + + diff --git a/static/images/weather-icons/wi-na.svg b/static/images/weather-icons/wi-na.svg new file mode 100644 index 0000000..0a3d369 --- /dev/null +++ b/static/images/weather-icons/wi-na.svg @@ -0,0 +1,8 @@ + + + + + diff --git a/static/images/weather-icons/wi-night-alt-cloudy-gusts.svg b/static/images/weather-icons/wi-night-alt-cloudy-gusts.svg new file mode 100644 index 0000000..0453d3c --- /dev/null +++ b/static/images/weather-icons/wi-night-alt-cloudy-gusts.svg @@ -0,0 +1,28 @@ + + + + + diff --git a/static/images/weather-icons/wi-night-alt-cloudy-high.svg b/static/images/weather-icons/wi-night-alt-cloudy-high.svg new file mode 100644 index 0000000..6b1777b --- /dev/null +++ b/static/images/weather-icons/wi-night-alt-cloudy-high.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/static/images/weather-icons/wi-night-alt-cloudy-windy.svg b/static/images/weather-icons/wi-night-alt-cloudy-windy.svg new file mode 100644 index 0000000..f6a291e --- /dev/null +++ b/static/images/weather-icons/wi-night-alt-cloudy-windy.svg @@ -0,0 +1,25 @@ + + + + + diff --git a/static/images/weather-icons/wi-night-alt-cloudy.svg b/static/images/weather-icons/wi-night-alt-cloudy.svg new file mode 100644 index 0000000..fcd1496 --- /dev/null +++ b/static/images/weather-icons/wi-night-alt-cloudy.svg @@ -0,0 +1,19 @@ + + + + + diff --git a/static/images/weather-icons/wi-night-alt-hail.svg b/static/images/weather-icons/wi-night-alt-hail.svg new file mode 100644 index 0000000..38550e4 --- /dev/null +++ b/static/images/weather-icons/wi-night-alt-hail.svg @@ -0,0 +1,34 @@ + + + + + diff --git a/static/images/weather-icons/wi-night-alt-lightning.svg b/static/images/weather-icons/wi-night-alt-lightning.svg new file mode 100644 index 0000000..f01d745 --- /dev/null +++ b/static/images/weather-icons/wi-night-alt-lightning.svg @@ -0,0 +1,21 @@ + + + + + diff --git a/static/images/weather-icons/wi-night-alt-partly-cloudy.svg b/static/images/weather-icons/wi-night-alt-partly-cloudy.svg new file mode 100644 index 0000000..2b36834 --- /dev/null +++ b/static/images/weather-icons/wi-night-alt-partly-cloudy.svg @@ -0,0 +1,19 @@ + + + + + diff --git a/static/images/weather-icons/wi-night-alt-rain-mix.svg b/static/images/weather-icons/wi-night-alt-rain-mix.svg new file mode 100644 index 0000000..4ce81bc --- /dev/null +++ b/static/images/weather-icons/wi-night-alt-rain-mix.svg @@ -0,0 +1,42 @@ + + + + + diff --git a/static/images/weather-icons/wi-night-alt-rain-wind.svg b/static/images/weather-icons/wi-night-alt-rain-wind.svg new file mode 100644 index 0000000..f90a680 --- /dev/null +++ b/static/images/weather-icons/wi-night-alt-rain-wind.svg @@ -0,0 +1,32 @@ + + + + + diff --git a/static/images/weather-icons/wi-night-alt-rain.svg b/static/images/weather-icons/wi-night-alt-rain.svg new file mode 100644 index 0000000..b4d8065 --- /dev/null +++ b/static/images/weather-icons/wi-night-alt-rain.svg @@ -0,0 +1,27 @@ + + + + + diff --git a/static/images/weather-icons/wi-night-alt-showers.svg b/static/images/weather-icons/wi-night-alt-showers.svg new file mode 100644 index 0000000..dd917e0 --- /dev/null +++ b/static/images/weather-icons/wi-night-alt-showers.svg @@ -0,0 +1,34 @@ + + + + + diff --git a/static/images/weather-icons/wi-night-alt-sleet-storm.svg b/static/images/weather-icons/wi-night-alt-sleet-storm.svg new file mode 100644 index 0000000..afd111d --- /dev/null +++ b/static/images/weather-icons/wi-night-alt-sleet-storm.svg @@ -0,0 +1,32 @@ + + + + + diff --git a/static/images/weather-icons/wi-night-alt-sleet.svg b/static/images/weather-icons/wi-night-alt-sleet.svg new file mode 100644 index 0000000..3fbdd15 --- /dev/null +++ b/static/images/weather-icons/wi-night-alt-sleet.svg @@ -0,0 +1,38 @@ + + + + + diff --git a/static/images/weather-icons/wi-night-alt-snow-thunderstorm.svg b/static/images/weather-icons/wi-night-alt-snow-thunderstorm.svg new file mode 100644 index 0000000..304a7eb --- /dev/null +++ b/static/images/weather-icons/wi-night-alt-snow-thunderstorm.svg @@ -0,0 +1,30 @@ + + + + + diff --git a/static/images/weather-icons/wi-night-alt-snow-wind.svg b/static/images/weather-icons/wi-night-alt-snow-wind.svg new file mode 100644 index 0000000..f35566a --- /dev/null +++ b/static/images/weather-icons/wi-night-alt-snow-wind.svg @@ -0,0 +1,33 @@ + + + + + diff --git a/static/images/weather-icons/wi-night-alt-snow.svg b/static/images/weather-icons/wi-night-alt-snow.svg new file mode 100644 index 0000000..b314bdd --- /dev/null +++ b/static/images/weather-icons/wi-night-alt-snow.svg @@ -0,0 +1,32 @@ + + + + + diff --git a/static/images/weather-icons/wi-night-alt-sprinkle.svg b/static/images/weather-icons/wi-night-alt-sprinkle.svg new file mode 100644 index 0000000..47dfcb1 --- /dev/null +++ b/static/images/weather-icons/wi-night-alt-sprinkle.svg @@ -0,0 +1,26 @@ + + + + + diff --git a/static/images/weather-icons/wi-night-alt-storm-showers.svg b/static/images/weather-icons/wi-night-alt-storm-showers.svg new file mode 100644 index 0000000..6747df2 --- /dev/null +++ b/static/images/weather-icons/wi-night-alt-storm-showers.svg @@ -0,0 +1,31 @@ + + + + + diff --git a/static/images/weather-icons/wi-night-alt-thunderstorm.svg b/static/images/weather-icons/wi-night-alt-thunderstorm.svg new file mode 100644 index 0000000..0af7a15 --- /dev/null +++ b/static/images/weather-icons/wi-night-alt-thunderstorm.svg @@ -0,0 +1,25 @@ + + + + + diff --git a/static/images/weather-icons/wi-night-clear.svg b/static/images/weather-icons/wi-night-clear.svg new file mode 100644 index 0000000..053b2de --- /dev/null +++ b/static/images/weather-icons/wi-night-clear.svg @@ -0,0 +1,13 @@ + + + + + diff --git a/static/images/weather-icons/wi-night-cloudy-gusts.svg b/static/images/weather-icons/wi-night-cloudy-gusts.svg new file mode 100644 index 0000000..e502c48 --- /dev/null +++ b/static/images/weather-icons/wi-night-cloudy-gusts.svg @@ -0,0 +1,25 @@ + + + + + diff --git a/static/images/weather-icons/wi-night-cloudy-high.svg b/static/images/weather-icons/wi-night-cloudy-high.svg new file mode 100644 index 0000000..8235377 --- /dev/null +++ b/static/images/weather-icons/wi-night-cloudy-high.svg @@ -0,0 +1,17 @@ + + + + + diff --git a/static/images/weather-icons/wi-night-cloudy-windy.svg b/static/images/weather-icons/wi-night-cloudy-windy.svg new file mode 100644 index 0000000..3a6137a --- /dev/null +++ b/static/images/weather-icons/wi-night-cloudy-windy.svg @@ -0,0 +1,22 @@ + + + + + diff --git a/static/images/weather-icons/wi-night-cloudy.svg b/static/images/weather-icons/wi-night-cloudy.svg new file mode 100644 index 0000000..8b76dba --- /dev/null +++ b/static/images/weather-icons/wi-night-cloudy.svg @@ -0,0 +1,15 @@ + + + + + diff --git a/static/images/weather-icons/wi-night-fog.svg b/static/images/weather-icons/wi-night-fog.svg new file mode 100644 index 0000000..a895dac --- /dev/null +++ b/static/images/weather-icons/wi-night-fog.svg @@ -0,0 +1,22 @@ + + + + + diff --git a/static/images/weather-icons/wi-night-hail.svg b/static/images/weather-icons/wi-night-hail.svg new file mode 100644 index 0000000..249ed64 --- /dev/null +++ b/static/images/weather-icons/wi-night-hail.svg @@ -0,0 +1,32 @@ + + + + + diff --git a/static/images/weather-icons/wi-night-lightning.svg b/static/images/weather-icons/wi-night-lightning.svg new file mode 100644 index 0000000..55ac76e --- /dev/null +++ b/static/images/weather-icons/wi-night-lightning.svg @@ -0,0 +1,18 @@ + + + + + diff --git a/static/images/weather-icons/wi-night-partly-cloudy.svg b/static/images/weather-icons/wi-night-partly-cloudy.svg new file mode 100644 index 0000000..e4d2f99 --- /dev/null +++ b/static/images/weather-icons/wi-night-partly-cloudy.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/static/images/weather-icons/wi-night-rain-mix.svg b/static/images/weather-icons/wi-night-rain-mix.svg new file mode 100644 index 0000000..f5883d7 --- /dev/null +++ b/static/images/weather-icons/wi-night-rain-mix.svg @@ -0,0 +1,41 @@ + + + + + diff --git a/static/images/weather-icons/wi-night-rain-wind.svg b/static/images/weather-icons/wi-night-rain-wind.svg new file mode 100644 index 0000000..8d8ccf7 --- /dev/null +++ b/static/images/weather-icons/wi-night-rain-wind.svg @@ -0,0 +1,29 @@ + + + + + diff --git a/static/images/weather-icons/wi-night-rain.svg b/static/images/weather-icons/wi-night-rain.svg new file mode 100644 index 0000000..3d4e6dc --- /dev/null +++ b/static/images/weather-icons/wi-night-rain.svg @@ -0,0 +1,24 @@ + + + + + diff --git a/static/images/weather-icons/wi-night-showers.svg b/static/images/weather-icons/wi-night-showers.svg new file mode 100644 index 0000000..4829c81 --- /dev/null +++ b/static/images/weather-icons/wi-night-showers.svg @@ -0,0 +1,32 @@ + + + + + diff --git a/static/images/weather-icons/wi-night-sleet-storm.svg b/static/images/weather-icons/wi-night-sleet-storm.svg new file mode 100644 index 0000000..7638b54 --- /dev/null +++ b/static/images/weather-icons/wi-night-sleet-storm.svg @@ -0,0 +1,29 @@ + + + + + diff --git a/static/images/weather-icons/wi-night-sleet.svg b/static/images/weather-icons/wi-night-sleet.svg new file mode 100644 index 0000000..0ff3e36 --- /dev/null +++ b/static/images/weather-icons/wi-night-sleet.svg @@ -0,0 +1,34 @@ + + + + + diff --git a/static/images/weather-icons/wi-night-snow-thunderstorm.svg b/static/images/weather-icons/wi-night-snow-thunderstorm.svg new file mode 100644 index 0000000..ec98dd8 --- /dev/null +++ b/static/images/weather-icons/wi-night-snow-thunderstorm.svg @@ -0,0 +1,27 @@ + + + + + diff --git a/static/images/weather-icons/wi-night-snow-wind.svg b/static/images/weather-icons/wi-night-snow-wind.svg new file mode 100644 index 0000000..d34c39f --- /dev/null +++ b/static/images/weather-icons/wi-night-snow-wind.svg @@ -0,0 +1,29 @@ + + + + + diff --git a/static/images/weather-icons/wi-night-snow.svg b/static/images/weather-icons/wi-night-snow.svg new file mode 100644 index 0000000..c4bab74 --- /dev/null +++ b/static/images/weather-icons/wi-night-snow.svg @@ -0,0 +1,29 @@ + + + + + diff --git a/static/images/weather-icons/wi-night-sprinkle.svg b/static/images/weather-icons/wi-night-sprinkle.svg new file mode 100644 index 0000000..2793da3 --- /dev/null +++ b/static/images/weather-icons/wi-night-sprinkle.svg @@ -0,0 +1,23 @@ + + + + + diff --git a/static/images/weather-icons/wi-night-storm-showers.svg b/static/images/weather-icons/wi-night-storm-showers.svg new file mode 100644 index 0000000..1cf5202 --- /dev/null +++ b/static/images/weather-icons/wi-night-storm-showers.svg @@ -0,0 +1,28 @@ + + + + + diff --git a/static/images/weather-icons/wi-night-thunderstorm.svg b/static/images/weather-icons/wi-night-thunderstorm.svg new file mode 100644 index 0000000..b9541cb --- /dev/null +++ b/static/images/weather-icons/wi-night-thunderstorm.svg @@ -0,0 +1,22 @@ + + + + + diff --git a/static/images/weather-icons/wi-rain-mix.svg b/static/images/weather-icons/wi-rain-mix.svg new file mode 100644 index 0000000..51cf189 --- /dev/null +++ b/static/images/weather-icons/wi-rain-mix.svg @@ -0,0 +1,37 @@ + + + + + diff --git a/static/images/weather-icons/wi-rain-wind.svg b/static/images/weather-icons/wi-rain-wind.svg new file mode 100644 index 0000000..aef262a --- /dev/null +++ b/static/images/weather-icons/wi-rain-wind.svg @@ -0,0 +1,28 @@ + + + + + diff --git a/static/images/weather-icons/wi-rain.svg b/static/images/weather-icons/wi-rain.svg new file mode 100644 index 0000000..7ecef3f --- /dev/null +++ b/static/images/weather-icons/wi-rain.svg @@ -0,0 +1,23 @@ + + + + + diff --git a/static/images/weather-icons/wi-raindrop.svg b/static/images/weather-icons/wi-raindrop.svg new file mode 100644 index 0000000..d24aee4 --- /dev/null +++ b/static/images/weather-icons/wi-raindrop.svg @@ -0,0 +1,9 @@ + + + + + diff --git a/static/images/weather-icons/wi-raindrops.svg b/static/images/weather-icons/wi-raindrops.svg new file mode 100644 index 0000000..157ddf0 --- /dev/null +++ b/static/images/weather-icons/wi-raindrops.svg @@ -0,0 +1,13 @@ + + + + + diff --git a/static/images/weather-icons/wi-refresh-alt.svg b/static/images/weather-icons/wi-refresh-alt.svg new file mode 100644 index 0000000..33c9b18 --- /dev/null +++ b/static/images/weather-icons/wi-refresh-alt.svg @@ -0,0 +1,11 @@ + + + + + diff --git a/static/images/weather-icons/wi-refresh.svg b/static/images/weather-icons/wi-refresh.svg new file mode 100644 index 0000000..32e09a8 --- /dev/null +++ b/static/images/weather-icons/wi-refresh.svg @@ -0,0 +1,12 @@ + + + + + diff --git a/static/images/weather-icons/wi-sandstorm.svg b/static/images/weather-icons/wi-sandstorm.svg new file mode 100644 index 0000000..cbdad2a --- /dev/null +++ b/static/images/weather-icons/wi-sandstorm.svg @@ -0,0 +1,31 @@ + + + + + diff --git a/static/images/weather-icons/wi-showers.svg b/static/images/weather-icons/wi-showers.svg new file mode 100644 index 0000000..3cb7e31 --- /dev/null +++ b/static/images/weather-icons/wi-showers.svg @@ -0,0 +1,31 @@ + + + + + diff --git a/static/images/weather-icons/wi-sleet.svg b/static/images/weather-icons/wi-sleet.svg new file mode 100644 index 0000000..b97bc09 --- /dev/null +++ b/static/images/weather-icons/wi-sleet.svg @@ -0,0 +1,35 @@ + + + + + diff --git a/static/images/weather-icons/wi-small-craft-advisory.svg b/static/images/weather-icons/wi-small-craft-advisory.svg new file mode 100644 index 0000000..ab6f45e --- /dev/null +++ b/static/images/weather-icons/wi-small-craft-advisory.svg @@ -0,0 +1,6 @@ + + + + + diff --git a/static/images/weather-icons/wi-smog.svg b/static/images/weather-icons/wi-smog.svg new file mode 100644 index 0000000..a2f0d89 --- /dev/null +++ b/static/images/weather-icons/wi-smog.svg @@ -0,0 +1,13 @@ + + + + + diff --git a/static/images/weather-icons/wi-smoke.svg b/static/images/weather-icons/wi-smoke.svg new file mode 100644 index 0000000..82e8fdc --- /dev/null +++ b/static/images/weather-icons/wi-smoke.svg @@ -0,0 +1,17 @@ + + + + + diff --git a/static/images/weather-icons/wi-snow-wind.svg b/static/images/weather-icons/wi-snow-wind.svg new file mode 100644 index 0000000..950aeac --- /dev/null +++ b/static/images/weather-icons/wi-snow-wind.svg @@ -0,0 +1,27 @@ + + + + + diff --git a/static/images/weather-icons/wi-snow.svg b/static/images/weather-icons/wi-snow.svg new file mode 100644 index 0000000..56afebf --- /dev/null +++ b/static/images/weather-icons/wi-snow.svg @@ -0,0 +1,27 @@ + + + + + diff --git a/static/images/weather-icons/wi-snowflake-cold.svg b/static/images/weather-icons/wi-snowflake-cold.svg new file mode 100644 index 0000000..0f117b9 --- /dev/null +++ b/static/images/weather-icons/wi-snowflake-cold.svg @@ -0,0 +1,30 @@ + + + + + diff --git a/static/images/weather-icons/wi-solar-eclipse.svg b/static/images/weather-icons/wi-solar-eclipse.svg new file mode 100644 index 0000000..19c62a8 --- /dev/null +++ b/static/images/weather-icons/wi-solar-eclipse.svg @@ -0,0 +1,28 @@ + + + + + diff --git a/static/images/weather-icons/wi-sprinkle.svg b/static/images/weather-icons/wi-sprinkle.svg new file mode 100644 index 0000000..c26b207 --- /dev/null +++ b/static/images/weather-icons/wi-sprinkle.svg @@ -0,0 +1,20 @@ + + + + + diff --git a/static/images/weather-icons/wi-stars.svg b/static/images/weather-icons/wi-stars.svg new file mode 100644 index 0000000..76e7003 --- /dev/null +++ b/static/images/weather-icons/wi-stars.svg @@ -0,0 +1,15 @@ + + + + + diff --git a/static/images/weather-icons/wi-storm-showers.svg b/static/images/weather-icons/wi-storm-showers.svg new file mode 100644 index 0000000..df3fe0f --- /dev/null +++ b/static/images/weather-icons/wi-storm-showers.svg @@ -0,0 +1,26 @@ + + + + + diff --git a/static/images/weather-icons/wi-storm-warning.svg b/static/images/weather-icons/wi-storm-warning.svg new file mode 100644 index 0000000..db146c1 --- /dev/null +++ b/static/images/weather-icons/wi-storm-warning.svg @@ -0,0 +1,6 @@ + + + + + diff --git a/static/images/weather-icons/wi-strong-wind.svg b/static/images/weather-icons/wi-strong-wind.svg new file mode 100644 index 0000000..70dda9c --- /dev/null +++ b/static/images/weather-icons/wi-strong-wind.svg @@ -0,0 +1,15 @@ + + + + + diff --git a/static/images/weather-icons/wi-sunrise.svg b/static/images/weather-icons/wi-sunrise.svg new file mode 100644 index 0000000..5718ac3 --- /dev/null +++ b/static/images/weather-icons/wi-sunrise.svg @@ -0,0 +1,25 @@ + + + + + diff --git a/static/images/weather-icons/wi-sunset.svg b/static/images/weather-icons/wi-sunset.svg new file mode 100644 index 0000000..cc82902 --- /dev/null +++ b/static/images/weather-icons/wi-sunset.svg @@ -0,0 +1,25 @@ + + + + + diff --git a/static/images/weather-icons/wi-thermometer-exterior.svg b/static/images/weather-icons/wi-thermometer-exterior.svg new file mode 100644 index 0000000..e0d345d --- /dev/null +++ b/static/images/weather-icons/wi-thermometer-exterior.svg @@ -0,0 +1,12 @@ + + + + + diff --git a/static/images/weather-icons/wi-thermometer-internal.svg b/static/images/weather-icons/wi-thermometer-internal.svg new file mode 100644 index 0000000..b590a9f --- /dev/null +++ b/static/images/weather-icons/wi-thermometer-internal.svg @@ -0,0 +1,9 @@ + + + + + diff --git a/static/images/weather-icons/wi-thermometer.svg b/static/images/weather-icons/wi-thermometer.svg new file mode 100644 index 0000000..a0fa8d0 --- /dev/null +++ b/static/images/weather-icons/wi-thermometer.svg @@ -0,0 +1,15 @@ + + + + + diff --git a/static/images/weather-icons/wi-thunderstorm.svg b/static/images/weather-icons/wi-thunderstorm.svg new file mode 100644 index 0000000..52555ec --- /dev/null +++ b/static/images/weather-icons/wi-thunderstorm.svg @@ -0,0 +1,21 @@ + + + + + diff --git a/static/images/weather-icons/wi-time-1.svg b/static/images/weather-icons/wi-time-1.svg new file mode 100644 index 0000000..c5ea658 --- /dev/null +++ b/static/images/weather-icons/wi-time-1.svg @@ -0,0 +1,13 @@ + + + + + diff --git a/static/images/weather-icons/wi-time-10.svg b/static/images/weather-icons/wi-time-10.svg new file mode 100644 index 0000000..3a02d59 --- /dev/null +++ b/static/images/weather-icons/wi-time-10.svg @@ -0,0 +1,13 @@ + + + + + diff --git a/static/images/weather-icons/wi-time-11.svg b/static/images/weather-icons/wi-time-11.svg new file mode 100644 index 0000000..1625390 --- /dev/null +++ b/static/images/weather-icons/wi-time-11.svg @@ -0,0 +1,13 @@ + + + + + diff --git a/static/images/weather-icons/wi-time-12.svg b/static/images/weather-icons/wi-time-12.svg new file mode 100644 index 0000000..32cc7f0 --- /dev/null +++ b/static/images/weather-icons/wi-time-12.svg @@ -0,0 +1,12 @@ + + + + + diff --git a/static/images/weather-icons/wi-time-2.svg b/static/images/weather-icons/wi-time-2.svg new file mode 100644 index 0000000..9e874a3 --- /dev/null +++ b/static/images/weather-icons/wi-time-2.svg @@ -0,0 +1,13 @@ + + + + + diff --git a/static/images/weather-icons/wi-time-3.svg b/static/images/weather-icons/wi-time-3.svg new file mode 100644 index 0000000..5c0cd90 --- /dev/null +++ b/static/images/weather-icons/wi-time-3.svg @@ -0,0 +1,13 @@ + + + + + diff --git a/static/images/weather-icons/wi-time-4.svg b/static/images/weather-icons/wi-time-4.svg new file mode 100644 index 0000000..7dda4d2 --- /dev/null +++ b/static/images/weather-icons/wi-time-4.svg @@ -0,0 +1,13 @@ + + + + + diff --git a/static/images/weather-icons/wi-time-5.svg b/static/images/weather-icons/wi-time-5.svg new file mode 100644 index 0000000..fb8f8a5 --- /dev/null +++ b/static/images/weather-icons/wi-time-5.svg @@ -0,0 +1,13 @@ + + + + + diff --git a/static/images/weather-icons/wi-time-6.svg b/static/images/weather-icons/wi-time-6.svg new file mode 100644 index 0000000..8bbe6b0 --- /dev/null +++ b/static/images/weather-icons/wi-time-6.svg @@ -0,0 +1,12 @@ + + + + + diff --git a/static/images/weather-icons/wi-time-7.svg b/static/images/weather-icons/wi-time-7.svg new file mode 100644 index 0000000..079551e --- /dev/null +++ b/static/images/weather-icons/wi-time-7.svg @@ -0,0 +1,13 @@ + + + + + diff --git a/static/images/weather-icons/wi-time-8.svg b/static/images/weather-icons/wi-time-8.svg new file mode 100644 index 0000000..6d65af2 --- /dev/null +++ b/static/images/weather-icons/wi-time-8.svg @@ -0,0 +1,13 @@ + + + + + diff --git a/static/images/weather-icons/wi-time-9.svg b/static/images/weather-icons/wi-time-9.svg new file mode 100644 index 0000000..b1437c3 --- /dev/null +++ b/static/images/weather-icons/wi-time-9.svg @@ -0,0 +1,13 @@ + + + + + diff --git a/static/images/weather-icons/wi-tornado.svg b/static/images/weather-icons/wi-tornado.svg new file mode 100644 index 0000000..095ad95 --- /dev/null +++ b/static/images/weather-icons/wi-tornado.svg @@ -0,0 +1,25 @@ + + + + + diff --git a/static/images/weather-icons/wi-train.svg b/static/images/weather-icons/wi-train.svg new file mode 100644 index 0000000..ded2460 --- /dev/null +++ b/static/images/weather-icons/wi-train.svg @@ -0,0 +1,26 @@ + + + + + diff --git a/static/images/weather-icons/wi-tsunami.svg b/static/images/weather-icons/wi-tsunami.svg new file mode 100644 index 0000000..2044e99 --- /dev/null +++ b/static/images/weather-icons/wi-tsunami.svg @@ -0,0 +1,26 @@ + + + + + diff --git a/static/images/weather-icons/wi-umbrella.svg b/static/images/weather-icons/wi-umbrella.svg new file mode 100644 index 0000000..e125bca --- /dev/null +++ b/static/images/weather-icons/wi-umbrella.svg @@ -0,0 +1,23 @@ + + + + + diff --git a/static/images/weather-icons/wi-volcano.svg b/static/images/weather-icons/wi-volcano.svg new file mode 100644 index 0000000..cd8dcf3 --- /dev/null +++ b/static/images/weather-icons/wi-volcano.svg @@ -0,0 +1,23 @@ + + + + + diff --git a/static/images/weather-icons/wi-wind-beaufort-0.svg b/static/images/weather-icons/wi-wind-beaufort-0.svg new file mode 100644 index 0000000..7ec3dba --- /dev/null +++ b/static/images/weather-icons/wi-wind-beaufort-0.svg @@ -0,0 +1,21 @@ + + + + + diff --git a/static/images/weather-icons/wi-wind-beaufort-1.svg b/static/images/weather-icons/wi-wind-beaufort-1.svg new file mode 100644 index 0000000..2bab866 --- /dev/null +++ b/static/images/weather-icons/wi-wind-beaufort-1.svg @@ -0,0 +1,15 @@ + + + + + diff --git a/static/images/weather-icons/wi-wind-beaufort-10.svg b/static/images/weather-icons/wi-wind-beaufort-10.svg new file mode 100644 index 0000000..f1256c6 --- /dev/null +++ b/static/images/weather-icons/wi-wind-beaufort-10.svg @@ -0,0 +1,21 @@ + + + + + diff --git a/static/images/weather-icons/wi-wind-beaufort-11.svg b/static/images/weather-icons/wi-wind-beaufort-11.svg new file mode 100644 index 0000000..d209021 --- /dev/null +++ b/static/images/weather-icons/wi-wind-beaufort-11.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/static/images/weather-icons/wi-wind-beaufort-12.svg b/static/images/weather-icons/wi-wind-beaufort-12.svg new file mode 100644 index 0000000..0cbf35d --- /dev/null +++ b/static/images/weather-icons/wi-wind-beaufort-12.svg @@ -0,0 +1,21 @@ + + + + + diff --git a/static/images/weather-icons/wi-wind-beaufort-2.svg b/static/images/weather-icons/wi-wind-beaufort-2.svg new file mode 100644 index 0000000..740f2af --- /dev/null +++ b/static/images/weather-icons/wi-wind-beaufort-2.svg @@ -0,0 +1,21 @@ + + + + + diff --git a/static/images/weather-icons/wi-wind-beaufort-3.svg b/static/images/weather-icons/wi-wind-beaufort-3.svg new file mode 100644 index 0000000..165b116 --- /dev/null +++ b/static/images/weather-icons/wi-wind-beaufort-3.svg @@ -0,0 +1,22 @@ + + + + + diff --git a/static/images/weather-icons/wi-wind-beaufort-4.svg b/static/images/weather-icons/wi-wind-beaufort-4.svg new file mode 100644 index 0000000..c2143d4 --- /dev/null +++ b/static/images/weather-icons/wi-wind-beaufort-4.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/static/images/weather-icons/wi-wind-beaufort-5.svg b/static/images/weather-icons/wi-wind-beaufort-5.svg new file mode 100644 index 0000000..fc34ea4 --- /dev/null +++ b/static/images/weather-icons/wi-wind-beaufort-5.svg @@ -0,0 +1,20 @@ + + + + + diff --git a/static/images/weather-icons/wi-wind-beaufort-6.svg b/static/images/weather-icons/wi-wind-beaufort-6.svg new file mode 100644 index 0000000..e6471f4 --- /dev/null +++ b/static/images/weather-icons/wi-wind-beaufort-6.svg @@ -0,0 +1,23 @@ + + + + + diff --git a/static/images/weather-icons/wi-wind-beaufort-7.svg b/static/images/weather-icons/wi-wind-beaufort-7.svg new file mode 100644 index 0000000..f77fcec --- /dev/null +++ b/static/images/weather-icons/wi-wind-beaufort-7.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/static/images/weather-icons/wi-wind-beaufort-8.svg b/static/images/weather-icons/wi-wind-beaufort-8.svg new file mode 100644 index 0000000..5f08fed --- /dev/null +++ b/static/images/weather-icons/wi-wind-beaufort-8.svg @@ -0,0 +1,26 @@ + + + + + diff --git a/static/images/weather-icons/wi-wind-beaufort-9.svg b/static/images/weather-icons/wi-wind-beaufort-9.svg new file mode 100644 index 0000000..41b7d41 --- /dev/null +++ b/static/images/weather-icons/wi-wind-beaufort-9.svg @@ -0,0 +1,23 @@ + + + + + diff --git a/static/images/weather-icons/wi-wind-deg.svg b/static/images/weather-icons/wi-wind-deg.svg new file mode 100644 index 0000000..3007410 --- /dev/null +++ b/static/images/weather-icons/wi-wind-deg.svg @@ -0,0 +1,12 @@ + + + + + diff --git a/static/images/weather-icons/wi-windy.svg b/static/images/weather-icons/wi-windy.svg new file mode 100644 index 0000000..de5488a --- /dev/null +++ b/static/images/weather-icons/wi-windy.svg @@ -0,0 +1,14 @@ + + + + + diff --git a/static/robots.txt b/static/robots.txt new file mode 100644 index 0000000..b6dd667 --- /dev/null +++ b/static/robots.txt @@ -0,0 +1,3 @@ +# allow crawling everything by default +User-agent: * +Disallow: diff --git a/svelte.config.js b/svelte.config.js new file mode 100644 index 0000000..0487b76 --- /dev/null +++ b/svelte.config.js @@ -0,0 +1,13 @@ +import adapter from '@sveltejs/adapter-static'; +import { vitePreprocess } from '@sveltejs/vite-plugin-svelte'; + +/** @type {import('@sveltejs/kit').Config} */ +const config = { + // Consult https://svelte.dev/docs/kit/integrations + // for more information about preprocessors + preprocess: vitePreprocess(), + + kit: { adapter: adapter() } +}; + +export default config; diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..2c2ed3c --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,20 @@ +{ + "extends": "./.svelte-kit/tsconfig.json", + "compilerOptions": { + "rewriteRelativeImportExtensions": true, + "allowJs": true, + "checkJs": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "sourceMap": true, + "strict": true, + "moduleResolution": "bundler" + } + // Path aliases are handled by https://svelte.dev/docs/kit/configuration#alias + // except $lib which is handled by https://svelte.dev/docs/kit/configuration#files + // + // To make changes to top-level options such as include and exclude, we recommend extending + // the generated config; see https://svelte.dev/docs/kit/configuration#typescript +} diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 0000000..5a478a5 --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,42 @@ +import tailwindcss from '@tailwindcss/vite'; +import { defineConfig } from 'vitest/config'; +import { playwright } from '@vitest/browser-playwright'; +import { sveltekit } from '@sveltejs/kit/vite'; + +export default defineConfig({ + plugins: [tailwindcss(), sveltekit()], + + test: { + expect: { requireAssertions: true }, + + projects: [ + { + extends: './vite.config.ts', + + test: { + name: 'client', + + browser: { + enabled: true, + provider: playwright(), + instances: [{ browser: 'chromium', headless: true }] + }, + + include: ['src/**/*.svelte.{test,spec}.{js,ts}'], + exclude: ['src/lib/server/**'] + } + }, + + { + extends: './vite.config.ts', + + test: { + name: 'server', + environment: 'node', + include: ['src/**/*.{test,spec}.{js,ts}'], + exclude: ['src/**/*.svelte.{test,spec}.{js,ts}'] + } + } + ] + } +});