aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--app.py31
-rw-r--r--src/app.py72
-rw-r--r--src/forms.py (renamed from forms.py)4
-rw-r--r--src/library.py (renamed from library.py)24
-rwxr-xr-xsrc/run.sh2
-rw-r--r--src/static/icons/backup/celsius.svg (renamed from static/icons/backup/celsius.svg)0
-rw-r--r--src/static/icons/backup/fahrenheit.svg (renamed from static/icons/backup/fahrenheit.svg)0
-rw-r--r--src/static/icons/backup/fog.svg (renamed from static/icons/backup/fog.svg)0
-rw-r--r--src/static/icons/backup/hail.svg (renamed from static/icons/backup/hail.svg)0
-rw-r--r--src/static/icons/backup/hazy.svg (renamed from static/icons/backup/hazy.svg)0
-rw-r--r--src/static/icons/backup/humidity.svg (renamed from static/icons/backup/humidity.svg)0
-rw-r--r--src/static/icons/backup/lightning-rainy.svg (renamed from static/icons/backup/lightning-rainy.svg)0
-rw-r--r--src/static/icons/backup/lightning.svg (renamed from static/icons/backup/lightning.svg)0
-rw-r--r--src/static/icons/backup/night-clear.svg (renamed from static/icons/backup/night-clear.svg)0
-rw-r--r--src/static/icons/backup/night-partly-cloudy.svg (renamed from static/icons/backup/night-partly-cloudy.svg)0
-rw-r--r--src/static/icons/backup/partly-cloudy.svg (renamed from static/icons/backup/partly-cloudy.svg)0
-rw-r--r--src/static/icons/backup/partly-rainy.svg (renamed from static/icons/backup/partly-rainy.svg)0
-rw-r--r--src/static/icons/backup/partly-snowy-rainy.svg (renamed from static/icons/backup/partly-snowy-rainy.svg)0
-rw-r--r--src/static/icons/backup/pouring.svg (renamed from static/icons/backup/pouring.svg)0
-rw-r--r--src/static/icons/backup/snow.svg (renamed from static/icons/backup/snow.svg)0
-rw-r--r--src/static/icons/backup/snowy-heavy.svg (renamed from static/icons/backup/snowy-heavy.svg)0
-rw-r--r--src/static/icons/backup/snowy.svg (renamed from static/icons/backup/snowy.svg)0
-rw-r--r--src/static/icons/backup/sunny.svg (renamed from static/icons/backup/sunny.svg)0
-rw-r--r--src/static/icons/backup/sunrise.svg (renamed from static/icons/backup/sunrise.svg)0
-rw-r--r--src/static/icons/backup/sunset.svg (renamed from static/icons/backup/sunset.svg)0
-rw-r--r--src/static/icons/backup/thermometer.svg (renamed from static/icons/backup/thermometer.svg)0
-rw-r--r--src/static/icons/backup/water-percent.svg (renamed from static/icons/backup/water-percent.svg)0
-rw-r--r--src/static/icons/backup/windy.svg (renamed from static/icons/backup/windy.svg)0
-rw-r--r--src/static/icons/clock.svg (renamed from static/icons/clock.svg)0
-rw-r--r--src/static/icons/directions/east.svg (renamed from static/icons/directions/east.svg)0
-rw-r--r--src/static/icons/directions/north-east.svg (renamed from static/icons/directions/north-east.svg)0
-rw-r--r--src/static/icons/directions/north-west.svg (renamed from static/icons/directions/north-west.svg)0
-rw-r--r--src/static/icons/directions/north.svg (renamed from static/icons/directions/north.svg)0
-rw-r--r--src/static/icons/directions/south-east.svg (renamed from static/icons/directions/south-east.svg)0
-rw-r--r--src/static/icons/directions/south-west.svg (renamed from static/icons/directions/south-west.svg)0
-rw-r--r--src/static/icons/directions/south.svg (renamed from static/icons/directions/south.svg)0
-rw-r--r--src/static/icons/directions/west.svg (renamed from static/icons/directions/west.svg)0
-rw-r--r--src/static/icons/svg/wi-alien.svg (renamed from static/icons/svg/wi-alien.svg)0
-rw-r--r--src/static/icons/svg/wi-barometer.svg (renamed from static/icons/svg/wi-barometer.svg)0
-rw-r--r--src/static/icons/svg/wi-celsius.svg (renamed from static/icons/svg/wi-celsius.svg)0
-rw-r--r--src/static/icons/svg/wi-cloud-down.svg (renamed from static/icons/svg/wi-cloud-down.svg)0
-rw-r--r--src/static/icons/svg/wi-cloud-refresh.svg (renamed from static/icons/svg/wi-cloud-refresh.svg)0
-rw-r--r--src/static/icons/svg/wi-cloud-up.svg (renamed from static/icons/svg/wi-cloud-up.svg)0
-rw-r--r--src/static/icons/svg/wi-cloud.svg (renamed from static/icons/svg/wi-cloud.svg)0
-rw-r--r--src/static/icons/svg/wi-cloudy-gusts.svg (renamed from static/icons/svg/wi-cloudy-gusts.svg)0
-rw-r--r--src/static/icons/svg/wi-cloudy-windy.svg (renamed from static/icons/svg/wi-cloudy-windy.svg)0
-rw-r--r--src/static/icons/svg/wi-cloudy.svg (renamed from static/icons/svg/wi-cloudy.svg)0
-rw-r--r--src/static/icons/svg/wi-day-cloudy-gusts.svg (renamed from static/icons/svg/wi-day-cloudy-gusts.svg)0
-rw-r--r--src/static/icons/svg/wi-day-cloudy-high.svg (renamed from static/icons/svg/wi-day-cloudy-high.svg)0
-rw-r--r--src/static/icons/svg/wi-day-cloudy-windy.svg (renamed from static/icons/svg/wi-day-cloudy-windy.svg)0
-rw-r--r--src/static/icons/svg/wi-day-cloudy.svg (renamed from static/icons/svg/wi-day-cloudy.svg)0
-rw-r--r--src/static/icons/svg/wi-day-fog.svg (renamed from static/icons/svg/wi-day-fog.svg)0
-rw-r--r--src/static/icons/svg/wi-day-hail.svg (renamed from static/icons/svg/wi-day-hail.svg)0
-rw-r--r--src/static/icons/svg/wi-day-haze.svg (renamed from static/icons/svg/wi-day-haze.svg)0
-rw-r--r--src/static/icons/svg/wi-day-light-wind.svg (renamed from static/icons/svg/wi-day-light-wind.svg)0
-rw-r--r--src/static/icons/svg/wi-day-lightning.svg (renamed from static/icons/svg/wi-day-lightning.svg)0
-rw-r--r--src/static/icons/svg/wi-day-rain-mix.svg (renamed from static/icons/svg/wi-day-rain-mix.svg)0
-rw-r--r--src/static/icons/svg/wi-day-rain-wind.svg (renamed from static/icons/svg/wi-day-rain-wind.svg)0
-rw-r--r--src/static/icons/svg/wi-day-rain.svg (renamed from static/icons/svg/wi-day-rain.svg)0
-rw-r--r--src/static/icons/svg/wi-day-showers.svg (renamed from static/icons/svg/wi-day-showers.svg)0
-rw-r--r--src/static/icons/svg/wi-day-sleet-storm.svg (renamed from static/icons/svg/wi-day-sleet-storm.svg)0
-rw-r--r--src/static/icons/svg/wi-day-sleet.svg (renamed from static/icons/svg/wi-day-sleet.svg)0
-rw-r--r--src/static/icons/svg/wi-day-snow-thunderstorm.svg (renamed from static/icons/svg/wi-day-snow-thunderstorm.svg)0
-rw-r--r--src/static/icons/svg/wi-day-snow-wind.svg (renamed from static/icons/svg/wi-day-snow-wind.svg)0
-rw-r--r--src/static/icons/svg/wi-day-snow.svg (renamed from static/icons/svg/wi-day-snow.svg)0
-rw-r--r--src/static/icons/svg/wi-day-sprinkle.svg (renamed from static/icons/svg/wi-day-sprinkle.svg)0
-rw-r--r--src/static/icons/svg/wi-day-storm-showers.svg (renamed from static/icons/svg/wi-day-storm-showers.svg)0
-rw-r--r--src/static/icons/svg/wi-day-sunny-overcast.svg (renamed from static/icons/svg/wi-day-sunny-overcast.svg)0
-rw-r--r--src/static/icons/svg/wi-day-sunny.svg (renamed from static/icons/svg/wi-day-sunny.svg)0
-rw-r--r--src/static/icons/svg/wi-day-thunderstorm.svg (renamed from static/icons/svg/wi-day-thunderstorm.svg)0
-rw-r--r--src/static/icons/svg/wi-day-windy.svg (renamed from static/icons/svg/wi-day-windy.svg)0
-rw-r--r--src/static/icons/svg/wi-degrees.svg (renamed from static/icons/svg/wi-degrees.svg)0
-rw-r--r--src/static/icons/svg/wi-direction-down-left.svg (renamed from static/icons/svg/wi-direction-down-left.svg)0
-rw-r--r--src/static/icons/svg/wi-direction-down-right.svg (renamed from static/icons/svg/wi-direction-down-right.svg)0
-rw-r--r--src/static/icons/svg/wi-direction-down.svg (renamed from static/icons/svg/wi-direction-down.svg)0
-rw-r--r--src/static/icons/svg/wi-direction-left.svg (renamed from static/icons/svg/wi-direction-left.svg)0
-rw-r--r--src/static/icons/svg/wi-direction-right.svg (renamed from static/icons/svg/wi-direction-right.svg)0
-rw-r--r--src/static/icons/svg/wi-direction-up-left.svg (renamed from static/icons/svg/wi-direction-up-left.svg)0
-rw-r--r--src/static/icons/svg/wi-direction-up-right.svg (renamed from static/icons/svg/wi-direction-up-right.svg)0
-rw-r--r--src/static/icons/svg/wi-direction-up.svg (renamed from static/icons/svg/wi-direction-up.svg)0
-rw-r--r--src/static/icons/svg/wi-dust.svg (renamed from static/icons/svg/wi-dust.svg)0
-rw-r--r--src/static/icons/svg/wi-earthquake.svg (renamed from static/icons/svg/wi-earthquake.svg)0
-rw-r--r--src/static/icons/svg/wi-fahrenheit.svg (renamed from static/icons/svg/wi-fahrenheit.svg)0
-rw-r--r--src/static/icons/svg/wi-fire.svg (renamed from static/icons/svg/wi-fire.svg)0
-rw-r--r--src/static/icons/svg/wi-flood.svg (renamed from static/icons/svg/wi-flood.svg)0
-rw-r--r--src/static/icons/svg/wi-fog.svg (renamed from static/icons/svg/wi-fog.svg)0
-rw-r--r--src/static/icons/svg/wi-gale-warning.svg (renamed from static/icons/svg/wi-gale-warning.svg)0
-rw-r--r--src/static/icons/svg/wi-hail.svg (renamed from static/icons/svg/wi-hail.svg)0
-rw-r--r--src/static/icons/svg/wi-horizon-alt.svg (renamed from static/icons/svg/wi-horizon-alt.svg)0
-rw-r--r--src/static/icons/svg/wi-horizon.svg (renamed from static/icons/svg/wi-horizon.svg)0
-rw-r--r--src/static/icons/svg/wi-hot.svg (renamed from static/icons/svg/wi-hot.svg)0
-rw-r--r--src/static/icons/svg/wi-humidity.svg (renamed from static/icons/svg/wi-humidity.svg)0
-rw-r--r--src/static/icons/svg/wi-hurricane-warning.svg (renamed from static/icons/svg/wi-hurricane-warning.svg)0
-rw-r--r--src/static/icons/svg/wi-hurricane.svg (renamed from static/icons/svg/wi-hurricane.svg)0
-rw-r--r--src/static/icons/svg/wi-lightning.svg (renamed from static/icons/svg/wi-lightning.svg)0
-rw-r--r--src/static/icons/svg/wi-lunar-eclipse.svg (renamed from static/icons/svg/wi-lunar-eclipse.svg)0
-rw-r--r--src/static/icons/svg/wi-meteor.svg (renamed from static/icons/svg/wi-meteor.svg)0
-rw-r--r--src/static/icons/svg/wi-moon-alt-first-quarter.svg (renamed from static/icons/svg/wi-moon-alt-first-quarter.svg)0
-rw-r--r--src/static/icons/svg/wi-moon-alt-full.svg (renamed from static/icons/svg/wi-moon-alt-full.svg)0
-rw-r--r--src/static/icons/svg/wi-moon-alt-new.svg (renamed from static/icons/svg/wi-moon-alt-new.svg)0
-rw-r--r--src/static/icons/svg/wi-moon-alt-third-quarter.svg (renamed from static/icons/svg/wi-moon-alt-third-quarter.svg)0
-rw-r--r--src/static/icons/svg/wi-moon-alt-waning-crescent-1.svg (renamed from static/icons/svg/wi-moon-alt-waning-crescent-1.svg)0
-rw-r--r--src/static/icons/svg/wi-moon-alt-waning-crescent-2.svg (renamed from static/icons/svg/wi-moon-alt-waning-crescent-2.svg)0
-rw-r--r--src/static/icons/svg/wi-moon-alt-waning-crescent-3.svg (renamed from static/icons/svg/wi-moon-alt-waning-crescent-3.svg)0
-rw-r--r--src/static/icons/svg/wi-moon-alt-waning-crescent-4.svg (renamed from static/icons/svg/wi-moon-alt-waning-crescent-4.svg)0
-rw-r--r--src/static/icons/svg/wi-moon-alt-waning-crescent-5.svg (renamed from static/icons/svg/wi-moon-alt-waning-crescent-5.svg)0
-rw-r--r--src/static/icons/svg/wi-moon-alt-waning-crescent-6.svg (renamed from static/icons/svg/wi-moon-alt-waning-crescent-6.svg)0
-rw-r--r--src/static/icons/svg/wi-moon-alt-waning-gibbous-1.svg (renamed from static/icons/svg/wi-moon-alt-waning-gibbous-1.svg)0
-rw-r--r--src/static/icons/svg/wi-moon-alt-waning-gibbous-2.svg (renamed from static/icons/svg/wi-moon-alt-waning-gibbous-2.svg)0
-rw-r--r--src/static/icons/svg/wi-moon-alt-waning-gibbous-3.svg (renamed from static/icons/svg/wi-moon-alt-waning-gibbous-3.svg)0
-rw-r--r--src/static/icons/svg/wi-moon-alt-waning-gibbous-4.svg (renamed from static/icons/svg/wi-moon-alt-waning-gibbous-4.svg)0
-rw-r--r--src/static/icons/svg/wi-moon-alt-waning-gibbous-5.svg (renamed from static/icons/svg/wi-moon-alt-waning-gibbous-5.svg)0
-rw-r--r--src/static/icons/svg/wi-moon-alt-waning-gibbous-6.svg (renamed from static/icons/svg/wi-moon-alt-waning-gibbous-6.svg)0
-rw-r--r--src/static/icons/svg/wi-moon-alt-waxing-crescent-1.svg (renamed from static/icons/svg/wi-moon-alt-waxing-crescent-1.svg)0
-rw-r--r--src/static/icons/svg/wi-moon-alt-waxing-crescent-2.svg (renamed from static/icons/svg/wi-moon-alt-waxing-crescent-2.svg)0
-rw-r--r--src/static/icons/svg/wi-moon-alt-waxing-crescent-3.svg (renamed from static/icons/svg/wi-moon-alt-waxing-crescent-3.svg)0
-rw-r--r--src/static/icons/svg/wi-moon-alt-waxing-crescent-4.svg (renamed from static/icons/svg/wi-moon-alt-waxing-crescent-4.svg)0
-rw-r--r--src/static/icons/svg/wi-moon-alt-waxing-crescent-5.svg (renamed from static/icons/svg/wi-moon-alt-waxing-crescent-5.svg)0
-rw-r--r--src/static/icons/svg/wi-moon-alt-waxing-crescent-6.svg (renamed from static/icons/svg/wi-moon-alt-waxing-crescent-6.svg)0
-rw-r--r--src/static/icons/svg/wi-moon-alt-waxing-gibbous-1.svg (renamed from static/icons/svg/wi-moon-alt-waxing-gibbous-1.svg)0
-rw-r--r--src/static/icons/svg/wi-moon-alt-waxing-gibbous-2.svg (renamed from static/icons/svg/wi-moon-alt-waxing-gibbous-2.svg)0
-rw-r--r--src/static/icons/svg/wi-moon-alt-waxing-gibbous-3.svg (renamed from static/icons/svg/wi-moon-alt-waxing-gibbous-3.svg)0
-rw-r--r--src/static/icons/svg/wi-moon-alt-waxing-gibbous-4.svg (renamed from static/icons/svg/wi-moon-alt-waxing-gibbous-4.svg)0
-rw-r--r--src/static/icons/svg/wi-moon-alt-waxing-gibbous-5.svg (renamed from static/icons/svg/wi-moon-alt-waxing-gibbous-5.svg)0
-rw-r--r--src/static/icons/svg/wi-moon-alt-waxing-gibbous-6.svg (renamed from static/icons/svg/wi-moon-alt-waxing-gibbous-6.svg)0
-rw-r--r--src/static/icons/svg/wi-moon-first-quarter.svg (renamed from static/icons/svg/wi-moon-first-quarter.svg)0
-rw-r--r--src/static/icons/svg/wi-moon-full.svg (renamed from static/icons/svg/wi-moon-full.svg)0
-rw-r--r--src/static/icons/svg/wi-moon-new.svg (renamed from static/icons/svg/wi-moon-new.svg)0
-rw-r--r--src/static/icons/svg/wi-moon-third-quarter.svg (renamed from static/icons/svg/wi-moon-third-quarter.svg)0
-rw-r--r--src/static/icons/svg/wi-moon-waning-crescent-1.svg (renamed from static/icons/svg/wi-moon-waning-crescent-1.svg)0
-rw-r--r--src/static/icons/svg/wi-moon-waning-crescent-2.svg (renamed from static/icons/svg/wi-moon-waning-crescent-2.svg)0
-rw-r--r--src/static/icons/svg/wi-moon-waning-crescent-3.svg (renamed from static/icons/svg/wi-moon-waning-crescent-3.svg)0
-rw-r--r--src/static/icons/svg/wi-moon-waning-crescent-4.svg (renamed from static/icons/svg/wi-moon-waning-crescent-4.svg)0
-rw-r--r--src/static/icons/svg/wi-moon-waning-crescent-5.svg (renamed from static/icons/svg/wi-moon-waning-crescent-5.svg)0
-rw-r--r--src/static/icons/svg/wi-moon-waning-crescent-6.svg (renamed from static/icons/svg/wi-moon-waning-crescent-6.svg)0
-rw-r--r--src/static/icons/svg/wi-moon-waning-gibbous-1.svg (renamed from static/icons/svg/wi-moon-waning-gibbous-1.svg)0
-rw-r--r--src/static/icons/svg/wi-moon-waning-gibbous-2.svg (renamed from static/icons/svg/wi-moon-waning-gibbous-2.svg)0
-rw-r--r--src/static/icons/svg/wi-moon-waning-gibbous-3.svg (renamed from static/icons/svg/wi-moon-waning-gibbous-3.svg)0
-rw-r--r--src/static/icons/svg/wi-moon-waning-gibbous-4.svg (renamed from static/icons/svg/wi-moon-waning-gibbous-4.svg)0
-rw-r--r--src/static/icons/svg/wi-moon-waning-gibbous-5.svg (renamed from static/icons/svg/wi-moon-waning-gibbous-5.svg)0
-rw-r--r--src/static/icons/svg/wi-moon-waning-gibbous-6.svg (renamed from static/icons/svg/wi-moon-waning-gibbous-6.svg)0
-rw-r--r--src/static/icons/svg/wi-moon-waxing-6.svg (renamed from static/icons/svg/wi-moon-waxing-6.svg)0
-rw-r--r--src/static/icons/svg/wi-moon-waxing-crescent-1.svg (renamed from static/icons/svg/wi-moon-waxing-crescent-1.svg)0
-rw-r--r--src/static/icons/svg/wi-moon-waxing-crescent-2.svg (renamed from static/icons/svg/wi-moon-waxing-crescent-2.svg)0
-rw-r--r--src/static/icons/svg/wi-moon-waxing-crescent-3.svg (renamed from static/icons/svg/wi-moon-waxing-crescent-3.svg)0
-rw-r--r--src/static/icons/svg/wi-moon-waxing-crescent-4.svg (renamed from static/icons/svg/wi-moon-waxing-crescent-4.svg)0
-rw-r--r--src/static/icons/svg/wi-moon-waxing-crescent-5.svg (renamed from static/icons/svg/wi-moon-waxing-crescent-5.svg)0
-rw-r--r--src/static/icons/svg/wi-moon-waxing-gibbous-1.svg (renamed from static/icons/svg/wi-moon-waxing-gibbous-1.svg)0
-rw-r--r--src/static/icons/svg/wi-moon-waxing-gibbous-2.svg (renamed from static/icons/svg/wi-moon-waxing-gibbous-2.svg)0
-rw-r--r--src/static/icons/svg/wi-moon-waxing-gibbous-3.svg (renamed from static/icons/svg/wi-moon-waxing-gibbous-3.svg)0
-rw-r--r--src/static/icons/svg/wi-moon-waxing-gibbous-4.svg (renamed from static/icons/svg/wi-moon-waxing-gibbous-4.svg)0
-rw-r--r--src/static/icons/svg/wi-moon-waxing-gibbous-5.svg (renamed from static/icons/svg/wi-moon-waxing-gibbous-5.svg)0
-rw-r--r--src/static/icons/svg/wi-moon-waxing-gibbous-6.svg (renamed from static/icons/svg/wi-moon-waxing-gibbous-6.svg)0
-rw-r--r--src/static/icons/svg/wi-moonrise.svg (renamed from static/icons/svg/wi-moonrise.svg)0
-rw-r--r--src/static/icons/svg/wi-moonset.svg (renamed from static/icons/svg/wi-moonset.svg)0
-rw-r--r--src/static/icons/svg/wi-na.svg (renamed from static/icons/svg/wi-na.svg)0
-rw-r--r--src/static/icons/svg/wi-night-alt-cloudy-gusts.svg (renamed from static/icons/svg/wi-night-alt-cloudy-gusts.svg)0
-rw-r--r--src/static/icons/svg/wi-night-alt-cloudy-high.svg (renamed from static/icons/svg/wi-night-alt-cloudy-high.svg)0
-rw-r--r--src/static/icons/svg/wi-night-alt-cloudy-windy.svg (renamed from static/icons/svg/wi-night-alt-cloudy-windy.svg)0
-rw-r--r--src/static/icons/svg/wi-night-alt-cloudy.svg (renamed from static/icons/svg/wi-night-alt-cloudy.svg)0
-rw-r--r--src/static/icons/svg/wi-night-alt-hail.svg (renamed from static/icons/svg/wi-night-alt-hail.svg)0
-rw-r--r--src/static/icons/svg/wi-night-alt-lightning.svg (renamed from static/icons/svg/wi-night-alt-lightning.svg)0
-rw-r--r--src/static/icons/svg/wi-night-alt-partly-cloudy.svg (renamed from static/icons/svg/wi-night-alt-partly-cloudy.svg)0
-rw-r--r--src/static/icons/svg/wi-night-alt-rain-mix.svg (renamed from static/icons/svg/wi-night-alt-rain-mix.svg)0
-rw-r--r--src/static/icons/svg/wi-night-alt-rain-wind.svg (renamed from static/icons/svg/wi-night-alt-rain-wind.svg)0
-rw-r--r--src/static/icons/svg/wi-night-alt-rain.svg (renamed from static/icons/svg/wi-night-alt-rain.svg)0
-rw-r--r--src/static/icons/svg/wi-night-alt-showers.svg (renamed from static/icons/svg/wi-night-alt-showers.svg)0
-rw-r--r--src/static/icons/svg/wi-night-alt-sleet-storm.svg (renamed from static/icons/svg/wi-night-alt-sleet-storm.svg)0
-rw-r--r--src/static/icons/svg/wi-night-alt-sleet.svg (renamed from static/icons/svg/wi-night-alt-sleet.svg)0
-rw-r--r--src/static/icons/svg/wi-night-alt-snow-thunderstorm.svg (renamed from static/icons/svg/wi-night-alt-snow-thunderstorm.svg)0
-rw-r--r--src/static/icons/svg/wi-night-alt-snow-wind.svg (renamed from static/icons/svg/wi-night-alt-snow-wind.svg)0
-rw-r--r--src/static/icons/svg/wi-night-alt-snow.svg (renamed from static/icons/svg/wi-night-alt-snow.svg)0
-rw-r--r--src/static/icons/svg/wi-night-alt-sprinkle.svg (renamed from static/icons/svg/wi-night-alt-sprinkle.svg)0
-rw-r--r--src/static/icons/svg/wi-night-alt-storm-showers.svg (renamed from static/icons/svg/wi-night-alt-storm-showers.svg)0
-rw-r--r--src/static/icons/svg/wi-night-alt-thunderstorm.svg (renamed from static/icons/svg/wi-night-alt-thunderstorm.svg)0
-rw-r--r--src/static/icons/svg/wi-night-clear.svg (renamed from static/icons/svg/wi-night-clear.svg)0
-rw-r--r--src/static/icons/svg/wi-night-cloudy-gusts.svg (renamed from static/icons/svg/wi-night-cloudy-gusts.svg)0
-rw-r--r--src/static/icons/svg/wi-night-cloudy-high.svg (renamed from static/icons/svg/wi-night-cloudy-high.svg)0
-rw-r--r--src/static/icons/svg/wi-night-cloudy-windy.svg (renamed from static/icons/svg/wi-night-cloudy-windy.svg)0
-rw-r--r--src/static/icons/svg/wi-night-cloudy.svg (renamed from static/icons/svg/wi-night-cloudy.svg)0
-rw-r--r--src/static/icons/svg/wi-night-fog.svg (renamed from static/icons/svg/wi-night-fog.svg)0
-rw-r--r--src/static/icons/svg/wi-night-hail.svg (renamed from static/icons/svg/wi-night-hail.svg)0
-rw-r--r--src/static/icons/svg/wi-night-lightning.svg (renamed from static/icons/svg/wi-night-lightning.svg)0
-rw-r--r--src/static/icons/svg/wi-night-partly-cloudy.svg (renamed from static/icons/svg/wi-night-partly-cloudy.svg)0
-rw-r--r--src/static/icons/svg/wi-night-rain-mix.svg (renamed from static/icons/svg/wi-night-rain-mix.svg)0
-rw-r--r--src/static/icons/svg/wi-night-rain-wind.svg (renamed from static/icons/svg/wi-night-rain-wind.svg)0
-rw-r--r--src/static/icons/svg/wi-night-rain.svg (renamed from static/icons/svg/wi-night-rain.svg)0
-rw-r--r--src/static/icons/svg/wi-night-showers.svg (renamed from static/icons/svg/wi-night-showers.svg)0
-rw-r--r--src/static/icons/svg/wi-night-sleet-storm.svg (renamed from static/icons/svg/wi-night-sleet-storm.svg)0
-rw-r--r--src/static/icons/svg/wi-night-sleet.svg (renamed from static/icons/svg/wi-night-sleet.svg)0
-rw-r--r--src/static/icons/svg/wi-night-snow-thunderstorm.svg (renamed from static/icons/svg/wi-night-snow-thunderstorm.svg)0
-rw-r--r--src/static/icons/svg/wi-night-snow-wind.svg (renamed from static/icons/svg/wi-night-snow-wind.svg)0
-rw-r--r--src/static/icons/svg/wi-night-snow.svg (renamed from static/icons/svg/wi-night-snow.svg)0
-rw-r--r--src/static/icons/svg/wi-night-sprinkle.svg (renamed from static/icons/svg/wi-night-sprinkle.svg)0
-rw-r--r--src/static/icons/svg/wi-night-storm-showers.svg (renamed from static/icons/svg/wi-night-storm-showers.svg)0
-rw-r--r--src/static/icons/svg/wi-night-thunderstorm.svg (renamed from static/icons/svg/wi-night-thunderstorm.svg)0
-rw-r--r--src/static/icons/svg/wi-rain-mix.svg (renamed from static/icons/svg/wi-rain-mix.svg)0
-rw-r--r--src/static/icons/svg/wi-rain-wind.svg (renamed from static/icons/svg/wi-rain-wind.svg)0
-rw-r--r--src/static/icons/svg/wi-rain.svg (renamed from static/icons/svg/wi-rain.svg)0
-rw-r--r--src/static/icons/svg/wi-raindrop.svg (renamed from static/icons/svg/wi-raindrop.svg)0
-rw-r--r--src/static/icons/svg/wi-raindrops.svg (renamed from static/icons/svg/wi-raindrops.svg)0
-rw-r--r--src/static/icons/svg/wi-refresh-alt.svg (renamed from static/icons/svg/wi-refresh-alt.svg)0
-rw-r--r--src/static/icons/svg/wi-refresh.svg (renamed from static/icons/svg/wi-refresh.svg)0
-rw-r--r--src/static/icons/svg/wi-sandstorm.svg (renamed from static/icons/svg/wi-sandstorm.svg)0
-rw-r--r--src/static/icons/svg/wi-showers.svg (renamed from static/icons/svg/wi-showers.svg)0
-rw-r--r--src/static/icons/svg/wi-sleet.svg (renamed from static/icons/svg/wi-sleet.svg)0
-rw-r--r--src/static/icons/svg/wi-small-craft-advisory.svg (renamed from static/icons/svg/wi-small-craft-advisory.svg)0
-rw-r--r--src/static/icons/svg/wi-smog.svg (renamed from static/icons/svg/wi-smog.svg)0
-rw-r--r--src/static/icons/svg/wi-smoke.svg (renamed from static/icons/svg/wi-smoke.svg)0
-rw-r--r--src/static/icons/svg/wi-snow-wind.svg (renamed from static/icons/svg/wi-snow-wind.svg)0
-rw-r--r--src/static/icons/svg/wi-snow.svg (renamed from static/icons/svg/wi-snow.svg)0
-rw-r--r--src/static/icons/svg/wi-snowflake-cold.svg (renamed from static/icons/svg/wi-snowflake-cold.svg)0
-rw-r--r--src/static/icons/svg/wi-solar-eclipse.svg (renamed from static/icons/svg/wi-solar-eclipse.svg)0
-rw-r--r--src/static/icons/svg/wi-sprinkle.svg (renamed from static/icons/svg/wi-sprinkle.svg)0
-rw-r--r--src/static/icons/svg/wi-stars.svg (renamed from static/icons/svg/wi-stars.svg)0
-rw-r--r--src/static/icons/svg/wi-storm-showers.svg (renamed from static/icons/svg/wi-storm-showers.svg)0
-rw-r--r--src/static/icons/svg/wi-storm-warning.svg (renamed from static/icons/svg/wi-storm-warning.svg)0
-rw-r--r--src/static/icons/svg/wi-strong-wind.svg (renamed from static/icons/svg/wi-strong-wind.svg)0
-rw-r--r--src/static/icons/svg/wi-sunrise.svg (renamed from static/icons/svg/wi-sunrise.svg)0
-rw-r--r--src/static/icons/svg/wi-sunset.svg (renamed from static/icons/svg/wi-sunset.svg)0
-rw-r--r--src/static/icons/svg/wi-thermometer-exterior.svg (renamed from static/icons/svg/wi-thermometer-exterior.svg)0
-rw-r--r--src/static/icons/svg/wi-thermometer-internal.svg (renamed from static/icons/svg/wi-thermometer-internal.svg)0
-rw-r--r--src/static/icons/svg/wi-thermometer.svg (renamed from static/icons/svg/wi-thermometer.svg)0
-rw-r--r--src/static/icons/svg/wi-thunderstorm.svg (renamed from static/icons/svg/wi-thunderstorm.svg)0
-rw-r--r--src/static/icons/svg/wi-time-1.svg (renamed from static/icons/svg/wi-time-1.svg)0
-rw-r--r--src/static/icons/svg/wi-time-10.svg (renamed from static/icons/svg/wi-time-10.svg)0
-rw-r--r--src/static/icons/svg/wi-time-11.svg (renamed from static/icons/svg/wi-time-11.svg)0
-rw-r--r--src/static/icons/svg/wi-time-12.svg (renamed from static/icons/svg/wi-time-12.svg)0
-rw-r--r--src/static/icons/svg/wi-time-2.svg (renamed from static/icons/svg/wi-time-2.svg)0
-rw-r--r--src/static/icons/svg/wi-time-3.svg (renamed from static/icons/svg/wi-time-3.svg)0
-rw-r--r--src/static/icons/svg/wi-time-4.svg (renamed from static/icons/svg/wi-time-4.svg)0
-rw-r--r--src/static/icons/svg/wi-time-5.svg (renamed from static/icons/svg/wi-time-5.svg)0
-rw-r--r--src/static/icons/svg/wi-time-6.svg (renamed from static/icons/svg/wi-time-6.svg)0
-rw-r--r--src/static/icons/svg/wi-time-7.svg (renamed from static/icons/svg/wi-time-7.svg)0
-rw-r--r--src/static/icons/svg/wi-time-8.svg (renamed from static/icons/svg/wi-time-8.svg)0
-rw-r--r--src/static/icons/svg/wi-time-9.svg (renamed from static/icons/svg/wi-time-9.svg)0
-rw-r--r--src/static/icons/svg/wi-tornado.svg (renamed from static/icons/svg/wi-tornado.svg)0
-rw-r--r--src/static/icons/svg/wi-train.svg (renamed from static/icons/svg/wi-train.svg)0
-rw-r--r--src/static/icons/svg/wi-tsunami.svg (renamed from static/icons/svg/wi-tsunami.svg)0
-rw-r--r--src/static/icons/svg/wi-umbrella.svg (renamed from static/icons/svg/wi-umbrella.svg)0
-rw-r--r--src/static/icons/svg/wi-volcano.svg (renamed from static/icons/svg/wi-volcano.svg)0
-rw-r--r--src/static/icons/svg/wi-wind-beaufort-0.svg (renamed from static/icons/svg/wi-wind-beaufort-0.svg)0
-rw-r--r--src/static/icons/svg/wi-wind-beaufort-1.svg (renamed from static/icons/svg/wi-wind-beaufort-1.svg)0
-rw-r--r--src/static/icons/svg/wi-wind-beaufort-10.svg (renamed from static/icons/svg/wi-wind-beaufort-10.svg)0
-rw-r--r--src/static/icons/svg/wi-wind-beaufort-11.svg (renamed from static/icons/svg/wi-wind-beaufort-11.svg)0
-rw-r--r--src/static/icons/svg/wi-wind-beaufort-12.svg (renamed from static/icons/svg/wi-wind-beaufort-12.svg)0
-rw-r--r--src/static/icons/svg/wi-wind-beaufort-2.svg (renamed from static/icons/svg/wi-wind-beaufort-2.svg)0
-rw-r--r--src/static/icons/svg/wi-wind-beaufort-3.svg (renamed from static/icons/svg/wi-wind-beaufort-3.svg)0
-rw-r--r--src/static/icons/svg/wi-wind-beaufort-4.svg (renamed from static/icons/svg/wi-wind-beaufort-4.svg)0
-rw-r--r--src/static/icons/svg/wi-wind-beaufort-5.svg (renamed from static/icons/svg/wi-wind-beaufort-5.svg)0
-rw-r--r--src/static/icons/svg/wi-wind-beaufort-6.svg (renamed from static/icons/svg/wi-wind-beaufort-6.svg)0
-rw-r--r--src/static/icons/svg/wi-wind-beaufort-7.svg (renamed from static/icons/svg/wi-wind-beaufort-7.svg)0
-rw-r--r--src/static/icons/svg/wi-wind-beaufort-8.svg (renamed from static/icons/svg/wi-wind-beaufort-8.svg)0
-rw-r--r--src/static/icons/svg/wi-wind-beaufort-9.svg (renamed from static/icons/svg/wi-wind-beaufort-9.svg)0
-rw-r--r--src/static/icons/svg/wi-wind-deg.svg (renamed from static/icons/svg/wi-wind-deg.svg)0
-rw-r--r--src/static/icons/svg/wi-windy.svg (renamed from static/icons/svg/wi-windy.svg)0
-rw-r--r--src/static/style.css (renamed from static/style.css)70
-rw-r--r--src/static/temp.js325
-rw-r--r--src/templates/base.html (renamed from templates/base.html)1
-rw-r--r--src/templates/index.html15
-rw-r--r--src/templates/location.html15
-rw-r--r--src/templates/weather.html (renamed from templates/weather.html)24
-rw-r--r--templates/index.html10
263 files changed, 521 insertions, 72 deletions
diff --git a/app.py b/app.py
deleted file mode 100644
index 72e74ca..0000000
--- a/app.py
+++ /dev/null
@@ -1,31 +0,0 @@
1#!/usr/bin/env python3
2import json, requests, datetime, argparse, pytz, flask
3import library, forms
4
5app = flask.Flask(__name__)
6app.config['SECRET_KEY'] = "hunter2"
7
8@app.route('/', methods=('GET','POST'))
9def index():
10 form = forms.WeatherForm()
11 if form.validate_on_submit():
12 location = form.location.data
13 return flask.redirect(flask.url_for('weather', location=location))
14 return flask.render_template("index.html", form=form)
15
16
17@app.route('/weather', methods=('GET','POST'))
18def weather():
19 location = flask.request.args.get('location', type=str)
20 latitude, longitude = library.get_lat_long(location)
21 data = library.get_data(latitude, longitude)
22 hour = library.get_current_rounded_time(data["timezone"]).hour
23 form = forms.WeatherForm()
24 if form.validate_on_submit():
25 location = form.location.data
26 return flask.redirect(flask.url_for('weather', location=location))
27 return flask.render_template("weather.html", data=data, form=form, weather_codes=library.weather_codes,
28 weather_icons=library.weather_icons, hour=hour)
29
30if __name__ == "__main__":
31 app.run()
diff --git a/src/app.py b/src/app.py
new file mode 100644
index 0000000..6426b04
--- /dev/null
+++ b/src/app.py
@@ -0,0 +1,72 @@
1#!/usr/bin/env python3
2import json, requests, datetime, argparse, pytz, flask
3import library, forms
4
5app = flask.Flask(__name__)
6app.config['SECRET_KEY'] = "JAnmklasd39u2mnwim"
7
8
9def check_submission(location):
10 latitude, longitude = library.get_lat_long(location)
11 if (latitude, longitude) == (0, 0):
12 return flask.redirect(flask.url_for('location', location=location))
13 else:
14 return flask.redirect(flask.url_for('weather', latitude=latitude, longitude=longitude))
15
16
17@app.route('/', methods=('GET','POST'))
18def index():
19 form = forms.WeatherForm()
20 if form.validate_on_submit():
21 location = form.location.data
22 return check_submission(location)
23 else:
24 return flask.render_template("index.html", form=form)
25
26
27@app.route('/weather', methods=('GET','POST'))
28def weather():
29 latitude = flask.request.args.get('latitude', type=str)
30 longitude = flask.request.args.get('longitude', type=str)
31 data = library.get_data(latitude, longitude)
32 hour = library.get_current_rounded_time(data["timezone"]).hour
33 form = forms.WeatherForm()
34 if form.validate_on_submit():
35 location = form.location.data
36 return check_submission(location)
37 else:
38 return flask.render_template("weather.html", data=data, form=form, weather_codes=library.weather_codes, datetime=datetime,
39 weather_icons=library.weather_icons, hour=hour, get_direction_icon=library.get_direction_icon)
40
41
42@app.route('/location', methods=('GET','POST'))
43def location():
44 location = flask.request.args.get('location', type=str)
45 url = f"https://geocoding-api.open-meteo.com/v1/search?name={location}&count=10&language=en&format=json"
46 headers = {"User-Agent": "pywttr 0.1"}
47 data = requests.get(url, headers=headers).json()
48
49 choices = []
50 for i in range(len(data["results"])):
51 point = data["results"][i]
52 choice_str = point["name"] + ", "
53 if "admin1" in point:
54 choice_str += point["admin1"] + ", "
55 if "country" in point:
56 choice_str += point["country"]
57 choices.append((i, choice_str))
58
59 form = forms.LocationForm()
60 form.location.choices = choices
61 form.location.default = choices[0]
62 if form.is_submitted():
63 location = data["results"][int(form.location.data)]
64 latitude = location["latitude"]
65 longitude = location["longitude"]
66 return flask.redirect(flask.url_for('weather', latitude=latitude, longitude=longitude))
67 else:
68 return flask.render_template("location.html", data=data, form=form)
69
70
71if __name__ == "__main__":
72 app.run(debug=True)
diff --git a/forms.py b/src/forms.py
index e31befd..ee08c0e 100644
--- a/forms.py
+++ b/src/forms.py
@@ -4,3 +4,7 @@ class WeatherForm(flask_wtf.FlaskForm):
4 location = wtforms.StringField("Location") 4 location = wtforms.StringField("Location")
5 submit = wtforms.SubmitField("Submit") 5 submit = wtforms.SubmitField("Submit")
6 6
7class LocationForm(flask_wtf.FlaskForm):
8 location = wtforms.SelectField("Location")
9 submit = wtforms.SubmitField("Submit")
10
diff --git a/library.py b/src/library.py
index 5c17e96..38217fc 100644
--- a/library.py
+++ b/src/library.py
@@ -1,6 +1,5 @@
1#!/usr/bin/env python3 1#!/usr/bin/env python3
2import datetime, requests, json, pytz, sys 2import datetime, requests, json, pytz, sys
3from geopy.geocoders import Nominatim, GeoNames
4 3
5weather_codes = {0:"Clear Sky", 1:"Mainly Clear",2:"Partly Cloudy",3:"Overcast",45:"Fog",48:"Fog",51:"Light Drizzle",\ 4weather_codes = {0:"Clear Sky", 1:"Mainly Clear",2:"Partly Cloudy",3:"Overcast",45:"Fog",48:"Fog",51:"Light Drizzle",\
6 53:"Moderate Drizzle",55:"Dense Drizzle",56:"Light Freezing Drizzle",57:"Freezing Drizzle",\ 5 53:"Moderate Drizzle",55:"Dense Drizzle",56:"Light Freezing Drizzle",57:"Freezing Drizzle",\
@@ -20,14 +19,29 @@ weather_icons = {0:('wi-day-sunny','wi-night-clear'), 1:('wi-day-sunny','wi-nigh
20 85:('wi-day-snow','wi-night-snow'),86:('wi-day-snow','wi-night-snow'),95:('wi-day-storm-showers','wi-night-storm-showers'),\ 19 85:('wi-day-snow','wi-night-snow'),86:('wi-day-snow','wi-night-snow'),95:('wi-day-storm-showers','wi-night-storm-showers'),\
21 96:('wi-day-storm-showers','wi-night-storm-showers'),99:('wi-day-storm-showers','wi-night-storm-showers')} 20 96:('wi-day-storm-showers','wi-night-storm-showers'),99:('wi-day-storm-showers','wi-night-storm-showers')}
22 21
22
23def get_direction_icon(degrees):
24 directions = ['N','NNE','NE','ENE','E','ESE','SE','SSE','S','SSW','SW','WSW','W','NWN','NW','NNW','N']
25 icons = {'N':'north','NNE':None,'NE':'north-east','ENE':None,'E':'east','ESE':None,'SE':'south-east','SSE':None,\
26 'S':'south','SSW':None,'SW':'south-west','WSW':None,'W':'west','NWN':None,'NW':'north-west','NNW':None,'N':'north'}
27 points = 8
28 step = 360 / points
29 index = (round((degrees + step / 2) / step) * 16) / points;
30 direction = directions[int(index)]
31 return icons[direction]
32
33
23def get_lat_long(location): 34def get_lat_long(location):
24 # Converts a location into latitude and longitude 35 # Converts a location into latitude and longitude
25 url = f"https://geocoding-api.open-meteo.com/v1/search?name={location}&count=1&language=en&format=json" 36 url = f"https://geocoding-api.open-meteo.com/v1/search?name={location}&count=10&language=en&format=json"
26 headers = {"User-Agent": "pywttr 0.1"} 37 headers = {"User-Agent": "pywttr 0.1"}
27 data = requests.get(url, headers=headers).json() 38 data = requests.get(url, headers=headers).json()
28 latitude = data["results"][0]["latitude"] 39 if len(data["results"]) > 1:
29 longitude = data["results"][0]["longitude"] 40 return 0,0
30 return latitude, longitude 41 else:
42 latitude = data["results"][0]["latitude"]
43 longitude = data["results"][0]["longitude"]
44 return latitude, longitude
31 45
32 46
33def get_data(latitude, longitude): 47def get_data(latitude, longitude):
diff --git a/src/run.sh b/src/run.sh
new file mode 100755
index 0000000..0d36b89
--- /dev/null
+++ b/src/run.sh
@@ -0,0 +1,2 @@
1#!/bin/sh
2flask run
diff --git a/static/icons/backup/celsius.svg b/src/static/icons/backup/celsius.svg
index 57db2e9..57db2e9 100644
--- a/static/icons/backup/celsius.svg
+++ b/src/static/icons/backup/celsius.svg
diff --git a/static/icons/backup/fahrenheit.svg b/src/static/icons/backup/fahrenheit.svg
index 9e21987..9e21987 100644
--- a/static/icons/backup/fahrenheit.svg
+++ b/src/static/icons/backup/fahrenheit.svg
diff --git a/static/icons/backup/fog.svg b/src/static/icons/backup/fog.svg
index c66e82d..c66e82d 100644
--- a/static/icons/backup/fog.svg
+++ b/src/static/icons/backup/fog.svg
diff --git a/static/icons/backup/hail.svg b/src/static/icons/backup/hail.svg
index d8dfb7f..d8dfb7f 100644
--- a/static/icons/backup/hail.svg
+++ b/src/static/icons/backup/hail.svg
diff --git a/static/icons/backup/hazy.svg b/src/static/icons/backup/hazy.svg
index 44678b2..44678b2 100644
--- a/static/icons/backup/hazy.svg
+++ b/src/static/icons/backup/hazy.svg
diff --git a/static/icons/backup/humidity.svg b/src/static/icons/backup/humidity.svg
index 3835684..3835684 100644
--- a/static/icons/backup/humidity.svg
+++ b/src/static/icons/backup/humidity.svg
diff --git a/static/icons/backup/lightning-rainy.svg b/src/static/icons/backup/lightning-rainy.svg
index 45cd3e0..45cd3e0 100644
--- a/static/icons/backup/lightning-rainy.svg
+++ b/src/static/icons/backup/lightning-rainy.svg
diff --git a/static/icons/backup/lightning.svg b/src/static/icons/backup/lightning.svg
index 2ee1433..2ee1433 100644
--- a/static/icons/backup/lightning.svg
+++ b/src/static/icons/backup/lightning.svg
diff --git a/static/icons/backup/night-clear.svg b/src/static/icons/backup/night-clear.svg
index ee464aa..ee464aa 100644
--- a/static/icons/backup/night-clear.svg
+++ b/src/static/icons/backup/night-clear.svg
diff --git a/static/icons/backup/night-partly-cloudy.svg b/src/static/icons/backup/night-partly-cloudy.svg
index 4f00227..4f00227 100644
--- a/static/icons/backup/night-partly-cloudy.svg
+++ b/src/static/icons/backup/night-partly-cloudy.svg
diff --git a/static/icons/backup/partly-cloudy.svg b/src/static/icons/backup/partly-cloudy.svg
index eaf9db4..eaf9db4 100644
--- a/static/icons/backup/partly-cloudy.svg
+++ b/src/static/icons/backup/partly-cloudy.svg
diff --git a/static/icons/backup/partly-rainy.svg b/src/static/icons/backup/partly-rainy.svg
index ef65f20..ef65f20 100644
--- a/static/icons/backup/partly-rainy.svg
+++ b/src/static/icons/backup/partly-rainy.svg
diff --git a/static/icons/backup/partly-snowy-rainy.svg b/src/static/icons/backup/partly-snowy-rainy.svg
index 1138075..1138075 100644
--- a/static/icons/backup/partly-snowy-rainy.svg
+++ b/src/static/icons/backup/partly-snowy-rainy.svg
diff --git a/static/icons/backup/pouring.svg b/src/static/icons/backup/pouring.svg
index 5fc77b4..5fc77b4 100644
--- a/static/icons/backup/pouring.svg
+++ b/src/static/icons/backup/pouring.svg
diff --git a/static/icons/backup/snow.svg b/src/static/icons/backup/snow.svg
index f52b984..f52b984 100644
--- a/static/icons/backup/snow.svg
+++ b/src/static/icons/backup/snow.svg
diff --git a/static/icons/backup/snowy-heavy.svg b/src/static/icons/backup/snowy-heavy.svg
index 4602c8c..4602c8c 100644
--- a/static/icons/backup/snowy-heavy.svg
+++ b/src/static/icons/backup/snowy-heavy.svg
diff --git a/static/icons/backup/snowy.svg b/src/static/icons/backup/snowy.svg
index 5fc77b4..5fc77b4 100644
--- a/static/icons/backup/snowy.svg
+++ b/src/static/icons/backup/snowy.svg
diff --git a/static/icons/backup/sunny.svg b/src/static/icons/backup/sunny.svg
index d2e94e4..d2e94e4 100644
--- a/static/icons/backup/sunny.svg
+++ b/src/static/icons/backup/sunny.svg
diff --git a/static/icons/backup/sunrise.svg b/src/static/icons/backup/sunrise.svg
index c831541..c831541 100644
--- a/static/icons/backup/sunrise.svg
+++ b/src/static/icons/backup/sunrise.svg
diff --git a/static/icons/backup/sunset.svg b/src/static/icons/backup/sunset.svg
index 207aa1e..207aa1e 100644
--- a/static/icons/backup/sunset.svg
+++ b/src/static/icons/backup/sunset.svg
diff --git a/static/icons/backup/thermometer.svg b/src/static/icons/backup/thermometer.svg
index 0a332bd..0a332bd 100644
--- a/static/icons/backup/thermometer.svg
+++ b/src/static/icons/backup/thermometer.svg
diff --git a/static/icons/backup/water-percent.svg b/src/static/icons/backup/water-percent.svg
index 9e4f40c..9e4f40c 100644
--- a/static/icons/backup/water-percent.svg
+++ b/src/static/icons/backup/water-percent.svg
diff --git a/static/icons/backup/windy.svg b/src/static/icons/backup/windy.svg
index 8b38bdc..8b38bdc 100644
--- a/static/icons/backup/windy.svg
+++ b/src/static/icons/backup/windy.svg
diff --git a/static/icons/clock.svg b/src/static/icons/clock.svg
index 56c6b94..56c6b94 100644
--- a/static/icons/clock.svg
+++ b/src/static/icons/clock.svg
diff --git a/static/icons/directions/east.svg b/src/static/icons/directions/east.svg
index e708757..e708757 100644
--- a/static/icons/directions/east.svg
+++ b/src/static/icons/directions/east.svg
diff --git a/static/icons/directions/north-east.svg b/src/static/icons/directions/north-east.svg
index a5b842c..a5b842c 100644
--- a/static/icons/directions/north-east.svg
+++ b/src/static/icons/directions/north-east.svg
diff --git a/static/icons/directions/north-west.svg b/src/static/icons/directions/north-west.svg
index e18211c..e18211c 100644
--- a/static/icons/directions/north-west.svg
+++ b/src/static/icons/directions/north-west.svg
diff --git a/static/icons/directions/north.svg b/src/static/icons/directions/north.svg
index cb15d38..cb15d38 100644
--- a/static/icons/directions/north.svg
+++ b/src/static/icons/directions/north.svg
diff --git a/static/icons/directions/south-east.svg b/src/static/icons/directions/south-east.svg
index b8fb1c9..b8fb1c9 100644
--- a/static/icons/directions/south-east.svg
+++ b/src/static/icons/directions/south-east.svg
diff --git a/static/icons/directions/south-west.svg b/src/static/icons/directions/south-west.svg
index dba0fe1..dba0fe1 100644
--- a/static/icons/directions/south-west.svg
+++ b/src/static/icons/directions/south-west.svg
diff --git a/static/icons/directions/south.svg b/src/static/icons/directions/south.svg
index 4be2792..4be2792 100644
--- a/static/icons/directions/south.svg
+++ b/src/static/icons/directions/south.svg
diff --git a/static/icons/directions/west.svg b/src/static/icons/directions/west.svg
index 4de4b71..4de4b71 100644
--- a/static/icons/directions/west.svg
+++ b/src/static/icons/directions/west.svg
diff --git a/static/icons/svg/wi-alien.svg b/src/static/icons/svg/wi-alien.svg
index e9c0226..e9c0226 100644
--- a/static/icons/svg/wi-alien.svg
+++ b/src/static/icons/svg/wi-alien.svg
diff --git a/static/icons/svg/wi-barometer.svg b/src/static/icons/svg/wi-barometer.svg
index ced7e29..ced7e29 100644
--- a/static/icons/svg/wi-barometer.svg
+++ b/src/static/icons/svg/wi-barometer.svg
diff --git a/static/icons/svg/wi-celsius.svg b/src/static/icons/svg/wi-celsius.svg
index 31dc639..31dc639 100644
--- a/static/icons/svg/wi-celsius.svg
+++ b/src/static/icons/svg/wi-celsius.svg
diff --git a/static/icons/svg/wi-cloud-down.svg b/src/static/icons/svg/wi-cloud-down.svg
index dcd6678..dcd6678 100644
--- a/static/icons/svg/wi-cloud-down.svg
+++ b/src/static/icons/svg/wi-cloud-down.svg
diff --git a/static/icons/svg/wi-cloud-refresh.svg b/src/static/icons/svg/wi-cloud-refresh.svg
index 3f3888f..3f3888f 100644
--- a/static/icons/svg/wi-cloud-refresh.svg
+++ b/src/static/icons/svg/wi-cloud-refresh.svg
diff --git a/static/icons/svg/wi-cloud-up.svg b/src/static/icons/svg/wi-cloud-up.svg
index bff0317..bff0317 100644
--- a/static/icons/svg/wi-cloud-up.svg
+++ b/src/static/icons/svg/wi-cloud-up.svg
diff --git a/static/icons/svg/wi-cloud.svg b/src/static/icons/svg/wi-cloud.svg
index fa77599..fa77599 100644
--- a/static/icons/svg/wi-cloud.svg
+++ b/src/static/icons/svg/wi-cloud.svg
diff --git a/static/icons/svg/wi-cloudy-gusts.svg b/src/static/icons/svg/wi-cloudy-gusts.svg
index 4300a1c..4300a1c 100644
--- a/static/icons/svg/wi-cloudy-gusts.svg
+++ b/src/static/icons/svg/wi-cloudy-gusts.svg
diff --git a/static/icons/svg/wi-cloudy-windy.svg b/src/static/icons/svg/wi-cloudy-windy.svg
index 013929c..013929c 100644
--- a/static/icons/svg/wi-cloudy-windy.svg
+++ b/src/static/icons/svg/wi-cloudy-windy.svg
diff --git a/static/icons/svg/wi-cloudy.svg b/src/static/icons/svg/wi-cloudy.svg
index c3eaf41..c3eaf41 100644
--- a/static/icons/svg/wi-cloudy.svg
+++ b/src/static/icons/svg/wi-cloudy.svg
diff --git a/static/icons/svg/wi-day-cloudy-gusts.svg b/src/static/icons/svg/wi-day-cloudy-gusts.svg
index 287acc9..287acc9 100644
--- a/static/icons/svg/wi-day-cloudy-gusts.svg
+++ b/src/static/icons/svg/wi-day-cloudy-gusts.svg
diff --git a/static/icons/svg/wi-day-cloudy-high.svg b/src/static/icons/svg/wi-day-cloudy-high.svg
index 81649a0..81649a0 100644
--- a/static/icons/svg/wi-day-cloudy-high.svg
+++ b/src/static/icons/svg/wi-day-cloudy-high.svg
diff --git a/static/icons/svg/wi-day-cloudy-windy.svg b/src/static/icons/svg/wi-day-cloudy-windy.svg
index d1a49bf..d1a49bf 100644
--- a/static/icons/svg/wi-day-cloudy-windy.svg
+++ b/src/static/icons/svg/wi-day-cloudy-windy.svg
diff --git a/static/icons/svg/wi-day-cloudy.svg b/src/static/icons/svg/wi-day-cloudy.svg
index cf63543..cf63543 100644
--- a/static/icons/svg/wi-day-cloudy.svg
+++ b/src/static/icons/svg/wi-day-cloudy.svg
diff --git a/static/icons/svg/wi-day-fog.svg b/src/static/icons/svg/wi-day-fog.svg
index 3da78ca..3da78ca 100644
--- a/static/icons/svg/wi-day-fog.svg
+++ b/src/static/icons/svg/wi-day-fog.svg
diff --git a/static/icons/svg/wi-day-hail.svg b/src/static/icons/svg/wi-day-hail.svg
index b813a6f..b813a6f 100644
--- a/static/icons/svg/wi-day-hail.svg
+++ b/src/static/icons/svg/wi-day-hail.svg
diff --git a/static/icons/svg/wi-day-haze.svg b/src/static/icons/svg/wi-day-haze.svg
index e19bf13..e19bf13 100644
--- a/static/icons/svg/wi-day-haze.svg
+++ b/src/static/icons/svg/wi-day-haze.svg
diff --git a/static/icons/svg/wi-day-light-wind.svg b/src/static/icons/svg/wi-day-light-wind.svg
index 535c6a4..535c6a4 100644
--- a/static/icons/svg/wi-day-light-wind.svg
+++ b/src/static/icons/svg/wi-day-light-wind.svg
diff --git a/static/icons/svg/wi-day-lightning.svg b/src/static/icons/svg/wi-day-lightning.svg
index 18413ed..18413ed 100644
--- a/static/icons/svg/wi-day-lightning.svg
+++ b/src/static/icons/svg/wi-day-lightning.svg
diff --git a/static/icons/svg/wi-day-rain-mix.svg b/src/static/icons/svg/wi-day-rain-mix.svg
index 8a5582d..8a5582d 100644
--- a/static/icons/svg/wi-day-rain-mix.svg
+++ b/src/static/icons/svg/wi-day-rain-mix.svg
diff --git a/static/icons/svg/wi-day-rain-wind.svg b/src/static/icons/svg/wi-day-rain-wind.svg
index db5b02b..db5b02b 100644
--- a/static/icons/svg/wi-day-rain-wind.svg
+++ b/src/static/icons/svg/wi-day-rain-wind.svg
diff --git a/static/icons/svg/wi-day-rain.svg b/src/static/icons/svg/wi-day-rain.svg
index 12b1219..12b1219 100644
--- a/static/icons/svg/wi-day-rain.svg
+++ b/src/static/icons/svg/wi-day-rain.svg
diff --git a/static/icons/svg/wi-day-showers.svg b/src/static/icons/svg/wi-day-showers.svg
index cd0cb0a..cd0cb0a 100644
--- a/static/icons/svg/wi-day-showers.svg
+++ b/src/static/icons/svg/wi-day-showers.svg
diff --git a/static/icons/svg/wi-day-sleet-storm.svg b/src/static/icons/svg/wi-day-sleet-storm.svg
index a7ff6e6..a7ff6e6 100644
--- a/static/icons/svg/wi-day-sleet-storm.svg
+++ b/src/static/icons/svg/wi-day-sleet-storm.svg
diff --git a/static/icons/svg/wi-day-sleet.svg b/src/static/icons/svg/wi-day-sleet.svg
index 42df1df..42df1df 100644
--- a/static/icons/svg/wi-day-sleet.svg
+++ b/src/static/icons/svg/wi-day-sleet.svg
diff --git a/static/icons/svg/wi-day-snow-thunderstorm.svg b/src/static/icons/svg/wi-day-snow-thunderstorm.svg
index b1e3f20..b1e3f20 100644
--- a/static/icons/svg/wi-day-snow-thunderstorm.svg
+++ b/src/static/icons/svg/wi-day-snow-thunderstorm.svg
diff --git a/static/icons/svg/wi-day-snow-wind.svg b/src/static/icons/svg/wi-day-snow-wind.svg
index 6a632dc..6a632dc 100644
--- a/static/icons/svg/wi-day-snow-wind.svg
+++ b/src/static/icons/svg/wi-day-snow-wind.svg
diff --git a/static/icons/svg/wi-day-snow.svg b/src/static/icons/svg/wi-day-snow.svg
index c1f1c71..c1f1c71 100644
--- a/static/icons/svg/wi-day-snow.svg
+++ b/src/static/icons/svg/wi-day-snow.svg
diff --git a/static/icons/svg/wi-day-sprinkle.svg b/src/static/icons/svg/wi-day-sprinkle.svg
index 5294fca..5294fca 100644
--- a/static/icons/svg/wi-day-sprinkle.svg
+++ b/src/static/icons/svg/wi-day-sprinkle.svg
diff --git a/static/icons/svg/wi-day-storm-showers.svg b/src/static/icons/svg/wi-day-storm-showers.svg
index 0166299..0166299 100644
--- a/static/icons/svg/wi-day-storm-showers.svg
+++ b/src/static/icons/svg/wi-day-storm-showers.svg
diff --git a/static/icons/svg/wi-day-sunny-overcast.svg b/src/static/icons/svg/wi-day-sunny-overcast.svg
index 4873b05..4873b05 100644
--- a/static/icons/svg/wi-day-sunny-overcast.svg
+++ b/src/static/icons/svg/wi-day-sunny-overcast.svg
diff --git a/static/icons/svg/wi-day-sunny.svg b/src/static/icons/svg/wi-day-sunny.svg
index eafcd77..eafcd77 100644
--- a/static/icons/svg/wi-day-sunny.svg
+++ b/src/static/icons/svg/wi-day-sunny.svg
diff --git a/static/icons/svg/wi-day-thunderstorm.svg b/src/static/icons/svg/wi-day-thunderstorm.svg
index 006a8e5..006a8e5 100644
--- a/static/icons/svg/wi-day-thunderstorm.svg
+++ b/src/static/icons/svg/wi-day-thunderstorm.svg
diff --git a/static/icons/svg/wi-day-windy.svg b/src/static/icons/svg/wi-day-windy.svg
index ea09d42..ea09d42 100644
--- a/static/icons/svg/wi-day-windy.svg
+++ b/src/static/icons/svg/wi-day-windy.svg
diff --git a/static/icons/svg/wi-degrees.svg b/src/static/icons/svg/wi-degrees.svg
index ba3de70..ba3de70 100644
--- a/static/icons/svg/wi-degrees.svg
+++ b/src/static/icons/svg/wi-degrees.svg
diff --git a/static/icons/svg/wi-direction-down-left.svg b/src/static/icons/svg/wi-direction-down-left.svg
index e5a46ff..e5a46ff 100644
--- a/static/icons/svg/wi-direction-down-left.svg
+++ b/src/static/icons/svg/wi-direction-down-left.svg
diff --git a/static/icons/svg/wi-direction-down-right.svg b/src/static/icons/svg/wi-direction-down-right.svg
index ecf35cc..ecf35cc 100644
--- a/static/icons/svg/wi-direction-down-right.svg
+++ b/src/static/icons/svg/wi-direction-down-right.svg
diff --git a/static/icons/svg/wi-direction-down.svg b/src/static/icons/svg/wi-direction-down.svg
index 17d7048..17d7048 100644
--- a/static/icons/svg/wi-direction-down.svg
+++ b/src/static/icons/svg/wi-direction-down.svg
diff --git a/static/icons/svg/wi-direction-left.svg b/src/static/icons/svg/wi-direction-left.svg
index bf3f5be..bf3f5be 100644
--- a/static/icons/svg/wi-direction-left.svg
+++ b/src/static/icons/svg/wi-direction-left.svg
diff --git a/static/icons/svg/wi-direction-right.svg b/src/static/icons/svg/wi-direction-right.svg
index 8f02b00..8f02b00 100644
--- a/static/icons/svg/wi-direction-right.svg
+++ b/src/static/icons/svg/wi-direction-right.svg
diff --git a/static/icons/svg/wi-direction-up-left.svg b/src/static/icons/svg/wi-direction-up-left.svg
index 884b611..884b611 100644
--- a/static/icons/svg/wi-direction-up-left.svg
+++ b/src/static/icons/svg/wi-direction-up-left.svg
diff --git a/static/icons/svg/wi-direction-up-right.svg b/src/static/icons/svg/wi-direction-up-right.svg
index 45d8f72..45d8f72 100644
--- a/static/icons/svg/wi-direction-up-right.svg
+++ b/src/static/icons/svg/wi-direction-up-right.svg
diff --git a/static/icons/svg/wi-direction-up.svg b/src/static/icons/svg/wi-direction-up.svg
index 668a152..668a152 100644
--- a/static/icons/svg/wi-direction-up.svg
+++ b/src/static/icons/svg/wi-direction-up.svg
diff --git a/static/icons/svg/wi-dust.svg b/src/static/icons/svg/wi-dust.svg
index aa90229..aa90229 100644
--- a/static/icons/svg/wi-dust.svg
+++ b/src/static/icons/svg/wi-dust.svg
diff --git a/static/icons/svg/wi-earthquake.svg b/src/static/icons/svg/wi-earthquake.svg
index c7c752d..c7c752d 100644
--- a/static/icons/svg/wi-earthquake.svg
+++ b/src/static/icons/svg/wi-earthquake.svg
diff --git a/static/icons/svg/wi-fahrenheit.svg b/src/static/icons/svg/wi-fahrenheit.svg
index dffa947..dffa947 100644
--- a/static/icons/svg/wi-fahrenheit.svg
+++ b/src/static/icons/svg/wi-fahrenheit.svg
diff --git a/static/icons/svg/wi-fire.svg b/src/static/icons/svg/wi-fire.svg
index 33b0502..33b0502 100644
--- a/static/icons/svg/wi-fire.svg
+++ b/src/static/icons/svg/wi-fire.svg
diff --git a/static/icons/svg/wi-flood.svg b/src/static/icons/svg/wi-flood.svg
index 48e218e..48e218e 100644
--- a/static/icons/svg/wi-flood.svg
+++ b/src/static/icons/svg/wi-flood.svg
diff --git a/static/icons/svg/wi-fog.svg b/src/static/icons/svg/wi-fog.svg
index cf06f8f..cf06f8f 100644
--- a/static/icons/svg/wi-fog.svg
+++ b/src/static/icons/svg/wi-fog.svg
diff --git a/static/icons/svg/wi-gale-warning.svg b/src/static/icons/svg/wi-gale-warning.svg
index 5e2f40d..5e2f40d 100644
--- a/static/icons/svg/wi-gale-warning.svg
+++ b/src/static/icons/svg/wi-gale-warning.svg
diff --git a/static/icons/svg/wi-hail.svg b/src/static/icons/svg/wi-hail.svg
index 26c4b0d..26c4b0d 100644
--- a/static/icons/svg/wi-hail.svg
+++ b/src/static/icons/svg/wi-hail.svg
diff --git a/static/icons/svg/wi-horizon-alt.svg b/src/static/icons/svg/wi-horizon-alt.svg
index ff423f3..ff423f3 100644
--- a/static/icons/svg/wi-horizon-alt.svg
+++ b/src/static/icons/svg/wi-horizon-alt.svg
diff --git a/static/icons/svg/wi-horizon.svg b/src/static/icons/svg/wi-horizon.svg
index feef2ef..feef2ef 100644
--- a/static/icons/svg/wi-horizon.svg
+++ b/src/static/icons/svg/wi-horizon.svg
diff --git a/static/icons/svg/wi-hot.svg b/src/static/icons/svg/wi-hot.svg
index 66faa3a..66faa3a 100644
--- a/static/icons/svg/wi-hot.svg
+++ b/src/static/icons/svg/wi-hot.svg
diff --git a/static/icons/svg/wi-humidity.svg b/src/static/icons/svg/wi-humidity.svg
index 9c75750..9c75750 100644
--- a/static/icons/svg/wi-humidity.svg
+++ b/src/static/icons/svg/wi-humidity.svg
diff --git a/static/icons/svg/wi-hurricane-warning.svg b/src/static/icons/svg/wi-hurricane-warning.svg
index 1365a44..1365a44 100644
--- a/static/icons/svg/wi-hurricane-warning.svg
+++ b/src/static/icons/svg/wi-hurricane-warning.svg
diff --git a/static/icons/svg/wi-hurricane.svg b/src/static/icons/svg/wi-hurricane.svg
index 3d2b4fd..3d2b4fd 100644
--- a/static/icons/svg/wi-hurricane.svg
+++ b/src/static/icons/svg/wi-hurricane.svg
diff --git a/static/icons/svg/wi-lightning.svg b/src/static/icons/svg/wi-lightning.svg
index 0709cf3..0709cf3 100644
--- a/static/icons/svg/wi-lightning.svg
+++ b/src/static/icons/svg/wi-lightning.svg
diff --git a/static/icons/svg/wi-lunar-eclipse.svg b/src/static/icons/svg/wi-lunar-eclipse.svg
index 7e86183..7e86183 100644
--- a/static/icons/svg/wi-lunar-eclipse.svg
+++ b/src/static/icons/svg/wi-lunar-eclipse.svg
diff --git a/static/icons/svg/wi-meteor.svg b/src/static/icons/svg/wi-meteor.svg
index 4da65ab..4da65ab 100644
--- a/static/icons/svg/wi-meteor.svg
+++ b/src/static/icons/svg/wi-meteor.svg
diff --git a/static/icons/svg/wi-moon-alt-first-quarter.svg b/src/static/icons/svg/wi-moon-alt-first-quarter.svg
index 26d9400..26d9400 100644
--- a/static/icons/svg/wi-moon-alt-first-quarter.svg
+++ b/src/static/icons/svg/wi-moon-alt-first-quarter.svg
diff --git a/static/icons/svg/wi-moon-alt-full.svg b/src/static/icons/svg/wi-moon-alt-full.svg
index 20fd7b4..20fd7b4 100644
--- a/static/icons/svg/wi-moon-alt-full.svg
+++ b/src/static/icons/svg/wi-moon-alt-full.svg
diff --git a/static/icons/svg/wi-moon-alt-new.svg b/src/static/icons/svg/wi-moon-alt-new.svg
index 75b89ac..75b89ac 100644
--- a/static/icons/svg/wi-moon-alt-new.svg
+++ b/src/static/icons/svg/wi-moon-alt-new.svg
diff --git a/static/icons/svg/wi-moon-alt-third-quarter.svg b/src/static/icons/svg/wi-moon-alt-third-quarter.svg
index 964d559..964d559 100644
--- a/static/icons/svg/wi-moon-alt-third-quarter.svg
+++ b/src/static/icons/svg/wi-moon-alt-third-quarter.svg
diff --git a/static/icons/svg/wi-moon-alt-waning-crescent-1.svg b/src/static/icons/svg/wi-moon-alt-waning-crescent-1.svg
index 5e7d3a4..5e7d3a4 100644
--- a/static/icons/svg/wi-moon-alt-waning-crescent-1.svg
+++ b/src/static/icons/svg/wi-moon-alt-waning-crescent-1.svg
diff --git a/static/icons/svg/wi-moon-alt-waning-crescent-2.svg b/src/static/icons/svg/wi-moon-alt-waning-crescent-2.svg
index 8386927..8386927 100644
--- a/static/icons/svg/wi-moon-alt-waning-crescent-2.svg
+++ b/src/static/icons/svg/wi-moon-alt-waning-crescent-2.svg
diff --git a/static/icons/svg/wi-moon-alt-waning-crescent-3.svg b/src/static/icons/svg/wi-moon-alt-waning-crescent-3.svg
index aa2b4db..aa2b4db 100644
--- a/static/icons/svg/wi-moon-alt-waning-crescent-3.svg
+++ b/src/static/icons/svg/wi-moon-alt-waning-crescent-3.svg
diff --git a/static/icons/svg/wi-moon-alt-waning-crescent-4.svg b/src/static/icons/svg/wi-moon-alt-waning-crescent-4.svg
index bb09c26..bb09c26 100644
--- a/static/icons/svg/wi-moon-alt-waning-crescent-4.svg
+++ b/src/static/icons/svg/wi-moon-alt-waning-crescent-4.svg
diff --git a/static/icons/svg/wi-moon-alt-waning-crescent-5.svg b/src/static/icons/svg/wi-moon-alt-waning-crescent-5.svg
index 0f5b9be..0f5b9be 100644
--- a/static/icons/svg/wi-moon-alt-waning-crescent-5.svg
+++ b/src/static/icons/svg/wi-moon-alt-waning-crescent-5.svg
diff --git a/static/icons/svg/wi-moon-alt-waning-crescent-6.svg b/src/static/icons/svg/wi-moon-alt-waning-crescent-6.svg
index ff23247..ff23247 100644
--- a/static/icons/svg/wi-moon-alt-waning-crescent-6.svg
+++ b/src/static/icons/svg/wi-moon-alt-waning-crescent-6.svg
diff --git a/static/icons/svg/wi-moon-alt-waning-gibbous-1.svg b/src/static/icons/svg/wi-moon-alt-waning-gibbous-1.svg
index 4e7a6f6..4e7a6f6 100644
--- a/static/icons/svg/wi-moon-alt-waning-gibbous-1.svg
+++ b/src/static/icons/svg/wi-moon-alt-waning-gibbous-1.svg
diff --git a/static/icons/svg/wi-moon-alt-waning-gibbous-2.svg b/src/static/icons/svg/wi-moon-alt-waning-gibbous-2.svg
index 0a363af..0a363af 100644
--- a/static/icons/svg/wi-moon-alt-waning-gibbous-2.svg
+++ b/src/static/icons/svg/wi-moon-alt-waning-gibbous-2.svg
diff --git a/static/icons/svg/wi-moon-alt-waning-gibbous-3.svg b/src/static/icons/svg/wi-moon-alt-waning-gibbous-3.svg
index a8df601..a8df601 100644
--- a/static/icons/svg/wi-moon-alt-waning-gibbous-3.svg
+++ b/src/static/icons/svg/wi-moon-alt-waning-gibbous-3.svg
diff --git a/static/icons/svg/wi-moon-alt-waning-gibbous-4.svg b/src/static/icons/svg/wi-moon-alt-waning-gibbous-4.svg
index 8df81ae..8df81ae 100644
--- a/static/icons/svg/wi-moon-alt-waning-gibbous-4.svg
+++ b/src/static/icons/svg/wi-moon-alt-waning-gibbous-4.svg
diff --git a/static/icons/svg/wi-moon-alt-waning-gibbous-5.svg b/src/static/icons/svg/wi-moon-alt-waning-gibbous-5.svg
index 9a0354e..9a0354e 100644
--- a/static/icons/svg/wi-moon-alt-waning-gibbous-5.svg
+++ b/src/static/icons/svg/wi-moon-alt-waning-gibbous-5.svg
diff --git a/static/icons/svg/wi-moon-alt-waning-gibbous-6.svg b/src/static/icons/svg/wi-moon-alt-waning-gibbous-6.svg
index fffae24..fffae24 100644
--- a/static/icons/svg/wi-moon-alt-waning-gibbous-6.svg
+++ b/src/static/icons/svg/wi-moon-alt-waning-gibbous-6.svg
diff --git a/static/icons/svg/wi-moon-alt-waxing-crescent-1.svg b/src/static/icons/svg/wi-moon-alt-waxing-crescent-1.svg
index a6516f9..a6516f9 100644
--- a/static/icons/svg/wi-moon-alt-waxing-crescent-1.svg
+++ b/src/static/icons/svg/wi-moon-alt-waxing-crescent-1.svg
diff --git a/static/icons/svg/wi-moon-alt-waxing-crescent-2.svg b/src/static/icons/svg/wi-moon-alt-waxing-crescent-2.svg
index 696ea78..696ea78 100644
--- a/static/icons/svg/wi-moon-alt-waxing-crescent-2.svg
+++ b/src/static/icons/svg/wi-moon-alt-waxing-crescent-2.svg
diff --git a/static/icons/svg/wi-moon-alt-waxing-crescent-3.svg b/src/static/icons/svg/wi-moon-alt-waxing-crescent-3.svg
index 6aff9d5..6aff9d5 100644
--- a/static/icons/svg/wi-moon-alt-waxing-crescent-3.svg
+++ b/src/static/icons/svg/wi-moon-alt-waxing-crescent-3.svg
diff --git a/static/icons/svg/wi-moon-alt-waxing-crescent-4.svg b/src/static/icons/svg/wi-moon-alt-waxing-crescent-4.svg
index b5ef2bc..b5ef2bc 100644
--- a/static/icons/svg/wi-moon-alt-waxing-crescent-4.svg
+++ b/src/static/icons/svg/wi-moon-alt-waxing-crescent-4.svg
diff --git a/static/icons/svg/wi-moon-alt-waxing-crescent-5.svg b/src/static/icons/svg/wi-moon-alt-waxing-crescent-5.svg
index e6cb75d..e6cb75d 100644
--- a/static/icons/svg/wi-moon-alt-waxing-crescent-5.svg
+++ b/src/static/icons/svg/wi-moon-alt-waxing-crescent-5.svg
diff --git a/static/icons/svg/wi-moon-alt-waxing-crescent-6.svg b/src/static/icons/svg/wi-moon-alt-waxing-crescent-6.svg
index 8677cc4..8677cc4 100644
--- a/static/icons/svg/wi-moon-alt-waxing-crescent-6.svg
+++ b/src/static/icons/svg/wi-moon-alt-waxing-crescent-6.svg
diff --git a/static/icons/svg/wi-moon-alt-waxing-gibbous-1.svg b/src/static/icons/svg/wi-moon-alt-waxing-gibbous-1.svg
index 41be53a..41be53a 100644
--- a/static/icons/svg/wi-moon-alt-waxing-gibbous-1.svg
+++ b/src/static/icons/svg/wi-moon-alt-waxing-gibbous-1.svg
diff --git a/static/icons/svg/wi-moon-alt-waxing-gibbous-2.svg b/src/static/icons/svg/wi-moon-alt-waxing-gibbous-2.svg
index cc6c51d..cc6c51d 100644
--- a/static/icons/svg/wi-moon-alt-waxing-gibbous-2.svg
+++ b/src/static/icons/svg/wi-moon-alt-waxing-gibbous-2.svg
diff --git a/static/icons/svg/wi-moon-alt-waxing-gibbous-3.svg b/src/static/icons/svg/wi-moon-alt-waxing-gibbous-3.svg
index 2c969dc..2c969dc 100644
--- a/static/icons/svg/wi-moon-alt-waxing-gibbous-3.svg
+++ b/src/static/icons/svg/wi-moon-alt-waxing-gibbous-3.svg
diff --git a/static/icons/svg/wi-moon-alt-waxing-gibbous-4.svg b/src/static/icons/svg/wi-moon-alt-waxing-gibbous-4.svg
index 4db9816..4db9816 100644
--- a/static/icons/svg/wi-moon-alt-waxing-gibbous-4.svg
+++ b/src/static/icons/svg/wi-moon-alt-waxing-gibbous-4.svg
diff --git a/static/icons/svg/wi-moon-alt-waxing-gibbous-5.svg b/src/static/icons/svg/wi-moon-alt-waxing-gibbous-5.svg
index 68df9e6..68df9e6 100644
--- a/static/icons/svg/wi-moon-alt-waxing-gibbous-5.svg
+++ b/src/static/icons/svg/wi-moon-alt-waxing-gibbous-5.svg
diff --git a/static/icons/svg/wi-moon-alt-waxing-gibbous-6.svg b/src/static/icons/svg/wi-moon-alt-waxing-gibbous-6.svg
index 17ac239..17ac239 100644
--- a/static/icons/svg/wi-moon-alt-waxing-gibbous-6.svg
+++ b/src/static/icons/svg/wi-moon-alt-waxing-gibbous-6.svg
diff --git a/static/icons/svg/wi-moon-first-quarter.svg b/src/static/icons/svg/wi-moon-first-quarter.svg
index 22ba6c6..22ba6c6 100644
--- a/static/icons/svg/wi-moon-first-quarter.svg
+++ b/src/static/icons/svg/wi-moon-first-quarter.svg
diff --git a/static/icons/svg/wi-moon-full.svg b/src/static/icons/svg/wi-moon-full.svg
index 75b89ac..75b89ac 100644
--- a/static/icons/svg/wi-moon-full.svg
+++ b/src/static/icons/svg/wi-moon-full.svg
diff --git a/static/icons/svg/wi-moon-new.svg b/src/static/icons/svg/wi-moon-new.svg
index 20fd7b4..20fd7b4 100644
--- a/static/icons/svg/wi-moon-new.svg
+++ b/src/static/icons/svg/wi-moon-new.svg
diff --git a/static/icons/svg/wi-moon-third-quarter.svg b/src/static/icons/svg/wi-moon-third-quarter.svg
index 031a231..031a231 100644
--- a/static/icons/svg/wi-moon-third-quarter.svg
+++ b/src/static/icons/svg/wi-moon-third-quarter.svg
diff --git a/static/icons/svg/wi-moon-waning-crescent-1.svg b/src/static/icons/svg/wi-moon-waning-crescent-1.svg
index 7ae5d02..7ae5d02 100644
--- a/static/icons/svg/wi-moon-waning-crescent-1.svg
+++ b/src/static/icons/svg/wi-moon-waning-crescent-1.svg
diff --git a/static/icons/svg/wi-moon-waning-crescent-2.svg b/src/static/icons/svg/wi-moon-waning-crescent-2.svg
index 6e8ed9c..6e8ed9c 100644
--- a/static/icons/svg/wi-moon-waning-crescent-2.svg
+++ b/src/static/icons/svg/wi-moon-waning-crescent-2.svg
diff --git a/static/icons/svg/wi-moon-waning-crescent-3.svg b/src/static/icons/svg/wi-moon-waning-crescent-3.svg
index b2224d0..b2224d0 100644
--- a/static/icons/svg/wi-moon-waning-crescent-3.svg
+++ b/src/static/icons/svg/wi-moon-waning-crescent-3.svg
diff --git a/static/icons/svg/wi-moon-waning-crescent-4.svg b/src/static/icons/svg/wi-moon-waning-crescent-4.svg
index c5f85fd..c5f85fd 100644
--- a/static/icons/svg/wi-moon-waning-crescent-4.svg
+++ b/src/static/icons/svg/wi-moon-waning-crescent-4.svg
diff --git a/static/icons/svg/wi-moon-waning-crescent-5.svg b/src/static/icons/svg/wi-moon-waning-crescent-5.svg
index 350c227..350c227 100644
--- a/static/icons/svg/wi-moon-waning-crescent-5.svg
+++ b/src/static/icons/svg/wi-moon-waning-crescent-5.svg
diff --git a/static/icons/svg/wi-moon-waning-crescent-6.svg b/src/static/icons/svg/wi-moon-waning-crescent-6.svg
index e3fb6e7..e3fb6e7 100644
--- a/static/icons/svg/wi-moon-waning-crescent-6.svg
+++ b/src/static/icons/svg/wi-moon-waning-crescent-6.svg
diff --git a/static/icons/svg/wi-moon-waning-gibbous-1.svg b/src/static/icons/svg/wi-moon-waning-gibbous-1.svg
index ae14407..ae14407 100644
--- a/static/icons/svg/wi-moon-waning-gibbous-1.svg
+++ b/src/static/icons/svg/wi-moon-waning-gibbous-1.svg
diff --git a/static/icons/svg/wi-moon-waning-gibbous-2.svg b/src/static/icons/svg/wi-moon-waning-gibbous-2.svg
index 558ba54..558ba54 100644
--- a/static/icons/svg/wi-moon-waning-gibbous-2.svg
+++ b/src/static/icons/svg/wi-moon-waning-gibbous-2.svg
diff --git a/static/icons/svg/wi-moon-waning-gibbous-3.svg b/src/static/icons/svg/wi-moon-waning-gibbous-3.svg
index 17924cf..17924cf 100644
--- a/static/icons/svg/wi-moon-waning-gibbous-3.svg
+++ b/src/static/icons/svg/wi-moon-waning-gibbous-3.svg
diff --git a/static/icons/svg/wi-moon-waning-gibbous-4.svg b/src/static/icons/svg/wi-moon-waning-gibbous-4.svg
index 2e4c400..2e4c400 100644
--- a/static/icons/svg/wi-moon-waning-gibbous-4.svg
+++ b/src/static/icons/svg/wi-moon-waning-gibbous-4.svg
diff --git a/static/icons/svg/wi-moon-waning-gibbous-5.svg b/src/static/icons/svg/wi-moon-waning-gibbous-5.svg
index db387c5..db387c5 100644
--- a/static/icons/svg/wi-moon-waning-gibbous-5.svg
+++ b/src/static/icons/svg/wi-moon-waning-gibbous-5.svg
diff --git a/static/icons/svg/wi-moon-waning-gibbous-6.svg b/src/static/icons/svg/wi-moon-waning-gibbous-6.svg
index edcc9d6..edcc9d6 100644
--- a/static/icons/svg/wi-moon-waning-gibbous-6.svg
+++ b/src/static/icons/svg/wi-moon-waning-gibbous-6.svg
diff --git a/static/icons/svg/wi-moon-waxing-6.svg b/src/static/icons/svg/wi-moon-waxing-6.svg
index 6e9af39..6e9af39 100644
--- a/static/icons/svg/wi-moon-waxing-6.svg
+++ b/src/static/icons/svg/wi-moon-waxing-6.svg
diff --git a/static/icons/svg/wi-moon-waxing-crescent-1.svg b/src/static/icons/svg/wi-moon-waxing-crescent-1.svg
index f510a0d..f510a0d 100644
--- a/static/icons/svg/wi-moon-waxing-crescent-1.svg
+++ b/src/static/icons/svg/wi-moon-waxing-crescent-1.svg
diff --git a/static/icons/svg/wi-moon-waxing-crescent-2.svg b/src/static/icons/svg/wi-moon-waxing-crescent-2.svg
index 6b86718..6b86718 100644
--- a/static/icons/svg/wi-moon-waxing-crescent-2.svg
+++ b/src/static/icons/svg/wi-moon-waxing-crescent-2.svg
diff --git a/static/icons/svg/wi-moon-waxing-crescent-3.svg b/src/static/icons/svg/wi-moon-waxing-crescent-3.svg
index 8560f6b..8560f6b 100644
--- a/static/icons/svg/wi-moon-waxing-crescent-3.svg
+++ b/src/static/icons/svg/wi-moon-waxing-crescent-3.svg
diff --git a/static/icons/svg/wi-moon-waxing-crescent-4.svg b/src/static/icons/svg/wi-moon-waxing-crescent-4.svg
index 5f78502..5f78502 100644
--- a/static/icons/svg/wi-moon-waxing-crescent-4.svg
+++ b/src/static/icons/svg/wi-moon-waxing-crescent-4.svg
diff --git a/static/icons/svg/wi-moon-waxing-crescent-5.svg b/src/static/icons/svg/wi-moon-waxing-crescent-5.svg
index 6e9af39..6e9af39 100644
--- a/static/icons/svg/wi-moon-waxing-crescent-5.svg
+++ b/src/static/icons/svg/wi-moon-waxing-crescent-5.svg
diff --git a/static/icons/svg/wi-moon-waxing-gibbous-1.svg b/src/static/icons/svg/wi-moon-waxing-gibbous-1.svg
index 1de651a..1de651a 100644
--- a/static/icons/svg/wi-moon-waxing-gibbous-1.svg
+++ b/src/static/icons/svg/wi-moon-waxing-gibbous-1.svg
diff --git a/static/icons/svg/wi-moon-waxing-gibbous-2.svg b/src/static/icons/svg/wi-moon-waxing-gibbous-2.svg
index 842d4ac..842d4ac 100644
--- a/static/icons/svg/wi-moon-waxing-gibbous-2.svg
+++ b/src/static/icons/svg/wi-moon-waxing-gibbous-2.svg
diff --git a/static/icons/svg/wi-moon-waxing-gibbous-3.svg b/src/static/icons/svg/wi-moon-waxing-gibbous-3.svg
index 9f77ce3..9f77ce3 100644
--- a/static/icons/svg/wi-moon-waxing-gibbous-3.svg
+++ b/src/static/icons/svg/wi-moon-waxing-gibbous-3.svg
diff --git a/static/icons/svg/wi-moon-waxing-gibbous-4.svg b/src/static/icons/svg/wi-moon-waxing-gibbous-4.svg
index e472de6..e472de6 100644
--- a/static/icons/svg/wi-moon-waxing-gibbous-4.svg
+++ b/src/static/icons/svg/wi-moon-waxing-gibbous-4.svg
diff --git a/static/icons/svg/wi-moon-waxing-gibbous-5.svg b/src/static/icons/svg/wi-moon-waxing-gibbous-5.svg
index 90860cb..90860cb 100644
--- a/static/icons/svg/wi-moon-waxing-gibbous-5.svg
+++ b/src/static/icons/svg/wi-moon-waxing-gibbous-5.svg
diff --git a/static/icons/svg/wi-moon-waxing-gibbous-6.svg b/src/static/icons/svg/wi-moon-waxing-gibbous-6.svg
index 53f9b9e..53f9b9e 100644
--- a/static/icons/svg/wi-moon-waxing-gibbous-6.svg
+++ b/src/static/icons/svg/wi-moon-waxing-gibbous-6.svg
diff --git a/static/icons/svg/wi-moonrise.svg b/src/static/icons/svg/wi-moonrise.svg
index 5d7ddb0..5d7ddb0 100644
--- a/static/icons/svg/wi-moonrise.svg
+++ b/src/static/icons/svg/wi-moonrise.svg
diff --git a/static/icons/svg/wi-moonset.svg b/src/static/icons/svg/wi-moonset.svg
index d78fa29..d78fa29 100644
--- a/static/icons/svg/wi-moonset.svg
+++ b/src/static/icons/svg/wi-moonset.svg
diff --git a/static/icons/svg/wi-na.svg b/src/static/icons/svg/wi-na.svg
index 0a3d369..0a3d369 100644
--- a/static/icons/svg/wi-na.svg
+++ b/src/static/icons/svg/wi-na.svg
diff --git a/static/icons/svg/wi-night-alt-cloudy-gusts.svg b/src/static/icons/svg/wi-night-alt-cloudy-gusts.svg
index 0453d3c..0453d3c 100644
--- a/static/icons/svg/wi-night-alt-cloudy-gusts.svg
+++ b/src/static/icons/svg/wi-night-alt-cloudy-gusts.svg
diff --git a/static/icons/svg/wi-night-alt-cloudy-high.svg b/src/static/icons/svg/wi-night-alt-cloudy-high.svg
index 6b1777b..6b1777b 100644
--- a/static/icons/svg/wi-night-alt-cloudy-high.svg
+++ b/src/static/icons/svg/wi-night-alt-cloudy-high.svg
diff --git a/static/icons/svg/wi-night-alt-cloudy-windy.svg b/src/static/icons/svg/wi-night-alt-cloudy-windy.svg
index f6a291e..f6a291e 100644
--- a/static/icons/svg/wi-night-alt-cloudy-windy.svg
+++ b/src/static/icons/svg/wi-night-alt-cloudy-windy.svg
diff --git a/static/icons/svg/wi-night-alt-cloudy.svg b/src/static/icons/svg/wi-night-alt-cloudy.svg
index fcd1496..fcd1496 100644
--- a/static/icons/svg/wi-night-alt-cloudy.svg
+++ b/src/static/icons/svg/wi-night-alt-cloudy.svg
diff --git a/static/icons/svg/wi-night-alt-hail.svg b/src/static/icons/svg/wi-night-alt-hail.svg
index 38550e4..38550e4 100644
--- a/static/icons/svg/wi-night-alt-hail.svg
+++ b/src/static/icons/svg/wi-night-alt-hail.svg
diff --git a/static/icons/svg/wi-night-alt-lightning.svg b/src/static/icons/svg/wi-night-alt-lightning.svg
index f01d745..f01d745 100644
--- a/static/icons/svg/wi-night-alt-lightning.svg
+++ b/src/static/icons/svg/wi-night-alt-lightning.svg
diff --git a/static/icons/svg/wi-night-alt-partly-cloudy.svg b/src/static/icons/svg/wi-night-alt-partly-cloudy.svg
index 2b36834..2b36834 100644
--- a/static/icons/svg/wi-night-alt-partly-cloudy.svg
+++ b/src/static/icons/svg/wi-night-alt-partly-cloudy.svg
diff --git a/static/icons/svg/wi-night-alt-rain-mix.svg b/src/static/icons/svg/wi-night-alt-rain-mix.svg
index 4ce81bc..4ce81bc 100644
--- a/static/icons/svg/wi-night-alt-rain-mix.svg
+++ b/src/static/icons/svg/wi-night-alt-rain-mix.svg
diff --git a/static/icons/svg/wi-night-alt-rain-wind.svg b/src/static/icons/svg/wi-night-alt-rain-wind.svg
index f90a680..f90a680 100644
--- a/static/icons/svg/wi-night-alt-rain-wind.svg
+++ b/src/static/icons/svg/wi-night-alt-rain-wind.svg
diff --git a/static/icons/svg/wi-night-alt-rain.svg b/src/static/icons/svg/wi-night-alt-rain.svg
index b4d8065..b4d8065 100644
--- a/static/icons/svg/wi-night-alt-rain.svg
+++ b/src/static/icons/svg/wi-night-alt-rain.svg
diff --git a/static/icons/svg/wi-night-alt-showers.svg b/src/static/icons/svg/wi-night-alt-showers.svg
index dd917e0..dd917e0 100644
--- a/static/icons/svg/wi-night-alt-showers.svg
+++ b/src/static/icons/svg/wi-night-alt-showers.svg
diff --git a/static/icons/svg/wi-night-alt-sleet-storm.svg b/src/static/icons/svg/wi-night-alt-sleet-storm.svg
index afd111d..afd111d 100644
--- a/static/icons/svg/wi-night-alt-sleet-storm.svg
+++ b/src/static/icons/svg/wi-night-alt-sleet-storm.svg
diff --git a/static/icons/svg/wi-night-alt-sleet.svg b/src/static/icons/svg/wi-night-alt-sleet.svg
index 3fbdd15..3fbdd15 100644
--- a/static/icons/svg/wi-night-alt-sleet.svg
+++ b/src/static/icons/svg/wi-night-alt-sleet.svg
diff --git a/static/icons/svg/wi-night-alt-snow-thunderstorm.svg b/src/static/icons/svg/wi-night-alt-snow-thunderstorm.svg
index 304a7eb..304a7eb 100644
--- a/static/icons/svg/wi-night-alt-snow-thunderstorm.svg
+++ b/src/static/icons/svg/wi-night-alt-snow-thunderstorm.svg
diff --git a/static/icons/svg/wi-night-alt-snow-wind.svg b/src/static/icons/svg/wi-night-alt-snow-wind.svg
index f35566a..f35566a 100644
--- a/static/icons/svg/wi-night-alt-snow-wind.svg
+++ b/src/static/icons/svg/wi-night-alt-snow-wind.svg
diff --git a/static/icons/svg/wi-night-alt-snow.svg b/src/static/icons/svg/wi-night-alt-snow.svg
index b314bdd..b314bdd 100644
--- a/static/icons/svg/wi-night-alt-snow.svg
+++ b/src/static/icons/svg/wi-night-alt-snow.svg
diff --git a/static/icons/svg/wi-night-alt-sprinkle.svg b/src/static/icons/svg/wi-night-alt-sprinkle.svg
index 47dfcb1..47dfcb1 100644
--- a/static/icons/svg/wi-night-alt-sprinkle.svg
+++ b/src/static/icons/svg/wi-night-alt-sprinkle.svg
diff --git a/static/icons/svg/wi-night-alt-storm-showers.svg b/src/static/icons/svg/wi-night-alt-storm-showers.svg
index 6747df2..6747df2 100644
--- a/static/icons/svg/wi-night-alt-storm-showers.svg
+++ b/src/static/icons/svg/wi-night-alt-storm-showers.svg
diff --git a/static/icons/svg/wi-night-alt-thunderstorm.svg b/src/static/icons/svg/wi-night-alt-thunderstorm.svg
index 0af7a15..0af7a15 100644
--- a/static/icons/svg/wi-night-alt-thunderstorm.svg
+++ b/src/static/icons/svg/wi-night-alt-thunderstorm.svg
diff --git a/static/icons/svg/wi-night-clear.svg b/src/static/icons/svg/wi-night-clear.svg
index 053b2de..053b2de 100644
--- a/static/icons/svg/wi-night-clear.svg
+++ b/src/static/icons/svg/wi-night-clear.svg
diff --git a/static/icons/svg/wi-night-cloudy-gusts.svg b/src/static/icons/svg/wi-night-cloudy-gusts.svg
index e502c48..e502c48 100644
--- a/static/icons/svg/wi-night-cloudy-gusts.svg
+++ b/src/static/icons/svg/wi-night-cloudy-gusts.svg
diff --git a/static/icons/svg/wi-night-cloudy-high.svg b/src/static/icons/svg/wi-night-cloudy-high.svg
index 8235377..8235377 100644
--- a/static/icons/svg/wi-night-cloudy-high.svg
+++ b/src/static/icons/svg/wi-night-cloudy-high.svg
diff --git a/static/icons/svg/wi-night-cloudy-windy.svg b/src/static/icons/svg/wi-night-cloudy-windy.svg
index 3a6137a..3a6137a 100644
--- a/static/icons/svg/wi-night-cloudy-windy.svg
+++ b/src/static/icons/svg/wi-night-cloudy-windy.svg
diff --git a/static/icons/svg/wi-night-cloudy.svg b/src/static/icons/svg/wi-night-cloudy.svg
index 8b76dba..8b76dba 100644
--- a/static/icons/svg/wi-night-cloudy.svg
+++ b/src/static/icons/svg/wi-night-cloudy.svg
diff --git a/static/icons/svg/wi-night-fog.svg b/src/static/icons/svg/wi-night-fog.svg
index a895dac..a895dac 100644
--- a/static/icons/svg/wi-night-fog.svg
+++ b/src/static/icons/svg/wi-night-fog.svg
diff --git a/static/icons/svg/wi-night-hail.svg b/src/static/icons/svg/wi-night-hail.svg
index 249ed64..249ed64 100644
--- a/static/icons/svg/wi-night-hail.svg
+++ b/src/static/icons/svg/wi-night-hail.svg
diff --git a/static/icons/svg/wi-night-lightning.svg b/src/static/icons/svg/wi-night-lightning.svg
index 55ac76e..55ac76e 100644
--- a/static/icons/svg/wi-night-lightning.svg
+++ b/src/static/icons/svg/wi-night-lightning.svg
diff --git a/static/icons/svg/wi-night-partly-cloudy.svg b/src/static/icons/svg/wi-night-partly-cloudy.svg
index e4d2f99..e4d2f99 100644
--- a/static/icons/svg/wi-night-partly-cloudy.svg
+++ b/src/static/icons/svg/wi-night-partly-cloudy.svg
diff --git a/static/icons/svg/wi-night-rain-mix.svg b/src/static/icons/svg/wi-night-rain-mix.svg
index f5883d7..f5883d7 100644
--- a/static/icons/svg/wi-night-rain-mix.svg
+++ b/src/static/icons/svg/wi-night-rain-mix.svg
diff --git a/static/icons/svg/wi-night-rain-wind.svg b/src/static/icons/svg/wi-night-rain-wind.svg
index 8d8ccf7..8d8ccf7 100644
--- a/static/icons/svg/wi-night-rain-wind.svg
+++ b/src/static/icons/svg/wi-night-rain-wind.svg
diff --git a/static/icons/svg/wi-night-rain.svg b/src/static/icons/svg/wi-night-rain.svg
index 3d4e6dc..3d4e6dc 100644
--- a/static/icons/svg/wi-night-rain.svg
+++ b/src/static/icons/svg/wi-night-rain.svg
diff --git a/static/icons/svg/wi-night-showers.svg b/src/static/icons/svg/wi-night-showers.svg
index 4829c81..4829c81 100644
--- a/static/icons/svg/wi-night-showers.svg
+++ b/src/static/icons/svg/wi-night-showers.svg
diff --git a/static/icons/svg/wi-night-sleet-storm.svg b/src/static/icons/svg/wi-night-sleet-storm.svg
index 7638b54..7638b54 100644
--- a/static/icons/svg/wi-night-sleet-storm.svg
+++ b/src/static/icons/svg/wi-night-sleet-storm.svg
diff --git a/static/icons/svg/wi-night-sleet.svg b/src/static/icons/svg/wi-night-sleet.svg
index 0ff3e36..0ff3e36 100644
--- a/static/icons/svg/wi-night-sleet.svg
+++ b/src/static/icons/svg/wi-night-sleet.svg
diff --git a/static/icons/svg/wi-night-snow-thunderstorm.svg b/src/static/icons/svg/wi-night-snow-thunderstorm.svg
index ec98dd8..ec98dd8 100644
--- a/static/icons/svg/wi-night-snow-thunderstorm.svg
+++ b/src/static/icons/svg/wi-night-snow-thunderstorm.svg
diff --git a/static/icons/svg/wi-night-snow-wind.svg b/src/static/icons/svg/wi-night-snow-wind.svg
index d34c39f..d34c39f 100644
--- a/static/icons/svg/wi-night-snow-wind.svg
+++ b/src/static/icons/svg/wi-night-snow-wind.svg
diff --git a/static/icons/svg/wi-night-snow.svg b/src/static/icons/svg/wi-night-snow.svg
index c4bab74..c4bab74 100644
--- a/static/icons/svg/wi-night-snow.svg
+++ b/src/static/icons/svg/wi-night-snow.svg
diff --git a/static/icons/svg/wi-night-sprinkle.svg b/src/static/icons/svg/wi-night-sprinkle.svg
index 2793da3..2793da3 100644
--- a/static/icons/svg/wi-night-sprinkle.svg
+++ b/src/static/icons/svg/wi-night-sprinkle.svg
diff --git a/static/icons/svg/wi-night-storm-showers.svg b/src/static/icons/svg/wi-night-storm-showers.svg
index 1cf5202..1cf5202 100644
--- a/static/icons/svg/wi-night-storm-showers.svg
+++ b/src/static/icons/svg/wi-night-storm-showers.svg
diff --git a/static/icons/svg/wi-night-thunderstorm.svg b/src/static/icons/svg/wi-night-thunderstorm.svg
index b9541cb..b9541cb 100644
--- a/static/icons/svg/wi-night-thunderstorm.svg
+++ b/src/static/icons/svg/wi-night-thunderstorm.svg
diff --git a/static/icons/svg/wi-rain-mix.svg b/src/static/icons/svg/wi-rain-mix.svg
index 51cf189..51cf189 100644
--- a/static/icons/svg/wi-rain-mix.svg
+++ b/src/static/icons/svg/wi-rain-mix.svg
diff --git a/static/icons/svg/wi-rain-wind.svg b/src/static/icons/svg/wi-rain-wind.svg
index aef262a..aef262a 100644
--- a/static/icons/svg/wi-rain-wind.svg
+++ b/src/static/icons/svg/wi-rain-wind.svg
diff --git a/static/icons/svg/wi-rain.svg b/src/static/icons/svg/wi-rain.svg
index 7ecef3f..7ecef3f 100644
--- a/static/icons/svg/wi-rain.svg
+++ b/src/static/icons/svg/wi-rain.svg
diff --git a/static/icons/svg/wi-raindrop.svg b/src/static/icons/svg/wi-raindrop.svg
index d24aee4..d24aee4 100644
--- a/static/icons/svg/wi-raindrop.svg
+++ b/src/static/icons/svg/wi-raindrop.svg
diff --git a/static/icons/svg/wi-raindrops.svg b/src/static/icons/svg/wi-raindrops.svg
index 157ddf0..157ddf0 100644
--- a/static/icons/svg/wi-raindrops.svg
+++ b/src/static/icons/svg/wi-raindrops.svg
diff --git a/static/icons/svg/wi-refresh-alt.svg b/src/static/icons/svg/wi-refresh-alt.svg
index 33c9b18..33c9b18 100644
--- a/static/icons/svg/wi-refresh-alt.svg
+++ b/src/static/icons/svg/wi-refresh-alt.svg
diff --git a/static/icons/svg/wi-refresh.svg b/src/static/icons/svg/wi-refresh.svg
index 32e09a8..32e09a8 100644
--- a/static/icons/svg/wi-refresh.svg
+++ b/src/static/icons/svg/wi-refresh.svg
diff --git a/static/icons/svg/wi-sandstorm.svg b/src/static/icons/svg/wi-sandstorm.svg
index cbdad2a..cbdad2a 100644
--- a/static/icons/svg/wi-sandstorm.svg
+++ b/src/static/icons/svg/wi-sandstorm.svg
diff --git a/static/icons/svg/wi-showers.svg b/src/static/icons/svg/wi-showers.svg
index 3cb7e31..3cb7e31 100644
--- a/static/icons/svg/wi-showers.svg
+++ b/src/static/icons/svg/wi-showers.svg
diff --git a/static/icons/svg/wi-sleet.svg b/src/static/icons/svg/wi-sleet.svg
index b97bc09..b97bc09 100644
--- a/static/icons/svg/wi-sleet.svg
+++ b/src/static/icons/svg/wi-sleet.svg
diff --git a/static/icons/svg/wi-small-craft-advisory.svg b/src/static/icons/svg/wi-small-craft-advisory.svg
index ab6f45e..ab6f45e 100644
--- a/static/icons/svg/wi-small-craft-advisory.svg
+++ b/src/static/icons/svg/wi-small-craft-advisory.svg
diff --git a/static/icons/svg/wi-smog.svg b/src/static/icons/svg/wi-smog.svg
index a2f0d89..a2f0d89 100644
--- a/static/icons/svg/wi-smog.svg
+++ b/src/static/icons/svg/wi-smog.svg
diff --git a/static/icons/svg/wi-smoke.svg b/src/static/icons/svg/wi-smoke.svg
index 82e8fdc..82e8fdc 100644
--- a/static/icons/svg/wi-smoke.svg
+++ b/src/static/icons/svg/wi-smoke.svg
diff --git a/static/icons/svg/wi-snow-wind.svg b/src/static/icons/svg/wi-snow-wind.svg
index 950aeac..950aeac 100644
--- a/static/icons/svg/wi-snow-wind.svg
+++ b/src/static/icons/svg/wi-snow-wind.svg
diff --git a/static/icons/svg/wi-snow.svg b/src/static/icons/svg/wi-snow.svg
index 56afebf..56afebf 100644
--- a/static/icons/svg/wi-snow.svg
+++ b/src/static/icons/svg/wi-snow.svg
diff --git a/static/icons/svg/wi-snowflake-cold.svg b/src/static/icons/svg/wi-snowflake-cold.svg
index 0f117b9..0f117b9 100644
--- a/static/icons/svg/wi-snowflake-cold.svg
+++ b/src/static/icons/svg/wi-snowflake-cold.svg
diff --git a/static/icons/svg/wi-solar-eclipse.svg b/src/static/icons/svg/wi-solar-eclipse.svg
index 19c62a8..19c62a8 100644
--- a/static/icons/svg/wi-solar-eclipse.svg
+++ b/src/static/icons/svg/wi-solar-eclipse.svg
diff --git a/static/icons/svg/wi-sprinkle.svg b/src/static/icons/svg/wi-sprinkle.svg
index c26b207..c26b207 100644
--- a/static/icons/svg/wi-sprinkle.svg
+++ b/src/static/icons/svg/wi-sprinkle.svg
diff --git a/static/icons/svg/wi-stars.svg b/src/static/icons/svg/wi-stars.svg
index 76e7003..76e7003 100644
--- a/static/icons/svg/wi-stars.svg
+++ b/src/static/icons/svg/wi-stars.svg
diff --git a/static/icons/svg/wi-storm-showers.svg b/src/static/icons/svg/wi-storm-showers.svg
index df3fe0f..df3fe0f 100644
--- a/static/icons/svg/wi-storm-showers.svg
+++ b/src/static/icons/svg/wi-storm-showers.svg
diff --git a/static/icons/svg/wi-storm-warning.svg b/src/static/icons/svg/wi-storm-warning.svg
index db146c1..db146c1 100644
--- a/static/icons/svg/wi-storm-warning.svg
+++ b/src/static/icons/svg/wi-storm-warning.svg
diff --git a/static/icons/svg/wi-strong-wind.svg b/src/static/icons/svg/wi-strong-wind.svg
index 70dda9c..70dda9c 100644
--- a/static/icons/svg/wi-strong-wind.svg
+++ b/src/static/icons/svg/wi-strong-wind.svg
diff --git a/static/icons/svg/wi-sunrise.svg b/src/static/icons/svg/wi-sunrise.svg
index 5718ac3..5718ac3 100644
--- a/static/icons/svg/wi-sunrise.svg
+++ b/src/static/icons/svg/wi-sunrise.svg
diff --git a/static/icons/svg/wi-sunset.svg b/src/static/icons/svg/wi-sunset.svg
index cc82902..cc82902 100644
--- a/static/icons/svg/wi-sunset.svg
+++ b/src/static/icons/svg/wi-sunset.svg
diff --git a/static/icons/svg/wi-thermometer-exterior.svg b/src/static/icons/svg/wi-thermometer-exterior.svg
index e0d345d..e0d345d 100644
--- a/static/icons/svg/wi-thermometer-exterior.svg
+++ b/src/static/icons/svg/wi-thermometer-exterior.svg
diff --git a/static/icons/svg/wi-thermometer-internal.svg b/src/static/icons/svg/wi-thermometer-internal.svg
index b590a9f..b590a9f 100644
--- a/static/icons/svg/wi-thermometer-internal.svg
+++ b/src/static/icons/svg/wi-thermometer-internal.svg
diff --git a/static/icons/svg/wi-thermometer.svg b/src/static/icons/svg/wi-thermometer.svg
index a0fa8d0..a0fa8d0 100644
--- a/static/icons/svg/wi-thermometer.svg
+++ b/src/static/icons/svg/wi-thermometer.svg
diff --git a/static/icons/svg/wi-thunderstorm.svg b/src/static/icons/svg/wi-thunderstorm.svg
index 52555ec..52555ec 100644
--- a/static/icons/svg/wi-thunderstorm.svg
+++ b/src/static/icons/svg/wi-thunderstorm.svg
diff --git a/static/icons/svg/wi-time-1.svg b/src/static/icons/svg/wi-time-1.svg
index c5ea658..c5ea658 100644
--- a/static/icons/svg/wi-time-1.svg
+++ b/src/static/icons/svg/wi-time-1.svg
diff --git a/static/icons/svg/wi-time-10.svg b/src/static/icons/svg/wi-time-10.svg
index 3a02d59..3a02d59 100644
--- a/static/icons/svg/wi-time-10.svg
+++ b/src/static/icons/svg/wi-time-10.svg
diff --git a/static/icons/svg/wi-time-11.svg b/src/static/icons/svg/wi-time-11.svg
index 1625390..1625390 100644
--- a/static/icons/svg/wi-time-11.svg
+++ b/src/static/icons/svg/wi-time-11.svg
diff --git a/static/icons/svg/wi-time-12.svg b/src/static/icons/svg/wi-time-12.svg
index 32cc7f0..32cc7f0 100644
--- a/static/icons/svg/wi-time-12.svg
+++ b/src/static/icons/svg/wi-time-12.svg
diff --git a/static/icons/svg/wi-time-2.svg b/src/static/icons/svg/wi-time-2.svg
index 9e874a3..9e874a3 100644
--- a/static/icons/svg/wi-time-2.svg
+++ b/src/static/icons/svg/wi-time-2.svg
diff --git a/static/icons/svg/wi-time-3.svg b/src/static/icons/svg/wi-time-3.svg
index 5c0cd90..5c0cd90 100644
--- a/static/icons/svg/wi-time-3.svg
+++ b/src/static/icons/svg/wi-time-3.svg
diff --git a/static/icons/svg/wi-time-4.svg b/src/static/icons/svg/wi-time-4.svg
index 7dda4d2..7dda4d2 100644
--- a/static/icons/svg/wi-time-4.svg
+++ b/src/static/icons/svg/wi-time-4.svg
diff --git a/static/icons/svg/wi-time-5.svg b/src/static/icons/svg/wi-time-5.svg
index fb8f8a5..fb8f8a5 100644
--- a/static/icons/svg/wi-time-5.svg
+++ b/src/static/icons/svg/wi-time-5.svg
diff --git a/static/icons/svg/wi-time-6.svg b/src/static/icons/svg/wi-time-6.svg
index 8bbe6b0..8bbe6b0 100644
--- a/static/icons/svg/wi-time-6.svg
+++ b/src/static/icons/svg/wi-time-6.svg
diff --git a/static/icons/svg/wi-time-7.svg b/src/static/icons/svg/wi-time-7.svg
index 079551e..079551e 100644
--- a/static/icons/svg/wi-time-7.svg
+++ b/src/static/icons/svg/wi-time-7.svg
diff --git a/static/icons/svg/wi-time-8.svg b/src/static/icons/svg/wi-time-8.svg
index 6d65af2..6d65af2 100644
--- a/static/icons/svg/wi-time-8.svg
+++ b/src/static/icons/svg/wi-time-8.svg
diff --git a/static/icons/svg/wi-time-9.svg b/src/static/icons/svg/wi-time-9.svg
index b1437c3..b1437c3 100644
--- a/static/icons/svg/wi-time-9.svg
+++ b/src/static/icons/svg/wi-time-9.svg
diff --git a/static/icons/svg/wi-tornado.svg b/src/static/icons/svg/wi-tornado.svg
index 095ad95..095ad95 100644
--- a/static/icons/svg/wi-tornado.svg
+++ b/src/static/icons/svg/wi-tornado.svg
diff --git a/static/icons/svg/wi-train.svg b/src/static/icons/svg/wi-train.svg
index ded2460..ded2460 100644
--- a/static/icons/svg/wi-train.svg
+++ b/src/static/icons/svg/wi-train.svg
diff --git a/static/icons/svg/wi-tsunami.svg b/src/static/icons/svg/wi-tsunami.svg
index 2044e99..2044e99 100644
--- a/static/icons/svg/wi-tsunami.svg
+++ b/src/static/icons/svg/wi-tsunami.svg
diff --git a/static/icons/svg/wi-umbrella.svg b/src/static/icons/svg/wi-umbrella.svg
index e125bca..e125bca 100644
--- a/static/icons/svg/wi-umbrella.svg
+++ b/src/static/icons/svg/wi-umbrella.svg
diff --git a/static/icons/svg/wi-volcano.svg b/src/static/icons/svg/wi-volcano.svg
index cd8dcf3..cd8dcf3 100644
--- a/static/icons/svg/wi-volcano.svg
+++ b/src/static/icons/svg/wi-volcano.svg
diff --git a/static/icons/svg/wi-wind-beaufort-0.svg b/src/static/icons/svg/wi-wind-beaufort-0.svg
index 7ec3dba..7ec3dba 100644
--- a/static/icons/svg/wi-wind-beaufort-0.svg
+++ b/src/static/icons/svg/wi-wind-beaufort-0.svg
diff --git a/static/icons/svg/wi-wind-beaufort-1.svg b/src/static/icons/svg/wi-wind-beaufort-1.svg
index 2bab866..2bab866 100644
--- a/static/icons/svg/wi-wind-beaufort-1.svg
+++ b/src/static/icons/svg/wi-wind-beaufort-1.svg
diff --git a/static/icons/svg/wi-wind-beaufort-10.svg b/src/static/icons/svg/wi-wind-beaufort-10.svg
index f1256c6..f1256c6 100644
--- a/static/icons/svg/wi-wind-beaufort-10.svg
+++ b/src/static/icons/svg/wi-wind-beaufort-10.svg
diff --git a/static/icons/svg/wi-wind-beaufort-11.svg b/src/static/icons/svg/wi-wind-beaufort-11.svg
index d209021..d209021 100644
--- a/static/icons/svg/wi-wind-beaufort-11.svg
+++ b/src/static/icons/svg/wi-wind-beaufort-11.svg
diff --git a/static/icons/svg/wi-wind-beaufort-12.svg b/src/static/icons/svg/wi-wind-beaufort-12.svg
index 0cbf35d..0cbf35d 100644
--- a/static/icons/svg/wi-wind-beaufort-12.svg
+++ b/src/static/icons/svg/wi-wind-beaufort-12.svg
diff --git a/static/icons/svg/wi-wind-beaufort-2.svg b/src/static/icons/svg/wi-wind-beaufort-2.svg
index 740f2af..740f2af 100644
--- a/static/icons/svg/wi-wind-beaufort-2.svg
+++ b/src/static/icons/svg/wi-wind-beaufort-2.svg
diff --git a/static/icons/svg/wi-wind-beaufort-3.svg b/src/static/icons/svg/wi-wind-beaufort-3.svg
index 165b116..165b116 100644
--- a/static/icons/svg/wi-wind-beaufort-3.svg
+++ b/src/static/icons/svg/wi-wind-beaufort-3.svg
diff --git a/static/icons/svg/wi-wind-beaufort-4.svg b/src/static/icons/svg/wi-wind-beaufort-4.svg
index c2143d4..c2143d4 100644
--- a/static/icons/svg/wi-wind-beaufort-4.svg
+++ b/src/static/icons/svg/wi-wind-beaufort-4.svg
diff --git a/static/icons/svg/wi-wind-beaufort-5.svg b/src/static/icons/svg/wi-wind-beaufort-5.svg
index fc34ea4..fc34ea4 100644
--- a/static/icons/svg/wi-wind-beaufort-5.svg
+++ b/src/static/icons/svg/wi-wind-beaufort-5.svg
diff --git a/static/icons/svg/wi-wind-beaufort-6.svg b/src/static/icons/svg/wi-wind-beaufort-6.svg
index e6471f4..e6471f4 100644
--- a/static/icons/svg/wi-wind-beaufort-6.svg
+++ b/src/static/icons/svg/wi-wind-beaufort-6.svg
diff --git a/static/icons/svg/wi-wind-beaufort-7.svg b/src/static/icons/svg/wi-wind-beaufort-7.svg
index f77fcec..f77fcec 100644
--- a/static/icons/svg/wi-wind-beaufort-7.svg
+++ b/src/static/icons/svg/wi-wind-beaufort-7.svg
diff --git a/static/icons/svg/wi-wind-beaufort-8.svg b/src/static/icons/svg/wi-wind-beaufort-8.svg
index 5f08fed..5f08fed 100644
--- a/static/icons/svg/wi-wind-beaufort-8.svg
+++ b/src/static/icons/svg/wi-wind-beaufort-8.svg
diff --git a/static/icons/svg/wi-wind-beaufort-9.svg b/src/static/icons/svg/wi-wind-beaufort-9.svg
index 41b7d41..41b7d41 100644
--- a/static/icons/svg/wi-wind-beaufort-9.svg
+++ b/src/static/icons/svg/wi-wind-beaufort-9.svg
diff --git a/static/icons/svg/wi-wind-deg.svg b/src/static/icons/svg/wi-wind-deg.svg
index 3007410..3007410 100644
--- a/static/icons/svg/wi-wind-deg.svg
+++ b/src/static/icons/svg/wi-wind-deg.svg
diff --git a/static/icons/svg/wi-windy.svg b/src/static/icons/svg/wi-windy.svg
index de5488a..de5488a 100644
--- a/static/icons/svg/wi-windy.svg
+++ b/src/static/icons/svg/wi-windy.svg
diff --git a/static/style.css b/src/static/style.css
index d6983a6..1ea44f5 100644
--- a/static/style.css
+++ b/src/static/style.css
@@ -28,6 +28,24 @@ html, body, .container {
28 font-size: 12pt; 28 font-size: 12pt;
29} 29}
30 30
31.index-title {
32 display: flex;
33 align-self: center;
34 justify-content: center;
35 width: 100%;
36
37}
38
39.content-noborder {
40 display: flex;
41 align-items: center;
42 align-content: flex-start;
43 flex-flow: row wrap;
44 margin: 2%;
45 height: auto;
46 justify-content: center;
47}
48
31.content { 49.content {
32 display: flex; 50 display: flex;
33 align-items: center; 51 align-items: center;
@@ -35,7 +53,7 @@ html, body, .container {
35 flex-flow: row wrap; 53 flex-flow: row wrap;
36 margin: 2%; 54 margin: 2%;
37 border-radius: 15px; 55 border-radius: 15px;
38 height: 100%; 56 height: auto;
39 justify-content: center; 57 justify-content: center;
40 border: 3px solid var(--accent); 58 border: 3px solid var(--accent);
41} 59}
@@ -51,30 +69,41 @@ div.searchbar {
51 69
52div.current { 70div.current {
53 display: flex; 71 display: flex;
54 flex-flow: column wrap; 72 flex-flow: row nowrap;
55 height: 15%; 73 align-items: flex-start;
56 flex-shrink: 1; 74 justify-content: center;
75}
76
77div.current-info {
78 display: flex;
79 flex-flow: column nowrap;
80 margin-right: 10%;
81 flex-shrink: 0;
57} 82}
58 83
59div.current-icon { 84div.current-icon {
60 width: 100%; 85 display: flex;
61 height: 100%; 86 margin-left: 10%;
87 flex-shrink: 0;
62} 88}
63 89
64img.weather-icon { 90img.weather-icon {
65 display: inline-block; 91 display: flex;
92 filter: invert(97%) sepia(23%) saturate(6990%) hue-rotate(304deg) brightness(116%) contrast(84%);
93}
94
95img.wind-icon {
96 filter: invert(94%) sepia(11%) saturate(78%) hue-rotate(179deg) brightness(101%) contrast(93%);
66} 97}
67 98
68div.current-temp { 99div.current-temp {
69 display: inline-block; 100 display: inline-block;
70 font-size: 18pt; 101 font-size: 18pt;
71 text-align: left; 102 text-align: left;
72 width: 100%
73} 103}
74 104
75div.current-weather { 105div.current-weather {
76 display: inline-block; 106 display: inline-block;
77 width: 100%;
78 font-size: 16pt; 107 font-size: 16pt;
79 margin-bottom: 5px; 108 margin-bottom: 5px;
80 text-align: left; 109 text-align: left;
@@ -82,14 +111,12 @@ div.current-weather {
82 111
83div.current-wind { 112div.current-wind {
84 display: inline-block; 113 display: inline-block;
85 width: 100%;
86 font-size: 14pt; 114 font-size: 14pt;
87 text-align: left; 115 text-align: left;
88} 116}
89 117
90div.current-sunrise, div.current-sunset { 118div.current-sunrise, div.current-sunset {
91 display: inline-block; 119 display: inline-block;
92 width: 100%;
93 font-size: 14pt; 120 font-size: 14pt;
94} 121}
95 122
@@ -107,7 +134,7 @@ h2.forecast-header {
107 width: 100% 134 width: 100%
108} 135}
109 136
110.daily, .hourly { 137div.daily, div.hourly {
111 display: flex; 138 display: flex;
112 flex-flow: row nowrap; 139 flex-flow: row nowrap;
113 align-items: center; 140 align-items: center;
@@ -115,23 +142,24 @@ h2.forecast-header {
115 overflow-y: hidden; 142 overflow-y: hidden;
116 white-space: nowrap; 143 white-space: nowrap;
117 width: 100%; 144 width: 100%;
118 145 margin-left: 5px;
146 height: auto;
119} 147}
120 148
121.hourly-box, .daily-box { 149div.hourly-box, div.daily-box {
122 display: flex; 150 display: flex;
123 flex-flow: column wrap; 151 flex-flow: row wrap;
124 flex-grow: 1; 152 flex-shrink: 0;
125 justify-content: center;
126 align-items: flex-start; 153 align-items: flex-start;
127
128 padding: 1em;
129 overflow-wrap: normal; 154 overflow-wrap: normal;
130 min-width: 15%; 155 min-width: 20%;
131 white-space: normal;
132 margin: 5px; 156 margin: 5px;
133} 157}
134 158
159div.hourly-icon, div.daily-icon {
160 display: inline-block;
161}
162
135input, select, textarea { 163input, select, textarea {
136 margin: 5px; 164 margin: 5px;
137 padding: 5px; 165 padding: 5px;
diff --git a/src/static/temp.js b/src/static/temp.js
new file mode 100644
index 0000000..6eeeba7
--- /dev/null
+++ b/src/static/temp.js
@@ -0,0 +1,325 @@
1e strict';
2
3class Color {
4 constructor(r, g, b) {
5 this.set(r, g, b);
6 }
7
8 toString() {
9 return `rgb(${Math.round(this.r)}, ${Math.round(this.g)}, ${Math.round(this.b)})`;
10 }
11
12 set(r, g, b) {
13 this.r = this.clamp(r);
14 this.g = this.clamp(g);
15 this.b = this.clamp(b);
16 }
17
18 hueRotate(angle = 0) {
19 angle = angle / 180 * Math.PI;
20 const sin = Math.sin(angle);
21 const cos = Math.cos(angle);
22
23 this.multiply([
24 0.213 + cos * 0.787 - sin * 0.213,
25 0.715 - cos * 0.715 - sin * 0.715,
26 0.072 - cos * 0.072 + sin * 0.928,
27 0.213 - cos * 0.213 + sin * 0.143,
28 0.715 + cos * 0.285 + sin * 0.140,
29 0.072 - cos * 0.072 - sin * 0.283,
30 0.213 - cos * 0.213 - sin * 0.787,
31 0.715 - cos * 0.715 + sin * 0.715,
32 0.072 + cos * 0.928 + sin * 0.072,
33 ]);
34 }
35
36 grayscale(value = 1) {
37 this.multiply([
38 0.2126 + 0.7874 * (1 - value),
39 0.7152 - 0.7152 * (1 - value),
40 0.0722 - 0.0722 * (1 - value),
41 0.2126 - 0.2126 * (1 - value),
42 0.7152 + 0.2848 * (1 - value),
43 0.0722 - 0.0722 * (1 - value),
44 0.2126 - 0.2126 * (1 - value),
45 0.7152 - 0.7152 * (1 - value),
46 0.0722 + 0.9278 * (1 - value),
47 ]);
48 }
49
50 sepia(value = 1) {
51 this.multiply([
52 0.393 + 0.607 * (1 - value),
53 0.769 - 0.769 * (1 - value),
54 0.189 - 0.189 * (1 - value),
55 0.349 - 0.349 * (1 - value),
56 0.686 + 0.314 * (1 - value),
57 0.168 - 0.168 * (1 - value),
58 0.272 - 0.272 * (1 - value),
59 0.534 - 0.534 * (1 - value),
60 0.131 + 0.869 * (1 - value),
61 ]);
62 }
63
64 saturate(value = 1) {
65 this.multiply([
66 0.213 + 0.787 * value,
67 0.715 - 0.715 * value,
68 0.072 - 0.072 * value,
69 0.213 - 0.213 * value,
70 0.715 + 0.285 * value,
71 0.072 - 0.072 * value,
72 0.213 - 0.213 * value,
73 0.715 - 0.715 * value,
74 0.072 + 0.928 * value,
75 ]);
76 }
77
78 multiply(matrix) {
79 const newR = this.clamp(this.r * matrix[0] + this.g * matrix[1] + this.b * matrix[2]);
80 const newG = this.clamp(this.r * matrix[3] + this.g * matrix[4] + this.b * matrix[5]);
81 const newB = this.clamp(this.r * matrix[6] + this.g * matrix[7] + this.b * matrix[8]);
82 this.r = newR;
83 this.g = newG;
84 this.b = newB;
85 }
86
87 brightness(value = 1) {
88 this.linear(value);
89 }
90 contrast(value = 1) {
91 this.linear(value, -(0.5 * value) + 0.5);
92 }
93
94 linear(slope = 1, intercept = 0) {
95 this.r = this.clamp(this.r * slope + intercept * 255);
96 this.g = this.clamp(this.g * slope + intercept * 255);
97 this.b = this.clamp(this.b * slope + intercept * 255);
98 }
99
100 invert(value = 1) {
101 this.r = this.clamp((value + this.r / 255 * (1 - 2 * value)) * 255);
102 this.g = this.clamp((value + this.g / 255 * (1 - 2 * value)) * 255);
103 this.b = this.clamp((value + this.b / 255 * (1 - 2 * value)) * 255);
104 }
105
106 hsl() {
107 const r = this.r / 255;
108 const g = this.g / 255;
109 const b = this.b / 255;
110 const max = Math.max(r, g, b);
111 const min = Math.min(r, g, b);
112 let h, s, l = (max + min) / 2;
113
114 if (max === min) {
115 h = s = 0;
116 } else {
117 const d = max - min;
118 s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
119 switch (max) {
120 case r:
121 h = (g - b) / d + (g < b ? 6 : 0);
122 break;
123
124 case g:
125 h = (b - r) / d + 2;
126 break;
127
128 case b:
129 h = (r - g) / d + 4;
130 break;
131 }
132 h /= 6;
133 }
134
135 return {
136 h: h * 100,
137 s: s * 100,
138 l: l * 100,
139 };
140 }
141
142 clamp(value) {
143 if (value > 255) {
144 value = 255;
145 } else if (value < 0) {
146 value = 0;
147 }
148 return value;
149 }
150}
151
152class Solver {
153 constructor(target, baseColor) {
154 this.target = target;
155 this.targetHSL = target.hsl();
156 this.reusedColor = new Color(0, 0, 0);
157 }
158
159 solve() {
160 const result = this.solveNarrow(this.solveWide());
161 return {
162 values: result.values,
163 loss: result.loss,
164 filter: this.css(result.values),
165 };
166 }
167
168 solveWide() {
169 const A = 5;
170 const c = 15;
171 const a = [60, 180, 18000, 600, 1.2, 1.2];
172
173 let best = { loss: Infinity };
174 for (let i = 0; best.loss > 25 && i < 3; i++) {
175 const initial = [50, 20, 3750, 50, 100, 100];
176 const result = this.spsa(A, a, c, initial, 1000);
177 if (result.loss < best.loss) {
178 best = result;
179 }
180 }
181 return best;
182 }
183
184 solveNarrow(wide) {
185 const A = wide.loss;
186 const c = 2;
187 const A1 = A + 1;
188 const a = [0.25 * A1, 0.25 * A1, A1, 0.25 * A1, 0.2 * A1, 0.2 * A1];
189 return this.spsa(A, a, c, wide.values, 500);
190 }
191
192 spsa(A, a, c, values, iters) {
193 const alpha = 1;
194 const gamma = 0.16666666666666666;
195
196 let best = null;
197 let bestLoss = Infinity;
198 const deltas = new Array(6);
199 const highArgs = new Array(6);
200 const lowArgs = new Array(6);
201
202 for (let k = 0; k < iters; k++) {
203 const ck = c / Math.pow(k + 1, gamma);
204 for (let i = 0; i < 6; i++) {
205 deltas[i] = Math.random() > 0.5 ? 1 : -1;
206 highArgs[i] = values[i] + ck * deltas[i];
207 lowArgs[i] = values[i] - ck * deltas[i];
208 }
209
210 const lossDiff = this.loss(highArgs) - this.loss(lowArgs);
211 for (let i = 0; i < 6; i++) {
212 const g = lossDiff / (2 * ck) * deltas[i];
213 const ak = a[i] / Math.pow(A + k + 1, alpha);
214 values[i] = fix(values[i] - ak * g, i);
215 }
216
217 const loss = this.loss(values);
218 if (loss < bestLoss) {
219 best = values.slice(0);
220 bestLoss = loss;
221 }
222 }
223 return { values: best, loss: bestLoss };
224
225 function fix(value, idx) {
226 let max = 100;
227 if (idx === 2 /* saturate */) {
228 max = 7500;
229 } else if (idx === 4 /* brightness */ || idx === 5 /* contrast */) {
230 max = 200;
231 }
232
233 if (idx === 3 /* hue-rotate */) {
234 if (value > max) {
235 value %= max;
236 } else if (value < 0) {
237 value = max + value % max;
238 }
239 } else if (value < 0) {
240 value = 0;
241 } else if (value > max) {
242 value = max;
243 }
244 return value;
245 }
246 }
247
248 loss(filters) {
249 // Argument is array of percentages.
250 const color = this.reusedColor;
251 color.set(0, 0, 0);
252
253 color.invert(filters[0] / 100);
254 color.sepia(filters[1] / 100);
255 color.saturate(filters[2] / 100);
256 color.hueRotate(filters[3] * 3.6);
257 color.brightness(filters[4] / 100);
258 color.contrast(filters[5] / 100);
259
260 const colorHSL = color.hsl();
261 return (
262 Math.abs(color.r - this.target.r) +
263 Math.abs(color.g - this.target.g) +
264 Math.abs(color.b - this.target.b) +
265 Math.abs(colorHSL.h - this.targetHSL.h) +
266 Math.abs(colorHSL.s - this.targetHSL.s) +
267 Math.abs(colorHSL.l - this.targetHSL.l)
268 );
269 }
270
271 css(filters) {
272 function fmt(idx, multiplier = 1) {
273 return Math.round(filters[idx] * multiplier);
274 }
275 return `filter: invert(${fmt(0)}%) sepia(${fmt(1)}%) saturate(${fmt(2)}%) hue-rotate(${fmt(3, 3.6)}deg) brightness(${fmt(4)}%) contrast(${fmt(5)}%);`;
276 }
277}
278
279function hexToRgb(hex) {
280 // Expand shorthand form (e.g. "03F") to full form (e.g. "0033FF")
281 const shorthandRegex = /^#?([a-f\d])([a-f\d])([a-f\d])$/i;
282 hex = hex.replace(shorthandRegex, (m, r, g, b) => {
283 return r + r + g + g + b + b;
284 });
285
286 const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
287 return result
288 ? [
289 parseInt(result[1], 16),
290 parseInt(result[2], 16),
291 parseInt(result[3], 16),
292 ]
293 : null;
294}
295
296$(document).ready(() => {
297 $('button.execute').click(() => {
298 const rgb = hexToRgb($('input.target').val());
299 if (rgb.length !== 3) {
300 alert('Invalid format!');
301 return;
302 }
303
304 const color = new Color(rgb[0], rgb[1], rgb[2]);
305 const solver = new Solver(color);
306 const result = solver.solve();
307
308 let lossMsg;
309 if (result.loss < 1) {
310 lossMsg = 'This is a perfect result.';
311 } else if (result.loss < 5) {
312 lossMsg = 'The is close enough.';
313 } else if (result.loss < 15) {
314 lossMsg = 'The color is somewhat off. Consider running it again.';
315 } else {
316 lossMsg = 'The color is extremely off. Run it again!';
317 }
318
319 $('.realPixel').css('background-color', color.toString());
320 $('.filterPixel').attr('style', result.filter);
321 $('.filterDetail').text(result.filter);
322 $('.lossDetail').html(`Loss: ${result.loss.toFixed(1)}. <b>${lossMsg}</b>`);
323 });
324});
325
diff --git a/templates/base.html b/src/templates/base.html
index 6fe776a..a909aca 100644
--- a/templates/base.html
+++ b/src/templates/base.html
@@ -2,6 +2,7 @@
2<html> 2<html>
3 <head> 3 <head>
4 <meta charset="utf-8"> 4 <meta charset="utf-8">
5 <meta name="viewport" content="width=device-width, initial-scale=1.0">
5 <title>{% block title %} {% endblock %}</title> 6 <title>{% block title %} {% endblock %}</title>
6 <link rel="icon" type="image/x-icon" href="{{ url_for('static', filename='favicon.ico') }}"> 7 <link rel="icon" type="image/x-icon" href="{{ url_for('static', filename='favicon.ico') }}">
7 <link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='style.css' ) }}"> 8 <link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='style.css' ) }}">
diff --git a/src/templates/index.html b/src/templates/index.html
new file mode 100644
index 0000000..da2a19a
--- /dev/null
+++ b/src/templates/index.html
@@ -0,0 +1,15 @@
1{% extends 'base.html' %}
2{% block content %}
3<div class=content-noborder>
4 <div class=index-title>
5 <h1>Enter a Location</h1>
6 </div>
7 <div class=index-form>
8 <form method="post">
9 {{ form.csrf_token }}
10 {{ form.location }}
11 {{ form.submit() }}
12 </form>
13 </div>
14</div>
15{% endblock %}
diff --git a/src/templates/location.html b/src/templates/location.html
new file mode 100644
index 0000000..fa691ea
--- /dev/null
+++ b/src/templates/location.html
@@ -0,0 +1,15 @@
1{% extends 'base.html' %}
2{% block content %}
3<div class=content-noborder>
4 <div class=index-title>
5 <h1>Select a Location</h1>
6 </div>
7 <div class=index-form>
8 <form method="post">
9 {{ form.csrf_token }}
10 {{ form.location }}
11 {{ form.submit() }}
12 </form>
13 </div>
14</div>
15{% endblock %}
diff --git a/templates/weather.html b/src/templates/weather.html
index 24819dc..64aabbd 100644
--- a/templates/weather.html
+++ b/src/templates/weather.html
@@ -1,6 +1,5 @@
1{% extends 'base.html' %} 1{% extends 'base.html' %}
2{% block content %} 2{% block content %}
3{% set is_day = data["current_weather"]["is_day"] %}
4<div class=content> 3<div class=content>
5 <div class=searchbar> 4 <div class=searchbar>
6 <form method="post"> 5 <form method="post">
@@ -10,11 +9,15 @@
10 </form> 9 </form>
11 </div> 10 </div>
12 <div class=current> 11 <div class=current>
12 {% set is_day = data["current_weather"]["is_day"] %}
13 {% set weather_code = data["current_weather"]["weathercode"] %} 13 {% set weather_code = data["current_weather"]["weathercode"] %}
14 <div class=current-info> 14 <div class=current-info>
15 <div class=current-weather>{{ weather_codes[weather_code] }}</div> 15 <div class=current-weather>{{ weather_codes[weather_code] }}</div>
16 <div class=current-temp> {{ data["current_weather"]["temperature"]}}°F </div> 16 <div class=current-temp> {{ data["current_weather"]["temperature"]}}°F </div>
17 <div class=current-wind>Wind: {{ data["current_weather"]["windspeed"] }} MPH {{ data["current_weather"]["winddirection"] }}</div> 17 <div class=current-wind>
18 Wind: {{ data["current_weather"]["windspeed"] }} MPH
19 <img class=wind-icon src="/static/icons/directions/{{get_direction_icon(data["current_weather"]["winddirection"])}}.svg">
20 </div>
18 <div class=current-sunrise>Sunrise: {{ data["daily"]["sunrise"][0] }} </div> 21 <div class=current-sunrise>Sunrise: {{ data["daily"]["sunrise"][0] }} </div>
19 <div class=current-sunset>Sunset: {{ data["daily"]["sunset"][0] }} </div> 22 <div class=current-sunset>Sunset: {{ data["daily"]["sunset"][0] }} </div>
20 </div> 23 </div>
@@ -36,11 +39,22 @@
36 </div> 39 </div>
37 <div class=hourly-temp>{{ data["hourly"]["temperature_2m"][i]}}°F</div> 40 <div class=hourly-temp>{{ data["hourly"]["temperature_2m"][i]}}°F</div>
38 <div class=hourly-humidity>Humidity: {{ data["hourly"]["relativehumidity_2m"][i] }}%</div> 41 <div class=hourly-humidity>Humidity: {{ data["hourly"]["relativehumidity_2m"][i] }}%</div>
39 <div class=hourly-wind>Wind: {{ data["hourly"]["windspeed_10m"][i] }}MPH {{ data["hourly"]["winddirection_10m"][i] }}</div> 42 <div class=hourly-wind>
43 Wind: {{ data["hourly"]["windspeed_10m"][i] }}MPH
44 <img class=wind-icon src="/static/icons/directions/{{get_direction_icon(data["hourly"]["winddirection_10m"][i])}}.svg">
45 </div>
40 </div> 46 </div>
41 <div class=hourly-icon> 47 <div class=hourly-icon>
48 {% set time = datetime.datetime.strptime(data["hourly"]["time"][i], "%a %x %I:%M %p") %}
49 {% set sunrise = datetime.datetime.strptime(data["daily"]["sunrise"][0], "%I:%M %p").replace(year=time.year, month=time.month, day=time.day) %}
50
51 {% set sunset = datetime.datetime.strptime(data["daily"]["sunset"][0], "%I:%M %p").replace(year=time.year, month=time.month, day=time.day) %}
52 {% set is_day = 1 %}
53 {% if time > sunrise and time < sunset %}
54 {% set is_day = 0 %}
55 {% endif %}
42 {% set weather_code = data["hourly"]["weathercode"][i] %} 56 {% set weather_code = data["hourly"]["weathercode"][i] %}
43 <img class=weather-icon src="/static/icons/svg/{{ weather_icons[weather_code][is_day]}}.svg" width=100px height=100px> 57 <img class=weather-icon src="/static/icons/svg/{{weather_icons[weather_code][is_day]}}.svg" width=100px height=100px>
44 </div> 58 </div>
45 </div> 59 </div>
46 {% endfor %} 60 {% endfor %}
@@ -66,7 +80,7 @@
66 </div> 80 </div>
67 <div class=daily-icon> 81 <div class=daily-icon>
68 {% set weather_code = data["daily"]["weathercode"][i] %} 82 {% set weather_code = data["daily"]["weathercode"][i] %}
69 <img class=weather-icon src="/static/icons/svg/{{ weather_icons[weather_code][is_day]}}.svg" width=100px height=100px> 83 <img class=weather-icon src="/static/icons/svg/{{ weather_icons[weather_code][0]}}.svg" width=100px height=100px>
70 </div> 84 </div>
71 </div> 85 </div>
72 {% endfor %} 86 {% endfor %}
diff --git a/templates/index.html b/templates/index.html
deleted file mode 100644
index a877fef..0000000
--- a/templates/index.html
+++ /dev/null
@@ -1,10 +0,0 @@
1{% extends 'base.html' %}
2
3{% block content %}
4<h1>{% block title %} Enter a Location {% endblock %}</h1>
5<form method="post">
6 {{ form.csrf_token }}
7 {{ form.location }}
8 {{ form.submit() }}
9</form>
10{% endblock %}