1import{r as f,j as e}from"./react-CjMaMYXs.js";import{P as N}from"./Panel-DjIS1BWC.js";import{u as U}from"./PrivateDiagnosticsPage-pSuD4rcT.js";import{R as y,P as A,V as _,Q as G,S as M,a as T,c as R,g as F,b as Q,t as K,d as P,p as O,f as z,e as W,h as X,i as $,j as I,o as Y,r as Z,k as J,l as k,B,m as ee,M as w,n as ae,q as E,s as V,u as ne,L as H,v as se,w as te}from"./pagella-CNVnEk3c.js";import"./PageHeader-UnZycIrA.js";import"./index-BspCYiM7.js";const oe="_section_ccxvz_1",ie="_intro_ccxvz_7",le="_panelLede_ccxvz_23",re="_caveat_ccxvz_29",ce="_muted_ccxvz_40",de="_hint_ccxvz_41",ue="_statsBar_ccxvz_51",he="_controls_ccxvz_64",pe="_toggleGroup_ccxvz_71",me="_toggle_ccxvz_71",xe="_toggleActive_ccxvz_93",ge="_legend_ccxvz_98",ve="_legendItem_ccxvz_107",je="_legendDot_ccxvz_113",be="_tableWrap_ccxvz_121",fe="_matrix_ccxvz_125",_e="_radarHorizonBadge_ccxvz_145",Ne="_locCol_ccxvz_153",ze="_row_ccxvz_159",Le="_rowSelected_ccxvz_167",Se="_cell_ccxvz_172",Ce="_cellPod_ccxvz_184",$e="_cellSub_ccxvz_189",Ae="_cellEmpty_ccxvz_194",Te="_branchName_ccxvz_200",Me="_branchHint_ccxvz_204",Be="_winTag_ccxvz_217",ye="_pointGrid_ccxvz_231",Ie="_pointCard_ccxvz_237",Ee="_pointCardWet_ccxvz_244",qe="_pointHead_ccxvz_248",Re="_pointState_ccxvz_256",Pe="_pointChips_ccxvz_261",Oe="_chip_ccxvz_267",De="_detailBlock_ccxvz_275",Ge="_detailTable_ccxvz_279",We="_closeBtn_ccxvz_299",He="_trendTable_ccxvz_311",Fe="_trendBreak_ccxvz_336",n={section:oe,intro:ie,panelLede:le,caveat:re,muted:ce,hint:de,statsBar:ue,controls:he,toggleGroup:pe,toggle:me,toggleActive:xe,legend:ge,legendItem:ve,legendDot:je,tableWrap:be,matrix:fe,radarHorizonBadge:_e,locCol:Ne,row:ze,rowSelected:Le,cell:Se,cellPod:Ce,cellSub:$e,cellEmpty:Ae,branchName:Te,branchHint:Me,winTag:Be,pointGrid:ye,pointCard:Ie,pointCardWet:Ee,pointHead:qe,pointState:Re,pointChips:Pe,chip:Oe,detailBlock:De,detailTable:Ge,closeBtn:We,trendTable:He,trendBreak:Fe},ke={hit:"previsto â",miss:"mancato",falseAlarm:"falso allarme",correctNegative:"assenza corretta"},we={hit:_.good,miss:_.bad,falseAlarm:_.warn,correctNegative:_.good};function pa(){const{lookback:a,pagella:s,pagellaLoading:l}=U(),[p,o]=f.useState("inverse"),[c,m]=f.useState("ground"),[v,b]=f.useState(null),d=s==null?void 0:s.nowcast,r=(d==null?void 0:d.available)===!0,j=r?d.perComune:null,S=f.useMemo(()=>j?Object.keys(j).sort():[],[j]),i=c==="both"?["ground","radar"]:[c],g=v?j==null?void 0:j[v]:void 0,u=f.useMemo(()=>s!=null&&s.history.rows?[...s.history.rows].reverse():[],[s==null?void 0:s.history.rows]);return e.jsxs("section",{className:n.section,children:[e.jsxs("header",{className:n.intro,children:[e.jsx("span",{className:"eyebrow",children:"Nowcast 0-2h â Pagella"}),e.jsx("h2",{children:"Le previsioni a 15â²â¦2h si avverano?"}),e.jsx("p",{children:"Confronto fra ciò che il modello aveva previsto e ciò che è davvero accaduto â pioggia, per tutti i 12 punti del registro â misurato contro due verità affiancate: i pluviometri al suolo e l'eco radar. Sotto 20 eventi il colore si spegne e il dato resta in accumulo; l'intervallo di confidenza di ogni cella si legge passandoci sopra, e per esteso nel dettaglio del punto."})]}),r&&e.jsxs("div",{className:n.statsBar,children:[e.jsxs("span",{children:["Archivio: ",e.jsx("strong",{children:d.meta.nCycles.toLocaleString("it-IT")})," cicli ·"," ",e.jsx("strong",{children:d.meta.episodes})," episodi"]}),d.meta.spanMs&&e.jsxs("span",{children:["dal ",e.jsx("strong",{children:new Date(d.meta.spanMs[0]).toLocaleDateString("it-IT")})," ","al ",e.jsx("strong",{children:new Date(d.meta.spanMs[1]).toLocaleDateString("it-IT")})]}),e.jsxs("span",{children:["Ramo modello:"," ",e.jsx("strong",{children:Object.entries(d.meta.modelBranchMix).map(([t,h])=>`${t} (${h})`).join(", ")||"â"})]}),e.jsxs("span",{children:["Aggiornata ",e.jsx("strong",{children:new Date(d.sourceUpdatedAt).toLocaleString("it-IT")})]})]}),e.jsxs("div",{className:n.caveat,role:"note",children:[e.jsx("strong",{children:"Nota diagnostica."})," Oltre i ",y,"â² (colonne ",A[90],"/",A[120],") ",e.jsx("em",{children:"fused"})," è il modello NWP alla lettera, non più un'estrapolazione radar: la colonna misura il modello, non il nowcast."]}),r&&e.jsx(Ue,{meta:d.meta}),r&&e.jsx(Qe,{station:d.meta.stationTruth}),e.jsxs(N,{title:"Stato attuale della pioggia e coerenza con la previsione",children:[!a||a.available!==!0||a.points.length===0?e.jsxs("p",{className:n.muted,children:["Lookback non disponibile: verifica che il cron di produzione (",e.jsx("code",{children:"point_series.py"}),") stia scrivendo ",e.jsx("code",{children:"lookback.json"}),"."]}):e.jsx("div",{className:n.pointGrid,children:a.points.map(t=>e.jsxs("div",{className:`${n.pointCard} ${t.nowWet?n.pointCardWet:""}`,children:[e.jsxs("div",{className:n.pointHead,children:[e.jsx("strong",{children:t.name}),e.jsx("span",{className:n.pointState,children:t.nowWet===null?"n/d":t.nowWet?`pioggia${t.nowRateMmH!=null?` · ${t.nowRateMmH.toFixed(1)} mm/h`:""}`:"asciutto"})]}),e.jsx("div",{className:n.pointChips,children:a.leadsMin.map(h=>{const x=t.byLead[String(h)],L=x!=null&&x.available?x.outcome:null,C=L?we[
1L]:_.empty;return e.jsxs("span",{className:n.chip,style:{borderColor:C,color:C},children:["â",A[h]??`${h}â²`,":"," ",x!=null&&x.available&&L?ke[L]:"n/d"]},h)})})]},t.slug))}),(a==null?void 0:a.available)===!0&&!a.stormAvailable&&e.jsxs("p",{className:n.hint,children:["Il temporale manca da ",e.jsx("em",{children:"questi"})," riquadri perché nessuna previsione di temporale per punto è archiviata: qui si risponde a «l'avevo previsto 30â² fa?», e per farlo servirebbe la previsione di allora, non la verità di adesso. La ",e.jsx("em",{children:"skill"})," sui temporali si misura lo stesso, sull'asse elettrico in fondo alla pagina."]})]}),l&&!r?e.jsx(N,{title:"Pagella",children:e.jsx("p",{className:n.muted,children:"Caricamentoâ¦"})}):r?e.jsxs(e.Fragment,{children:[e.jsxs(N,{title:`${G[p]} â Pioggia`,children:[e.jsx("p",{className:n.panelLede,children:p==="inverse"?"Di tutte le volte che è davvero piovuto, quante il modello le aveva previste con questo anticipo:":"Di tutte le volte che il modello ha previsto pioggia con questo margine, quante poi sono successe:"}),e.jsxs("div",{className:n.controls,children:[e.jsx("div",{className:n.toggleGroup,role:"tablist","aria-label":"Domanda",children:["inverse","direct"].map(t=>e.jsx("button",{type:"button",className:`${n.toggle} ${p===t?n.toggleActive:""}`,"aria-pressed":p===t,onClick:()=>o(t),children:G[t]},t))}),e.jsx("div",{className:n.toggleGroup,role:"tablist","aria-label":"Verità ",children:["both","ground","radar"].map(t=>e.jsx("button",{type:"button",className:`${n.toggle} ${c===t?n.toggleActive:""}`,"aria-pressed":c===t,onClick:()=>m(t),children:t==="both"?"Suolo + Radar":M[t]},t))}),e.jsx(ia,{})]}),e.jsx("div",{className:n.tableWrap,children:e.jsxs("table",{className:n.matrix,children:[e.jsxs("thead",{children:[e.jsxs("tr",{children:[e.jsx("th",{className:n.locCol,children:"Comune"}),T.map(t=>e.jsxs("th",{colSpan:i.length,children:[A[t],t>y&&e.jsx("span",{className:n.radarHorizonBadge,children:"modello"})]},t))]}),c==="both"&&e.jsxs("tr",{children:[e.jsx("th",{}),T.map(t=>i.map(h=>e.jsx("th",{children:M[h]},`${t}-${h}`)))]})]}),e.jsx("tbody",{children:S.map(t=>e.jsxs("tr",{className:`${n.row} ${v===t?n.rowSelected:""}`,onClick:()=>b(v===t?null:t),children:[e.jsx("td",{className:n.locCol,children:R(t)}),T.map(h=>i.map(x=>e.jsx("td",{children:e.jsx(ta,{cell:F(j==null?void 0:j[t],h,x),question:p})},`${h}-${x}`)))]},t))})]})}),e.jsxs("p",{className:n.hint,children:[Q[p],". Sotto la percentuale, «X su Y volte»: sotto 20 eventi il colore si spegne (dato in accumulo, non ancora un giudizio). Passando sopra una cella compare l'intervallo di confidenza al 95%; clic su una riga per il dettaglio, con gli intervalli per esteso e l'errore di onset (anticipo/ritardo)."]})]}),g&&e.jsx(oa,{name:R(v),row:g,onClose:()=>b(null)}),e.jsx(Ke,{perLead:d.perLead,thresholds:d.meta.thresholds}),e.jsx(Je,{byRegime:d.byRegime}),e.jsx(ea,{fss:d.fssNetwork30,scales:d.meta.fssScales}),e.jsx(aa,{perLead:d.perLead,meta:d.meta.lightning}),u.length>0&&e.jsxs(N,{title:"Trend della pagella (rete, notte per notte)",children:[e.jsx("div",{className:n.tableWrap,children:e.jsxs("table",{className:n.trendTable,children:[e.jsx("thead",{children:e.jsxs("tr",{children:[e.jsx("th",{children:"Notte"}),e.jsx("th",{children:"Episodi"}),e.jsx("th",{children:"CSI@30â²"}),e.jsx("th",{children:"CSI@1h"}),e.jsx("th",{children:"CSI@2h"}),e.jsx("th",{children:"MAE@30â² (mm/h)"}),e.jsx("th",{children:"MAE@1h"}),e.jsx("th",{children:"MAE@2h"}),e.jsx("th",{children:"Fulmini@30â²"})]})}),e.jsx("tbody",{children:u.map((t,h)=>e.jsxs(f.Fragment,{children:[h>0&&K(u[h-1],t)&&e.jsx(na,{sopra:u[h-1].truthVersion,sotto:t.truthVersion}),e.jsx(sa,{row:t})]},t.t))})]})}),e.jsx("p",{className:n.hint,children:"CSI e MAE di rete (verità suolo, fused) alla notte in cui la pagella è stata calcolata â non un accumulo cumulativo per sempre come il vecchio grafico."})]})]}):e.jsx(N,{title:"Pagella non disponibile",children:e.jsxs("p",{className:n.muted,children:[d&&"message"in d?d.message:"Nessun dato."," Verifica che il cron notturno ",e.jsx("code",{children:"pagella_run.sh"})," sul Pi5 stia girando (03:35)."]})})]})}function Ve({blocks:a,comuni:s}){const l=a==null?void 0:a.unit;return l==="day"?e.jsxs(e.Fragment,{children:["Il blocco del ricampionamento è il ",e.jsx("strong",{children:"giorno UTC"}),typeof(a==null?void 0:a.n)=="number"?` (${a.n} giorni nel campione)`:"",": lâunità comune a tutta la rete. Dentro una giornata la stessa perturbazione passa su tutti i punti, quindi i ",s??12," punti contano come una prova e non come ",s??12,"."," "]}):l==="point-episode"?e.jsxs("strong",{children:["Il blocco è la coppia (punto, episodio): due dei ",s??12," punti colpiti dalla stessa perturbazione contano come due blocchi ma sono una sola prova, quindi gli intervalli qui sotto sono più stretti del vero."," "]}):e.jsxs("strong",{children:["Blocco del ricampionamento ",e.jsx("em",{children:"non dichiarato"}),": questa pagella è stata prodotta prima che il metro viaggiasse con lei, e i suoi intervalli non sono confrontabili con quelli di una pagella recente."," "]})}function Ue({meta:a}){var s;return e.jsxs("p",{className:n.hint,children:[e.jsx("strong",{children:"Come sono calcolati."}
1)," Gli intervalli vengono da"," ",a.bootstrap.toLocaleString("it-IT")," ricampionamenti a blocchi; un episodio conta come tale dopo ",a.matureMin,"â²."," ","Lettura delle osservazioni al suolo:"," ",e.jsx("strong",{children:P(a.truthVersion)}),"."," ",a.note&&e.jsx("em",{children:a.note})," ",e.jsx(Ve,{blocks:(s=a.protocol)==null?void 0:s.blocks,comuni:a.comuni}),"Servono a confrontare righe fra loro, non a certificare una precisione."]})}function Qe({station:a}){return a?a.enabled?a.recordsFilled?e.jsxs("p",{className:n.hint,children:[e.jsx("strong",{children:"Due strumenti nella stessa colonna."})," Undici punti hanno un pluviometro ARPAV a vaschetta (bucket da 5â²); il riferimento"," ",e.jsx("em",{children:R(a.slug??"")})," no, e le sue osservazioni provengono dalla stazione Davis locale (",a.recordsFilled.toLocaleString("it-IT")," cicli da"," ",(a.obs??0).toLocaleString("it-IT")," osservazioni), che misura un"," ",e.jsx("em",{children:"rate istantaneo"}),". La differenza è di strumento, non di trattamento â ma nel dato di rete i due sono mescolati, e una differenza di misura non va letta come differenza di skill."]}):e.jsxs("div",{className:n.caveat,role:"note",children:[e.jsx("strong",{children:"Il riferimento è muto."})," Il join della stazione locale è attivo ma non ha riempito nessun ciclo: ",e.jsx("code",{children:a.file??"nowcast_truth.ndjson"})," ","è assente o non contiene ",e.jsx("code",{children:"stationRate"})," fresco. La riga"," ",e.jsx("em",{children:a.slug??"del riferimento"})," resterà vuota nella colonna suolo â è un guasto della pipeline, non un'assenza di pioggia."]}):e.jsxs("div",{className:n.caveat,role:"note",children:[e.jsx("strong",{children:"Confronto con la stazione locale disattivato."})," La pagella è stata prodotta con ",e.jsx("code",{children:"--no-station-truth"}),": il punto"," ",e.jsx("em",{children:a.slug??"di riferimento"})," compare nell'elenco ma resta senza osservazioni al suolo, come nelle pagelle fino al 6 agosto 2026. à la configurazione dell'A/B, non quella di default."]}):null}const q={csi:{label:"CSI",note:"Equilibrio fra previsioni azzeccate, mancate e falsi allarmi sopra la soglia scelta.",better:"higher",needsThreshold:!0},pod:{label:"POD",note:"Di tutte le volte che è piovuto sopra la soglia, quante il ramo le aveva viste.",better:"higher",needsThreshold:!0},successRate:{label:"1 â FAR",note:"Di tutte le volte che il ramo ha annunciato pioggia, quante poi sono successe.",better:"higher",needsThreshold:!0},maeWet:{label:"MAE bagnato",note:"Errore medio sullâintensità nei soli casi in cui è davvero piovuto (mm/h): più basso è meglio.",better:"lower",needsThreshold:!1},bss:{label:"BSS",note:"Skill sul base-rate del campione: sopra 0 meglio della frequenza media, sotto 0 peggio.",better:"higher",needsThreshold:!1}};function Ke({perLead:a,thresholds:s}){const[l,p]=f.useState("ground"),[o,c]=f.useState("csi"),[m,v]=f.useState(()=>s.length>0?String(s[0].toFixed(1)):"0.2"),b=q[o],d=f.useMemo(()=>{var g;const i=new Set;for(const u of $){const t=(g=I(a,u,l))==null?void 0:g.dichotomous;Object.keys(t??{}).forEach(h=>i.add(h))}return[...i].sort((u,t)=>Number(u)-Number(t))},[a,l]),r=d.includes(m)?m:d[0],j=f.useMemo(()=>{const i=new Set;for(const g of $){const u=I(a,g,l);u&&(Object.keys(u.brier??{}).forEach(t=>i.add(t)),Object.keys(u.mae??{}).forEach(t=>i.add(t)),Object.values(u.dichotomous??{}).forEach(t=>Object.keys(t).forEach(h=>i.add(h))))}return Y([...i])},[a,l]),S=f.useMemo(()=>{var u;const i={},g={};for(const t of $){const h=I(a,t,l);for(const x of j){const L=Ye(h,x,o,r);if(i[x]??(i[x]={}),i[x][t]={value:L.value,support:L.support,verdict:"empty"},L.value===null)continue;const C=g[t];(C==null||(b.better==="higher"?L.value>C:L.value<C))&&(g[t]=L.value)}}for(const t of j)for(const h of $){const x=(u=i[t])==null?void 0:u[h];x&&(x.verdict=o==="maeWet"?Z(x.value,g[h]??null,x.support):o==="bss"?J(x.value,x.support):Xe(x.value,x.support))}return{cells:i,bestByLead:g}},[j,a,l,o,r,b.better]);return j.length===0?e.jsx(N,{title:"Quale ramo del motore vince",children:e.jsxs("p",{className:n.muted,children:["Nessun confronto per ramo nel payload: la pagella di rete non ha ancora scritto il blocco ",e.jsx("code",{children:"perLead[â¦].truths"}),"."]})}):e.jsxs(N,{title:"Quale ramo del motore vince",children:[e.jsxs("p",{className:n.panelLede,children:["La matrice qui sopra misura ciò che il prodotto pubblica. Questo pannello apre la scatola: sulla stessa verità e sulla stessa soglia, lâestrapolazione radar (euleriana e lagrangiana), il modello NWP nudo e il fuso che va in produzione. Serve a vedere ",e.jsx("em",{children:"da quale scadenza il radar smette di aggiungere valore"}),", che è la domanda su cui si decide il peso del blend."]}),e.jsxs("div",{className:n.controls,children:[e.jsx("div",{className:n.toggleGroup,role:"tablist","aria-label":"Verità ",children:["ground","radar"].map(i=>e.jsx("button",{type:"button",className:`${n.toggle} ${l===i?n.toggleActive:""}`,"aria-pressed":l===i,onClick:()=>p(i),children:M[i]},i))}),e.jsx("div",{className:n.toggleGroup,role:"tablist","aria-label":"Metrica",children:Object.keys(q).map(i=>e.jsx("button",{type:"button",className:`${n.toggle}
1 ${o===i?n.toggleActive:""}`,"aria-pressed":o===i,onClick:()=>c(i),children:q[i].label},i))}),b.needsThreshold&&d.length>0&&e.jsx("div",{className:n.toggleGroup,role:"tablist","aria-label":"Soglia",children:d.map(i=>e.jsxs("button",{type:"button",className:`${n.toggle} ${r===i?n.toggleActive:""}`,"aria-pressed":r===i,onClick:()=>v(i),children:["â¥",i," mm/h"]},i))})]}),e.jsx("p",{className:n.hint,children:b.note}),e.jsx("div",{className:n.tableWrap,children:e.jsxs("table",{className:n.matrix,children:[e.jsx("thead",{children:e.jsxs("tr",{children:[e.jsx("th",{className:n.locCol,children:"Ramo"}),$.map(i=>e.jsxs("th",{children:[k(i),i>y&&e.jsx("span",{className:n.radarHorizonBadge,children:"modello"})]},i))]})}),e.jsx("tbody",{children:j.map(i=>e.jsxs("tr",{children:[e.jsxs("td",{className:n.locCol,children:[e.jsx("div",{className:n.branchName,children:B[i]??i}),e.jsx("div",{className:n.branchHint,children:ee[i]??""})]}),$.map(g=>{var h;const u=(h=S.cells[i])==null?void 0:h[g],t=(u==null?void 0:u.value)!==null&&(u==null?void 0:u.value)!==void 0&&S.bestByLead[g]===u.value;return e.jsx("td",{children:!u||u.value===null?e.jsx("span",{className:n.cellEmpty,children:"â"}):e.jsxs("div",{className:n.cell,style:{borderColor:_[u.verdict]},title:`${u.support} casi`,children:[e.jsxs("span",{className:n.cellPod,style:{color:_[u.verdict]},children:[Ze(o,u.value),t&&e.jsx("span",{className:n.winTag,children:"best"})]}),e.jsx("span",{className:n.cellSub,children:u.support})]})},g)})]},i))})]})}),e.jsxs("p",{className:n.hint,children:["Sotto il valore câè il campione che lo regge â eventi osservati, non cicli â e sotto ",w," casi il colore si spegne. ",e.jsxs("strong",{children:["«",B.fused,"»"]})," è il prodotto: se un ramo singolo lo batte sistematicamente a una scadenza, è quel peso del blend a essere sbagliato, non la metrica. La colonna ",e.jsx("strong",{children:"ora"})," è lâanalisi, non una previsione."," ","Oltre i ",y,"â² le righe «",B.fused,"» e «",B.model,"» riportano gli ",e.jsx("em",{children:"stessi"})," numeri perché lì il fuso è il modello per costruzione: la doppia marca ",e.jsx("strong",{children:"best"})," non è un pareggio misurato."]})]})}function Xe(a,s){return a===null?"empty":s<w?"collecting":a>=.7?"good":a<.4?"bad":"warn"}function Ye(a,s,l,p){var m,v,b,d;if(!a)return{value:null,support:0};if(l==="maeWet"){const r=(m=a.mae)==null?void 0:m[s];return{value:(r==null?void 0:r.maeWet)??null,support:(r==null?void 0:r.n)??0}}if(l==="bss"){const r=(v=a.brier)==null?void 0:v[s];return{value:(r==null?void 0:r.bss)??null,support:(r==null?void 0:r.n)??0}}const o=p?(d=(b=a.dichotomous)==null?void 0:b[p])==null?void 0:d[s]:void 0;if(!o)return{value:null,support:0};const c=Math.round(o.hit+o.miss);return l==="csi"?{value:o.csi,support:c}:l==="pod"?{value:o.pod,support:c}:{value:o.far===null?null:1-o.far,support:c}}function Ze(a,s){return a==="maeWet"?se(s):a==="bss"?V(s):z(s)}function Je({byRegime:a}){const s=f.useMemo(()=>Object.keys(a??{}).sort(),[a]);return!a||s.length===0?null:e.jsxs(N,{title:"La stessa skill, separata per regime",children:[e.jsxs("p",{className:n.panelLede,children:["Lo stesso CSI di rete, diviso fra giornate convettive e stratiformi, contro entrambe le verità . Il divario fra la colonna suolo e la colonna radar",e.jsx("em",{children:" è"})," la misura della virga: dove il radar vede molto più del pluviometro, lâeco non arrivava a terra."]}),e.jsx("div",{className:n.tableWrap,children:e.jsxs("table",{className:n.trendTable,children:[e.jsx("thead",{children:e.jsxs("tr",{children:[e.jsx("th",{children:"Regime"}),e.jsx("th",{children:"Anticipo"}),e.jsx("th",{children:"Cicli"}),e.jsx("th",{children:"CSI suolo"}),e.jsx("th",{children:"CSI radar"}),e.jsx("th",{children:"Divario"})]})}),e.jsx("tbody",{children:s.flatMap(l=>$.flatMap(p=>{var m;const o=(m=a[l])==null?void 0:m[String(p)];if(!o)return[];const c=o.csiRadar!==null&&o.csiGround!==null?o.csiRadar-o.csiGround:null;return[e.jsxs("tr",{children:[e.jsx("td",{children:ae(l)}),e.jsx("td",{children:k(p)}
1),e.jsx("td",{children:o.nCycles.toLocaleString("it-IT")}),e.jsxs("td",{children:[z(o.csiGround),e.jsxs("span",{className:n.cellSub,children:[" (",o.nGround,")"]})]}),e.jsxs("td",{children:[z(o.csiRadar),e.jsxs("span",{className:n.cellSub,children:[" (",o.nRadar,")"]})]}),e.jsx("td",{style:{color:c!==null&&c>.2?_.warn:void 0},children:c===null?"â":`${c>0?"+":""}${Math.round(c*100)} pt`})]},`${l}-${p}`)]}))})]})}),e.jsxs("p",{className:n.hint,children:["Un divario ampio e positivo nel convettivo è atteso e non è un difetto del tracker: è il radar che misura una colonna dâaria, non un pluviometro."," ",e.jsx("strong",{children:"La condizione «resta ampio anche nello stratiforme» non è unâipotesi: leggendo le righe qui sopra è già così."})," ","Il disaccordo fra le due verità non si spiega quindi con la sola virga convettiva, e non va letto come tale: la ricostruzione delle osservazioni al suolo è il pacchetto WBS 2 del piano di revisione."]})]})}function ea({fss:a,scales:s}){const l=f.useMemo(()=>["ground","radar"].filter(o=>E(a==null?void 0:a[o]).length>0),[a]);if(l.length===0)return null;const p=o=>{const c=new Set;for(const v of E(a==null?void 0:a[o]))for(const b of v.cells)c.add(b.scale);const m=[...c].sort((v,b)=>v-b);return(m.length>0?m:s??[]).map(te)};return e.jsxs(N,{title:"Tolleranza sullâorario (FSS temporale a 30â²)",children:[e.jsxs("p",{className:n.panelLede,children:["Le metriche puntuali puniscono due volte uno sfasamento di pochi minuti: contano una mancata quando non pioveva ancora ",e.jsx("em",{children:"e"})," un falso allarme quando ha smesso. La FSS confronta invece le frazioni bagnate allargando la finestra attorno allâistante: se sale allargando la tolleranza, la previsione era giusta ma in anticipo o in ritardo. Non dice nulla su ",e.jsx("em",{children:"dove"}),": è una misura sullâasse del tempo, al punto."]}),l.map(o=>e.jsx("div",{className:n.tableWrap,children:e.jsxs("table",{className:n.trendTable,children:[e.jsx("thead",{children:e.jsxs("tr",{children:[e.jsxs("th",{children:[M[o]," · soglia"]}),p(o).map(c=>e.jsx("th",{children:c},c))]})}),e.jsx("tbody",{children:E(a==null?void 0:a[o]).map(c=>e.jsxs("tr",{children:[e.jsxs("td",{children:["â¥",c.threshold," mm/h"]}),c.cells.map(m=>e.jsx("td",{children:V(m.value,3)},m.scale))]},`${o}-${c.threshold}`))})]})},o)),e.jsx("p",{className:n.hint,children:"Le scale sono il raggio della finestra temporale: «istante esatto» non concede tolleranza, ±5â² accetta uno sfasamento di un ciclo, e così via. Un valore che resta piatto allargando la finestra dice che lâerrore non è di orario ma di esistenza â la pioggia non câera affatto. La verifica della struttura nello spazio richiederebbe campi sulla griglia, e oggi non è calcolata."})]})}function aa({perLead:a,meta:s}){var m,v,b,d;const l=f.useMemo(()=>T.flatMap(r=>{const j=ne(a,r);return j?[{lead:r,block:j}]:[]}),[a]),p=f.useMemo(()=>{const r=new Set;return l.forEach(j=>Object.keys(j.block).forEach(S=>r.add(S))),[...r]},[l]);if(l.length===0)return e.jsx(N,{title:"Temporali: l'asse elettrico",children:e.jsx("p",{className:n.muted,children:s!=null&&s.nCyclesLight?"Il campo elettrico è archiviato ma nessun temporale è ancora caduto nella finestra scorata: lâasse è pronto e matura al primo episodio.":"Nessun ciclo con campo elettrico archiviato: le scariche vicine a ogni punto si registrano dal 3 agosto 2026, e i cicli precedenti si astengono â non contano come cielo sereno."})});const o=((v=(m=l[0])==null?void 0:m.block.persist)==null?void 0:v.daysLight)??null,c=((d=(b=l[0])==null?void 0:b.block.persist)==null?void 0:d.baseRate)??null;return e.jsxs(N,{title:"Temporali: l'aveva visto arrivare?",children:[e.jsxs("p",{className:n.panelLede,children:["Il secondo bersaglio, accanto alla pioggia: la probabilità che entro"," ",(s==null?void 0:s.nearKm)??20," km dal punto cada almeno ",(s==null?void 0:s.lightMin)??2," scariche. La verità è elettrica e non ha i difetti di quella pluviometrica â è binaria, puntuale nel tempo, senza virga né ritardo del basculante."]}),e.jsx("div",{className:n.tableWrap,children:e.jsxs("table",{className:n.trendTable,children:[e.jsx("thead",{children:e.jsxs("tr",{children:[e.jsx("th",{children:"Anticipo"}),p.map(r=>e.jsx("th",{children:H[r]??r},r)),e.jsx("th",{children:"Casi"})]})}),e.jsx("tbody",{children:l.map(({lead:r,block:j})=>{var S;return e.jsxs("tr",{children:[e.jsx("td",{children:A[r]??`${r}â²`}),p.map(i=>{const g=j[i];return e.jsx("td",{children:(g==null?void 0:g.bss)==null?"â":e.jsxs(e.Fragment,{children:[e.jsx("strong",{children:g.bss.toFixed(2)}),g.bssCi&&e.jsxs("span",{className:n.cellSub,children:[" ","[",g.bssCi[0].toFixed(2),"â",g.bssCi[1].toFixed(2),"]"]})]})},i)}),e.jsx("td",{children:(((S=j.persist)==null?void 0:S.n)??0).toLocaleStr
1ing("it-IT")})]},r)})})]})}),e.jsxs("p",{className:n.hint,children:["Il numero è lo ",e.jsx("strong",{children:"scarto di Brier contro la climatologia"}),": 0 = non sa più della frequenza media dei temporali (",c==null?"â":z(c)," ","dei casi), 1 = perfetto. La colonna «",H.persist,"» è il metro da battere, non un risultato: dice «sta già fulminando qui», ed è per questo che a 15â² vince sempre."]}),e.jsxs("div",{className:n.caveat,role:"note",children:[o!=null&&o<3?e.jsxs(e.Fragment,{children:[e.jsx("strong",{children:"Non citabile."})," Questi numeri poggiano su"," ",o===1?"una sola giornata":`${o} giornate`," con fulmini: l'asse è aperto per ",e.jsx("em",{children:"accumulare"}),", non ancora per giudicare."," "]}):e.jsxs(e.Fragment,{children:[e.jsxs("strong",{children:["Giornate elettriche: ",o??"â","."]})," "]}),e.jsx("strong",{children:"Gli intervalli restano più stretti del vero, sempre."})," I 12 punti condividono i temporali â i raggi da ",(s==null?void 0:s.nearKm)??20," km si sovrappongono, e due punti hanno perfino lo stesso pluviometro â quindi le migliaia di casi qui sopra sono in buona parte la stessa perturbazione contata molte volte. Il numero che governa la fiducia sono le giornate, non i casi."]})]})}function na({sopra:a,sotto:s}){return e.jsx("tr",{children:e.jsxs("td",{colSpan:9,className:n.trendBreak,children:["Da qui in giù la verità è stata letta in un altro modo (",P(s)," sotto,"," ",P(a)," sopra): le righe si leggono ciascuna nel suo blocco,"," ",e.jsx("strong",{children:"non fra loro"}),". A previsione identica un lettore diverso vede più o meno pioggia, quindi un salto attraverso questa riga non dice nulla sul motore.",(a==null||s==null)&&e.jsxs(e.Fragment,{children:[" ","Il blocco senza versione, per giunta, non è garantito omogeneo: quelle notti sono state prodotte prima che la pagella dichiarasse come aveva letto la verità , e almeno una correzione del lettore è caduta lì dentro senza lasciare traccia."]})]})})}function sa({row:a}){var p;const s=o=>o==null?"â":z(o),l=o=>o==null?"â":o.toFixed(2);return e.jsxs("tr",{children:[e.jsx("td",{children:new Date(a.t).toLocaleDateString("it-IT")}),e.jsx("td",{children:a.episodes??"â"}),e.jsx("td",{children:s(a.csiGround[30])}),e.jsx("td",{children:s(a.csiGround[60])}),e.jsx("td",{children:s(a.csiGround[120])}),e.jsx("td",{children:l(a.maeGroundWetMmH[30])}),e.jsx("td",{children:l(a.maeGroundWetMmH[60])}),e.jsx("td",{children:l(a.maeGroundWetMmH[120])}),e.jsx("td",{children:((p=a.bssLightPersist)==null?void 0:p["30"])==null?"â":e.jsxs(e.Fragment,{children:[a.bssLightPersist[30].toFixed(2),a.daysLight!=null&&e.jsxs("span",{className:n.cellSub,children:[" (",a.daysLight,"g)"]})]})})]})}function D(a,s){return a?s==="inverse"?a.podCi?` · IC 95% ${z(a.podCi[0])}â${z(a.podCi[1])}`:"":a.farCi?` · IC 95% ${z(1-a.farCi[1])}â${z(1-a.farCi[0])}`:"":""}function ta({cell:a,question:s}){const l=O(a,s);return l.verdict==="empty"?e.jsx("span",{className:n.cellEmpty,children:"â"}):e.jsxs("div",{className:n.cell,style:{borderColor:_[l.verdict]},title:`${l.num} su ${l.den} volte${D(a,s)}`,children:[e.jsx("span",{className:n.cellPod,style:{color:_[l.verdict]},children:l.verdict==="collecting"?"racc.":z(l.pct)}),e.jsx("span",{className:n.cellSub,children:`${l.num}/${l.den}`})]})}function oa({name:a,row:s,onClose:l}){return e.jsxs(N,{title:`Dettaglio â ${a}`,action:e.jsx("button",{type:"button",className:n.closeBtn,onClick:l,children:"Chiudi"}),children:[e.jsx("div",{className:n.detailBlock,children:e.jsx("div",{className:n.tableWrap,children:e.jsxs("table",{className:n.detailTable,children:[e.jsx("thead",{children:e.jsxs("tr",{children:[e.jsx("th",{children:"Anticipo"}),e.jsx("th",{children:"Verità "}),e.jsx("th",{children:"Lâaveva previsto?"}),e.jsx("th",{children:"Ci ha azzeccato?"})]})}),e.jsx("tbody",{children:T.map(p=>["ground","radar"].map(o=>{const c=F(s,p,o),m=O(c,"inverse"),v=O(c,"direct");return e.jsxs("tr",{children:[e.jsx("td",{children:A[p]}),e.jsx("td",{children:M[o]}),e.jsx("td",{style:{color:_[m.verdict]},children:m.den===0?"â":`${z(m.pct)} · ${m.num}/${m.den}${D(c,"inverse")}`}),e.jsx("td",{style:{color:_[v.verdict]},children:v.den===0?"â":`${z(v.pct)} · ${v.num}/${v.den}${D(c,"direct")}`})]},`${p}-${o}`)}))})]})})}),e.jsxs("p",{className:n.hint,children:["Onset (bias firmato + errore medio):"," ",s.onset.n>0?e.jsxs("strong",{children:[W(s.onset.biasMin)," ",X(s.onset.biasMin)," (media"," ",W(s.onset.maeMin),", n=",s.onset.n,")"]}
1):"in accumulo",". «Lâaveva previsto?» = di quando è successo, quanto previsto in anticipo. «Ci ha azzeccato?» = di quando ha previsto, quanto poi successo."]})]})}function ia(){const a=[{v:"good",label:"buono"},{v:"warn",label:"debole"},{v:"bad",label:"scarso"},{v:"collecting",label:"in accumulo (<20 eventi)"}];return e.jsx("div",{className:n.legend,children:a.map(s=>e.jsxs("span",{className:n.legendItem,children:[e.jsx("span",{className:n.legendDot,style:{background:_[s.v]}}),s.label]},s.v))})}export{pa as PrivateNowcastPagellaPage};
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.