diff --git a/html/weather.ejs b/html/weather.ejs
index 1dfcd751..6d1d103a 100644
--- a/html/weather.ejs
+++ b/html/weather.ejs
@@ -381,14 +381,37 @@
$('#btnSearch').addEventListener('click',()=>goSearch());
$('#q').addEventListener('keydown',e=>{if(e.key==='Enter'){e.preventDefault();goSearch()}});
+
function goSearch(){
const v=$('#q').value.trim();
if(!v) return;
+
+ // If user typed "lat,lon", stay fully client-side (as before)
const latlon=v.match(/^\s*(-?\d+(?:\.\d+)?)\s*,\s*(-?\d+(?:\.\d+)?)\s*$/);
- if(latlon){const lat=+latlon[1], lon=+latlon[2]; reverseName(lat,lon).then(n=>loadWeather(lat,lon,n)); return}
- searchPlaces(v).then(list=>{if(list[0]) selectPlace(list[0]); else alert('No results')})
+ if(latlon){
+ const lat=+latlon[1], lon=+latlon[2];
+ reverseName(lat,lon).then(n=>loadWeather(lat,lon,n));
+ return;
+ }
+
+ // If we’re on the SSR page, round-trip to your /weather route (keeps no-JS users happy, too)
+ if (window.__SSR_ROUTE__) {
+ const units = (state.units==='metric') ? 'metric' : 'imperial';
+ const url = new URL(window.__SSR_ROUTE__, location.origin);
+ url.searchParams.set('q', v);
+ url.searchParams.set('units', units);
+ location.href = url.toString();
+ return;
+ }
+
+ // Fallback: pure client search (for the static single-file build)
+ searchPlaces(v).then(list=>{
+ if(list[0]) selectPlace(list[0]);
+ else alert('No results');
+ });
}
+
$('#btnShare').addEventListener('click',async e=>{
e.preventDefault();
const url=new URL(location.href);
@@ -398,14 +421,32 @@
});
function debounce(fn,ms){let t;return (...a)=>{clearTimeout(t);t=setTimeout(()=>fn(...a),ms)}}
-
+
(function init(){
- const sp=new URLSearchParams(location.search);
+ // If server already gave us a place, hydrate immediately so UI & search are “awake”
+ if (window.__SSR__ && typeof window.__SSR__.lat === "number" && typeof window.__SSR__.lon === "number") {
+ try {
+ // Also seed last cache so offline/opening without params still has context
+ localStorage.setItem('pokeweather:last', JSON.stringify({
+ when: Date.now(),
+ state: { lat: window.__SSR__.lat, lon: window.__SSR__.lon, name: window.__SSR__.name, units: (JSON.parse(localStorage.getItem('pokeweather:units')||'{}').units || 'metric') },
+ data: { current: window.__SSR__.current || {}, daily: window.__SSR__.daily || {}, hourly: window.__SSR__.hourly || {} }
+ }));
+ } catch {}
+ // Re-fetch on the client to fully power the JS UI (chart, hourly, etc.)
+ loadWeather(window.__SSR__.lat, window.__SSR__.lon, window.__SSR__.name);
+ return;
+ }
+
+ const sp=new URLSearchParams(location.search);
const lat=sp.get('lat'), lon=sp.get('lon'), name=sp.get('name');
if(lat&&lon){loadWeather(+lat,+lon,name);return}
const cached=JSON.parse(localStorage.getItem('pokeweather:last')||'null');
if(cached){state.units=cached.state?.units||state.units; btnUnits.textContent=state.units==='metric'?"°C":"°F"; loadWeather(cached.state.lat,cached.state.lon,cached.state.name); return}
- if(navigator.geolocation){navigator.geolocation.getCurrentPosition(p=>{reverseName(p.coords.latitude,p.coords.longitude).then(n=>loadWeather(p.coords.latitude,p.coords.longitude,n))},()=>{})}
+ if(navigator.geolocation){navigator.geolocation.getCurrentPosition(
+ p=>{reverseName(p.coords.latitude,p.coords.longitude).then(n=>loadWeather(p.coords.latitude,p.coords.longitude,n))},
+ ()=>{}
+ )}
})();