awesome-speedometer-gauge 0.1.1 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cjs/index.js
CHANGED
|
@@ -1,2 +1,72 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const n=require("react/jsx-runtime"),m=require("react"),je="_gaugeCard_6w996_1",Ae="_light_6w996_58",pe="_dark_6w996_67",be="_purple_6w996_77",_e="_header_6w996_95",we="_title_6w996_102",Me="_subtitle_6w996_108",ke="_meta_6w996_114",$e="_units_6w996_124",Ne="_body_6w996_130",Re="_gaugeStage_6w996_138",ze="_state_6w996_143",Se="_flash_6w996_149",p={gaugeCard:je,light:Ae,dark:pe,purple:be,header:_e,title:we,subtitle:Me,meta:ke,units:$e,body:Ne,gaugeStage:Re,state:ze,flash:Se,"gauge-flash":"_gauge-flash_6w996_1","gauge-value":"_gauge-value_6w996_170","gauge-ticks":"_gauge-ticks_6w996_174"},k=(e,t,a,o)=>{const r=(o-90)*(Math.PI/180);return{x:e+a*Math.cos(r),y:t+a*Math.sin(r)}},ee=(e,t,a,o,r)=>{const l=k(e,t,a,r),d=k(e,t,a,o),x=Math.abs(r-o)<=180?"0":"1";return["M",l.x,l.y,"A",a,a,0,x,0,d.x,d.y].join(" ")};function Te({cx:e,cy:t,radius:a,startAngle:o,endAngle:r,color:l,thickness:d}){const x=ee(e,t,a,o,r);return n.jsx("path",{d:x,fill:"none",stroke:l,strokeWidth:d,strokeLinecap:"round"})}const F=m.memo(Te);function Ve({cx:e,cy:t,radius:a,angle:o,color:r,width:l=3}){const d=k(e,t,a,o),x=k(e,t,10,o-90),f=k(e,t,10,o+90);return n.jsxs("g",{className:"gauge-needle","aria-hidden":"true",children:[n.jsx("path",{d:`M ${x.x} ${x.y} L ${d.x} ${d.y} L ${f.x} ${f.y} Z`,fill:r}),n.jsx("circle",{cx:e,cy:t,r:l*2,fill:r})]})}const de=m.memo(Ve);function Fe({ticks:e,color:t,labelColor:a,showLabels:o}){return n.jsx("g",{className:"gauge-ticks","aria-hidden":"true",children:e.map(r=>n.jsxs("g",{children:[n.jsx("line",{x1:r.outer.x,y1:r.outer.y,x2:r.inner.x,y2:r.inner.y,stroke:t,strokeWidth:"2"}),o&&n.jsx("text",{x:r.label.x,y:r.label.y,textAnchor:"middle",dominantBaseline:"middle",fill:a,fontSize:"10",children:Math.round(r.value)})]},r.value))})}const he=m.memo(Fe);function Ce({cx:e,cy:t,value:a,target:o,units:r,showTarget:l}){return n.jsxs("g",{className:"gauge-value","aria-hidden":"true",children:[n.jsxs("text",{x:e,y:t,textAnchor:"middle",dominantBaseline:"middle",fontSize:"20",children:[a,r?` ${r}`:""]}),l&&typeof o=="number"&&n.jsxs("text",{x:e,y:t+22,textAnchor:"middle",dominantBaseline:"middle",fontSize:"11",children:["Target ",o]})]})}const D=m.memo(Ce);function Ge({cx:e,cy:t,radius:a,angle:o,color:r}){const l=k(e,t,a,o);return n.jsx("circle",{cx:l.x,cy:l.y,r:"3",fill:r})}const te=m.memo(Ge),se=(e,t,a)=>Math.min(Math.max(e,t),a),me=(e,t,a)=>e+(t-e)*a,xe=(e,t,a)=>a===t?0:(e-t)/(a-t),R=(e,t,a,o,r)=>{const l=se(e,t,a),d=xe(l,t,a);return me(o,r,d)},Le=(e,t,a)=>{if(!Array.isArray(t)||t.length===0)return a;const o=[...t].filter(l=>typeof(l==null?void 0:l.value)=="number").sort((l,d)=>l.value-d.value),r=o.find(l=>e<=l.value)||o[o.length-1];return(r==null?void 0:r.color)||a},fe=(e,t,a)=>!Array.isArray(e)||e.length===0?[{value:t+(a-t)*.6,color:"var(--gauge-range-poor)"},{value:t+(a-t)*.8,color:"var(--gauge-range-warning)"},{value:a,color:"var(--gauge-range-good)"}]:e.map(o=>({value:typeof o.value=="number"?o.value:a,color:o.color||"var(--gauge-range-good)",label:o.label||""}));function I({value:e,min:t,max:a,startAngle:o,endAngle:r,size:l,thickness:d,thresholds:x,tickCount:f=5,arcPadding:y=0}){return m.useMemo(()=>{const c=Number.isFinite(t)?t:0,s=Number.isFinite(a)?a:100,g=Number.isFinite(e)?e:c,u=se(g,c,s),v=Number.isFinite(o)?o:-90,j=Number.isFinite(r)?r:90,$=Number.isFinite(l)?l:200,z=Number.isFinite(d)?d:18,b=$/2,_=$/2,N=$/2,C=N-z,G=(N+C)/2,L=R(u,c,s,v,j),O=fe(x,c,s);let P=c;const K=O.map(S=>{const w=P,M=S.value;return P=M,{...S,startValue:w,endValue:M,startAngle:R(w,c,s,v,j),endAngle:R(M,c,s,v,j)}}),W=f>1?(s-c)/(f-1):0,B=Array.from({length:f},(S,w)=>{const M=c+W*w,i=R(M,c,s,v,j),Q=k(b,_,N-y,i),U=k(b,_,N-y-10,i),X=k(b,_,C-18,i);return{value:M,angle:i,outer:Q,inner:U,label:X}}),Z=ee(b,_,G,v,j),H=xe(u,c,s),E=R(u,c,s,v,j),J=ee(b,_,G,v,E);return{cx:b,cy:_,outerRadius:N,innerRadius:C,midRadius:G,value:u,valueAngle:L,startAngle:v,endAngle:j,arcPath:Z,progressPath:J,progressAngle:E,valueProgress:H,ranges:K,ticks:B,size:$,thickness:z}},[e,t,a,o,r,l,d,x,f,y])}function Pe({value:e,min:t,max:a,startAngle:o,endAngle:r,size:l,thickness:d,thresholds:x,showTicks:f,showValue:y,showTarget:c,target:s,units:g}){const u=I({value:e,min:t,max:a,startAngle:o,endAngle:r,size:l,thickness:d,thresholds:x,tickCount:6,arcPadding:2}),v=typeof s=="number"?R(s,u.min,u.max,u.startAngle,u.endAngle):null;return n.jsxs("svg",{width:u.size,height:u.size,viewBox:`0 0 ${u.size} ${u.size}`,children:[n.jsx("g",{className:"gauge-ranges",children:u.ranges.map(j=>n.jsx(F,{cx:u.cx,cy:u.cy,radius:u.midRadius,startAngle:j.startAngle,endAngle:j.endAngle,color:j.color,thickness:u.thickness},j.endValue))}),f&&n.jsx(he,{ticks:u.ticks,color:"var(--gauge-tick)",labelColor:"var(--gauge-text-muted)",showLabels:!0}),typeof v=="number"&&c&&n.jsx(te,{cx:u.cx,cy:u.cy,radius:u.outerRadius-4,angle:v,color:"var(--gauge-target)"}),n.jsx(de,{cx:u.cx,cy:u.cy,radius:u.innerRadius-4,angle:u.valueAngle,color:"var(--gauge-needle)"}),y&&n.jsx(D,{cx:u.cx,cy:u.cy+28,value:Math.round(u.value),target:s,units:g,showTarget:c})]})}const Be=m.memo(Pe);function Ee({value:e,min:t,max:a,startAngle:o,endAngle:r,size:l,thickness:d,thresholds:x,showTicks:f,showValue:y,units:c}){const s=I({value:e,min:t,max:a,startAngle:o,endAngle:r,size:l,thickness:d,thresholds:x,tickCount:4,arcPadding:4});return n.jsxs("svg",{width:s.size,height:s.size/1.2,viewBox:`0 0 ${s.size} ${s.size}`,children:[n.jsx("g",{className:"gauge-ranges",children:s.ranges.map(g=>n.jsx(F,{cx:s.cx,cy:s.cy,radius:s.midRadius,startAngle:g.startAngle,endAngle:g.endAngle,color:g.color,thickness:s.thickness},g.endValue))}),f&&n.jsx(he,{ticks:s.ticks,color:"var(--gauge-tick)",labelColor:"var(--gauge-text-muted)",showLabels:!1}),y&&n.jsx(D,{cx:s.cx,cy:s.cy+14,value:Math.round(s.value),units:c,showTarget:!1})]})}const qe=m.memo(Ee);function De({value:e,min:t,max:a,startAngle:o,endAngle:r,size:l,thickness:d,thresholds:x,showValue:f,units:y}){const c=I({value:e,min:t,max:a,startAngle:o,endAngle:r,size:l,thickness:d,thresholds:x,tickCount:8,arcPadding:0});return n.jsxs("svg",{width:c.size,height:c.size,viewBox:`0 0 ${c.size} ${c.size}`,children:[n.jsx("g",{className:"gauge-ranges",children:c.ranges.map(s=>n.jsx(F,{cx:c.cx,cy:c.cy,radius:c.midRadius,startAngle:s.startAngle,endAngle:s.endAngle,color:s.color,thickness:c.thickness},s.endValue))}),n.jsx(de,{cx:c.cx,cy:c.cy,radius:c.innerRadius-2,angle:c.valueAngle,color:"var(--gauge-needle)"}),f&&n.jsx(D,{cx:c.cx,cy:c.cy+24,value:Math.round(c.value),units:y,showTarget:!1})]})}const Ie=m.memo(De);function Oe({value:e,min:t,max:a,startAngle:o,endAngle:r,size:l,thickness:d,thresholds:x,showValue:f,units:y,gradientId:c}){const s=I({value:e,min:t,max:a,startAngle:o,endAngle:r,size:l,thickness:d,thresholds:x,tickCount:0,arcPadding:0});return n.jsxs("svg",{width:s.size,height:s.size,viewBox:`0 0 ${s.size} ${s.size}`,children:[c&&n.jsx("defs",{children:n.jsxs("linearGradient",{id:c,x1:"0%",y1:"0%",x2:"100%",y2:"0%",children:[n.jsx("stop",{offset:"0%",stopColor:"var(--gauge-range-poor)"}),n.jsx("stop",{offset:"55%",stopColor:"var(--gauge-range-warning)"}),n.jsx("stop",{offset:"100%",stopColor:"var(--gauge-range-good)"})]})}),n.jsx(F,{cx:s.cx,cy:s.cy,radius:s.midRadius,startAngle:s.startAngle,endAngle:s.endAngle,color:"var(--gauge-track)",thickness:s.thickness}),n.jsx(F,{cx:s.cx,cy:s.cy,radius:s.midRadius,startAngle:s.startAngle,endAngle:s.progressAngle,color:c?`url(#${c})`:"var(--gauge-progress)",thickness:s.thickness}),f&&n.jsx(D,{cx:s.cx,cy:s.cy+8,value:Math.round(s.value),units:y,showTarget:!1})]})}const Ke=m.memo(Oe);function We({value:e,min:t,max:a,startAngle:o,endAngle:r,size:l,thickness:d,thresholds:x,showValue:f,units:y,target:c,showTarget:s}){const g=I({value:e,min:t,max:a,startAngle:o,endAngle:r,size:l,thickness:d,thresholds:x,tickCount:0,arcPadding:0}),u=typeof c=="number"?R(c,g.min,g.max,g.startAngle,g.endAngle):null;return n.jsxs("svg",{width:g.size,height:g.size,viewBox:`0 0 ${g.size} ${g.size}`,children:[n.jsx("g",{className:"gauge-ranges",children:g.ranges.map(v=>n.jsx(F,{cx:g.cx,cy:g.cy,radius:g.midRadius,startAngle:v.startAngle,endAngle:v.endAngle,color:v.color,thickness:g.thickness},v.endValue))}),n.jsx(te,{cx:g.cx,cy:g.cy,radius:g.outerRadius-4,angle:g.valueAngle,color:"var(--gauge-needle)"}),s&&typeof u=="number"&&n.jsx(te,{cx:g.cx,cy:g.cy,radius:g.outerRadius-4,angle:u,color:"var(--gauge-target)"}),f&&n.jsx(D,{cx:g.cx,cy:g.cy+8,value:Math.round(g.value),units:y,target:c,showTarget:s})]})}const Ze=m.memo(We),ie=()=>typeof performance<"u"?performance.now():Date.now();function He(e,{enabled:t,duration:a=500,easing:o}={}){const r=m.useRef(null),l=m.useRef(0),d=m.useRef(e),[x,f]=m.useState(e);return m.useEffect(()=>{if(!t)return f(e),d.current=e,()=>{};const y=d.current,c=ie();l.current=c;const s=typeof o=="function"?o:u=>1-Math.pow(1-u,3),g=()=>{const u=Math.min(1,(ie()-c)/a),v=me(y,e,s(u));f(v),u<1?r.current=requestAnimationFrame(g):d.current=e};return r.current=requestAnimationFrame(g),()=>{r.current&&cancelAnimationFrame(r.current)}},[e,t,a,o]),x}const Je=(...e)=>e.filter(Boolean).join(" "),Qe=null,ue={standard:{start:-90,end:90},semicircle:{start:-110,end:110},full:{start:0,end:360},arc:{start:-225,end:45},multiband:{start:-120,end:120}},ge=e=>e?Array.isArray(e)?e[0]||null:Array.isArray(e.data)?e.data[0]||null:typeof e=="object"?e:null:null,A=(e,t)=>e!==void 0?e:t,Ue=(e,t,a,o)=>{const r=fe(t,a,o);for(let l=0;l<r.length;l+=1)if(e<=r[l].value)return l;return r.length-1};function Xe({type:e="standard",value:t,min:a,max:o,target:r,thresholds:l,showTicks:d=!0,showValue:x=!0,showTarget:f=!1,animated:y=!0,realtime:c=!1,size:s=220,thickness:g=18,startAngle:u,endAngle:v,units:j="",data:$=Qe,apiEndpoint:z="/gauge-data.json",title:b="KPI Gauge",subtitle:_="",theme:N="light",className:C,style:G,onClick:L}){const[O,P]=m.useState(null),[K,W]=m.useState(!1),[B,Z]=m.useState(""),[H,E]=m.useState(!1),[J,S]=m.useState(!1),w=m.useRef(null),M=m.useCallback(async()=>{if(z){W(!0),Z("");try{const h=await fetch(z);if(!h.ok)throw new Error(`Request failed: ${h.status}`);const V=await h.json();P(ge(V))}catch(h){Z("Failed to load gauge data."),console.error("Failed to load gauge data",h)}finally{W(!1)}}},[z]);m.useEffect(()=>{if($){P(ge($));return}M()},[$,M]);const i=m.useMemo(()=>{const h=O||{},V=String(e||h.type||"standard").toLowerCase(),ne=ue[V]||ue.standard,ae=A(a,h.min),re=A(o,h.max),Y=Number.isFinite(ae)?ae:0,oe=Number.isFinite(re)?re:100,ce=A(t,h.value),ve=Number.isFinite(ce)?ce:Y,le=A(r,h.target),ye=Number.isFinite(le)?le:null;return{type:V,value:se(ve,Y,oe),min:Y,max:oe,target:ye,thresholds:A(l,h.thresholds),showTicks:A(d,h.showTicks??d),showValue:A(x,h.showValue??x),showTarget:A(f,h.showTarget??f),size:A(s,h.size??s),thickness:A(g,h.thickness??g),units:A(j,h.units??j),startAngle:A(u,h.startAngle??ne.start),endAngle:A(v,h.endAngle??ne.end)}},[O,e,a,o,t,r,l,d,x,f,s,g,j,u,v]),Q=He(i.value,{enabled:y||c,duration:c?220:500});m.useEffect(()=>{if(!c)return;const h=Ue(i.value,i.thresholds,i.min,i.max);if(w.current===null){w.current=h;return}if(w.current!==h){w.current=h,E(!0);const V=setTimeout(()=>E(!1),300);return()=>clearTimeout(V)}},[c,i.value,i.thresholds,i.min,i.max]);const U=Le(i.value,i.thresholds,"var(--gauge-range-good)"),X=m.useMemo(()=>{const h=[`Value: ${Math.round(i.value)}${i.units?` ${i.units}`:""}`,`Min: ${i.min}`,`Max: ${i.max}`];return typeof i.target=="number"&&h.splice(1,0,`Target: ${i.target}`),h.join(" • ")},[i.value,i.units,i.min,i.max,i.target]),q={value:Q,min:i.min,max:i.max,startAngle:i.startAngle,endAngle:i.endAngle,size:i.size,thickness:i.thickness,thresholds:i.thresholds,showTicks:i.showTicks,showValue:i.showValue,showTarget:i.showTarget,target:i.target,units:i.units},T=i.type;return n.jsxs("section",{className:Je(p.gaugeCard,p[N],H&&p.flash,C),style:{...G,"--gauge-active":U},onClick:()=>L==null?void 0:L(i.value),onMouseEnter:()=>S(!0),onMouseLeave:()=>S(!1),role:"figure","aria-label":b,"data-tooltip":X,"data-tooltip-open":J?"true":"false",children:[n.jsxs("header",{className:p.header,children:[n.jsxs("div",{children:[n.jsx("div",{className:p.title,children:b}),_&&n.jsx("div",{className:p.subtitle,children:_})]}),n.jsxs("div",{className:p.meta,children:[n.jsx("span",{children:Math.round(i.value)}),i.units&&n.jsx("span",{className:p.units,children:i.units})]})]}),n.jsxs("div",{className:p.body,children:[K&&n.jsx("div",{className:p.state,children:"Loading KPI..."}),B&&n.jsx("div",{className:p.state,children:B}),!K&&!B&&n.jsxs("div",{className:p.gaugeStage,children:[T==="semicircle"&&n.jsx(qe,{...q}),T==="full"&&n.jsx(Ie,{...q}),T==="arc"&&n.jsx(Ke,{...q,gradientId:"gaugeGradient"}),T==="multiband"&&n.jsx(Ze,{...q}),(T==="standard"||!T)&&n.jsx(Be,{...q})]})]})]})}exports.AwesomeSpeedometerGauge=Xe;
|
|
1
|
+
"use strict";const s=require("react/jsx-runtime"),m=require("react"),z=(e,t,n,o)=>{const r=(o-90)*(Math.PI/180);return{x:e+n*Math.cos(r),y:t+n*Math.sin(r)}},ee=(e,t,n,o,r)=>{const i=z(e,t,n,r),f=z(e,t,n,o),h=Math.abs(r-o)<=180?"0":"1";return["M",i.x,i.y,"A",n,n,0,h,0,f.x,f.y].join(" ")};function he({cx:e,cy:t,radius:n,startAngle:o,endAngle:r,color:i,thickness:f}){const h=ee(e,t,n,o,r);return s.jsx("path",{d:h,fill:"none",stroke:i,strokeWidth:f,strokeLinecap:"round"})}const C=m.memo(he);function pe({cx:e,cy:t,radius:n,angle:o,color:r,width:i=3}){const f=z(e,t,n,o),h=z(e,t,10,o-90),p=z(e,t,10,o+90);return s.jsxs("g",{className:"gauge-needle","aria-hidden":"true",children:[s.jsx("path",{d:`M ${h.x} ${h.y} L ${f.x} ${f.y} L ${p.x} ${p.y} Z`,fill:r}),s.jsx("circle",{cx:e,cy:t,r:i*2,fill:r})]})}const ue=m.memo(pe);function ve({ticks:e,color:t,labelColor:n,showLabels:o}){return s.jsx("g",{className:"gauge-ticks","aria-hidden":"true",children:e.map(r=>s.jsxs("g",{children:[s.jsx("line",{x1:r.outer.x,y1:r.outer.y,x2:r.inner.x,y2:r.inner.y,stroke:t,strokeWidth:"2"}),o&&s.jsx("text",{x:r.label.x,y:r.label.y,textAnchor:"middle",dominantBaseline:"middle",fill:n,fontSize:"10",children:Math.round(r.value)})]},r.value))})}const ge=m.memo(ve);function ye({cx:e,cy:t,value:n,target:o,units:r,showTarget:i}){return s.jsxs("g",{className:"gauge-value","aria-hidden":"true",children:[s.jsxs("text",{x:e,y:t,textAnchor:"middle",dominantBaseline:"middle",fontSize:"20",children:[n,r?` ${r}`:""]}),i&&typeof o=="number"&&s.jsxs("text",{x:e,y:t+22,textAnchor:"middle",dominantBaseline:"middle",fontSize:"11",children:["Target ",o]})]})}const I=m.memo(ye);function be({cx:e,cy:t,radius:n,angle:o,color:r}){const i=z(e,t,n,o);return s.jsx("circle",{cx:i.x,cy:i.y,r:"3",fill:r})}const te=m.memo(be),ae=(e,t,n)=>Math.min(Math.max(e,t),n),de=(e,t,n)=>e+(t-e)*n,fe=(e,t,n)=>n===t?0:(e-t)/(n-t),R=(e,t,n,o,r)=>{const i=ae(e,t,n),f=fe(i,t,n);return de(o,r,f)},$e=(e,t,n)=>{if(!Array.isArray(t)||t.length===0)return n;const o=[...t].filter(i=>typeof(i==null?void 0:i.value)=="number").sort((i,f)=>i.value-f.value),r=o.find(i=>e<=i.value)||o[o.length-1];return(r==null?void 0:r.color)||n},xe=(e,t,n)=>!Array.isArray(e)||e.length===0?[{value:t+(n-t)*.6,color:"var(--gauge-range-poor)"},{value:t+(n-t)*.8,color:"var(--gauge-range-warning)"},{value:n,color:"var(--gauge-range-good)"}]:e.map(o=>({value:typeof o.value=="number"?o.value:n,color:o.color||"var(--gauge-range-good)",label:o.label||""}));function D({value:e,min:t,max:n,startAngle:o,endAngle:r,size:i,thickness:f,thresholds:h,tickCount:p=5,arcPadding:y=0}){return m.useMemo(()=>{const c=Number.isFinite(t)?t:0,a=Number.isFinite(n)?n:100,g=Number.isFinite(e)?e:c,u=ae(g,c,a),v=Number.isFinite(o)?o:-90,b=Number.isFinite(r)?r:90,M=Number.isFinite(i)?i:200,S=Number.isFinite(f)?f:18,j=M/2,A=M/2,N=M/2,G=N-S,L=(N+G)/2,B=R(u,c,a,v,b),K=xe(h,c,a);let P=c;const O=K.map(T=>{const k=P,w=T.value;return P=w,{...T,startValue:k,endValue:w,startAngle:R(k,c,a,v,b),endAngle:R(w,c,a,v,b)}}),U=p>1?(a-c)/(p-1):0,E=Array.from({length:p},(T,k)=>{const w=c+U*k,l=R(w,c,a,v,b),H=z(j,A,N-y,l),J=z(j,A,N-y-10,l),Q=z(j,A,G-18,l);return{value:w,angle:l,outer:H,inner:J,label:Q}}),W=ee(j,A,L,v,b),Y=fe(u,c,a),_=R(u,c,a,v,b),Z=ee(j,A,L,v,_);return{cx:j,cy:A,outerRadius:N,innerRadius:G,midRadius:L,value:u,valueAngle:B,startAngle:v,endAngle:b,arcPath:W,progressPath:Z,progressAngle:_,valueProgress:Y,ranges:O,ticks:E,size:M,thickness:S}},[e,t,n,o,r,i,f,h,p,y])}function je({value:e,min:t,max:n,startAngle:o,endAngle:r,size:i,thickness:f,thresholds:h,showTicks:p,showValue:y,showTarget:c,target:a,units:g}){const u=D({value:e,min:t,max:n,startAngle:o,endAngle:r,size:i,thickness:f,thresholds:h,tickCount:6,arcPadding:2}),v=typeof a=="number"?R(a,u.min,u.max,u.startAngle,u.endAngle):null;return s.jsxs("svg",{width:u.size,height:u.size,viewBox:`0 0 ${u.size} ${u.size}`,children:[s.jsx("g",{className:"gauge-ranges",children:u.ranges.map(b=>s.jsx(C,{cx:u.cx,cy:u.cy,radius:u.midRadius,startAngle:b.startAngle,endAngle:b.endAngle,color:b.color,thickness:u.thickness},b.endValue))}),p&&s.jsx(ge,{ticks:u.ticks,color:"var(--gauge-tick)",labelColor:"var(--gauge-text-muted)",showLabels:!0}),typeof v=="number"&&c&&s.jsx(te,{cx:u.cx,cy:u.cy,radius:u.outerRadius-4,angle:v,color:"var(--gauge-target)"}),s.jsx(ue,{cx:u.cx,cy:u.cy,radius:u.innerRadius-4,angle:u.valueAngle,color:"var(--gauge-needle)"}),y&&s.jsx(I,{cx:u.cx,cy:u.cy+28,value:Math.round(u.value),target:a,units:g,showTarget:c})]})}const Ae=m.memo(je);function ke({value:e,min:t,max:n,startAngle:o,endAngle:r,size:i,thickness:f,thresholds:h,showTicks:p,showValue:y,units:c}){const a=D({value:e,min:t,max:n,startAngle:o,endAngle:r,size:i,thickness:f,thresholds:h,tickCount:4,arcPadding:4});return s.jsxs("svg",{width:a.size,height:a.size/1.2,viewBox:`0 0 ${a.size} ${a.size}`,children:[s.jsx("g",{className:"gauge-ranges",children:a.ranges.map(g=>s.jsx(C,{cx:a.cx,cy:a.cy,radius:a.midRadius,startAngle:g.startAngle,endAngle:g.endAngle,color:g.color,thickness:a.thickness},g.endValue))}),p&&s.jsx(ge,{ticks:a.ticks,color:"var(--gauge-tick)",labelColor:"var(--gauge-text-muted)",showLabels:!1}),y&&s.jsx(I,{cx:a.cx,cy:a.cy+14,value:Math.round(a.value),units:c,showTarget:!1})]})}const we=m.memo(ke);function ze({value:e,min:t,max:n,startAngle:o,endAngle:r,size:i,thickness:f,thresholds:h,showValue:p,units:y}){const c=D({value:e,min:t,max:n,startAngle:o,endAngle:r,size:i,thickness:f,thresholds:h,tickCount:8,arcPadding:0});return s.jsxs("svg",{width:c.size,height:c.size,viewBox:`0 0 ${c.size} ${c.size}`,children:[s.jsx("g",{className:"gauge-ranges",children:c.ranges.map(a=>s.jsx(C,{cx:c.cx,cy:c.cy,radius:c.midRadius,startAngle:a.startAngle,endAngle:a.endAngle,color:a.color,thickness:c.thickness},a.endValue))}),s.jsx(ue,{cx:c.cx,cy:c.cy,radius:c.innerRadius-2,angle:c.valueAngle,color:"var(--gauge-needle)"}),p&&s.jsx(I,{cx:c.cx,cy:c.cy+24,value:Math.round(c.value),units:y,showTarget:!1})]})}const Me=m.memo(ze);function Ne({value:e,min:t,max:n,startAngle:o,endAngle:r,size:i,thickness:f,thresholds:h,showValue:p,units:y,gradientId:c}){const a=D({value:e,min:t,max:n,startAngle:o,endAngle:r,size:i,thickness:f,thresholds:h,tickCount:0,arcPadding:0});return s.jsxs("svg",{width:a.size,height:a.size,viewBox:`0 0 ${a.size} ${a.size}`,children:[c&&s.jsx("defs",{children:s.jsxs("linearGradient",{id:c,x1:"0%",y1:"0%",x2:"100%",y2:"0%",children:[s.jsx("stop",{offset:"0%",stopColor:"var(--gauge-range-poor)"}),s.jsx("stop",{offset:"55%",stopColor:"var(--gauge-range-warning)"}),s.jsx("stop",{offset:"100%",stopColor:"var(--gauge-range-good)"})]})}),s.jsx(C,{cx:a.cx,cy:a.cy,radius:a.midRadius,startAngle:a.startAngle,endAngle:a.endAngle,color:"var(--gauge-track)",thickness:a.thickness}),s.jsx(C,{cx:a.cx,cy:a.cy,radius:a.midRadius,startAngle:a.startAngle,endAngle:a.progressAngle,color:c?`url(#${c})`:"var(--gauge-progress)",thickness:a.thickness}),p&&s.jsx(I,{cx:a.cx,cy:a.cy+8,value:Math.round(a.value),units:y,showTarget:!1})]})}const Re=m.memo(Ne);function Se({value:e,min:t,max:n,startAngle:o,endAngle:r,size:i,thickness:f,thresholds:h,showValue:p,units:y,target:c,showTarget:a}){const g=D({value:e,min:t,max:n,startAngle:o,endAngle:r,size:i,thickness:f,thresholds:h,tickCount:0,arcPadding:0}),u=typeof c=="number"?R(c,g.min,g.max,g.startAngle,g.endAngle):null;return s.jsxs("svg",{width:g.size,height:g.size,viewBox:`0 0 ${g.size} ${g.size}`,children:[s.jsx("g",{className:"gauge-ranges",children:g.ranges.map(v=>s.jsx(C,{cx:g.cx,cy:g.cy,radius:g.midRadius,startAngle:v.startAngle,endAngle:v.endAngle,color:v.color,thickness:g.thickness},v.endValue))}),s.jsx(te,{cx:g.cx,cy:g.cy,radius:g.outerRadius-4,angle:g.valueAngle,color:"var(--gauge-needle)"}),a&&typeof u=="number"&&s.jsx(te,{cx:g.cx,cy:g.cy,radius:g.outerRadius-4,angle:u,color:"var(--gauge-target)"}),p&&s.jsx(I,{cx:g.cx,cy:g.cy+8,value:Math.round(g.value),units:y,target:c,showTarget:a})]})}const Te=m.memo(Se),ce=()=>typeof performance<"u"?performance.now():Date.now();function Ve(e,{enabled:t,duration:n=500,easing:o}={}){const r=m.useRef(null),i=m.useRef(0),f=m.useRef(e),[h,p]=m.useState(e);return m.useEffect(()=>{if(!t)return p(e),f.current=e,()=>{};const y=f.current,c=ce();i.current=c;const a=typeof o=="function"?o:u=>1-Math.pow(1-u,3),g=()=>{const u=Math.min(1,(ce()-c)/n),v=de(y,e,a(u));p(v),u<1?r.current=requestAnimationFrame(g):f.current=e};return r.current=requestAnimationFrame(g),()=>{r.current&&cancelAnimationFrame(r.current)}},[e,t,n,o]),h}const d="asg",Fe=(...e)=>e.filter(Boolean).join(" "),Ce=`
|
|
2
|
+
.${d}-card {
|
|
3
|
+
--gauge-bg: #f6f7f9;
|
|
4
|
+
--gauge-surface: #ffffff;
|
|
5
|
+
--gauge-text: #0f172a;
|
|
6
|
+
--gauge-text-muted: #64748b;
|
|
7
|
+
--gauge-tick: #cbd5f5;
|
|
8
|
+
--gauge-track: #e2e8f0;
|
|
9
|
+
--gauge-progress: #22c55e;
|
|
10
|
+
--gauge-needle: #0f172a;
|
|
11
|
+
--gauge-target: #f59e0b;
|
|
12
|
+
--gauge-range-poor: #ef4444;
|
|
13
|
+
--gauge-range-warning: #f59e0b;
|
|
14
|
+
--gauge-range-good: #22c55e;
|
|
15
|
+
background: var(--gauge-surface);
|
|
16
|
+
border-radius: 18px;
|
|
17
|
+
padding: 18px 20px;
|
|
18
|
+
box-shadow: 0 12px 30px rgba(15,23,42,0.08), 0 0 18px color-mix(in srgb, var(--gauge-active, #22c55e) 35%, transparent);
|
|
19
|
+
display: grid;
|
|
20
|
+
gap: 12px;
|
|
21
|
+
font-family: "Source Sans 3","Segoe UI",system-ui,sans-serif;
|
|
22
|
+
color: var(--gauge-text);
|
|
23
|
+
position: relative;
|
|
24
|
+
overflow: hidden;
|
|
25
|
+
cursor: default;
|
|
26
|
+
}
|
|
27
|
+
.${d}-card::after {
|
|
28
|
+
content: attr(data-tooltip);
|
|
29
|
+
position: absolute;
|
|
30
|
+
left: 50%;
|
|
31
|
+
bottom: 14px;
|
|
32
|
+
background: rgba(15,23,42,0.92);
|
|
33
|
+
color: #f8fafc;
|
|
34
|
+
padding: 6px 10px;
|
|
35
|
+
border-radius: 8px;
|
|
36
|
+
font-size: 11px;
|
|
37
|
+
font-weight: 500;
|
|
38
|
+
white-space: nowrap;
|
|
39
|
+
opacity: 0;
|
|
40
|
+
transform: translate(-50%, 6px);
|
|
41
|
+
transition: opacity 150ms ease, transform 150ms ease;
|
|
42
|
+
pointer-events: none;
|
|
43
|
+
z-index: 2;
|
|
44
|
+
}
|
|
45
|
+
.${d}-card[data-tooltip-open="true"]::after { opacity: 1; transform: translate(-50%, 0); }
|
|
46
|
+
.${d}-card:hover {
|
|
47
|
+
box-shadow: 0 14px 34px rgba(15,23,42,0.1), 0 0 28px color-mix(in srgb, var(--gauge-active, #22c55e) 50%, transparent);
|
|
48
|
+
}
|
|
49
|
+
.${d}-light { --gauge-bg:#f5f6fa; --gauge-surface:#ffffff; --gauge-text:#0f172a; --gauge-text-muted:#64748b; --gauge-tick:#cbd5f5; --gauge-track:#e2e8f0; }
|
|
50
|
+
.${d}-dark { --gauge-bg:#0b1220; --gauge-surface:#111827; --gauge-text:#e2e8f0; --gauge-text-muted:#94a3b8; --gauge-tick:#334155; --gauge-track:#1f2937; --gauge-needle:#e2e8f0; }
|
|
51
|
+
.${d}-purple{ --gauge-bg:#1b1035; --gauge-surface:#221344; --gauge-text:#f8fafc; --gauge-text-muted:#cbd5f5; --gauge-tick:#4c1d95; --gauge-track:#312e81; --gauge-needle:#f8fafc; }
|
|
52
|
+
.${d}-dark.${d}-card::after { background: rgba(15,23,42,0.95); }
|
|
53
|
+
.${d}-purple.${d}-card::after { background: rgba(44,20,84,0.95); }
|
|
54
|
+
.${d}-header { display:flex; justify-content:space-between; align-items:flex-start; gap:12px; }
|
|
55
|
+
.${d}-title { font-size:16px; font-weight:600; letter-spacing:0.2px; }
|
|
56
|
+
.${d}-subtitle { font-size:12px; color:var(--gauge-text-muted); margin-top:4px; }
|
|
57
|
+
.${d}-meta { text-align:right; font-size:20px; font-weight:700; color:var(--gauge-active,#22c55e); display:flex; align-items:baseline; gap:6px; }
|
|
58
|
+
.${d}-units { font-size:12px; font-weight:500; color:var(--gauge-text-muted); }
|
|
59
|
+
.${d}-body { background:radial-gradient(circle at 50% 0%, var(--gauge-bg), transparent 65%); border-radius:16px; padding:8px 0 12px; display:grid; place-items:center; }
|
|
60
|
+
.${d}-stage { display:grid; place-items:center; }
|
|
61
|
+
.${d}-state { font-size:12px; color:var(--gauge-text-muted); padding:12px 0; }
|
|
62
|
+
.${d}-flash { animation: ${d}-flash-kf 0.3s ease-in-out; }
|
|
63
|
+
@keyframes ${d}-flash-kf {
|
|
64
|
+
0% { box-shadow: 0 0 0 rgba(34,197,94,0); }
|
|
65
|
+
50% { box-shadow: 0 0 18px rgba(34,197,94,0.35); }
|
|
66
|
+
100% { box-shadow: 0 0 0 rgba(34,197,94,0); }
|
|
67
|
+
}
|
|
68
|
+
.${d}-card svg text { font-family:"Source Sans 3","Segoe UI",system-ui,sans-serif; fill:var(--gauge-text); }
|
|
69
|
+
.${d}-card svg .gauge-value text { fill:var(--gauge-text); }
|
|
70
|
+
.${d}-card svg .gauge-ticks text { fill:var(--gauge-text-muted); }
|
|
71
|
+
`;function Ge(){const e="__asg_styles__";if(typeof document>"u"||document.getElementById(e))return;const t=document.createElement("style");t.id=e,t.textContent=Ce,document.head.appendChild(t)}const ie={standard:{start:-90,end:90},semicircle:{start:-110,end:110},full:{start:0,end:360},arc:{start:-225,end:45},multiband:{start:-120,end:120}},le=e=>e?Array.isArray(e)?e[0]||null:Array.isArray(e.data)?e.data[0]||null:typeof e=="object"?e:null:null,$=(e,t)=>e!==void 0?e:t,Le=(e,t,n,o)=>{const r=xe(t,n,o);for(let i=0;i<r.length;i++)if(e<=r[i].value)return i;return r.length-1};function Be({type:e="standard",value:t,min:n,max:o,target:r,thresholds:i,showTicks:f=!0,showValue:h=!0,showTarget:p=!1,animated:y=!0,realtime:c=!1,size:a=220,thickness:g=18,startAngle:u,endAngle:v,units:b="",data:M=null,apiEndpoint:S=null,title:j="KPI Gauge",subtitle:A="",theme:N="light",className:G,style:L,onClick:B}){Ge();const[K,P]=m.useState(null),[O,U]=m.useState(!1),[E,W]=m.useState(""),[Y,_]=m.useState(!1),[Z,T]=m.useState(!1),k=m.useRef(null),w=m.useCallback(async()=>{if(S){U(!0),W("");try{const x=await fetch(S);if(!x.ok)throw new Error(`Request failed: ${x.status}`);const F=await x.json();P(le(F))}catch(x){W("Failed to load gauge data."),console.error("Failed to load gauge data",x)}finally{U(!1)}}},[S]);m.useEffect(()=>{if(M){P(le(M));return}w()},[M,w]);const l=m.useMemo(()=>{const x=K||{},F=String(e||x.type||"standard").toLowerCase(),se=ie[F]||ie.standard,X=Number.isFinite($(n,x.min))?$(n,x.min):0,ne=Number.isFinite($(o,x.max))?$(o,x.max):100,re=$(t,x.value),me=Number.isFinite(re)?re:X,oe=$(r,x.target);return{type:F,value:ae(me,X,ne),min:X,max:ne,target:Number.isFinite(oe)?oe:null,thresholds:$(i,x.thresholds),showTicks:$(f,x.showTicks??f),showValue:$(h,x.showValue??h),showTarget:$(p,x.showTarget??p),size:$(a,x.size??a),thickness:$(g,x.thickness??g),units:$(b,x.units??b),startAngle:$(u,x.startAngle??se.start),endAngle:$(v,x.endAngle??se.end)}},[K,e,n,o,t,r,i,f,h,p,a,g,b,u,v]),H=Ve(l.value,{enabled:y||c,duration:c?220:500});m.useEffect(()=>{if(!c)return;const x=Le(l.value,l.thresholds,l.min,l.max);if(k.current===null){k.current=x;return}if(k.current!==x){k.current=x,_(!0);const F=setTimeout(()=>_(!1),300);return()=>clearTimeout(F)}},[c,l.value,l.thresholds,l.min,l.max]);const J=$e(l.value,l.thresholds,"var(--gauge-range-good)"),Q=m.useMemo(()=>{const x=[`Value: ${Math.round(l.value)}${l.units?` ${l.units}`:""}`,`Min: ${l.min}`,`Max: ${l.max}`];return typeof l.target=="number"&&x.splice(1,0,`Target: ${l.target}`),x.join(" • ")},[l.value,l.units,l.min,l.max,l.target]),q={value:H,min:l.min,max:l.max,startAngle:l.startAngle,endAngle:l.endAngle,size:l.size,thickness:l.thickness,thresholds:l.thresholds,showTicks:l.showTicks,showValue:l.showValue,showTarget:l.showTarget,target:l.target,units:l.units},V=l.type;return s.jsxs("section",{className:Fe(`${d}-card`,`${d}-${N}`,Y&&`${d}-flash`,G),style:{...L,"--gauge-active":J},onClick:()=>B==null?void 0:B(l.value),onMouseEnter:()=>T(!0),onMouseLeave:()=>T(!1),role:"figure","aria-label":j,"data-tooltip":Q,"data-tooltip-open":Z?"true":"false",children:[s.jsxs("header",{className:`${d}-header`,children:[s.jsxs("div",{children:[s.jsx("div",{className:`${d}-title`,children:j}),A&&s.jsx("div",{className:`${d}-subtitle`,children:A})]}),s.jsxs("div",{className:`${d}-meta`,children:[s.jsx("span",{children:Math.round(l.value)}),l.units&&s.jsx("span",{className:`${d}-units`,children:l.units})]})]}),s.jsxs("div",{className:`${d}-body`,children:[O&&s.jsx("div",{className:`${d}-state`,children:"Loading KPI..."}),E&&s.jsx("div",{className:`${d}-state`,children:E}),!O&&!E&&s.jsxs("div",{className:`${d}-stage`,children:[V==="semicircle"&&s.jsx(we,{...q}),V==="full"&&s.jsx(Me,{...q}),V==="arc"&&s.jsx(Re,{...q,gradientId:"gaugeGradient"}),V==="multiband"&&s.jsx(Te,{...q}),(V==="standard"||!V)&&s.jsx(Ae,{...q})]})]})]})}module.exports=Be;
|
|
2
72
|
//# sourceMappingURL=index.js.map
|
package/dist/cjs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../src/components/AwesomeSpeedometerGauge/utils/polar.js","../../src/components/AwesomeSpeedometerGauge/components/ArcRange.jsx","../../src/components/AwesomeSpeedometerGauge/components/Needle.jsx","../../src/components/AwesomeSpeedometerGauge/components/TickMarks.jsx","../../src/components/AwesomeSpeedometerGauge/components/ValueLabel.jsx","../../src/components/AwesomeSpeedometerGauge/components/ThresholdMarker.jsx","../../src/components/AwesomeSpeedometerGauge/utils/math.js","../../src/components/AwesomeSpeedometerGauge/utils/colorRules.js","../../src/components/AwesomeSpeedometerGauge/hooks/useGaugeMath.js","../../src/components/AwesomeSpeedometerGauge/modes/StandardGauge.jsx","../../src/components/AwesomeSpeedometerGauge/modes/SemiCircleGauge.jsx","../../src/components/AwesomeSpeedometerGauge/modes/FullCircleGauge.jsx","../../src/components/AwesomeSpeedometerGauge/modes/ArcGauge.jsx","../../src/components/AwesomeSpeedometerGauge/modes/MultiBandGauge.jsx","../../src/components/AwesomeSpeedometerGauge/hooks/useAnimation.js","../../src/components/AwesomeSpeedometerGauge/AwesomeSpeedometerGauge.jsx"],"sourcesContent":["export const polarToCartesian = (cx, cy, radius, angle) => {\n const rad = (angle - 90) * (Math.PI / 180);\n return {\n x: cx + radius * Math.cos(rad),\n y: cy + radius * Math.sin(rad),\n };\n};\n\nexport const describeArc = (cx, cy, radius, startAngle, endAngle) => {\n const start = polarToCartesian(cx, cy, radius, endAngle);\n const end = polarToCartesian(cx, cy, radius, startAngle);\n const largeArcFlag = Math.abs(endAngle - startAngle) <= 180 ? \"0\" : \"1\";\n return [\n \"M\", start.x, start.y,\n \"A\", radius, radius, 0, largeArcFlag, 0, end.x, end.y,\n ].join(\" \");\n};\r\n","import React from \"react\";\nimport { describeArc } from \"../utils/polar\";\n\nfunction ArcRange({ cx, cy, radius, startAngle, endAngle, color, thickness }) {\n const path = describeArc(cx, cy, radius, startAngle, endAngle);\n return (\n <path\n d={path}\n fill=\"none\"\n stroke={color}\n strokeWidth={thickness}\n strokeLinecap=\"round\"\n />\n );\n}\n\nexport default React.memo(ArcRange);\r\n","import React from \"react\";\nimport { polarToCartesian } from \"../utils/polar\";\n\nfunction Needle({ cx, cy, radius, angle, color, width = 3 }) {\n const tip = polarToCartesian(cx, cy, radius, angle);\n const left = polarToCartesian(cx, cy, 10, angle - 90);\n const right = polarToCartesian(cx, cy, 10, angle + 90);\n return (\n <g className=\"gauge-needle\" aria-hidden=\"true\">\n <path\n d={`M ${left.x} ${left.y} L ${tip.x} ${tip.y} L ${right.x} ${right.y} Z`}\n fill={color}\n />\n <circle cx={cx} cy={cy} r={width * 2} fill={color} />\n </g>\n );\n}\n\nexport default React.memo(Needle);\r\n","import React from \"react\";\n\nfunction TickMarks({ ticks, color, labelColor, showLabels }) {\n return (\n <g className=\"gauge-ticks\" aria-hidden=\"true\">\n {ticks.map((tick) => (\n <g key={tick.value}>\n <line\n x1={tick.outer.x}\n y1={tick.outer.y}\n x2={tick.inner.x}\n y2={tick.inner.y}\n stroke={color}\n strokeWidth=\"2\"\n />\n {showLabels && (\n <text\n x={tick.label.x}\n y={tick.label.y}\n textAnchor=\"middle\"\n dominantBaseline=\"middle\"\n fill={labelColor}\n fontSize=\"10\"\n >\n {Math.round(tick.value)}\n </text>\n )}\n </g>\n ))}\n </g>\n );\n}\n\nexport default React.memo(TickMarks);\r\n","import React from \"react\";\n\nfunction ValueLabel({ cx, cy, value, target, units, showTarget }) {\n return (\n <g className=\"gauge-value\" aria-hidden=\"true\">\n <text\n x={cx}\n y={cy}\n textAnchor=\"middle\"\n dominantBaseline=\"middle\"\n fontSize=\"20\"\n >\n {value}\n {units ? ` ${units}` : \"\"}\n </text>\n {showTarget && typeof target === \"number\" && (\n <text\n x={cx}\n y={cy + 22}\n textAnchor=\"middle\"\n dominantBaseline=\"middle\"\n fontSize=\"11\"\n >\n Target {target}\n </text>\n )}\n </g>\n );\n}\n\nexport default React.memo(ValueLabel);\r\n","import React from \"react\";\nimport { polarToCartesian } from \"../utils/polar\";\n\nfunction ThresholdMarker({ cx, cy, radius, angle, color }) {\n const pos = polarToCartesian(cx, cy, radius, angle);\n return <circle cx={pos.x} cy={pos.y} r=\"3\" fill={color} />;\n}\n\nexport default React.memo(ThresholdMarker);\r\n","export const clamp = (value, min, max) => Math.min(Math.max(value, min), max);\n\nexport const lerp = (from, to, t) => from + (to - from) * t;\n\nexport const normalize = (value, min, max) => {\n if (max === min) return 0;\n return (value - min) / (max - min);\n};\n\nexport const valueToAngle = (value, min, max, startAngle, endAngle) => {\n const clamped = clamp(value, min, max);\n const pct = normalize(clamped, min, max);\n return lerp(startAngle, endAngle, pct);\n};\n\nexport const angleToValue = (angle, min, max, startAngle, endAngle) => {\n if (endAngle === startAngle) return min;\n const pct = (angle - startAngle) / (endAngle - startAngle);\n return lerp(min, max, pct);\n};\r\n","export const resolveThresholdColor = (value, thresholds, fallback) => {\n if (!Array.isArray(thresholds) || thresholds.length === 0) return fallback;\n const sorted = [...thresholds]\n .filter((t) => typeof t?.value === \"number\")\n .sort((a, b) => a.value - b.value);\n const match = sorted.find((t) => value <= t.value) || sorted[sorted.length - 1];\n return match?.color || fallback;\n};\n\nexport const normalizeThresholds = (thresholds, min, max) => {\n if (!Array.isArray(thresholds) || thresholds.length === 0) {\n return [\n { value: min + (max - min) * 0.6, color: \"var(--gauge-range-poor)\" },\n { value: min + (max - min) * 0.8, color: \"var(--gauge-range-warning)\" },\n { value: max, color: \"var(--gauge-range-good)\" },\n ];\n }\n return thresholds.map((t) => ({\n value: typeof t.value === \"number\" ? t.value : max,\n color: t.color || \"var(--gauge-range-good)\",\n label: t.label || \"\",\n }));\n};\r\n","import { useMemo } from \"react\";\nimport { clamp, normalize, valueToAngle } from \"../utils/math\";\nimport { describeArc, polarToCartesian } from \"../utils/polar\";\nimport { normalizeThresholds } from \"../utils/colorRules\";\n\nexport default function useGaugeMath({\n value,\n min,\n max,\n startAngle,\n endAngle,\n size,\n thickness,\n thresholds,\n tickCount = 5,\n arcPadding = 0,\n}) {\n return useMemo(() => {\n const safeMin = Number.isFinite(min) ? min : 0;\n const safeMax = Number.isFinite(max) ? max : 100;\n const safeValue = Number.isFinite(value) ? value : safeMin;\n const clampedValue = clamp(safeValue, safeMin, safeMax);\n const safeStart = Number.isFinite(startAngle) ? startAngle : -90;\n const safeEnd = Number.isFinite(endAngle) ? endAngle : 90;\n const safeSize = Number.isFinite(size) ? size : 200;\n const safeThickness = Number.isFinite(thickness) ? thickness : 18;\n\n const cx = safeSize / 2;\n const cy = safeSize / 2;\n const outerRadius = safeSize / 2;\n const innerRadius = outerRadius - safeThickness;\n const midRadius = (outerRadius + innerRadius) / 2;\n\n const valueAngle = valueToAngle(clampedValue, safeMin, safeMax, safeStart, safeEnd);\n\n const normalizedThresholds = normalizeThresholds(thresholds, safeMin, safeMax);\n\n let lastValue = safeMin;\n const ranges = normalizedThresholds.map((range) => {\n const startValue = lastValue;\n const endValue = range.value;\n lastValue = endValue;\n return {\n ...range,\n startValue,\n endValue,\n startAngle: valueToAngle(startValue, safeMin, safeMax, safeStart, safeEnd),\n endAngle: valueToAngle(endValue, safeMin, safeMax, safeStart, safeEnd),\n };\n });\n\n const tickStep = tickCount > 1 ? (safeMax - safeMin) / (tickCount - 1) : 0;\n const ticks = Array.from({ length: tickCount }, (_, i) => {\n const tickValue = safeMin + tickStep * i;\n const angle = valueToAngle(tickValue, safeMin, safeMax, safeStart, safeEnd);\n const outer = polarToCartesian(cx, cy, outerRadius - arcPadding, angle);\n const inner = polarToCartesian(cx, cy, outerRadius - arcPadding - 10, angle);\n const label = polarToCartesian(cx, cy, innerRadius - 18, angle);\n return { value: tickValue, angle, outer, inner, label };\n });\n\n const arcPath = describeArc(cx, cy, midRadius, safeStart, safeEnd);\n const valueProgress = normalize(clampedValue, safeMin, safeMax);\n const progressAngle = valueToAngle(clampedValue, safeMin, safeMax, safeStart, safeEnd);\n const progressPath = describeArc(cx, cy, midRadius, safeStart, progressAngle);\n\n return {\n cx,\n cy,\n outerRadius,\n innerRadius,\n midRadius,\n value: clampedValue,\n valueAngle,\n startAngle: safeStart,\n endAngle: safeEnd,\n arcPath,\n progressPath,\n progressAngle,\n valueProgress,\n ranges,\n ticks,\n size: safeSize,\n thickness: safeThickness,\n };\n }, [\n value,\n min,\n max,\n startAngle,\n endAngle,\n size,\n thickness,\n thresholds,\n tickCount,\n arcPadding,\n ]);\n}\r\n","import React from \"react\";\nimport ArcRange from \"../components/ArcRange\";\nimport Needle from \"../components/Needle\";\nimport TickMarks from \"../components/TickMarks\";\nimport ValueLabel from \"../components/ValueLabel\";\nimport ThresholdMarker from \"../components/ThresholdMarker\";\nimport useGaugeMath from \"../hooks/useGaugeMath\";\nimport { valueToAngle } from \"../utils/math\";\n\nfunction StandardGauge({\n value,\n min,\n max,\n startAngle,\n endAngle,\n size,\n thickness,\n thresholds,\n showTicks,\n showValue,\n showTarget,\n target,\n units,\n}) {\n const math = useGaugeMath({\n value,\n min,\n max,\n startAngle,\n endAngle,\n size,\n thickness,\n thresholds,\n tickCount: 6,\n arcPadding: 2,\n });\n\n const targetAngle =\n typeof target === \"number\"\n ? valueToAngle(target, math.min, math.max, math.startAngle, math.endAngle)\n : null;\n\n return (\n <svg width={math.size} height={math.size} viewBox={`0 0 ${math.size} ${math.size}`}>\n <g className=\"gauge-ranges\">\n {math.ranges.map((range) => (\n <ArcRange\n key={range.endValue}\n cx={math.cx}\n cy={math.cy}\n radius={math.midRadius}\n startAngle={range.startAngle}\n endAngle={range.endAngle}\n color={range.color}\n thickness={math.thickness}\n />\n ))}\n </g>\n\n {showTicks && (\n <TickMarks\n ticks={math.ticks}\n color=\"var(--gauge-tick)\"\n labelColor=\"var(--gauge-text-muted)\"\n showLabels\n />\n )}\n\n {typeof targetAngle === \"number\" && showTarget && (\n <ThresholdMarker\n cx={math.cx}\n cy={math.cy}\n radius={math.outerRadius - 4}\n angle={targetAngle}\n color=\"var(--gauge-target)\"\n />\n )}\n\n <Needle\n cx={math.cx}\n cy={math.cy}\n radius={math.innerRadius - 4}\n angle={math.valueAngle}\n color=\"var(--gauge-needle)\"\n />\n\n {showValue && (\n <ValueLabel\n cx={math.cx}\n cy={math.cy + 28}\n value={Math.round(math.value)}\n target={target}\n units={units}\n showTarget={showTarget}\n />\n )}\n </svg>\n );\n}\n\nexport default React.memo(StandardGauge);\r\n","import React from \"react\";\nimport ArcRange from \"../components/ArcRange\";\nimport TickMarks from \"../components/TickMarks\";\nimport ValueLabel from \"../components/ValueLabel\";\nimport useGaugeMath from \"../hooks/useGaugeMath\";\n\nfunction SemiCircleGauge({\n value,\n min,\n max,\n startAngle,\n endAngle,\n size,\n thickness,\n thresholds,\n showTicks,\n showValue,\n units,\n}) {\n const math = useGaugeMath({\n value,\n min,\n max,\n startAngle,\n endAngle,\n size,\n thickness,\n thresholds,\n tickCount: 4,\n arcPadding: 4,\n });\n\n return (\n <svg width={math.size} height={math.size / 1.2} viewBox={`0 0 ${math.size} ${math.size}`}>\n <g className=\"gauge-ranges\">\n {math.ranges.map((range) => (\n <ArcRange\n key={range.endValue}\n cx={math.cx}\n cy={math.cy}\n radius={math.midRadius}\n startAngle={range.startAngle}\n endAngle={range.endAngle}\n color={range.color}\n thickness={math.thickness}\n />\n ))}\n </g>\n\n {showTicks && (\n <TickMarks\n ticks={math.ticks}\n color=\"var(--gauge-tick)\"\n labelColor=\"var(--gauge-text-muted)\"\n showLabels={false}\n />\n )}\n\n {showValue && (\n <ValueLabel\n cx={math.cx}\n cy={math.cy + 14}\n value={Math.round(math.value)}\n units={units}\n showTarget={false}\n />\n )}\n </svg>\n );\n}\n\nexport default React.memo(SemiCircleGauge);\r\n","import React from \"react\";\nimport ArcRange from \"../components/ArcRange\";\nimport Needle from \"../components/Needle\";\nimport ValueLabel from \"../components/ValueLabel\";\nimport useGaugeMath from \"../hooks/useGaugeMath\";\n\nfunction FullCircleGauge({\n value,\n min,\n max,\n startAngle,\n endAngle,\n size,\n thickness,\n thresholds,\n showValue,\n units,\n}) {\n const math = useGaugeMath({\n value,\n min,\n max,\n startAngle,\n endAngle,\n size,\n thickness,\n thresholds,\n tickCount: 8,\n arcPadding: 0,\n });\n\n return (\n <svg width={math.size} height={math.size} viewBox={`0 0 ${math.size} ${math.size}`}>\n <g className=\"gauge-ranges\">\n {math.ranges.map((range) => (\n <ArcRange\n key={range.endValue}\n cx={math.cx}\n cy={math.cy}\n radius={math.midRadius}\n startAngle={range.startAngle}\n endAngle={range.endAngle}\n color={range.color}\n thickness={math.thickness}\n />\n ))}\n </g>\n\n <Needle\n cx={math.cx}\n cy={math.cy}\n radius={math.innerRadius - 2}\n angle={math.valueAngle}\n color=\"var(--gauge-needle)\"\n />\n\n {showValue && (\n <ValueLabel\n cx={math.cx}\n cy={math.cy + 24}\n value={Math.round(math.value)}\n units={units}\n showTarget={false}\n />\n )}\n </svg>\n );\n}\n\nexport default React.memo(FullCircleGauge);\r\n","import React from \"react\";\nimport ArcRange from \"../components/ArcRange\";\nimport ValueLabel from \"../components/ValueLabel\";\nimport useGaugeMath from \"../hooks/useGaugeMath\";\n\nfunction ArcGauge({\n value,\n min,\n max,\n startAngle,\n endAngle,\n size,\n thickness,\n thresholds,\n showValue,\n units,\n gradientId,\n}) {\n const math = useGaugeMath({\n value,\n min,\n max,\n startAngle,\n endAngle,\n size,\n thickness,\n thresholds,\n tickCount: 0,\n arcPadding: 0,\n });\n\n return (\n <svg width={math.size} height={math.size} viewBox={`0 0 ${math.size} ${math.size}`}>\n {gradientId && (\n <defs>\n <linearGradient id={gradientId} x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"0%\">\n <stop offset=\"0%\" stopColor=\"var(--gauge-range-poor)\" />\n <stop offset=\"55%\" stopColor=\"var(--gauge-range-warning)\" />\n <stop offset=\"100%\" stopColor=\"var(--gauge-range-good)\" />\n </linearGradient>\n </defs>\n )}\n <ArcRange\n cx={math.cx}\n cy={math.cy}\n radius={math.midRadius}\n startAngle={math.startAngle}\n endAngle={math.endAngle}\n color=\"var(--gauge-track)\"\n thickness={math.thickness}\n />\n <ArcRange\n cx={math.cx}\n cy={math.cy}\n radius={math.midRadius}\n startAngle={math.startAngle}\n endAngle={math.progressAngle}\n color={gradientId ? `url(#${gradientId})` : \"var(--gauge-progress)\"}\n thickness={math.thickness}\n />\n\n {showValue && (\n <ValueLabel\n cx={math.cx}\n cy={math.cy + 8}\n value={Math.round(math.value)}\n units={units}\n showTarget={false}\n />\n )}\n </svg>\n );\n}\n\nexport default React.memo(ArcGauge);\r\n","import React from \"react\";\nimport ArcRange from \"../components/ArcRange\";\nimport ThresholdMarker from \"../components/ThresholdMarker\";\nimport ValueLabel from \"../components/ValueLabel\";\nimport useGaugeMath from \"../hooks/useGaugeMath\";\nimport { valueToAngle } from \"../utils/math\";\n\nfunction MultiBandGauge({\n value,\n min,\n max,\n startAngle,\n endAngle,\n size,\n thickness,\n thresholds,\n showValue,\n units,\n target,\n showTarget,\n}) {\n const math = useGaugeMath({\n value,\n min,\n max,\n startAngle,\n endAngle,\n size,\n thickness,\n thresholds,\n tickCount: 0,\n arcPadding: 0,\n });\n\n const targetAngle =\n typeof target === \"number\"\n ? valueToAngle(target, math.min, math.max, math.startAngle, math.endAngle)\n : null;\n\n return (\n <svg width={math.size} height={math.size} viewBox={`0 0 ${math.size} ${math.size}`}>\n <g className=\"gauge-ranges\">\n {math.ranges.map((range) => (\n <ArcRange\n key={range.endValue}\n cx={math.cx}\n cy={math.cy}\n radius={math.midRadius}\n startAngle={range.startAngle}\n endAngle={range.endAngle}\n color={range.color}\n thickness={math.thickness}\n />\n ))}\n </g>\n\n <ThresholdMarker\n cx={math.cx}\n cy={math.cy}\n radius={math.outerRadius - 4}\n angle={math.valueAngle}\n color=\"var(--gauge-needle)\"\n />\n\n {showTarget && typeof targetAngle === \"number\" && (\n <ThresholdMarker\n cx={math.cx}\n cy={math.cy}\n radius={math.outerRadius - 4}\n angle={targetAngle}\n color=\"var(--gauge-target)\"\n />\n )}\n\n {showValue && (\n <ValueLabel\n cx={math.cx}\n cy={math.cy + 8}\n value={Math.round(math.value)}\n units={units}\n target={target}\n showTarget={showTarget}\n />\n )}\n </svg>\n );\n}\n\nexport default React.memo(MultiBandGauge);\r\n","import { useEffect, useRef, useState } from \"react\";\nimport { lerp } from \"../utils/math\";\n\nconst now = () => (typeof performance !== \"undefined\" ? performance.now() : Date.now());\n\nexport default function useAnimation(value, { enabled, duration = 500, easing } = {}) {\n const frameRef = useRef(null);\n const startRef = useRef(0);\n const fromRef = useRef(value);\n const [animatedValue, setAnimatedValue] = useState(value);\n\n useEffect(() => {\n if (!enabled) {\n setAnimatedValue(value);\n fromRef.current = value;\n return () => {};\n }\n\n const startValue = fromRef.current;\n const startTime = now();\n startRef.current = startTime;\n\n const ease = typeof easing === \"function\" ? easing : (t) => 1 - Math.pow(1 - t, 3);\n\n const tick = () => {\n const t = Math.min(1, (now() - startTime) / duration);\n const nextValue = lerp(startValue, value, ease(t));\n setAnimatedValue(nextValue);\n if (t < 1) {\n frameRef.current = requestAnimationFrame(tick);\n } else {\n fromRef.current = value;\n }\n };\n\n frameRef.current = requestAnimationFrame(tick);\n\n return () => {\n if (frameRef.current) {\n cancelAnimationFrame(frameRef.current);\n }\n };\n }, [value, enabled, duration, easing]);\n\n return animatedValue;\n}\r\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\r\nimport styles from \"./AwesomeSpeedometerGauge.module.css\";\r\nimport StandardGauge from \"./modes/StandardGauge\";\r\nimport SemiCircleGauge from \"./modes/SemiCircleGauge\";\r\nimport FullCircleGauge from \"./modes/FullCircleGauge\";\r\nimport ArcGauge from \"./modes/ArcGauge\";\r\nimport MultiBandGauge from \"./modes/MultiBandGauge\";\r\nimport useAnimation from \"./hooks/useAnimation\";\r\nimport { resolveThresholdColor, normalizeThresholds } from \"./utils/colorRules\";\r\nimport { clamp } from \"./utils/math\";\r\n\r\nconst cx = (...classes) => classes.filter(Boolean).join(\" \");\r\n\r\nconst defaultData = null;\r\n\r\nconst typeAngles = {\r\n standard: { start: -90, end: 90 },\r\n semicircle: { start: -110, end: 110 },\r\n full: { start: 0, end: 360 },\r\n arc: { start: -225, end: 45 },\r\n multiband: { start: -120, end: 120 },\r\n};\r\n\r\nconst normalizePayload = (payload) => {\r\n if (!payload) return null;\r\n if (Array.isArray(payload)) return payload[0] || null;\r\n if (Array.isArray(payload.data)) return payload.data[0] || null;\r\n if (typeof payload === \"object\") return payload;\r\n return null;\r\n};\r\n\r\nconst pickValue = (prop, fallback) => (prop !== undefined ? prop : fallback);\r\n\r\nconst getRangeIndex = (value, thresholds, min, max) => {\r\n const ranges = normalizeThresholds(thresholds, min, max);\r\n for (let i = 0; i < ranges.length; i += 1) {\r\n if (value <= ranges[i].value) return i;\r\n }\r\n return ranges.length - 1;\r\n};\r\n\r\nexport default function AwesomeSpeedometerGauge({\n type = \"standard\",\r\n value,\r\n min,\r\n max,\r\n target,\r\n thresholds,\r\n showTicks = true,\r\n showValue = true,\r\n showTarget = false,\r\n animated = true,\r\n realtime = false,\r\n size = 220,\r\n thickness = 18,\r\n startAngle,\r\n endAngle,\r\n units = \"\",\r\n data = defaultData,\r\n apiEndpoint = \"/gauge-data.json\",\r\n title = \"KPI Gauge\",\r\n subtitle = \"\",\r\n theme = \"light\",\r\n className,\r\n style,\r\n onClick,\n}) {\n const [remoteData, setRemoteData] = useState(null);\r\n const [loading, setLoading] = useState(false);\n const [loadError, setLoadError] = useState(\"\");\n const [flash, setFlash] = useState(false);\n const [tooltipOpen, setTooltipOpen] = useState(false);\n const lastRangeRef = useRef(null);\n\r\n const fetchData = useCallback(async () => {\r\n if (!apiEndpoint) return;\r\n setLoading(true);\r\n setLoadError(\"\");\r\n try {\r\n const response = await fetch(apiEndpoint);\r\n if (!response.ok) {\r\n throw new Error(`Request failed: ${response.status}`);\r\n }\r\n const payload = await response.json();\r\n setRemoteData(normalizePayload(payload));\r\n } catch (error) {\r\n setLoadError(\"Failed to load gauge data.\");\r\n console.error(\"Failed to load gauge data\", error);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [apiEndpoint]);\r\n\r\n useEffect(() => {\r\n if (data) {\r\n setRemoteData(normalizePayload(data));\r\n return;\r\n }\r\n fetchData();\r\n }, [data, fetchData]);\r\n\r\n const merged = useMemo(() => {\r\n const source = remoteData || {};\r\n const safeType = String(type || source.type || \"standard\").toLowerCase();\r\n const angles = typeAngles[safeType] || typeAngles.standard;\r\n const baseMin = pickValue(min, source.min);\r\n const baseMax = pickValue(max, source.max);\r\n const safeMin = Number.isFinite(baseMin) ? baseMin : 0;\r\n const safeMax = Number.isFinite(baseMax) ? baseMax : 100;\r\n const baseValue = pickValue(value, source.value);\r\n const safeValue = Number.isFinite(baseValue) ? baseValue : safeMin;\r\n const baseTarget = pickValue(target, source.target);\r\n const safeTarget = Number.isFinite(baseTarget) ? baseTarget : null;\r\n return {\r\n type: safeType,\r\n value: clamp(safeValue, safeMin, safeMax),\r\n min: safeMin,\r\n max: safeMax,\r\n target: safeTarget,\r\n thresholds: pickValue(thresholds, source.thresholds),\r\n showTicks: pickValue(showTicks, source.showTicks ?? showTicks),\r\n showValue: pickValue(showValue, source.showValue ?? showValue),\r\n showTarget: pickValue(showTarget, source.showTarget ?? showTarget),\r\n size: pickValue(size, source.size ?? size),\r\n thickness: pickValue(thickness, source.thickness ?? thickness),\r\n units: pickValue(units, source.units ?? units),\r\n startAngle: pickValue(startAngle, source.startAngle ?? angles.start),\r\n endAngle: pickValue(endAngle, source.endAngle ?? angles.end),\r\n };\r\n }, [\r\n remoteData,\r\n type,\r\n min,\r\n max,\r\n value,\r\n target,\r\n thresholds,\r\n showTicks,\r\n showValue,\r\n showTarget,\r\n size,\r\n thickness,\r\n units,\r\n startAngle,\r\n endAngle,\r\n ]);\r\n\r\n const animatedValue = useAnimation(merged.value, {\r\n enabled: animated || realtime,\r\n duration: realtime ? 220 : 500,\r\n });\r\n\r\n useEffect(() => {\r\n if (!realtime) return;\r\n const rangeIndex = getRangeIndex(merged.value, merged.thresholds, merged.min, merged.max);\r\n if (lastRangeRef.current === null) {\r\n lastRangeRef.current = rangeIndex;\r\n return;\r\n }\r\n if (lastRangeRef.current !== rangeIndex) {\r\n lastRangeRef.current = rangeIndex;\r\n setFlash(true);\r\n const timer = setTimeout(() => setFlash(false), 300);\r\n return () => clearTimeout(timer);\r\n }\r\n return undefined;\r\n }, [realtime, merged.value, merged.thresholds, merged.min, merged.max]);\r\n\r\n const activeColor = resolveThresholdColor(\n merged.value,\n merged.thresholds,\n \"var(--gauge-range-good)\",\n );\n\n const tooltip = useMemo(() => {\n const parts = [\n `Value: ${Math.round(merged.value)}${merged.units ? ` ${merged.units}` : \"\"}`,\n `Min: ${merged.min}`,\n `Max: ${merged.max}`,\n ];\n if (typeof merged.target === \"number\") {\n parts.splice(1, 0, `Target: ${merged.target}`);\n }\n return parts.join(\" • \");\n }, [merged.value, merged.units, merged.min, merged.max, merged.target]);\n\r\n const sharedProps = {\r\n value: animatedValue,\r\n min: merged.min,\r\n max: merged.max,\r\n startAngle: merged.startAngle,\r\n endAngle: merged.endAngle,\r\n size: merged.size,\r\n thickness: merged.thickness,\r\n thresholds: merged.thresholds,\r\n showTicks: merged.showTicks,\r\n showValue: merged.showValue,\r\n showTarget: merged.showTarget,\r\n target: merged.target,\r\n units: merged.units,\r\n };\r\n\r\n const mode = merged.type;\r\n\r\n return (\n <section\n className={cx(styles.gaugeCard, styles[theme], flash && styles.flash, className)}\n style={{ ...style, \"--gauge-active\": activeColor }}\n onClick={() => onClick?.(merged.value)}\n onMouseEnter={() => setTooltipOpen(true)}\n onMouseLeave={() => setTooltipOpen(false)}\n role=\"figure\"\n aria-label={title}\n data-tooltip={tooltip}\n data-tooltip-open={tooltipOpen ? \"true\" : \"false\"}\n >\n <header className={styles.header}>\r\n <div>\r\n <div className={styles.title}>{title}</div>\r\n {subtitle && <div className={styles.subtitle}>{subtitle}</div>}\r\n </div>\r\n <div className={styles.meta}>\r\n <span>{Math.round(merged.value)}</span>\r\n {merged.units && <span className={styles.units}>{merged.units}</span>}\r\n </div>\r\n </header>\r\n\r\n <div className={styles.body}>\r\n {loading && <div className={styles.state}>Loading KPI...</div>}\r\n {loadError && <div className={styles.state}>{loadError}</div>}\r\n {!loading && !loadError && (\r\n <div className={styles.gaugeStage}>\r\n {mode === \"semicircle\" && <SemiCircleGauge {...sharedProps} />}\r\n {mode === \"full\" && <FullCircleGauge {...sharedProps} />}\r\n {mode === \"arc\" && <ArcGauge {...sharedProps} gradientId=\"gaugeGradient\" />}\r\n {mode === \"multiband\" && <MultiBandGauge {...sharedProps} />}\r\n {(mode === \"standard\" || !mode) && <StandardGauge {...sharedProps} />}\r\n </div>\r\n )}\r\n </div>\r\n </section>\r\n );\r\n}\r\n\r\n"],"names":["polarToCartesian","cx","cy","radius","angle","rad","describeArc","startAngle","endAngle","start","end","largeArcFlag","ArcRange","color","thickness","path","jsx","ArcRange$1","React","Needle","width","tip","left","right","jsxs","Needle$1","TickMarks","ticks","labelColor","showLabels","tick","TickMarks$1","ValueLabel","value","target","units","showTarget","ValueLabel$1","ThresholdMarker","pos","ThresholdMarker$1","clamp","min","max","lerp","from","to","t","normalize","valueToAngle","clamped","pct","resolveThresholdColor","thresholds","fallback","sorted","a","b","match","normalizeThresholds","useGaugeMath","size","tickCount","arcPadding","useMemo","safeMin","safeMax","safeValue","clampedValue","safeStart","safeEnd","safeSize","safeThickness","outerRadius","innerRadius","midRadius","valueAngle","normalizedThresholds","lastValue","ranges","range","startValue","endValue","tickStep","_","i","tickValue","outer","inner","label","arcPath","valueProgress","progressAngle","progressPath","StandardGauge","showTicks","showValue","math","targetAngle","StandardGauge$1","SemiCircleGauge","SemiCircleGauge$1","FullCircleGauge","FullCircleGauge$1","ArcGauge","gradientId","ArcGauge$1","MultiBandGauge","MultiBandGauge$1","now","useAnimation","enabled","duration","easing","frameRef","useRef","startRef","fromRef","animatedValue","setAnimatedValue","useState","useEffect","startTime","ease","nextValue","classes","defaultData","typeAngles","normalizePayload","payload","pickValue","prop","getRangeIndex","AwesomeSpeedometerGauge","type","animated","realtime","data","apiEndpoint","title","subtitle","theme","className","style","onClick","remoteData","setRemoteData","loading","setLoading","loadError","setLoadError","flash","setFlash","tooltipOpen","setTooltipOpen","lastRangeRef","fetchData","useCallback","response","error","merged","source","safeType","angles","baseMin","baseMax","baseValue","baseTarget","safeTarget","rangeIndex","timer","activeColor","tooltip","parts","sharedProps","mode","styles"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/components/AwesomeSpeedometerGauge/utils/polar.js","../../src/components/AwesomeSpeedometerGauge/components/ArcRange.jsx","../../src/components/AwesomeSpeedometerGauge/components/Needle.jsx","../../src/components/AwesomeSpeedometerGauge/components/TickMarks.jsx","../../src/components/AwesomeSpeedometerGauge/components/ValueLabel.jsx","../../src/components/AwesomeSpeedometerGauge/components/ThresholdMarker.jsx","../../src/components/AwesomeSpeedometerGauge/utils/math.js","../../src/components/AwesomeSpeedometerGauge/utils/colorRules.js","../../src/components/AwesomeSpeedometerGauge/hooks/useGaugeMath.js","../../src/components/AwesomeSpeedometerGauge/modes/StandardGauge.jsx","../../src/components/AwesomeSpeedometerGauge/modes/SemiCircleGauge.jsx","../../src/components/AwesomeSpeedometerGauge/modes/FullCircleGauge.jsx","../../src/components/AwesomeSpeedometerGauge/modes/ArcGauge.jsx","../../src/components/AwesomeSpeedometerGauge/modes/MultiBandGauge.jsx","../../src/components/AwesomeSpeedometerGauge/hooks/useAnimation.js","../../src/components/AwesomeSpeedometerGauge/AwesomeSpeedometerGauge.jsx"],"sourcesContent":["export const polarToCartesian = (cx, cy, radius, angle) => {\n const rad = (angle - 90) * (Math.PI / 180);\n return {\n x: cx + radius * Math.cos(rad),\n y: cy + radius * Math.sin(rad),\n };\n};\n\nexport const describeArc = (cx, cy, radius, startAngle, endAngle) => {\n const start = polarToCartesian(cx, cy, radius, endAngle);\n const end = polarToCartesian(cx, cy, radius, startAngle);\n const largeArcFlag = Math.abs(endAngle - startAngle) <= 180 ? \"0\" : \"1\";\n return [\n \"M\", start.x, start.y,\n \"A\", radius, radius, 0, largeArcFlag, 0, end.x, end.y,\n ].join(\" \");\n};\r\n","import React from \"react\";\nimport { describeArc } from \"../utils/polar\";\n\nfunction ArcRange({ cx, cy, radius, startAngle, endAngle, color, thickness }) {\n const path = describeArc(cx, cy, radius, startAngle, endAngle);\n return (\n <path\n d={path}\n fill=\"none\"\n stroke={color}\n strokeWidth={thickness}\n strokeLinecap=\"round\"\n />\n );\n}\n\nexport default React.memo(ArcRange);\r\n","import React from \"react\";\nimport { polarToCartesian } from \"../utils/polar\";\n\nfunction Needle({ cx, cy, radius, angle, color, width = 3 }) {\n const tip = polarToCartesian(cx, cy, radius, angle);\n const left = polarToCartesian(cx, cy, 10, angle - 90);\n const right = polarToCartesian(cx, cy, 10, angle + 90);\n return (\n <g className=\"gauge-needle\" aria-hidden=\"true\">\n <path\n d={`M ${left.x} ${left.y} L ${tip.x} ${tip.y} L ${right.x} ${right.y} Z`}\n fill={color}\n />\n <circle cx={cx} cy={cy} r={width * 2} fill={color} />\n </g>\n );\n}\n\nexport default React.memo(Needle);\r\n","import React from \"react\";\n\nfunction TickMarks({ ticks, color, labelColor, showLabels }) {\n return (\n <g className=\"gauge-ticks\" aria-hidden=\"true\">\n {ticks.map((tick) => (\n <g key={tick.value}>\n <line\n x1={tick.outer.x}\n y1={tick.outer.y}\n x2={tick.inner.x}\n y2={tick.inner.y}\n stroke={color}\n strokeWidth=\"2\"\n />\n {showLabels && (\n <text\n x={tick.label.x}\n y={tick.label.y}\n textAnchor=\"middle\"\n dominantBaseline=\"middle\"\n fill={labelColor}\n fontSize=\"10\"\n >\n {Math.round(tick.value)}\n </text>\n )}\n </g>\n ))}\n </g>\n );\n}\n\nexport default React.memo(TickMarks);\r\n","import React from \"react\";\n\nfunction ValueLabel({ cx, cy, value, target, units, showTarget }) {\n return (\n <g className=\"gauge-value\" aria-hidden=\"true\">\n <text\n x={cx}\n y={cy}\n textAnchor=\"middle\"\n dominantBaseline=\"middle\"\n fontSize=\"20\"\n >\n {value}\n {units ? ` ${units}` : \"\"}\n </text>\n {showTarget && typeof target === \"number\" && (\n <text\n x={cx}\n y={cy + 22}\n textAnchor=\"middle\"\n dominantBaseline=\"middle\"\n fontSize=\"11\"\n >\n Target {target}\n </text>\n )}\n </g>\n );\n}\n\nexport default React.memo(ValueLabel);\r\n","import React from \"react\";\nimport { polarToCartesian } from \"../utils/polar\";\n\nfunction ThresholdMarker({ cx, cy, radius, angle, color }) {\n const pos = polarToCartesian(cx, cy, radius, angle);\n return <circle cx={pos.x} cy={pos.y} r=\"3\" fill={color} />;\n}\n\nexport default React.memo(ThresholdMarker);\r\n","export const clamp = (value, min, max) => Math.min(Math.max(value, min), max);\n\nexport const lerp = (from, to, t) => from + (to - from) * t;\n\nexport const normalize = (value, min, max) => {\n if (max === min) return 0;\n return (value - min) / (max - min);\n};\n\nexport const valueToAngle = (value, min, max, startAngle, endAngle) => {\n const clamped = clamp(value, min, max);\n const pct = normalize(clamped, min, max);\n return lerp(startAngle, endAngle, pct);\n};\n\nexport const angleToValue = (angle, min, max, startAngle, endAngle) => {\n if (endAngle === startAngle) return min;\n const pct = (angle - startAngle) / (endAngle - startAngle);\n return lerp(min, max, pct);\n};\r\n","export const resolveThresholdColor = (value, thresholds, fallback) => {\n if (!Array.isArray(thresholds) || thresholds.length === 0) return fallback;\n const sorted = [...thresholds]\n .filter((t) => typeof t?.value === \"number\")\n .sort((a, b) => a.value - b.value);\n const match = sorted.find((t) => value <= t.value) || sorted[sorted.length - 1];\n return match?.color || fallback;\n};\n\nexport const normalizeThresholds = (thresholds, min, max) => {\n if (!Array.isArray(thresholds) || thresholds.length === 0) {\n return [\n { value: min + (max - min) * 0.6, color: \"var(--gauge-range-poor)\" },\n { value: min + (max - min) * 0.8, color: \"var(--gauge-range-warning)\" },\n { value: max, color: \"var(--gauge-range-good)\" },\n ];\n }\n return thresholds.map((t) => ({\n value: typeof t.value === \"number\" ? t.value : max,\n color: t.color || \"var(--gauge-range-good)\",\n label: t.label || \"\",\n }));\n};\r\n","import { useMemo } from \"react\";\nimport { clamp, normalize, valueToAngle } from \"../utils/math\";\nimport { describeArc, polarToCartesian } from \"../utils/polar\";\nimport { normalizeThresholds } from \"../utils/colorRules\";\n\nexport default function useGaugeMath({\n value,\n min,\n max,\n startAngle,\n endAngle,\n size,\n thickness,\n thresholds,\n tickCount = 5,\n arcPadding = 0,\n}) {\n return useMemo(() => {\n const safeMin = Number.isFinite(min) ? min : 0;\n const safeMax = Number.isFinite(max) ? max : 100;\n const safeValue = Number.isFinite(value) ? value : safeMin;\n const clampedValue = clamp(safeValue, safeMin, safeMax);\n const safeStart = Number.isFinite(startAngle) ? startAngle : -90;\n const safeEnd = Number.isFinite(endAngle) ? endAngle : 90;\n const safeSize = Number.isFinite(size) ? size : 200;\n const safeThickness = Number.isFinite(thickness) ? thickness : 18;\n\n const cx = safeSize / 2;\n const cy = safeSize / 2;\n const outerRadius = safeSize / 2;\n const innerRadius = outerRadius - safeThickness;\n const midRadius = (outerRadius + innerRadius) / 2;\n\n const valueAngle = valueToAngle(clampedValue, safeMin, safeMax, safeStart, safeEnd);\n\n const normalizedThresholds = normalizeThresholds(thresholds, safeMin, safeMax);\n\n let lastValue = safeMin;\n const ranges = normalizedThresholds.map((range) => {\n const startValue = lastValue;\n const endValue = range.value;\n lastValue = endValue;\n return {\n ...range,\n startValue,\n endValue,\n startAngle: valueToAngle(startValue, safeMin, safeMax, safeStart, safeEnd),\n endAngle: valueToAngle(endValue, safeMin, safeMax, safeStart, safeEnd),\n };\n });\n\n const tickStep = tickCount > 1 ? (safeMax - safeMin) / (tickCount - 1) : 0;\n const ticks = Array.from({ length: tickCount }, (_, i) => {\n const tickValue = safeMin + tickStep * i;\n const angle = valueToAngle(tickValue, safeMin, safeMax, safeStart, safeEnd);\n const outer = polarToCartesian(cx, cy, outerRadius - arcPadding, angle);\n const inner = polarToCartesian(cx, cy, outerRadius - arcPadding - 10, angle);\n const label = polarToCartesian(cx, cy, innerRadius - 18, angle);\n return { value: tickValue, angle, outer, inner, label };\n });\n\n const arcPath = describeArc(cx, cy, midRadius, safeStart, safeEnd);\n const valueProgress = normalize(clampedValue, safeMin, safeMax);\n const progressAngle = valueToAngle(clampedValue, safeMin, safeMax, safeStart, safeEnd);\n const progressPath = describeArc(cx, cy, midRadius, safeStart, progressAngle);\n\n return {\n cx,\n cy,\n outerRadius,\n innerRadius,\n midRadius,\n value: clampedValue,\n valueAngle,\n startAngle: safeStart,\n endAngle: safeEnd,\n arcPath,\n progressPath,\n progressAngle,\n valueProgress,\n ranges,\n ticks,\n size: safeSize,\n thickness: safeThickness,\n };\n }, [\n value,\n min,\n max,\n startAngle,\n endAngle,\n size,\n thickness,\n thresholds,\n tickCount,\n arcPadding,\n ]);\n}\r\n","import React from \"react\";\nimport ArcRange from \"../components/ArcRange\";\nimport Needle from \"../components/Needle\";\nimport TickMarks from \"../components/TickMarks\";\nimport ValueLabel from \"../components/ValueLabel\";\nimport ThresholdMarker from \"../components/ThresholdMarker\";\nimport useGaugeMath from \"../hooks/useGaugeMath\";\nimport { valueToAngle } from \"../utils/math\";\n\nfunction StandardGauge({\n value,\n min,\n max,\n startAngle,\n endAngle,\n size,\n thickness,\n thresholds,\n showTicks,\n showValue,\n showTarget,\n target,\n units,\n}) {\n const math = useGaugeMath({\n value,\n min,\n max,\n startAngle,\n endAngle,\n size,\n thickness,\n thresholds,\n tickCount: 6,\n arcPadding: 2,\n });\n\n const targetAngle =\n typeof target === \"number\"\n ? valueToAngle(target, math.min, math.max, math.startAngle, math.endAngle)\n : null;\n\n return (\n <svg width={math.size} height={math.size} viewBox={`0 0 ${math.size} ${math.size}`}>\n <g className=\"gauge-ranges\">\n {math.ranges.map((range) => (\n <ArcRange\n key={range.endValue}\n cx={math.cx}\n cy={math.cy}\n radius={math.midRadius}\n startAngle={range.startAngle}\n endAngle={range.endAngle}\n color={range.color}\n thickness={math.thickness}\n />\n ))}\n </g>\n\n {showTicks && (\n <TickMarks\n ticks={math.ticks}\n color=\"var(--gauge-tick)\"\n labelColor=\"var(--gauge-text-muted)\"\n showLabels\n />\n )}\n\n {typeof targetAngle === \"number\" && showTarget && (\n <ThresholdMarker\n cx={math.cx}\n cy={math.cy}\n radius={math.outerRadius - 4}\n angle={targetAngle}\n color=\"var(--gauge-target)\"\n />\n )}\n\n <Needle\n cx={math.cx}\n cy={math.cy}\n radius={math.innerRadius - 4}\n angle={math.valueAngle}\n color=\"var(--gauge-needle)\"\n />\n\n {showValue && (\n <ValueLabel\n cx={math.cx}\n cy={math.cy + 28}\n value={Math.round(math.value)}\n target={target}\n units={units}\n showTarget={showTarget}\n />\n )}\n </svg>\n );\n}\n\nexport default React.memo(StandardGauge);\r\n","import React from \"react\";\nimport ArcRange from \"../components/ArcRange\";\nimport TickMarks from \"../components/TickMarks\";\nimport ValueLabel from \"../components/ValueLabel\";\nimport useGaugeMath from \"../hooks/useGaugeMath\";\n\nfunction SemiCircleGauge({\n value,\n min,\n max,\n startAngle,\n endAngle,\n size,\n thickness,\n thresholds,\n showTicks,\n showValue,\n units,\n}) {\n const math = useGaugeMath({\n value,\n min,\n max,\n startAngle,\n endAngle,\n size,\n thickness,\n thresholds,\n tickCount: 4,\n arcPadding: 4,\n });\n\n return (\n <svg width={math.size} height={math.size / 1.2} viewBox={`0 0 ${math.size} ${math.size}`}>\n <g className=\"gauge-ranges\">\n {math.ranges.map((range) => (\n <ArcRange\n key={range.endValue}\n cx={math.cx}\n cy={math.cy}\n radius={math.midRadius}\n startAngle={range.startAngle}\n endAngle={range.endAngle}\n color={range.color}\n thickness={math.thickness}\n />\n ))}\n </g>\n\n {showTicks && (\n <TickMarks\n ticks={math.ticks}\n color=\"var(--gauge-tick)\"\n labelColor=\"var(--gauge-text-muted)\"\n showLabels={false}\n />\n )}\n\n {showValue && (\n <ValueLabel\n cx={math.cx}\n cy={math.cy + 14}\n value={Math.round(math.value)}\n units={units}\n showTarget={false}\n />\n )}\n </svg>\n );\n}\n\nexport default React.memo(SemiCircleGauge);\r\n","import React from \"react\";\nimport ArcRange from \"../components/ArcRange\";\nimport Needle from \"../components/Needle\";\nimport ValueLabel from \"../components/ValueLabel\";\nimport useGaugeMath from \"../hooks/useGaugeMath\";\n\nfunction FullCircleGauge({\n value,\n min,\n max,\n startAngle,\n endAngle,\n size,\n thickness,\n thresholds,\n showValue,\n units,\n}) {\n const math = useGaugeMath({\n value,\n min,\n max,\n startAngle,\n endAngle,\n size,\n thickness,\n thresholds,\n tickCount: 8,\n arcPadding: 0,\n });\n\n return (\n <svg width={math.size} height={math.size} viewBox={`0 0 ${math.size} ${math.size}`}>\n <g className=\"gauge-ranges\">\n {math.ranges.map((range) => (\n <ArcRange\n key={range.endValue}\n cx={math.cx}\n cy={math.cy}\n radius={math.midRadius}\n startAngle={range.startAngle}\n endAngle={range.endAngle}\n color={range.color}\n thickness={math.thickness}\n />\n ))}\n </g>\n\n <Needle\n cx={math.cx}\n cy={math.cy}\n radius={math.innerRadius - 2}\n angle={math.valueAngle}\n color=\"var(--gauge-needle)\"\n />\n\n {showValue && (\n <ValueLabel\n cx={math.cx}\n cy={math.cy + 24}\n value={Math.round(math.value)}\n units={units}\n showTarget={false}\n />\n )}\n </svg>\n );\n}\n\nexport default React.memo(FullCircleGauge);\r\n","import React from \"react\";\nimport ArcRange from \"../components/ArcRange\";\nimport ValueLabel from \"../components/ValueLabel\";\nimport useGaugeMath from \"../hooks/useGaugeMath\";\n\nfunction ArcGauge({\n value,\n min,\n max,\n startAngle,\n endAngle,\n size,\n thickness,\n thresholds,\n showValue,\n units,\n gradientId,\n}) {\n const math = useGaugeMath({\n value,\n min,\n max,\n startAngle,\n endAngle,\n size,\n thickness,\n thresholds,\n tickCount: 0,\n arcPadding: 0,\n });\n\n return (\n <svg width={math.size} height={math.size} viewBox={`0 0 ${math.size} ${math.size}`}>\n {gradientId && (\n <defs>\n <linearGradient id={gradientId} x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"0%\">\n <stop offset=\"0%\" stopColor=\"var(--gauge-range-poor)\" />\n <stop offset=\"55%\" stopColor=\"var(--gauge-range-warning)\" />\n <stop offset=\"100%\" stopColor=\"var(--gauge-range-good)\" />\n </linearGradient>\n </defs>\n )}\n <ArcRange\n cx={math.cx}\n cy={math.cy}\n radius={math.midRadius}\n startAngle={math.startAngle}\n endAngle={math.endAngle}\n color=\"var(--gauge-track)\"\n thickness={math.thickness}\n />\n <ArcRange\n cx={math.cx}\n cy={math.cy}\n radius={math.midRadius}\n startAngle={math.startAngle}\n endAngle={math.progressAngle}\n color={gradientId ? `url(#${gradientId})` : \"var(--gauge-progress)\"}\n thickness={math.thickness}\n />\n\n {showValue && (\n <ValueLabel\n cx={math.cx}\n cy={math.cy + 8}\n value={Math.round(math.value)}\n units={units}\n showTarget={false}\n />\n )}\n </svg>\n );\n}\n\nexport default React.memo(ArcGauge);\r\n","import React from \"react\";\nimport ArcRange from \"../components/ArcRange\";\nimport ThresholdMarker from \"../components/ThresholdMarker\";\nimport ValueLabel from \"../components/ValueLabel\";\nimport useGaugeMath from \"../hooks/useGaugeMath\";\nimport { valueToAngle } from \"../utils/math\";\n\nfunction MultiBandGauge({\n value,\n min,\n max,\n startAngle,\n endAngle,\n size,\n thickness,\n thresholds,\n showValue,\n units,\n target,\n showTarget,\n}) {\n const math = useGaugeMath({\n value,\n min,\n max,\n startAngle,\n endAngle,\n size,\n thickness,\n thresholds,\n tickCount: 0,\n arcPadding: 0,\n });\n\n const targetAngle =\n typeof target === \"number\"\n ? valueToAngle(target, math.min, math.max, math.startAngle, math.endAngle)\n : null;\n\n return (\n <svg width={math.size} height={math.size} viewBox={`0 0 ${math.size} ${math.size}`}>\n <g className=\"gauge-ranges\">\n {math.ranges.map((range) => (\n <ArcRange\n key={range.endValue}\n cx={math.cx}\n cy={math.cy}\n radius={math.midRadius}\n startAngle={range.startAngle}\n endAngle={range.endAngle}\n color={range.color}\n thickness={math.thickness}\n />\n ))}\n </g>\n\n <ThresholdMarker\n cx={math.cx}\n cy={math.cy}\n radius={math.outerRadius - 4}\n angle={math.valueAngle}\n color=\"var(--gauge-needle)\"\n />\n\n {showTarget && typeof targetAngle === \"number\" && (\n <ThresholdMarker\n cx={math.cx}\n cy={math.cy}\n radius={math.outerRadius - 4}\n angle={targetAngle}\n color=\"var(--gauge-target)\"\n />\n )}\n\n {showValue && (\n <ValueLabel\n cx={math.cx}\n cy={math.cy + 8}\n value={Math.round(math.value)}\n units={units}\n target={target}\n showTarget={showTarget}\n />\n )}\n </svg>\n );\n}\n\nexport default React.memo(MultiBandGauge);\r\n","import { useEffect, useRef, useState } from \"react\";\nimport { lerp } from \"../utils/math\";\n\nconst now = () => (typeof performance !== \"undefined\" ? performance.now() : Date.now());\n\nexport default function useAnimation(value, { enabled, duration = 500, easing } = {}) {\n const frameRef = useRef(null);\n const startRef = useRef(0);\n const fromRef = useRef(value);\n const [animatedValue, setAnimatedValue] = useState(value);\n\n useEffect(() => {\n if (!enabled) {\n setAnimatedValue(value);\n fromRef.current = value;\n return () => {};\n }\n\n const startValue = fromRef.current;\n const startTime = now();\n startRef.current = startTime;\n\n const ease = typeof easing === \"function\" ? easing : (t) => 1 - Math.pow(1 - t, 3);\n\n const tick = () => {\n const t = Math.min(1, (now() - startTime) / duration);\n const nextValue = lerp(startValue, value, ease(t));\n setAnimatedValue(nextValue);\n if (t < 1) {\n frameRef.current = requestAnimationFrame(tick);\n } else {\n fromRef.current = value;\n }\n };\n\n frameRef.current = requestAnimationFrame(tick);\n\n return () => {\n if (frameRef.current) {\n cancelAnimationFrame(frameRef.current);\n }\n };\n }, [value, enabled, duration, easing]);\n\n return animatedValue;\n}\r\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\r\nimport StandardGauge from \"./modes/StandardGauge\";\r\nimport SemiCircleGauge from \"./modes/SemiCircleGauge\";\r\nimport FullCircleGauge from \"./modes/FullCircleGauge\";\r\nimport ArcGauge from \"./modes/ArcGauge\";\r\nimport MultiBandGauge from \"./modes/MultiBandGauge\";\r\nimport useAnimation from \"./hooks/useAnimation\";\r\nimport { resolveThresholdColor, normalizeThresholds } from \"./utils/colorRules\";\r\nimport { clamp } from \"./utils/math\";\r\n\r\n/* ─── Stable class-name prefix (replaces CSS Modules) ───────────────── */\r\nconst P = \"asg\";\r\n\r\nconst cx = (...classes) => classes.filter(Boolean).join(\" \");\r\n\r\n/* ─── All styles as a plain string, injected once into <head> ───────── */\r\nconst STYLES = `\r\n.${P}-card {\r\n --gauge-bg: #f6f7f9;\r\n --gauge-surface: #ffffff;\r\n --gauge-text: #0f172a;\r\n --gauge-text-muted: #64748b;\r\n --gauge-tick: #cbd5f5;\r\n --gauge-track: #e2e8f0;\r\n --gauge-progress: #22c55e;\r\n --gauge-needle: #0f172a;\r\n --gauge-target: #f59e0b;\r\n --gauge-range-poor: #ef4444;\r\n --gauge-range-warning: #f59e0b;\r\n --gauge-range-good: #22c55e;\r\n background: var(--gauge-surface);\r\n border-radius: 18px;\r\n padding: 18px 20px;\r\n box-shadow: 0 12px 30px rgba(15,23,42,0.08), 0 0 18px color-mix(in srgb, var(--gauge-active, #22c55e) 35%, transparent);\r\n display: grid;\r\n gap: 12px;\r\n font-family: \"Source Sans 3\",\"Segoe UI\",system-ui,sans-serif;\r\n color: var(--gauge-text);\r\n position: relative;\r\n overflow: hidden;\r\n cursor: default;\r\n}\r\n.${P}-card::after {\r\n content: attr(data-tooltip);\r\n position: absolute;\r\n left: 50%;\r\n bottom: 14px;\r\n background: rgba(15,23,42,0.92);\r\n color: #f8fafc;\r\n padding: 6px 10px;\r\n border-radius: 8px;\r\n font-size: 11px;\r\n font-weight: 500;\r\n white-space: nowrap;\r\n opacity: 0;\r\n transform: translate(-50%, 6px);\r\n transition: opacity 150ms ease, transform 150ms ease;\r\n pointer-events: none;\r\n z-index: 2;\r\n}\r\n.${P}-card[data-tooltip-open=\"true\"]::after { opacity: 1; transform: translate(-50%, 0); }\r\n.${P}-card:hover {\r\n box-shadow: 0 14px 34px rgba(15,23,42,0.1), 0 0 28px color-mix(in srgb, var(--gauge-active, #22c55e) 50%, transparent);\r\n}\r\n.${P}-light { --gauge-bg:#f5f6fa; --gauge-surface:#ffffff; --gauge-text:#0f172a; --gauge-text-muted:#64748b; --gauge-tick:#cbd5f5; --gauge-track:#e2e8f0; }\r\n.${P}-dark { --gauge-bg:#0b1220; --gauge-surface:#111827; --gauge-text:#e2e8f0; --gauge-text-muted:#94a3b8; --gauge-tick:#334155; --gauge-track:#1f2937; --gauge-needle:#e2e8f0; }\r\n.${P}-purple{ --gauge-bg:#1b1035; --gauge-surface:#221344; --gauge-text:#f8fafc; --gauge-text-muted:#cbd5f5; --gauge-tick:#4c1d95; --gauge-track:#312e81; --gauge-needle:#f8fafc; }\r\n.${P}-dark.${P}-card::after { background: rgba(15,23,42,0.95); }\r\n.${P}-purple.${P}-card::after { background: rgba(44,20,84,0.95); }\r\n.${P}-header { display:flex; justify-content:space-between; align-items:flex-start; gap:12px; }\r\n.${P}-title { font-size:16px; font-weight:600; letter-spacing:0.2px; }\r\n.${P}-subtitle { font-size:12px; color:var(--gauge-text-muted); margin-top:4px; }\r\n.${P}-meta { text-align:right; font-size:20px; font-weight:700; color:var(--gauge-active,#22c55e); display:flex; align-items:baseline; gap:6px; }\r\n.${P}-units { font-size:12px; font-weight:500; color:var(--gauge-text-muted); }\r\n.${P}-body { background:radial-gradient(circle at 50% 0%, var(--gauge-bg), transparent 65%); border-radius:16px; padding:8px 0 12px; display:grid; place-items:center; }\r\n.${P}-stage { display:grid; place-items:center; }\r\n.${P}-state { font-size:12px; color:var(--gauge-text-muted); padding:12px 0; }\r\n.${P}-flash { animation: ${P}-flash-kf 0.3s ease-in-out; }\r\n@keyframes ${P}-flash-kf {\r\n 0% { box-shadow: 0 0 0 rgba(34,197,94,0); }\r\n 50% { box-shadow: 0 0 18px rgba(34,197,94,0.35); }\r\n 100% { box-shadow: 0 0 0 rgba(34,197,94,0); }\r\n}\r\n.${P}-card svg text { font-family:\"Source Sans 3\",\"Segoe UI\",system-ui,sans-serif; fill:var(--gauge-text); }\r\n.${P}-card svg .gauge-value text { fill:var(--gauge-text); }\r\n.${P}-card svg .gauge-ticks text { fill:var(--gauge-text-muted); }\r\n`;\r\n\r\nfunction injectStyles() {\r\n const id = \"__asg_styles__\";\r\n if (typeof document === \"undefined\") return;\r\n if (document.getElementById(id)) return;\r\n const el = document.createElement(\"style\");\r\n el.id = id;\r\n el.textContent = STYLES;\r\n document.head.appendChild(el);\r\n}\r\n\r\n/* ─── Constants ─────────────────────────────────────────────────────── */\r\nconst typeAngles = {\r\n standard: { start: -90, end: 90 },\r\n semicircle: { start: -110, end: 110 },\r\n full: { start: 0, end: 360 },\r\n arc: { start: -225, end: 45 },\r\n multiband: { start: -120, end: 120 },\r\n};\r\n\r\nconst normalizePayload = (payload) => {\r\n if (!payload) return null;\r\n if (Array.isArray(payload)) return payload[0] || null;\r\n if (Array.isArray(payload.data)) return payload.data[0] || null;\r\n if (typeof payload === \"object\") return payload;\r\n return null;\r\n};\r\n\r\nconst pickValue = (prop, fallback) => (prop !== undefined ? prop : fallback);\r\n\r\nconst getRangeIndex = (value, thresholds, min, max) => {\r\n const ranges = normalizeThresholds(thresholds, min, max);\r\n for (let i = 0; i < ranges.length; i++) {\r\n if (value <= ranges[i].value) return i;\r\n }\r\n return ranges.length - 1;\r\n};\r\n\r\n/* ─── Component ─────────────────────────────────────────────────────── */\r\nexport default function AwesomeSpeedometerGauge({\r\n type = \"standard\",\r\n value,\r\n min,\r\n max,\r\n target,\r\n thresholds,\r\n showTicks = true,\r\n showValue = true,\r\n showTarget = false,\r\n animated = true,\r\n realtime = false,\r\n size = 220,\r\n thickness = 18,\r\n startAngle,\r\n endAngle,\r\n units = \"\",\r\n data = null,\r\n apiEndpoint = null,\r\n title = \"KPI Gauge\",\r\n subtitle = \"\",\r\n theme = \"light\",\r\n className,\r\n style,\r\n onClick,\r\n}) {\r\n injectStyles();\r\n\r\n const [remoteData, setRemoteData] = useState(null);\r\n const [loading, setLoading] = useState(false);\r\n const [loadError, setLoadError] = useState(\"\");\r\n const [flash, setFlash] = useState(false);\r\n const [tooltipOpen, setTooltipOpen] = useState(false);\r\n const lastRangeRef = useRef(null);\r\n\r\n const fetchData = useCallback(async () => {\r\n if (!apiEndpoint) return;\r\n setLoading(true);\r\n setLoadError(\"\");\r\n try {\r\n const response = await fetch(apiEndpoint);\r\n if (!response.ok) throw new Error(`Request failed: ${response.status}`);\r\n const payload = await response.json();\r\n setRemoteData(normalizePayload(payload));\r\n } catch (error) {\r\n setLoadError(\"Failed to load gauge data.\");\r\n console.error(\"Failed to load gauge data\", error);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [apiEndpoint]);\r\n\r\n useEffect(() => {\r\n if (data) { setRemoteData(normalizePayload(data)); return; }\r\n fetchData();\r\n }, [data, fetchData]);\r\n\r\n const merged = useMemo(() => {\r\n const source = remoteData || {};\r\n const safeType = String(type || source.type || \"standard\").toLowerCase();\r\n const angles = typeAngles[safeType] || typeAngles.standard;\r\n const safeMin = Number.isFinite(pickValue(min, source.min)) ? pickValue(min, source.min) : 0;\r\n const safeMax = Number.isFinite(pickValue(max, source.max)) ? pickValue(max, source.max) : 100;\r\n const rawVal = pickValue(value, source.value);\r\n const safeValue = Number.isFinite(rawVal) ? rawVal : safeMin;\r\n const rawTarget = pickValue(target, source.target);\r\n return {\r\n type: safeType,\r\n value: clamp(safeValue, safeMin, safeMax),\r\n min: safeMin,\r\n max: safeMax,\r\n target: Number.isFinite(rawTarget) ? rawTarget : null,\r\n thresholds: pickValue(thresholds, source.thresholds),\r\n showTicks: pickValue(showTicks, source.showTicks ?? showTicks),\r\n showValue: pickValue(showValue, source.showValue ?? showValue),\r\n showTarget: pickValue(showTarget, source.showTarget ?? showTarget),\r\n size: pickValue(size, source.size ?? size),\r\n thickness: pickValue(thickness, source.thickness ?? thickness),\r\n units: pickValue(units, source.units ?? units),\r\n startAngle: pickValue(startAngle, source.startAngle ?? angles.start),\r\n endAngle: pickValue(endAngle, source.endAngle ?? angles.end),\r\n };\r\n }, [remoteData, type, min, max, value, target, thresholds,\r\n showTicks, showValue, showTarget, size, thickness, units, startAngle, endAngle]);\r\n\r\n const animatedValue = useAnimation(merged.value, {\r\n enabled: animated || realtime,\r\n duration: realtime ? 220 : 500,\r\n });\r\n\r\n useEffect(() => {\r\n if (!realtime) return;\r\n const ri = getRangeIndex(merged.value, merged.thresholds, merged.min, merged.max);\r\n if (lastRangeRef.current === null) { lastRangeRef.current = ri; return; }\r\n if (lastRangeRef.current !== ri) {\r\n lastRangeRef.current = ri;\r\n setFlash(true);\r\n const t = setTimeout(() => setFlash(false), 300);\r\n return () => clearTimeout(t);\r\n }\r\n }, [realtime, merged.value, merged.thresholds, merged.min, merged.max]);\r\n\r\n const activeColor = resolveThresholdColor(merged.value, merged.thresholds, \"var(--gauge-range-good)\");\r\n\r\n const tooltip = useMemo(() => {\r\n const parts = [\r\n `Value: ${Math.round(merged.value)}${merged.units ? ` ${merged.units}` : \"\"}`,\r\n `Min: ${merged.min}`,\r\n `Max: ${merged.max}`,\r\n ];\r\n if (typeof merged.target === \"number\") parts.splice(1, 0, `Target: ${merged.target}`);\r\n return parts.join(\" • \");\r\n }, [merged.value, merged.units, merged.min, merged.max, merged.target]);\r\n\r\n const sharedProps = {\r\n value: animatedValue, min: merged.min, max: merged.max,\r\n startAngle: merged.startAngle, endAngle: merged.endAngle,\r\n size: merged.size, thickness: merged.thickness,\r\n thresholds: merged.thresholds, showTicks: merged.showTicks,\r\n showValue: merged.showValue, showTarget: merged.showTarget,\r\n target: merged.target, units: merged.units,\r\n };\r\n\r\n const mode = merged.type;\r\n\r\n return (\r\n <section\r\n className={cx(`${P}-card`, `${P}-${theme}`, flash && `${P}-flash`, className)}\r\n style={{ ...style, \"--gauge-active\": activeColor }}\r\n onClick={() => onClick?.(merged.value)}\r\n onMouseEnter={() => setTooltipOpen(true)}\r\n onMouseLeave={() => setTooltipOpen(false)}\r\n role=\"figure\"\r\n aria-label={title}\r\n data-tooltip={tooltip}\r\n data-tooltip-open={tooltipOpen ? \"true\" : \"false\"}\r\n >\r\n <header className={`${P}-header`}>\r\n <div>\r\n <div className={`${P}-title`}>{title}</div>\r\n {subtitle && <div className={`${P}-subtitle`}>{subtitle}</div>}\r\n </div>\r\n <div className={`${P}-meta`}>\r\n <span>{Math.round(merged.value)}</span>\r\n {merged.units && <span className={`${P}-units`}>{merged.units}</span>}\r\n </div>\r\n </header>\r\n\r\n <div className={`${P}-body`}>\r\n {loading && <div className={`${P}-state`}>Loading KPI...</div>}\r\n {loadError && <div className={`${P}-state`}>{loadError}</div>}\r\n {!loading && !loadError && (\r\n <div className={`${P}-stage`}>\r\n {mode === \"semicircle\" && <SemiCircleGauge {...sharedProps} />}\r\n {mode === \"full\" && <FullCircleGauge {...sharedProps} />}\r\n {mode === \"arc\" && <ArcGauge {...sharedProps} gradientId=\"gaugeGradient\" />}\r\n {mode === \"multiband\" && <MultiBandGauge {...sharedProps} />}\r\n {(mode === \"standard\" || !mode) && <StandardGauge {...sharedProps} />}\r\n </div>\r\n )}\r\n </div>\r\n </section>\r\n );\r\n}"],"names":["polarToCartesian","cx","cy","radius","angle","rad","describeArc","startAngle","endAngle","start","end","largeArcFlag","ArcRange","color","thickness","path","jsx","ArcRange$1","React","Needle","width","tip","left","right","jsxs","Needle$1","TickMarks","ticks","labelColor","showLabels","tick","TickMarks$1","ValueLabel","value","target","units","showTarget","ValueLabel$1","ThresholdMarker","pos","ThresholdMarker$1","clamp","min","max","lerp","from","to","t","normalize","valueToAngle","clamped","pct","resolveThresholdColor","thresholds","fallback","sorted","a","b","match","normalizeThresholds","useGaugeMath","size","tickCount","arcPadding","useMemo","safeMin","safeMax","safeValue","clampedValue","safeStart","safeEnd","safeSize","safeThickness","outerRadius","innerRadius","midRadius","valueAngle","normalizedThresholds","lastValue","ranges","range","startValue","endValue","tickStep","_","i","tickValue","outer","inner","label","arcPath","valueProgress","progressAngle","progressPath","StandardGauge","showTicks","showValue","math","targetAngle","StandardGauge$1","SemiCircleGauge","SemiCircleGauge$1","FullCircleGauge","FullCircleGauge$1","ArcGauge","gradientId","ArcGauge$1","MultiBandGauge","MultiBandGauge$1","now","useAnimation","enabled","duration","easing","frameRef","useRef","startRef","fromRef","animatedValue","setAnimatedValue","useState","useEffect","startTime","ease","nextValue","P","classes","STYLES","injectStyles","id","el","typeAngles","normalizePayload","payload","pickValue","prop","getRangeIndex","AwesomeSpeedometerGauge","type","animated","realtime","data","apiEndpoint","title","subtitle","theme","className","style","onClick","remoteData","setRemoteData","loading","setLoading","loadError","setLoadError","flash","setFlash","tooltipOpen","setTooltipOpen","lastRangeRef","fetchData","useCallback","response","error","merged","source","safeType","angles","rawVal","rawTarget","ri","activeColor","tooltip","parts","sharedProps","mode"],"mappings":"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"}
|