1/*! JDServer-Webs v1.5 â modules/live_risks/live-risks.js 2 * Resumen compacto de riesgos para index principal 3 * Va justo debajo del módulo live 4 * - Muestra todos los avisos activos como chips 5 * - Rota suavemente el riesgo activo destacado 6 */ 7!function(){let e=null;function clearRotateTimer(){e&&(clearInterval(e),e=null)}function h(e,t,s){const i=document.createElement(e);return t&&(i.className=t),null!=s&&(i.textContent=s),i}function tRisks(e,t=""){try{const s=window.JD&&JD.mod&&JD.mod.risks&&JD.mod.risks.i18n;if(s&&"function"==typeof s.t)return s.t(function langNow(){return(document.documentElement.lang||"es").slice(0,2).toLowerCase()}(),e,t)}catch(e){}return t}function segs(){return location.pathname.split("/").filter(Boolean)}async function getSlug(){const e=await async function readCfg(e){try{const t=await(window.JD?.core?.config?.fetch||fetch)(e||"./config.json",{cache:"no-store"});return t.ok?await t.json():null}catch(e){return null}}(window.JD_CONFIG_PATH||"./config.json");return e?.site?.dataSlug||e?.site?.slug||function slugFromURL(){const e=segs(),t=e.findIndex((e=>"sites"===e.toLowerCase()));return t>=0&&e[t+1]?e[t+1]:(e.length&&/\.html?$/i.test(e[e.length-1])&&e.pop(),e[e.length-1]||null)}()}function apiUrl(e){return`${function baseYear(){const e=segs()[0];return/^\d{4}$/.test(e)?`/${e}`:"/2026"}()}/api/risk-summary.php?slug=${encodeURIComponent(e)}&nocache=${Date.now()}`}function riskStateClass(e){const t=String(e||"normal").toLowerCase();return"high"===t?"is-high":"warn"===t||"warning"===t?"is-warn":"attention"===t?"is-attention":"is-normal"}function riskStateLabel(e){const t=String(e||"normal").toLowerCase();return"high"===t?tRisks("live_risks_state_high","Riesgo alto"):"warn"===t||"warning"===t?tRisks("live_risks_state_warn","Aviso"):"attention"===t?tRisks("live_risks_state_attention","Atención"):tRisks("live_risks_state_normal","Normal")}function trKey(e,t=""){return e?tRisks(e,t||e):t}function shouldReduceMotion(){try{return window.matchMedia&&window.matchMedia("(prefers-reduced-motion: reduce)").matches}catch(e){return!1}}function setActiveRisk(e,t,s,i={}){if(!e||!t||!t.length)return;const n=t[s%t.length],r=e.querySelector(".live-risks-rotator"),a=e.querySelector(".live-risks-rotator-reason"),o=e.querySelector(".live-risks-state"),l=e.querySelector(".live-risks-link"),apply=()=>{const t=function translateRiskReason(e){return trKey(e?.reason_key,"")}(n);a&&(a.textContent=t||tRisks("live_risks_normal","Sin incidencias destacables")),o&&(o.textContent=riskStateLabel(n.level)),l&&(l.classList.remove("is-normal","is-attention","is-warn","is-high"),l.classList.add(riskStateClass(n.level))),e.querySelectorAll(".live-risks-tag").forEach((e=>{e.classList.toggle("is-current",e.getAttribute("data-risk-id")===String(n.id||""))}))};i.instant||shouldReduceMotion()||!r?apply():(r.classList.add("is-changing"),window.setTimeout((()=>{apply(),r.classList.remove("is-changing")}),260))}function renderCompact(t,s){if(clearRotateTimer(),t.innerHTML="",!s)return void(t.innerHTML=`<div class="live-risks-error">${tRisks("live_risks_error","No se pudo cargar el resumen de riesgos")}</div>`);const i=s?.summary?.top_level||"normal",n=(s.items||[]).filter((e=>{const t=String(e.level||"").toLowerCase(),s=Number(e.score||0);return"normal"!==t&&s>0})),r=document.createElement("a");r.className=`live-risks-link ${riskStateClass(i)}`,r.href="risks.html",r.setAttribute("aria-label",tRisks("live_risks_view","Ver detalle"));const a=h("div","live-risks-main"),o=h("div","live-risks-head"),l=h("span","live-risks-dot"),c=h("span","live-risks-title",tRisks("live_risks_title","Riesgos y umbrales")),d=h("span","live-risks-state",riskStateLabel(i));o.append(l,c,d);const u=h("div","live-risks-rotator"),k=h("span","live-risks-rotator-reason","");u.append(k);const v=h("div","live-risks-tags");if(n.forEach((e=>{const t=h("span",`live-risks-tag ${riskStateClass(e.level)}`,function translateRiskTitle(e){return trKey(e?.title_key,e?.id||"")}(e));t.setAttribute("data-risk-id",String(e.id||"")),v.appendChild(t)})),a.append(o),n.length)a.append(u,v);else{const e=h("div","live-risks-reason",tRisks("live_risks_normal","Sin incidencias destacables"));a.appendChild(e)}const g=h("div","live-risks-side");if(g.append(h("span","live-risks-cta",tRisks("live_risks_view","Ver detalle")),h("span","live-risks-arrow","â")),r.append(a,g),t.appendChild(r),n.length&&(setActiveRisk(t,n,0,{instant:!0}),n.length>1&&!shouldReduceMotion())){let s=0;e=window.setInterval((()=>{s=(s+1)%n.length,setActiveRisk(t,n,s)}),4600)}}async function render(){clearRotateTimer();const e=((e,t=document)=>t.querySelector(e))("#live-risks");if(!e)return;e.innerHTML=`<div class="live-risks-loading">${tRisks("live_risks_loading","Cargando resumen de riesgosâ¦")}</div>`;const t=await getSlug();if(t)try{const s=await fetch(apiUrl(t),{cache:"no-store"});if(!s.ok)throw new Error(`${s.status} ${s.statusText}`);const i=await s.json();if(!i||!0!==i.ok)throw new Error(i?.error||"API error");renderCompact(e,i)}catch(t){clearRotateTimer(),e.innerHTML=`<div class="live-risks-error">${tRisks("live_risks_error","No se pudo cargar el resumen de riesgos")} (${t.message})</div>`}else e.innerHTML=`<div class="live-risks-error">${tRisks("risks_error_slug","No se pudo resolver el slug de la estación")}</div>`}document.addEventListener("DOMContentLoaded",render),window.addEventListener("jd:lang-changed",render),document.addEventListener("visibilitychange",(()=>{document.hidden?clearRotateTimer():render()}))}();
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.