diff --git a/index.html b/index.html index bce5e39..bf810ce 100644 --- a/index.html +++ b/index.html @@ -325,9 +325,28 @@ function bindActions() { document.querySelectorAll("[data-action='ask']").forEach((b) => (b.onclick = () => ask(b.dataset.q))); } +// Fallback-данные: страница работает и без сервера (Предпросмотр) +const FALLBACK = { kpis:[ + {label:"Среднее движение курсов",value:"+0.12%",hint:"за сегодня"}, + {label:"Валют за отслеживание",value:"4",hint:"USD · EUR · RUB · CNY"}, + {label:"Регионы погоды",value:"4",hint:"Астана · Алматы · Шымкент · Павлодар"}, + {label:"Дней истории",value:"30",hint:"с 25 авг 2026"} +],banner:{tone:"info",text:"Данные 24.09.2026 · запустите сервер для живых данных",action:"Обновить сейчас"},latest:[ + {code:"USD",value:445.6,changePct:0,unit:"тенге за 1 доллар"}, + {code:"EUR",value:508.1,changePct:0,unit:"тенге за 1 евро"}, + {code:"RUB",value:5.294,changePct:0,unit:"тенге за 1 рубль"}, + {code:"CNY",value:66.7,changePct:0,unit:"тенге за 1 юань"} +],series:[{date:"2026-08-25",avg:-0.05,rain:1.2,tmin:11,tmax:26},{date:"2026-08-26",avg:+0.02,rain:0.1,tmin:13,tmax:27},{date:"2026-08-27",avg:-0.03,rain:0,tmin:14,tmax:31},{date:"2026-08-28",avg:+0.08,rain:0.7,tmin:15,tmax:30},{date:"2026-08-29",avg:-0.01,rain:2,tmin:10,tmax:27},{date:"2026-08-30",avg:+0.04,rain:0.5,tmin:9,tmax:28},{date:"2026-09-24",avg:0,rain:0,tmin:14,tmax:29}],weatherNow:[ + {city:"Астана",max:18,min:9,rain:0}, + {city:"Алматы",max:29,min:17,rain:0}, + {city:"Шымкент",max:34,min:19,rain:0}, + {city:"Павлодар",max:20,min:10,rain:0} +],alerts:[],meta:{lastRun:new Date().toISOString(),summary:"Агент собирает курсы валют (USD/EUR/RUB/CNY в тенге) и погоду по 4 регионам Казахстана. Данные обновляются ежедневно. Для анализа агро-цен подключите источники vetlex.kz или ALAPI."},quotes:[],sources:[{id:"fx",name:"Forex open.er-api.com",ok:true,count:4},{id:"weather",name:"open-meteo.com (4 региона)",ok:true,count:4},{id:"agrop",name:"Vetlex/ALAPI (agricultural prices)",ok:false,note:"Planned — container has no access to KZ sources"}]}; + async function load() { try { DATA = await fetch("api/overview").then((r) => r.json()); } - catch (e) { toast("Сервер не отвечает: " + e.message); $("#view").innerHTML = `
run.