chartgpu 0.1.8 → 0.1.9

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.
@@ -0,0 +1,626 @@
1
+ (function(){"use strict";function Yi(e){return typeof HTMLCanvasElement<"u"&&e instanceof HTMLCanvasElement}function Ds(e){if(Yi(e)){const i=e.clientWidth||e.width||0,r=e.clientHeight||e.height||0;if(!Number.isFinite(i)||!Number.isFinite(r))throw new Error(`GPUContext: Invalid canvas dimensions detected: width=${e.clientWidth||e.width}, height=${e.clientHeight||e.height}. Canvas must have finite dimensions. Ensure canvas is properly sized before initialization.`);return{width:i,height:r}}const t=e.width,n=e.height;if(!Number.isFinite(t)||!Number.isFinite(n))throw new Error(`GPUContext: Invalid OffscreenCanvas dimensions: width=${t}, height=${n}. OffscreenCanvas must be initialized with finite dimensions before GPUContext creation.`);return{width:t,height:n}}function Us(e,t){const n=(t==null?void 0:t.devicePixelRatio)??(typeof window<"u"?window.devicePixelRatio:1),i=Number.isFinite(n)&&n>0?n:1,r=(t==null?void 0:t.alphaMode)??"opaque",s=(t==null?void 0:t.powerPreference)??"high-performance";return{adapter:null,device:null,initialized:!1,canvas:e||null,canvasContext:null,preferredFormat:null,devicePixelRatio:i,alphaMode:r,powerPreference:s}}async function Ls(e){var i,r;const t=Number.isFinite(e.devicePixelRatio)&&e.devicePixelRatio>0?e.devicePixelRatio:1;if(!navigator.gpu)throw new Error("WebGPU is not available in this browser. Please use a browser that supports WebGPU (Chrome 113+, Edge 113+, or Safari 18+). Ensure WebGPU is enabled in browser flags if needed.");let n=null;try{const s=await navigator.gpu.requestAdapter({powerPreference:e.powerPreference});if(!s)throw new Error("Failed to request WebGPU adapter. No compatible adapter found. This may occur if no GPU is available or WebGPU is disabled.");if(n=await s.requestDevice(),!n)throw new Error("Failed to request WebGPU device from adapter.");n.addEventListener("uncapturederror",l=>{console.error("WebGPU uncaptured error:",l.error)});let o=null,c=null;if(e.canvas){const l=e.canvas.getContext("webgpu");if(!l){try{n.destroy()}catch(v){console.warn("Error destroying device during canvas setup failure:",v)}throw new Error("Failed to get WebGPU context from canvas.")}const{width:u,height:h}=Ds(e.canvas),f=t,a=Math.floor(u*f),F=Math.floor(h*f),M=n.limits.maxTextureDimension2D,S=Math.max(1,Math.min(a,M)),m=Math.max(1,Math.min(F,M));e.canvas.width=S,e.canvas.height=m,c=((r=(i=navigator.gpu).getPreferredCanvasFormat)==null?void 0:r.call(i))||"bgra8unorm",l.configure({device:n,format:c,alphaMode:e.alphaMode}),o=l}return{adapter:s,device:n,initialized:!0,canvas:e.canvas,canvasContext:o,preferredFormat:c,devicePixelRatio:t,alphaMode:e.alphaMode,powerPreference:e.powerPreference}}catch(s){if(n)try{n.destroy()}catch(o){console.warn("Error destroying device during initialization failure:",o)}throw s instanceof Error?s:new Error(`Failed to initialize GPUContext: ${String(s)}`)}}function _s(e){if(e.device)try{e.device.destroy()}catch(t){console.warn("Error destroying GPU device:",t)}return{adapter:null,device:null,initialized:!1,canvas:e.canvas,canvasContext:null,preferredFormat:null,devicePixelRatio:e.devicePixelRatio,alphaMode:e.alphaMode,powerPreference:e.powerPreference}}function qi(e){return Array.isArray(e)}function ai(e){if(!e)throw new TypeError("packDataPoints: points parameter is required");if(!Array.isArray(e))throw new TypeError("packDataPoints: points must be an array");if(e.length===0)return new Float32Array(0);const t=268435456;if(e.length>t)throw new RangeError(`packDataPoints: points array too large (${e.length} points). Maximum supported: ${t.toLocaleString()} points (2GB buffer limit)`);const n=new ArrayBuffer(e.length*2*4),i=new Float32Array(n);for(let r=0;r<e.length;r++){const s=e[r];if(s==null)throw new TypeError(`packDataPoints: Invalid point at index ${r}. Expected DataPoint (tuple or object), got ${s}`);const o=qi(s)?s[0]:s.x,c=qi(s)?s[1]:s.y;if(typeof o!="number"||typeof c!="number")throw new TypeError(`packDataPoints: Invalid coordinate values at index ${r}. Expected numbers, got x=${typeof o}, y=${typeof c}`);i[r*2+0]=o,i[r*2+1]=c}return i}const Nn=4;function ci(e){return e+3&-4}function Gs(e){if(!Number.isFinite(e)||e<=0)return 1;const t=Math.ceil(e);return 2**Math.ceil(Math.log2(t))}function Zi(e,t){const n=Math.max(Nn,ci(t)),i=Math.max(Nn,Gs(n));return Math.max(e,i)}function ji(e,t){let n=e>>>0;for(let i=0;i<t.length;i++)n^=t[i],n=Math.imul(n,16777619)>>>0;return n>>>0}function Ki(e){const t=new Uint32Array(e.buffer,e.byteOffset,e.byteLength/4);return ji(2166136261,t)}function Ws(e){const t=new Map;let n=!1;const i=()=>{if(n)throw new Error("DataStore is disposed.")},r=a=>{i();const F=t.get(a);if(!F)throw new Error(`Series ${a} has no data. Call setSeries(${a}, data) first.`);return F};return{setSeries:(a,F)=>{i();const M=ai(F),S=F.length,m=Ki(M),v=ci(M.byteLength),g=Math.max(Nn,v),x=t.get(a);if(x&&x.pointCount===S&&x.hash32===m)return;let p=(x==null?void 0:x.buffer)??null,d=(x==null?void 0:x.capacityBytes)??0;if(!p||g>d){const N=e.limits.maxBufferSize;if(g>N)throw new Error(`DataStore.setSeries(${a}): required buffer size ${g} exceeds device.limits.maxBufferSize (${N}).`);if(p)try{p.destroy()}catch{}const w=Zi(d,g);w>N?d=g:d=w,p=e.createBuffer({size:d,usage:GPUBufferUsage.VERTEX|GPUBufferUsage.COPY_DST})}M.byteLength>0&&e.queue.writeBuffer(p,0,M.buffer),t.set(a,{buffer:p,capacityBytes:d,pointCount:S,hash32:m,data:F.length===0?[]:F.slice()})},appendSeries:(a,F)=>{if(i(),!F||F.length===0)return;const M=r(a),S=M.pointCount,m=S+F.length,v=ai(F),g=v.byteLength,x=ci(m*2*4),y=Math.max(Nn,x);let p=M.buffer,d=M.capacityBytes;const N=M.data;N.push(...F);const w=e.limits.maxBufferSize;if(y>d){if(y>w)throw new Error(`DataStore.appendSeries(${a}): required buffer size ${y} exceeds device.limits.maxBufferSize (${w}).`);try{p.destroy()}catch{}const P=Zi(d,y);d=P>w?y:P,p=e.createBuffer({size:d,usage:GPUBufferUsage.VERTEX|GPUBufferUsage.COPY_DST});const C=ai(N);C.byteLength>0&&e.queue.writeBuffer(p,0,C.buffer),t.set(a,{buffer:p,capacityBytes:d,pointCount:m,hash32:Ki(C),data:N});return}if(g>0){const P=S*2*4;e.queue.writeBuffer(p,P,v.buffer)}const T=new Uint32Array(v.buffer,v.byteOffset,v.byteLength/4),R=ji(M.hash32,T);t.set(a,{buffer:p,capacityBytes:d,pointCount:m,hash32:R,data:N})},removeSeries:a=>{i();const F=t.get(a);if(F){try{F.buffer.destroy()}catch{}t.delete(a)}},getSeriesBuffer:a=>r(a).buffer,getSeriesPointCount:a=>r(a).pointCount,getSeriesData:a=>r(a).data,dispose:()=>{if(!n){n=!0;for(const a of t.values())try{a.buffer.destroy()}catch{}t.clear()}}}}function Ut(e){return Array.isArray(e)}function $s(e,t){const n=e.length>>>1,i=n-1;if(t<=0||n===0)return new Int32Array(0);if(t===1)return new Int32Array([0]);if(t===2)return n>=2?new Int32Array([0,i]):new Int32Array([0]);if(n<=t){const h=new Int32Array(n);for(let f=0;f<n;f++)h[f]=f;return h}const r=new Int32Array(t);r[0]=0,r[t-1]=i;const s=(n-2)/(t-2);let o=0,c=1;const l=e[i*2+0],u=e[i*2+1];for(let h=0;h<t-2;h++){let f=Math.floor(s*h)+1,a=Math.min(Math.floor(s*(h+1))+1,i);f>=a&&(f=Math.min(f,i-1),a=Math.min(f+1,i));const F=Math.floor(s*(h+1))+1,M=Math.min(Math.floor(s*(h+2))+1,i);let S=l,m=u;if(F<M){let p=0,d=0,N=0;for(let w=F;w<M;w++)p+=e[w*2+0],d+=e[w*2+1],N++;N>0&&(S=p/N,m=d/N)}const v=e[o*2+0],g=e[o*2+1];let x=-1,y=f;for(let p=f;p<a;p++){const d=e[p*2+0],N=e[p*2+1],w=(v-S)*(N-g)-(v-d)*(m-g),T=w<0?-w:w;T>x&&(x=T,y=p)}r[c++]=y,o=y}return r}function ks(e,t){const n=e.length,i=n-1;if(t<=0||n===0)return new Int32Array(0);if(t===1)return new Int32Array([0]);if(t===2)return n>=2?new Int32Array([0,i]):new Int32Array([0]);if(n<=t){const f=new Int32Array(n);for(let a=0;a<n;a++)f[a]=a;return f}const r=new Int32Array(t);r[0]=0,r[t-1]=i;const s=(n-2)/(t-2);let o=0,c=1;const l=e[i],u=Ut(l)?l[0]:l.x,h=Ut(l)?l[1]:l.y;for(let f=0;f<t-2;f++){let a=Math.floor(s*f)+1,F=Math.min(Math.floor(s*(f+1))+1,i);a>=F&&(a=Math.min(a,i-1),F=Math.min(a+1,i));const M=Math.floor(s*(f+1))+1,S=Math.min(Math.floor(s*(f+2))+1,i);let m=u,v=h;if(M<S){let N=0,w=0,T=0;for(let R=M;R<S;R++){const P=e[R],C=Ut(P)?P[0]:P.x,E=Ut(P)?P[1]:P.y;N+=C,w+=E,T++}T>0&&(m=N/T,v=w/T)}const g=e[o],x=Ut(g)?g[0]:g.x,y=Ut(g)?g[1]:g.y;let p=-1,d=a;for(let N=a;N<F;N++){const w=e[N],T=Ut(w)?w[0]:w.x,R=Ut(w)?w[1]:w.y,P=(x-m)*(R-y)-(x-T)*(v-y),C=P<0?-P:P;C>p&&(p=C,d=N)}r[c++]=d,o=d}return r}function Os(e,t){const n=Math.floor(t);if(e instanceof Float32Array){const o=e.length>>>1;if(n<=0||o===0)return new Float32Array(0);if(o<=n)return e;const c=$s(e,n),l=new Float32Array(c.length*2);for(let u=0;u<c.length;u++){const h=c[u];l[u*2+0]=e[h*2+0],l[u*2+1]=e[h*2+1]}return l}const i=e.length;if(n<=0||i===0)return[];if(i<=n)return e;const r=ks(e,n),s=new Array(r.length);for(let o=0;o<r.length;o++)s[o]=e[r[o]];return s}function Ji(e){return Array.isArray(e)}function Qi(e){return Ji(e)?{x:e[0],y:e[1]}:{x:e.x,y:e.y}}function Vs(e){return Ji(e)?e[2]:e.size}function er(e){const t=Math.floor(e);return Number.isFinite(t)?t:0}function li(e,t,n){const i=e.length,r=er(t);if(r<=0||i===0)return[];if(r===1)return[e[0]];if(r===2)return i>=2?[e[0],e[i-1]]:[e[0]];if(i<=r)return e;const s=i-1,o=new Array(r);o[0]=e[0],o[r-1]=e[s];const c=(i-2)/(r-2);for(let l=0;l<r-2;l++){let u=Math.floor(c*l)+1,h=Math.min(Math.floor(c*(l+1))+1,s);u>=h&&(u=Math.min(u,s-1),h=Math.min(u+1,s));let f=null;if(n==="average"){let a=0,F=0,M=0,S=0,m=0;for(let v=u;v<h;v++){const g=e[v],{x,y}=Qi(g);if(!Number.isFinite(x)||!Number.isFinite(y))continue;a+=x,F+=y,S++;const p=Vs(g);typeof p=="number"&&Number.isFinite(p)&&(M+=p,m++)}if(S>0){const v=a/S,g=F/S;m>0?f=[v,g,M/m]:f=[v,g]}}else{let a=n==="max"?Number.NEGATIVE_INFINITY:Number.POSITIVE_INFINITY;for(let F=u;F<h;F++){const M=e[F],{y:S}=Qi(M);Number.isFinite(S)&&(n==="max"?S>a&&(a=S,f=M):S<a&&(a=S,f=M))}}o[l+1]=f??e[u]}return o}function Qt(e,t,n){const i=er(n);if(t==="none"||!(i>0)||e.length<=i)return e;switch(t){case"lttb":return Os(e,i);case"average":return li(e,i,"average");case"max":return li(e,i,"max");case"min":return li(e,i,"min");default:return e}}function Xs(e){return Array.isArray(e)}function ui(e,t){const n=Math.floor(t),i=e.length;if(n<2||i<=n)return e;const r=new Array(n);if(r[0]=e[0],r[n-1]=e[i-1],n===2)return r;const s=Xs(e[0]),o=(i-2)/(n-2);if(s){const c=e;for(let l=0;l<n-2;l++){let u=Math.floor(o*l)+1,h=Math.min(Math.floor(o*(l+1))+1,i-1);u>=h&&(u=Math.min(u,i-2),h=Math.min(u+1,i-1));const f=c[u],a=c[h-1],F=f[0],M=f[1],S=a[2];let m=-1/0,v=1/0;for(let g=u;g<h;g++){const x=c[g],y=x[3],p=x[4];p>m&&(m=p),y<v&&(v=y)}r[l+1]=[F,M,S,v,m]}}else{const c=e;for(let l=0;l<n-2;l++){let u=Math.floor(o*l)+1,h=Math.min(Math.floor(o*(l+1))+1,i-1);u>=h&&(u=Math.min(u,i-2),h=Math.min(u+1,i-1));const f=c[u],a=c[h-1],F=f.timestamp,M=f.open,S=a.close;let m=-1/0,v=1/0;for(let g=u;g<h;g++){const x=c[g],y=x.high,p=x.low;y>m&&(m=y),p<v&&(v=p)}r[l+1]={timestamp:F,open:M,close:S,low:v,high:m}}}return r}var Mn=`// grid.wgsl
2
+ // Minimal grid line shader:
3
+ // - Vertex input: vec2<f32> position in clip-space coordinates
4
+ // - Uniforms: identity transform + solid RGBA color
5
+
6
+ struct VSUniforms {
7
+ transform: mat4x4<f32>,
8
+ };
9
+
10
+ @group(0) @binding(0) var<uniform> vsUniforms: VSUniforms;
11
+
12
+ struct FSUniforms {
13
+ color: vec4<f32>,
14
+ };
15
+
16
+ @group(0) @binding(1) var<uniform> fsUniforms: FSUniforms;
17
+
18
+ struct VSIn {
19
+ @location(0) position: vec2<f32>,
20
+ };
21
+
22
+ struct VSOut {
23
+ @builtin(position) clipPosition: vec4<f32>,
24
+ };
25
+
26
+ @vertex
27
+ fn vsMain(in: VSIn) -> VSOut {
28
+ var out: VSOut;
29
+ out.clipPosition = vsUniforms.transform * vec4<f32>(in.position, 0.0, 1.0);
30
+ return out;
31
+ }
32
+
33
+ @fragment
34
+ fn fsMain() -> @location(0) vec4<f32> {
35
+ return fsUniforms.color;
36
+ }
37
+ `;const zs="vsMain",Hs="fsMain",Ys=e=>Number.isInteger(e)&&e>0&&(e&e-1)===0,qs=(e,t)=>{if(!Number.isFinite(e)||e<0)throw new Error(`alignTo(value): value must be a finite non-negative number. Received: ${String(e)}`);if(!Ys(t))throw new Error(`alignTo(alignment): alignment must be a positive power of two. Received: ${String(t)}`);return Math.floor(e)+t-1&~(t-1)},tr=(e,t)=>"module"in t?{module:t.module,entryPoint:t.entryPoint||"",constants:t.constants}:{module:Zs(e,t.code,t.label),entryPoint:t.entryPoint||"",constants:t.constants};function Zs(e,t,n){if(typeof t!="string"||t.length===0)throw new Error("createShaderModule(code): WGSL code must be a non-empty string.");return e.createShaderModule({code:t,label:n})}function pt(e,t){const n=t.layout??(t.bindGroupLayouts?e.createPipelineLayout({bindGroupLayouts:[...t.bindGroupLayouts]}):"auto"),i=tr(e,t.vertex),r=i.entryPoint||zs;let s;if(t.fragment){const l=tr(e,t.fragment),u=l.entryPoint||Hs;let h=t.fragment.targets;if(!h){const f=t.fragment.formats;if(!f)throw new Error("createRenderPipeline(fragment): provide either `fragment.targets` or `fragment.formats` when a fragment stage is present.");h=(Array.isArray(f)?f:[f]).map(F=>({format:F,blend:t.fragment.blend,writeMask:t.fragment.writeMask}))}s={module:l.module,entryPoint:u,targets:[...h],constants:l.constants}}const o=t.primitive??{topology:"triangle-list"},c=t.multisample??{count:1};return e.createRenderPipeline({label:t.label,layout:n,vertex:{module:i.module,entryPoint:r,buffers:t.vertex.buffers?[...t.vertex.buffers]:[],constants:i.constants},fragment:s,primitive:o,depthStencil:t.depthStencil,multisample:c})}function ke(e,t,n){if(!Number.isFinite(t)||t<=0)throw new Error(`createUniformBuffer(size): size must be a positive number. Received: ${String(t)}`);const i=(n==null?void 0:n.alignment)??16,r=qs(t,Math.max(4,i)),s=e.limits.maxUniformBufferBindingSize;if(r>s)throw new Error(`createUniformBuffer(size): requested size ${r} exceeds device.limits.maxUniformBufferBindingSize (${s}).`);return e.createBuffer({label:n==null?void 0:n.label,size:r,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST})}function Ue(e,t,n){const i=n instanceof ArrayBuffer?{arrayBuffer:n,offset:0,size:n.byteLength}:{arrayBuffer:n.buffer,offset:n.byteOffset,size:n.byteLength};if(i.size!==0){if(i.offset&3||i.size&3)throw new Error(`writeUniformBuffer(data): data byteOffset (${i.offset}) and byteLength (${i.size}) must be multiples of 4 for queue.writeBuffer().`);if(i.size>t.size)throw new Error(`writeUniformBuffer(data): data byteLength (${i.size}) exceeds buffer.size (${t.size}).`);e.queue.writeBuffer(t,0,i.arrayBuffer,i.offset,i.size)}}const nr=e=>Math.min(1,Math.max(0,e)),ir=e=>Math.min(255,Math.max(0,e)),kt=e=>{const t=Number.parseInt(e,16);return Number.isFinite(t)?t:0},Ot=e=>{const t=Number.parseInt(e,16);return Number.isFinite(t)?t:0},js=e=>{const t=e.trim();if(!t.startsWith("#"))return null;const n=t.slice(1);if(n.length===3){const i=kt(n[0]),r=kt(n[1]),s=kt(n[2]);return[i*17/255,r*17/255,s*17/255,1]}if(n.length===4){const i=kt(n[0]),r=kt(n[1]),s=kt(n[2]),o=kt(n[3]);return[i*17/255,r*17/255,s*17/255,o*17/255]}if(n.length===6){const i=Ot(n.slice(0,2)),r=Ot(n.slice(2,4)),s=Ot(n.slice(4,6));return[i/255,r/255,s/255,1]}if(n.length===8){const i=Ot(n.slice(0,2)),r=Ot(n.slice(2,4)),s=Ot(n.slice(4,6)),o=Ot(n.slice(6,8));return[i/255,r/255,s/255,o/255]}return null},en=e=>{const t=e.trim();if(t.length===0)return null;if(t.endsWith("%")){const i=Number.parseFloat(t.slice(0,-1));return Number.isFinite(i)?ir(i/100*255):null}const n=Number.parseFloat(t);return Number.isFinite(n)?ir(n):null},Ks=e=>{const t=e.trim();if(t.length===0)return null;if(t.endsWith("%")){const i=Number.parseFloat(t.slice(0,-1));return Number.isFinite(i)?nr(i/100):null}const n=Number.parseFloat(t);return Number.isFinite(n)?nr(n):null},Js=e=>{const t=e.trim(),n=/^(rgba?|RGBA?)\(\s*([^\)]*)\s*\)$/.exec(t);if(!n)return null;const i=n[1].toLowerCase(),s=n[2].split(",").map(o=>o.trim());if(i==="rgb"){if(s.length!==3)return null;const o=en(s[0]),c=en(s[1]),l=en(s[2]);return o==null||c==null||l==null?null:[o/255,c/255,l/255,1]}if(i==="rgba"){if(s.length!==4)return null;const o=en(s[0]),c=en(s[1]),l=en(s[2]),u=Ks(s[3]);return o==null||c==null||l==null||u==null?null:[o/255,c/255,l/255,u]}return null},je=e=>{if(typeof e!="string")return null;const t=e.trim();if(t.length===0)return null;const n=js(t);if(n)return n;const i=Js(t);return i||null},Qs=(e,t={r:0,g:0,b:0,a:1})=>{const n=je(e);if(!n)return t;const[i,r,s,o]=n;return{r:i,g:r,b:s,a:o}},eo="bgra8unorm",to=5,no=6,io=[1,1,1,.8],ro=()=>{const e=new ArrayBuffer(64);return new Float32Array(e).set([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]),e},so=e=>Number.isFinite(e.left)&&Number.isFinite(e.right)&&Number.isFinite(e.top)&&Number.isFinite(e.bottom)&&Number.isFinite(e.canvasWidth)&&Number.isFinite(e.canvasHeight),rr=e=>typeof e=="number"&&Number.isFinite(e)?e:void 0,oo=(e,t)=>{let n=e,i=t;if((!Number.isFinite(n)||!Number.isFinite(i))&&(n=0,i=1),n===i)i=n+1;else if(n>i){const r=n;n=i,i=r}return{min:n,max:i}},ao=(e,t,n,i,r)=>{const{left:s,right:o,top:c,bottom:l,canvasWidth:u,canvasHeight:h}=i,f=Number.isFinite(i.devicePixelRatio)&&i.devicePixelRatio>0?i.devicePixelRatio:1;if(!so(i))throw new Error("AxisRenderer.prepare: gridArea dimensions must be finite numbers.");if(u<=0||h<=0)throw new Error("AxisRenderer.prepare: canvas dimensions must be positive.");if(s<0||o<0||c<0||l<0)throw new Error("AxisRenderer.prepare: gridArea margins must be non-negative.");const a=s*f,F=u-o*f,M=c*f,S=h-l*f,m=a/u*2-1,v=F/u*2-1,g=1-M/h*2,x=1-S/h*2,y=e.tickLength??no;if(!Number.isFinite(y)||y<0)throw new Error("AxisRenderer.prepare: tickLength must be a finite non-negative number.");const p=r??to,d=Math.max(1,Math.floor(p));if(!Number.isFinite(p)||d<1)throw new Error("AxisRenderer.prepare: tickCount must be a finite number >= 1.");const N=y*f,w=N/u*2,T=N/h*2,R=rr(e.min)??(n==="x"?t.invert(m):t.invert(x)),P=rr(e.max)??(n==="x"?t.invert(v):t.invert(g)),C=oo(R,P),E=C.min,D=C.max,L=1+d,U=new Float32Array(L*2*2);let _=0;if(n==="x"){U[_++]=m,U[_++]=x,U[_++]=v,U[_++]=x;const H=x,Z=H-T;for(let X=0;X<d;X++){const ie=d===1?.5:X/(d-1),oe=E+ie*(D-E),q=t.scale(oe);U[_++]=q,U[_++]=H,U[_++]=q,U[_++]=Z}}else{U[_++]=m,U[_++]=x,U[_++]=m,U[_++]=g;const H=m,Z=H-w;for(let X=0;X<d;X++){const ie=d===1?.5:X/(d-1),oe=E+ie*(D-E),q=t.scale(oe);U[_++]=H,U[_++]=q,U[_++]=Z,U[_++]=q}}return U};function sr(e,t){let n=!1;const i=(t==null?void 0:t.targetFormat)??eo,r=e.createBindGroupLayout({entries:[{binding:0,visibility:GPUShaderStage.VERTEX,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.FRAGMENT,buffer:{type:"uniform"}}]}),s=ke(e,64,{label:"axisRenderer/vsUniforms"}),o=ke(e,16,{label:"axisRenderer/fsUniformsLine"}),c=ke(e,16,{label:"axisRenderer/fsUniformsTick"}),l=e.createBindGroup({layout:r,entries:[{binding:0,resource:{buffer:s}},{binding:1,resource:{buffer:o}}]}),u=e.createBindGroup({layout:r,entries:[{binding:0,resource:{buffer:s}},{binding:1,resource:{buffer:c}}]}),h=pt(e,{label:"axisRenderer/pipeline",bindGroupLayouts:[r],vertex:{code:Mn,label:"grid.wgsl",buffers:[{arrayStride:8,stepMode:"vertex",attributes:[{shaderLocation:0,format:"float32x2",offset:0}]}]},fragment:{code:Mn,label:"grid.wgsl",formats:i,blend:{color:{operation:"add",srcFactor:"src-alpha",dstFactor:"one-minus-src-alpha"},alpha:{operation:"add",srcFactor:"one",dstFactor:"one-minus-src-alpha"}}},primitive:{topology:"line-list",cullMode:"none"},multisample:{count:1}});let f=null,a=0;const F=()=>{if(n)throw new Error("AxisRenderer is disposed.")};return{prepare:(v,g,x,y,p,d,N)=>{if(F(),x!=="x"&&x!=="y")throw new Error("AxisRenderer.prepare: orientation must be 'x' or 'y'.");const w=ao(v,g,x,y,N),T=w.byteLength,R=Math.max(4,T);if(!f||f.size<R){if(f)try{f.destroy()}catch{}f=e.createBuffer({label:"axisRenderer/vertexBuffer",size:R,usage:GPUBufferUsage.VERTEX|GPUBufferUsage.COPY_DST})}e.queue.writeBuffer(f,0,w.buffer,0,w.byteLength),a=w.length/2,Ue(e,s,ro());const P=p??"rgba(255,255,255,0.8)",C=d??P,E=je(P)??io,D=je(C)??E,L=new ArrayBuffer(4*4);new Float32Array(L).set([E[0],E[1],E[2],E[3]]),Ue(e,o,L);const U=new ArrayBuffer(4*4);new Float32Array(U).set([D[0],D[1],D[2],D[3]]),Ue(e,c,U)},render:v=>{F(),!(a===0||!f)&&(v.setPipeline(h),v.setVertexBuffer(0,f),v.setBindGroup(0,l),v.draw(Math.min(2,a)),a>2&&(v.setBindGroup(0,u),v.draw(a-2,1,2,0)))},dispose:()=>{if(!n){n=!0;try{s.destroy()}catch{}try{o.destroy()}catch{}try{c.destroy()}catch{}if(f)try{f.destroy()}catch{}f=null,a=0}}}}const co="bgra8unorm",lo=5,uo=6,fo="rgba(255,255,255,0.15)",mo=[1,1,1,.15],ho=()=>{const e=new ArrayBuffer(64);return new Float32Array(e).set([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]),e},po=(e,t,n)=>{const{left:i,right:r,top:s,bottom:o,canvasWidth:c,canvasHeight:l}=e,u=Number.isFinite(e.devicePixelRatio)&&e.devicePixelRatio>0?e.devicePixelRatio:1,h=i*u,f=c-r*u,a=s*u,F=l-o*u,M=f-h,S=F-a,m=t+n,v=new Float32Array(m*2*2);let g=0;for(let x=0;x<t;x++){const y=t===1?.5:x/(t-1),p=a+y*S,d=h/c*2-1,N=f/c*2-1,w=1-p/l*2;v[g++]=d,v[g++]=w,v[g++]=N,v[g++]=w}for(let x=0;x<n;x++){const y=n===1?.5:x/(n-1),d=(h+y*M)/c*2-1,N=1-a/l*2,w=1-F/l*2;v[g++]=d,v[g++]=N,v[g++]=d,v[g++]=w}return v};function bo(e,t){let n=!1;const i=(t==null?void 0:t.targetFormat)??co,r=e.createBindGroupLayout({entries:[{binding:0,visibility:GPUShaderStage.VERTEX,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.FRAGMENT,buffer:{type:"uniform"}}]}),s=ke(e,64,{label:"gridRenderer/vsUniforms"}),o=ke(e,16,{label:"gridRenderer/fsUniforms"}),c=e.createBindGroup({layout:r,entries:[{binding:0,resource:{buffer:s}},{binding:1,resource:{buffer:o}}]}),l=pt(e,{label:"gridRenderer/pipeline",bindGroupLayouts:[r],vertex:{code:Mn,label:"grid.wgsl",buffers:[{arrayStride:8,stepMode:"vertex",attributes:[{shaderLocation:0,format:"float32x2",offset:0}]}]},fragment:{code:Mn,label:"grid.wgsl",formats:i,blend:{color:{operation:"add",srcFactor:"src-alpha",dstFactor:"one-minus-src-alpha"},alpha:{operation:"add",srcFactor:"one",dstFactor:"one-minus-src-alpha"}}},primitive:{topology:"line-list",cullMode:"none"},multisample:{count:1}});let u=null,h=0;const f=()=>{if(n)throw new Error("GridRenderer is disposed.")};return{prepare:(S,m)=>{f();const v=m!=null&&typeof m=="object"&&("lineCount"in m||"color"in m),g=v?m:void 0,x=v?g==null?void 0:g.lineCount:m,y=(x==null?void 0:x.horizontal)??lo,p=(x==null?void 0:x.vertical)??uo,d=(g==null?void 0:g.color)??fo;if(y<0||p<0)throw new Error("GridRenderer.prepare: line counts must be non-negative.");if(!Number.isFinite(S.left)||!Number.isFinite(S.right)||!Number.isFinite(S.top)||!Number.isFinite(S.bottom)||!Number.isFinite(S.canvasWidth)||!Number.isFinite(S.canvasHeight))throw new Error("GridRenderer.prepare: gridArea dimensions must be finite numbers.");if(S.canvasWidth<=0||S.canvasHeight<=0)throw new Error("GridRenderer.prepare: canvas dimensions must be positive.");if(y===0&&p===0){h=0;return}const N=po(S,y,p),w=N.byteLength,T=Math.max(4,w);if(!u||u.size<T){if(u)try{u.destroy()}catch{}u=e.createBuffer({label:"gridRenderer/vertexBuffer",size:T,usage:GPUBufferUsage.VERTEX|GPUBufferUsage.COPY_DST})}e.queue.writeBuffer(u,0,N.buffer,0,N.byteLength),h=(y+p)*2;const R=ho();Ue(e,s,R);const P=je(d)??mo,C=new ArrayBuffer(4*4);new Float32Array(C).set([P[0],P[1],P[2],P[3]]),Ue(e,o,C)},render:S=>{f(),!(h===0||!u)&&(S.setPipeline(l),S.setBindGroup(0,c),S.setVertexBuffer(0,u),S.draw(h))},dispose:()=>{if(!n){n=!0;try{s.destroy()}catch{}try{o.destroy()}catch{}if(u)try{u.destroy()}catch{}u=null,h=0}}}}var or=`// area.wgsl
38
+ // Minimal area-fill shader (triangle-strip):
39
+ // - Vertex input: vec2<f32> position in data coords
40
+ // - Uniforms: clip-space transform + baseline value + solid RGBA color
41
+ // - Topology: triangle-strip
42
+ // - CPU duplicates vertices as p0,p0,p1,p1,... and we use vertex_index parity:
43
+ // even index -> "top" vertex (original y)
44
+ // odd index -> "baseline" vertex (uniform baseline)
45
+
46
+ struct VSUniforms {
47
+ transform: mat4x4<f32>,
48
+ baseline: f32,
49
+ // Pad to 16-byte multiple (uniform buffer layout requirements).
50
+ _pad0: vec3<f32>,
51
+ };
52
+
53
+ @group(0) @binding(0) var<uniform> vsUniforms: VSUniforms;
54
+
55
+ struct FSUniforms {
56
+ color: vec4<f32>,
57
+ };
58
+
59
+ @group(0) @binding(1) var<uniform> fsUniforms: FSUniforms;
60
+
61
+ struct VSIn {
62
+ @location(0) position: vec2<f32>,
63
+ };
64
+
65
+ struct VSOut {
66
+ @builtin(position) clipPosition: vec4<f32>,
67
+ };
68
+
69
+ @vertex
70
+ fn vsMain(in: VSIn, @builtin(vertex_index) vertexIndex: u32) -> VSOut {
71
+ var out: VSOut;
72
+ let useBaseline = (vertexIndex & 1u) == 1u;
73
+ let y = select(in.position.y, vsUniforms.baseline, useBaseline);
74
+ let pos = vec2<f32>(in.position.x, y);
75
+ out.clipPosition = vsUniforms.transform * vec4<f32>(pos, 0.0, 1.0);
76
+ return out;
77
+ }
78
+
79
+ @fragment
80
+ fn fsMain() -> @location(0) vec4<f32> {
81
+ return fsUniforms.color;
82
+ }
83
+
84
+ `;const go="bgra8unorm",ar=e=>Math.min(1,Math.max(0,e)),yo=e=>je(e)??[0,0,0,1],xo=e=>Array.isArray(e),cr=e=>xo(e)?{x:e[0],y:e[1]}:{x:e.x,y:e.y},Fo=e=>{let t=Number.POSITIVE_INFINITY,n=Number.NEGATIVE_INFINITY,i=Number.POSITIVE_INFINITY,r=Number.NEGATIVE_INFINITY;for(let s=0;s<e.length;s++){const{x:o,y:c}=cr(e[s]);!Number.isFinite(o)||!Number.isFinite(c)||(o<t&&(t=o),o>n&&(n=o),c<i&&(i=c),c>r&&(r=c))}return!Number.isFinite(t)||!Number.isFinite(n)||!Number.isFinite(i)||!Number.isFinite(r)?{xMin:0,xMax:1,yMin:0,yMax:1}:(t===n&&(n=t+1),i===r&&(r=i+1),{xMin:t,xMax:n,yMin:i,yMax:r})},lr=(e,t,n)=>{const i=e.scale(t),r=e.scale(n);if(!Number.isFinite(t)||!Number.isFinite(n)||t===n||!Number.isFinite(i)||!Number.isFinite(r))return{a:0,b:Number.isFinite(i)?i:0};const s=(r-i)/(n-t),o=i-s*t;return{a:Number.isFinite(s)?s:0,b:Number.isFinite(o)?o:0}},wo=(e,t,n,i,r)=>{e[0]=t,e[1]=0,e[2]=0,e[3]=0,e[4]=0,e[5]=i,e[6]=0,e[7]=0,e[8]=0,e[9]=0,e[10]=1,e[11]=0,e[12]=n,e[13]=r,e[14]=0,e[15]=1},vo=e=>{const t=e.length,n=new Float32Array(t*2*2);let i=0;for(let r=0;r<t;r++){const{x:s,y:o}=cr(e[r]);n[i++]=s,n[i++]=o,n[i++]=s,n[i++]=o}return n};function No(e,t){let n=!1;const i=(t==null?void 0:t.targetFormat)??go,r=e.createBindGroupLayout({entries:[{binding:0,visibility:GPUShaderStage.VERTEX,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.FRAGMENT,buffer:{type:"uniform"}}]}),s=ke(e,96,{label:"areaRenderer/vsUniforms"}),o=ke(e,16,{label:"areaRenderer/fsUniforms"}),c=new ArrayBuffer(96),l=new Float32Array(c),u=new Float32Array(4),h=e.createBindGroup({layout:r,entries:[{binding:0,resource:{buffer:s}},{binding:1,resource:{buffer:o}}]}),f=pt(e,{label:"areaRenderer/pipeline",bindGroupLayouts:[r],vertex:{code:or,label:"area.wgsl",buffers:[{arrayStride:8,stepMode:"vertex",attributes:[{shaderLocation:0,format:"float32x2",offset:0}]}]},fragment:{code:or,label:"area.wgsl",formats:i,blend:{color:{operation:"add",srcFactor:"src-alpha",dstFactor:"one-minus-src-alpha"},alpha:{operation:"add",srcFactor:"one",dstFactor:"one-minus-src-alpha"}}},primitive:{topology:"triangle-strip",cullMode:"none"},multisample:{count:1}});let a=null,F=0;const M=()=>{if(n)throw new Error("AreaRenderer is disposed.")},S=(x,y,p,d,N)=>{wo(l,x,y,p,d),l[16]=N,l[17]=0,l[18]=0,l[19]=0,l[20]=0,l[21]=0,l[22]=0,l[23]=0,Ue(e,s,c)};return{prepare:(x,y,p,d,N)=>{M();const w=vo(y),T=w.byteLength,R=Math.max(4,T);if(!a||a.size<R){if(a)try{a.destroy()}catch{}a=e.createBuffer({label:"areaRenderer/vertexBuffer",size:R,usage:GPUBufferUsage.VERTEX|GPUBufferUsage.COPY_DST})}w.byteLength>0&&e.queue.writeBuffer(a,0,w.buffer,0,w.byteLength),F=w.length/2;const{xMin:P,xMax:C,yMin:E,yMax:D}=Fo(y),{a:L,b:U}=lr(p,P,C),{a:_,b:H}=lr(d,E,D),Z=Number.isFinite(N??Number.NaN)?N:Number.isFinite(E)?E:0;S(L,U,_,H,Z);const[X,ie,oe,q]=yo(x.areaStyle.color),ee=ar(x.areaStyle.opacity);u[0]=X,u[1]=ie,u[2]=oe,u[3]=ar(q*ee),Ue(e,o,u)},render:x=>{M(),!(!a||F<4)&&(x.setPipeline(f),x.setBindGroup(0,h),x.setVertexBuffer(0,a),x.draw(F))},dispose:()=>{if(!n){if(n=!0,a)try{a.destroy()}catch{}a=null,F=0;try{s.destroy()}catch{}try{o.destroy()}catch{}}}}}var ur=`// line.wgsl
85
+ // Minimal line-strip shader:
86
+ // - Vertex input: vec2<f32> position in data coords
87
+ // - Uniforms: clip-space transform + solid RGBA color
88
+
89
+ struct VSUniforms {
90
+ transform: mat4x4<f32>,
91
+ };
92
+
93
+ @group(0) @binding(0) var<uniform> vsUniforms: VSUniforms;
94
+
95
+ struct FSUniforms {
96
+ color: vec4<f32>,
97
+ };
98
+
99
+ @group(0) @binding(1) var<uniform> fsUniforms: FSUniforms;
100
+
101
+ struct VSIn {
102
+ @location(0) position: vec2<f32>,
103
+ };
104
+
105
+ struct VSOut {
106
+ @builtin(position) clipPosition: vec4<f32>,
107
+ };
108
+
109
+ @vertex
110
+ fn vsMain(in: VSIn) -> VSOut {
111
+ var out: VSOut;
112
+ out.clipPosition = vsUniforms.transform * vec4<f32>(in.position, 0.0, 1.0);
113
+ return out;
114
+ }
115
+
116
+ @fragment
117
+ fn fsMain() -> @location(0) vec4<f32> {
118
+ return fsUniforms.color;
119
+ }
120
+
121
+ `;const Mo="bgra8unorm",fr=e=>Math.min(1,Math.max(0,e)),Io=e=>je(e)??[0,0,0,1],So=e=>Array.isArray(e),Co=e=>So(e)?{x:e[0],y:e[1]}:{x:e.x,y:e.y},To=e=>{let t=Number.POSITIVE_INFINITY,n=Number.NEGATIVE_INFINITY,i=Number.POSITIVE_INFINITY,r=Number.NEGATIVE_INFINITY;for(let s=0;s<e.length;s++){const{x:o,y:c}=Co(e[s]);!Number.isFinite(o)||!Number.isFinite(c)||(o<t&&(t=o),o>n&&(n=o),c<i&&(i=c),c>r&&(r=c))}return!Number.isFinite(t)||!Number.isFinite(n)||!Number.isFinite(i)||!Number.isFinite(r)?{xMin:0,xMax:1,yMin:0,yMax:1}:(t===n&&(n=t+1),i===r&&(r=i+1),{xMin:t,xMax:n,yMin:i,yMax:r})},mr=(e,t,n)=>{const i=e.scale(t),r=e.scale(n);if(!Number.isFinite(t)||!Number.isFinite(n)||t===n||!Number.isFinite(i)||!Number.isFinite(r))return{a:0,b:Number.isFinite(i)?i:0};const s=(r-i)/(n-t),o=i-s*t;return{a:Number.isFinite(s)?s:0,b:Number.isFinite(o)?o:0}},Po=(e,t,n,i,r)=>{e[0]=t,e[1]=0,e[2]=0,e[3]=0,e[4]=0,e[5]=i,e[6]=0,e[7]=0,e[8]=0,e[9]=0,e[10]=1,e[11]=0,e[12]=n,e[13]=r,e[14]=0,e[15]=1};function Ro(e,t){let n=!1;const i=(t==null?void 0:t.targetFormat)??Mo,r=e.createBindGroupLayout({entries:[{binding:0,visibility:GPUShaderStage.VERTEX,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.FRAGMENT,buffer:{type:"uniform"}}]}),s=ke(e,64,{label:"lineRenderer/vsUniforms"}),o=ke(e,16,{label:"lineRenderer/fsUniforms"}),c=new ArrayBuffer(64),l=new Float32Array(c),u=new Float32Array(4),h=e.createBindGroup({layout:r,entries:[{binding:0,resource:{buffer:s}},{binding:1,resource:{buffer:o}}]}),f=pt(e,{label:"lineRenderer/pipeline",bindGroupLayouts:[r],vertex:{code:ur,label:"line.wgsl",buffers:[{arrayStride:8,stepMode:"vertex",attributes:[{shaderLocation:0,format:"float32x2",offset:0}]}]},fragment:{code:ur,label:"line.wgsl",formats:i,blend:{color:{operation:"add",srcFactor:"src-alpha",dstFactor:"one-minus-src-alpha"},alpha:{operation:"add",srcFactor:"one",dstFactor:"one-minus-src-alpha"}}},primitive:{topology:"line-strip",cullMode:"none"},multisample:{count:1}});let a=null,F=0;const M=()=>{if(n)throw new Error("LineRenderer is disposed.")};return{prepare:(g,x,y,p)=>{M(),a=x,F=g.data.length;const{xMin:d,xMax:N,yMin:w,yMax:T}=To(g.data),{a:R,b:P}=mr(y,d,N),{a:C,b:E}=mr(p,w,T);Po(l,R,P,C,E),Ue(e,s,c);const[D,L,U,_]=Io(g.color),H=fr(g.lineStyle.opacity);u[0]=D,u[1]=L,u[2]=U,u[3]=fr(_*H),Ue(e,o,u)},render:g=>{M(),!(!a||F<2)&&(g.setPipeline(f),g.setBindGroup(0,h),g.setVertexBuffer(0,a),g.draw(F))},dispose:()=>{if(!n){n=!0,a=null,F=0;try{s.destroy()}catch{}try{o.destroy()}catch{}}}}}var dr=`// bar.wgsl
122
+ // Instanced bar/rect shader:
123
+ // - Per-instance vertex input:
124
+ // - rect = vec4<f32>(x, y, width, height) in CLIP space
125
+ // - color = vec4<f32>(r, g, b, a) in [0..1]
126
+ // - Draw call: draw(6, instanceCount) using triangle-list expansion in VS
127
+ // - Uniforms:
128
+ // - @group(0) @binding(0): VSUniforms { transform }
129
+
130
+ struct VSUniforms {
131
+ transform: mat4x4<f32>,
132
+ };
133
+
134
+ @group(0) @binding(0) var<uniform> vsUniforms: VSUniforms;
135
+
136
+ struct VSIn {
137
+ // rect.xy = origin, rect.zw = size (width, height)
138
+ @location(0) rect: vec4<f32>,
139
+ @location(1) color: vec4<f32>,
140
+ };
141
+
142
+ struct VSOut {
143
+ @builtin(position) clipPosition: vec4<f32>,
144
+ @location(0) color: vec4<f32>,
145
+ };
146
+
147
+ @vertex
148
+ fn vsMain(in: VSIn, @builtin(vertex_index) vertexIndex: u32) -> VSOut {
149
+ // Fixed local corners for 2 triangles (triangle-list).
150
+ let corners = array<vec2<f32>, 6>(
151
+ vec2<f32>(0.0, 0.0),
152
+ vec2<f32>(1.0, 0.0),
153
+ vec2<f32>(0.0, 1.0),
154
+ vec2<f32>(0.0, 1.0),
155
+ vec2<f32>(1.0, 0.0),
156
+ vec2<f32>(1.0, 1.0)
157
+ );
158
+
159
+ // Normalize negative width/height by computing min/max extents.
160
+ let p0 = in.rect.xy;
161
+ let p1 = in.rect.xy + in.rect.zw;
162
+ let rectMin = min(p0, p1);
163
+ let rectMax = max(p0, p1);
164
+ let rectSize = rectMax - rectMin;
165
+
166
+ let corner = corners[vertexIndex];
167
+ let pos = rectMin + corner * rectSize;
168
+
169
+ var out: VSOut;
170
+ out.clipPosition = vsUniforms.transform * vec4<f32>(pos, 0.0, 1.0);
171
+ out.color = in.color;
172
+ return out;
173
+ }
174
+
175
+ @fragment
176
+ fn fsMain(in: VSOut) -> @location(0) vec4<f32> {
177
+ return in.color;
178
+ }
179
+
180
+ `;const Ao="bgra8unorm",Eo=.01,Bo=.2,In=32,fi=In/4,mi=e=>Math.min(1,Math.max(0,e)),Do=e=>je(e)??[0,0,0,1],hr=e=>{if(!Number.isFinite(e)||e<=0)return 1;const t=Math.ceil(e);return 2**Math.ceil(Math.log2(t))},Uo=()=>{const e=new ArrayBuffer(64);return new Float32Array(e).set([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]),e},Lo=e=>{const t=e.trim().match(/^(\d+(?:\.\d+)?)%$/);if(!t)return null;const n=Number(t[1])/100;return Number.isFinite(n)?n:null},pr=e=>{if(typeof e!="string")return"";const t=e.trim();return t.length>0?t:""},_o=e=>Array.isArray(e),di=e=>_o(e)?{x:e[0],y:e[1]}:{x:e.x,y:e.y},Go=e=>{const t=e.devicePixelRatio;if(!(t>0))return null;const n=e.canvasWidth/t,i=e.canvasHeight/t,r=n-e.left-e.right,s=i-e.top-e.bottom;return!(r>0)||!(s>0)?null:{plotWidthCss:r,plotHeightCss:s}},Wo=e=>{const{left:t,right:n,top:i,bottom:r,canvasWidth:s,canvasHeight:o,devicePixelRatio:c}=e,l=t*c,u=s-n*c,h=i*c,f=o-r*c,a=l/s*2-1,F=u/s*2-1,M=1-h/o*2,S=1-f/o*2;return{left:a,right:F,top:M,bottom:S}},$o=(e,t,n,i)=>{if(Number.isFinite(t)&&t>0){const c=e.scale(0),l=e.scale(0+t),u=Math.abs(l-c);if(Number.isFinite(u)&&u>0)return u}const r=Math.abs(n.right-n.left);if(!(r>0))return 0;const s=Math.max(1,Math.floor(i));return r/s};function ko(e,t){let n=!1;const i=(t==null?void 0:t.targetFormat)??Ao,r=e.createBindGroupLayout({entries:[{binding:0,visibility:GPUShaderStage.VERTEX,buffer:{type:"uniform"}}]}),s=ke(e,64,{label:"barRenderer/vsUniforms"});Ue(e,s,Uo());const o=e.createBindGroup({layout:r,entries:[{binding:0,resource:{buffer:s}}]}),c=pt(e,{label:"barRenderer/pipeline",bindGroupLayouts:[r],vertex:{code:dr,label:"bar.wgsl",buffers:[{arrayStride:In,stepMode:"instance",attributes:[{shaderLocation:0,format:"float32x4",offset:0},{shaderLocation:1,format:"float32x4",offset:16}]}]},fragment:{code:dr,label:"bar.wgsl",formats:i,blend:{color:{operation:"add",srcFactor:"src-alpha",dstFactor:"one-minus-src-alpha"},alpha:{operation:"add",srcFactor:"one",dstFactor:"one-minus-src-alpha"}}},primitive:{topology:"triangle-list",cullMode:"none"},multisample:{count:1}});let l=null,u=0,h=new ArrayBuffer(0),f=new Float32Array(h);const a=[],F=()=>{if(n)throw new Error("BarRenderer is disposed.")},M=d=>{if(d<=f.length)return;const N=Math.max(8,hr(d));h=new ArrayBuffer(N*4),f=new Float32Array(h)},S=d=>{a.length=0;for(let w=0;w<d.length;w++){const T=d[w].data;for(let R=0;R<T.length;R++){const{x:P}=di(T[R]);Number.isFinite(P)&&a.push(P)}}if(a.length<2)return 1;a.sort((w,T)=>w-T);let N=Number.POSITIVE_INFINITY;for(let w=1;w<a.length;w++){const T=a[w]-a[w-1];T>0&&T<N&&(N=T)}return Number.isFinite(N)&&N>0?N:1},m=d=>{let N,w,T;for(let R=0;R<d.length;R++){const P=d[R];N===void 0&&P.barWidth!==void 0&&(N=P.barWidth),w===void 0&&P.barGap!==void 0&&(w=P.barGap),T===void 0&&P.barCategoryGap!==void 0&&(T=P.barCategoryGap)}return{barWidth:N,barGap:w,barCategoryGap:T}},v=d=>{let N=Number.POSITIVE_INFINITY,w=Number.NEGATIVE_INFINITY;for(let T=0;T<d.length;T++){const R=d[T].data;for(let P=0;P<R.length;P++){const{y:C}=di(R[P]);Number.isFinite(C)&&(C<N&&(N=C),C>w&&(w=C))}}return!Number.isFinite(N)||!Number.isFinite(w)||N<=0&&0<=w?0:Math.abs(N)<Math.abs(w)?N:w},g=(d,N,w)=>{const T=N.invert(w.bottom),R=N.invert(w.top),P=Math.min(T,R),C=Math.max(T,R);return!Number.isFinite(P)||!Number.isFinite(C)?v(d):P<=0&&0<=C?0:P>0?P:C<0?C:v(d)};return{prepare:(d,N,w,T,R)=>{if(F(),d.length===0){u=0;return}const P=Go(R);if(!P){u=0;return}const C=Wo(R),E=C.right-C.left,D=P.plotWidthCss>0?E/P.plotWidthCss:0,L=new Map,U=new Array(d.length);let _=0;for(let fe=0;fe<d.length;fe++){const Te=pr(d[fe].stack);if(Te!==""){const Le=L.get(Te);if(Le!==void 0)U[fe]=Le;else{const Be=_++;L.set(Te,Be),U[fe]=Be}}else U[fe]=_++}_=Math.max(1,_);const H=S(d),Z=m(d),X=mi(Z.barGap??Eo),ie=mi(Z.barCategoryGap??Bo);let oe=1;for(let fe=0;fe<d.length;fe++)oe=Math.max(oe,Math.floor(d[fe].data.length));const q=$o(w,H,C,oe),ee=Math.max(0,q*(1-ie)),we=_+Math.max(0,_-1)*X,ve=we>0?ee/we:0;let ue=0;const ne=Z.barWidth;if(typeof ne=="number")ue=Math.max(0,ne)*D,ue=Math.min(ue,ve);else if(typeof ne=="string"){const fe=Lo(ne);ue=fe==null?0:ve*mi(fe)}ue>0||(ue=ve);const be=ue*X,ge=_*ue+Math.max(0,_-1)*be;let Ae=g(d,T,C),de=T.scale(Ae);if(!Number.isFinite(de)){const fe=v(d);if(Ae=fe,de=T.scale(fe),Number.isFinite(de)||(Ae=0,de=T.scale(0)),!Number.isFinite(de)){u=0;return}}let Ne=0;for(let fe=0;fe<d.length;fe++)Ne+=Math.max(0,d[fe].data.length);M(Ne*fi);const re=f;let te=0;const Ee=new Map;for(let fe=0;fe<d.length;fe++){const Te=d[fe],Le=Te.data,[Be,_e,Tt,Ge]=Do(Te.color),Pe=pr(Te.stack),He=U[fe]??0;for(let Ke=0;Ke<Le.length;Ke++){const{x:it,y:We}=di(Le[Ke]),Ft=w.scale(it);if(!Number.isFinite(Ft)||!Number.isFinite(We))continue;const $e=Ft-ge/2+He*(ue+be);let Ye=de,Pt=0;if(Pe!==""){let Je=Ee.get(Pe);Je||(Je=new Map,Ee.set(Pe,Je));let ft;Number.isFinite(q)&&q>0&&Number.isFinite(Ft)?ft=Math.round((Ft-C.left)/q):Number.isFinite(H)&&H>0?ft=Math.round(it/H):ft=Math.round(it*1e6);let Rt=Je.get(ft);Rt||(Rt={posSum:Ae,negSum:Ae},Je.set(ft,Rt));let At,_t;We>=0?(At=Rt.posSum,_t=At+We,Rt.posSum=_t):(At=Rt.negSum,_t=At+We,Rt.negSum=_t);const yn=T.scale(At),sn=T.scale(_t);if(!Number.isFinite(yn)||!Number.isFinite(sn))continue;Ye=yn,Pt=sn-yn}else{const Je=T.scale(We);if(!Number.isFinite(Je))continue;Pt=Je-de}re[te+0]=$e,re[te+1]=Ye,re[te+2]=ue,re[te+3]=Pt,re[te+4]=Be,re[te+5]=_e,re[te+6]=Tt,re[te+7]=Ge,te+=fi}}u=te/fi;const ye=Math.max(4,u*In);if(!l||l.size<ye){const fe=Math.max(Math.max(4,hr(ye)),l?l.size:0);if(l)try{l.destroy()}catch{}l=e.createBuffer({label:"barRenderer/instanceBuffer",size:fe,usage:GPUBufferUsage.VERTEX|GPUBufferUsage.COPY_DST})}u>0&&e.queue.writeBuffer(l,0,h,0,u*In)},render:d=>{F(),!(!l||u===0)&&(d.setPipeline(c),d.setBindGroup(0,o),d.setVertexBuffer(0,l),d.draw(6,u))},dispose:()=>{if(!n){if(n=!0,l)try{l.destroy()}catch{}l=null,u=0;try{s.destroy()}catch{}}}}}var br=`// scatter.wgsl
181
+ // Instanced anti-aliased circle shader (SDF):
182
+ // - Per-instance vertex input:
183
+ // - center = vec2<f32> point center (transformed by VSUniforms.transform)
184
+ // - radiusPx = f32 circle radius in pixels
185
+ // - Draw call: draw(6, instanceCount) using triangle-list expansion in VS
186
+ // - Uniforms:
187
+ // - @group(0) @binding(0): VSUniforms { transform, viewportPx }
188
+ // - @group(0) @binding(1): FSUniforms { color }
189
+ //
190
+ // Notes:
191
+ // - \`viewportPx\` is the current render target size in pixels (width, height).
192
+ // - The quad is expanded in clip space using \`radiusPx\` and \`viewportPx\`.
193
+
194
+ struct VSUniforms {
195
+ transform: mat4x4<f32>,
196
+ viewportPx: vec2<f32>,
197
+ // Pad to 16-byte alignment (mat4x4 is 64B; vec2 adds 8B; pad to 80B).
198
+ _pad0: vec2<f32>,
199
+ };
200
+
201
+ @group(0) @binding(0) var<uniform> vsUniforms: VSUniforms;
202
+
203
+ struct FSUniforms {
204
+ color: vec4<f32>,
205
+ };
206
+
207
+ @group(0) @binding(1) var<uniform> fsUniforms: FSUniforms;
208
+
209
+ struct VSIn {
210
+ @location(0) center: vec2<f32>,
211
+ @location(1) radiusPx: f32,
212
+ };
213
+
214
+ struct VSOut {
215
+ @builtin(position) clipPosition: vec4<f32>,
216
+ @location(0) localPx: vec2<f32>,
217
+ @location(1) radiusPx: f32,
218
+ };
219
+
220
+ @vertex
221
+ fn vsMain(in: VSIn, @builtin(vertex_index) vertexIndex: u32) -> VSOut {
222
+ // Fixed local corners for 2 triangles (triangle-list).
223
+ // \`localNdc\` is a quad in [-1, 1]^2; we convert it to pixel offsets via radiusPx.
224
+ let localNdc = array<vec2<f32>, 6>(
225
+ vec2<f32>(-1.0, -1.0),
226
+ vec2<f32>( 1.0, -1.0),
227
+ vec2<f32>(-1.0, 1.0),
228
+ vec2<f32>(-1.0, 1.0),
229
+ vec2<f32>( 1.0, -1.0),
230
+ vec2<f32>( 1.0, 1.0)
231
+ );
232
+
233
+ let corner = localNdc[vertexIndex];
234
+ let localPx = corner * in.radiusPx;
235
+
236
+ // Convert pixel offset to clip-space offset.
237
+ // Clip space spans [-1, 1] across the viewport, so px -> clip is (2 / viewportPx).
238
+ let localClip = localPx * (2.0 / vsUniforms.viewportPx);
239
+
240
+ let centerClip = (vsUniforms.transform * vec4<f32>(in.center, 0.0, 1.0)).xy;
241
+
242
+ var out: VSOut;
243
+ out.clipPosition = vec4<f32>(centerClip + localClip, 0.0, 1.0);
244
+ out.localPx = localPx;
245
+ out.radiusPx = in.radiusPx;
246
+ return out;
247
+ }
248
+
249
+ @fragment
250
+ fn fsMain(in: VSOut) -> @location(0) vec4<f32> {
251
+ // Signed distance to the circle boundary (negative inside).
252
+ let dist = length(in.localPx) - in.radiusPx;
253
+
254
+ // Analytic-ish AA: smooth edge based on derivative of dist in screen space.
255
+ let w = fwidth(dist);
256
+ let a = 1.0 - smoothstep(0.0, w, dist);
257
+
258
+ // Discard fully outside to avoid unnecessary blending work.
259
+ if (a <= 0.0) {
260
+ discard;
261
+ }
262
+
263
+ return vec4<f32>(fsUniforms.color.rgb, fsUniforms.color.a * a);
264
+ }
265
+
266
+ `;const Oo="bgra8unorm",hi=4,Sn=16,pi=Sn/4,Vo=e=>Math.min(1,Math.max(0,e)),Cn=(e,t,n)=>Math.min(n,Math.max(t,e|0)),Xo=e=>je(e)??[0,0,0,1],gr=e=>{if(!Number.isFinite(e)||e<=0)return 1;const t=Math.ceil(e);return 2**Math.ceil(Math.log2(t))},bi=e=>Array.isArray(e),yr=e=>bi(e)?{x:e[0],y:e[1]}:{x:e.x,y:e.y},zo=e=>{if(bi(e)){const n=e[2];return typeof n=="number"&&Number.isFinite(n)?n:null}const t=e.size;return typeof t=="number"&&Number.isFinite(t)?t:null},Ho=e=>bi(e)?e:[e.x,e.y,e.size],Yo=e=>{let t=Number.POSITIVE_INFINITY,n=Number.NEGATIVE_INFINITY,i=Number.POSITIVE_INFINITY,r=Number.NEGATIVE_INFINITY;for(let s=0;s<e.length;s++){const{x:o,y:c}=yr(e[s]);!Number.isFinite(o)||!Number.isFinite(c)||(o<t&&(t=o),o>n&&(n=o),c<i&&(i=c),c>r&&(r=c))}return!Number.isFinite(t)||!Number.isFinite(n)||!Number.isFinite(i)||!Number.isFinite(r)?{xMin:0,xMax:1,yMin:0,yMax:1}:(t===n&&(n=t+1),i===r&&(r=i+1),{xMin:t,xMax:n,yMin:i,yMax:r})},xr=(e,t,n)=>{const i=e.scale(t),r=e.scale(n);if(!Number.isFinite(t)||!Number.isFinite(n)||t===n||!Number.isFinite(i)||!Number.isFinite(r))return{a:0,b:Number.isFinite(i)?i:0};const s=(r-i)/(n-t),o=i-s*t;return{a:Number.isFinite(s)?s:0,b:Number.isFinite(o)?o:0}},qo=(e,t,n,i,r)=>{e[0]=t,e[1]=0,e[2]=0,e[3]=0,e[4]=0,e[5]=i,e[6]=0,e[7]=0,e[8]=0,e[9]=0,e[10]=1,e[11]=0,e[12]=n,e[13]=r,e[14]=0,e[15]=1},Zo=e=>{const{canvasWidth:t,canvasHeight:n,devicePixelRatio:i}=e,r=e.left*i,s=t-e.right*i,o=e.top*i,c=n-e.bottom*i,l=Cn(Math.floor(r),0,Math.max(0,t)),u=Cn(Math.floor(o),0,Math.max(0,n)),h=Cn(Math.ceil(s),0,Math.max(0,t)),f=Cn(Math.ceil(c),0,Math.max(0,n)),a=Math.max(0,h-l),F=Math.max(0,f-u);return{x:l,y:u,w:a,h:F}};function jo(e,t){let n=!1;const i=(t==null?void 0:t.targetFormat)??Oo,r=e.createBindGroupLayout({entries:[{binding:0,visibility:GPUShaderStage.VERTEX,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.FRAGMENT,buffer:{type:"uniform"}}]}),s=ke(e,80,{label:"scatterRenderer/vsUniforms"}),o=ke(e,16,{label:"scatterRenderer/fsUniforms"}),c=new ArrayBuffer(80),l=new Float32Array(c),u=new Float32Array(4),h=e.createBindGroup({layout:r,entries:[{binding:0,resource:{buffer:s}},{binding:1,resource:{buffer:o}}]}),f=pt(e,{label:"scatterRenderer/pipeline",bindGroupLayouts:[r],vertex:{code:br,label:"scatter.wgsl",buffers:[{arrayStride:Sn,stepMode:"instance",attributes:[{shaderLocation:0,format:"float32x2",offset:0},{shaderLocation:1,format:"float32",offset:8}]}]},fragment:{code:br,label:"scatter.wgsl",formats:i,blend:{color:{operation:"add",srcFactor:"src-alpha",dstFactor:"one-minus-src-alpha"},alpha:{operation:"add",srcFactor:"one",dstFactor:"one-minus-src-alpha"}}},primitive:{topology:"triangle-list",cullMode:"none"},multisample:{count:1}});let a=null,F=0,M=new ArrayBuffer(0),S=new Float32Array(M),m=0,v=0,g=[1,1],x=null;const y=()=>{if(n)throw new Error("ScatterRenderer is disposed.")},p=R=>{if(R<=S.length)return;const P=Math.max(8,gr(R));M=new ArrayBuffer(P*4),S=new Float32Array(M)},d=(R,P,C,E,D,L)=>{const U=Number.isFinite(D)&&D>0?D:1,_=Number.isFinite(L)&&L>0?L:1;qo(l,R,P,C,E),l[16]=U,l[17]=_,l[18]=0,l[19]=0,Ue(e,s,c),g=[U,_]};return{prepare:(R,P,C,E,D)=>{y();const{xMin:L,xMax:U,yMin:_,yMax:H}=Yo(P),{a:Z,b:X}=xr(C,L,U),{a:ie,b:oe}=xr(E,_,H);D?(m=D.canvasWidth,v=D.canvasHeight,d(Z,X,ie,oe,D.canvasWidth,D.canvasHeight),x=Zo(D)):(d(Z,X,ie,oe,g[0],g[1]),x=null);const[q,ee,we,ve]=Xo(R.color);u[0]=q,u[1]=ee,u[2]=we,u[3]=Vo(ve),Ue(e,o,u);const ue=(D==null?void 0:D.devicePixelRatio)??1,ne=ue>0&&Number.isFinite(ue),be=R.symbolSize,ge=typeof be=="function"?re=>{const te=be(Ho(re));return typeof te=="number"&&Number.isFinite(te)?te:hi}:typeof be=="number"&&Number.isFinite(be)?()=>be:()=>hi;p(P.length*pi);const Ae=S;let de=0;for(let re=0;re<P.length;re++){const te=P[re],{x:Ee,y:ye}=yr(te);if(!Number.isFinite(Ee)||!Number.isFinite(ye))continue;const fe=zo(te)??ge(te),Te=Number.isFinite(fe)?Math.max(0,fe):hi,Le=ne?Te*ue:Te;Le>0&&(Ae[de+0]=Ee,Ae[de+1]=ye,Ae[de+2]=Le,Ae[de+3]=0,de+=pi)}F=de/pi;const Ne=Math.max(4,F*Sn);if(!a||a.size<Ne){const re=Math.max(Math.max(4,gr(Ne)),a?a.size:0);if(a)try{a.destroy()}catch{}a=e.createBuffer({label:"scatterRenderer/instanceBuffer",size:re,usage:GPUBufferUsage.VERTEX|GPUBufferUsage.COPY_DST})}a&&F>0&&e.queue.writeBuffer(a,0,M,0,F*Sn)},render:R=>{y(),!(!a||F===0)&&(x&&m>0&&v>0&&R.setScissorRect(x.x,x.y,x.w,x.h),R.setPipeline(f),R.setBindGroup(0,h),R.setVertexBuffer(0,a),R.draw(6,F),x&&m>0&&v>0&&R.setScissorRect(0,0,m,v))},dispose:()=>{if(!n){if(n=!0,a)try{a.destroy()}catch{}a=null,F=0;try{s.destroy()}catch{}try{o.destroy()}catch{}m=0,v=0,g=[1,1],x=null}}}}var Fr=`// pie.wgsl
267
+ // Instanced anti-aliased pie-slice shader (instanced quad + SDF mask).
268
+ //
269
+ // - Per-instance vertex input:
270
+ // - center = vec2<f32> slice center (transformed by VSUniforms.transform)
271
+ // - startAngleRad = f32 start angle in radians
272
+ // - endAngleRad = f32 end angle in radians
273
+ // - radiiPx = vec2<f32>(innerRadiusPx, outerRadiusPx) in *device pixels*
274
+ // - color = vec4<f32> RGBA color in [0..1]
275
+ //
276
+ // - Draw call: draw(6, instanceCount) using triangle-list expansion in VS
277
+ //
278
+ // - Uniforms:
279
+ // - @group(0) @binding(0): VSUniforms { transform, viewportPx }
280
+ //
281
+ // Notes:
282
+ // - The quad is expanded in clip space using \`radiusPx\` and \`viewportPx\`.
283
+ // - Fragment uses an SDF mask for the circle boundary + an angular wedge mask.
284
+ // - Fully outside fragments are discarded to avoid unnecessary blending work.
285
+ //
286
+ // Conventions: matches other shaders in this repo (vsMain/fsMain, group 0 bindings,
287
+ // and explicit uniform padding/alignment where needed).
288
+
289
+ const PI: f32 = 3.141592653589793;
290
+ const TAU: f32 = 6.283185307179586; // 2*pi
291
+
292
+ struct VSUniforms {
293
+ transform: mat4x4<f32>,
294
+ viewportPx: vec2<f32>,
295
+ // Pad to 16-byte alignment (mat4x4 is 64B; vec2 adds 8B; pad to 80B).
296
+ _pad0: vec2<f32>,
297
+ };
298
+
299
+ @group(0) @binding(0) var<uniform> vsUniforms: VSUniforms;
300
+
301
+ struct VSIn {
302
+ @location(0) center: vec2<f32>,
303
+ @location(1) startAngleRad: f32,
304
+ @location(2) endAngleRad: f32,
305
+ @location(3) radiiPx: vec2<f32>, // (innerPx, outerPx)
306
+ @location(4) color: vec4<f32>,
307
+ };
308
+
309
+ struct VSOut {
310
+ @builtin(position) clipPosition: vec4<f32>,
311
+ @location(0) localPx: vec2<f32>,
312
+ @location(1) startAngleRad: f32,
313
+ @location(2) endAngleRad: f32,
314
+ @location(3) radiiPx: vec2<f32>,
315
+ @location(4) color: vec4<f32>,
316
+ };
317
+
318
+ @vertex
319
+ fn vsMain(in: VSIn, @builtin(vertex_index) vertexIndex: u32) -> VSOut {
320
+ // Fixed local corners for 2 triangles (triangle-list).
321
+ // \`localNdc\` is a quad in [-1, 1]^2; we convert it to pixel offsets via radiusPx.
322
+ let localNdc = array<vec2<f32>, 6>(
323
+ vec2<f32>(-1.0, -1.0),
324
+ vec2<f32>( 1.0, -1.0),
325
+ vec2<f32>(-1.0, 1.0),
326
+ vec2<f32>(-1.0, 1.0),
327
+ vec2<f32>( 1.0, -1.0),
328
+ vec2<f32>( 1.0, 1.0)
329
+ );
330
+
331
+ let corner = localNdc[vertexIndex];
332
+ let outerPx = in.radiiPx.y;
333
+ let localPx = corner * outerPx;
334
+
335
+ // Convert pixel offset to clip-space offset.
336
+ // Clip space spans [-1, 1] across the viewport, so px -> clip is (2 / viewportPx).
337
+ let localClip = localPx * (2.0 / vsUniforms.viewportPx);
338
+
339
+ let centerClip = (vsUniforms.transform * vec4<f32>(in.center, 0.0, 1.0)).xy;
340
+
341
+ var out: VSOut;
342
+ out.clipPosition = vec4<f32>(centerClip + localClip, 0.0, 1.0);
343
+ out.localPx = localPx;
344
+ out.startAngleRad = in.startAngleRad;
345
+ out.endAngleRad = in.endAngleRad;
346
+ out.radiiPx = in.radiiPx;
347
+ out.color = in.color;
348
+ return out;
349
+ }
350
+
351
+ fn wrapToTau(theta: f32) -> f32 {
352
+ // Maps theta to [0, TAU). (Input often comes from atan2 in [-PI, PI].)
353
+ return select(theta, theta + TAU, theta < 0.0);
354
+ }
355
+
356
+ @fragment
357
+ fn fsMain(in: VSOut) -> @location(0) vec4<f32> {
358
+ let p = in.localPx;
359
+ let r = length(p);
360
+
361
+ let innerPx = in.radiiPx.x;
362
+ let outerPx = in.radiiPx.y;
363
+
364
+ // --- Radial mask: ring between inner and outer radii (inner==0 => pie) ---
365
+ // Positive inside the ring, negative outside.
366
+ let radialDist = min(r - innerPx, outerPx - r);
367
+ let radialW = fwidth(radialDist);
368
+ let radialA = smoothstep(-radialW, radialW, radialDist);
369
+
370
+ if (radialA <= 0.0) {
371
+ discard;
372
+ }
373
+
374
+ // Compute fragment angle in [0, TAU).
375
+ let angle = wrapToTau(atan2(p.y, p.x));
376
+
377
+ // --- Angular mask: wedge between start/end angles with wrap ---
378
+ let start = in.startAngleRad;
379
+ let end = in.endAngleRad;
380
+
381
+ // Compute span in [0, 2π) with wrap.
382
+ var span = end - start;
383
+ span = span + select(0.0, TAU, span < 0.0);
384
+
385
+ // Compute rel in [0, 2π) with wrap.
386
+ var rel = angle - start;
387
+ rel = rel + select(0.0, TAU, rel < 0.0);
388
+
389
+ let inside = rel <= span;
390
+
391
+ // Signed angular distance (in radians) to nearest boundary.
392
+ // - Inside: +min(rel, span-rel)
393
+ // - Outside: -min(rel-span, 2π-rel)
394
+ let dIn = min(rel, max(span - rel, 0.0));
395
+ let dOutA = max(rel - span, 0.0);
396
+ let dOutB = max(TAU - rel, 0.0);
397
+ let dOut = min(dOutA, dOutB);
398
+
399
+ let signedAngleDist = select(-dOut, dIn, inside);
400
+
401
+ // Convert to approximate pixel distance to the boundary ray.
402
+ // (For small angles, perpendicular distance to a ray ≈ r * angle.)
403
+ let angleDistPx = signedAngleDist * max(r, 1.0);
404
+
405
+ let angW = fwidth(angleDistPx);
406
+ let angularA = smoothstep(-angW, angW, angleDistPx);
407
+
408
+ let aOut = radialA * angularA;
409
+ if (aOut <= 0.0) {
410
+ discard;
411
+ }
412
+
413
+ return vec4<f32>(in.color.rgb, in.color.a * aOut);
414
+ }
415
+
416
+ `;const Ko="bgra8unorm",Tn=40,gi=Tn/4,cn=Math.PI*2,wr=e=>Math.min(1,Math.max(0,e)),Pn=(e,t,n)=>Math.min(n,Math.max(t,e|0)),vr=e=>{if(!Number.isFinite(e)||e<=0)return 1;const t=Math.ceil(e);return 2**Math.ceil(Math.log2(t))},Nr=e=>{if(!Number.isFinite(e))return 0;const t=e%cn;return t<0?t+cn:t},Jo=(e,t)=>{const n=je(e);if(n)return[n[0],n[1],n[2],wr(n[3])];const i=je(t);return i?[i[0],i[1],i[2],wr(i[3])]:[0,0,0,1]},ln=(e,t)=>{if(typeof e=="number")return Number.isFinite(e)?e:null;if(typeof e!="string")return null;const n=e.trim();if(n.length===0)return null;if(n.endsWith("%")){const r=Number.parseFloat(n.slice(0,-1));return Number.isFinite(r)?r/100*t:null}const i=Number.parseFloat(n);return Number.isFinite(i)?i:null},Qo=(e,t,n)=>{const i=(e==null?void 0:e[0])??"50%",r=(e==null?void 0:e[1])??"50%",s=ln(i,t),o=ln(r,n);return{x:Number.isFinite(s)?s:t*.5,y:Number.isFinite(o)?o:n*.5}},ea=e=>Array.isArray(e),ta=(e,t)=>{if(e==null)return{inner:0,outer:t*.7};if(ea(e)){const r=ln(e[0],t),s=ln(e[1],t),o=Math.max(0,Number.isFinite(r)?r:0),c=Math.max(o,Number.isFinite(s)?s:t*.7);return{inner:o,outer:Math.min(t,c)}}const n=ln(e,t),i=Math.max(0,Number.isFinite(n)?n:t*.7);return{inner:0,outer:Math.min(t,i)}},na=e=>{const{canvasWidth:t,canvasHeight:n,devicePixelRatio:i}=e,r=e.left*i,s=t-e.right*i,o=e.top*i,c=n-e.bottom*i,l=Pn(Math.floor(r),0,Math.max(0,t)),u=Pn(Math.floor(o),0,Math.max(0,n)),h=Pn(Math.ceil(s),0,Math.max(0,t)),f=Pn(Math.ceil(c),0,Math.max(0,n)),a=Math.max(0,h-l),F=Math.max(0,f-u);return{x:l,y:u,w:a,h:F}},ia=new Float32Array([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]);function ra(e,t){let n=!1;const i=(t==null?void 0:t.targetFormat)??Ko,r=e.createBindGroupLayout({entries:[{binding:0,visibility:GPUShaderStage.VERTEX,buffer:{type:"uniform"}}]}),s=ke(e,80,{label:"pieRenderer/vsUniforms"}),o=new ArrayBuffer(80),c=new Float32Array(o),l=e.createBindGroup({layout:r,entries:[{binding:0,resource:{buffer:s}}]}),u=pt(e,{label:"pieRenderer/pipeline",bindGroupLayouts:[r],vertex:{code:Fr,label:"pie.wgsl",buffers:[{arrayStride:Tn,stepMode:"instance",attributes:[{shaderLocation:0,format:"float32x2",offset:0},{shaderLocation:1,format:"float32",offset:8},{shaderLocation:2,format:"float32",offset:12},{shaderLocation:3,format:"float32x2",offset:16},{shaderLocation:4,format:"float32x4",offset:24}]}]},fragment:{code:Fr,label:"pie.wgsl",formats:i,blend:{color:{operation:"add",srcFactor:"src-alpha",dstFactor:"one-minus-src-alpha"},alpha:{operation:"add",srcFactor:"one",dstFactor:"one-minus-src-alpha"}}},primitive:{topology:"triangle-list",cullMode:"none"},multisample:{count:1}});let h=null,f=0,a=new ArrayBuffer(0),F=new Float32Array(a),M=0,S=0,m=null;const v=()=>{if(n)throw new Error("PieRenderer is disposed.")},g=N=>{if(N<=F.length)return;const w=Math.max(8,vr(N));a=new ArrayBuffer(w*4),F=new Float32Array(a)},x=(N,w)=>{const T=Number.isFinite(N)&&N>0?N:1,R=Number.isFinite(w)&&w>0?w:1;c.set(ia,0),c[16]=T,c[17]=R,c[18]=0,c[19]=0,Ue(e,s,o)};return{prepare:(N,w)=>{var te;v();const T=w.devicePixelRatio,R=T>0&&Number.isFinite(T)?T:1;M=w.canvasWidth,S=w.canvasHeight,x(w.canvasWidth,w.canvasHeight),m=na(w);const P=w.canvasWidth/R,C=w.canvasHeight/R;if(!(P>0)||!(C>0)){f=0;return}const E=P-w.left-w.right,D=C-w.top-w.bottom;if(!(E>0)||!(D>0)){f=0;return}const L=.5*Math.min(E,D);if(!(L>0)){f=0;return}const U=Qo(N.center,E,D),_=w.left+U.x,H=w.top+U.y,Z=_/P*2-1,X=1-H/C*2;if(!Number.isFinite(Z)||!Number.isFinite(X)){f=0;return}const ie=ta(N.radius,L),oe=Math.max(0,Math.min(ie.inner,ie.outer)),q=Math.max(oe,ie.outer),ee=oe*R,we=q*R;if(!(we>0)){f=0;return}let ve=0,ue=0;for(let Ee=0;Ee<N.data.length;Ee++){const ye=(te=N.data[Ee])==null?void 0:te.value;typeof ye=="number"&&Number.isFinite(ye)&&ye>0&&(ve+=ye,ue++)}if(!(ve>0)||ue===0){f=0;return}g(ue*gi);const ne=F,be=typeof N.startAngle=="number"&&Number.isFinite(N.startAngle)?N.startAngle:90;let ge=Nr(be*Math.PI/180),Ae=0,de=0,Ne=0;for(let Ee=0;Ee<N.data.length;Ee++){const ye=N.data[Ee],fe=ye==null?void 0:ye.value;if(typeof fe!="number"||!Number.isFinite(fe)||fe<=0)continue;Ne++;const Te=Ne===ue;let Be=fe/ve*cn;if(Te?Be=Math.max(0,cn-Ae):Be=Math.max(0,Math.min(cn,Be)),Ae+=Be,!(Be>0))continue;const _e=ge,Tt=Nr(ge+Be);ge=Tt;const[Ge,Pe,He,Ke]=Jo(ye.color,N.color);ne[de+0]=Z,ne[de+1]=X,ne[de+2]=_e,ne[de+3]=Tt,ne[de+4]=ee,ne[de+5]=we,ne[de+6]=Ge,ne[de+7]=Pe,ne[de+8]=He,ne[de+9]=Ke,de+=gi}f=de/gi;const re=Math.max(4,f*Tn);if(!h||h.size<re){const Ee=Math.max(Math.max(4,vr(re)),h?h.size:0);if(h)try{h.destroy()}catch{}h=e.createBuffer({label:"pieRenderer/instanceBuffer",size:Ee,usage:GPUBufferUsage.VERTEX|GPUBufferUsage.COPY_DST})}h&&f>0&&e.queue.writeBuffer(h,0,a,0,f*Tn)},render:N=>{v(),!(!h||f===0)&&(m&&M>0&&S>0&&N.setScissorRect(m.x,m.y,m.w,m.h),N.setPipeline(u),N.setBindGroup(0,l),N.setVertexBuffer(0,h),N.draw(6,f),m&&M>0&&S>0&&N.setScissorRect(0,0,M,S))},dispose:()=>{if(!n){if(n=!0,h)try{h.destroy()}catch{}h=null,f=0;try{s.destroy()}catch{}M=0,S=0,m=null}}}}var Mr=`// candlestick.wgsl
417
+ // Instanced candlestick shader (bodies + wicks):
418
+ // - Per-instance vertex input:
419
+ // - xClip, openClip, closeClip, lowClip, highClip, bodyWidthClip (6 floats)
420
+ // - bodyColor rgba (4 floats)
421
+ // - Draw call: draw(18, instanceCount) using triangle-list expansion in VS
422
+ // - vertices 0-5: body quad (2 triangles)
423
+ // - vertices 6-11: upper wick (2 triangles)
424
+ // - vertices 12-17: lower wick (2 triangles)
425
+ // - Uniforms:
426
+ // - @group(0) @binding(0): VSUniforms { transform, wickWidthClip }
427
+
428
+ struct VSUniforms {
429
+ transform: mat4x4<f32>,
430
+ wickWidthClip: f32,
431
+ _pad0: f32,
432
+ _pad1: f32,
433
+ _pad2: f32,
434
+ };
435
+
436
+ @group(0) @binding(0) var<uniform> vsUniforms: VSUniforms;
437
+
438
+ struct VSIn {
439
+ @location(0) xClip: f32,
440
+ @location(1) openClip: f32,
441
+ @location(2) closeClip: f32,
442
+ @location(3) lowClip: f32,
443
+ @location(4) highClip: f32,
444
+ @location(5) bodyWidthClip: f32,
445
+ @location(6) bodyColor: vec4<f32>,
446
+ };
447
+
448
+ struct VSOut {
449
+ @builtin(position) clipPosition: vec4<f32>,
450
+ @location(0) color: vec4<f32>,
451
+ };
452
+
453
+ @vertex
454
+ fn vsMain(in: VSIn, @builtin(vertex_index) vertexIndex: u32) -> VSOut {
455
+ // Compute body bounds
456
+ let bodyTop = max(in.openClip, in.closeClip);
457
+ let bodyBottom = min(in.openClip, in.closeClip);
458
+ let bodyLeft = in.xClip - in.bodyWidthClip * 0.5;
459
+ let bodyRight = in.xClip + in.bodyWidthClip * 0.5;
460
+
461
+ // Wick bounds
462
+ let wickLeft = in.xClip - vsUniforms.wickWidthClip * 0.5;
463
+ let wickRight = in.xClip + vsUniforms.wickWidthClip * 0.5;
464
+
465
+ var pos: vec2<f32>;
466
+
467
+ if (vertexIndex < 6u) {
468
+ // Body quad (vertices 0-5)
469
+ let corners = array<vec2<f32>, 6>(
470
+ vec2<f32>(0.0, 0.0),
471
+ vec2<f32>(1.0, 0.0),
472
+ vec2<f32>(0.0, 1.0),
473
+ vec2<f32>(0.0, 1.0),
474
+ vec2<f32>(1.0, 0.0),
475
+ vec2<f32>(1.0, 1.0)
476
+ );
477
+ let corner = corners[vertexIndex];
478
+ let bodyMin = vec2<f32>(bodyLeft, bodyBottom);
479
+ let bodyMax = vec2<f32>(bodyRight, bodyTop);
480
+ pos = bodyMin + corner * (bodyMax - bodyMin);
481
+ } else if (vertexIndex < 12u) {
482
+ // Upper wick (vertices 6-11): from bodyTop to highClip
483
+ let idx = vertexIndex - 6u;
484
+ let corners = array<vec2<f32>, 6>(
485
+ vec2<f32>(0.0, 0.0),
486
+ vec2<f32>(1.0, 0.0),
487
+ vec2<f32>(0.0, 1.0),
488
+ vec2<f32>(0.0, 1.0),
489
+ vec2<f32>(1.0, 0.0),
490
+ vec2<f32>(1.0, 1.0)
491
+ );
492
+ let corner = corners[idx];
493
+ let wickMin = vec2<f32>(wickLeft, bodyTop);
494
+ let wickMax = vec2<f32>(wickRight, in.highClip);
495
+ pos = wickMin + corner * (wickMax - wickMin);
496
+ } else {
497
+ // Lower wick (vertices 12-17): from lowClip to bodyBottom
498
+ let idx = vertexIndex - 12u;
499
+ let corners = array<vec2<f32>, 6>(
500
+ vec2<f32>(0.0, 0.0),
501
+ vec2<f32>(1.0, 0.0),
502
+ vec2<f32>(0.0, 1.0),
503
+ vec2<f32>(0.0, 1.0),
504
+ vec2<f32>(1.0, 0.0),
505
+ vec2<f32>(1.0, 1.0)
506
+ );
507
+ let corner = corners[idx];
508
+ let wickMin = vec2<f32>(wickLeft, in.lowClip);
509
+ let wickMax = vec2<f32>(wickRight, bodyBottom);
510
+ pos = wickMin + corner * (wickMax - wickMin);
511
+ }
512
+
513
+ var out: VSOut;
514
+ out.clipPosition = vsUniforms.transform * vec4<f32>(pos, 0.0, 1.0);
515
+ out.color = in.bodyColor;
516
+ return out;
517
+ }
518
+
519
+ @fragment
520
+ fn fsMain(in: VSOut) -> @location(0) vec4<f32> {
521
+ return in.color;
522
+ }
523
+ `;const sa="bgra8unorm",oa=1,tn=40,Vt=tn/4,aa=e=>Math.min(1,Math.max(0,e)),Rn=(e,t,n)=>Math.min(n,Math.max(t,e|0)),un=e=>je(e)??[0,0,0,1],An=e=>{if(!Number.isFinite(e)||e<=0)return 1;const t=Math.ceil(e);return 2**Math.ceil(Math.log2(t))},ca=e=>{const t=e.trim().match(/^(\d+(?:\.\d+)?)%$/);if(!t)return null;const n=Number(t[1])/100;return Number.isFinite(n)?n:null},la=e=>Array.isArray(e),Ir=e=>la(e)?{timestamp:e[0],open:e[1],close:e[2],low:e[3],high:e[4]}:{timestamp:e.timestamp,open:e.open,close:e.close,low:e.low,high:e.high},ua=e=>{const t=e.devicePixelRatio;if(!(t>0))return null;const n=e.canvasWidth/t,i=e.canvasHeight/t,r=n-e.left-e.right,s=i-e.top-e.bottom;return!(r>0)||!(s>0)?null:{plotWidthCss:r,plotHeightCss:s}},fa=e=>{const{left:t,right:n,top:i,bottom:r,canvasWidth:s,canvasHeight:o,devicePixelRatio:c}=e,l=t*c,u=s-n*c,h=i*c,f=o-r*c,a=l/s*2-1,F=u/s*2-1,M=1-h/o*2,S=1-f/o*2;return{left:a,right:F,top:M,bottom:S,width:F-a,height:M-S}},ma=e=>{const{canvasWidth:t,canvasHeight:n,devicePixelRatio:i}=e,r=e.left*i,s=t-e.right*i,o=e.top*i,c=n-e.bottom*i,l=Rn(Math.floor(r),0,Math.max(0,t)),u=Rn(Math.floor(o),0,Math.max(0,n)),h=Rn(Math.ceil(s),0,Math.max(0,t)),f=Rn(Math.ceil(c),0,Math.max(0,n)),a=Math.max(0,h-l),F=Math.max(0,f-u);return{x:l,y:u,w:a,h:F}},da=e=>{const t=[];for(let i=0;i<e.length;i++){const{timestamp:r}=Ir(e[i]);Number.isFinite(r)&&t.push(r)}if(t.length<2)return 1;t.sort((i,r)=>i-r);let n=Number.POSITIVE_INFINITY;for(let i=1;i<t.length;i++){const r=t[i]-t[i-1];r>0&&r<n&&(n=r)}return Number.isFinite(n)&&n>0?n:1},ha=(e,t,n,i)=>{if(Number.isFinite(t)&&t>0){const c=e.scale(0),l=e.scale(0+t),u=Math.abs(l-c);if(Number.isFinite(u)&&u>0)return u}const r=Math.abs(n.width);if(!(r>0))return 0;const s=Math.max(1,Math.floor(i));return r/s},pa=()=>{const e=new ArrayBuffer(64);return new Float32Array(e).set([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]),e};function ba(e,t){let n=!1;const i=(t==null?void 0:t.targetFormat)??sa,r=e.createBindGroupLayout({entries:[{binding:0,visibility:GPUShaderStage.VERTEX,buffer:{type:"uniform"}}]}),s=ke(e,80,{label:"candlestickRenderer/vsUniforms"});Ue(e,s,pa());const o=new ArrayBuffer(80),c=new Float32Array(o),l=e.createBindGroup({layout:r,entries:[{binding:0,resource:{buffer:s}}]}),u=pt(e,{label:"candlestickRenderer/pipeline",bindGroupLayouts:[r],vertex:{code:Mr,label:"candlestick.wgsl",buffers:[{arrayStride:tn,stepMode:"instance",attributes:[{shaderLocation:0,format:"float32",offset:0},{shaderLocation:1,format:"float32",offset:4},{shaderLocation:2,format:"float32",offset:8},{shaderLocation:3,format:"float32",offset:12},{shaderLocation:4,format:"float32",offset:16},{shaderLocation:5,format:"float32",offset:20},{shaderLocation:6,format:"float32x4",offset:24}]}]},fragment:{code:Mr,label:"candlestick.wgsl",formats:i,blend:{color:{operation:"add",srcFactor:"src-alpha",dstFactor:"one-minus-src-alpha"},alpha:{operation:"add",srcFactor:"one",dstFactor:"one-minus-src-alpha"}}},primitive:{topology:"triangle-list",cullMode:"none"},multisample:{count:1}});let h=null,f=0,a=new ArrayBuffer(0),F=new Float32Array(a),M=0,S=0,m=null,v=!1,g=null,x=0,y=new ArrayBuffer(0),p=new Float32Array(y);const d=()=>{if(n)throw new Error("CandlestickRenderer is disposed.")},N=C=>{if(C<=F.length)return;const E=Math.max(8,An(C));a=new ArrayBuffer(E*4),F=new Float32Array(a)},w=C=>{if(C<=p.length)return;const E=Math.max(8,An(C));y=new ArrayBuffer(E*4),p=new Float32Array(y)};return{prepare:(C,E,D,L,U,_)=>{if(d(),E.length===0){f=0,x=0;return}const H=ua(U);if(!H){f=0,x=0;return}const Z=fa(U),X=H.plotWidthCss>0?Z.width/H.plotWidthCss:0;M=U.canvasWidth,S=U.canvasHeight,m=ma(U);const ie=da(E),oe=ha(D,ie,Z,E.length);let q=0;const ee=C.barWidth;if(typeof ee=="number")q=Math.max(0,ee)*X;else if(typeof ee=="string"){const Te=ca(ee);q=Te==null?0:oe*aa(Te)}const we=C.barMinWidth*X,ve=C.barMaxWidth*X;q=Math.min(Math.max(q,we),ve);const ue=C.itemStyle.borderWidth??oa,ne=Math.max(0,ue)*X;c.set([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,ne,0,0,0]),Ue(e,s,o);const be=un(C.itemStyle.upColor),ge=un(C.itemStyle.downColor),Ae=un(C.itemStyle.upBorderColor),de=un(C.itemStyle.downBorderColor),Ne=_?un(_):[0,0,0,1];v=C.style==="hollow",N(E.length*Vt);const re=F;let te=0;v&&w(E.length*Vt);const Ee=p;let ye=0;for(let Te=0;Te<E.length;Te++){const{timestamp:Le,open:Be,close:_e,low:Tt,high:Ge}=Ir(E[Te]);if(!Number.isFinite(Le)||!Number.isFinite(Be)||!Number.isFinite(_e)||!Number.isFinite(Tt)||!Number.isFinite(Ge))continue;const Pe=D.scale(Le),He=L.scale(Be),Ke=L.scale(_e),it=L.scale(Tt),We=L.scale(Ge);if(!Number.isFinite(Pe)||!Number.isFinite(He)||!Number.isFinite(Ke)||!Number.isFinite(it)||!Number.isFinite(We))continue;const Ft=_e>Be;if(v){const $e=Ft?Ae:de;if(re[te+0]=Pe,re[te+1]=He,re[te+2]=Ke,re[te+3]=it,re[te+4]=We,re[te+5]=q,re[te+6]=$e[0],re[te+7]=$e[1],re[te+8]=$e[2],re[te+9]=$e[3],te+=Vt,Ft){const Ye=C.itemStyle.borderWidth*X,Pt=Math.max(0,q-2*Ye);Ee[ye+0]=Pe,Ee[ye+1]=He,Ee[ye+2]=Ke,Ee[ye+3]=it,Ee[ye+4]=We,Ee[ye+5]=Pt,Ee[ye+6]=Ne[0],Ee[ye+7]=Ne[1],Ee[ye+8]=Ne[2],Ee[ye+9]=Ne[3],ye+=Vt}}else{const $e=Ft?be:ge;re[te+0]=Pe,re[te+1]=He,re[te+2]=Ke,re[te+3]=it,re[te+4]=We,re[te+5]=q,re[te+6]=$e[0],re[te+7]=$e[1],re[te+8]=$e[2],re[te+9]=$e[3],te+=Vt}}f=te/Vt,x=ye/Vt;const fe=Math.max(4,f*tn);if(!h||h.size<fe){const Te=Math.max(Math.max(4,An(fe)),h?h.size:0);if(h)try{h.destroy()}catch{}h=e.createBuffer({label:"candlestickRenderer/instanceBuffer",size:Te,usage:GPUBufferUsage.VERTEX|GPUBufferUsage.COPY_DST})}if(f>0&&e.queue.writeBuffer(h,0,a,0,f*tn),v&&x>0){const Te=Math.max(4,x*tn);if(!g||g.size<Te){const Le=Math.max(Math.max(4,An(Te)),g?g.size:0);if(g)try{g.destroy()}catch{}g=e.createBuffer({label:"candlestickRenderer/hollowInstanceBuffer",size:Le,usage:GPUBufferUsage.VERTEX|GPUBufferUsage.COPY_DST})}e.queue.writeBuffer(g,0,y,0,x*tn)}},render:C=>{d(),!(!h||f===0)&&(m&&M>0&&S>0&&C.setScissorRect(m.x,m.y,m.w,m.h),C.setPipeline(u),C.setBindGroup(0,l),C.setVertexBuffer(0,h),C.draw(18,f),v&&g&&x>0&&(C.setVertexBuffer(0,g),C.draw(6,x)),m&&M>0&&S>0&&C.setScissorRect(0,0,M,S))},dispose:()=>{if(!n){if(n=!0,h)try{h.destroy()}catch{}if(h=null,f=0,g)try{g.destroy()}catch{}g=null,x=0;try{s.destroy()}catch{}M=0,S=0,m=null}}}}var Sr=`// crosshair.wgsl
524
+ // Minimal crosshair line shader:
525
+ // - Vertex input: vec2<f32> position in clip-space coordinates
526
+ // - VS uniform: transform mat4 (identity)
527
+ // - FS uniform: solid RGBA color
528
+
529
+ struct VSUniforms {
530
+ transform: mat4x4<f32>,
531
+ };
532
+
533
+ @group(0) @binding(0) var<uniform> vsUniforms: VSUniforms;
534
+
535
+ struct FSUniforms {
536
+ color: vec4<f32>,
537
+ };
538
+
539
+ @group(0) @binding(1) var<uniform> fsUniforms: FSUniforms;
540
+
541
+ struct VSIn {
542
+ @location(0) position: vec2<f32>,
543
+ };
544
+
545
+ struct VSOut {
546
+ @builtin(position) clipPosition: vec4<f32>,
547
+ };
548
+
549
+ @vertex
550
+ fn vsMain(in: VSIn) -> VSOut {
551
+ var out: VSOut;
552
+ out.clipPosition = vsUniforms.transform * vec4<f32>(in.position, 0.0, 1.0);
553
+ return out;
554
+ }
555
+
556
+ @fragment
557
+ fn fsMain() -> @location(0) vec4<f32> {
558
+ return fsUniforms.color;
559
+ }
560
+
561
+ `;const ga=e=>e+3&-4,ya=1024,xa=128,Fa=16384,wa=e=>{if(e.byteOffset&3)throw new Error("createStreamBuffer.write: data.byteOffset must be 4-byte aligned.");return new Uint32Array(e.buffer,e.byteOffset,e.byteLength>>>2)};function va(e,t){if(!Number.isFinite(t)||t<=0)throw new Error(`createStreamBuffer(maxSize): maxSize (bytes) must be a positive number. Received: ${String(t)}`);const n=Math.max(4,Math.floor(t)),i=ga(n),r=e.limits.maxBufferSize;if(i>r)throw new Error(`createStreamBuffer(maxSize): requested size ${i} bytes exceeds device.limits.maxBufferSize (${r}).`);const s=i>>>2,o=g=>({buffer:e.createBuffer({label:g,size:i,usage:GPUBufferUsage.VERTEX|GPUBufferUsage.COPY_DST}),mirror:new Uint32Array(s)}),c=[o("streamBuffer/a"),o("streamBuffer/b")];let l=!1,u=0,h=0;const f=()=>{if(l)throw new Error("createStreamBuffer: StreamBuffer is disposed.")},a=(g,x,y)=>{const p=c[g],d=p.mirror;if(y<0||y>x.length)throw new Error("createStreamBuffer.write: internal error (invalid usedWords).");if(y===0)return;const N=y<<2;e.queue.writeBuffer(p.buffer,0,x.buffer,x.byteOffset,N),d.set(x.subarray(0,y),0)},F=(g,x,y)=>{const p=c[g],d=p.mirror;if(y<0||y>x.length)throw new Error("createStreamBuffer.write: internal error (invalid usedWords).");const N=y<<2;if(N>0&&N<=ya){a(g,x,y);return}const w=[];let T=0,R=0,P=0;for(;P<y;){for(;P<y&&d[P]===x[P];)P++;if(P>=y)break;const C=P;for(P++;P<y&&d[P]!==x[P];)P++;const E=P;if(w.push([C,E]),T++,R+=E-C,T>xa||R>Fa){a(g,x,y);return}}for(let C=0;C<w.length;C++){const[E,D]=w[C],L=E<<2,U=D-E<<2;e.queue.writeBuffer(p.buffer,L,x.buffer,x.byteOffset+L,U),d.set(x.subarray(E,D),E)}};return{write:g=>{if(f(),g.length&1)throw new Error("createStreamBuffer.write: data length must be even (vec2<f32> vertices).");const x=g.byteLength;if(x>i)throw new Error(`createStreamBuffer.write: data.byteLength (${x}) exceeds capacity (${i}). Increase maxSize.`);const y=g.length>>>1;if(x===0){h=y;return}const p=wa(g),d=1-u;F(d,p,p.length),u=d,h=y},getBuffer:()=>(f(),c[u].buffer),getVertexCount:()=>(f(),h),dispose:()=>{if(!l){l=!0,h=0;for(const g of c)try{g.buffer.destroy()}catch{}}}}}const Na="bgra8unorm",Ma=[1,1,1,.8],Ia=8,Sa=6,Ca=4,Cr=8192,Ta=()=>{const e=new ArrayBuffer(64);return new Float32Array(e).set([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]),e},Pa=e=>Number.isFinite(e.left)&&Number.isFinite(e.right)&&Number.isFinite(e.top)&&Number.isFinite(e.bottom)&&Number.isFinite(e.canvasWidth)&&Number.isFinite(e.canvasHeight),En=(e,t,n)=>Math.min(n,Math.max(t,e|0)),Ra=(e,t)=>{if(!Number.isFinite(e)||e<0)throw new Error("CrosshairRenderer.prepare: lineWidth must be a finite non-negative number.");if(e===0)return[];const n=e*t,i=Math.max(1,Math.min(Ia,Math.round(n))),r=(i-1)/2,s=[];for(let o=0;o<i;o++)s.push(o-r);return s},nn=(e,t)=>e/t*2-1,rn=(e,t)=>1-e/t*2,Bn=(e,t)=>{e.push(t[0],t[1],t[2],t[3])},Tr=(e,t)=>{if(!Number.isFinite(e)||!Number.isFinite(t))return[];const n=Math.min(e,t),i=Math.max(e,t);if(i<=n)return[];const r=Sa,o=r+Ca;if(!Number.isFinite(o))return[];const c=Math.ceil((i-n)/o);if(!Number.isFinite(c)||c<=0)return[];const l=[];let u=n;for(;u<i;){const h=u,f=Math.min(u+r,i);f>h&&l.push([h,f]),u+=o}return l},Aa=(e,t,n,i)=>{if(!Number.isFinite(e)||!Number.isFinite(t))throw new Error("CrosshairRenderer.prepare: x and y must be finite numbers.");if(!Pa(n))throw new Error("CrosshairRenderer.prepare: gridArea dimensions must be finite numbers.");if(n.canvasWidth<=0||n.canvasHeight<=0)throw new Error("CrosshairRenderer.prepare: canvas dimensions must be positive.");if(n.left<0||n.right<0||n.top<0||n.bottom<0)throw new Error("CrosshairRenderer.prepare: gridArea margins must be non-negative.");const{canvasWidth:r,canvasHeight:s}=n,o=Number.isFinite(n.devicePixelRatio)&&n.devicePixelRatio>0?n.devicePixelRatio:1,c=n.left*o,l=r-n.right*o,u=n.top*o,h=s-n.bottom*o,f=En(Math.floor(c),0,Math.max(0,r)),a=En(Math.floor(u),0,Math.max(0,s)),F=En(Math.ceil(l),0,Math.max(0,r)),M=En(Math.ceil(h),0,Math.max(0,s)),S=Math.max(0,F-f),m=Math.max(0,M-a),v=e*o,g=t*o,x=Ra(i.lineWidth,o);if(x.length===0||!i.showX&&!i.showY)return{vertices:new Float32Array(0),scissor:{x:f,y:a,w:S,h:m}};const y=[],p=i.showX?Tr(u,h):[],d=i.showY?Tr(c,l):[],w=((i.showX?p.length:0)+(i.showY?d.length:0))*x.length*2,T=w>0&&w<=Cr,R=E=>{const D=nn(E,r),L=rn(u,s),U=rn(h,s);Bn(y,[D,L,D,U])},P=E=>{const D=rn(E,s),L=nn(c,r),U=nn(l,r);Bn(y,[L,D,U,D])};if(i.showX)for(let E=0;E<x.length;E++){const D=v+x[E];if(!T){R(D);continue}const L=nn(D,r);for(let U=0;U<p.length;U++){const[_,H]=p[U],Z=rn(_,s),X=rn(H,s);Bn(y,[L,Z,L,X])}}if(i.showY)for(let E=0;E<x.length;E++){const D=g+x[E];if(!T){P(D);continue}const L=rn(D,s);for(let U=0;U<d.length;U++){const[_,H]=d[U],Z=nn(_,r),X=nn(H,r);Bn(y,[Z,L,X,L])}}return{vertices:new Float32Array(y),scissor:{x:f,y:a,w:S,h:m}}};function Ea(e,t){let n=!1,i=!0;const r=(t==null?void 0:t.targetFormat)??Na,s=e.createBindGroupLayout({entries:[{binding:0,visibility:GPUShaderStage.VERTEX,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.FRAGMENT,buffer:{type:"uniform"}}]}),o=ke(e,64,{label:"crosshairRenderer/vsUniforms"}),c=ke(e,16,{label:"crosshairRenderer/fsUniforms"}),l=e.createBindGroup({layout:s,entries:[{binding:0,resource:{buffer:o}},{binding:1,resource:{buffer:c}}]}),u=pt(e,{label:"crosshairRenderer/pipeline",bindGroupLayouts:[s],vertex:{code:Sr,label:"crosshair.wgsl",buffers:[{arrayStride:8,stepMode:"vertex",attributes:[{shaderLocation:0,format:"float32x2",offset:0}]}]},fragment:{code:Sr,label:"crosshair.wgsl",formats:r,blend:{color:{operation:"add",srcFactor:"src-alpha",dstFactor:"one-minus-src-alpha"},alpha:{operation:"add",srcFactor:"one",dstFactor:"one-minus-src-alpha"}}},primitive:{topology:"line-list",cullMode:"none"},multisample:{count:1}}),h=va(e,Cr*8);let f=0,a=0,F=0,M={x:0,y:0,w:0,h:0};const S=()=>{if(n)throw new Error("CrosshairRenderer is disposed.")};return{prepare:(y,p,d,N)=>{if(S(),typeof N.showX!="boolean"||typeof N.showY!="boolean")throw new Error("CrosshairRenderer.prepare: showX/showY must be boolean.");if(typeof N.color!="string")throw new Error("CrosshairRenderer.prepare: color must be a string.");if(!Number.isFinite(N.lineWidth)||N.lineWidth<0)throw new Error("CrosshairRenderer.prepare: lineWidth must be a finite non-negative number.");const{vertices:w,scissor:T}=Aa(y,p,d,N);w.byteLength===0?f=0:(h.write(w),f=h.getVertexCount()),Ue(e,o,Ta());const R=je(N.color)??Ma,P=new ArrayBuffer(4*4);new Float32Array(P).set([R[0],R[1],R[2],R[3]]),Ue(e,c,P),a=d.canvasWidth,F=d.canvasHeight,M=T},render:y=>{S(),i&&f!==0&&(a<=0||F<=0||(y.setScissorRect(M.x,M.y,M.w,M.h),y.setPipeline(u),y.setBindGroup(0,l),y.setVertexBuffer(0,h.getBuffer()),y.draw(f),y.setScissorRect(0,0,a,F)))},setVisible:y=>{S(),i=!!y},dispose:()=>{if(!n){n=!0;try{o.destroy()}catch{}try{c.destroy()}catch{}h.dispose(),f=0,a=0,F=0,M={x:0,y:0,w:0,h:0}}}}}var Pr=`// highlight.wgsl
562
+ // Draws an anti-aliased ring highlight around a point.
563
+ //
564
+ // Contract:
565
+ // - \`@builtin(position)\` in the fragment stage is framebuffer-space pixels.
566
+ // - The renderer supplies \`center\` and ring sizes in *device pixels*.
567
+
568
+ struct Uniforms {
569
+ center: vec2<f32>,
570
+ radius: f32,
571
+ thickness: f32,
572
+ color: vec4<f32>,
573
+ outlineColor: vec4<f32>,
574
+ };
575
+
576
+ @group(0) @binding(0) var<uniform> u: Uniforms;
577
+
578
+ struct VSOut {
579
+ @builtin(position) position: vec4<f32>,
580
+ };
581
+
582
+ @vertex
583
+ fn vsMain(@builtin(vertex_index) vertexIndex: u32) -> VSOut {
584
+ // Fullscreen triangle.
585
+ // Covers clip-space [-1,1] with 3 verts: (-1,-1), (3,-1), (-1,3)
586
+ let positions = array<vec2<f32>, 3>(
587
+ vec2<f32>(-1.0, -1.0),
588
+ vec2<f32>(3.0, -1.0),
589
+ vec2<f32>(-1.0, 3.0)
590
+ );
591
+
592
+ var out: VSOut;
593
+ out.position = vec4<f32>(positions[vertexIndex], 0.0, 1.0);
594
+ return out;
595
+ }
596
+
597
+ fn ringCoverage(distancePx: f32, radiusPx: f32, thicknessPx: f32) -> f32 {
598
+ let aa = 1.0; // ~1px antialias band (device pixels)
599
+ let halfT = max(0.5, thicknessPx * 0.5);
600
+ let a0 = smoothstep(radiusPx - halfT - aa, radiusPx - halfT + aa, distancePx);
601
+ let a1 = smoothstep(radiusPx + halfT - aa, radiusPx + halfT + aa, distancePx);
602
+ return clamp(a0 - a1, 0.0, 1.0);
603
+ }
604
+
605
+ @fragment
606
+ fn fsMain(@builtin(position) fragPos: vec4<f32>) -> @location(0) vec4<f32> {
607
+ let d = distance(fragPos.xy, u.center);
608
+
609
+ let ring = ringCoverage(d, u.radius, u.thickness);
610
+ let outline = ringCoverage(d, u.radius, u.thickness + 2.0);
611
+
612
+ let cover = max(ring, outline);
613
+ if (cover <= 0.0) {
614
+ discard;
615
+ }
616
+
617
+ // Blend between outline and ring color based on relative coverage,
618
+ // then apply total coverage as alpha.
619
+ let t = clamp(select(0.0, ring / cover, cover > 0.0), 0.0, 1.0);
620
+ let rgb = mix(u.outlineColor.rgb, u.color.rgb, t);
621
+ let a = mix(u.outlineColor.a, u.color.a, t) * cover;
622
+ return vec4<f32>(rgb, a);
623
+ }
624
+
625
+ `;const Ba="bgra8unorm",Da=[1,1,1,1],Dn=e=>Math.min(1,Math.max(0,e)),Un=(e,t,n)=>Math.min(n,Math.max(t,e|0)),Ua=e=>Number.isFinite(e.x)&&Number.isFinite(e.y)&&Number.isFinite(e.w)&&Number.isFinite(e.h),La=(e,t)=>{const n=Number.isFinite(t)?t:1;return[Dn(e[0]*n),Dn(e[1]*n),Dn(e[2]*n),Dn(e[3])]},_a=e=>.2126*e[0]+.7152*e[1]+.0722*e[2];function Ga(e,t){let n=!1,i=!0;const r=(t==null?void 0:t.targetFormat)??Ba,s=e.createBindGroupLayout({entries:[{binding:0,visibility:GPUShaderStage.FRAGMENT,buffer:{type:"uniform"}}]}),o=ke(e,48,{label:"highlightRenderer/uniforms"}),c=e.createBindGroup({layout:s,entries:[{binding:0,resource:{buffer:o}}]}),l=pt(e,{label:"highlightRenderer/pipeline",bindGroupLayouts:[s],vertex:{code:Pr,label:"highlight.wgsl"},fragment:{code:Pr,label:"highlight.wgsl",formats:r,blend:{color:{operation:"add",srcFactor:"src-alpha",dstFactor:"one-minus-src-alpha"},alpha:{operation:"add",srcFactor:"one",dstFactor:"one-minus-src-alpha"}}},primitive:{topology:"triangle-list",cullMode:"none"},multisample:{count:1}});let u=0,h=0,f={x:0,y:0,w:0,h:0},a=!1;const F=()=>{if(n)throw new Error("HighlightRenderer is disposed.")};return{prepare:(g,x,y)=>{if(F(),!Number.isFinite(g.centerDeviceX)||!Number.isFinite(g.centerDeviceY))throw new Error("HighlightRenderer.prepare: point center must be finite.");if(!Number.isFinite(g.canvasWidth)||!Number.isFinite(g.canvasHeight)||g.canvasWidth<=0||g.canvasHeight<=0)throw new Error("HighlightRenderer.prepare: canvasWidth/canvasHeight must be positive finite numbers.");if(!Ua(g.scissor))throw new Error("HighlightRenderer.prepare: scissor must be finite.");if(!Number.isFinite(y)||y<0)throw new Error("HighlightRenderer.prepare: size must be a finite non-negative number.");const p=g.devicePixelRatio,d=Number.isFinite(p)&&p>0?p:1,N=y*d,w=Math.max(1,N*1.5),T=Math.max(1,Math.round(Math.max(2,w*.25))),R=je(x)??Da,P=La(R,1.25),E=_a(R)>.7?[0,0,0,.9]:[1,1,1,.9],D=new ArrayBuffer(12*4);new Float32Array(D).set([g.centerDeviceX,g.centerDeviceY,w,T,P[0],P[1],P[2],1,E[0],E[1],E[2],E[3]]),Ue(e,o,D),u=g.canvasWidth,h=g.canvasHeight;const L=Un(Math.floor(g.scissor.x),0,Math.max(0,g.canvasWidth)),U=Un(Math.floor(g.scissor.y),0,Math.max(0,g.canvasHeight)),_=Un(Math.ceil(g.scissor.x+g.scissor.w),0,Math.max(0,g.canvasWidth)),H=Un(Math.ceil(g.scissor.y+g.scissor.h),0,Math.max(0,g.canvasHeight));f={x:L,y:U,w:Math.max(0,_-L),h:Math.max(0,H-U)},a=!0},render:g=>{F(),i&&a&&(u<=0||h<=0||f.w===0||f.h===0||(g.setScissorRect(f.x,f.y,f.w,f.h),g.setPipeline(l),g.setBindGroup(0,c),g.draw(3),g.setScissorRect(0,0,u,h)))},setVisible:g=>{F(),i=!!g},dispose:()=>{if(!n){n=!0;try{o.destroy()}catch{}u=0,h=0,f={x:0,y:0,w:0,h:0},a=!1}}}}const Wa=6,$a=500;function ka(e,t){let n=!1,i=t;const r={mousemove:new Set,click:new Set,mouseleave:new Set};let s=null,o=null;const c=y=>{const p=e.getBoundingClientRect();if(p.width===0||p.height===0)return null;const d=y.clientX-p.left,N=y.clientY-p.top,w=i.left,T=i.top,R=p.width-i.left-i.right,P=p.height-i.top-i.bottom,C=d-w,E=N-T,D=C>=0&&C<=R&&E>=0&&E<=P;return{x:d,y:N,gridX:C,gridY:E,plotWidthCss:R,plotHeightCss:P,isInGrid:D,originalEvent:y}},l=(y,p)=>{const d=c(p);if(d)for(const N of r[y])N(d)},u=y=>{s&&y.isPrimary&&y.pointerId===s.pointerId&&(s=null)},h=y=>{n||l("mousemove",y)},f=y=>{n||(u(y),l("mouseleave",y))},a=y=>{n||(u(y),l("mouseleave",y))},F=y=>{if(!n){if(o===y.pointerId){o=null;return}u(y),l("mouseleave",y)}},M=y=>{if(n||!y.isPrimary||y.pointerType==="mouse"&&y.button!==0)return;const p=e.getBoundingClientRect();if(!(p.width===0||p.height===0)){s={pointerId:y.pointerId,startClientX:y.clientX,startClientY:y.clientY,startTimeMs:y.timeStamp};try{e.setPointerCapture(y.pointerId)}catch{}}},S=y=>{if(n||!y.isPrimary||!s||y.pointerId!==s.pointerId)return;const p=y.timeStamp-s.startTimeMs,d=y.clientX-s.startClientX,N=y.clientY-s.startClientY,w=d*d+N*N;s=null;try{e.hasPointerCapture(y.pointerId)&&(o=y.pointerId,e.releasePointerCapture(y.pointerId))}catch{}const T=Wa;p<=$a&&w<=T*T&&l("click",y)};return e.addEventListener("pointermove",h,{passive:!0}),e.addEventListener("pointerleave",f,{passive:!0}),e.addEventListener("pointercancel",a,{passive:!0}),e.addEventListener("lostpointercapture",F,{passive:!0}),e.addEventListener("pointerdown",M,{passive:!0}),e.addEventListener("pointerup",S,{passive:!0}),{canvas:e,on:(y,p)=>{n||r[y].add(p)},off:(y,p)=>{r[y].delete(p)},updateGridArea:y=>{i=y},dispose:()=>{n||(n=!0,s=null,o=null,e.removeEventListener("pointermove",h),e.removeEventListener("pointerleave",f),e.removeEventListener("pointercancel",a),e.removeEventListener("lostpointercapture",F),e.removeEventListener("pointerdown",M),e.removeEventListener("pointerup",S),r.mousemove.clear(),r.click.clear(),r.mouseleave.clear())}}}const Rr=(e,t,n)=>Math.min(n,Math.max(t,e)),Oa=(e,t)=>{const n=e.deltaY;if(!Number.isFinite(n)||n===0)return 0;switch(e.deltaMode){case WheelEvent.DOM_DELTA_PIXEL:return n;case WheelEvent.DOM_DELTA_LINE:return n*16;case WheelEvent.DOM_DELTA_PAGE:return n*(Number.isFinite(t)&&t>0?t:800);default:return n}},Va=(e,t)=>{const n=e.deltaX;if(!Number.isFinite(n)||n===0)return 0;switch(e.deltaMode){case WheelEvent.DOM_DELTA_PIXEL:return n;case WheelEvent.DOM_DELTA_LINE:return n*16;case WheelEvent.DOM_DELTA_PAGE:return n*(Number.isFinite(t)&&t>0?t:800);default:return n}},Xa=e=>{const t=Math.abs(e);if(!Number.isFinite(t)||t===0)return 1;const n=Math.min(t,200);return Math.exp(n*.002)},za=e=>e.pointerType==="mouse"&&(e.buttons&4)!==0,Ha=e=>e.pointerType==="mouse"&&e.shiftKey&&(e.buttons&1)!==0;function Ya(e,t){let n=!1,i=!1,r=null,s=!1,o=0;const c=()=>{s=!1,o=0},l=M=>{if(r=M,!i)return;const S=M.originalEvent;if(!(M.isInGrid&&(Ha(S)||za(S)))){c();return}const v=M.plotWidthCss;if(!(v>0)||!Number.isFinite(v)){c();return}if(!s){s=!0,o=M.gridX;return}const g=M.gridX-o;if(o=M.gridX,!Number.isFinite(g)||g===0)return;const{start:x,end:y}=t.getRange(),p=y-x;if(!Number.isFinite(p)||p===0)return;const d=-(g/v)*p;!Number.isFinite(d)||d===0||t.pan(d)},u=M=>{r=null,c()},h=M=>{if(!i||n)return;const S=r;if(!S||!S.isInGrid)return;const m=S.plotWidthCss,v=S.plotHeightCss;if(!(m>0)||!(v>0))return;const g=Oa(M,v),x=Va(M,m);if(Math.abs(x)>Math.abs(g)&&x!==0){const{start:R,end:P}=t.getRange(),C=P-R;if(!Number.isFinite(C)||C===0)return;const E=x/m*C;if(!Number.isFinite(E)||E===0)return;M.preventDefault(),t.pan(E);return}if(g===0)return;const y=Xa(g);if(!(y>1))return;const{start:p,end:d}=t.getRange(),N=d-p;if(!Number.isFinite(N)||N===0)return;const w=Rr(S.gridX/m,0,1),T=Rr(p+w*N,0,100);M.preventDefault(),g<0?t.zoomIn(T,y):t.zoomOut(T,y)},f=()=>{n||i||(i=!0,e.on("mousemove",l),e.on("mouseleave",u),e.canvas.addEventListener("wheel",h,{passive:!1}))},a=()=>{n||!i||(i=!1,e.off("mousemove",l),e.off("mouseleave",u),e.canvas.removeEventListener("wheel",h),r=null,c())};return{enable:f,disable:a,dispose:()=>{n||(a(),n=!0)}}}const qa=.5,Za=100,ot=(e,t,n)=>Math.min(n,Math.max(t,e)),yi=e=>ot(e,0,1),Ar=e=>Object.is(e,-0)?0:e,ja=e=>({start:e.start,end:e.end});function Ka(e,t,n){let i=0,r=100,s=null;const o=new Set;let c=(()=>{const d=Number.isFinite(n==null?void 0:n.minSpan)?n.minSpan:qa;return ot(Number.isFinite(d)?d:0,0,100)})(),l=(()=>{const d=Number.isFinite(n==null?void 0:n.maxSpan)?n.maxSpan:Za;return ot(Number.isFinite(d)?d:100,0,100)})(),u=Math.min(c,l),h=Math.max(c,l);const f=()=>{const d={start:i,end:r};if(s!==null&&s.start===d.start&&s.end===d.end)return;s=ja(d);const N=Array.from(o);for(const w of N)w({start:i,end:r})},a=(d,N,w)=>{if(w){if(typeof w=="string")switch(w){case"start":return{center:d,ratio:0};case"end":return{center:N,ratio:1};case"center":return{center:(d+N)*.5,ratio:.5}}if(w&&Number.isFinite(w.center)&&Number.isFinite(w.ratio))return{center:w.center,ratio:w.ratio}}},F=(d,N,w)=>{if(!Number.isFinite(d)||!Number.isFinite(N))return;let T=d,R=N;if(T>R){const E=T;T=R,R=E}let P=R-T;if(!Number.isFinite(P)||P<0)return;const C=ot(P,u,h);if(C!==P){const E=w!=null&&w.anchor&&Number.isFinite(w.anchor.center)?ot(w.anchor.center,0,100):(T+R)*.5,D=w!=null&&w.anchor&&Number.isFinite(w.anchor.ratio)?yi(w.anchor.ratio):.5;T=E-D*C,R=T+C,P=C}if(P>100&&(T=0,R=100,P=100),T<0){const E=-T;T+=E,R+=E}if(R>100){const E=R-100;T-=E,R-=E}T=ot(T,0,100),R=ot(R,0,100),T=Ar(T),R=Ar(R),!(T===i&&R===r)&&(i=T,r=R,(w==null?void 0:w.emit)!==!1&&f())};return F(e,t,{emit:!1}),{getRange:()=>({start:i,end:r}),setRange:(d,N)=>{F(d,N)},setRangeAnchored:(d,N,w)=>{F(d,N,{anchor:a(d,N,w)})},setSpanConstraints:(d,N)=>{const w=typeof d=="number"&&Number.isFinite(d)?ot(d,0,100):c,T=typeof N=="number"&&Number.isFinite(N)?ot(N,0,100):l;if(w===c&&T===l)return;c=w,l=T,u=Math.min(c,l),h=Math.max(c,l);const R=i,P=r,C=1e-6,E=P>=100-C?"end":R<=0+C?"start":"center";F(R,P,{anchor:a(R,P,E)})},zoomIn:(d,N)=>{if(!Number.isFinite(d)||!Number.isFinite(N)||N<=1)return;const w=ot(d,0,100),T=r-i,R=T===0?.5:yi((w-i)/T),P=T/N,C=w-R*P,E=C+P;F(C,E,{anchor:{center:w,ratio:R}})},zoomOut:(d,N)=>{if(!Number.isFinite(d)||!Number.isFinite(N)||N<=1)return;const w=ot(d,0,100),T=r-i,R=T===0?.5:yi((w-i)/T),P=T*N,C=w-R*P,E=C+P;F(C,E,{anchor:{center:w,ratio:R}})},pan:d=>{Number.isFinite(d)&&F(i+d,r+d)},onChange:d=>(o.add(d),()=>{o.delete(d)})}}const Er=20,Ja=.01,Qa=.2,fn=4,Br=new WeakMap;function ec(e,t,n){return e>=n.left&&e<=n.right&&t>=n.top&&t<=n.bottom}const xi=e=>Math.min(1,Math.max(0,e)),tc=e=>{const t=e.trim().match(/^(\d+(?:\.\d+)?)%$/);if(!t)return null;const n=Number(t[1])/100;return Number.isFinite(n)?n:null},nc=e=>{if(typeof e!="string")return"";const t=e.trim();return t.length>0?t:""},Fi=e=>Array.isArray(e),mn=e=>Fi(e)?{x:e[0],y:e[1]}:{x:e.x,y:e.y},Dr=e=>{if(Fi(e)){const n=e[2];return typeof n=="number"&&Number.isFinite(n)?n:null}const t=e.size;return typeof t=="number"&&Number.isFinite(t)?t:null},ic=e=>Fi(e)?e:[e.x,e.y,e.size],rc=(e,t)=>{try{const n=e(t);return typeof n=="number"&&Number.isFinite(n)?n:null}catch{return null}},dn=(e,t)=>{const n=Dr(t);if(n!=null)return Math.max(0,n);const i=e.symbolSize;if(typeof i=="number")return Number.isFinite(i)?Math.max(0,i):fn;if(typeof i=="function"){const r=rc(i,ic(t));return r==null?fn:Math.max(0,r)}return fn},sc=e=>{const t=Br.get(e);if(t!==void 0)return t;const n=e.data,i=e.symbolSize;let r=0;if(typeof i!="function"){const s=typeof i=="number"&&Number.isFinite(i)?Math.max(0,i):fn;let o=0,c=!1;for(let l=0;l<n.length;l++){const u=Dr(n[l]);if(u==null)c=!0;else{const h=Math.max(0,u);h>o&&(o=h)}}r=c?Math.max(o,s):o}else for(let s=0;s<n.length;s++){const o=dn(e,n[s]);o>r&&(r=o)}return r=Number.isFinite(r)?Math.max(0,r):fn,Br.set(e,r),r};function oc(e){const t=new Map,n=new Array(e.length),i=new Array(e.length);let r=0;for(let s=0;s<e.length;s++){const o=nc(e[s].stack);if(i[s]=o,o!==""){const c=t.get(o);if(c!==void 0)n[s]=c;else{const l=r++;t.set(o,l),n[s]=l}}else n[s]=r++}return{clusterIndexBySeries:n,clusterCount:Math.max(1,r),stackIdBySeries:i}}function ac(e){const t=[];for(let i=0;i<e.length;i++){const r=e[i].data;for(let s=0;s<r.length;s++){const{x:o}=mn(r[s]);Number.isFinite(o)&&t.push(o)}}if(t.length<2)return 1;t.sort((i,r)=>i-r);let n=Number.POSITIVE_INFINITY;for(let i=1;i<t.length;i++){const r=t[i]-t[i-1];r>0&&r<n&&(n=r)}return Number.isFinite(n)&&n>0?n:1}function cc(e,t,n){if(Number.isFinite(n)&&n>0){const o=t.scale(0),c=t.scale(0+n),l=Math.abs(c-o);if(Number.isFinite(l)&&l>0)return l}const i=[];for(let s=0;s<e.length;s++){const o=e[s].data;for(let c=0;c<o.length;c++){const{x:l}=mn(o[c]);if(!Number.isFinite(l))continue;const u=t.scale(l);Number.isFinite(u)&&i.push(u)}}if(i.length<2)return 0;i.sort((s,o)=>s-o);let r=Number.POSITIVE_INFINITY;for(let s=1;s<i.length;s++){const o=i[s]-i[s-1];o>0&&o<r&&(r=o)}return Number.isFinite(r)&&r>0?r:0}const lc=e=>{let t,n,i;for(let r=0;r<e.length;r++){const s=e[r];t===void 0&&s.barWidth!==void 0&&(t=s.barWidth),n===void 0&&s.barGap!==void 0&&(n=s.barGap),i===void 0&&s.barCategoryGap!==void 0&&(i=s.barCategoryGap)}return{barWidth:t,barGap:n,barCategoryGap:i}};function Ur(e,t){const n=oc(e),i=n.clusterCount,r=ac(e),s=cc(e,t,r),o=lc(e),c=xi(o.barGap??Ja),l=xi(o.barCategoryGap??Qa),u=Math.max(0,s*(1-l)),h=i+Math.max(0,i-1)*c,f=h>0?u/h:0;let a=0;const F=o.barWidth;if(typeof F=="number")a=Math.max(0,F),a=Math.min(a,f);else if(typeof F=="string"){const m=tc(F);a=m==null?0:f*xi(m)}a>0||(a=f);const M=a*c,S=i*a+Math.max(0,i-1)*M;return{categoryStep:r,categoryWidthPx:s,barWidthPx:a,gapPx:M,clusterWidthPx:S,clusterSlots:n}}const wi=e=>{let t=Number.POSITIVE_INFINITY,n=Number.NEGATIVE_INFINITY;for(let i=0;i<e.length;i++){const r=e[i].data;for(let s=0;s<r.length;s++){const{y:o}=mn(r[s]);Number.isFinite(o)&&(o<t&&(t=o),o>n&&(n=o))}}return!Number.isFinite(t)||!Number.isFinite(n)||t<=0&&0<=n?0:Math.abs(t)<Math.abs(n)?t:n};function uc(e,t){let n=0;for(let i=0;i<e.length;i++){const r=e[i].data;for(let s=0;s<r.length;s++){const{y:o}=mn(r[s]);if(!Number.isFinite(o))continue;const c=t.scale(o);Number.isFinite(c)&&c>n&&(n=c)}}return Math.max(0,n)}function fc(e,t,n){const i=t.invert(n),r=t.invert(0),s=Math.min(i,r),o=Math.max(i,r);let c;!Number.isFinite(s)||!Number.isFinite(o)?c=wi(e):s<=0&&0<=o?c=0:s>0?c=s:o<0?c=o:c=wi(e);let l=t.scale(c);return Number.isFinite(l)||(c=wi(e),l=t.scale(c)),Number.isFinite(l)||(c=0,l=t.scale(0)),{baselineDomain:c,baselinePx:l}}function mc(e,t,n,i){return Number.isFinite(t)&&t>0&&Number.isFinite(e)?Math.round(e/t):Number.isFinite(i)&&i>0&&Number.isFinite(n)?Math.round(n/i):Math.round(n*1e6)}const dc=(e,t)=>{let n=0,i=e.length;for(;n<i;){const r=n+i>>>1;e[r][0]<t?n=r+1:i=r}return n},hc=(e,t)=>{let n=0,i=e.length;for(;n<i;){const r=n+i>>>1;e[r].x<t?n=r+1:i=r}return n};function vi(e,t,n,i,r,s=Er){var S;if(!Number.isFinite(t)||!Number.isFinite(n))return null;const o=Number.isFinite(s)?Math.max(0,s):Er,c=o*o,l=i.invert(t);if(!Number.isFinite(l))return null;let u=-1,h=-1,f=null,a=Number.POSITIVE_INFINITY;const F=[],M=[];for(let m=0;m<e.length;m++){const v=e[m];(v==null?void 0:v.type)==="bar"&&(F.push(v),M.push(m))}if(F.length>0){const m=Ur(F,i);if(m.barWidthPx>0&&m.clusterWidthPx>=0){const v=uc(F,r),{baselineDomain:g,baselinePx:x}=fc(F,r,v),{clusterSlots:y,barWidthPx:p,gapPx:d,clusterWidthPx:N,categoryWidthPx:w,categoryStep:T}=m,R=new Map;let P=null;for(let C=0;C<F.length;C++){const E=F[C],D=M[C]??-1;if(D<0)continue;const L=E.data,U=y.clusterIndexBySeries[C]??0,_=y.stackIdBySeries[C]??"";for(let H=0;H<L.length;H++){const{x:Z,y:X}=mn(L[H]);if(!Number.isFinite(Z)||!Number.isFinite(X))continue;const ie=i.scale(Z);if(!Number.isFinite(ie))continue;const oe=ie-N/2+U*(p+d),q=oe+p;let ee=g,we=X;if(_!==""){let ge=R.get(_);ge||(ge=new Map,R.set(_,ge));const Ae=mc(ie,w,Z,T);let de=ge.get(Ae);de||(de={posSum:g,negSum:g},ge.set(Ae,de)),X>=0?(ee=de.posSum,we=ee+X,de.posSum=we):(ee=de.negSum,we=ee+X,de.negSum=we)}else ee=g,we=X;const ve=_!==""?r.scale(ee):x,ue=r.scale(we);if(!Number.isFinite(ve)||!Number.isFinite(ue))continue;const ne={left:oe,right:q,top:Math.min(ve,ue),bottom:Math.max(ve,ue)};if(!ec(t,n,ne))continue;(P===null||ne.top<P.top||ne.top===P.top&&D>P.seriesIndex)&&(P={seriesIndex:D,dataIndex:H,top:ne.top})}}if(P){const C=(S=e[P.seriesIndex])==null?void 0:S.data[P.dataIndex];if(C)return{seriesIndex:P.seriesIndex,dataIndex:P.dataIndex,point:C,distance:0}}}}for(let m=0;m<e.length;m++){const v=e[m];if(v.type==="pie"||v.type==="candlestick")continue;const g=v.data,x=g.length;if(x===0)continue;const y=v.type==="scatter",p=y?v:null,d=p?sc(p):0,N=y?(o+d)*(o+d):c,w=g[0];if(Array.isArray(w)){const R=g,P=dc(R,l);let C=P-1,E=P;for(;C>=0||E<x;){const D=Math.min(a,N);let L=Number.POSITIVE_INFINITY;if(C>=0){const _=R[C][0];if(Number.isFinite(_)){const H=i.scale(_);if(Number.isFinite(H)){const Z=H-t;L=Z*Z}}}let U=Number.POSITIVE_INFINITY;if(E<x){const _=R[E][0];if(Number.isFinite(_)){const H=i.scale(_);if(Number.isFinite(H)){const Z=H-t;U=Z*Z}}}if(L>D&&U>D)break;if(L<=U&&L<=D&&C>=0){const _=R[C][1];if(Number.isFinite(_)){const H=r.scale(_);if(Number.isFinite(H)){const Z=H-n,X=L+Z*Z,ie=g[C],oe=p?(()=>{const q=dn(p,ie),ee=o+q;return ee*ee})():c;X<=oe&&(X<a||X===a&&(f===null||m<u||m===u&&C<h))&&(a=X,u=m,h=C,f=ie)}}C--}else L<=U&&C--;if(U<=L&&U<=D&&E<x){const _=R[E][1];if(Number.isFinite(_)){const H=r.scale(_);if(Number.isFinite(H)){const Z=H-n,X=U+Z*Z,ie=g[E],oe=p?(()=>{const q=dn(p,ie),ee=o+q;return ee*ee})():c;X<=oe&&(X<a||X===a&&(f===null||m<u||m===u&&E<h))&&(a=X,u=m,h=E,f=ie)}}E++}else U<L&&E++}}else{const R=g,P=hc(R,l);let C=P-1,E=P;for(;C>=0||E<x;){const D=Math.min(a,N);let L=Number.POSITIVE_INFINITY;if(C>=0){const _=R[C].x;if(Number.isFinite(_)){const H=i.scale(_);if(Number.isFinite(H)){const Z=H-t;L=Z*Z}}}let U=Number.POSITIVE_INFINITY;if(E<x){const _=R[E].x;if(Number.isFinite(_)){const H=i.scale(_);if(Number.isFinite(H)){const Z=H-t;U=Z*Z}}}if(L>D&&U>D)break;if(L<=U&&L<=D&&C>=0){const _=R[C].y;if(Number.isFinite(_)){const H=r.scale(_);if(Number.isFinite(H)){const Z=H-n,X=L+Z*Z,ie=g[C],oe=p?(()=>{const q=dn(p,ie),ee=o+q;return ee*ee})():c;X<=oe&&(X<a||X===a&&(f===null||m<u||m===u&&C<h))&&(a=X,u=m,h=C,f=ie)}}C--}else L<=U&&C--;if(U<=L&&U<=D&&E<x){const _=R[E].y;if(Number.isFinite(_)){const H=r.scale(_);if(Number.isFinite(H)){const Z=H-n,X=U+Z*Z,ie=g[E],oe=p?(()=>{const q=dn(p,ie),ee=o+q;return ee*ee})():c;X<=oe&&(X<a||X===a&&(f===null||m<u||m===u&&E<h))&&(a=X,u=m,h=E,f=ie)}}E++}else U<L&&E++}}}return f===null||!Number.isFinite(a)?null:{seriesIndex:u,dataIndex:h,point:f,distance:Math.sqrt(a)}}const Ni=new WeakMap,Lr=(e,t)=>{if(Ni.has(e))return Ni.get(e);let n=!1;if(t){const i=e;for(let r=0;r<i.length;r++){const s=i[r][0];if(Number.isNaN(s)){n=!0;break}}}else{const i=e;for(let r=0;r<i.length;r++){const s=i[r].x;if(Number.isNaN(s)){n=!0;break}}}return Ni.set(e,n),n},pc=(e,t)=>{const n=[];for(let l=0;l<e.length;l++){const u=e[l];(u==null?void 0:u.type)==="bar"&&n.push({globalSeriesIndex:l,s:u})}if(n.length===0)return null;const i=Ur(n.map(l=>l.s),t),r=i.barWidthPx,s=i.gapPx,o=i.clusterWidthPx;if(!Number.isFinite(r)||!(r>0))return null;const c=new Map;for(let l=0;l<n.length;l++){const u=n[l].globalSeriesIndex,h=i.clusterSlots.clusterIndexBySeries[l]??0;c.set(u,h)}return{barWidth:r,gap:s,clusterWidth:o,clusterIndexByGlobalSeriesIndex:c}},_r=(e,t)=>{let n=0,i=e.length;for(;n<i;){const r=n+i>>>1;e[r][0]<t?n=r+1:i=r}return n},Gr=(e,t)=>{let n=0,i=e.length;for(;n<i;){const r=n+i>>>1;e[r].x<t?n=r+1:i=r}return n};function Wr(e,t,n,i){if(!Number.isFinite(t))return[];const r=Number.POSITIVE_INFINITY,s=r*r,o=n.invert(t);if(!Number.isFinite(o))return[];const c=[],l=pc(e,n);for(let u=0;u<e.length;u++){const h=e[u];if(h.type==="pie"||h.type==="candlestick")continue;const f=h.data,a=f.length;if(a===0)continue;const F=f[0],M=Array.isArray(F);if(h.type==="bar"&&l){const x=l.clusterIndexByGlobalSeriesIndex.get(u);if(x!==void 0){const{barWidth:y,gap:p,clusterWidth:d}=l,N=-d/2+x*(y+p),w=0;if(Number.isFinite(y)&&y>0&&Number.isFinite(N)){let T=-1;const R=P=>{if(!Number.isFinite(P))return!1;const C=P+N,E=C+y;return t>=C-w&&t<E+w};if(Lr(f,M))if(M){const P=f;for(let C=0;C<a;C++){const E=P[C][0];if(!Number.isFinite(E))continue;const D=n.scale(E);R(D)&&(T=T<0?C:Math.min(T,C))}}else{const P=f;for(let C=0;C<a;C++){const E=P[C].x;if(!Number.isFinite(E))continue;const D=n.scale(E);R(D)&&(T=T<0?C:Math.min(T,C))}}else{const P=n.invert(t-N);if(Number.isFinite(P)){const C=M?_r(f,P):Gr(f,P),E=D=>{if(D<0||D>=a)return null;const L=M?f[D][0]:f[D].x;if(!Number.isFinite(L))return null;const U=n.scale(L);return Number.isFinite(U)?U:null};for(let D=C-1;D>=0;D--){const L=E(D);if(L===null)continue;const U=L+N,_=U+y;if(_+w<=t)break;t>=U-w&&t<_+w&&(T=T<0?D:Math.min(T,D))}for(let D=C;D<a;D++){const L=E(D);if(L===null)continue;const U=L+N;if(U-w>t)break;const _=U+y;t<_+w&&(T=T<0?D:Math.min(T,D))}}}if(T>=0){c.push({seriesIndex:u,dataIndex:T,point:f[T]});continue}}}}let S=-1,m=null,v=s;const g=(x,y)=>{!Number.isFinite(y)||!(y<v||y===v&&(S<0||x<S))||(v=y,S=x,m=f[x])};if(Lr(f,M))if(M){const x=f;for(let y=0;y<a;y++){const p=x[y][0];if(!Number.isFinite(p))continue;const d=n.scale(p);if(!Number.isFinite(d))continue;const N=d-t;g(y,N*N)}}else{const x=f;for(let y=0;y<a;y++){const p=x[y].x;if(!Number.isFinite(p))continue;const d=n.scale(p);if(!Number.isFinite(d))continue;const N=d-t;g(y,N*N)}}else if(M){const x=f,y=_r(x,o);let p=y-1,d=y;const N=w=>{const T=x[w][0];if(!Number.isFinite(T))return null;const R=n.scale(T);if(!Number.isFinite(R))return null;const P=R-t;return P*P};for(;p>=0||d<a;){for(;p>=0&&N(p)===null;)p--;for(;d<a&&N(d)===null;)d++;if(p<0&&d>=a)break;const w=p>=0?N(p)??Number.POSITIVE_INFINITY:Number.POSITIVE_INFINITY,T=d<a?N(d)??Number.POSITIVE_INFINITY:Number.POSITIVE_INFINITY;if(w>v&&T>v)break;w<=T?(p>=0&&w<=v&&g(p,w),p--,d<a&&T<=v&&T===w&&(g(d,T),d++)):(d<a&&T<=v&&g(d,T),d++)}}else{const x=f,y=Gr(x,o);let p=y-1,d=y;const N=w=>{const T=x[w].x;if(!Number.isFinite(T))return null;const R=n.scale(T);if(!Number.isFinite(R))return null;const P=R-t;return P*P};for(;p>=0||d<a;){for(;p>=0&&N(p)===null;)p--;for(;d<a&&N(d)===null;)d++;if(p<0&&d>=a)break;const w=p>=0?N(p)??Number.POSITIVE_INFINITY:Number.POSITIVE_INFINITY,T=d<a?N(d)??Number.POSITIVE_INFINITY:Number.POSITIVE_INFINITY;if(w>v&&T>v)break;w<=T?(p>=0&&w<=v&&g(p,w),p--,d<a&&T<=v&&T===w&&(g(d,T),d++)):(d<a&&T<=v&&g(d,T),d++)}}m!==null&&c.push({seriesIndex:u,dataIndex:S,point:m})}return c}const bc=e=>Math.min(1,Math.max(0,e)),gc=e=>{const t=e.trim().match(/^(\d+(?:\.\d+)?)%$/);if(!t)return null;const n=Number(t[1])/100;return Number.isFinite(n)?n:null},Mi=e=>Array.isArray(e),Xt=e=>Mi(e)?e[0]:e.timestamp,yc=e=>Mi(e)?e[1]:e.open,xc=e=>Mi(e)?e[2]:e.close,$r=new WeakMap,Fc=e=>{const t=$r.get(e);if(t!==void 0)return t;const n=[];for(let s=0;s<e.length;s++){const o=Xt(e[s]);Number.isFinite(o)&&n.push(o)}if(n.length<2)return 1;n.sort((s,o)=>s-o);let i=Number.POSITIVE_INFINITY;for(let s=1;s<n.length;s++){const o=n[s]-n[s-1];o>0&&o<i&&(i=o)}const r=Number.isFinite(i)&&i>0?i:1;return $r.set(e,r),r};function wc(e,t,n,i){if(t.length===0)return 0;const r=Fc(t);let s=0;if(Number.isFinite(r)&&r>0){let f=null;for(let a=0;a<t.length;a++){const F=Xt(t[a]);if(Number.isFinite(F)){f=F;break}}if(f!=null){const a=n.scale(f),F=n.scale(f+r),M=Math.abs(F-a);Number.isFinite(M)&&M>0&&(s=M)}}(!(s>0)||!Number.isFinite(s))&&(s=(Number.isFinite(i??Number.NaN)?i:0)/Math.max(1,t.length));let o=0;const c=e.barWidth;if(typeof c=="number")o=Number.isFinite(c)?Math.max(0,c):0;else if(typeof c=="string"){const f=gc(c);o=f==null?0:s*bc(f)}const l=Number.isFinite(e.barMinWidth)?Math.max(0,e.barMinWidth):0,u=Number.isFinite(e.barMaxWidth)?Math.max(0,e.barMaxWidth):Number.POSITIVE_INFINITY,h=Math.max(l,u);return o=Math.min(Math.max(o,l),h),Number.isFinite(o)?o:0}const Ln=new WeakMap,vc=e=>{const t=Ln.get(e);if(t!==void 0)return t;let n=Number.NEGATIVE_INFINITY;for(let i=0;i<e.length;i++){const r=Xt(e[i]);if(!Number.isFinite(r)||r<n)return Ln.set(e,!1),!1;n=r}return Ln.set(e,!0),!0},Nc=(e,t)=>{let n=0,i=e.length;for(;n<i;){const r=n+i>>>1;Xt(e[r])<t?n=r+1:i=r}return n};function Mc(e,t,n,i,r,s){if(!Number.isFinite(t)||!Number.isFinite(n)||!Number.isFinite(s)||!(s>0))return null;const o=i.invert(t);if(!Number.isFinite(o))return null;const c=s/2;let l=null,u=Number.POSITIVE_INFINITY;const h=(a,F,M,S)=>{if(Number.isFinite(S)){if(S<u){u=S,l={seriesIndex:a,dataIndex:F,point:M};return}S===u&&l&&(F<l.dataIndex?l={seriesIndex:a,dataIndex:F,point:M}:F===l.dataIndex&&a<l.seriesIndex&&(l={seriesIndex:a,dataIndex:F,point:M}))}},f=a=>{const F=yc(a),M=xc(a);if(!Number.isFinite(F)||!Number.isFinite(M))return!1;const S=r.scale(F),m=r.scale(M);if(!Number.isFinite(S)||!Number.isFinite(m))return!1;const v=Math.min(S,m),g=Math.max(S,m);return n>=v&&n<=g};for(let a=0;a<e.length;a++){const M=e[a].data,S=M.length;if(S===0)continue;if(!vc(M)){for(let g=0;g<S;g++){const x=M[g],y=Xt(x);if(!Number.isFinite(y))continue;const p=i.scale(y);if(!Number.isFinite(p))continue;const d=Math.abs(t-p);d>c||f(x)&&h(a,g,x,d)}continue}const v=Nc(M,o);for(let g=v-1;g>=0;g--){const x=M[g],y=Xt(x),p=i.scale(y);if(!Number.isFinite(p))continue;if(p<t-c)break;const d=Math.abs(t-p);d>c||f(x)&&h(a,g,x,d)}for(let g=v;g<S;g++){const x=M[g],y=Xt(x),p=i.scale(y);if(!Number.isFinite(p))continue;if(p>t+c)break;const d=Math.abs(t-p);d>c||f(x)&&h(a,g,x,d)}}return l}const zt=Math.PI*2,Ii=e=>{if(!Number.isFinite(e))return 0;const t=e%zt;return t<0?t+zt:t};function Ic(e,t,n,i,r){var x;if(!Number.isFinite(e)||!Number.isFinite(t)||!Number.isFinite(i.x)||!Number.isFinite(i.y))return null;const s=Number.isFinite(r.inner)?Math.max(0,r.inner):0,o=Number.isFinite(r.outer)?Math.max(0,r.outer):0;if(!(o>0))return null;const c=e-i.x,l=i.y-t,u=Math.hypot(c,l);if(!Number.isFinite(u)||u<=s||u>o)return null;const h=Ii(Math.atan2(l,c)),f=n.series,a=f.data;let F=0,M=0;for(let y=0;y<a.length;y++){const p=(x=a[y])==null?void 0:x.value;typeof p=="number"&&Number.isFinite(p)&&p>0&&(F+=p,M++)}if(!(F>0)||M===0)return null;const S=typeof f.startAngle=="number"&&Number.isFinite(f.startAngle)?f.startAngle:90;let m=Ii(S*Math.PI/180),v=0,g=0;for(let y=0;y<a.length;y++){const p=a[y],d=p==null?void 0:p.value;if(typeof d!="number"||!Number.isFinite(d)||d<=0)continue;g++;const N=g===M;let T=d/F*zt;if(N?T=Math.max(0,zt-v):T=Math.max(0,Math.min(zt,T)),v+=T,!(T>0))continue;const R=m,P=Ii(m+T);m=P;let C=P-R;C<0&&(C+=zt);let E=h-R;if(E<0&&(E+=zt),E<=C)return{seriesIndex:n.seriesIndex,dataIndex:y,slice:p}}return null}const _n=(e,t)=>{if(!Number.isFinite(t))throw new Error(`${e} must be a finite number. Received: ${String(t)}`)};function Gn(){let e=0,t=1,n=0,i=1;const r={domain(s,o){return _n("domain min",s),_n("domain max",o),e=s,t=o,r},range(s,o){return _n("range min",s),_n("range max",o),n=s,i=o,r},scale(s){if(!Number.isFinite(s))return Number.NaN;if(e===t)return(n+i)/2;const o=(s-e)/(t-e);return n+o*(i-n)},invert(s){if(!Number.isFinite(s))return Number.NaN;if(e===t)return e;if(n===i)return(e+t)/2;const o=(s-n)/(i-n);return e+o*(t-e)}};return r}const Sc=e=>{switch(e){case"start":return{translateX:"0%",originX:"0%"};case"middle":return{translateX:"-50%",originX:"50%"};case"end":return{translateX:"-100%",originX:"100%"}}};function Cc(e){const t=getComputedStyle(e),n=t.position,i=t.overflow,r=n==="static",s=i==="hidden"||i==="scroll"||i==="auto",o=r?e.style.position:null,c=s?e.style.overflow:null;r&&(e.style.position="relative"),s&&(e.style.overflow="visible");const l=document.createElement("div");l.style.position="absolute",l.style.inset="0",l.style.pointerEvents="none",l.style.overflow="visible",l.style.zIndex="10",e.appendChild(l);let u=!1;return{clear:()=>{u||l.replaceChildren()},addLabel:(F,M,S,m)=>{if(u)return document.createElement("span");const v=document.createElement("span");v.textContent=F,v.style.position="absolute",v.style.left=`${M}px`,v.style.top=`${S}px`,v.style.pointerEvents="none",v.style.userSelect="none",v.style.whiteSpace="nowrap",v.style.lineHeight="1",(m==null?void 0:m.fontSize)!=null&&(v.style.fontSize=`${m.fontSize}px`),(m==null?void 0:m.color)!=null&&(v.style.color=m.color);const g=(m==null?void 0:m.rotation)??0,x=(m==null?void 0:m.anchor)??"start",{translateX:y,originX:p}=Sc(x);return v.style.transformOrigin=`${p} 50%`,v.style.transform=`translateX(${y}) translateY(-50%) rotate(${g}deg)`,l.appendChild(v),v},dispose:()=>{if(!u){u=!0;try{l.remove()}finally{o!==null&&(e.style.position=o),c!==null&&(e.style.overflow=c)}}}}}function Tc(e){return Math.max(e+1,Math.round(e*1.15))}function Wn(e,t,n){e.dir="auto",e.style.fontFamily=n.fontFamily,t.isTitle&&(e.style.fontWeight="600")}const Pc=(e,t)=>{var i;const n=(i=e.name)==null?void 0:i.trim();return n||`Series ${t+1}`},Rc=(e,t,n)=>{var s;const i=(s=e.color)==null?void 0:s.trim();if(i)return i;const r=n.colorPalette;return r.length>0?r[t%r.length]??"#000000":"#000000"},Ac=(e,t)=>{const n=e==null?void 0:e.trim();return n||`Slice ${t+1}`},Ec=(e,t,n,i)=>{const r=e==null?void 0:e.trim();if(r)return r;const s=i.colorPalette,o=s.length;return o>0?s[(t+n)%o]??"#000000":"#000000"};function Bc(e,t="right"){const i=getComputedStyle(e).position==="static",r=i?e.style.position:null;i&&(e.style.position="relative");const s=document.createElement("div");s.style.position="absolute",s.style.pointerEvents="none",s.style.userSelect="none",s.style.boxSizing="border-box",s.style.padding="8px",s.style.borderRadius="8px",s.style.borderStyle="solid",s.style.borderWidth="1px",s.style.maxHeight="calc(100% - 16px)",s.style.overflow="auto";const o=document.createElement("div");o.style.display="flex",o.style.gap="8px",s.appendChild(o),(f=>{switch(s.style.top="",s.style.right="",s.style.bottom="",s.style.left="",s.style.maxWidth="",o.style.flexDirection="",o.style.flexWrap="",o.style.alignItems="",f){case"right":{s.style.top="8px",s.style.right="8px",s.style.maxWidth="40%",o.style.flexDirection="column",o.style.flexWrap="nowrap",o.style.alignItems="flex-start";return}case"left":{s.style.top="8px",s.style.left="8px",s.style.maxWidth="40%",o.style.flexDirection="column",o.style.flexWrap="nowrap",o.style.alignItems="flex-start";return}case"top":{s.style.top="8px",s.style.left="8px",s.style.right="8px",o.style.flexDirection="row",o.style.flexWrap="wrap",o.style.alignItems="center";return}case"bottom":{s.style.bottom="8px",s.style.left="8px",s.style.right="8px",o.style.flexDirection="row",o.style.flexWrap="wrap",o.style.alignItems="center";return}}})(t),e.appendChild(s);let l=!1;return{update:(f,a)=>{if(l)return;s.style.color=a.textColor,s.style.background=a.backgroundColor,s.style.borderColor=a.axisLineColor,s.style.fontFamily=a.fontFamily,s.style.fontSize=`${a.fontSize}px`;const F=[];for(let M=0;M<f.length;M++){const S=f[M];if(S.type==="pie")for(let m=0;m<S.data.length;m++){const v=S.data[m],g=document.createElement("div");g.style.display="flex",g.style.alignItems="center",g.style.gap="6px",g.style.lineHeight="1.1",g.style.whiteSpace="nowrap";const x=document.createElement("div");x.style.width="10px",x.style.height="10px",x.style.borderRadius="2px",x.style.flex="0 0 auto",x.style.background=Ec(v==null?void 0:v.color,M,m,a),x.style.border=`1px solid ${a.axisLineColor}`;const y=document.createElement("span");y.textContent=Ac(v==null?void 0:v.name,m),g.appendChild(x),g.appendChild(y),F.push(g)}else{const m=document.createElement("div");m.style.display="flex",m.style.alignItems="center",m.style.gap="6px",m.style.lineHeight="1.1",m.style.whiteSpace="nowrap";const v=document.createElement("div");v.style.width="10px",v.style.height="10px",v.style.borderRadius="2px",v.style.flex="0 0 auto",v.style.background=Rc(S,M,a),v.style.border=`1px solid ${a.axisLineColor}`;const g=document.createElement("span");g.textContent=Pc(S,M),m.appendChild(v),m.appendChild(g),F.push(m)}}o.replaceChildren(...F)},dispose:()=>{if(!l){l=!0;try{s.remove()}finally{r!==null&&(e.style.position=r)}}}}}const kr=(e,t,n)=>n<t||e<t?t:e>n?n:e;function Or(e){const n=getComputedStyle(e).position==="static",i=n?e.style.position:null;n&&(e.style.position="relative");const r=document.createElement("div");r.style.position="absolute",r.style.left="0",r.style.top="0",r.style.pointerEvents="none",r.style.userSelect="none",r.style.boxSizing="border-box",r.style.zIndex="var(--chartgpu-tooltip-z, 10)",r.style.padding="var(--chartgpu-tooltip-padding, 6px 8px)",r.style.borderRadius="var(--chartgpu-tooltip-radius, 8px)",r.style.borderStyle="solid",r.style.borderWidth="var(--chartgpu-tooltip-border-width, 1px)",r.style.borderColor="var(--chartgpu-tooltip-border, rgba(224,224,224,0.35))",r.style.boxShadow="var(--chartgpu-tooltip-shadow, 0 6px 18px rgba(0,0,0,0.35))",r.style.maxWidth="var(--chartgpu-tooltip-max-width, min(320px, 100%))",r.style.overflow="hidden",r.style.fontFamily='var(--chartgpu-tooltip-font-family, system-ui, -apple-system, "Segoe UI", Roboto, Helvetica, Arial, "Apple Color Emoji", "Segoe UI Emoji")',r.style.fontSize="var(--chartgpu-tooltip-font-size, 12px)",r.style.lineHeight="var(--chartgpu-tooltip-line-height, 1.2)",r.style.color="var(--chartgpu-tooltip-color, #e0e0e0)",r.style.background="var(--chartgpu-tooltip-bg, rgba(26,26,46,0.95))",r.style.whiteSpace="normal",r.style.opacity="0",r.style.transitionProperty="opacity";const s=140;r.style.transitionDuration=`${s}ms`,r.style.transitionTimingFunction="ease",r.style.willChange="opacity",r.style.display="none",r.style.visibility="hidden",r.setAttribute("role","tooltip"),e.appendChild(r);let o=!1,c=0,l=null,u=null;const h=()=>{l!=null&&(window.clearTimeout(l),l=null),u!=null&&(window.cancelAnimationFrame(u),u=null)},f=()=>r.style.display==="none"||r.style.visibility==="hidden",a=()=>{const m=r.style.visibility;r.style.visibility="hidden";const v=r.offsetWidth,g=r.offsetHeight;return r.style.visibility=m,{width:v,height:g}};return{show:(m,v,g)=>{if(o)return;c+=1,h();const x=f();r.innerHTML=g;const y=12,p=12,d=8;r.style.display="block",r.style.visibility="hidden";const{width:N,height:w}=a(),T=e.clientWidth,R=e.clientHeight;let P=m+y,C=v+p;if(P+N>T-d&&(P=m-y-N),C+w>R-d&&(C=v-p-w),P=kr(P,d,T-d-N),C=kr(C,d,R-d-w),r.style.left=`${P}px`,r.style.top=`${C}px`,r.style.visibility="visible",x){r.style.opacity="0";const E=c;u=window.requestAnimationFrame(()=>{u=null,!o&&E===c&&(r.style.opacity="1")})}else r.style.opacity="1"},hide:()=>{if(o)return;if(c+=1,h(),r.style.display==="none"||r.style.visibility==="hidden"){r.style.opacity="0",r.style.visibility="hidden",r.style.display="none";return}r.style.opacity="0";const m=c;l=window.setTimeout(()=>{l=null,!o&&m===c&&(r.style.visibility="hidden",r.style.display="none")},s+50)},dispose:()=>{if(!o){o=!0;try{h(),r.remove()}finally{i!==null&&(e.style.position=i)}}}}}const $n="—";function bt(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}function Ht(e){if(!Number.isFinite(e))return $n;const i=(Object.is(e,-0)?0:e).toFixed(2).replace(/\.?0+$/,"");return i==="-0"?"0":i}function Vr(e){const t=e.seriesName.trim();return t.length>0?t:`Series ${e.seriesIndex+1}`}function Xr(e){const t=e.trim();return t.length===0?"#888":/^#[0-9a-fA-F]{3}$/.test(t)||/^#[0-9a-fA-F]{6}$/.test(t)||/^#[0-9a-fA-F]{8}$/.test(t)||/^rgba?\(\s*\d{1,3}\s*(?:,\s*|\s+)\d{1,3}\s*(?:,\s*|\s+)\d{1,3}(?:\s*(?:,\s*|\/\s*)(?:0|1|0?\.\d+))?\s*\)$/.test(t)||/^[a-zA-Z]+$/.test(t)?t:"#888"}function zr(e){return e.length===5}function Dc(e,t){if(!Number.isFinite(e)||!Number.isFinite(t)||e===0)return $n;const n=(t-e)/e*100;return Number.isFinite(n)?`${n>0?"+":""}${n.toFixed(2)}%`:$n}function Hr(e,t){const n=bt(Vr(e)),i=bt(t);return['<div style="display:flex;align-items:center;justify-content:space-between;gap:12px;">','<span style="display:flex;align-items:center;gap:8px;min-width:0;">',`<span style="width:8px;height:8px;border-radius:999px;flex:0 0 auto;background-color:${bt(Xr(e.color))};"></span>`,`<span style="overflow:hidden;text-overflow:ellipsis;white-space:nowrap;">${n}</span>`,"</span>",`<span style="font-variant-numeric:tabular-nums;white-space:nowrap;">${i}</span>`,"</div>"].join("")}function Yr(e){const[,t,n,i,r]=e.value,s=bt(Vr(e)),o=bt(Xr(e.color)),c=Ht(t),l=Ht(r),u=Ht(i),h=Ht(n),f=n>t,a=f?"▲":"▼",F=f?"#22c55e":"#ef4444",M=Dc(t,n),S=`O: ${c} H: ${l} L: ${u} C: ${h}`,m=bt(S),v=bt(a),g=bt(M),x=bt(F);return['<div style="display:flex;flex-direction:column;gap:4px;">','<div style="display:flex;align-items:center;gap:8px;">',`<span style="width:8px;height:8px;border-radius:999px;flex:0 0 auto;background-color:${o};"></span>`,`<span style="overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:600;">${s}</span>`,"</div>",`<div style="font-variant-numeric:tabular-nums;white-space:nowrap;font-size:0.9em;">${m}</div>`,'<div style="display:flex;align-items:center;gap:6px;font-variant-numeric:tabular-nums;">',`<span style="color:${x};font-weight:700;">${v}</span>`,`<span style="color:${x};font-weight:600;">${g}</span>`,"</div>","</div>"].join("")}function Uc(e){return Yr(e)}function hn(e){return zr(e.value)?Uc(e):Hr(e,Ht(e.value[1]))}function Si(e){if(e.length===0)return"";const t=`x: ${Ht(e[0].value[0])}`,n=`<div style="margin:0 0 6px 0;font-weight:600;font-variant-numeric:tabular-nums;white-space:nowrap;">${bt(t)}</div>`,i=e.map(r=>zr(r.value)?Yr(r):Hr(r,Ht(r.value[1]))).join('<div style="height:4px;"></div>');return`${n}${i}`}const Lc=e=>Number.isFinite(e)?e:0,_c=e=>Number.isFinite(e)?e:null;function qr(){const e=new Map;function t(s,o,c,l,u,h){const f=Symbol("Animation");if(Array.isArray(s)||Array.isArray(o)){if(!Array.isArray(s)||!Array.isArray(o))throw new Error('Array animation requires both "from" and "to" to be arrays');if(s.length!==o.length)throw new Error(`Array animation length mismatch: from.length=${s.length}, to.length=${o.length}`);const a=new Array(s.length);return e.set(f,{kind:"array",from:s,to:o,duration:c,easing:l,onUpdate:u,onComplete:h,startTime:null,out:a}),f}return e.set(f,{kind:"scalar",from:s,to:o,duration:c,easing:l,onUpdate:u,onComplete:h,startTime:null}),f}function n(s){e.delete(s)}function i(){e.clear()}function r(s){var l;const o=_c(s);if(o===null)return;const c=Array.from(e.keys());for(const u of c){const h=e.get(u);if(!h)continue;const f=h.startTime??o;h.startTime===null&&e.set(u,{...h,startTime:f});const a=Lc(h.duration),F=Math.max(0,o-f),M=a<=0||F>=a,S=a<=0?1:F/a,m=M?1:h.easing(S);if(h.kind==="scalar"){const v=h.from+(h.to-h.from)*m;if(h.onUpdate(v),!e.has(u))continue}else{const v=h.out.length;for(let g=0;g<v;g++){const x=h.from[g]??0,y=h.to[g]??0;h.out[g]=x+(y-x)*m}if(h.onUpdate(h.out),!e.has(u))continue}M&&((l=h.onComplete)==null||l.call(h),e.delete(u))}}return{animate:t,cancel:n,cancelAll:i,update:r}}const kn=e=>Number.isNaN(e)||e<=0?0:e>=1?1:e;function Zr(e){return kn(e)}function Gc(e){const n=1-kn(e);return 1-n*n*n}function Wc(e){const t=kn(e);if(t<.5)return 4*t*t*t;const n=-2*t+2;return 1-n*n*n/2}function $c(e){const t=kn(e),n=7.5625,i=2.75;if(t<1/i)return n*t*t;if(t<2/i){const s=t-1.5/i;return n*s*s+.75}if(t<2.5/i){const s=t-2.25/i;return n*s*s+.9375}const r=t-2.625/i;return n*r*r+.984375}function kc(e){switch(e){case"linear":return Zr;case"cubicOut":return Gc;case"cubicInOut":return Wc;case"bounceOut":return $c;default:return Zr}}const Xe=Yi;function jr(e,t=1){return e?Xe(e)?e.clientWidth:e.width/t:0}function Oc(e,t=1){return e?Xe(e)?e.clientHeight:e.height/t:0}const Vc="bgra8unorm",pn=5,Kr=6,Ci=4,Xc=1,zc=4,On=24*60*60*1e3,Hc=30*On,Yc=365*On,qc=9,Ti=1,Zc=6,Vn=e=>typeof e=="number"&&Number.isFinite(e)?e:null,gt=e=>typeof e=="number"&&Number.isFinite(e)?e:void 0,jc=2e4,Pi=e=>{throw new Error(`RenderCoordinator: unreachable value: ${String(e)}`)},Xn=e=>Array.isArray(e),yt=e=>Xn(e)?{x:e[0],y:e[1]}:{x:e.x,y:e.y},Ri=e=>{let t=Number.POSITIVE_INFINITY,n=Number.NEGATIVE_INFINITY,i=Number.POSITIVE_INFINITY,r=Number.NEGATIVE_INFINITY;for(let s=0;s<e.length;s++){const{x:o,y:c}=yt(e[s]);!Number.isFinite(o)||!Number.isFinite(c)||(o<t&&(t=o),o>n&&(n=o),c<i&&(i=c),c>r&&(r=c))}return!Number.isFinite(t)||!Number.isFinite(n)||!Number.isFinite(i)||!Number.isFinite(r)?null:(t===n&&(n=t+1),i===r&&(r=i+1),{xMin:t,xMax:n,yMin:i,yMax:r})},Kc=(e,t)=>{if(t.length===0)return e;let n=e;if(!n){const c=Ri(t);if(!c)return e;n=c}let i=n.xMin,r=n.xMax,s=n.yMin,o=n.yMax;for(let c=0;c<t.length;c++){const{x:l,y:u}=yt(t[c]);!Number.isFinite(l)||!Number.isFinite(u)||(l<i&&(i=l),l>r&&(r=l),u<s&&(s=u),u>o&&(o=u))}return i===r&&(r=i+1),s===o&&(o=s+1),{xMin:i,xMax:r,yMin:s,yMax:o}},Jc=(e,t)=>{if(t.length===0)return e;let n=(e==null?void 0:e.xMin)??Number.POSITIVE_INFINITY,i=(e==null?void 0:e.xMax)??Number.NEGATIVE_INFINITY,r=(e==null?void 0:e.yMin)??Number.POSITIVE_INFINITY,s=(e==null?void 0:e.yMax)??Number.NEGATIVE_INFINITY;for(let o=0;o<t.length;o++){const c=t[o],l=at(c)?c[0]:c.timestamp,u=at(c)?c[3]:c.low,h=at(c)?c[4]:c.high;!Number.isFinite(l)||!Number.isFinite(u)||!Number.isFinite(h)||(l<n&&(n=l),l>i&&(i=l),u<r&&(r=u),h>s&&(s=h))}return!Number.isFinite(n)||!Number.isFinite(i)||!Number.isFinite(r)||!Number.isFinite(s)?e:(n===i&&(i=n+1),r===s&&(s=r+1),{xMin:n,xMax:i,yMin:r,yMax:s})},Jr=(e,t)=>{let n=Number.POSITIVE_INFINITY,i=Number.NEGATIVE_INFINITY,r=Number.POSITIVE_INFINITY,s=Number.NEGATIVE_INFINITY;for(let o=0;o<e.length;o++){const c=e[o];if(c.type==="pie")continue;const l=(t==null?void 0:t[o])??null;if(l){const f=l;if(Number.isFinite(f.xMin)&&Number.isFinite(f.xMax)&&Number.isFinite(f.yMin)&&Number.isFinite(f.yMax)){f.xMin<n&&(n=f.xMin),f.xMax>i&&(i=f.xMax),f.yMin<r&&(r=f.yMin),f.yMax>s&&(s=f.yMax);continue}}const u=c.rawBounds;if(u){const f=u;if(Number.isFinite(f.xMin)&&Number.isFinite(f.xMax)&&Number.isFinite(f.yMin)&&Number.isFinite(f.yMax)){f.xMin<n&&(n=f.xMin),f.xMax>i&&(i=f.xMax),f.yMin<r&&(r=f.yMin),f.yMax>s&&(s=f.yMax);continue}}if(c.type==="candlestick"){const f=c.rawData??c.data;for(let a=0;a<f.length;a++){const F=f[a];if(at(F)){const M=F[0],S=F[3],m=F[4];if(!Number.isFinite(M)||!Number.isFinite(S)||!Number.isFinite(m))continue;const v=Math.min(S,m),g=Math.max(S,m);M<n&&(n=M),M>i&&(i=M),v<r&&(r=v),g>s&&(s=g)}else{const M=F.timestamp,S=F.low,m=F.high;if(!Number.isFinite(M)||!Number.isFinite(S)||!Number.isFinite(m))continue;const v=Math.min(S,m),g=Math.max(S,m);M<n&&(n=M),M>i&&(i=M),v<r&&(r=v),g>s&&(s=g)}}continue}const h=c.data;for(let f=0;f<h.length;f++){const{x:a,y:F}=yt(h[f]);!Number.isFinite(a)||!Number.isFinite(F)||(a<n&&(n=a),a>i&&(i=a),F<r&&(r=F),F>s&&(s=F))}}return!Number.isFinite(n)||!Number.isFinite(i)||!Number.isFinite(r)||!Number.isFinite(s)?{xMin:0,xMax:1,yMin:0,yMax:1}:(n===i&&(i=n+1),r===s&&(s=r+1),{xMin:n,xMax:i,yMin:r,yMax:s})},zn=(e,t)=>{let n=e,i=t;if((!Number.isFinite(n)||!Number.isFinite(i))&&(n=0,i=1),n===i)i=n+1;else if(n>i){const r=n;n=i,i=r}return{min:n,max:i}},Qr=(e,t)=>{const n=e.canvas;if(!n)throw new Error("RenderCoordinator: gpuContext.canvas is required.");const i=e.devicePixelRatio??1,r=Number.isFinite(i)&&i>0?i:1,s=n.width,o=n.height;if(!Number.isFinite(s)||!Number.isFinite(o))throw new Error(`RenderCoordinator: Invalid canvas dimensions: width=${s}, height=${o}. Canvas must be initialized with finite dimensions before rendering.`);const c=Math.max(1,Math.floor(s)),l=Math.max(1,Math.floor(o)),u=Number.isFinite(t.grid.left)?t.grid.left:0,h=Number.isFinite(t.grid.right)?t.grid.right:0,f=Number.isFinite(t.grid.top)?t.grid.top:0,a=Number.isFinite(t.grid.bottom)?t.grid.bottom:0,F=Math.max(0,u),M=Math.max(0,h),S=Math.max(0,f),m=Math.max(0,a);return{left:F,right:M,top:S,bottom:m,canvasWidth:c,canvasHeight:l,devicePixelRatio:r}},Qc=e=>{const t=Math.max(0,Math.min(255,Math.round(e[0]*255))),n=Math.max(0,Math.min(255,Math.round(e[1]*255))),i=Math.max(0,Math.min(255,Math.round(e[2]*255))),r=Math.max(0,Math.min(1,e[3]));return`rgba(${t},${n},${i},${r})`},es=(e,t)=>{const n=je(e);if(!n)return e;const i=Math.max(0,Math.min(1,n[3]*t));return Qc([n[0],n[1],n[2],i])},el=(e,t)=>{if(e.length===0)return 0;const n=e.reduce((i,r)=>Math.max(i,r.text.length),0);return Math.ceil(n*t*.6)},tl=e=>{const{left:t,right:n,top:i,bottom:r,canvasWidth:s,canvasHeight:o,devicePixelRatio:c}=e,l=t*c,u=s-n*c,h=i*c,f=o-r*c,a=l/s*2-1,F=u/s*2-1,M=1-h/o*2,S=1-f/o*2;return{left:a,right:F,top:M,bottom:S}},xt=e=>Math.min(1,Math.max(0,e)),Lt=(e,t,n)=>Math.min(n,Math.max(t,e|0)),Hn=(e,t,n)=>e+(t-e)*xt(n),Yn=(e,t,n)=>zn(Hn(e.min,t.min,n),Hn(e.max,t.max,n)),ts=e=>{const{canvasWidth:t,canvasHeight:n,devicePixelRatio:i}=e,r=e.left*i,s=t-e.right*i,o=e.top*i,c=n-e.bottom*i,l=Lt(Math.floor(r),0,Math.max(0,t)),u=Lt(Math.floor(o),0,Math.max(0,n)),h=Lt(Math.ceil(s),0,Math.max(0,t)),f=Lt(Math.ceil(c),0,Math.max(0,n)),a=Math.max(0,h-l),F=Math.max(0,f-u);return{x:l,y:u,w:a,h:F}},qn=(e,t)=>(e+1)/2*t,Ai=(e,t)=>(1-e)/2*t,nl=e=>Array.isArray(e),il=e=>e.length>0&&nl(e[0]),Yt=new WeakMap,rl=(e,t)=>{const n=Yt.get(e);if(n!==void 0)return n;let i=Number.NEGATIVE_INFINITY;if(t){const s=e;for(let o=0;o<s.length;o++){const c=s[o][0];if(!Number.isFinite(c)||c<i)return Yt.set(e,!1),!1;i=c}return Yt.set(e,!0),!0}const r=e;for(let s=0;s<r.length;s++){const o=r[s].x;if(!Number.isFinite(o)||o<i)return Yt.set(e,!1),!1;i=o}return Yt.set(e,!0),!0},sl=(e,t)=>{let n=0,i=e.length;for(;n<i;){const r=n+i>>>1;e[r][0]<t?n=r+1:i=r}return n},ol=(e,t)=>{let n=0,i=e.length;for(;n<i;){const r=n+i>>>1;e[r][0]<=t?n=r+1:i=r}return n},al=(e,t)=>{let n=0,i=e.length;for(;n<i;){const r=n+i>>>1;e[r].x<t?n=r+1:i=r}return n},cl=(e,t)=>{let n=0,i=e.length;for(;n<i;){const r=n+i>>>1;e[r].x<=t?n=r+1:i=r}return n},Zn=(e,t,n)=>{const i=e.length;if(i===0||!Number.isFinite(t)||!Number.isFinite(n))return e;const r=il(e);if(rl(e,r)){const c=r?sl(e,t):al(e,t),l=r?ol(e,n):cl(e,n);return c<=0&&l>=i?e:l<=c?[]:e.slice(c,l)}const o=[];for(let c=0;c<i;c++){const l=e[c],{x:u}=yt(l);Number.isFinite(u)&&u>=t&&u<=n&&o.push(l)}return o};function at(e){return Array.isArray(e)}const jn=new WeakMap,ll=e=>{const t=jn.get(e);if(t!==void 0)return t;let n=Number.NEGATIVE_INFINITY;for(let i=0;i<e.length;i++){const r=e[i],s=at(r)?r[0]:r.timestamp;if(!Number.isFinite(s)||s<n)return jn.set(e,!1),!1;n=s}return jn.set(e,!0),!0},ul=(e,t)=>{let n=0,i=e.length;for(;n<i;){const r=n+i>>>1;e[r][0]<t?n=r+1:i=r}return n},fl=(e,t)=>{let n=0,i=e.length;for(;n<i;){const r=n+i>>>1;e[r][0]<=t?n=r+1:i=r}return n},ml=(e,t)=>{let n=0,i=e.length;for(;n<i;){const r=n+i>>>1;e[r].timestamp<t?n=r+1:i=r}return n},dl=(e,t)=>{let n=0,i=e.length;for(;n<i;){const r=n+i>>>1;e[r].timestamp<=t?n=r+1:i=r}return n},Kn=(e,t,n)=>{const i=e.length;if(i===0||!Number.isFinite(t)||!Number.isFinite(n))return e;const r=ll(e),s=i>0&&at(e[0]);if(r){const c=s?ul(e,t):ml(e,t),l=s?fl(e,n):dl(e,n);return c<=0&&l>=i?e:l<=c?[]:e.slice(c,l)}const o=[];for(let c=0;c<i;c++){const l=e[c],u=at(l)?l[0]:l.timestamp;Number.isFinite(u)&&u>=t&&u<=n&&o.push(l)}return o},bn=(e,t)=>{if(typeof e=="number")return Number.isFinite(e)?e:null;if(typeof e!="string")return null;const n=e.trim();if(n.length===0)return null;if(n.endsWith("%")){const r=Number.parseFloat(n.slice(0,-1));return Number.isFinite(r)?r/100*t:null}const i=Number.parseFloat(n);return Number.isFinite(i)?i:null},hl=(e,t,n)=>{const i=(e==null?void 0:e[0])??"50%",r=(e==null?void 0:e[1])??"50%",s=bn(i,t),o=bn(r,n);return{x:Number.isFinite(s)?s:t*.5,y:Number.isFinite(o)?o:n*.5}},pl=e=>Array.isArray(e),ns=(e,t)=>{if(e==null)return{inner:0,outer:t*.7};if(pl(e)){const r=bn(e[0],t),s=bn(e[1],t),o=Math.max(0,Number.isFinite(r)?r:0),c=Math.max(o,Number.isFinite(s)?s:t*.7);return{inner:o,outer:Math.min(t,c)}}const n=bn(e,t),i=Math.max(0,Number.isFinite(n)?n:t*.7);return{inner:0,outer:Math.min(t,i)}},bl=6,gl=(e,t=bl)=>{const n=Math.abs(e);if(!Number.isFinite(n)||n===0)return 0;for(let i=0;i<=t;i++){const r=n*10**i,s=Math.round(r),o=Math.abs(r-s),c=1e-9*Math.max(1,Math.abs(r));if(o<=c)return i}return Math.max(0,Math.min(t,Math.ceil(-Math.log10(n))+1))},is=e=>{const t=gl(e);return new Intl.NumberFormat(void 0,{maximumFractionDigits:t})},rs=(e,t)=>{if(!Number.isFinite(t))return null;const n=Math.abs(t)<1e-12?0:t,i=e.format(n);return i==="NaN"?null:i},ct=e=>String(Math.trunc(e)).padStart(2,"0"),yl=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],ss=(e,t)=>{if(!Number.isFinite(e))return null;(!Number.isFinite(t)||t<0)&&(t=0);const n=new Date(e);if(!Number.isFinite(n.getTime()))return null;const i=n.getFullYear(),r=n.getMonth()+1,s=n.getDate(),o=n.getHours(),c=n.getMinutes();return t<On?`${ct(o)}:${ct(c)}`:t<=7*On?`${ct(r)}/${ct(s)} ${ct(o)}:${ct(c)}`:t<3*Hc?`${ct(r)}/${ct(s)}`:t<=Yc?`${yl[n.getMonth()]??ct(r)} ${ct(s)}`:`${i}/${ct(r)}`},Jn=(e,t,n)=>{const i=Math.max(1,Math.floor(n)),r=new Array(i);for(let s=0;s<i;s++){const o=i===1?.5:s/(i-1);r[s]=e+o*(t-e)}return r},xl=e=>{const{axisMin:t,axisMax:n,xScale:i,plotClipLeft:r,plotClipRight:s,canvasCssWidth:o,visibleRangeMs:c,measureCtx:l,measureCache:u,fontSize:h,fontFamily:f}=e,a=Vn(t)??i.invert(r),F=Vn(n)??i.invert(s);if(!l||o<=0)return{tickCount:pn,tickValues:Jn(a,F,pn)};l.font=`${h}px ${f}`,u&&u.size>2e3&&u.clear();const M=u?`${h}px ${f}@@`:null;for(let S=qc;S>=Ti;S--){const m=Jn(a,F,S);let v=Number.NEGATIVE_INFINITY,g=!0;for(let x=0;x<m.length;x++){const y=m[x],p=ss(y,c);if(p==null)continue;const d=(()=>{if(!M)return l.measureText(p).width;const C=M+p,E=u.get(C);if(E!=null)return E;const D=l.measureText(p).width;return u.set(C,D),D})(),N=i.scale(y),w=qn(N,o),T=S===1?"middle":x===0?"start":x===m.length-1?"end":"middle",R=T==="start"?w:T==="end"?w-d:w-d*.5,P=T==="start"?w+d:T==="end"?w:w+d*.5;if(R<v+Zc){g=!1;break}v=P}if(g)return{tickCount:S,tickValues:m}}return{tickCount:Ti,tickValues:Jn(a,F,Ti)}},qt=(e,t)=>{const n=Jr(e.series,t),i=gt(e.xAxis.min)??n.xMin,r=gt(e.xAxis.max)??n.xMax;return zn(i,r)},Ei=(e,t)=>{const n=Jr(e.series,t),i=gt(e.yAxis.min)??n.yMin,r=gt(e.yAxis.max)??n.yMax;return zn(i,r)},Zt=(e,t)=>{if(!t)return{...e,spanFraction:1};const n=e.max-e.min;if(!Number.isFinite(n)||n===0)return{...e,spanFraction:1};const i=t.start,r=t.end,s=e.min+i/100*n,o=e.min+r/100*n,c=zn(s,o),l=(r-i)/100,u=Number.isFinite(l)?Math.max(0,Math.min(1,l)):1;return{min:c.min,max:c.max,spanFraction:u}},os=e=>{if(e===!1||e==null)return null;const t=e===!0?{}:e;if(!t)return null;const n=t.duration??300,i=t.delay??0,r=Number.isFinite(n)?Math.max(0,n):300,s=Number.isFinite(i)?Math.max(0,i):0;return{durationMs:r,delayMs:s,easing:kc(t.easing)}},Fl=e=>os(e),wl=e=>os(e),Bi=(e,t,n,i,r)=>{const s=e.point,o=at(s)?s[0]:s.timestamp,c=at(s)?s[1]:s.open,l=at(s)?s[2]:s.close;if(!Number.isFinite(o)||!Number.isFinite(c)||!Number.isFinite(l))return null;const u=(c+l)/2,h=t.scale(o),f=n.scale(u);if(!Number.isFinite(h)||!Number.isFinite(f))return null;const a=i.left+h,F=i.top+f,M=Xe(r)?r.offsetLeft+a:a,S=Xe(r)?r.offsetTop+F:F;return!Number.isFinite(M)||!Number.isFinite(S)?null:{x:M,y:S}},as=e=>{let t=Number.POSITIVE_INFINITY,n=Number.NEGATIVE_INFINITY;for(let i=0;i<e.length;i++){const r=e[i].data;for(let s=0;s<r.length;s++){const{y:o}=yt(r[s]);Number.isFinite(o)&&(o<t&&(t=o),o>n&&(n=o))}}return!Number.isFinite(t)||!Number.isFinite(n)||t<=0&&0<=n?0:Math.abs(t)<Math.abs(n)?t:n},vl=(e,t,n)=>{const i=t.invert(n.bottom),r=t.invert(n.top),s=Math.min(i,r),o=Math.max(i,r);return!Number.isFinite(s)||!Number.isFinite(o)?as(e):s<=0&&0<=o?0:s>0?s:o<0?o:as(e)},Nl=(e,t,n,i)=>{const r=xt(i);if(r>=1)return e;const s=vl(n,e,t),o=e.scale(s),c={domain(l,u){return e.domain(l,u),c},range(l,u){return e.range(l,u),c},scale(l){const u=e.scale(l);return!Number.isFinite(u)||!Number.isFinite(o)?u:o+(u-o)*r},invert(l){return e.invert(l)}};return c};function Ml(e,t,n){var Cs;if(!e.initialized)throw new Error("RenderCoordinator: gpuContext must be initialized.");const i=e.device;if(!i)throw new Error("RenderCoordinator: gpuContext.device is required.");if(!e.canvas)throw new Error("RenderCoordinator: gpuContext.canvas is required.");if(!e.canvasContext)throw new Error("RenderCoordinator: gpuContext.canvasContext is required.");i.lost.then(b=>{var A;(A=n==null?void 0:n.onDeviceLost)==null||A.call(n,b.message||b.reason||"unknown")}).catch(()=>{});const r=e.preferredFormat??Vc,s=(n==null?void 0:n.domOverlays)!==!1,o=s&&Xe(e.canvas)?e.canvas.parentElement:null,c=o?Cc(o):null,l=o?Bc(o,"right"):null,u=(()=>{if(typeof document>"u")return null;try{return document.createElement("canvas").getContext("2d")}catch{return null}})(),h=u?new Map:null;let f=!1,a=t,F=t.series.length,M="pending",S=0;const m=qr();let v=null,g=!1;const x=qr();let y=null,p=1,d=null;const N={cartesianDataBySeriesIndex:[],pieDataBySeriesIndex:[]},w=()=>{N.cartesianDataBySeriesIndex.length=0,N.pieDataBySeriesIndex.length=0},T=(b,A,I,B)=>{if(b.length!==A.length)return null;const W=A.length;if(W===0)return B??[];const k=B&&B.length===W?B:(()=>{const Y=new Array(W);for(let O=0;O<W;O++){const V=A[O],{x:K}=yt(V),j=Xn(V)?V[2]:V==null?void 0:V.size;Y[O]=Xn(V)?j==null?[K,0]:[K,0,j]:j==null?{x:K,y:0}:{x:K,y:0,size:j}}return Y})(),$=xt(I);for(let Y=0;Y<W;Y++){const O=yt(b[Y]).y,V=yt(A[Y]).y,K=Number.isFinite(O)&&Number.isFinite(V)?Hn(O,V,$):V,j=k[Y];Xn(j)?j[1]=K:j.y=K}return k},R=(b,A,I,B)=>{var V,K;const W=b.data,k=A.data;if(W.length!==k.length)return A;const $=k.length,Y=B&&B.length===$?B:(()=>{const j=new Array($);for(let me=0;me<$;me++)j[me]={...k[me],value:0};return j})(),O=xt(I);for(let j=0;j<$;j++){const me=(V=W[j])==null?void 0:V.value,ae=(K=k[j])==null?void 0:K.value,Me=typeof me=="number"&&typeof ae=="number"&&Number.isFinite(me)&&Number.isFinite(ae)?Math.max(0,Hn(me,ae,O)):typeof ae=="number"&&Number.isFinite(ae)?ae:0;Y[j].value=Me}return{...A,data:Y}},P=(b,A,I,B)=>{if(b.length!==A.length)return A;const W=new Array(A.length);for(let k=0;k<A.length;k++){const $=b[k],Y=A[k];if($.type!==Y.type){W[k]=Y;continue}if(Y.type==="pie"){const Me=(B==null?void 0:B.pieDataBySeriesIndex[k])??null,Oe=R($,Y,I,Me);B&&(B.pieDataBySeriesIndex[k]=Oe.data),W[k]=Oe;continue}const O=$,V=Y,K=O.data,j=V.data;if(K.length!==j.length){W[k]=Y;continue}if(j.length>jc){W[k]=Y;continue}const me=(B==null?void 0:B.cartesianDataBySeriesIndex[k])??null,ae=T(K,j,I,me);if(!ae){W[k]=Y;continue}B&&(B.cartesianDataBySeriesIndex[k]=ae),W[k]={...Y,data:ae}}return W},C=(b,A,I)=>{const B=Yn(b.from.xBaseDomain,b.to.xBaseDomain,A),W=Zt(B,I),k=Yn(b.from.yBaseDomain,b.to.yBaseDomain,A),$=P(b.from.series,b.to.series,A,null);return{xBaseDomain:B,xVisibleDomain:{min:W.min,max:W.max},yBaseDomain:k,series:$}},E=new Set;let D=new Array(t.series.length).fill(null),L=new Array(t.series.length).fill(null),U=a.series,_=a.series,H=[],Z=!1,X=null,ie=null,oe=null,q=!1;const ee=new Map;let we=new Array(a.series.length).fill("unknown");const ve=new Set;let ue=o&&((Cs=a.tooltip)==null?void 0:Cs.show)!==!1?Or(o):null,ne=null,be=null,ge=null;const Ae=(b,A,I,B)=>{if(ue==null||ue.show(b,A,I),!s&&(n!=null&&n.onTooltipUpdate)){const W=Array.isArray(B)?B:[B];n.onTooltipUpdate({content:I,params:W,x:b,y:A})}},de=()=>{ue==null||ue.hide(),!s&&(n!=null&&n.onTooltipUpdate)&&n.onTooltipUpdate(null)},Ne=()=>{ne=null,be=null,ge=null,de()},re=b=>{!s&&(n!=null&&n.onCrosshairMove)&&n.onCrosshairMove(b)},te=b=>{!s&&(n!=null&&n.onHoverChange)&&n.onHoverChange(b)};((b,A)=>{if(l==null||l.update(b,A),!s&&(n!=null&&n.onLegendUpdate)){const I=b.map((B,W)=>({name:B.name??"",color:B.color??"#888",seriesIndex:W}));n.onLegendUpdate(I)}})(a.series,a.theme);let ye=Ws(i);const fe=bo(i,{targetFormat:r}),Te=sr(i,{targetFormat:r}),Le=sr(i,{targetFormat:r}),Be=Ea(i,{targetFormat:r});Be.setVisible(!1);const _e=Ga(i,{targetFormat:r});_e.setVisible(!1);const Tt=Qr(e,a),Ge=s&&Xe(e.canvas)?ka(e.canvas,Tt):null;let Pe={source:"mouse",x:0,y:0,gridX:0,gridY:0,isInGrid:!1,hasPointer:!1},He=null,Ke;const it=new Set;let We=null;const Ft=(b,A)=>{const I=Array.from(it);for(const B of I)B(b,A)},$e=(b,A)=>{const I=b!==null&&Number.isFinite(b)?b:null;He===I&&Ke===A||(He=I,Ke=A,Ft(He,Ke))},Ye=()=>{var b;(b=n==null?void 0:n.onRequestRender)==null||b.call(n)},Pt=b=>b?Number.isFinite(b.start)&&Number.isFinite(b.end)&&b.start<=0&&b.end>=100:!0,Je=()=>{X!==null&&(cancelAnimationFrame(X),X=null),ie!==null&&(clearTimeout(ie),ie=null),Z=!1},ft=()=>{oe!==null&&(clearTimeout(oe),oe=null)},Rt=()=>{var Y;if(ee.size===0)return!1;ve.clear();const b=(Q==null?void 0:Q.getRange())??null,A=Pt(b),I=a.autoScroll===!0&&Q!=null&&a.xAxis.min==null&&a.xAxis.max==null,B=qt(a,L),W=b?Zt(B,b):null;let k=!1;for(const[O,V]of ee){if(V.length===0)continue;const K=a.series[O];if(!(!K||K.type==="pie")){if(k=!0,K.type==="candlestick"){let j=D[O];if(!j){const ae=K.rawData??K.data;j=ae.length===0?[]:ae.slice(),D[O]=j,L[O]=K.rawBounds??null}const me=V;j.push(...me),L[O]=Jc(L[O],me)}else{let j=D[O];if(!j){const ae=K.rawData??K.data;j=ae.length===0?[]:ae.slice(),D[O]=j,L[O]=K.rawBounds??Ri(j)}const me=V;if(K.type==="line"&&K.sampling==="none"&&A&&we[O]==="fullRawLine")try{ye.appendSeries(O,me),ve.add(O)}catch{}j.push(...me),L[O]=Kc(L[O],me)}H[O]=null}}if(ee.clear(),!k)return!1;if(Q){const O=_i(),V=Q;(Y=V.setSpanConstraints)==null||Y.call(V,O.minSpan,O.maxSpan)}if(I&&b&&W){const O=b;if(O.end>=99.5){const V=O.end-O.start,K=Q;K.setRangeAnchored?K.setRangeAnchored(100-V,100,"end"):Q.setRange(100-V,100)}else{const V=qt(a,L),K=V.max-V.min;if(Number.isFinite(K)&&K>0){const j=(W.min-V.min)/K*100,me=(W.max-V.min)/K*100,ae=Math.max(0,Math.min(100,j)),Me=Math.max(0,Math.min(100,me));Q.setRange(ae,Me)}}}Gi();const $=(Q==null?void 0:Q.getRange())??null;return($==null||Pt($))&&(_=U),!0},At=b=>{if(f)return;const A=(b==null?void 0:b.requestRenderAfter)??!0,I=Rt(),B=(Q==null?void 0:Q.getRange())??null,W=Pt(B),k=B!=null&&!W;let $=!1;q?(q=!1,ft(),!B||W?_=U:ri(),$=!0):I&&k&&(q=!1,ft(),ri(),$=!0),(I||$)&&A&&Ye()},_t=b=>{f||Z||(X!==null&&(cancelAnimationFrame(X),X=null),ie!==null&&(clearTimeout(ie),ie=null),Z=!0,X=requestAnimationFrame(()=>{if(X=null,f){Je();return}ie!==null&&(clearTimeout(ie),ie=null),Z=!1,At()}),ie=(typeof self<"u"?self:window).setTimeout(()=>{if(f){Je();return}Z&&(X!==null&&(cancelAnimationFrame(X),X=null),Z=!1,ie=null,At())},16))},yn=()=>{f||(ft(),q=!1,oe=(typeof self<"u"?self:window).setTimeout(()=>{oe=null,!f&&(q=!0,_t())},100))},sn=(b,A)=>{let I,B;if(Xe(b)){const $=b.getBoundingClientRect();if(!($.width>0)||!($.height>0))return null;I=$.width,B=$.height}else{const $=e.devicePixelRatio??1;if(console.log("[getPlotSizeCssPx] OffscreenCanvas dimensions:",{canvasWidth:b.width,canvasHeight:b.height,dpr:$,calculatedCssWidth:b.width/$,calculatedCssHeight:b.height/$}),I=b.width/$,B=b.height/$,!(I>0)||!(B>0))return null}const W=I-A.left-A.right,k=B-A.top-A.bottom;return!(W>0)||!(k>0)?null:{plotWidthCss:W,plotHeightCss:k}},Hl=(b,A)=>{const I=e.canvas;if(!I)return null;const B=sn(I,b);if(!B)return null;const W=Gn().domain(A.xDomain.min,A.xDomain.max).range(0,B.plotWidthCss),k=Gn().domain(A.yDomain.min,A.yDomain.max).range(B.plotHeightCss,0),$={xScale:W,yScale:k,plotWidthCss:B.plotWidthCss,plotHeightCss:B.plotHeightCss};return console.log("[computeInteractionScalesGridCssPx] Computed interaction scales:",{canvasType:Xe(I)?"HTMLCanvasElement":"OffscreenCanvas",plotWidthCss:$.plotWidthCss,plotHeightCss:$.plotHeightCss,xDomain:A.xDomain,yDomain:A.yDomain,xRange:[0,B.plotWidthCss],yRange:[B.plotHeightCss,0]}),$},ni=(b,A,I)=>{const B=a.series[b],{x:W,y:k}=yt(I);return{seriesName:(B==null?void 0:B.name)??"",seriesIndex:b,dataIndex:A,value:[W,k],color:(B==null?void 0:B.color)??"#888"}},Yl=(b,A,I)=>{const B=a.series[b];return at(I)?{seriesName:(B==null?void 0:B.name)??"",seriesIndex:b,dataIndex:A,value:[I[0],I[1],I[2],I[3],I[4]],color:(B==null?void 0:B.color)??"#888"}:{seriesName:(B==null?void 0:B.name)??"",seriesIndex:b,dataIndex:A,value:[I.timestamp,I.open,I.close,I.low,I.high],color:(B==null?void 0:B.color)??"#888"}},Ui=(b,A,I,B,W)=>{const k=.5*Math.min(B,W);if(!(k>0))return null;for(let $=a.series.length-1;$>=0;$--){const Y=b[$];if(Y.type!=="pie")continue;const O=Y,V=hl(O.center,B,W),K=ns(O.radius,k),j=Ic(A,I,{seriesIndex:$,series:O},V,K);if(j)return j}return null},Li=(b,A,I,B)=>{for(let W=b.length-1;W>=0;W--){const k=b[W];if(k.type!=="candlestick")continue;const $=k,Y=wc($,$.data,B.xScale,B.plotWidthCss),O=Mc([$],A,I,B.xScale,B.yScale,Y);if(!O)continue;return{params:Yl(W,O.dataIndex,O.point),match:{point:O.point},seriesIndex:W}}return null},ql=b=>{if(Pe={source:"mouse",x:b.x,y:b.y,gridX:b.gridX,gridY:b.gridY,isInGrid:b.isInGrid,hasPointer:!0},b.isInGrid&&We){const A=We.xScale.invert(b.gridX);$e(Number.isFinite(A)?A:null,"mouse")}else b.isInGrid||$e(null,"mouse");Be.setVisible(b.isInGrid),re(b.isInGrid?b.x:null),te(b.isInGrid?b:null),Ye()},Zl=b=>{Pe.source==="mouse"&&(Pe={...Pe,isInGrid:!1,hasPointer:!1},Be.setVisible(!1),Ne(),re(null),te(null),$e(null,"mouse"),Ye())};Ge&&(Ge.on("mousemove",ql),Ge.on("mouseleave",Zl));let Q=null,qe=null,Et=null,jt=null;const ii=new Set,jl=b=>{const A=Array.from(ii);for(const I of A)I(b)},Kl=b=>{var $,Y;const A=($=b.dataZoom)==null?void 0:$.find(O=>(O==null?void 0:O.type)==="inside"),I=(Y=b.dataZoom)==null?void 0:Y.find(O=>(O==null?void 0:O.type)==="slider"),B=A??I;if(!B)return null;const W=Number.isFinite(B.start)?B.start:0,k=Number.isFinite(B.end)?B.end:100;return{start:W,end:k,hasInside:!!A}},xn=b=>Math.min(100,Math.max(0,b)),Jl=b=>{let A=null,I=null;const B=b.dataZoom??[];for(const W of B)if(W&&!(W.type!=="inside"&&W.type!=="slider")){if(Number.isFinite(W.minSpan)){const k=xn(W.minSpan);A=A==null?k:Math.max(A,k)}if(Number.isFinite(W.maxSpan)){const k=xn(W.maxSpan);I=I==null?k:Math.min(I,k)}}return{minSpan:A??void 0,maxSpan:I??void 0}},Ql=()=>{if(a.xAxis.type==="category")return null;let b=0;for(let I=0;I<a.series.length;I++){const B=a.series[I];if(B.type==="pie")continue;if(B.type==="candlestick"){const k=D[I]??B.rawData??B.data;b=Math.max(b,k.length);continue}const W=D[I]??B.rawData??B.data;b=Math.max(b,W.length)}if(b<2)return null;const A=100/(b-1);return Number.isFinite(A)?xn(A):null},_i=()=>{const b=Jl(a),A=Ql(),I=Number.isFinite(b.minSpan)?xn(b.minSpan):A??.5,B=Number.isFinite(b.maxSpan)?xn(b.maxSpan):100;return{minSpan:I,maxSpan:B}},ys=()=>{var A;const b=Kl(a);if(!b){qe==null||qe.dispose(),qe=null,Et==null||Et(),Et=null,Q=null,jt=null;return}if(Q){const I=_i(),B=Q;(A=B.setSpanConstraints)==null||A.call(B,I.minSpan,I.maxSpan),(jt==null||jt.start!==b.start||jt.end!==b.end)&&(Q.setRange(b.start,b.end),jt={start:b.start,end:b.end})}else{const I=_i();Q=Ka(b.start,b.end,I),jt={start:b.start,end:b.end},Et=Q.onChange(B=>{eu(),Ye(),yn(),jl({start:B.start,end:B.end})})}b.hasInside&&Ge?qe||(qe=Ya(Ge,Q),qe.enable()):(qe==null||qe.dispose(),qe=null)},xs=()=>{const b=a.series.length;D=new Array(b).fill(null),L=new Array(b).fill(null),ee.clear();for(let A=0;A<b;A++){const I=a.series[A];if(I.type==="pie")continue;if(I.type==="candlestick"){const k=I.rawData??I.data,$=k.length===0?[]:k.slice();D[A]=$,L[A]=I.rawBounds??null;continue}const B=I.rawData??I.data,W=B.length===0?[]:B.slice();D[A]=W,L[A]=I.rawBounds??Ri(W)}},Gi=()=>{const b=new Array(a.series.length);for(let A=0;A<a.series.length;A++){const I=a.series[A];if(I.type==="pie"){b[A]=I;continue}if(I.type==="candlestick"){const $=D[A]??I.rawData??I.data,Y=L[A]??I.rawBounds??void 0,O=I.sampling==="ohlc"&&$.length>I.samplingThreshold?ui($,I.samplingThreshold):$;b[A]={...I,rawData:$,rawBounds:Y,data:O};continue}const B=D[A]??I.rawData??I.data,W=L[A]??I.rawBounds??void 0,k=Qt(B,I.sampling,I.samplingThreshold);b[A]={...I,rawData:B,rawBounds:W,data:k}}U=b};function eu(){const b=(Q==null?void 0:Q.getRange())??null,A=qt(a,L),I=Zt(A,b);if(b==null||Number.isFinite(b.start)&&Number.isFinite(b.end)&&b.start<=0&&b.end>=100){_=U;return}const W=new Array(U.length);for(let k=0;k<U.length;k++){const $=U[k];if($.type==="pie"){W[k]=$;continue}const Y=H[k];if(Y&&I.min>=Y.cachedRange.min&&I.max<=Y.cachedRange.max){$.type==="candlestick"?W[k]={...$,data:Kn(Y.data,I.min,I.max)}:W[k]={...$,data:Zn(Y.data,I.min,I.max)};continue}$.type==="candlestick"?W[k]={...$,data:Kn($.data,I.min,I.max)}:W[k]={...$,data:Zn($.data,I.min,I.max)}}_=W}function ri(){const b=(Q==null?void 0:Q.getRange())??null,A=qt(a,L),I=Zt(A,b),k=(I.max-I.min)*.1,$=I.min-k,Y=I.max+k,O=2,V=2e5,K=32,j=Math.max(.001,Math.min(1,I.spanFraction)),me=new Array(U.length);for(let ae=0;ae<U.length;ae++){const Me=U[ae];if(Me.type==="pie"){me[ae]=Me;continue}if(b==null||Number.isFinite(b.start)&&Number.isFinite(b.end)&&b.start<=0&&b.end>=100){me[ae]=Me;continue}if(Me.type==="candlestick"){const rt=D[ae]??Me.rawData??Me.data,dt=Kn(rt,$,Y),Ie=Me.sampling,Jt=Me.samplingThreshold,Fn=Number.isFinite(Jt)?Math.max(1,Jt|0):1,si=Math.min(V,Math.max(O,Fn*K)),wn=Lt(Math.round(Fn/j),O,si),vn=Ie==="ohlc"&&dt.length>wn?ui(dt,wn):dt;H[ae]={data:vn,cachedRange:{min:$,max:Y},timestamp:Date.now()};const oi=Kn(vn,I.min,I.max);me[ae]={...Me,data:oi};continue}const Ze=D[ae]??Me.rawData??Me.data,J=Zn(Ze,$,Y),Re=Me.sampling,ce=Me.samplingThreshold,Nt=Number.isFinite(ce)?Math.max(1,ce|0):1,Kt=Math.min(V,Math.max(O,Nt*K)),Ve=Lt(Math.round(Nt/j),O,Kt),on=Qt(J,Re,Ve);H[ae]={data:on,cachedRange:{min:$,max:Y},timestamp:Date.now()};const an=Zn(on,I.min,I.max);me[ae]={...Me,data:an}}_=me}xs(),Gi(),ys(),ri(),H=new Array(a.series.length).fill(null);const mt=[],wt=[],Bt=[],vt=[],Dt=[],Wi=ko(i,{targetFormat:r}),Fs=b=>{for(;mt.length>b;){const A=mt.pop();A==null||A.dispose()}for(;mt.length<b;)mt.push(No(i,{targetFormat:r}))},ws=b=>{for(;wt.length>b;){const A=wt.pop();A==null||A.dispose()}for(;wt.length<b;)wt.push(Ro(i,{targetFormat:r}))},vs=b=>{for(;Bt.length>b;){const A=Bt.pop();A==null||A.dispose()}for(;Bt.length<b;)Bt.push(jo(i,{targetFormat:r}))},Ns=b=>{for(;vt.length>b;){const A=vt.pop();A==null||A.dispose()}for(;vt.length<b;)vt.push(ra(i,{targetFormat:r}))},Ms=b=>{for(;Dt.length>b;){const A=Dt.pop();A==null||A.dispose()}for(;Dt.length<b;)Dt.push(ba(i,{targetFormat:r}))};Fs(a.series.length),ws(a.series.length),vs(a.series.length),Ns(a.series.length),Ms(a.series.length);const Gt=()=>{if(f)throw new Error("RenderCoordinator is disposed.")},Is=()=>{if(y)try{x.cancel(y)}catch{}y=null,p=1,d=null,w()},Ss=(b,A)=>b.min===A.min&&b.max===A.max,tu=(b,A)=>{if(b.length!==A.length)return!0;for(let I=0;I<b.length;I++){const B=b[I],W=A[I];if(B.type!==W.type)return!0;if(B.type==="pie"){const k=B,$=W;if(k.data!==$.data||k.data.length!==$.data.length)return!0}else{const k=B,$=W,Y=k.rawData??k.data,O=$.rawData??$.data;if(Y!==O||Y.length!==O.length)return!0}}return!1},nu=b=>{var Ze;Gt();const A=(Q==null?void 0:Q.getRange())??null,I=(()=>{if(d&&y){try{x.update(performance.now())}catch{}return C(d,p,A)}const J=qt(a,L),Re=Zt(J,A),ce=Ei(a,L);return{xBaseDomain:J,xVisibleDomain:{min:Re.min,max:Re.max},yBaseDomain:ce,series:_}})();Is();const B=tu(a.series,b.series);if(a=b,U=b.series,_=b.series,we=new Array(b.series.length).fill("unknown"),H=new Array(b.series.length).fill(null),l==null||l.update(b.series,b.theme),ft(),q=!1,Je(),xs(),Gi(),ys(),ri(),o){const J=((Ze=a.tooltip)==null?void 0:Ze.show)!==!1;J&&!ue&&(ue=Or(o),ne=null,be=null,ge=null),!J&&ue&&Ne()}else Ne();const W=b.series.length;if(Fs(W),ws(W),vs(W),Ns(W),Ms(W),W<F)for(let J=W;J<F;J++)ye.removeSeries(J);if(F=W,a.animation===!1&&M==="running"&&(m.cancelAll(),v=null,M="done",S=1),a.animation===!1){Is();return}const k=(Q==null?void 0:Q.getRange())??null,$=qt(a,L),Y=Zt($,k),O=Ei(a,L),V=_,K=!Ss(I.xBaseDomain,$)||!Ss(I.yBaseDomain,O);if(!(g&&(K||B)))return;const me=wl(a.animation);if(!me)return;d={from:{xBaseDomain:I.xBaseDomain,xVisibleDomain:I.xVisibleDomain,yBaseDomain:I.yBaseDomain,series:I.series},to:{xBaseDomain:$,xVisibleDomain:{min:Y.min,max:Y.max},yBaseDomain:O,series:V}},w();const ae=me.delayMs+me.durationMs,Me=J=>{const Re=xt(J);if(!(ae>0))return 1;const ce=Re*ae;if(ce<=me.delayMs)return 0;if(!(me.durationMs>0))return 1;const Nt=(ce-me.delayMs)/me.durationMs;return me.easing(Nt)};p=0;const Oe=x.animate(0,1,ae,Me,J=>{f||y!==Oe||(p=xt(J),p<1&&Ye())},()=>{f||y!==Oe||(p=1,d=null,y=null,w())});y=Oe},iu=(b,A)=>{if(Gt(),!Number.isFinite(b)||b<0||b>=a.series.length||!A||A.length===0)return;if(a.series[b].type==="pie"){E.has(b)||(E.add(b),console.warn(`RenderCoordinator.appendData(${b}, ...): pie series are not supported by streaming append.`));return}const B=ee.get(b);B?B.push(...A):ee.set(b,Array.from(A)),_t()},ru=b=>{switch(b.type){case"area":return!0;case"line":return b.areaStyle!=null;case"bar":return!1;case"scatter":return!1;case"pie":return!1;case"candlestick":return!1;default:return Pi(b)}};return{setOptions:nu,appendData:iu,getInteractionX:()=>He,setInteractionX:(b,A)=>{Gt();const I=b!==null&&Number.isFinite(b)?b:null;Pe={...Pe,source:I===null?"mouse":"sync"},$e(I,A),I===null&&Pe.hasPointer===!1&&(Be.setVisible(!1),_e.setVisible(!1),de(),re(null)),Ye()},onInteractionXChange:b=>(Gt(),it.add(b),()=>{it.delete(b)}),getZoomRange:()=>(Q==null?void 0:Q.getRange())??null,setZoomRange:(b,A)=>{Gt(),Q&&Q.setRange(b,A)},onZoomRangeChange:b=>(Gt(),ii.add(b),()=>{ii.delete(b)}),handlePointerEvent:b=>{if(Gt(),s||!e.canvas||!Number.isFinite(b.x)||!Number.isFinite(b.y)||!Number.isFinite(b.gridX)||!Number.isFinite(b.gridY)||!Number.isFinite(b.plotWidthCss)||!Number.isFinite(b.plotHeightCss))return;const{type:I,x:B,y:W,gridX:k,gridY:$,plotWidthCss:Y,plotHeightCss:O,isInGrid:V}=b;if(I==="leave"){Pe={...Pe,isInGrid:!1,hasPointer:!1},Be.setVisible(!1),ne=null,be=null,ge=null,de(),re(null),te(null),$e(null,"mouse"),Ye();return}if(I==="move"){Pe={source:"mouse",x:B,y:W,gridX:k,gridY:$,isInGrid:V,hasPointer:!0},Ye();return}if(I==="click"){if(!(n!=null&&n.onClickData))return;let K=null,j=null,me=null;if(V&&We){if(j=Ui(_,k,$,Y,O),!j){const ae=Li(_,k,$,We);ae&&(me={seriesIndex:ae.seriesIndex,dataIndex:ae.params.dataIndex,point:ae.match.point})}!j&&!me&&(K=vi(_,k,$,We.xScale,We.yScale,20))}n.onClickData({x:B,y:W,gridX:k,gridY:$,isInGrid:V,nearest:K,pieSlice:j,candlestick:me});return}if(I==="wheel"){if(!V||!Q)return;const K=b.deltaX??0,j=b.deltaY??0,me=b.deltaMode??0,ae=(rt,dt)=>{if(!Number.isFinite(rt)||rt===0)return 0;switch(me){case 1:return rt*16;case 2:return rt*(Number.isFinite(dt)&&dt>0?dt:800);default:return rt}},Me=ae(j,O),Oe=ae(K,Y);if(Math.abs(Oe)>Math.abs(Me)&&Oe!==0){const{start:rt,end:dt}=Q.getRange(),Ie=dt-rt;if(!Number.isFinite(Ie)||Ie===0)return;const Jt=Oe/Y*Ie;if(!Number.isFinite(Jt)||Jt===0)return;Q.pan(Jt);return}if(Me===0)return;const Ze=Math.abs(Me);if(!Number.isFinite(Ze)||Ze===0)return;const J=Math.min(Ze,200),ce=Math.exp(J*.002);if(!(ce>1))return;const{start:Nt,end:Kt}=Q.getRange(),Ve=Kt-Nt;if(!Number.isFinite(Ve)||Ve===0)return;const on=Math.min(1,Math.max(0,k/Y)),an=Math.min(100,Math.max(0,Nt+on*Ve));Me<0?Q.zoomIn(an,ce):Q.zoomOut(an,ce),Ye();return}},render:()=>{var Fn,si,wn,vn,oi,Ts,Ps,Rs,As;if(Gt(),!e.canvasContext||!e.canvas)return;(ee.size>0||q)&&(Je(),At({requestRenderAfter:!1}));const b=a.series.some(G=>G.type!=="pie"),A=_;if(M!=="done"){const G=Fl(a.animation),z=(()=>{for(let xe=0;xe<A.length;xe++){const se=A[xe];switch(se.type){case"pie":{if(se.data.some(le=>typeof(le==null?void 0:le.value)=="number"&&Number.isFinite(le.value)&&le.value>0))return!0;break}case"line":case"area":case"bar":case"scatter":case"candlestick":{if(se.data.length>0)return!0;break}default:Pi(se)}}return!1})();if(M==="pending"&&G&&z){const xe=G.delayMs+G.durationMs,se=le=>{const Se=xt(le);if(!(xe>0))return 1;const he=Se*xe;if(he<=G.delayMs)return 0;if(!(G.durationMs>0))return 1;const pe=(he-G.delayMs)/G.durationMs;return G.easing(pe)};S=0,M="running",v=m.animate(0,1,xe,se,le=>{f||M!=="running"||(S=xt(le),S<1&&Ye())},()=>{f||(M="done",S=1,v=null)})}m.update(performance.now())}d!==null&&y&&x.update(performance.now());const I=Qr(e,a);Ge==null||Ge.updateGridArea(I);const B=(Q==null?void 0:Q.getRange())??null,W=d?xt(p):1,k=d?Yn(d.from.xBaseDomain,d.to.xBaseDomain,W):qt(a,L),$=d?Yn(d.from.yBaseDomain,d.to.yBaseDomain,W):Ei(a,L),Y=Zt(k,B),O=tl(I),V=ts(I),K=Gn().domain(Y.min,Y.max).range(O.left,O.right),j=Gn().domain($.min,$.max).range(O.bottom,O.top),me=I.devicePixelRatio,ae=e.canvas?jr(e.canvas,me):0,Me=Math.abs(Y.max-Y.min);let Oe=pn,Ze=[];if(a.xAxis.type==="time"){const G=xl({axisMin:Vn(a.xAxis.min),axisMax:Vn(a.xAxis.max),xScale:K,plotClipLeft:O.left,plotClipRight:O.right,canvasCssWidth:ae,visibleRangeMs:Me,measureCtx:u,measureCache:h??void 0,fontSize:a.theme.fontSize,fontFamily:a.theme.fontFamily||"sans-serif"});Oe=G.tickCount,Ze=G.tickValues}else{const G=gt(a.xAxis.min)??K.invert(O.left),z=gt(a.xAxis.max)??K.invert(O.right);Ze=Jn(G,z,Oe)}const J=Hl(I,{xDomain:{min:Y.min,max:Y.max},yDomain:$});We=J;const Re=d&&W<1?P(d.from.series,d.to.series,W,N):_;if(Pe.source==="mouse"&&Pe.hasPointer&&Pe.isInGrid&&J){const G=J.xScale.invert(Pe.gridX);$e(Number.isFinite(G)?G:null,"mouse")}let ce=Pe;if(Pe.source==="sync")if(He===null||!J)ce={...Pe,hasPointer:!1,isInGrid:!1};else{const G=J.xScale.scale(He),z=J.plotHeightCss*.5,xe=Number.isFinite(G)&&Number.isFinite(z)&&G>=0&&G<=J.plotWidthCss&&z>=0&&z<=J.plotHeightCss;ce={source:"sync",gridX:Number.isFinite(G)?G:0,gridY:Number.isFinite(z)?z:0,x:I.left+(Number.isFinite(G)?G:0),y:I.top+(Number.isFinite(z)?z:0),isInGrid:xe,hasPointer:xe}}if(fe.prepare(I,{color:a.theme.gridLineColor}),b&&(Te.prepare(a.xAxis,K,"x",I,a.theme.axisLineColor,a.theme.axisTickColor,Oe),Le.prepare(a.yAxis,j,"y",I,a.theme.axisLineColor,a.theme.axisTickColor,pn)),ce.hasPointer&&ce.isInGrid){const G={showX:!0,showY:ce.source!=="sync",color:es(a.theme.axisLineColor,.6),lineWidth:Xc};Be.prepare(ce.x,ce.y,I,G),Be.setVisible(!0),re(ce.x)}else Be.setVisible(!1),re(null);if(ce.source==="mouse"&&ce.hasPointer&&ce.isInGrid)if(J){const G=vi(Re,ce.gridX,ce.gridY,J.xScale,J.yScale);if(G){const{x:z,y:xe}=yt(G.point),se=J.xScale.scale(z),le=J.yScale.scale(xe);if(Number.isFinite(se)&&Number.isFinite(le)){const Se=I.left+se,he=I.top+le,pe=ts(I),Fe={centerDeviceX:Se*I.devicePixelRatio,centerDeviceY:he*I.devicePixelRatio,devicePixelRatio:I.devicePixelRatio,canvasWidth:I.canvasWidth,canvasHeight:I.canvasHeight,scissor:pe},Ce=((Fn=a.series[G.seriesIndex])==null?void 0:Fn.color)??"#888";_e.prepare(Fe,Ce,zc),_e.setVisible(!0)}else _e.setVisible(!1)}else _e.setVisible(!1)}else _e.setVisible(!1);else _e.setVisible(!1);if(ce.hasPointer&&ce.isInGrid&&((si=a.tooltip)==null?void 0:si.show)!==!1){const G=e.canvas;if(console.log("[Tooltip block] State check:",{hasInteractionScales:!!J,domOverlaysEnabled:s,hasCanvas:!!G,canvasType:G?Xe(G)?"HTMLCanvasElement":"OffscreenCanvas":"null",interactionScales:J?{plotWidthCss:J.plotWidthCss,plotHeightCss:J.plotHeightCss}:null}),J&&(!s||G&&Xe(G))){const z=(wn=a.tooltip)==null?void 0:wn.formatter,xe=((vn=a.tooltip)==null?void 0:vn.trigger)??"item",se=Xe(G)?G.offsetLeft+ce.x:ce.x,le=Xe(G)?G.offsetTop+ce.y:ce.y;if(ce.source==="sync"){const Se=Wr(Re,ce.gridX,J.xScale);if(Se.length===0)Ne();else if(xe==="axis"){const he=Se.map(Fe=>ni(Fe.seriesIndex,Fe.dataIndex,Fe.point)),pe=z?z(he):Si(he);pe&&(pe!==ne||se!==be||le!==ge)?(ne=pe,be=se,ge=le,Ae(se,le,pe,he)):pe||Ne()}else{const he=Se[0],pe=ni(he.seriesIndex,he.dataIndex,he.point),Fe=z?z(pe):hn(pe);Fe&&(Fe!==ne||se!==be||le!==ge)?(ne=Fe,be=se,ge=le,Ae(se,le,Fe,pe)):Fe||Ne()}}else if(xe==="axis"){const Se=Ui(Re,ce.gridX,ce.gridY,J.plotWidthCss,J.plotHeightCss);if(Se){const he={seriesName:Se.slice.name,seriesIndex:Se.seriesIndex,dataIndex:Se.dataIndex,value:[0,Se.slice.value],color:Se.slice.color},pe=z?z([he]):hn(he);pe&&(pe!==ne||se!==be||le!==ge)?(ne=pe,be=se,ge=le,Ae(se,le,pe,[he])):pe||Ne()}else{const he=Li(Re,ce.gridX,ce.gridY,J),pe=Wr(Re,ce.gridX,J.xScale);if(pe.length===0)if(he){const Fe=[he.params],Ce=z?z(Fe):Si(Fe);if(Ce){const De=Bi(he.match,J.xScale,J.yScale,I,G),Qe=(De==null?void 0:De.x)??se,ht=(De==null?void 0:De.y)??le;(Ce!==ne||Qe!==be||ht!==ge)&&(ne=Ce,be=Qe,ge=ht,Ae(Qe,ht,Ce,Fe))}else Ne()}else Ne();else{const Fe=pe.map(De=>ni(De.seriesIndex,De.dataIndex,De.point));he&&Fe.push(he.params);const Ce=z?z(Fe):Si(Fe);if(Ce){let De=se,Qe=le;if(he){const ht=Bi(he.match,J.xScale,J.yScale,I,G);ht&&(De=ht.x,Qe=ht.y)}(Ce!==ne||De!==be||Qe!==ge)&&(ne=Ce,be=De,ge=Qe,Ae(De,Qe,Ce,Fe))}else Ne()}}}else{const Se=Ui(Re,ce.gridX,ce.gridY,J.plotWidthCss,J.plotHeightCss);if(Se){const he={seriesName:Se.slice.name,seriesIndex:Se.seriesIndex,dataIndex:Se.dataIndex,value:[0,Se.slice.value],color:Se.slice.color},pe=z?z(he):hn(he);pe&&(pe!==ne||se!==be||le!==ge)?(ne=pe,be=se,ge=le,Ae(se,le,pe,he)):pe||Ne()}else{const he=Li(Re,ce.gridX,ce.gridY,J);if(he){const Fe=z?z(he.params):hn(he.params);if(Fe){const Ce=Bi(he.match,J.xScale,J.yScale,I,G),De=(Ce==null?void 0:Ce.x)??se,Qe=(Ce==null?void 0:Ce.y)??le;(Fe!==ne||De!==be||Qe!==ge)&&(ne=Fe,be=De,ge=Qe,Ae(De,Qe,Fe,he.params))}else Ne();return}const pe=vi(Re,ce.gridX,ce.gridY,J.xScale,J.yScale);if(!pe)Ne();else{const Fe=ni(pe.seriesIndex,pe.dataIndex,pe.point),Ce=z?z(Fe):hn(Fe);Ce&&(Ce!==ne||se!==be||le!==ge)?(ne=Ce,be=se,ge=le,Ae(se,le,Ce,Fe)):Ce||Ne()}}}}else Ne()}else Ne();const Nt=a.yAxis.min??$.min,Kt=[],Ve=M==="running"?xt(S):1;for(let G=0;G<Re.length;G++){const z=Re[G];switch(z.type){case"area":{const xe=z.baseline??Nt;mt[G].prepare(z,z.data,K,j,xe);break}case"line":{ve.has(G)||ye.setSeries(G,z.data);const xe=ye.getSeriesBuffer(G);wt[G].prepare(z,xe,K,j);const se=(Q==null?void 0:Q.getRange())??null;if((se==null||Number.isFinite(se.start)&&Number.isFinite(se.end)&&se.start<=0&&se.end>=100)&&z.sampling==="none"?we[G]="fullRawLine":we[G]="other",z.areaStyle){const Se={type:"area",name:z.name,rawData:z.data,data:z.data,color:z.areaStyle.color,areaStyle:z.areaStyle,sampling:z.sampling,samplingThreshold:z.samplingThreshold};mt[G].prepare(Se,Se.data,K,j,Nt)}break}case"bar":{Kt.push(z);break}case"scatter":{const xe=Ve<1?{...z,color:es(z.color,Ve)}:z;Bt[G].prepare(xe,z.data,K,j,I);break}case"pie":{if(Ve<1){const xe=e.canvas,se=(J==null?void 0:J.plotWidthCss)??(xe&&Xe(xe)?(oi=sn(xe,I))==null?void 0:oi.plotWidthCss:null),le=(J==null?void 0:J.plotHeightCss)??(xe&&Xe(xe)?(Ts=sn(xe,I))==null?void 0:Ts.plotHeightCss:null),Se=typeof se=="number"&&typeof le=="number"?.5*Math.min(se,le):0;if(Se>0){const he=ns(z.radius,Se),pe=Math.max(0,he.inner)*Ve,Fe=Math.max(pe,he.outer)*Ve,Ce={...z,radius:[pe,Fe]};vt[G].prepare(Ce,I);break}}vt[G].prepare(z,I);break}case"candlestick":{Dt[G].prepare(z,z.data,K,j,I,a.theme.backgroundColor);break}default:Pi(z)}}const on=Ve<1?Nl(j,O,Kt,Ve):j;Wi.prepare(Kt,ye,K,on,I);const an=e.canvasContext.getCurrentTexture().createView(),rt=i.createCommandEncoder({label:"renderCoordinator/commandEncoder"}),dt=Qs(a.theme.backgroundColor,{r:0,g:0,b:0,a:1}),Ie=rt.beginRenderPass({label:"renderCoordinator/renderPass",colorAttachments:[{view:an,clearValue:dt,loadOp:"clear",storeOp:"store"}]});fe.render(Ie);for(let G=0;G<Re.length;G++)Re[G].type==="pie"&&vt[G].render(Ie);for(let G=0;G<Re.length;G++)if(ru(Re[G]))if(Ve<1){const z=Lt(Math.floor(V.w*Ve),0,V.w);z>0&&V.h>0&&(Ie.setScissorRect(V.x,V.y,z,V.h),mt[G].render(Ie),Ie.setScissorRect(0,0,I.canvasWidth,I.canvasHeight))}else Ie.setScissorRect(V.x,V.y,V.w,V.h),mt[G].render(Ie),Ie.setScissorRect(0,0,I.canvasWidth,I.canvasHeight);V.w>0&&V.h>0&&(Ie.setScissorRect(V.x,V.y,V.w,V.h),Wi.render(Ie),Ie.setScissorRect(0,0,I.canvasWidth,I.canvasHeight));for(let G=0;G<Re.length;G++)Re[G].type==="candlestick"&&Dt[G].render(Ie);for(let G=0;G<Re.length;G++)Re[G].type==="scatter"&&Bt[G].render(Ie);for(let G=0;G<Re.length;G++)if(Re[G].type==="line")if(Ve<1){const z=Lt(Math.floor(V.w*Ve),0,V.w);z>0&&V.h>0&&(Ie.setScissorRect(V.x,V.y,z,V.h),wt[G].render(Ie),Ie.setScissorRect(0,0,I.canvasWidth,I.canvasHeight))}else Ie.setScissorRect(V.x,V.y,V.w,V.h),wt[G].render(Ie),Ie.setScissorRect(0,0,I.canvasWidth,I.canvasHeight);if(_e.render(Ie),b&&(Te.render(Ie),Le.render(Ie)),Be.render(Ie),Ie.end(),i.queue.submit([rt.finish()]),g=!0,b&&(c&&o||!s&&(n==null?void 0:n.onAxisLabelsUpdate))){const G=e.canvas,z=jr(G,e.devicePixelRatio??1),xe=Oc(G,e.devicePixelRatio??1);if(z<=0||xe<=0)return;const se=Xe(G)?G.offsetLeft:0,le=Xe(G)?G.offsetTop:0,Se=qn(O.left,z),he=qn(O.right,z),pe=Ai(O.top,xe),Fe=Ai(O.bottom,xe);c==null||c.clear();const Ce=[],De=[],Qe=a.xAxis.tickLength??Kr,ht=Fe+Qe+Ci+a.theme.fontSize*.5,Es=a.xAxis.type==="time",su=(()=>{if(Es)return null;const ze=gt(a.xAxis.min)??K.invert(O.left),st=gt(a.xAxis.max)??K.invert(O.right),Wt=Oe===1?0:(st-ze)/(Oe-1);return is(Wt)})();for(let ze=0;ze<Ze.length;ze++){const st=Ze[ze],Wt=K.scale(st),$t=qn(Wt,z),Mt=Ze.length===1?"middle":ze===0?"start":ze===Ze.length-1?"end":"middle",et=Es?ss(st,Me):rs(su,st);if(et==null)continue;const It={axis:"x",text:et,x:se+$t,y:le+ht,anchor:Mt,isTitle:!1};if(Ce.push(It),c){const St=c.addLabel(et,se+$t,le+ht,{fontSize:a.theme.fontSize,color:a.theme.textColor,anchor:Mt});Wn(St,It,a.theme)}}const $i=pn,ou=a.yAxis.tickLength??Kr,ki=gt(a.yAxis.min)??j.invert(O.bottom),Bs=gt(a.yAxis.max)??j.invert(O.top),au=(Bs-ki)/($i-1),cu=is(au),Oi=Se-ou-Ci,Vi=[];for(let ze=0;ze<$i;ze++){const st=ze/($i-1),Wt=ki+st*(Bs-ki),$t=j.scale(Wt),Mt=Ai($t,xe),et=rs(cu,Wt);if(et==null)continue;const It={axis:"y",text:et,x:se+Oi,y:le+Mt,anchor:"end",isTitle:!1};if(De.push(It),c){const St=c.addLabel(et,se+Oi,le+Mt,{fontSize:a.theme.fontSize,color:a.theme.textColor,anchor:"end"});Wn(St,It,a.theme),Vi.push(St)}}const Xi=Tc(a.theme.fontSize),zi=((Ps=a.xAxis.name)==null?void 0:Ps.trim())??"";if(zi.length>0){const ze=(Se+he)/2,st=ht+a.theme.fontSize*.5,Mt=((Rs=a.dataZoom)==null?void 0:Rs.some(St=>(St==null?void 0:St.type)==="slider"))??!1?xe-32:xe,et=(st+Mt)/2,It={axis:"x",text:zi,x:se+ze,y:le+et,anchor:"middle",isTitle:!0};if(Ce.push(It),c){const St=c.addLabel(zi,se+ze,le+et,{fontSize:Xi,color:a.theme.textColor,anchor:"middle"});Wn(St,It,a.theme)}}const Hi=((As=a.yAxis.name)==null?void 0:As.trim())??"";if(Hi.length>0){const ze=Vi.length===0?el(De,a.theme.fontSize):Vi.reduce((et,It)=>Math.max(et,It.getBoundingClientRect().width),0),st=(pe+Fe)/2,$t=Oi-ze-Ci-Xi*.5,Mt={axis:"y",text:Hi,x:se+$t,y:le+st,anchor:"middle",rotation:-90,isTitle:!0};if(De.push(Mt),c){const et=c.addLabel(Hi,se+$t,le+st,{fontSize:Xi,color:a.theme.textColor,anchor:"middle",rotation:-90});Wn(et,Mt,a.theme)}}!s&&(n!=null&&n.onAxisLabelsUpdate)&&n.onAxisLabelsUpdate(Ce,De)}},dispose:()=>{if(!f){f=!0;try{v&&m.cancel(v),m.cancelAll()}catch{}v=null,M="done",S=1;try{y&&x.cancel(y),x.cancelAll()}catch{}y=null,p=1,d=null,Je(),ft(),q=!1,ee.clear(),qe==null||qe.dispose(),qe=null,Et==null||Et(),Et=null,Q=null,jt=null,ii.clear(),Ge==null||Ge.dispose(),Be.dispose(),_e.dispose();for(let b=0;b<mt.length;b++)mt[b].dispose();mt.length=0;for(let b=0;b<wt.length;b++)wt[b].dispose();wt.length=0;for(let b=0;b<Bt.length;b++)Bt[b].dispose();Bt.length=0;for(let b=0;b<vt.length;b++)vt[b].dispose();vt.length=0;for(let b=0;b<Dt.length;b++)Dt[b].dispose();Dt.length=0,Wi.dispose(),fe.dispose(),Te.dispose(),Le.dispose(),ye.dispose(),ue==null||ue.dispose(),ue=null,l==null||l.dispose(),c==null||c.dispose()}}}}const Il={left:60,right:20,top:40,bottom:40},Qn=["#5470C6","#91CC75","#FAC858","#EE6666","#73C0DE","#3BA272","#FC8452","#9A60B4","#EA7CCC"],cs={width:2,opacity:1},ls={opacity:.25},lt={style:"classic",itemStyle:{upColor:"#22c55e",downColor:"#ef4444",upBorderColor:"#22c55e",downBorderColor:"#ef4444",borderWidth:1},barWidth:"80%",barMinWidth:1,barMaxWidth:50,sampling:"ohlc",samplingThreshold:5e3},ei={mode:"points",binSize:4,densityColormap:"viridis",densityNormalization:"log"},tt={grid:Il,xAxis:{type:"value"},yAxis:{type:"value"},autoScroll:!1,palette:Qn},Sl={backgroundColor:"#1a1a2e",textColor:"#e0e0e0",axisLineColor:"rgba(224,224,224,0.35)",axisTickColor:"rgba(224,224,224,0.55)",gridLineColor:"rgba(255,255,255,0.1)",colorPalette:[...["#00E5FF","#FF2D95","#B026FF","#00F5A0","#FFD300","#FF6B00","#4D5BFF","#FF3D3D"]],fontFamily:'system-ui, -apple-system, "Segoe UI", Roboto, Helvetica, Arial, "Apple Color Emoji", "Segoe UI Emoji"',fontSize:12},Cl={backgroundColor:"#ffffff",textColor:"#333333",axisLineColor:"rgba(0,0,0,0.35)",axisTickColor:"rgba(0,0,0,0.55)",gridLineColor:"rgba(0,0,0,0.1)",colorPalette:[...["#1F77B4","#FF7F0E","#2CA02C","#D62728","#9467BD","#8C564B","#E377C2","#17BECF"]],fontFamily:'system-ui, -apple-system, "Segoe UI", Roboto, Helvetica, Arial, "Apple Color Emoji", "Segoe UI Emoji"',fontSize:12};function Di(e){return e==="dark"?Sl:Cl}const Tl=e=>{if(!Array.isArray(e))return;const t=[];for(const n of e){if(n===null||typeof n!="object"||Array.isArray(n))continue;const i=n,r=i.type;if(r!=="inside"&&r!=="slider")continue;const s=i.xAxisIndex,o=i.start,c=i.end,l=i.minSpan,u=i.maxSpan,h=typeof s=="number"&&Number.isFinite(s)?s:void 0,f=typeof o=="number"&&Number.isFinite(o)?o:void 0,a=typeof c=="number"&&Number.isFinite(c)?c:void 0,F=typeof l=="number"&&Number.isFinite(l)?l:void 0,M=typeof u=="number"&&Number.isFinite(u)?u:void 0;t.push({type:r,xAxisIndex:h,start:f,end:a,minSpan:F,maxSpan:M})}return t},gn=e=>Array.isArray(e)?e.filter(t=>typeof t=="string").map(t=>t.trim()).filter(t=>t.length>0):[],Pl=e=>{const t=Di("dark");if(typeof e=="string"){const c=e.trim().toLowerCase();return Di(c==="light"?"light":"dark")}if(e===null||typeof e!="object"||Array.isArray(e))return t;const n=e,i=c=>{const l=n[c];if(typeof l!="string")return;const u=l.trim();return u.length>0?u:void 0},r=n.fontSize,s=typeof r=="number"&&Number.isFinite(r)?r:void 0,o=gn(n.colorPalette);return{backgroundColor:i("backgroundColor")??t.backgroundColor,textColor:i("textColor")??t.textColor,axisLineColor:i("axisLineColor")??t.axisLineColor,axisTickColor:i("axisTickColor")??t.axisTickColor,gridLineColor:i("gridLineColor")??t.gridLineColor,colorPalette:o.length>0?o:Array.from(t.colorPalette),fontFamily:i("fontFamily")??t.fontFamily,fontSize:s??t.fontSize}},Ct=e=>{if(typeof e!="string")return;const t=e.trim();return t.length>0?t:void 0},Rl=e=>{if(typeof e!="string")return;const t=e.trim().toLowerCase();return t==="none"||t==="lttb"||t==="average"||t==="max"||t==="min"||t==="ohlc"?t:void 0},Al=e=>{if(typeof e!="string")return;const t=e.trim().toLowerCase();return t==="points"||t==="density"?t:void 0},El=e=>{if(typeof e!="string")return;const t=e.trim().toLowerCase();return t==="linear"||t==="sqrt"||t==="log"?t:void 0},Bl=e=>{if(typeof e!="number"||!Number.isFinite(e))return;const t=Math.floor(e);return t>0?Math.max(1,t):void 0},Dl=e=>{if(typeof e=="string"){const i=e.trim().toLowerCase();return i==="viridis"||i==="plasma"||i==="inferno"?i:void 0}if(!Array.isArray(e))return;if(e.length>0&&e.every(i=>typeof i=="string"&&i.length>0&&i===i.trim())){const i=e;return Object.isFrozen(i)||Object.freeze(i),i}const n=e.filter(i=>typeof i=="string").map(i=>i.trim()).filter(i=>i.length>0);if(n.length!==0)return Object.freeze(n),n},Ul=e=>{if(typeof e!="string")return;const t=e.trim().toLowerCase();return t==="none"||t==="ohlc"?t:void 0},us=e=>{if(typeof e!="number"||!Number.isFinite(e))return;const t=Math.floor(e);return t>0?t:void 0},fs=e=>Array.isArray(e),ti=e=>{let t=Number.POSITIVE_INFINITY,n=Number.NEGATIVE_INFINITY,i=Number.POSITIVE_INFINITY,r=Number.NEGATIVE_INFINITY;for(let s=0;s<e.length;s++){const o=e[s],c=fs(o)?o[0]:o.x,l=fs(o)?o[1]:o.y;!Number.isFinite(c)||!Number.isFinite(l)||(c<t&&(t=c),c>n&&(n=c),l<i&&(i=l),l>r&&(r=l))}if(!(!Number.isFinite(t)||!Number.isFinite(n)||!Number.isFinite(i)||!Number.isFinite(r)))return t===n&&(n=t+1),i===r&&(r=i+1),{xMin:t,xMax:n,yMin:i,yMax:r}},Ll=e=>Array.isArray(e),_l=e=>{if(e.length===0)return;let t=Number.POSITIVE_INFINITY,n=Number.NEGATIVE_INFINITY,i=Number.POSITIVE_INFINITY,r=Number.NEGATIVE_INFINITY;if(Ll(e[0])){const o=e;for(let c=0;c<o.length;c++){const l=o[c],u=l[0],h=l[3],f=l[4];if(!Number.isFinite(u)||!Number.isFinite(h)||!Number.isFinite(f))continue;const a=Math.min(h,f),F=Math.max(h,f);u<t&&(t=u),u>n&&(n=u),a<i&&(i=a),F>r&&(r=F)}}else{const o=e;for(let c=0;c<o.length;c++){const l=o[c],u=l.timestamp,h=l.low,f=l.high;if(!Number.isFinite(u)||!Number.isFinite(h)||!Number.isFinite(f))continue;const a=Math.min(h,f),F=Math.max(h,f);u<t&&(t=u),u>n&&(n=u),a<i&&(i=a),F>r&&(r=F)}}if(!(!Number.isFinite(t)||!Number.isFinite(n)||!Number.isFinite(i)||!Number.isFinite(r)))return t===n&&(n=t+1),i===r&&(r=i+1),{xMin:t,xMax:n,yMin:i,yMax:r}},Gl=e=>{throw new Error(`Unhandled series type: ${(e==null?void 0:e.type)??"unknown"}`)};let ms=!1;const Wl=()=>{ms||(console.warn("ChartGPU: Candlestick series rendering is not yet implemented. Series will be skipped."),ms=!0)};function $l(e={}){var v,g,x,y;const t=Pl(e.theme),n=e.autoScroll,i=typeof n=="boolean"?n:tt.autoScroll,r=e.animation,o=(typeof r=="boolean"||r!==null&&typeof r=="object"&&!Array.isArray(r)?r:void 0)??!0,c=gn(e.palette),l=c.length>0?{...t,colorPalette:c}:t,u=gn(l.colorPalette),h=u.length>0?u:gn(tt.palette??Qn).length>0?gn(tt.palette??Qn):Array.from(Qn),f=h.length>0?h:["#000000"],a={...l,colorPalette:f.slice()},F={left:((v=e.grid)==null?void 0:v.left)??tt.grid.left,right:((g=e.grid)==null?void 0:g.right)??tt.grid.right,top:((x=e.grid)==null?void 0:x.top)??tt.grid.top,bottom:((y=e.grid)==null?void 0:y.bottom)??tt.grid.bottom},M=e.xAxis?{...tt.xAxis,...e.xAxis,type:e.xAxis.type??tt.xAxis.type}:{...tt.xAxis},S=e.yAxis?{...tt.yAxis,...e.yAxis,type:e.yAxis.type??tt.yAxis.type}:{...tt.yAxis},m=(e.series??[]).map((p,d)=>{var C,E,D,L,U,_,H,Z,X,ie;const N=Ct(p.color),w=a.colorPalette[d%a.colorPalette.length],T=N??w,R=Rl(p.sampling)??"lttb",P=us(p.samplingThreshold)??5e3;switch(p.type){case"area":{const q=Ct((C=p.areaStyle)==null?void 0:C.color)??N??w,ee={opacity:((E=p.areaStyle)==null?void 0:E.opacity)??ls.opacity,color:q},we=ti(p.data);return{...p,rawData:p.data,data:Qt(p.data,R,P),color:q,areaStyle:ee,sampling:R,samplingThreshold:P,rawBounds:we}}case"line":{const q=Ct((D=p.lineStyle)==null?void 0:D.color)??N??w,ee={width:((L=p.lineStyle)==null?void 0:L.width)??cs.width,opacity:((U=p.lineStyle)==null?void 0:U.opacity)??cs.opacity,color:q},{areaStyle:we,...ve}=p,ue=ti(p.data),ne=Qt(p.data,R,P);return{...ve,rawData:p.data,data:ne,color:q,lineStyle:ee,...p.areaStyle?{areaStyle:{opacity:p.areaStyle.opacity??ls.opacity,color:Ct(p.areaStyle.color)??q}}:{},sampling:R,samplingThreshold:P,rawBounds:ue}}case"bar":{const oe=ti(p.data);return{...p,rawData:p.data,data:Qt(p.data,R,P),color:T,sampling:R,samplingThreshold:P,rawBounds:oe}}case"scatter":{const oe=ti(p.data),q=Al(p.mode)??ei.mode,ee=Bl(p.binSize)??ei.binSize,we=Dl(p.densityColormap)??ei.densityColormap,ve=El(p.densityNormalization)??ei.densityNormalization;return{...p,rawData:p.data,data:Qt(p.data,R,P),color:T,mode:q,binSize:ee,densityColormap:we,densityNormalization:ve,sampling:R,samplingThreshold:P,rawBounds:oe}}case"pie":{const{sampling:oe,samplingThreshold:q,...ee}=p,we=(p.data??[]).map((ve,ue)=>{const ne=Ct(ve==null?void 0:ve.color),be=a.colorPalette[(d+ue)%a.colorPalette.length];return{...ve,color:ne??be}});return{...ee,color:T,data:we}}case"candlestick":{Wl();const oe=Ul(p.sampling)??lt.sampling,q=us(p.samplingThreshold)??lt.samplingThreshold,ee={upColor:Ct((_=p.itemStyle)==null?void 0:_.upColor)??lt.itemStyle.upColor,downColor:Ct((H=p.itemStyle)==null?void 0:H.downColor)??lt.itemStyle.downColor,upBorderColor:Ct((Z=p.itemStyle)==null?void 0:Z.upBorderColor)??lt.itemStyle.upBorderColor,downBorderColor:Ct((X=p.itemStyle)==null?void 0:X.downBorderColor)??lt.itemStyle.downBorderColor,borderWidth:typeof((ie=p.itemStyle)==null?void 0:ie.borderWidth)=="number"&&Number.isFinite(p.itemStyle.borderWidth)?p.itemStyle.borderWidth:lt.itemStyle.borderWidth},we=_l(p.data),ve=oe==="ohlc"&&p.data.length>q?ui(p.data,q):p.data;return{...p,rawData:p.data,data:ve,color:T,style:p.style??lt.style,itemStyle:ee,barWidth:p.barWidth??lt.barWidth,barMinWidth:p.barMinWidth??lt.barMinWidth,barMaxWidth:p.barMaxWidth??lt.barMaxWidth,sampling:oe,samplingThreshold:q,rawBounds:we}}default:return Gl(p)}});return{grid:F,xAxis:M,yAxis:S,autoScroll:i,dataZoom:Tl(e.dataZoom),animation:o,theme:a,palette:a.colorPalette,series:m}}const kl=32+8,Ol=e=>{var t;return((t=e.dataZoom)==null?void 0:t.some(n=>(n==null?void 0:n.type)==="slider"))??!1};function ds(e={}){const t={...$l(e),tooltip:e.tooltip};return Ol(e)?{...t,grid:{...t.grid,bottom:t.grid.bottom+kl}}:t}const ut=120,Vl=1e3/60,Xl=1.5;function hs(e,t){if(!Number.isInteger(e)||e<0)throw new Error(`Invalid seriesIndex ${t}: ${e}. Must be a non-negative integer.`)}function ps(e,t){if(!Number.isInteger(e)||e<0)throw new Error(`Invalid pointCount ${t}: ${e}. Must be a non-negative integer.`)}function nt(e){return e instanceof Error?[e.message,e.stack]:[String(e),void 0]}class zl{constructor(){this.charts=new Map,this.messageHandler=null}onMessage(t){this.messageHandler=t}async handleMessage(t){try{switch(t.type){case"init":await this.initChart(t);break;case"setOption":this.handleSetOption(t.chartId,t.options);break;case"appendData":this.handleAppendData(t.chartId,t.seriesIndex,t.data,t.pointCount,t.stride);break;case"appendDataBatch":this.handleAppendDataBatch(t.chartId,t.items);break;case"resize":this.handleResize(t.chartId,t);break;case"forwardPointerEvent":this.handlePointerEvent(t.chartId,t.event);break;case"setZoomRange":this.handleSetZoomRange(t.chartId,t.start,t.end);break;case"setInteractionX":this.handleSetInteractionX(t.chartId,t.x,t.source);break;case"setAnimation":this.handleSetAnimation(t.chartId,t.enabled,t.config);break;case"setGPUTiming":this.handleSetGPUTiming(t.chartId,t.enabled);break;case"dispose":this.disposeChart(t.chartId);break;default:const n=t;this.emitError("","UNKNOWN",`Unknown message type: ${n.type}`,"handleMessage")}}catch(n){const i="chartId"in t?t.chartId:"",[r,s]=nt(n);this.emitError(i,"UNKNOWN",r,"handleMessage",s)}}async initChart(t){var i,r;let n=null;try{if(this.charts.has(t.chartId)){this.emitError(t.chartId,"UNKNOWN",`Chart with ID "${t.chartId}" already exists`,"init",void 0,t.messageId);return}if(t.devicePixelRatio<=0)throw new Error(`Invalid devicePixelRatio: ${t.devicePixelRatio}. Must be positive.`);const s={devicePixelRatio:t.devicePixelRatio,powerPreference:(i=t.gpuOptions)==null?void 0:i.powerPreference},o=Us(t.canvas,s);let c=await Ls(o);const l=ds(t.options);n=new MessageChannel;const h={renderPending:!1,disposed:!1,deviceLost:!1,performance:{frameTimestamps:new Float64Array(ut),frameTimestampIndex:0,frameTimestampCount:0,totalFrames:0,totalDroppedFrames:0,consecutiveDroppedFrames:0,lastDropTimestamp:0,startTime:performance.now(),lastFrameTime:0,gpuTimingEnabled:!1,lastCPUTime:0,lastGPUTime:0}};c.device&&(c.device.lost.then(m=>{h.deviceLost=!0,this.emit({type:"deviceLost",chartId:t.chartId,reason:m.reason==="destroyed"?"destroyed":"unknown",message:m.message||m.reason||"Device lost during initialization"})}).catch(()=>{}),c.device.addEventListener("uncapturederror",m=>{const v=m.error instanceof GPUValidationError?`WebGPU Validation Error: ${m.error.message}`:m.error instanceof GPUOutOfMemoryError?`WebGPU Out of Memory: ${m.error.message}`:`WebGPU Error: ${m.error.message}`;this.emitError(t.chartId,"RENDER_ERROR",v,"uncaptured_gpu_error")}));const f=Ml(c,l,{domOverlays:!1,onRequestRender:()=>{!h.renderPending&&!h.disposed&&n&&(h.renderPending=!0,n.port2.postMessage(null))},onTooltipUpdate:m=>{if(this.emit({type:"tooltipUpdate",chartId:t.chartId,data:m}),m&&m.params.length>0){const v=m.params[0];this.emit({type:"hoverChange",chartId:t.chartId,payload:{seriesIndex:v.seriesIndex,dataIndex:v.dataIndex,value:v.value,x:m.x,y:m.y}})}else this.emit({type:"hoverChange",chartId:t.chartId,payload:null})},onLegendUpdate:m=>{this.emit({type:"legendUpdate",chartId:t.chartId,items:m})},onAxisLabelsUpdate:(m,v)=>{this.emit({type:"axisLabelsUpdate",chartId:t.chartId,xLabels:m,yLabels:v})},onCrosshairMove:m=>{m!==null&&this.emit({type:"crosshairMove",chartId:t.chartId,x:m})},onClickData:m=>{if(!(!m.nearest&&!m.pieSlice&&!m.candlestick)){if(m.nearest){this.emit({type:"click",chartId:t.chartId,payload:{seriesIndex:m.nearest.seriesIndex,dataIndex:m.nearest.dataIndex,value:m.nearest.point,x:m.x,y:m.y}});return}if(m.pieSlice){this.emit({type:"click",chartId:t.chartId,payload:{seriesIndex:m.pieSlice.seriesIndex,dataIndex:m.pieSlice.dataIndex,value:[m.pieSlice.slice.value,0],x:m.x,y:m.y}});return}m.candlestick&&this.emit({type:"click",chartId:t.chartId,payload:{seriesIndex:m.candlestick.seriesIndex,dataIndex:m.candlestick.dataIndex,value:m.candlestick.point,x:m.x,y:m.y}})}},onDeviceLost:m=>{h.deviceLost=!0,this.emit({type:"deviceLost",chartId:t.chartId,reason:m==="destroyed"?"destroyed":"unknown",message:m})}});f.onZoomRangeChange(m=>{this.emit({type:"zoomChange",chartId:t.chartId,start:m.start,end:m.end})});const a={chartId:t.chartId,gpuContext:c,coordinator:f,canvas:t.canvas,renderChannel:n,state:h};this.charts.set(t.chartId,a);const F=f.getZoomRange();if(n){const m=t.chartId,v=f,g=h;n.port1.onmessage=()=>{if(!g.disposed&&!g.deviceLost){g.renderPending=!1;const x=g.performance,y=performance.now();try{x.frameTimestamps[x.frameTimestampIndex]=y,x.frameTimestampIndex=(x.frameTimestampIndex+1)%ut,x.frameTimestampCount<ut&&x.frameTimestampCount++,x.totalFrames++,x.lastFrameTime>0&&(y-x.lastFrameTime>Vl*Xl?(x.totalDroppedFrames++,x.consecutiveDroppedFrames++,x.lastDropTimestamp=y):x.consecutiveDroppedFrames=0),x.lastFrameTime=y,v.render();const d=performance.now()-y;x.lastCPUTime=d;const N=this.calculatePerformanceMetrics(x);this.emit({type:"performance-update",chartId:m,metrics:N})}catch(p){const[d,N]=nt(p);this.emitError(m,"RENDER_ERROR",d,"render",N)}}else g.deviceLost&&(g.renderPending=!1)}}const M=c.adapter?{adapter:"WebGPU Adapter",features:c.adapter.features?[...c.adapter.features]:[]}:void 0,S={gpuTimingSupported:((r=c.adapter)==null?void 0:r.features.has("timestamp-query"))??!1,highResTimerSupported:typeof performance<"u"&&typeof performance.now=="function",performanceMetricsSupported:!0};this.emit({type:"ready",chartId:t.chartId,messageId:t.messageId,capabilities:M,performanceCapabilities:S,initialZoomRange:F}),!h.renderPending&&!h.disposed&&n&&(h.renderPending=!0,n.port2.postMessage(null))}catch(s){if(n)try{n.port1.close(),n.port2.close()}catch{}const[o,c]=nt(s),l=o.includes("WebGPU")?"WEBGPU_INIT_FAILED":"UNKNOWN";this.emitError(t.chartId,l,o,"init",c,t.messageId)}}handleSetOption(t,n){try{const i=this.getChartInstance(t,"setOption"),r=ds(n);i.coordinator.setOptions(r)}catch(i){const[r,s]=nt(i);this.emitError(t,"UNKNOWN",r,"setOption",s)}}handleAppendData(t,n,i,r,s){try{hs(n,"in appendData"),ps(r,"in appendData");const o=this.getChartInstance(t,"appendData"),c=bs(i,r,s);o.coordinator.appendData(n,c)}catch(o){const[c,l]=nt(o);this.emitError(t,"DATA_ERROR",c,"appendData",l)}}handleAppendDataBatch(t,n){try{const i=this.getChartInstance(t,"appendDataBatch"),r=n.length;for(let s=0;s<r;s++){const o=n[s];hs(o.seriesIndex,`at batch index ${s}`),ps(o.pointCount,`at batch index ${s}`)}for(let s=0;s<r;s++){const o=n[s],c=bs(o.data,o.pointCount,o.stride);i.coordinator.appendData(o.seriesIndex,c)}}catch(i){const[r,s]=nt(i);this.emitError(t,"DATA_ERROR",r,"appendDataBatch",s)}}handleResize(t,n){try{const i=this.getChartInstance(t,"resize");if(i.state.deviceLost)throw new Error("Cannot resize: GPU device is lost");const{width:r,height:s,devicePixelRatio:o}=n;if(r<=0||s<=0)throw new Error(`Invalid dimensions: width=${r}, height=${s}. Must be positive.`);if(o<=0)throw new Error(`Invalid devicePixelRatio: ${o}. Must be positive.`);const c=Math.floor(r*o),l=Math.floor(s*o);if(c===0||l===0)throw new Error(`Computed canvas dimensions are zero: ${c}x${l}. CSS dimensions (${r}x${s}px) are too small for device pixel ratio ${o}. Minimum canvas size is 1px in CSS space.`);const u=i.gpuContext.device;if(!u)throw new Error("GPU device is not available");const h=u.limits.maxTextureDimension2D,f=Math.max(1,Math.min(c,h)),a=Math.max(1,Math.min(l,h));i.canvas.width=f,i.canvas.height=a;const F=i.gpuContext.canvasContext,M=i.gpuContext.preferredFormat;if(!F)throw new Error("Canvas context is not available");if(!M)throw new Error("Preferred texture format is not available");try{F.configure({device:u,format:M,alphaMode:i.gpuContext.alphaMode})}catch(S){throw new Error(`Failed to reconfigure canvas context: ${S instanceof Error?S.message:String(S)}`)}n.requestRender&&!i.state.renderPending&&!i.state.disposed&&(i.state.renderPending=!0,i.renderChannel.port2.postMessage(null))}catch(i){const[r,s]=nt(i);this.emitError(t,"RENDER_ERROR",r,"resize",s)}}handlePointerEvent(t,n){try{console.log("[ChartGPUWorkerController] Received pointer event:",{type:n.type,gridX:n.gridX,gridY:n.gridY,isInGrid:n.isInGrid}),this.getChartInstance(t,"forwardPointerEvent").coordinator.handlePointerEvent(n)}catch(i){const[r,s]=nt(i);this.emitError(t,"UNKNOWN",r,"forwardPointerEvent",s)}}handleSetZoomRange(t,n,i){try{if(n<0||n>100||i<0||i>100)throw new Error(`Invalid zoom range: [${n}, ${i}]. Values must be in [0, 100] (percent space).`);if(n>=i)throw new Error(`Invalid zoom range: start (${n}) must be less than end (${i}).`);this.getChartInstance(t,"setZoomRange").coordinator.setZoomRange(n,i)}catch(r){const[s,o]=nt(r);this.emitError(t,"UNKNOWN",s,"setZoomRange",o)}}handleSetInteractionX(t,n,i){try{this.getChartInstance(t,"setInteractionX").coordinator.setInteractionX(n,i)}catch(r){const[s,o]=nt(r);this.emitError(t,"UNKNOWN",s,"setInteractionX",o)}}handleSetAnimation(t,n,i){try{const r=this.getChartInstance(t,"setAnimation");n&&!r.state.renderPending&&!r.state.disposed&&(r.state.renderPending=!0,r.renderChannel.port2.postMessage(null))}catch(r){const[s,o]=nt(r);this.emitError(t,"UNKNOWN",s,"setAnimation",o)}}handleSetGPUTiming(t,n){try{const i=this.getChartInstance(t,"setGPUTiming");i.state.performance.gpuTimingEnabled=n}catch(i){const[r,s]=nt(i);this.emitError(t,"UNKNOWN",r,"setGPUTiming",s)}}calculatePerformanceMetrics(t){const n=this.calculateExactFPS(t),i=this.calculateFrameTimeStats(t),r={enabled:t.gpuTimingEnabled,cpuTime:t.lastCPUTime,gpuTime:t.lastGPUTime},s={used:0,peak:0,allocated:0},o={totalDrops:t.totalDroppedFrames,consecutiveDrops:t.consecutiveDroppedFrames,lastDropTimestamp:t.lastDropTimestamp},c=performance.now()-t.startTime;return{fps:n,frameTimeStats:i,gpuTiming:r,memory:s,frameDrops:o,totalFrames:t.totalFrames,elapsedTime:c}}calculateExactFPS(t){const n=t.frameTimestampCount;if(n<2)return 0;const i=t.frameTimestamps,r=(t.frameTimestampIndex-n+ut)%ut;let s=0;for(let l=1;l<n;l++){const u=(r+l-1)%ut,h=(r+l)%ut,f=i[h]-i[u];s+=f}const o=s/(n-1);return o>0?1e3/o:0}calculateFrameTimeStats(t){const n=t.frameTimestampCount;if(n<2)return{min:0,max:0,avg:0,p50:0,p95:0,p99:0};const i=t.frameTimestamps,r=(t.frameTimestampIndex-n+ut)%ut,s=new Array(n-1);let o=Number.POSITIVE_INFINITY,c=Number.NEGATIVE_INFINITY,l=0;for(let F=1;F<n;F++){const M=(r+F-1)%ut,S=(r+F)%ut,m=i[S]-i[M];s[F-1]=m,m<o&&(o=m),m>c&&(c=m),l+=m}const u=l/s.length;s.sort((F,M)=>F-M);const h=Math.floor(s.length*.5),f=Math.floor(s.length*.95),a=Math.floor(s.length*.99);return{min:o,max:c,avg:u,p50:s[h],p95:s[f],p99:s[a]}}disposeChart(t){const n=[];try{const i=this.charts.get(t);if(!i){this.emitError(t,"UNKNOWN",`Chart "${t}" not found`,"dispose");return}if(i.state.disposed){this.emitError(t,"UNKNOWN",`Chart "${t}" is already disposed`,"dispose");return}i.state.disposed=!0;try{i.renderChannel.port1.close(),i.renderChannel.port2.close()}catch(r){n.push(`Failed to close render channel: ${r}`)}try{i.coordinator.dispose()}catch(r){n.push(`Failed to dispose coordinator: ${r}`)}try{i.gpuContext=_s(i.gpuContext)}catch(r){n.push(`Failed to destroy GPU context: ${r}`)}this.charts.delete(t),this.emit({type:"disposed",chartId:t,cleanupErrors:n.length>0?n:void 0})}catch(i){const[r,s]=nt(i);this.emitError(t,"UNKNOWN",r,"dispose",s)}}dispose(){const t=[...this.charts.keys()];for(const n of t)this.disposeChart(n);this.messageHandler=null}getChartInstance(t,n){const i=this.charts.get(t);if(!i)throw new Error(`Chart "${t}" not found for operation "${n}"`);if(i.state.disposed)throw new Error(`Chart "${t}" is disposed and cannot perform "${n}"`);if(i.state.deviceLost)throw new Error(`Chart "${t}" GPU device is lost and cannot perform "${n}". Re-initialize the chart.`);return i}emit(t){this.messageHandler?this.messageHandler(t):console.warn("No message handler registered, dropping message:",t)}emitError(t,n,i,r,s,o){const c={type:"error",chartId:t,code:n,message:i,operation:r,stack:s,messageId:o};this.emit(c)}}function bs(e,t,n){if(!e)throw new Error("Buffer is null or undefined");if(!Number.isInteger(t)||t<0)throw new Error(`Invalid pointCount: ${t}. Must be a non-negative integer.`);if(!Number.isInteger(n)||n<=0)throw new Error(`Invalid stride: ${n}. Must be a positive integer.`);if(e.byteLength===0&&t>0)throw new Error("Buffer is detached (byteLength = 0). The ArrayBuffer may have been transferred multiple times. Each ArrayBuffer can only be transferred once via postMessage.");if(e.byteLength%4!==0)throw new Error(`Buffer size (${e.byteLength} bytes) is not 4-byte aligned. WebGPU requires all buffer sizes to be multiples of 4 bytes.`);if(n%4!==0)throw new Error(`Stride (${n} bytes) is not 4-byte aligned. Float32 data requires stride to be a multiple of 4 bytes.`);const i=t*n;if(e.byteLength!==i)throw new Error(`Buffer size mismatch: expected ${i} bytes (${t} points × ${n} bytes), got ${e.byteLength} bytes. Difference: ${e.byteLength-i} bytes.`);const r=new Float32Array(e),s=n/4,o=t*s;if(r.length!==o)throw new Error(`Float32Array length mismatch: expected ${o} elements, got ${r.length} elements`);if(n===8){const c=new Array(t);for(let l=0,u=0;l<t;l++,u+=2)c[l]=[r[u],r[u+1]];return c}else if(n===20){const c=new Array(t);for(let l=0,u=0;l<t;l++,u+=5)c[l]=[r[u],r[u+1],r[u+4],r[u+3],r[u+2]];return c}else throw new Error(`Invalid stride: ${n} bytes. Expected 8 (DataPoint) or 20 (OHLCDataPoint). Received stride corresponds to ${n/4} floats per point.`)}const gs=new zl;gs.onMessage(e=>{self.postMessage(e)}),self.onmessage=async e=>{try{await gs.handleMessage(e.data)}catch(t){self.postMessage({type:"error",message:t instanceof Error?t.message:String(t),stack:t instanceof Error?t.stack:void 0,chartId:e.data.chartId})}},self.onerror=e=>{const t=e instanceof ErrorEvent?e.error:e;console.error("[ChartGPU Worker] Uncaught error:",t),self.postMessage({type:"error",message:t instanceof Error?t.message:String(t),stack:t instanceof Error?t.stack:void 0,chartId:"unknown"})},self.onunhandledrejection=e=>{console.error("[ChartGPU Worker] Unhandled promise rejection:",e.reason),self.postMessage({type:"error",message:e.reason instanceof Error?e.reason.message:String(e.reason),stack:e.reason instanceof Error?e.reason.stack:void 0,chartId:"unknown"})}})();
626
+ //# sourceMappingURL=worker-entry-bQkUaIs7.js.map