PageSourceSearch

https://fenul.com/_next/static/chunks/0d45uu3bvxoru.js

js fenul.com collected 2026-10-03 20:07:57 UTC 65,279 bytes, 515 lines download raw bytes

1(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,594898,557281,e=>{"use strict";var a=e.i(843476),t=e.i(271645);let r="/api/owner/site-analytics";class n extends Error{status;code;constructor(e,a,t){super(e),this.name="SiteAnalyticsError",this.status=a,this.code=t}}async function i(e,a,t){let r=new AbortController,i=()=>r.abort(),o=!1;t?.aborted?i():t?.addEventListener("abort",i,{once:!0});let s=setTimeout(()=>{o=!0,r.abort()},75e3);try{return await l(e,a,r.signal)}catch(e){if(o&&!t?.aborted)throw new n("This section took too long to load. Please retry.",504,"timeout");throw e}finally{clearTimeout(s),t?.removeEventListener("abort",i)}}async function l(e,a,t){let r;try{r=await fetch(e,{method:"GET",cache:"no-store",signal:t,headers:a?{Authorization:"Bearer "+a}:{}})}catch(a){if(a?.name==="AbortError")throw a;throw new n("Could not reach "+e+": "+a.message,0)}if(504===r.status||524===r.status)throw new n("This section took too long to load. Please retry.",r.status,"timeout");if(404===r.status)throw new n("The website-analytics API is not deployed yet ("+e+" returned 404).",404,"not_deployed");let i=await r.text(),l=null;try{l=i?JSON.parse(i):null}catch{throw new n("The website-analytics API returned a non-JSON response (HTTP "+r.status+").",r.status,"bad_payload")}if(!r.ok){let a=l;throw new n(a?.error||"HTTP "+r.status+" from "+e,r.status,a?.code)}if(null===l)throw new n("Empty payload from "+e,r.status,"bad_payload");return l}let o=new Intl.NumberFormat("en-US");function s(e){return"number"==typeof e&&Number.isFinite(e)?o.format(Math.round(e)):"—"}function d(e){if("number"!=typeof e||!Number.isFinite(e))return"—";let a=Math.abs(e);return a>=1e6?(e/1e6).toFixed(a>=1e7?0:1).replace(/\.0$/,"")+"M":a>=1e3?(e/1e3).toFixed(a>=1e4?0:1).replace(/\.0$/,"")+"k":o.format(Math.round(e))}function c(e,a){if("number"!=typeof e||!Number.isFinite(e))return"—";let t=100*e,r=a??(t>0&&t<1?2:+(t<10));return t.toFixed(r)+"%"}function w(e,a=1){return"number"==typeof e&&Number.isFinite(e)?e.toFixed(a)+"%":"—"}function u(e){return"number"==typeof e&&Number.isFinite(e)?e<1?Math.round(60*e)+" min":e<48?(Math.round(10*e)/10).toString().replace(/\.0$/,"")+" h":(Math.round(e/24*10)/10).toString().replace(/\.0$/,"")+" d":"—"}function h(e){if(!e)return"—";let a=new Date(10===e.length?e+"T00:00:00Z":e);return Number.isNaN(a.getTime())?"—":a.toLocaleDateString("en-US",{month:"short",day:"numeric",timeZone:"UTC"})}function p(e,a){switch(a){case"percent":return w(e);case"ratio":return c(e);case"hours":return u(e);case"days":return"number"==typeof e?s(e)+" d":"—";case"position":return"number"==typeof e&&Number.isFinite(e)?e.toFixed(1):"—";case"usd":return"number"==typeof e&&Number.isFinite(e)?"$"+e.toFixed(2):"—";default:return s(e)}}function x(e,a){return!!a&&e>=a}function m(e){return"var(--wa-s"+(Math.min(Math.max(e,0),7)+1)+")"}function g(e,a){return"var(--wa-o"+(Math.min(Math.max(a<=1?0:Math.round(e/(a-1)*4),0),4)+1)+")"}function f(e){return"neutral"===e?"var(--wa-ink-muted)":"var(--wa-"+e+")"}function b(){let[e,a]=(0,t.useState)(0),r=(0,t.useRef)(null),n=(0,t.useCallback)(e=>{if(r.current?.disconnect(),!e||(a(e.clientWidth),"u"<typeof ResizeObserver))return;let t=new ResizeObserver(e=>{let t=e[0]?.contentRect.width??0;a(e=>Math.abs(e-t)>.5?t:e)});t.observe(e),r.current=t},[]);return(0,t.useEffect)(()=>()=>r.current?.disconnect(),[]),[n,e]}function v({reason:e,compact:t}){return(0,a.jsxs)("div",{className:"wa-unavail"+(t?" wa-unavail-compact":""),role:"note",children:[(0,a.jsx)("span",{className:"wa-unavail-badge","aria-hidden":"true",children:(0,a.jsxs)("svg",{width:"13",height:"13",viewBox:"0 0 16 16",fill:"none",children:[(0,a.jsx)("circle",{cx:"8",cy:"8",r:"6.6",stroke:"currentColor",strokeWidth:"1.5"}),(0,a.jsx)("path",{d:"M4.6 11.4 11.4 4.6",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round"})]})}),(0,a.jsxs)("div",{children:[(0,a.jsx)("p",{className:"wa-unavail-title",children:"Not available"}),(0,a.jsx)("p",{className:"wa-unavail-why",children:e})]})]})}function k({items:e,note:t}){return e.length<1?null:(0,a.jsxs)("div",{className:"wa-legend",children:[e.map(e=>(0,a.jsxs)("span",{className:"wa-legend-item",children:[(0,a.jsx)("span",{className:"wa-swatch"+(e.hatch?" wa-swatch-hatch":""),style:{background:e.hatch?void 0:e.color,color:e.color}}),e.label]},e.label)),t?(0,a.jsx)("span",{className:"wa-legend-note",children:t}):null]})}function y({tip:e,width:t}){if(!e)return null;let r=e.x>t-190;return(0,a.jsxs)("div",{className:"wa-tip",style:{left:e.x,top:e.y,transform:r?"translate(-104%, -50%)":"translate(12px, -50%)"},role:"presentation",children:[(0,a.jsx)("p",{className:"wa-tip-title",children:e.title}),e.rows.map((e,t)=>(0,a.jsxs)("p",{className:"wa-tip-row"+(e.dim?" wa-tip-dim":""),children:[e.color?(0,a.jsx)("span",{className:"wa-swatch",style:{background:e.color}}):null,(0,a.jsx)("span",{className:"wa-tip-label",children:e.label}),(0,a.jsx)("span",{className:"wa-tip-val",children:e.value})]},e.label+t))]})}function j({uid:e}){return(0,a.jsxs)("defs",{children:[(0,a.jsxs)("pattern",{id:e+"-hatch",width:"6",height:"6",patternUnits:"userSpaceOnUse",patternTransform:"rotate(45)",children:[(0,a.jsx)("rect",{width:"6",height:"6",fill:"var(--wa-h
1atch-bg)"}),(0,a.jsx)("line",{x1:"0",y1:"0",x2:"0",y2:"6",stroke:"var(--wa-hatch-ink)",strokeWidth:"2"})]}),(0,a.jsxs)("pattern",{id:e+"-hatch2",width:"6",height:"6",patternUnits:"userSpaceOnUse",patternTransform:"rotate(135)",children:[(0,a.jsx)("rect",{width:"6",height:"6",fill:"var(--wa-hatch-bg)"}),(0,a.jsx)("line",{x1:"0",y1:"0",x2:"0",y2:"6",stroke:"var(--wa-hatch-ink)",strokeWidth:"2"})]})]})}function M(e,a,t=4){if(!Number.isFinite(e)||!Number.isFinite(a)||a===e)return[e||0,(e||0)+1];let r=(a-e)/t,n=Math.pow(10,Math.floor(Math.log10(r))),i=r/n,l=(i>=5?10:i>=2?5:i>=1?2:1)*n,o=[];for(let t=Math.floor(e/l)*l;t<=a+.5*l;t+=l)o.push(Number(t.toFixed(6)));return o}function N({series:e,width:t=110,height:r=30}){let n=e.points,i=n.map(e=>e.value).filter(e=>null!==e);if(i.length<2)return null;let l=Math.min(...i),o=Math.max(...i)-l||1,s=[],d=[];return n.forEach((e,a)=>{null===e.value?(d.length>1&&s.push(d.join(" ")),d=[]):d.push((d.length?"L":"M")+(a/Math.max(1,n.length-1)*(t-2)+1).toFixed(1)+" "+(r-2-(e.value-l)/o*(r-4)).toFixed(1))}),d.length>1&&s.push(d.join(" ")),(0,a.jsx)("svg",{width:t,height:r,className:"wa-spark","aria-hidden":"true",children:s.map((e,t)=>(0,a.jsx)("path",{d:e,fill:"none",stroke:"var(--wa-s1)",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round"},t))})}e.s(["CHECKPOINT_ORDER",0,["24h","3d","7d","14d","30d"],"CRAWL_STATE_LABEL",0,{measured:"Crawl observed",measured_no_fetch:"Monitored, no fetch seen",censored_predates_sync:"Predates edge-log sync"},"CRAWL_STATE_ORDER",0,["measured","measured_no_fetch","censored_predates_sync"],"EMDASH",0,"—","FUNNEL_ORDER",0,["published","sitemap","discovered","crawled","indexed","impressions","clicks","readers"],"INDEX_STATE_LABEL",0,{indexed:"Indexed",crawled_not_indexed:"Crawled, not indexed",discovered_not_indexed:"Discovered, not crawled",unknown_to_google:"Not observed in the available evidence",excluded:"Excluded",error:"Fetch error",not_inspected:"Not inspected yet"},"INDEX_STATE_ORDER",0,["indexed","crawled_not_indexed","discovered_not_indexed","unknown_to_google","excluded","error","not_inspected"],"SECTIONS",0,[{id:"overview",label:"Overview",blurb:"Where content is getting stuck, end to end"},{id:"search",label:"Search",blurb:"Impressions, clicks, CTR and position"},{id:"indexing",label:"Indexing",blurb:"Coverage, speed to index, and what is stuck"},{id:"traffic",label:"Traffic",blurb:"Readers who actually arrived"},{id:"crawl",label:"Crawl",blurb:"What Google fetched, and what it wasted"},{id:"content",label:"Content",blurb:"What we published, and whether it stuck"},{id:"categories",label:"Categories",blurb:"Which sections index and which do not"},{id:"articles",label:"Articles",blurb:"Per-article lifecycle"},{id:"cohorts",label:"Cohorts",blurb:"The indexing experiment, lane by lane"},{id:"internalLinks",label:"Internal Link Health",blurb:"Orphan articles, click depth, and the treatment cohorts fixing it"},{id:"articleGeneration",label:"New Article SEO Readiness",blurb:"Every article the generator publishes, checked end to end: validated, sitemapped, linked, crawled, indexed"},{id:"technical",label:"Technical Health",blurb:"Things that need a decision"},{id:"deployments",label:"Deployments",blurb:"Is the code healthy: version, deploys, backups, locks"},{id:"recovery",label:"Search Visibility Recovery",blurb:"Factlen & Koohestun: is the intervention working?"}],"STATUS_RANK",0,{critical:0,serious:1,warning:2,good:3,neutral:4},"SiteAnalyticsError",0,n,"capabilityReason",0,function(e,a){let t=e.capabilities?.[a];return t?t.available?null:t.reason:"This site does not report "+a.replace(/_/g," ")+" yet."},"fetchSection",0,function(e,a,t){let n;return i(((n=new URLSearchParams).set("site",e.site),n.set("section",e.section),n.set("days",String(e.days)),e.category&&n.set("category",e.category),e.subcategory&&n.set("subcategory",e.subcategory),e.story&&n.set("story",e.story),e.state&&n.set("state",e.state),e.crawlState&&n.set("crawlState",e.crawlState),e.cohort&&n.set("cohort",e.cohort),e.q&&n.set("q",e.q),e.publishedFrom&&n.set("publishedFrom",e.publishedFrom),e.publishedTo&&n.set("publishedTo",e.publishedTo),e.page&&n.set("page",String(e.page)),e.pageSize&&n.set("pageSize",String(e.pageSize)),r+"?"+n.toString()),a,t)},"fetchSiteAnalyticsIndex",0,function(e,a){return i(r,e,a)},"fmtCompact",0,d,"fmtCount",0,s,"fmtDate",0,h,"fmtDateTime",0,function(e){if(!e)return"—";let a=new Date(e);
1return Number.isNaN(a.getTime())?"—":a.toLocaleString()},"fmtHours",0,u,"fmtPercent",0,w,"fmtRatio",0,c,"fmtValue",0,p,"isIncomplete",0,x,"isOk",0,e=>!!e&&"ok"===e.state,"ok",0,e=>({state:"ok",value:e})],557281),e.s(["Availability",0,function({of:e,children:t,compact:r}){return e?"unavailable"===e.state?(0,a.jsx)(v,{compact:r,reason:e.reason}):(0,a.jsx)(a.Fragment,{children:t(e.value)}):(0,a.jsx)(v,{compact:r,reason:"The data layer did not return this metric."})},"CheckpointChart",0,function({groups:e,checkpointLabels:r,height:n=240}){let[i,l]=b(),[o,d]=(0,t.useState)(null),w=(0,t.useId)().replace(/[^a-zA-Z0-9]/g,""),u=Math.max(10,l-46-12),h=Math.max(10,n-12-42),p=u/(r.length||1),x=e.length?Math.max(4,.78*p/e.length-3):0,g=Math.min(1,Math.max(.05,Math.ceil(20*e.reduce((e,a)=>a.bars.reduce((e,a)=>Math.max(e,(a.rate??0)+(a.measured>0?a.unmeasured/(a.measured+a.unmeasured):0)),e),.05))/20)),f=e=>12+h-e/g*h;return 0===l?(0,a.jsx)("div",{ref:i,className:"wa-chart-skel",style:{height:n}}):(0,a.jsxs)("div",{children:[(0,a.jsxs)("div",{ref:i,className:"wa-chart-host",children:[(0,a.jsxs)("svg",{width:l,height:n,role:"img","aria-label":"Indexing rate by checkpoint",children:[(0,a.jsx)(j,{uid:w}),[0,g/2,g].map(e=>(0,a.jsxs)("g",{children:[(0,a.jsx)("line",{x1:46,y1:f(e),x2:46+u,y2:f(e),stroke:"var(--wa-grid)",strokeWidth:"1"}),(0,a.jsx)("text",{x:38,y:f(e)+4,className:"wa-axis-tick",textAnchor:"end",children:c(e,+(g<.1))})]},"y"+e)),r.map((t,r)=>{let i=46+r*p+.11*p;return(0,a.jsxs)("g",{children:[(0,a.jsx)("text",{x:46+r*p+p/2,y:n-22,className:"wa-axis-tick",textAnchor:"middle",children:t}),e.map((e,n)=>{let l=e.bars[r],o=i+n*(x+3);if(!l)return null;if(null===l.rate)return(0,a.jsx)("rect",{x:o,y:12,width:x,height:h,fill:"url(#"+w+"-hatch)",opacity:"0.75",onMouseMove:a=>{let r=a.currentTarget.ownerSVGElement.getBoundingClientRect();d({x:a.clientX-r.left,y:a.clientY-r.top,title:e.label+" · "+t,rows:[{label:"Not measured",value:l.censoredReason??"no observation at this boundary",dim:!0},{label:"Members not looked at",value:s(l.unmeasured),dim:!0}]})},onMouseLeave:()=>d(null)},e.id);let u=f(l.rate),p=l.measured+l.unmeasured,b=p>0?l.unmeasured/p/(g||1)*h:0;return(0,a.jsxs)("g",{onMouseMove:a=>{let r=a.currentTarget.ownerSVGElement.getBoundingClientRect();d({x:a.clientX-r.left,y:a.clientY-r.top,title:e.label+" · "+t,rows:[{label:"Reached",value:s(l.reached)+" of "+s(l.measured)+" measured",color:m(n)},{label:"Rate",value:c(l.rate)},{label:"Not yet measured",value:s(l.unmeasured),dim:!0}]})},onMouseLeave:()=>d(null),children:[(0,a.jsx)("rect",{x:o,y:u,width:x,height:Math.max(1,12+h-u),rx:"2",fill:m(n),opacity:e.muted?.45:1}),b>.5?(0,a.jsx)("rect",{x:o,y:Math.max(12,u-b-2),width:x,height:Math.min(b,u-12),fill:"url(#"+w+"-hatch2)"}):null]},e.id)})]},t)}),(0,a.jsx)("line",{x1:46,y1:12+h,x2:46+u,y2:12+h,stroke:"var(--wa-axis)",strokeWidth:"1"})]}),(0,a.jsx)(y,{tip:o,width:l})]}),(0,a.jsx)(k,{items:[...e.map((e,a)=>({label:e.label+(e.muted?" (superseded)":""),color:m(a)})),{label:"Not measured",color:"transparent",hatch:!0}],note:"Rate is reached ÷ measured. Members not yet inspected ride on top as hatch — they are never counted as failures."})]})},"Fact",0,function({figure:e,caption:t,tone:r,delta:n,spark:i}){return(0,a.jsxs)("div",{className:"wa-fact",children:[(0,a.jsx)("p",{className:"wa-fact-fig wa-fact-"+r,children:e}),(0,a.jsx)("p",{className:"wa-fact-cap",children:t}),(0,a.jsxs)("div",{className:"wa-fact-foot",children:[n?(0,a.jsxs)("span",{className:"wa-delta "+(n.good?"wa-delta-good":"wa-delta-bad"),children:["up"===n.direction?"▲":"down"===n.direction?"▼":"■"," ",p(Math.abs(n.value),n.unit)]}):(0,a.jsx)("span",{className:"wa-delta wa-delta-none",children:"no comparable prior window"}),i?(0,a.jsx)(N,{series:i}):null]})]})},"FunnelChart",0,function({rows:e,worstId:r,scopeLabel:n}){let[i,l]=b(),[o,w]=(0,t.useState)("log"),[u,h]=(0,t.useState)(null),p=(0,t.useId)().replace(/[^a-zA-Z0-9]/g,""),x=Math.max(80,l-132-168),m=30*e.length+30*Math.max(0,e.length-1)+26+8,f=e.filter(e=>null!==e.count),v=f.reduce((e,a)=>Math.max(e,a.count),0),M=f.length?f[0].count:0,N=(0,t.useMemo)(()=>{let a=[],t=null;for(let r of e)a.push(t),null!==r.count&&(t=r.count);return a},[e]),z=(0,t.useCallback)(e=>x<=0?0:"log"===o?Math.max(0,Math.log10(Math.max(e,0)+1)/(Math.log10(v+1)||1)*x):"step"===o?M>0?Math.max(e,0)/M*x:0:v>0?Math.max(e,0)/v*x:0,[o,v,M,x]),S=(0,t.useMemo)(()=>
1{if("log"===o){let e=[];for(let a=0;Math.pow(10,a)<=Math.max(v,1);a++)e.push(Math.pow(10,a));return v>0&&e[e.length-1]!==v&&e.push(v),e}let e="step"===o?M:v;return[0,.25,.5,.75,1].map(a=>Math.round(e*a))},[o,v,M]);return 0===l?(0,a.jsx)("div",{ref:i,className:"wa-chart-skel",style:{height:420}}):(0,a.jsxs)("div",{className:"wa-funnel",children:[(0,a.jsxs)("div",{className:"wa-funnel-bar",children:[(0,a.jsx)("p",{className:"wa-funnel-scope",children:n}),(0,a.jsx)("div",{className:"wa-seg",role:"group","aria-label":"Funnel width scale",children:[["log","Log scale","Keeps 308 readable beside 16,300"],["linear","Linear","True proportion — small stages become slivers"],["step","% of previous","Scale-free: ranks the transitions"]].map(([e,t,r])=>(0,a.jsx)("button",{type:"button",title:r,className:"wa-seg-btn"+(o===e?" wa-seg-on":""),"aria-pressed":o===e,onClick:()=>w(e),children:t},e))})]}),(0,a.jsxs)("div",{ref:i,className:"wa-chart-host",children:[(0,a.jsxs)("svg",{width:l,height:m,role:"img","aria-label":"Content indexing funnel",children:[(0,a.jsx)(j,{uid:p}),(0,a.jsx)("g",{children:S.map((e,t)=>{let r=132+z(e);return(0,a.jsxs)("g",{children:[(0,a.jsx)("line",{x1:r,y1:0,x2:r,y2:m-26,stroke:"var(--wa-grid)",strokeWidth:"1"}),(0,a.jsx)("text",{x:r,y:m-8,className:"wa-axis-tick",textAnchor:"middle",children:"step"===o&&M>0?c(e/M,0):d(e)})]},"t"+t+"-"+e)})}),e.map((t,n)=>{let i=60*n,l=null===t.count?0:Math.max(3*(t.count>0),z(t.count)),o=N[n],d=null!==o&&null!==t.count?o-t.count:null,w=null!==o&&o>0&&null!==t.count?t.count/o:null,u=t.id===r,m=null!==o?Math.max(3*(o>0),z(o)):null;return(0,a.jsxs)("g",{children:[null!==m&&n>0?(0,a.jsxs)("g",{children:[(0,a.jsx)("polygon",{points:["132,"+(i-30),132+m+","+(i-30),132+l+","+i,"132,"+i].join(" "),fill:u?"var(--wa-critical)":"var(--wa-drop)",fillOpacity:u?.22:.13,stroke:u?"var(--wa-critical)":"none",strokeWidth:1.5*!!u}),null!==d&&d>0?(0,a.jsxs)("text",{x:142,y:i-15+4,className:"wa-drop-label"+(u?" wa-drop-worst":""),children:[u?"▼ biggest loss  ":"▼ ",s(d)," lost",null!==w?"  ·  "+c(w)+" carried through":""]}):null]}):null,(0,a.jsx)("text",{x:122,y:i+15+4,className:"wa-funnel-label",textAnchor:"end",children:t.label}),null===t.count?(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("rect",{x:132,y:i,width:Math.max(60,.18*x),height:30,rx:"4",fill:"url(#"+p+"-hatch)",stroke:"var(--wa-border)",strokeWidth:"1"}),(0,a.jsxs)("text",{x:132+Math.max(60,.18*x)+10,y:i+15+4,className:"wa-funnel-na",children:["not measured — ",t.unavailableReason??"no instrument for this site"]})]}):(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("rect",{x:132,y:i,width:l,height:30,rx:"4",fill:g(n,e.length),onMouseMove:e=>{let a=e.currentTarget.ownerSVGElement.getBoundingClientRect();h({x:e.clientX-a.left,y:e.clientY-a.top,title:t.label,rows:[{label:"Reached this stage",value:s(t.count)},{label:"Carried through from previous",value:null===w?"—":c(w)},{label:"Stuck here",value:null===t.stuckHere?"not measured":s(t.stuckHere),dim:null===t.stuckHere},{label:"Unmeasured at this stage",value:s(t.unmeasured),dim:!0},{label:t.definition,value:"",dim:!0}]})},onMouseLeave:()=>h(null)}),(0,a.jsxs)("text",{x:132+l+10,y:i+15+4,className:"wa-funnel-value",children:[s(t.count),M>0?(0,a.jsx)("tspan",{className:"wa-funnel-of",children:"  "+c(t.count/M)+" of published"}):null]}),t.unmeasured>0?(0,a.jsx)("rect",{x:132+l,y:i+30-5,width:Math.max(3,z(t.count+t.unmeasured)-l),height:5,fill:"url(#"+p+"-hatch2)",children:(0,a.jsxs)("title",{children:[s(t.unmeasured)," not yet measured at this stage"]})}):null]})]},t.id)})]}),(0,a.jsx)(y,{tip:u,width:l})]}),(0,a.jsx)(k,{items:[{label:"Articles reaching the stage",color:g(0,5)},{label:"Lost at this step",color:"var(--wa-drop)"},{label:"Not measured",color:"transparent",hatch:!0}],note:"log"===o?"Widths are log10. A log axis makes a catastrophic drop look gentle — switch to Linear to see the true proportion.":"step"===o?"Widths are each stage as a share of Internal Published.":"Widths are linear and true to proportion; late stages are legitimately slivers."})]})},"HeatmapChart",0,function({data:e,cellLabel:r}){let[n,i]=b(),[l,o]=(0,t.useState)(null),s=(0,t.useId)().replace(/[^a-zA-Z0-9]/g,""),c=Math.max(4,(i-132-8)/(e.xLabels.length||1)-2),w=22*e.yLabels.length+26,u=(0,t.useMemo)(()=>{let a=new Map;for(let t of e.cells)a.set(t.x+"\0"+t.y,t.value);return a},[e.cells]),h=(0,t.useMemo)(()=>
1{if("number"==typeof e.max)return e.max;let a=0;for(let t of e.cells)null!==t.value&&(a=Math.max(a,t.value));return a||1},[e]);return 0===i?(0,a.jsx)("div",{ref:n,className:"wa-chart-skel",style:{height:200}}):(0,a.jsxs)("div",{children:[(0,a.jsxs)("div",{ref:n,className:"wa-chart-host",children:[(0,a.jsxs)("svg",{width:i,height:w,role:"img","aria-label":"Heatmap",children:[(0,a.jsx)(j,{uid:s}),e.yLabels.map((t,n)=>(0,a.jsxs)("g",{children:[(0,a.jsx)("text",{x:124,y:22*n+10+4,className:"wa-heat-row",textAnchor:"end",children:t}),e.xLabels.map((i,l)=>{let d=u.get(i+"\0"+t),w=132+l*(c+2),x=22*n;if(null==d)return(0,a.jsx)("rect",{x:w,y:x,width:c,height:20,rx:"2",fill:"url(#"+s+"-hatch)",onMouseMove:e=>{let a=e.currentTarget.ownerSVGElement.getBoundingClientRect();o({x:e.clientX-a.left,y:e.clientY-a.top,title:t+" · "+i,rows:[{label:"Not measured",value:"",dim:!0}]})},onMouseLeave:()=>o(null)},i);let m=h>0?Math.min(1,d/h):0;return(0,a.jsx)("rect",{x:w,y:x,width:c,height:20,rx:"2",fill:"var(--wa-h"+(1+Math.min(5,Math.round(5*m)))+")",onMouseMove:a=>{let n=a.currentTarget.ownerSVGElement.getBoundingClientRect();o({x:a.clientX-n.left,y:a.clientY-n.top,title:t+" · "+i,rows:[{label:r??"Value",value:p(d,e.unit)}]})},onMouseLeave:()=>o(null)},i)})]},t)),e.xLabels.map((t,r)=>0===r||r===e.xLabels.length-1||r===Math.floor(e.xLabels.length/2)?(0,a.jsx)("text",{x:132+r*(c+2)+c/2,y:w-8,className:"wa-axis-tick",textAnchor:0===r?"start":r===e.xLabels.length-1?"end":"middle",children:t},"xl"+t):null)]}),(0,a.jsx)(y,{tip:l,width:i})]}),(0,a.jsxs)("div",{className:"wa-heat-legend",children:[(0,a.jsx)("span",{className:"wa-heat-scale-label",children:"0"}),[1,2,3,4,5,6].map(e=>(0,a.jsx)("span",{className:"wa-heat-chip",style:{background:"var(--wa-h"+e+")"}},e)),(0,a.jsx)("span",{className:"wa-heat-scale-label",children:d(h)}),(0,a.jsx)("span",{className:"wa-swatch wa-swatch-hatch"}),(0,a.jsx)("span",{className:"wa-heat-scale-label",children:"not measured"})]})]})},"HistogramChart",0,function({bins:e,unit:r,median:n,p90:i,censored:l,height:o=190}){let[d,w]=b(),[u,h]=(0,t.useState)(null),x=Math.max(10,w-46-12),m=Math.max(10,o-12-30),f=e.reduce((e,a)=>Math.max(e,a.count),0)||1,k=e.length?x/e.length*.82:0,j=e.reduce((e,a)=>e+a.count,0);if(0===w)return(0,a.jsx)("div",{ref:d,className:"wa-chart-skel",style:{height:o}});if(!e.length)return(0,a.jsx)(v,{reason:"No completed transitions in the selected window to build a distribution from."});let N=M(0,f,3),z=e=>12+m-e/Math.max(f,N[N.length-1])*m;return(0,a.jsxs)("div",{children:[(0,a.jsxs)("div",{ref:d,className:"wa-chart-host",children:[(0,a.jsxs)("svg",{width:w,height:o,role:"img","aria-label":"Distribution",children:[N.map(e=>(0,a.jsx)("line",{x1:46,y1:z(e),x2:46+x,y2:z(e),stroke:"var(--wa-grid)",strokeWidth:"1"},e)),e.map((t,r)=>{let n=46+r/e.length*x+(x/e.length-k)/2,i=z(t.count);return(0,a.jsxs)("g",{onMouseEnter:()=>h(r),onMouseLeave:()=>h(null),children:[(0,a.jsx)("rect",{x:n,y:i,width:k,height:Math.max(1,12+m-i),rx:"3",fill:g(r,e.length)}),(0,a.jsx)("text",{x:n+k/2,y:o-10,className:"wa-axis-tick",textAnchor:"middle",children:t.label})]},t.label)}),(0,a.jsx)("line",{x1:46,y1:12+m,x2:46+x,y2:12+m,stroke:"var(--wa-axis)",strokeWidth:"1"})]}),null!==u?(0,a.jsx)(y,{tip:{x:46+u/e.length*x+x/e.length/2,y:12+m/2,title:e[u].label,rows:[{label:"Articles",value:s(e[u].count)},{label:"Share of completed",value:j?c(e[u].count/j):"—"}]},width:w}):null]}),(0,a.jsxs)("div",{className:"wa-stat-row",children:[(0,a.jsxs)("span",{children:["Median ",(0,a.jsx)("strong",{children:p(n,r)})]}),(0,a.jsxs)("span",{children:["p90 ",(0,a.jsx)("strong",{children:p(i,r)})]}),(0,a.jsxs)("span",{className:"wa-stat-dim",children:[s(l)," still waiting — excluded from the median rather than counted as slow"]})]})]})},"LifecycleTimeline",0,function({steps:e}){let t=e.map(e=>e.at?new Date(e.at).getTime():null).filter(e=>null!==e&&!Number.isNaN(e)),r=t.length?Math.min(...t):null,n=t.length?Math.max(...t):null,i=null!==r&&null!==n?Math.max(1,n-r):1;return(0,a.jsx)("ol",{className:"wa-timeline",children:e.map(e=>{let t=e.at?new Date(e.at).getTime():null,n=null!==t&&null!==r?(t-r)/i*100:null,l="done"===e.state?"good":"failed"===e.state?"critical":"pending"===e.state?"warning":"neutral";return(0,a.jsxs)("li",{className:"wa-tl-step wa-tl-"+e.state,children:[(0,a.jsx)("span",{className:"wa-tl-dot",style:{background:"unmeasured"===e.state?"transparent":f(l)}}),(0,a.jsxs)("div",{className:"wa-tl-body",children:[(0,a.jsxs)("p",{className:"wa-tl-label",children:[e.label,(0,a.jsx)("span",{className:"wa-tl-when",children:"unmeasured"===e.state?"not measured":e.at?new Date(e.at).toLocaleStr
1ing():"pending"===e.state?"not yet":"—"})]}),e.detail?(0,a.jsx)("p",{className:"wa-tl-detail",children:e.detail}):null,null!==n?(0,a.jsx)("span",{className:"wa-tl-track",children:(0,a.jsx)("span",{className:"wa-tl-mark",style:{left:n+"%",background:f(l)}})}):null]})]},e.id)})})},"LineChart",0,function({series:e,height:r=220,unit:n,yFromZero:i=!0,markers:l}){let[o,s]=b(),[c,w]=(0,t.useState)(null),u=(0,t.useId)().replace(/[^a-zA-Z0-9]/g,""),g=(0,t.useMemo)(()=>{let a=new Set;for(let t of e)for(let e of t.points)a.add(e.date);return Array.from(a).sort()},[e]),N=n??e[0]?.unit??"count",z=Math.max(10,s-52-14),S=Math.max(10,r-12-26),{lo:T,hi:A}=(0,t.useMemo)(()=>{let a=1/0,t=-1/0;for(let r of e)for(let e of r.points)null!==e.value&&(a=Math.min(a,e.value),t=Math.max(t,e.value));return Number.isFinite(a)?(i&&(a=Math.min(0,a)),t===a&&(t=a+1),{lo:a,hi:t}):{lo:0,hi:1}},[e,i]),C=(0,t.useMemo)(()=>M(T,A,4),[T,A]),L=Math.min(T,C[0]),_=Math.max(A,C[C.length-1]),R=(0,t.useMemo)(()=>({padL:52,padT:12,plotW:z,plotH:S,x:e=>52+(g.length<=1?z/2:e/(g.length-1)*z),y:e=>12+S-(e-L)/(_-L||1)*S}),[g.length,z,S,L,_]),E=(0,t.useMemo)(()=>{let a=new Map;for(let t of e)for(let e of t.points){let r=a.get(e.date);r||(r=new Map,a.set(e.date,r)),r.set(t.id,e.value)}return a},[e]),F=(0,t.useMemo)(()=>{let a=null;for(let t of e)t.incompleteFrom&&(!a||t.incompleteFrom<a)&&(a=t.incompleteFrom);return a},[e]),W=F?g.findIndex(e=>e>=F):-1,I=(0,t.useMemo)(()=>e.some(e=>e.points.some(e=>null===e.value)),[e]);return 0===s?(0,a.jsx)("div",{ref:o,className:"wa-chart-skel",style:{height:r}}):0===g.length?(0,a.jsx)(v,{reason:"No days in the selected window returned any measurement."}):(0,a.jsxs)("div",{children:[(0,a.jsxs)("div",{ref:o,className:"wa-chart-host",children:[(0,a.jsxs)("svg",{width:s,height:r,role:"img","aria-label":e.map(e=>e.label).join(", ")+" over time",onMouseMove:e=>{let a=e.currentTarget.getBoundingClientRect();w(Math.min(Math.max(Math.round((e.clientX-a.left-52)/(z||1)*Math.max(1,g.length-1)),0),g.length-1))},onMouseLeave:()=>w(null),children:[(0,a.jsx)(j,{uid:u}),C.map(e=>(0,a.jsxs)("g",{children:[(0,a.jsx)("line",{x1:52,y1:R.y(e),x2:52+z,y2:R.y(e),stroke:"var(--wa-grid)",strokeWidth:"1"}),(0,a.jsx)("text",{x:44,y:R.y(e)+4,className:"wa-axis-tick",textAnchor:"end",children:"percent"===N||"ratio"===N?p(e,N):"usd"===N?100>Math.abs(e)?p(e,N):"$"+d(e):d(e)})]},"y"+e)),W>=0?(0,a.jsxs)("g",{children:[(0,a.jsx)("rect",{x:R.x(W),y:12,width:Math.max(2,52+z-R.x(W)),height:S,fill:"url(#"+u+"-hatch)",opacity:"0.6"}),(0,a.jsx)("text",{x:R.x(W)+4,y:23,className:"wa-axis-tick",children:"still accruing"})]}):null,l?.map(e=>{let t=g.indexOf(e.date);return t<0?null:(0,a.jsxs)("g",{children:[(0,a.jsx)("line",{x1:R.x(t),y1:12,x2:R.x(t),y2:12+S,stroke:f(e.tone??"neutral"),strokeWidth:"1.5",opacity:"0.75"}),(0,a.jsx)("text",{x:R.x(t)+5,y:12+S-5,className:"wa-marker-label",children:e.label})]},e.date+e.label)}),e.map((e,t)=>{let r,n=m(t),i=[],l=[];return g.forEach((a,t)=>{let r=E.get(a)?.get(e.id);null==r?(l.length&&i.push(l),l=[]):l.push({i:t,v:r})}),l.length&&i.push(l),(0,a.jsxs)("g",{children:[i.map((t,r)=>{let i=t.filter(a=>!x(g[a.i],e.incompleteFrom)),l=t.filter(a=>x(g[a.i],e.incompleteFrom)),o=l.length&&i.length?[i[i.length-1],...l]:l,s=e=>e.map((e,a)=>(0===a?"M":"L")+R.x(e.i)+" "+R.y(e.v)).join(" ");return(0,a.jsxs)("g",{children:[1===i.length?(0,a.jsx)("circle",{cx:R.x(i[0].i),cy:R.y(i[0].v),r:"3.5",fill:n}):null,i.length>1?(0,a.jsx)("path",{d:s(i),fill:"none",stroke:n,strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"}):null,o.length>1?(0,a.jsx)("path",{d:s(o),fill:"none",stroke:n,strokeWidth:"2",strokeDasharray:"4 3",strokeLinecap:"round"}):null]},r)}),null!==c?null==(r=E.get(g[c])?.get(e.id))?null:(0,a.jsx)("circle",{cx:R.x(c),cy:R.y(r),r:"4.5",fill:n,stroke:"var(--wa-surface-solid)",strokeWidth:"2"}):null]},e.id)}),null!==c?(0,a.jsx)("line",{x1:R.x(c),y1:12,x2:R.x(c),y2:12+S,stroke:"var(--wa-crosshair)",strokeWidth:"1"}):null,(0,a.jsx)("line",{x1:52,y1:12+S,x2:52+z,y2:12+S,stroke:"var(--wa-axis)",strokeWidth:"1"}),[0,Math.floor((g.length-1)/2),g.length-1].filter((e,a,t)=>t.indexOf(e)===a&&e>=0).map(e=>(0,a.jsx)("text",{x:R.x(e),y:r-8,className:"wa-axis-tick",textAnchor:0===e?"start":e===g.length-1?"end":"middle",children:h(g[e])},"x"+e))]}),null!==c?(0,a.jsx)(y,{tip:{x:R.x(c),y:12+S/2,title:h(g[c])+(x(g[c],F)?"  (incomplete)":""),rows:e.map((e,a)=>{let t=E.get(g[c])?.get(e.id);
1return{label:e.label,value:null==t?"not measured":p(t,e.unit),color:m(a),dim:null==t}})},width:s}):null]}),(0,a.jsx)(k,{items:[...e.map((e,a)=>({label:e.label,color:m(a)})),...W>=0?[{label:"Still accruing",color:"transparent",hatch:!0}]:[]],note:I?"Breaks in a line are days we did not measure — not days with zero.":null})]})},"Panel",0,function({title:e,subtitle:t,source:r,right:n,footnote:i,children:l,wide:o}){return(0,a.jsxs)("section",{className:"wa-panel"+(o?" wa-panel-wide":""),children:[(0,a.jsxs)("header",{className:"wa-panel-head",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("h3",{className:"wa-panel-title",children:e}),t?(0,a.jsx)("p",{className:"wa-panel-sub",children:t}):null]}),n?(0,a.jsx)("div",{className:"wa-panel-right",children:n}):null]}),(0,a.jsx)("div",{className:"wa-panel-body",children:l}),i?(0,a.jsx)("div",{className:"wa-panel-note",children:i}):null,r?(0,a.jsxs)("details",{className:"wa-datadetails",children:[(0,a.jsx)("summary",{children:"Data details"}),(0,a.jsxs)("p",{className:"wa-datadetails-src",children:["Source: ",r]})]}):null]})},"RankedBars",0,function({slices:e,unit:r="count",total:n,onSelect:i,maxRows:l=12,colorBy:o="single"}){let s=(0,t.useMemo)(()=>[...e].sort((e,a)=>a.value-e.value),[e]),d=s.slice(0,l),w=s.slice(l),u=w.length?[...d,{id:"__other",label:"Other ("+w.length+" more)",value:w.reduce((e,a)=>e+a.value,0)}]:d,h=u.reduce((e,a)=>Math.max(e,a.value),0)||1,x=n??u.reduce((e,a)=>e+a.value,0),[g,b]=(0,t.useState)(new Set);return u.length?(0,a.jsx)("ul",{className:"wa-ranked",children:u.map(e=>{let t=!!i&&!!e.drill,n=g.has(e.id),l="tone"===o?f(e.tone??"neutral"):m(0);return(0,a.jsx)("li",{className:"wa-ranked-row",children:(0,a.jsxs)("button",{type:"button",className:"wa-ranked-btn wa-ranked-click",onClick:()=>{t&&i?i(e):b(a=>{let t=new Set(a);return t.has(e.id)?t.delete(e.id):t.add(e.id),t})},children:[(0,a.jsx)("span",{className:"wa-ranked-label"+(n?" wa-ranked-label-expanded":""),title:e.label,children:e.label}),(0,a.jsx)("span",{className:"wa-ranked-track",children:(0,a.jsx)("span",{className:"wa-ranked-fill",style:{width:Math.max(1.5,e.value/h*100)+"%",background:l}})}),(0,a.jsxs)("span",{className:"wa-ranked-val",children:[p(e.value,r),x>0?(0,a.jsx)("em",{className:"wa-ranked-pct",children:c(e.value/x)}):null]})]})},e.id)})}):(0,a.jsx)(v,{reason:"Nothing to break down in the selected window."})},"StackedBarChart",0,function({series:e,height:r=220,normalize:n}){let[i,l]=b(),[o,w]=(0,t.useState)(null),u=(0,t.useId)().replace(/[^a-zA-Z0-9]/g,""),p=(0,t.useMemo)(()=>{let a=new Set;for(let t of e)for(let e of t.points)a.add(e.date);return Array.from(a).sort()},[e]),g=Math.max(10,l-52-14),f=Math.max(10,r-12-26),N=p.length?Math.max(1,g/p.length*.72):0,z=(0,t.useMemo)(()=>p.map(a=>{let t=[],r=!1;for(let n of e){let e=n.points.find(e=>e.date===a);e&&null!==e.value&&(r=!0,t.push({id:n.id,label:n.label,value:e.value}))}let n=t.reduce((e,a)=>e+a.value,0);return{date:a,parts:t,total:n,anyMeasured:r}}),[p,e]),S=z.reduce((e,a)=>Math.max(e,a.total),0),T=n?1:S||1,A=n?[0,.25,.5,.75,1]:M(0,S,4),C=e=>12+f-e/(n?1:Math.max(T,A[A.length-1]))*f,L=(0,t.useMemo)(()=>{let a=null;for(let t of e)t.incompleteFrom&&(!a||t.incompleteFrom<a)&&(a=t.incompleteFrom);return a},[e]);return 0===l?(0,a.jsx)("div",{ref:i,className:"wa-chart-skel",style:{height:r}}):p.length?(0,a.jsxs)("div",{children:[(0,a.jsxs)("div",{ref:i,className:"wa-chart-host",children:[(0,a.jsxs)("svg",{width:l,height:r,role:"img","aria-label":"Composition over time",children:[(0,a.jsx)(j,{uid:u}),A.map(e=>(0,a.jsxs)("g",{children:[(0,a.jsx)("line",{x1:52,y1:C(e),x2:52+g,y2:C(e),stroke:"var(--wa-grid)",strokeWidth:"1"}),(0,a.jsx)("text",{x:44,y:C(e)+4,className:"wa-axis-tick",textAnchor:"end",children:n?c(e,0):d(e)})]},"y"+e)),z.map((t,r)=>{let i=52+r/p.length*g+(g/p.length-N)/2;if(!t.anyMeasured)return(0,a.jsx)("rect",{x:i,y:12,width:N,height:f,fill:"url(#"+u+"-hatch)",opacity:"0.7",onMouseEnter:()=>w(r),onMouseLeave:()=>w(null),children:(0,a.jsxs)("title",{children:[t.date,": not measured"]})},t.date);let l=0,o=n&&t.total||1;return(0,a.jsxs)("g",{onMouseEnter:()=>w(r),onMouseLeave:()=>w(null),children:[t.parts.map(t=>{let r=t.value/o,n=C(l+r),s=C(l);l+=r;let d=Math.max(0,s-n-2),c=e.findIndex(e=>e.id===t.id);return(0,a.jsx)("rect",{x:i,y:n,width:N,height:d,fill:m(c<0?0:c),rx:1.5*(d>4)},t.id)}),x(t.date,L)?(0,a.jsx)("rect",{x:i,y:12,width:N,height:f,fill:"url(#"+u+"-hatch2)",opacity:"0.45"}):null]},t.date)}),(0,a.jsx)("line",{x1:52,y1:12+f,x2:52+g,y2:12+f,stroke:"var(--wa-axis)",strokeWidth:"1"}),[0,Math.floor((p.length-1)/2),p.length-1].filter((e,a,t)=>t.indexOf(e)===a&&e>=0).map(e=>(0,a.jsx)("text",{x:52+e/p.length*g+g/p.length/2,y:r-8,className:"wa-axis-tick",textAnchor:0===e?"start":e===p.length-1?"end":"middle",children:h(p[e])},"x"+e))]}),null!==o&&z[o]?(0,a.jsx)(y,{tip:{x:52+o/p.length*g+g/p.length/2,y:12+f/2,title:h(z[o].date)+(x(z[o].date,L)?"  (incomplete)":""),rows:z[o].anyMeasured?[...z[o].parts.map(a=>({label:a.label,value:s(a.value)+(z[o].total?"  "+c(a.value/z[o].total):""),color:m(Math.max(0,e.findIndex(e=>e.id===a.id)))}
1)),{label:"Total",value:s(z[o].total)}]:[{label:"Not measured",value:"",dim:!0}]},width:l}):null]}),(0,a.jsx)(k,{items:e.map((e,a)=>({label:e.label,color:m(a)}))})]}):(0,a.jsx)(v,{reason:"No days in the selected window returned any measurement."})},"ToneDot",0,function({tone:e}){return(0,a.jsx)("span",{className:"wa-tone wa-tone-"+e,"aria-hidden":"true",children:"good"===e?"✓":"critical"===e||"serious"===e||"warning"===e?"!":"·"})},"Unavailable",0,v,"seriesColor",0,m,"useScrollIntoViewOnChange",0,function(e){let a=(0,t.useRef)(null);return(0,t.useEffect)(()=>{e&&a.current&&a.current.scrollIntoView({behavior:"smooth",block:"start"})},[e]),a}],594898)},400235,e=>{"use strict";let a=`
2.wa-root {
3  /* ── surfaces & ink: matched to OwnerPortal, both now factlen's black/white
4        (packages/config/src/tokens/factlen.tokens.json) — owner directive
5        2026-09-11. Neutral grayscale only; the dataviz palette below (series,
6        ordinal, heat, status) is untouched — those are validated CVD-safe data
7        encodings, not decoration, and stay exactly as measured. ─────────── */
8  --wa-canvas: #0d1117;
9  --wa-canvas-2: #0d1117;
10  --wa-surface: rgba(255, 255, 255, 0.045);
11  --wa-surface-2: rgba(255, 255, 255, 0.075);
12  --wa-surface-solid: #161b22;
13  --wa-border: rgba(255, 255, 255, 0.09);
14  --wa-border-str: rgba(255, 255, 255, 0.18);
15  --wa-ink: #d4d4d4;
16  --wa-ink-2: #9a9a9a;
17  --wa-ink-muted: #6e7681;
18  --wa-grid: rgba(255, 255, 255, 0.07);
19  --wa-axis: rgba(255, 255, 255, 0.16);
20  --wa-crosshair: rgba(255, 255, 255, 0.30);
21  --wa-glow: 0 0 0 1px rgba(255,255,255,.05), 0 18px 48px -22px rgba(0,0,0,.9);
22
23  /* ── categorical series 1..8 (validated on surface #0c1220) ─────────── */
24  --wa-s1: #3987e5; --wa-s2: #d95926; --wa-s3: #199e70; --wa-s4: #c98500;
25  --wa-s5: #d55181; --wa-s6: #008300; --wa-s7: #9085e9; --wa-s8: #e66767;
26
27  /* ── ordinal ramp 1..5, light -> dark (funnel stages, buckets) ──────── */
28  --wa-o1: #cde2fb; --wa-o2: #9ec5f4; --wa-o3: #6da7ec; --wa-o4: #3987e5; --wa-o5: #256abf;
29
30  /* ── sequential heat 1..6. On a DARK surface the near-zero end is the
31        one closest to the surface, so the ramp runs dark -> light. ────── */
32  --wa-h1: #16294a; --wa-h2: #1c5cab; --wa-h3: #2a78d6;
33  --wa-h4: #5598e7; --wa-h5: #9ec5f4; --wa-h6: #cde2fb;
34
35  /* ── status: fixed, never themed, never reused as a series colour ───── */
36  --wa-good: #0ca30c;
37  --wa-warning: #fab219;
38  --wa-serious: #ec835a;
39  --wa-critical: #d03b3b;
40  --wa-drop: #e66767;
41
42  --wa-hatch-bg: rgba(255, 255, 255, 0.035);
43  --wa-hatch-ink: rgba(255, 255, 255, 0.16);
44
45  min-height: 100vh;
46  margin: 0;
47  padding: 0 0 96px;
48  color: var(--wa-ink);
49  background-color: var(--wa-canvas-2);
50  background-repeat: no-repeat;
51  font-family: -apple-system, "SF Pro Text", ui-sans-serif, system-ui, "Segoe UI", sans-serif;
52  -webkit-font-smoothing: antialiased;
53}
54@media (prefers-color-scheme: light) {
55  .wa-root {
56    --wa-canvas: #ffffff; --wa-canvas-2: #ffffff;
57    --wa-surface: rgba(16, 24, 40, 0.03); --wa-surface-2: #ffffff;
58    --wa-surface-solid: #ffffff;
59    --wa-border: #e6e6e6; --wa-border-str: rgba(16, 24, 40, 0.20);
60    --wa-ink: #161616; --wa-ink-2: #5a5a5a; --wa-ink-muted: #8a8a8a;
61    --wa-grid: rgba(16, 24, 40, 0.08);
62    --wa-axis: rgba(16, 24, 40, 0.22);
63    --wa-crosshair: rgba(16, 24, 40, 0.35);
64    --wa-glow: 0 0 0 1px rgba(16,24,40,.04), 0 18px 44px -26px rgba(16,24,40,.35);
65
66    --wa-s1: #2a78d6; --wa-s2: #eb6834; --wa-s3: #1baf7a; --wa-s4: #eda100;
67    --wa-s5: #e87ba4; --wa-s6: #008300; --wa-s7: #4a3aa7; --wa-s8: #e34948;
68
69    --wa-o1: #6da7ec; --wa-o2: #3987e5; --wa-o3: #256abf; --wa-o4: #184f95; --wa-o5: #0d366b;
70
71    --wa-h1: #e4eefc; --wa-h2: #b7d3f6; --wa-h3: #86b6ef;
72    --wa-h4: #3987e5; --wa-h5: #1c5cab; --wa-h6: #0d366b;
73
74    --wa-drop: #e34948;
75    --wa-hatch-bg: rgba(16, 24, 40, 0.03);
76    --wa-hatch-ink: rgba(16, 24, 40, 0.16);
77
78    background-color: var(--wa-canvas-2);
79  }
80}
81
82.wa-shell { max-width: 1280px; margin: 0 auto; padding: 0 clamp(16px, 3vw, 32px); }
83
84/* ── top bar ─────────────────────────────────────────────────────────── */
85.wa-bar {
86  position: sticky; top: 0; z-index: 30;
87  display: flex; align-items: center; justify-content: space-between; gap: 14px; flex-wrap: wrap;
88  padding: 14px 0 12px;
89  backdrop-filter: blur(18px) saturate(1.4); -webkit-backdrop-filter: blur(18px) saturate(1.4);
90  border-bottom: 1px solid var(--wa-border); margin-bottom: 18px;
91}
92.wa-who { display: flex; align-items: center; gap: 10px; font-size: .76rem; color: var(--wa-ink-muted); }
93.wa-title { font-size: 1rem; font-weight: 750; letter-spacing: -.015em; margin: 0; }
94.wa-title small { font-weight: 550; color: var(--wa-ink-muted); margin-left: 8px; font-size: .74rem; }
95.wa-title-btn {
96  font: inherit; font-size: inherit; font-weight: inherit; letter-spacing: inherit;
97  color: inherit; background: none; border: none; padding: 0; margin: 0; cursor: pointer;
98}
99.wa-title-btn:hover { text-decoration: underline; text-underline-offset: 3px; }
100
101.wa-btn {
102  font: inherit; font-size: .74rem; font-weight: 650;
103  padding: 6px 12px; border-radius: 999px; cursor: pointer;
104  background: var(--wa-surface-2); color: var(--wa-ink); border: 1px solid var(--wa-border);
105}
106.wa-btn:hover { border-color: var(--wa-border-str); }
107.wa-btn-quiet { background: transparent; color: var(--wa-ink-muted); }
108
109/* ── site / window pickers ───────────────────────────────────────────── */
110.wa-controls {
111  display: flex; align-items: center; gap: 10px; flex-wrap: wrap;
112  padding: 0 0 14px; margin-bottom: 18px; border-bottom: 1px solid var(--wa-border);
113}
114.wa-ctl-label {
115  font-size: .68rem; font-weight: 750; text-transform: uppercase; letter-spacing: .06em;
116  color: var(--wa-ink-muted); margin-right: 2px;
117}
118.wa-seg { display: inline-flex; gap: 2px; padding: 2px; border-radius: 999px; background: var(--wa-surface); border: 1px solid var(--wa-border); }
119.wa-seg-btn {
120  font: inherit; font-size: .73rem; font-weight: 650; letter-spacing: -.005em;
121  padding: 5px 11px; border-radius: 999px; border: none; cursor: pointer;
122  background: transparent; color: var(--wa-ink-2); white-space: nowrap;
123  display: inline-flex; align-items: center; gap: 6px;
124}
125.wa-seg-btn .wa-tone { width: 9px; height: 9px; margin-top: 0; font-size: 0; }
126.wa-seg-btn:hover { color: var(--wa-ink); }
127.wa-seg-on { background: var(--wa-s1); color: #fff; }
128.wa-seg-on:hover { color: #fff; }
129.wa-role {
130  font-size: .64rem; font-weight: 750; text-transform: uppercase; letter-spacing: .07em;
131  padding: 2px 7px; border-radius: 5px; border: 1px solid var(--wa-border-str); color: var(--wa-ink-muted);
132}
133
134/* ── section nav ─────────────────────────────────────────────────────── */
135.wa-secnav { display: flex; flex-wrap: wrap; gap: 5px; margin-bottom: 22px; }
136.wa-sectab {
137  font: inherit; font-size: .77rem; font-weight: 680; letter-spacing: -.005em;
138  padding: 7px 13px; border-radius: 999px; cursor: pointer;
139  background: transparent; color: var(--wa-ink-2); border: 1px solid transparent;
140}
141.wa-sectab:hover { background: var(--wa-surface-2); color: var(--wa-ink); }
142.wa-sectab-on { background: var(--wa-ink); color: var(--wa-canvas-2); }
143.wa-sectab-on:hover { background: var(--wa-ink); color: var(--wa-canvas-2); }
144
145/* ── layout ──────────────────────────────────────────────────────────── */
146.wa-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 16px; }
147@media (max-width: 900px) { .wa-grid { grid-template-columns: minmax(0, 1fr); } }
148.wa-panel-wide { grid-column: 1 / -1; }
149
150.wa-panel {
151  background: var(--wa-surface); border: 1px solid var(--wa-border); border-radius: 16px;
152  padding: 16px 18px 14px; box-shadow: var(--wa-glow); min-width: 0;
153}
154.wa-panel-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 12px; margin-bottom: 12px; }
155.wa-panel-title { margin: 0; font-size: .88rem; font-weight: 750; letter-spacing: -.012em; }
156.wa-panel-sub { margin: 3px 0 0; font-size: .74rem; color: var(--wa-ink-2); line-height: 1.45; max-width: 62ch; }
157.wa-panel-right { flex: 0 0 auto; }
158.wa-panel-body { min-width: 0; }
159.wa-panel-note { margin-top: 10px; font-size: .72rem; color: var(--wa-ink-2); line-height: 1.5; }
160.wa-panel-src {
161  margin-top: 10px; padding-top: 8px; border-top: 1px solid var(--wa-border);
162  font-size: .67rem; color: var(--wa-ink-muted);
163}
164
165/* ── per-panel "Data details" disclosure ────────────────────────────────
166   Closed by default. Holds exactly the provenance string the panel already
167   had (BigQuery view names, script names) so it stays available without
168   sitting in the always-visible copy of every chart on the page. */
169.wa-datadetails { margin-top: 10px; padding-top: 8px; border-top: 1px solid var(--wa-border); }
170.wa-datadetails summary {
171  cursor: pointer; font-size: .67rem; font-weight: 700; letter-spacing: .02em;
172  color: var(--wa-ink-muted); list-style: none;
173}
174.wa-datadetails summary::-webkit-details-marker { display: none; }
175.wa-datadetails summary::before { content: "▸ "; }
176.wa-datadetails[open] summary::before { content: "▾ "; }
177.wa-datadetails-src { margin: 6px 0 0; font-size: .67rem; color: var(--wa-ink-muted); font-family: ui-monospace, "SF Mono", Menlo, monospace; line-height: 1.5; word-break: break-word; }
178
179/* ── unavailable ─────────────────────────────────────────────────────── */
180.wa-unavail {
181  display: flex; gap: 10px; align-items: flex-start;
182  padding: 16px; border-radius: 12px;
183  border: 1px dashed var(--wa-border-str);
184  background: repeating-linear-gradient(45deg, transparent, transparent 5px, var(--wa-h
184atch-bg) 5px, var(--wa-hatch-bg) 10px);
185}
186.wa-unavail-compact { padding: 9px 11px; }
187.wa-unavail-badge { color: var(--wa-ink-muted); display: inline-flex; padding-top: 2px; }
188.wa-unavail-title { margin: 0; font-size: .74rem; font-weight: 750; color: var(--wa-ink-2); }
189.wa-unavail-why { margin: 3px 0 0; font-size: .74rem; color: var(--wa-ink-muted); line-height: 1.5; max-width: 68ch; }
190
191/* ── charts ──────────────────────────────────────────────────────────── */
192.wa-chart-host { position: relative; width: 100%; min-width: 0; }
193.wa-chart-skel { width: 100%; border-radius: 10px; background: var(--wa-surface-2); }
194.wa-axis-tick { fill: var(--wa-ink-muted); font-size: 10.5px; font-variant-numeric: tabular-nums; }
195.wa-marker-label { fill: var(--wa-ink-2); font-size: 10px; font-weight: 650; }
196
197.wa-legend { display: flex; flex-wrap: wrap; align-items: center; gap: 6px 14px; margin-top: 10px; font-size: .72rem; color: var(--wa-ink-2); }
198.wa-legend-item { display: inline-flex; align-items: center; gap: 6px; }
199.wa-legend-note { color: var(--wa-ink-muted); font-size: .69rem; line-height: 1.45; flex: 1 1 240px; min-width: 200px; }
200.wa-swatch { width: 10px; height: 10px; border-radius: 3px; display: inline-block; flex: none; }
201.wa-swatch-hatch {
202  background: repeating-linear-gradient(45deg, transparent, transparent 2px, var(--wa-hatch-ink) 2px, var(--wa-hatch-ink) 4px);
203  border: 1px solid var(--wa-border-str);
204}
205
206.wa-tip {
207  position: absolute; pointer-events: none; z-index: 5;
208  min-width: 150px; max-width: 280px;
209  background: var(--wa-surface-solid); border: 1px solid var(--wa-border-str); border-radius: 10px;
210  padding: 8px 10px; box-shadow: 0 14px 34px -16px rgba(0,0,0,.75);
211  font-size: .72rem; color: var(--wa-ink);
212}
213.wa-tip-title { margin: 0 0 5px; font-weight: 750; font-size: .72rem; }
214.wa-tip-row { margin: 2px 0; display: flex; align-items: center; gap: 6px; }
215.wa-tip-label { color: var(--wa-ink-2); flex: 1 1 auto; }
216.wa-tip-val { font-variant-numeric: tabular-nums; font-weight: 650; white-space: nowrap; }
217.wa-tip-dim { color: var(--wa-ink-muted); }
218
219/* ── funnel ──────────────────────────────────────────────────────────── */
220.wa-funnel-bar { display: flex; align-items: center; justify-content: space-between; gap: 12px; flex-wrap: wrap; margin-bottom: 10px; }
221.wa-funnel-scope { margin: 0; font-size: .74rem; color: var(--wa-ink-2); }
222.wa-funnel-label { fill: var(--wa-ink); font-size: 12px; font-weight: 680; }
223.wa-funnel-value { fill: var(--wa-ink); font-size: 12.5px; font-weight: 750; font-variant-numeric: tabular-nums; }
224.wa-funnel-of { fill: var(--wa-ink-muted); font-weight: 550; font-size: 11px; }
225.wa-funnel-na { fill: var(--wa-ink-muted); font-size: 11px; font-style: italic; }
226.wa-drop-label { fill: var(--wa-ink-2); font-size: 11px; font-weight: 620; font-variant-numeric: tabular-nums; }
227.wa-drop-worst { fill: var(--wa-critical); font-weight: 780; }
228
229/* ── facts strip ─────────────────────────────────────────────────────── */
230.wa-facts { display: grid; grid-template-columns: repeat(auto-fit, minmax(210px, 1fr)); gap: 14px; margin-bottom: 18px; }
231.wa-fact { background: var(--wa-surface); border: 1px solid var(--wa-border); border-radius: 14px; padding: 14px 16px; }
232.wa-fact-fig { margin: 0; font-size: 1.85rem; font-weight: 780; letter-spacing: -.03em; line-height: 1.05; }
233.wa-fact-good { color: var(--wa-good); }
234.wa-fact-warning { color: var(--wa-warning); }
235.wa-fact-serious { color: var(--wa-serious); }
236.wa-fact-critical { color: var(--wa-critical); }
237.wa-fact-neutral { color: var(--wa-ink); }
238.wa-fact-cap { margin: 5px 0 0; font-size: .78rem; color: var(--wa-ink-2); line-height: 1.45; }
239.wa-fact-foot { display: flex; align-items: center; justify-content: space-between; gap: 10px; margin-top: 10px; }
240.wa-delta { font-size: .7rem; font-weight: 700; font-variant-numeric: tabular-nums; }
241.wa-delta-good { color: var(--wa-good); }
242.wa-delta-bad { color: var(--wa-critical); }
243.wa-delta-none { color: var(--wa-ink-muted); font-weight: 550; }
244.wa-spark { display: block; }
245
246/* ── Overview's four owner-oriented areas ───────────────────────────────
247   Audience / Search Visibility / Crawl & Discovery / Technical & Data
248   Health. Plain section headers, not another panel — the panels underneath
249   already carry their own chrome. */
250.wa-area { margin: 26px 0 12px; }
251.wa-area:first-of-type { margin-top: 0; }
252.wa-area-title {
253  margin: 0 0 4px; font-size: .8rem; font-weight: 780; letter-spacing: .01em;
254  color: var(--wa-ink);
255  display: flex; align-items: baseline; gap: 8px;
256}
257.wa-area-q { font-weight: 550; color: var(--wa-ink-muted); font-size: .72rem; }
258.wa-area-sub { margin: 0 0 12px; font-size: .74rem; color: var(--wa-ink-2); line-height: 1.5; max-width: 90ch; }
259
260/* Compact "is it up / is it current" status strip — answers the owner's
261   questions 1 and 2 in one glance, from data already loaded for the site
262   picker (SiteRef.health / SiteRef.deploy) and the fetched window, so it
263   costs no extra request. */
264.wa-status-strip { display: flex; flex-wrap: wrap; gap: 10px 22px; margin-bottom: 20px; }
265.wa-status-item { display: flex; align-items: center; gap: 8px; font-size: .78rem; }
266.wa-status-item-label { color: var(--wa-ink-muted); }
267.wa-status-item-val { font-weight: 700; color: var(--wa-ink); }
268
269.wa-hero {
270  background: var(--wa-surface); border: 1px solid var(--wa-border); border-left: 3px solid var(--wa-critical);
271  border-radius: 14px; padding: 15px 18px; margin-bottom: 18px;
272}
273.wa-hero-eyebrow { margin: 0; font-size: .66rem; font-weight: 780; letter-spacing: .09em; text-transform: uppercase; color: var(--wa-critical); }
274.wa-hero-line { margin: 6px 0 0; font-size: 1.06rem; font-weight: 700; letter-spacing: -.018em; line-height: 1.4; }
275.wa-hero-sub { margin: 6px 0 0; font-size: .78rem; color: var(--wa-ink-2); line-height: 1.5; max-width: 90ch; }
276
277/* ── ranked bars ─────────────────────────────────────────────────────── */
278.wa-ranked { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 5px; }
279.wa-ranked-btn {
280  display: grid; grid-template-columns: minmax(90px, 34%) 1fr minmax(96px, auto);
281  align-items: center; gap: 10px; width: 100%;
282  font: inherit; text-align: left; background: transparent; border: none; padding: 3px 0; color: inherit;
283}
284.wa-ranked-click { cursor: pointer; border-radius: 7px; }
285.wa-ranked-click:hover { background: var(--wa-surface-2); }
286.wa-ranked-label { font-size: .76rem; color: var(--wa-ink); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
287.wa-ranked-label-expanded { overflow: visible; text-overflow: clip; white-space: normal; word-break: break-word; }
288.wa-ranked-track { height: 10px; border-radius: 3px; background: var(--wa-surface-2); overflow: hidden; }
289.wa-ranked-fill { display: block; height: 100%; border-radius: 3px; }
290.wa-ranked-val { font-size: .76rem; font-weight: 700; font-variant-numeric: tabular-nums; text-align: right; white-space: nowrap; }
291.wa-ranked-pct { color: var(--wa-ink-muted); font-weight: 550; font-style: normal; margin-left: 7px; }
292
293.wa-stat-row { display: flex; flex-wrap: wrap; gap: 6px 20px; margin-top: 10px; font-size: .73rem; color: var(--wa-ink-2); }
294.wa-stat-row strong { color: var(--wa-ink); font-variant-numeric: tabular-nums; }
295.wa-stat-dim { color: var(--wa-ink-muted); }
296
297/* ── heatmap ─────────────────────────────────────────────────────────── */
298.wa-heat-row { fill: var(--wa-ink-2); font-size: 11px; }
299.wa-heat-legend { display: flex; align-items: center; gap: 4px; margin-top: 10px; font-size: .68rem; color: var(--wa-ink-muted); }
300.wa-heat-chip { width: 20px; height: 10px; border-radius: 2px; display: inline-block; }
301.wa-heat-scale-label { margin: 0 6px; }
302
303/* ── timeline ────────────────────────────────────────────────────────── */
304.wa-timeline { list-style: none; margin: 0; padding: 0 0 0 4px; }
305.wa-tl-step { display: grid; grid-template-columns: 16px 1fr; gap: 10px; padding: 0 0 14px; position: relative; }
306.wa-tl-step::before {
307  content: ""; position: absolute; left: 7px; top: 14px; bottom: 0; width: 1px; background: var(--wa-border-str);
308}
309.wa-tl-step:last-child::before { display: none; }
310.wa-tl-dot {
311  width: 11px; height: 11px; border-radius: 50%; margin-top: 3px; border: 2px solid var(--wa-border-str);
312  box-sizing: border-box; z-index: 1;
313}
314.wa-tl-unmeasured .wa-tl-dot { border-style: dashed; }
315.wa-tl-label { margin: 0; font-size: .78rem; font-weight: 650; display: flex; gap: 10px; justify-content: space-between; flex-wrap: wrap; }
316.wa-tl-when { font-weight: 550; color: var(--wa-ink-muted); font-variant-numeric: tabular-nums; }
317.wa-tl-unmeasured .wa-tl-label { color: var(--wa-ink-muted); }
318.wa-tl-detail { margin: 2px 0 0; font-size: .72rem; color: var(--wa-ink-2); }
319.wa-tl-track { display: block; position: relative; height: 3px; border-radius: 2px; background: var(--wa-surface-2); margin-top: 7px; }
320.wa-tl-mark { position: absolute; top: -2px; width: 7px; height: 7px; border-radius: 50%; transform: translateX(-50%); }
321
322/* ── alerts ──────────────────────────────────────────────────────────── */
323.wa-alerts { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 9px; }
324.wa-alert {
325  display: grid; grid-template-columns: 20px 1fr; gap: 10px;
326  padding: 11px 13px; border-radius: 11px; background: var(--wa-surface-2); border: 1px solid var(--wa-border);
327}
328.wa-alert-critical { border-left: 3px solid var(--wa-critical); }
329.wa-alert-serious  { border-left: 3px solid var(--wa-serious); }
330.wa-alert-warning  { border-left: 3px solid var(--wa-warning); }
331.wa-alert-good     { border-left: 3px solid var(--wa-good); }
332.wa-alert-title { margin: 0; font-size: .79rem; font-weight: 720; }
333.wa-alert-detail { margin: 3px 0 0; font-size: .74rem; color: var(--wa-ink-2); line-height: 1.5; }
334.wa-alert-evi { margin: 5px 0 0; font-size: .71rem; color: var(--wa-ink-muted); font-variant-numeric: tabular-nums; }
335.wa-alert-link {
336  margin-top: 6px; font: inherit; font-size: .72rem; font-weight: 700; cursor: pointer;
337  background: none; border: none; padding: 0; color: var(--wa-s1); text-align: left;
338}
339.wa-tone {
340  width: 17px; height: 17px; border-radius: 50%; display: inline-flex; align-items: center; justify-content: center;
341  font-size: .64rem; font-weight: 900; color: #fff; margin-top: 2px;
342}
343.wa-tone-good { background: var(--wa-good); }
344.wa-tone-warning { background: var(--wa-warning); color: #241b00; }
345.wa-tone-serious { background: var(--wa-serious); color: #2b1000; }
346.wa-tone-critical { background: var(--wa-critical); }
347.wa-tone-neutral { background: var(--wa-ink-muted); }
348
349/* ── tables (only where row detail is genuinely the answer) ──────────── */
350.wa-tablewrap { overflow-x: auto; margin: 0 -4px; }
351.wa-table { width: 100%; border-collapse: collapse; font-size: .75rem; }
352.wa-table th {
353  text-align: left; font-weight: 700; color: var(--wa-ink-muted); font-size: .68rem;
354  text-transform: uppercase; letter-spacing: .05em; padding: 6px 10px; border-bottom: 1px solid var(--wa-border);
355  white-space: nowrap;
356}
357.wa-table td { padding: 7px 10px; border-bottom: 1px solid var(--wa-border); vertical-align: top; }
358.wa-table tbody tr:hover { background: var(--wa-surface-2); }
359.wa-num { text-align: right; font-variant-numeric: tabular-nums; white-space: nowrap; }
360.wa-linkbtn {
361  font: inherit; background: none; border: none; padding: 0; cursor: pointer; color: var(--wa-s1);
362  text-align: left; font-weight: 620;
363}
364.wa-linkbtn:hover { text-decoration: underline; }
365.wa-pill {
366  display: inline-block; font-size: .66rem; font-weight: 720; padding: 2px 7px; border-radius: 5px;
367  border: 1px solid var(--wa-border-str); color: var(--wa-ink-2); white-space: nowrap;
368}
369.wa-pill-indexed { border-color: var(--wa-good); color: var(--wa-good); }
370.wa-pill-crawled_not_indexed { border-color: var(--wa-serious); color: var(--wa-serious); }
371.wa-pill-discovered_not_indexed { border-color: var(--wa-critical); color: var(--wa-critical); }
372.wa-pill-unknown_to_google { border-color: var(--wa-border-str); color: var(--wa-ink-muted); }
373.wa-pill-error { border-color: var(--wa-critical); color: var(--wa-critical); }
374
375/* ── misc ────────────────────────────────────────────────────────────── */
376.wa-crumbs { display: flex; align-items: center; flex-wrap: wrap; gap: 4px; margin-bottom: 14px; font-size: .76rem; }
377.wa-crumb {
378  font: inherit; font-size: .76rem; font-weight: 650; background: none; border: none; cursor: pointer;
379  color: var(--wa-ink-2); padding: 4px 9px; border-radius: 999px;
380}
381.wa-crumb:hover { background: var(--wa-surface-2); color: var(--wa-ink); }
382.wa-crumb-now { color: var(--wa-ink); }
383.wa-crumb-sep { color: var(--wa-ink-muted); }
384.wa-warnstrip {
385  margin-bottom: 14px; padding: 9px 13px; border-radius: 10px;
386  border: 1px solid var(--wa-warning); background: rgba(250, 178, 25, 0.08);
387  font-size: .74rem; color: var(--wa-ink-2);
388}
389.wa-warnstrip ul { margin: 5px 0 0; padding-left: 18px; }
390.wa-muted { color: var(--wa-ink-muted); font-size: .78rem; }
391.wa-err {
392  border: 1px solid var(--wa-critical); background: rgba(208, 59, 59, 0.08);
393  padding: 13px 15px; border-radius: 11px; font-size: .78rem; color: var(--wa-ink);
394  line-height: 1.55;
395}
396.wa-err code { font-size: .72rem; color: var(--wa-ink-2); }
397.wa-search {
398  font: inherit; font-size: .76rem; padding: 6px 11px; border-radius: 999px;
399  border: 1px solid var(--wa-border); background: var(--wa-surface-2); color: var(--wa-ink); min-width: 190px;
400}
401.wa-filters { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; margin-bottom: 14px; }
402.wa-empty {
403  padding: 18px; border-radius: 12px; border: 1px dashed var(--wa-border);
404  font-size: .76rem; color: var(--wa-ink-muted); text-align: center;
405}
406/* RankedBars / LifecycleTimeline emit these wrappers; they only need to stop a
407   long label from forcing the grid wider than the panel. */
408.wa-ranked-row { min-width: 0; }
409.wa-tl-body { min-width: 0; }
410
411/* ── composed stacked rows (category \xd7 index state, stuck-by-age) ─────
412   A ranked list where each row is its OWN 100% stack, so the reader compares
413   MIX across rows and magnitude in the printed total. A grouped bar chart
414   would have made 7 states \xd7 40 categories unreadable. */
415.wa-stacklist { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 4px; }
416.wa-stackrow { min-width: 0; }
417.wa-stackrow-btn {
418  display: grid; grid-template-columns: minmax(96px, 30%) 1fr minmax(86px, auto);
419  align-items: center; gap: 12px; width: 100%; text-align: left;
420  font: inherit; background: none; border: none; padding: 5px 7px; border-radius: 7px; color: inherit;
421}
422.wa-stackrow-click { cursor: pointer; }
423.wa-stackrow-click:hover { background: var(--wa-surface-2); }
424.wa-stackrow-click:focus-visible { outline: 2px solid var(--wa-s1); outline-offset: 1px; }
425.wa-stackrow-label { font-size: .76rem; color: var(--wa-ink); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
426.wa-stackrow-bar {
427  display: flex; height: 12px; border-radius: 3px; overflow: hidden;
428  background: var(--wa-surface-2); min-width: 0;
429}
430.wa-stackrow-seg { display: block; height: 100%; }
431.wa-stackrow-seg-hatch {
432  background: repeating-linear-gradient(45deg, transparent, transparent 2px, var(--wa-hatch-ink) 2px, var(--wa-hatch-ink) 4px);
433}
434.wa-stackrow-val { font-size: .76rem; font-weight: 700; font-variant-numeric: tabular-nums; text-align: right; white-space: nowrap; }
435.wa-stackrow-na { font-size: .72rem; color: var(--wa-ink-muted); font-style: italic; }
436
437/* ── article drill-down ──────────────────────────────────────────────── */
438/* scroll-margin-top must clear the sticky .wa-bar, which is NOT a fixed
439   height: .wa-bar has flex-wrap and the title row grows a second line (date
440   range under the "Website Analytics" label, "who" chip wrapping under it)
441   on narrow viewports. 72px only covered the single-line case, so
442   useScrollIntoViewOnChange's scrollIntoView({block:"start"}) landed the
443   detail panel's own heading partly UNDER the stuck bar on mobile — the
444   textbook "sticky header overlapping content" bug. 148px clears the bar's
445   worst-case two-line height plus its border/margin with room to spare. */
446.wa-detail { margin-top: 18px; scroll-margin-top: 148px; }
447.wa-detail-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 14px; flex-wrap: wrap; margin-bottom: 4px; }
448.wa-detail-title { margin: 0; font-size: .95rem; font-weight: 750; letter-spacing: -.015em; line-height: 1.35; max-width: 70ch; }
449.wa-detail-url { margin: 4px 0 0; font-size: .72rem; }
450.wa-detail-url a { color: var(--wa-s1); }
451
452/* ── definition list (cohort roster, sitemap shards summary) ─────────── */
453.wa-deflist { margin: 0; display: grid; grid-template-columns: auto 1fr; gap: 6px 14px; font-size: .75rem; }
454.wa-deflist dt { color: var(--wa-ink-muted); white-space: nowrap; }
455.wa-deflist dd { margin: 0; color: var(--wa-ink); }
456
457/* ── estate view: one tile per site, worst-signal headline + dimension dots ─
458   The landing state before a site is chosen. One dominant status color per
459   tile (the left accent + a tinted headline row) so the worst problem reads
460   before any text does; the six small dots underneath are the breakdown for
461   when the headline alone is not enough. ─────────────────────────────────── */
462.wa-estate { margin-bottom: 8px; }
463.wa-estate-summary { margin-bottom: 18px; }
464.wa-estate-summary-line {
465  margin: 0; font-size: .92rem; font-weight: 700;
466  display: flex; flex-wrap: wrap; align-items: center; gap: 6px 10px;
467}
468.wa-estate-count { font-size: .74rem; font-weight: 750; padding: 3px 10px; border-radius: 999px; }
469.wa-estate-count-critical { background: rgba(208, 59, 59, 0.14); color: var(--wa-critical); }
470.wa-estate-count-serious { background: rgba(236, 131, 90, 0.14);
470 color: var(--wa-serious); }
471.wa-estate-count-warning { background: rgba(250, 178, 25, 0.14); color: var(--wa-warning); }
472.wa-estate-count-good { background: rgba(12, 163, 12, 0.14); color: var(--wa-good); }
473.wa-estate-count-neutral { background: var(--wa-surface-2); color: var(--wa-ink-muted); }
474.wa-estate-summary-sub { margin: 6px 0 0; font-size: .74rem; color: var(--wa-ink-2); line-height: 1.5; max-width: 92ch; }
475
476.wa-estate-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(264px, 1fr)); gap: 14px; }
477.wa-estate-tile {
478  display: block; width: 100%; text-align: left; font: inherit; cursor: pointer; color: inherit;
479  background: var(--wa-surface); border: 1px solid var(--wa-border); border-left: 4px solid var(--wa-ink-muted);
480  border-radius: 14px; padding: 14px 16px 12px; box-shadow: var(--wa-glow);
481}
482.wa-estate-tile:hover { border-color: var(--wa-border-str); background: var(--wa-surface-2); }
483.wa-estate-tile:focus-visible { outline: 2px solid var(--wa-s1); outline-offset: 2px; }
484.wa-estate-good { border-left-color: var(--wa-good); }
485.wa-estate-warning { border-left-color: var(--wa-warning); }
486.wa-estate-serious { border-left-color: var(--wa-serious); }
487.wa-estate-critical { border-left-color: var(--wa-critical); }
488.wa-estate-neutral { border-left-color: var(--wa-ink-muted); }
489
490.wa-estate-tile-head { display: flex; align-items: center; justify-content: space-between; gap: 8px; margin-bottom: 7px; }
491.wa-estate-name { font-size: .88rem; font-weight: 750; letter-spacing: -.01em; }
492.wa-estate-headline { margin: 0; display: flex; align-items: center; gap: 7px; font-size: .84rem; font-weight: 720; }
493.wa-estate-reason { margin: 5px 0 11px; font-size: .72rem; color: var(--wa-ink-2); line-height: 1.45; min-height: 2.6em; }
494.wa-estate-dots { display: flex; flex-wrap: wrap; gap: 6px 11px; padding-top: 9px; border-top: 1px solid var(--wa-border); }
495.wa-estate-dim { display: inline-flex; align-items: center; gap: 4px; font-size: .64rem; color: var(--wa-ink-muted); }
496.wa-estate-dim .wa-tone { width: 10px; height: 10px; font-size: 0; margin-top: 0; }
497.wa-estate-dim-label { white-space: nowrap; }
498
499/* ── gate ────────────────────────────────────────────────────────────── */
500.wa-gate {
501  min-height: 100vh; display: flex; align-items: center; justify-content: center; padding: 32px;
502  background: var(--wa-canvas-2); color: var(--wa-ink);
503  font-family: -apple-system, ui-sans-serif, system-ui, "Segoe UI", sans-serif;
504}
505.wa-gate-card {
506  max-width: 380px; width: 100%; text-align: center;
507  border: 1px solid var(--wa-border); border-radius: 16px; padding: 28px; background: var(--wa-surface);
508}
509.wa-gate-card h1 { margin: 0 0 8px; font-size: 1.05rem; font-weight: 760; letter-spacing: -.02em; }
510.wa-gate-card p { margin: 0 0 16px; font-size: .8rem; color: var(--wa-ink-2); line-height: 1.5; }
511
512@media (prefers-reduced-motion: reduce) {
513  .wa-root * { transition: none !important; animation: none !important; }
514}
515`;e.s(["WEBSITE_ANALYTICS_CSS",0,a])}]);

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.