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,799 @@
1
+ (function(){"use strict";function Ki(e){return typeof HTMLCanvasElement<"u"&&e instanceof HTMLCanvasElement}function Zs(e){if(Ki(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 js(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 Ks(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(F){console.warn("Error destroying device during canvas setup failure:",F)}throw new Error("Failed to get WebGPU context from canvas.")}const{width:u,height:m}=Zs(e.canvas),f=t,a=Math.floor(u*f),v=Math.floor(m*f),M=n.limits.maxTextureDimension2D,I=Math.max(1,Math.min(a,M)),p=Math.max(1,Math.min(v,M));e.canvas.width=I,e.canvas.height=p,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 Js(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 Ji(e){return Array.isArray(e)}function fi(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=Ji(s)?s[0]:s.x,c=Ji(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 Sn=4;function mi(e){return e+3&-4}function Qs(e){if(!Number.isFinite(e)||e<=0)return 1;const t=Math.ceil(e);return 2**Math.ceil(Math.log2(t))}function Qi(e,t){const n=Math.max(Sn,mi(t)),i=Math.max(Sn,Qs(n));return Math.max(e,i)}function er(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 tr(e){const t=new Uint32Array(e.buffer,e.byteOffset,e.byteLength/4);return er(2166136261,t)}function eo(e){const t=new Map;let n=!1;const i=()=>{if(n)throw new Error("DataStore is disposed.")},r=a=>{i();const v=t.get(a);if(!v)throw new Error(`Series ${a} has no data. Call setSeries(${a}, data) first.`);return v};return{setSeries:(a,v)=>{i();const M=fi(v),I=v.length,p=tr(M),F=mi(M.byteLength),b=Math.max(Sn,F),x=t.get(a);if(x&&x.pointCount===I&&x.hash32===p)return;let d=(x==null?void 0:x.buffer)??null,h=(x==null?void 0:x.capacityBytes)??0;if(!d||b>h){const N=e.limits.maxBufferSize;if(b>N)throw new Error(`DataStore.setSeries(${a}): required buffer size ${b} exceeds device.limits.maxBufferSize (${N}).`);if(d)try{d.destroy()}catch{}const w=Qi(h,b);w>N?h=b:h=w,d=e.createBuffer({size:h,usage:GPUBufferUsage.VERTEX|GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST})}M.byteLength>0&&e.queue.writeBuffer(d,0,M.buffer),t.set(a,{buffer:d,capacityBytes:h,pointCount:I,hash32:p,data:v.length===0?[]:v.slice()})},appendSeries:(a,v)=>{if(i(),!v||v.length===0)return;const M=r(a),I=M.pointCount,p=I+v.length,F=fi(v),b=F.byteLength,x=mi(p*2*4),y=Math.max(Sn,x);let d=M.buffer,h=M.capacityBytes;const N=M.data;N.push(...v);const w=e.limits.maxBufferSize;if(y>h){if(y>w)throw new Error(`DataStore.appendSeries(${a}): required buffer size ${y} exceeds device.limits.maxBufferSize (${w}).`);try{d.destroy()}catch{}const P=Qi(h,y);h=P>w?y:P,d=e.createBuffer({size:h,usage:GPUBufferUsage.VERTEX|GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST});const T=fi(N);T.byteLength>0&&e.queue.writeBuffer(d,0,T.buffer),t.set(a,{buffer:d,capacityBytes:h,pointCount:p,hash32:tr(T),data:N});return}if(b>0){const P=I*2*4;e.queue.writeBuffer(d,P,F.buffer)}const C=new Uint32Array(F.buffer,F.byteOffset,F.byteLength/4),R=er(M.hash32,C);t.set(a,{buffer:d,capacityBytes:h,pointCount:p,hash32:R,data:N})},removeSeries:a=>{i();const v=t.get(a);if(v){try{v.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 _t(e){return Array.isArray(e)}function to(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 m=new Int32Array(n);for(let f=0;f<n;f++)m[f]=f;return m}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 m=0;m<t-2;m++){let f=Math.floor(s*m)+1,a=Math.min(Math.floor(s*(m+1))+1,i);f>=a&&(f=Math.min(f,i-1),a=Math.min(f+1,i));const v=Math.floor(s*(m+1))+1,M=Math.min(Math.floor(s*(m+2))+1,i);let I=l,p=u;if(v<M){let d=0,h=0,N=0;for(let w=v;w<M;w++)d+=e[w*2+0],h+=e[w*2+1],N++;N>0&&(I=d/N,p=h/N)}const F=e[o*2+0],b=e[o*2+1];let x=-1,y=f;for(let d=f;d<a;d++){const h=e[d*2+0],N=e[d*2+1],w=(F-I)*(N-b)-(F-h)*(p-b),C=w<0?-w:w;C>x&&(x=C,y=d)}r[c++]=y,o=y}return r}function no(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=_t(l)?l[0]:l.x,m=_t(l)?l[1]:l.y;for(let f=0;f<t-2;f++){let a=Math.floor(s*f)+1,v=Math.min(Math.floor(s*(f+1))+1,i);a>=v&&(a=Math.min(a,i-1),v=Math.min(a+1,i));const M=Math.floor(s*(f+1))+1,I=Math.min(Math.floor(s*(f+2))+1,i);let p=u,F=m;if(M<I){let N=0,w=0,C=0;for(let R=M;R<I;R++){const P=e[R],T=_t(P)?P[0]:P.x,B=_t(P)?P[1]:P.y;N+=T,w+=B,C++}C>0&&(p=N/C,F=w/C)}const b=e[o],x=_t(b)?b[0]:b.x,y=_t(b)?b[1]:b.y;let d=-1,h=a;for(let N=a;N<v;N++){const w=e[N],C=_t(w)?w[0]:w.x,R=_t(w)?w[1]:w.y,P=(x-p)*(R-y)-(x-C)*(F-y),T=P<0?-P:P;T>d&&(d=T,h=N)}r[c++]=h,o=h}return r}function io(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=to(e,n),l=new Float32Array(c.length*2);for(let u=0;u<c.length;u++){const m=c[u];l[u*2+0]=e[m*2+0],l[u*2+1]=e[m*2+1]}return l}const i=e.length;if(n<=0||i===0)return[];if(i<=n)return e;const r=no(e,n),s=new Array(r.length);for(let o=0;o<r.length;o++)s[o]=e[r[o]];return s}function nr(e){return Array.isArray(e)}function ir(e){return nr(e)?{x:e[0],y:e[1]}:{x:e.x,y:e.y}}function ro(e){return nr(e)?e[2]:e.size}function rr(e){const t=Math.floor(e);return Number.isFinite(t)?t:0}function di(e,t,n){const i=e.length,r=rr(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,m=Math.min(Math.floor(c*(l+1))+1,s);u>=m&&(u=Math.min(u,s-1),m=Math.min(u+1,s));let f=null;if(n==="average"){let a=0,v=0,M=0,I=0,p=0;for(let F=u;F<m;F++){const b=e[F],{x,y}=ir(b);if(!Number.isFinite(x)||!Number.isFinite(y))continue;a+=x,v+=y,I++;const d=ro(b);typeof d=="number"&&Number.isFinite(d)&&(M+=d,p++)}if(I>0){const F=a/I,b=v/I;p>0?f=[F,b,M/p]:f=[F,b]}}else{let a=n==="max"?Number.NEGATIVE_INFINITY:Number.POSITIVE_INFINITY;for(let v=u;v<m;v++){const M=e[v],{y:I}=ir(M);Number.isFinite(I)&&(n==="max"?I>a&&(a=I,f=M):I<a&&(a=I,f=M))}}o[l+1]=f??e[u]}return o}function nn(e,t,n){const i=rr(n);if(t==="none"||!(i>0)||e.length<=i)return e;switch(t){case"lttb":return io(e,i);case"average":return di(e,i,"average");case"max":return di(e,i,"max");case"min":return di(e,i,"min");default:return e}}function so(e){return Array.isArray(e)}function hi(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=so(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,m=Math.min(Math.floor(o*(l+1))+1,i-1);u>=m&&(u=Math.min(u,i-2),m=Math.min(u+1,i-1));const f=c[u],a=c[m-1],v=f[0],M=f[1],I=a[2];let p=-1/0,F=1/0;for(let b=u;b<m;b++){const x=c[b],y=x[3],d=x[4];d>p&&(p=d),y<F&&(F=y)}r[l+1]=[v,M,I,F,p]}}else{const c=e;for(let l=0;l<n-2;l++){let u=Math.floor(o*l)+1,m=Math.min(Math.floor(o*(l+1))+1,i-1);u>=m&&(u=Math.min(u,i-2),m=Math.min(u+1,i-1));const f=c[u],a=c[m-1],v=f.timestamp,M=f.open,I=a.close;let p=-1/0,F=1/0;for(let b=u;b<m;b++){const x=c[b],y=x.high,d=x.low;y>p&&(p=y),d<F&&(F=d)}r[l+1]={timestamp:v,open:M,close:I,low:F,high:p}}}return r}var In=`// 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 oo="vsMain",ao="fsMain",co=e=>Number.isInteger(e)&&e>0&&(e&e-1)===0,lo=(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(!co(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)},sr=(e,t)=>"module"in t?{module:t.module,entryPoint:t.entryPoint||"",constants:t.constants}:{module:or(e,t.code,t.label),entryPoint:t.entryPoint||"",constants:t.constants};function or(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 ct(e,t){const n=t.layout??(t.bindGroupLayouts?e.createPipelineLayout({bindGroupLayouts:[...t.bindGroupLayouts]}):"auto"),i=sr(e,t.vertex),r=i.entryPoint||oo;let s;if(t.fragment){const l=sr(e,t.fragment),u=l.entryPoint||ao;let m=t.fragment.targets;if(!m){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.");m=(Array.isArray(f)?f:[f]).map(v=>({format:v,blend:t.fragment.blend,writeMask:t.fragment.writeMask}))}s={module:l.module,entryPoint:u,targets:[...m],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 Ve(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=lo(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 Ge(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 ar=e=>Math.min(1,Math.max(0,e)),cr=e=>Math.min(255,Math.max(0,e)),zt=e=>{const t=Number.parseInt(e,16);return Number.isFinite(t)?t:0},Xt=e=>{const t=Number.parseInt(e,16);return Number.isFinite(t)?t:0},uo=e=>{const t=e.trim();if(!t.startsWith("#"))return null;const n=t.slice(1);if(n.length===3){const i=zt(n[0]),r=zt(n[1]),s=zt(n[2]);return[i*17/255,r*17/255,s*17/255,1]}if(n.length===4){const i=zt(n[0]),r=zt(n[1]),s=zt(n[2]),o=zt(n[3]);return[i*17/255,r*17/255,s*17/255,o*17/255]}if(n.length===6){const i=Xt(n.slice(0,2)),r=Xt(n.slice(2,4)),s=Xt(n.slice(4,6));return[i/255,r/255,s/255,1]}if(n.length===8){const i=Xt(n.slice(0,2)),r=Xt(n.slice(2,4)),s=Xt(n.slice(4,6)),o=Xt(n.slice(6,8));return[i/255,r/255,s/255,o/255]}return null},rn=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)?cr(i/100*255):null}const n=Number.parseFloat(t);return Number.isFinite(n)?cr(n):null},fo=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)?ar(i/100):null}const n=Number.parseFloat(t);return Number.isFinite(n)?ar(n):null},mo=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=rn(s[0]),c=rn(s[1]),l=rn(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=rn(s[0]),c=rn(s[1]),l=rn(s[2]),u=fo(s[3]);return o==null||c==null||l==null||u==null?null:[o/255,c/255,l/255,u]}return null},Ke=e=>{if(typeof e!="string")return null;const t=e.trim();if(t.length===0)return null;const n=uo(t);if(n)return n;const i=mo(t);return i||null},ho=(e,t={r:0,g:0,b:0,a:1})=>{const n=Ke(e);if(!n)return t;const[i,r,s,o]=n;return{r:i,g:r,b:s,a:o}},po="bgra8unorm",bo=5,go=6,yo=[1,1,1,.8],xo=()=>{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},vo=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),lr=e=>typeof e=="number"&&Number.isFinite(e)?e:void 0,wo=(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}},Fo=(e,t,n,i,r)=>{const{left:s,right:o,top:c,bottom:l,canvasWidth:u,canvasHeight:m}=i,f=Number.isFinite(i.devicePixelRatio)&&i.devicePixelRatio>0?i.devicePixelRatio:1;if(!vo(i))throw new Error("AxisRenderer.prepare: gridArea dimensions must be finite numbers.");if(u<=0||m<=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,v=u-o*f,M=c*f,I=m-l*f,p=a/u*2-1,F=v/u*2-1,b=1-M/m*2,x=1-I/m*2,y=e.tickLength??go;if(!Number.isFinite(y)||y<0)throw new Error("AxisRenderer.prepare: tickLength must be a finite non-negative number.");const d=r??bo,h=Math.max(1,Math.floor(d));if(!Number.isFinite(d)||h<1)throw new Error("AxisRenderer.prepare: tickCount must be a finite number >= 1.");const N=y*f,w=N/u*2,C=N/m*2,R=lr(e.min)??(n==="x"?t.invert(p):t.invert(x)),P=lr(e.max)??(n==="x"?t.invert(F):t.invert(b)),T=wo(R,P),B=T.min,U=T.max,_=1+h,D=new Float32Array(_*2*2);let G=0;if(n==="x"){D[G++]=p,D[G++]=x,D[G++]=F,D[G++]=x;const X=x,Z=X-C;for(let V=0;V<h;V++){const re=h===1?.5:V/(h-1),le=B+re*(U-B),Y=t.scale(le);D[G++]=Y,D[G++]=X,D[G++]=Y,D[G++]=Z}}else{D[G++]=p,D[G++]=x,D[G++]=p,D[G++]=b;const X=p,Z=X-w;for(let V=0;V<h;V++){const re=h===1?.5:V/(h-1),le=B+re*(U-B),Y=t.scale(le);D[G++]=X,D[G++]=Y,D[G++]=Z,D[G++]=Y}}return D};function ur(e,t){let n=!1;const i=(t==null?void 0:t.targetFormat)??po,r=e.createBindGroupLayout({entries:[{binding:0,visibility:GPUShaderStage.VERTEX,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.FRAGMENT,buffer:{type:"uniform"}}]}),s=Ve(e,64,{label:"axisRenderer/vsUniforms"}),o=Ve(e,16,{label:"axisRenderer/fsUniformsLine"}),c=Ve(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}}]}),m=ct(e,{label:"axisRenderer/pipeline",bindGroupLayouts:[r],vertex:{code:In,label:"grid.wgsl",buffers:[{arrayStride:8,stepMode:"vertex",attributes:[{shaderLocation:0,format:"float32x2",offset:0}]}]},fragment:{code:In,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 v=()=>{if(n)throw new Error("AxisRenderer is disposed.")};return{prepare:(F,b,x,y,d,h,N)=>{if(v(),x!=="x"&&x!=="y")throw new Error("AxisRenderer.prepare: orientation must be 'x' or 'y'.");const w=Fo(F,b,x,y,N),C=w.byteLength,R=Math.max(4,C);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,Ge(e,s,xo());const P=d??"rgba(255,255,255,0.8)",T=h??P,B=Ke(P)??yo,U=Ke(T)??B,_=new ArrayBuffer(4*4);new Float32Array(_).set([B[0],B[1],B[2],B[3]]),Ge(e,o,_);const D=new ArrayBuffer(4*4);new Float32Array(D).set([U[0],U[1],U[2],U[3]]),Ge(e,c,D)},render:F=>{v(),!(a===0||!f)&&(F.setPipeline(m),F.setVertexBuffer(0,f),F.setBindGroup(0,l),F.draw(Math.min(2,a)),a>2&&(F.setBindGroup(0,u),F.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 No="bgra8unorm",Mo=5,So=6,Io="rgba(255,255,255,0.15)",Co=[1,1,1,.15],To=()=>{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,m=i*u,f=c-r*u,a=s*u,v=l-o*u,M=f-m,I=v-a,p=t+n,F=new Float32Array(p*2*2);let b=0;for(let x=0;x<t;x++){const y=t===1?.5:x/(t-1),d=a+y*I,h=m/c*2-1,N=f/c*2-1,w=1-d/l*2;F[b++]=h,F[b++]=w,F[b++]=N,F[b++]=w}for(let x=0;x<n;x++){const y=n===1?.5:x/(n-1),h=(m+y*M)/c*2-1,N=1-a/l*2,w=1-v/l*2;F[b++]=h,F[b++]=N,F[b++]=h,F[b++]=w}return F};function Ro(e,t){let n=!1;const i=(t==null?void 0:t.targetFormat)??No,r=e.createBindGroupLayout({entries:[{binding:0,visibility:GPUShaderStage.VERTEX,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.FRAGMENT,buffer:{type:"uniform"}}]}),s=Ve(e,64,{label:"gridRenderer/vsUniforms"}),o=Ve(e,16,{label:"gridRenderer/fsUniforms"}),c=e.createBindGroup({layout:r,entries:[{binding:0,resource:{buffer:s}},{binding:1,resource:{buffer:o}}]}),l=ct(e,{label:"gridRenderer/pipeline",bindGroupLayouts:[r],vertex:{code:In,label:"grid.wgsl",buffers:[{arrayStride:8,stepMode:"vertex",attributes:[{shaderLocation:0,format:"float32x2",offset:0}]}]},fragment:{code:In,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,m=0;const f=()=>{if(n)throw new Error("GridRenderer is disposed.")};return{prepare:(I,p)=>{f();const F=p!=null&&typeof p=="object"&&("lineCount"in p||"color"in p),b=F?p:void 0,x=F?b==null?void 0:b.lineCount:p,y=(x==null?void 0:x.horizontal)??Mo,d=(x==null?void 0:x.vertical)??So,h=(b==null?void 0:b.color)??Io;if(y<0||d<0)throw new Error("GridRenderer.prepare: line counts must be non-negative.");if(!Number.isFinite(I.left)||!Number.isFinite(I.right)||!Number.isFinite(I.top)||!Number.isFinite(I.bottom)||!Number.isFinite(I.canvasWidth)||!Number.isFinite(I.canvasHeight))throw new Error("GridRenderer.prepare: gridArea dimensions must be finite numbers.");if(I.canvasWidth<=0||I.canvasHeight<=0)throw new Error("GridRenderer.prepare: canvas dimensions must be positive.");if(y===0&&d===0){m=0;return}const N=Po(I,y,d),w=N.byteLength,C=Math.max(4,w);if(!u||u.size<C){if(u)try{u.destroy()}catch{}u=e.createBuffer({label:"gridRenderer/vertexBuffer",size:C,usage:GPUBufferUsage.VERTEX|GPUBufferUsage.COPY_DST})}e.queue.writeBuffer(u,0,N.buffer,0,N.byteLength),m=(y+d)*2;const R=To();Ge(e,s,R);const P=Ke(h)??Co,T=new ArrayBuffer(4*4);new Float32Array(T).set([P[0],P[1],P[2],P[3]]),Ge(e,o,T)},render:I=>{f(),!(m===0||!u)&&(I.setPipeline(l),I.setBindGroup(0,c),I.setVertexBuffer(0,u),I.draw(m))},dispose:()=>{if(!n){n=!0;try{s.destroy()}catch{}try{o.destroy()}catch{}if(u)try{u.destroy()}catch{}u=null,m=0}}}}var fr=`// 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 Ao="bgra8unorm",mr=e=>Math.min(1,Math.max(0,e)),Bo=e=>Ke(e)??[0,0,0,1],Eo=e=>Array.isArray(e),dr=e=>Eo(e)?{x:e[0],y:e[1]}:{x:e.x,y:e.y},Do=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}=dr(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})},hr=(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}},Uo=(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},Lo=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}=dr(e[r]);n[i++]=s,n[i++]=o,n[i++]=s,n[i++]=o}return n};function _o(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"}},{binding:1,visibility:GPUShaderStage.FRAGMENT,buffer:{type:"uniform"}}]}),s=Ve(e,96,{label:"areaRenderer/vsUniforms"}),o=Ve(e,16,{label:"areaRenderer/fsUniforms"}),c=new ArrayBuffer(96),l=new Float32Array(c),u=new Float32Array(4),m=e.createBindGroup({layout:r,entries:[{binding:0,resource:{buffer:s}},{binding:1,resource:{buffer:o}}]}),f=ct(e,{label:"areaRenderer/pipeline",bindGroupLayouts:[r],vertex:{code:fr,label:"area.wgsl",buffers:[{arrayStride:8,stepMode:"vertex",attributes:[{shaderLocation:0,format:"float32x2",offset:0}]}]},fragment:{code:fr,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,v=0;const M=()=>{if(n)throw new Error("AreaRenderer is disposed.")},I=(x,y,d,h,N)=>{Uo(l,x,y,d,h),l[16]=N,l[17]=0,l[18]=0,l[19]=0,l[20]=0,l[21]=0,l[22]=0,l[23]=0,Ge(e,s,c)};return{prepare:(x,y,d,h,N)=>{M();const w=Lo(y),C=w.byteLength,R=Math.max(4,C);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),v=w.length/2;const{xMin:P,xMax:T,yMin:B,yMax:U}=Do(y),{a:_,b:D}=hr(d,P,T),{a:G,b:X}=hr(h,B,U),Z=Number.isFinite(N??Number.NaN)?N:Number.isFinite(B)?B:0;I(_,D,G,X,Z);const[V,re,le,Y]=Bo(x.areaStyle.color),ne=mr(x.areaStyle.opacity);u[0]=V,u[1]=re,u[2]=le,u[3]=mr(Y*ne),Ge(e,o,u)},render:x=>{M(),!(!a||v<4)&&(x.setPipeline(f),x.setBindGroup(0,m),x.setVertexBuffer(0,a),x.draw(v))},dispose:()=>{if(!n){if(n=!0,a)try{a.destroy()}catch{}a=null,v=0;try{s.destroy()}catch{}try{o.destroy()}catch{}}}}}var pr=`// 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 Go="bgra8unorm",br=e=>Math.min(1,Math.max(0,e)),Wo=e=>Ke(e)??[0,0,0,1],Oo=e=>Array.isArray(e),$o=e=>Oo(e)?{x:e[0],y:e[1]}:{x:e.x,y:e.y},ko=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}=$o(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})},gr=(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}},Vo=(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 zo(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=Ve(e,64,{label:"lineRenderer/vsUniforms"}),o=Ve(e,16,{label:"lineRenderer/fsUniforms"}),c=new ArrayBuffer(64),l=new Float32Array(c),u=new Float32Array(4),m=e.createBindGroup({layout:r,entries:[{binding:0,resource:{buffer:s}},{binding:1,resource:{buffer:o}}]}),f=ct(e,{label:"lineRenderer/pipeline",bindGroupLayouts:[r],vertex:{code:pr,label:"line.wgsl",buffers:[{arrayStride:8,stepMode:"vertex",attributes:[{shaderLocation:0,format:"float32x2",offset:0}]}]},fragment:{code:pr,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,v=0;const M=()=>{if(n)throw new Error("LineRenderer is disposed.")};return{prepare:(b,x,y,d)=>{M(),a=x,v=b.data.length;const{xMin:h,xMax:N,yMin:w,yMax:C}=ko(b.data),{a:R,b:P}=gr(y,h,N),{a:T,b:B}=gr(d,w,C);Vo(l,R,P,T,B),Ge(e,s,c);const[U,_,D,G]=Wo(b.color),X=br(b.lineStyle.opacity);u[0]=U,u[1]=_,u[2]=D,u[3]=br(G*X),Ge(e,o,u)},render:b=>{M(),!(!a||v<2)&&(b.setPipeline(f),b.setBindGroup(0,m),b.setVertexBuffer(0,a),b.draw(v))},dispose:()=>{if(!n){n=!0,a=null,v=0;try{s.destroy()}catch{}try{o.destroy()}catch{}}}}}var yr=`// 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 Xo="bgra8unorm",Ho=.01,Yo=.2,Cn=32,pi=Cn/4,bi=e=>Math.min(1,Math.max(0,e)),qo=e=>Ke(e)??[0,0,0,1],xr=e=>{if(!Number.isFinite(e)||e<=0)return 1;const t=Math.ceil(e);return 2**Math.ceil(Math.log2(t))},Zo=()=>{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},jo=e=>{const t=e.trim().match(/^(\d+(?:\.\d+)?)%$/);if(!t)return null;const n=Number(t[1])/100;return Number.isFinite(n)?n:null},vr=e=>{if(typeof e!="string")return"";const t=e.trim();return t.length>0?t:""},Ko=e=>Array.isArray(e),gi=e=>Ko(e)?{x:e[0],y:e[1]}:{x:e.x,y:e.y},Jo=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}},Qo=e=>{const{left:t,right:n,top:i,bottom:r,canvasWidth:s,canvasHeight:o,devicePixelRatio:c}=e,l=t*c,u=s-n*c,m=i*c,f=o-r*c,a=l/s*2-1,v=u/s*2-1,M=1-m/o*2,I=1-f/o*2;return{left:a,right:v,top:M,bottom:I}},ea=(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 ta(e,t){let n=!1;const i=(t==null?void 0:t.targetFormat)??Xo,r=e.createBindGroupLayout({entries:[{binding:0,visibility:GPUShaderStage.VERTEX,buffer:{type:"uniform"}}]}),s=Ve(e,64,{label:"barRenderer/vsUniforms"});Ge(e,s,Zo());const o=e.createBindGroup({layout:r,entries:[{binding:0,resource:{buffer:s}}]}),c=ct(e,{label:"barRenderer/pipeline",bindGroupLayouts:[r],vertex:{code:yr,label:"bar.wgsl",buffers:[{arrayStride:Cn,stepMode:"instance",attributes:[{shaderLocation:0,format:"float32x4",offset:0},{shaderLocation:1,format:"float32x4",offset:16}]}]},fragment:{code:yr,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,m=new ArrayBuffer(0),f=new Float32Array(m);const a=[],v=()=>{if(n)throw new Error("BarRenderer is disposed.")},M=h=>{if(h<=f.length)return;const N=Math.max(8,xr(h));m=new ArrayBuffer(N*4),f=new Float32Array(m)},I=h=>{a.length=0;for(let w=0;w<h.length;w++){const C=h[w].data;for(let R=0;R<C.length;R++){const{x:P}=gi(C[R]);Number.isFinite(P)&&a.push(P)}}if(a.length<2)return 1;a.sort((w,C)=>w-C);let N=Number.POSITIVE_INFINITY;for(let w=1;w<a.length;w++){const C=a[w]-a[w-1];C>0&&C<N&&(N=C)}return Number.isFinite(N)&&N>0?N:1},p=h=>{let N,w,C;for(let R=0;R<h.length;R++){const P=h[R];N===void 0&&P.barWidth!==void 0&&(N=P.barWidth),w===void 0&&P.barGap!==void 0&&(w=P.barGap),C===void 0&&P.barCategoryGap!==void 0&&(C=P.barCategoryGap)}return{barWidth:N,barGap:w,barCategoryGap:C}},F=h=>{let N=Number.POSITIVE_INFINITY,w=Number.NEGATIVE_INFINITY;for(let C=0;C<h.length;C++){const R=h[C].data;for(let P=0;P<R.length;P++){const{y:T}=gi(R[P]);Number.isFinite(T)&&(T<N&&(N=T),T>w&&(w=T))}}return!Number.isFinite(N)||!Number.isFinite(w)||N<=0&&0<=w?0:Math.abs(N)<Math.abs(w)?N:w},b=(h,N,w)=>{const C=N.invert(w.bottom),R=N.invert(w.top),P=Math.min(C,R),T=Math.max(C,R);return!Number.isFinite(P)||!Number.isFinite(T)?F(h):P<=0&&0<=T?0:P>0?P:T<0?T:F(h)};return{prepare:(h,N,w,C,R)=>{if(v(),h.length===0){u=0;return}const P=Jo(R);if(!P){u=0;return}const T=Qo(R),B=T.right-T.left,U=P.plotWidthCss>0?B/P.plotWidthCss:0,_=new Map,D=new Array(h.length);let G=0;for(let te=0;te<h.length;te++){const Re=vr(h[te].stack);if(Re!==""){const Ne=_.get(Re);if(Ne!==void 0)D[te]=Ne;else{const Ae=G++;_.set(Re,Ae),D[te]=Ae}}else D[te]=G++}G=Math.max(1,G);const X=I(h),Z=p(h),V=bi(Z.barGap??Ho),re=bi(Z.barCategoryGap??Yo);let le=1;for(let te=0;te<h.length;te++)le=Math.max(le,Math.floor(h[te].data.length));const Y=ea(w,X,T,le),ne=Math.max(0,Y*(1-re)),Se=G+Math.max(0,G-1)*V,Ie=Se>0?ne/Se:0;let fe=0;const oe=Z.barWidth;if(typeof oe=="number")fe=Math.max(0,oe)*U,fe=Math.min(fe,Ie);else if(typeof oe=="string"){const te=jo(oe);fe=te==null?0:Ie*bi(te)}fe>0||(fe=Ie);const ve=fe*V,we=G*fe+Math.max(0,G-1)*ve;let ue=b(h,C,T),se=C.scale(ue);if(!Number.isFinite(se)){const te=F(h);if(ue=te,se=C.scale(te),Number.isFinite(se)||(ue=0,se=C.scale(0)),!Number.isFinite(se)){u=0;return}}let ye=0;for(let te=0;te<h.length;te++)ye+=Math.max(0,h[te].data.length);M(ye*pi);const K=f;let ee=0;const Ce=new Map;for(let te=0;te<h.length;te++){const Re=h[te],Ne=Re.data,[Ae,We,qe,Le]=qo(Re.color),Me=vr(Re.stack),Oe=D[te]??0;for(let Ue=0;Ue<Ne.length;Ue++){const{x:et,y:$e}=gi(Ne[Ue]),ot=w.scale(et);if(!Number.isFinite(ot)||!Number.isFinite($e))continue;const ke=ot-we/2+Oe*(fe+ve);let ze=se,ht=0;if(Me!==""){let Ze=Ce.get(Me);Ze||(Ze=new Map,Ce.set(Me,Ze));let st;Number.isFinite(Y)&&Y>0&&Number.isFinite(ot)?st=Math.round((ot-T.left)/Y):Number.isFinite(X)&&X>0?st=Math.round(et/X):st=Math.round(et*1e6);let Bt=Ze.get(st);Bt||(Bt={posSum:ue,negSum:ue},Ze.set(st,Bt));let Et,Wt;$e>=0?(Et=Bt.posSum,Wt=Et+$e,Bt.posSum=Wt):(Et=Bt.negSum,Wt=Et+$e,Bt.negSum=Wt);const vn=C.scale(Et),cn=C.scale(Wt);if(!Number.isFinite(vn)||!Number.isFinite(cn))continue;ze=vn,ht=cn-vn}else{const Ze=C.scale($e);if(!Number.isFinite(Ze))continue;ht=Ze-se}K[ee+0]=ke,K[ee+1]=ze,K[ee+2]=fe,K[ee+3]=ht,K[ee+4]=Ae,K[ee+5]=We,K[ee+6]=qe,K[ee+7]=Le,ee+=pi}}u=ee/pi;const he=Math.max(4,u*Cn);if(!l||l.size<he){const te=Math.max(Math.max(4,xr(he)),l?l.size:0);if(l)try{l.destroy()}catch{}l=e.createBuffer({label:"barRenderer/instanceBuffer",size:te,usage:GPUBufferUsage.VERTEX|GPUBufferUsage.COPY_DST})}u>0&&e.queue.writeBuffer(l,0,m,0,u*Cn)},render:h=>{v(),!(!l||u===0)&&(h.setPipeline(c),h.setBindGroup(0,o),h.setVertexBuffer(0,l),h.draw(6,u))},dispose:()=>{if(!n){if(n=!0,l)try{l.destroy()}catch{}l=null,u=0;try{s.destroy()}catch{}}}}}var wr=`// 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 na="bgra8unorm",yi=4,Tn=16,xi=Tn/4,ia=e=>Math.min(1,Math.max(0,e)),Pn=(e,t,n)=>Math.min(n,Math.max(t,e|0)),ra=e=>Ke(e)??[0,0,0,1],Fr=e=>{if(!Number.isFinite(e)||e<=0)return 1;const t=Math.ceil(e);return 2**Math.ceil(Math.log2(t))},vi=e=>Array.isArray(e),Nr=e=>vi(e)?{x:e[0],y:e[1]}:{x:e.x,y:e.y},sa=e=>{if(vi(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},oa=e=>vi(e)?e:[e.x,e.y,e.size],aa=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}=Nr(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}},ca=(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},la=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)),m=Pn(Math.ceil(s),0,Math.max(0,t)),f=Pn(Math.ceil(c),0,Math.max(0,n)),a=Math.max(0,m-l),v=Math.max(0,f-u);return{x:l,y:u,w:a,h:v}};function ua(e,t){let n=!1;const i=(t==null?void 0:t.targetFormat)??na,r=e.createBindGroupLayout({entries:[{binding:0,visibility:GPUShaderStage.VERTEX,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.FRAGMENT,buffer:{type:"uniform"}}]}),s=Ve(e,80,{label:"scatterRenderer/vsUniforms"}),o=Ve(e,16,{label:"scatterRenderer/fsUniforms"}),c=new ArrayBuffer(80),l=new Float32Array(c),u=new Float32Array(4),m=e.createBindGroup({layout:r,entries:[{binding:0,resource:{buffer:s}},{binding:1,resource:{buffer:o}}]}),f=ct(e,{label:"scatterRenderer/pipeline",bindGroupLayouts:[r],vertex:{code:wr,label:"scatter.wgsl",buffers:[{arrayStride:Tn,stepMode:"instance",attributes:[{shaderLocation:0,format:"float32x2",offset:0},{shaderLocation:1,format:"float32",offset:8}]}]},fragment:{code:wr,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,v=0,M=new ArrayBuffer(0),I=new Float32Array(M),p=0,F=0,b=[1,1],x=null;const y=()=>{if(n)throw new Error("ScatterRenderer is disposed.")},d=R=>{if(R<=I.length)return;const P=Math.max(8,Fr(R));M=new ArrayBuffer(P*4),I=new Float32Array(M)},h=(R,P,T,B,U,_)=>{const D=Number.isFinite(U)&&U>0?U:1,G=Number.isFinite(_)&&_>0?_:1;ca(l,R,P,T,B),l[16]=D,l[17]=G,l[18]=0,l[19]=0,Ge(e,s,c),b=[D,G]};return{prepare:(R,P,T,B,U)=>{y();const{xMin:_,xMax:D,yMin:G,yMax:X}=aa(P),{a:Z,b:V}=Mr(T,_,D),{a:re,b:le}=Mr(B,G,X);U?(p=U.canvasWidth,F=U.canvasHeight,h(Z,V,re,le,U.canvasWidth,U.canvasHeight),x=la(U)):(h(Z,V,re,le,b[0],b[1]),x=null);const[Y,ne,Se,Ie]=ra(R.color);u[0]=Y,u[1]=ne,u[2]=Se,u[3]=ia(Ie),Ge(e,o,u);const fe=(U==null?void 0:U.devicePixelRatio)??1,oe=fe>0&&Number.isFinite(fe),ve=R.symbolSize,we=typeof ve=="function"?K=>{const ee=ve(oa(K));return typeof ee=="number"&&Number.isFinite(ee)?ee:yi}:typeof ve=="number"&&Number.isFinite(ve)?()=>ve:()=>yi;d(P.length*xi);const ue=I;let se=0;for(let K=0;K<P.length;K++){const ee=P[K],{x:Ce,y:he}=Nr(ee);if(!Number.isFinite(Ce)||!Number.isFinite(he))continue;const te=sa(ee)??we(ee),Re=Number.isFinite(te)?Math.max(0,te):yi,Ne=oe?Re*fe:Re;Ne>0&&(ue[se+0]=Ce,ue[se+1]=he,ue[se+2]=Ne,ue[se+3]=0,se+=xi)}v=se/xi;const ye=Math.max(4,v*Tn);if(!a||a.size<ye){const K=Math.max(Math.max(4,Fr(ye)),a?a.size:0);if(a)try{a.destroy()}catch{}a=e.createBuffer({label:"scatterRenderer/instanceBuffer",size:K,usage:GPUBufferUsage.VERTEX|GPUBufferUsage.COPY_DST})}a&&v>0&&e.queue.writeBuffer(a,0,M,0,v*Tn)},render:R=>{y(),!(!a||v===0)&&(x&&p>0&&F>0&&R.setScissorRect(x.x,x.y,x.w,x.h),R.setPipeline(f),R.setBindGroup(0,m),R.setVertexBuffer(0,a),R.draw(6,v),x&&p>0&&F>0&&R.setScissorRect(0,0,p,F))},dispose:()=>{if(!n){if(n=!0,a)try{a.destroy()}catch{}a=null,v=0;try{s.destroy()}catch{}try{o.destroy()}catch{}p=0,F=0,b=[1,1],x=null}}}}var fa=`// scatterDensityBinning.wgsl
267
+ //
268
+ // Compute-based scatter density binning:
269
+ // - Bins points into a 2D grid of atomic<u32> counters (u32 "r32uint"-style bins).
270
+ // - Reduces bins to a single max counter (atomicMax) for normalization.
271
+ //
272
+ // Bindings:
273
+ // @group(0) @binding(0): uniforms
274
+ // @group(0) @binding(1): points buffer (array<vec2<f32>>)
275
+ // @group(0) @binding(2): bins buffer (array<atomic<u32>>)
276
+ // @group(0) @binding(3): max buffer (array<atomic<u32>> length 1)
277
+ //
278
+ // Notes:
279
+ // - Bins are in *device pixels* over the plot scissor rect.
280
+ // - \`binSizePx\` is in device pixels.
281
+ // - \`startIndex/endIndex\` allow CPU-side culling; current integration uses [0, pointCount].
282
+
283
+ struct Uniforms {
284
+ transform: mat4x4<f32>,
285
+ viewportPx: vec2<f32>,
286
+ _pad0: vec2<f32>,
287
+
288
+ plotOriginPx: vec2<u32>,
289
+ plotSizePx: vec2<u32>,
290
+
291
+ binSizePx: u32,
292
+ binCountX: u32,
293
+ binCountY: u32,
294
+ startIndex: u32,
295
+ endIndex: u32,
296
+ normalization: u32,
297
+ _pad1: vec2<u32>,
298
+ };
299
+
300
+ @group(0) @binding(0) var<uniform> u: Uniforms;
301
+ @group(0) @binding(1) var<storage, read> points: array<vec2<f32>>;
302
+ @group(0) @binding(2) var<storage, read_write> bins: array<atomic<u32>>;
303
+ @group(0) @binding(3) var<storage, read_write> maxOut: array<atomic<u32>>;
304
+
305
+ fn ndcToDevicePx(clip: vec2<f32>) -> vec2<f32> {
306
+ // clip [-1,1] -> device px [0, viewport)
307
+ return (clip * 0.5 + vec2<f32>(0.5)) * u.viewportPx;
308
+ }
309
+
310
+ @compute @workgroup_size(256)
311
+ fn binPoints(@builtin(global_invocation_id) gid: vec3<u32>) {
312
+ let idx = u.startIndex + gid.x;
313
+ if (idx >= u.endIndex) { return; }
314
+
315
+ let p = points[idx];
316
+ // Transform to clip-space (affine mat4 from CPU).
317
+ let clip = (u.transform * vec4<f32>(p, 0.0, 1.0)).xy;
318
+ let devicePx = ndcToDevicePx(clip);
319
+
320
+ // Plot rect in device px.
321
+ let origin = vec2<f32>(u32(u.plotOriginPx.x), u32(u.plotOriginPx.y));
322
+ let size = vec2<f32>(u32(u.plotSizePx.x), u32(u.plotSizePx.y));
323
+ let rel = devicePx - origin;
324
+
325
+ // Reject outside plot rect.
326
+ if (rel.x < 0.0 || rel.y < 0.0 || rel.x >= size.x || rel.y >= size.y) { return; }
327
+
328
+ let binSize = max(1.0, f32(u.binSizePx));
329
+ let bx = u32(floor(rel.x / binSize));
330
+ let by = u32(floor(rel.y / binSize));
331
+ if (bx >= u.binCountX || by >= u.binCountY) { return; }
332
+
333
+ let linear = by * u.binCountX + bx;
334
+ atomicAdd(&bins[linear], 1u);
335
+ }
336
+
337
+ @compute @workgroup_size(256)
338
+ fn reduceMax(@builtin(global_invocation_id) gid: vec3<u32>) {
339
+ let i = gid.x;
340
+ let n = u.binCountX * u.binCountY;
341
+ if (i >= n) { return; }
342
+
343
+ let v = atomicLoad(&bins[i]);
344
+ atomicMax(&maxOut[0], v);
345
+ }
346
+
347
+ `,Sr=`// scatterDensityColormap.wgsl
348
+ //
349
+ // Fullscreen pass that maps density bins -> color via 256x1 LUT.
350
+ //
351
+ // Bindings:
352
+ // @group(0) @binding(0): uniforms
353
+ // @group(0) @binding(1): bins buffer (array<atomic<u32>>)
354
+ // @group(0) @binding(2): max buffer (array<atomic<u32>> length 1)
355
+ // @group(0) @binding(3): LUT texture (rgba8unorm 256x1)
356
+
357
+ struct Uniforms {
358
+ plotOriginPx: vec2<u32>,
359
+ plotSizePx: vec2<u32>,
360
+
361
+ binSizePx: u32,
362
+ binCountX: u32,
363
+ binCountY: u32,
364
+ normalization: u32,
365
+ _pad0: vec2<u32>,
366
+ _pad1: vec2<u32>,
367
+ };
368
+
369
+ @group(0) @binding(0) var<uniform> u: Uniforms;
370
+ @group(0) @binding(1) var<storage, read_write> bins: array<atomic<u32>>;
371
+ @group(0) @binding(2) var<storage, read_write> maxOut: array<atomic<u32>>;
372
+ @group(0) @binding(3) var lutTex: texture_2d<f32>;
373
+
374
+ struct VSOut {
375
+ @builtin(position) pos: vec4<f32>,
376
+ };
377
+
378
+ @vertex
379
+ fn vsMain(@builtin(vertex_index) vi: u32) -> VSOut {
380
+ // Fullscreen triangle.
381
+ let p = array<vec2<f32>, 3>(
382
+ vec2<f32>(-1.0, -1.0),
383
+ vec2<f32>( 3.0, -1.0),
384
+ vec2<f32>(-1.0, 3.0)
385
+ );
386
+ var o: VSOut;
387
+ o.pos = vec4<f32>(p[vi], 0.0, 1.0);
388
+ return o;
389
+ }
390
+
391
+ fn applyNormalization(v: f32, vmax: f32, mode: u32) -> f32 {
392
+ if (vmax <= 0.0) { return 0.0; }
393
+ let x = clamp(v / vmax, 0.0, 1.0);
394
+
395
+ // 0: linear, 1: sqrt, 2: log (default in options).
396
+ if (mode == 1u) {
397
+ return sqrt(x);
398
+ }
399
+ if (mode == 2u) {
400
+ // Prefer log1p-like shape for count data.
401
+ return log(1.0 + v) / log(1.0 + vmax);
402
+ }
403
+ return x;
404
+ }
405
+
406
+ @fragment
407
+ fn fsMain(@builtin(position) pos: vec4<f32>) -> @location(0) vec4<f32> {
408
+ // Pixel coordinate in device space.
409
+ let px = vec2<i32>(i32(pos.x), i32(pos.y));
410
+ let origin = vec2<i32>(i32(u.plotOriginPx.x), i32(u.plotOriginPx.y));
411
+ let size = vec2<i32>(i32(u.plotSizePx.x), i32(u.plotSizePx.y));
412
+ let rel = px - origin;
413
+
414
+ // Outside plot -> discard (scissor is also applied in host code).
415
+ if (rel.x < 0 || rel.y < 0 || rel.x >= size.x || rel.y >= size.y) {
416
+ discard;
417
+ }
418
+
419
+ let binSize = max(1u, u.binSizePx);
420
+ let bx = u32(rel.x) / binSize;
421
+ let by = u32(rel.y) / binSize;
422
+ if (bx >= u.binCountX || by >= u.binCountY) {
423
+ discard;
424
+ }
425
+
426
+ let linear = by * u.binCountX + bx;
427
+ let c = atomicLoad(&bins[linear]);
428
+ let m = atomicLoad(&maxOut[0]);
429
+
430
+ let vf = f32(c);
431
+ let mf = f32(m);
432
+ let n = applyNormalization(vf, mf, u.normalization);
433
+
434
+ let lutIdx = clamp(i32(n * 255.0 + 0.5), 0, 255);
435
+ let col = textureLoad(lutTex, vec2<i32>(lutIdx, 0), 0);
436
+ return vec4<f32>(col.rgb, 1.0);
437
+ }
438
+
439
+ `;const ma="bgra8unorm",Rn=e=>Math.min(1,Math.max(0,e)),Gt=(e,t,n)=>Math.min(n,Math.max(t,e|0)),da=e=>{if(!Number.isFinite(e)||e<=0)return 1;const t=Math.ceil(e);return 2**Math.ceil(Math.log2(t))},Ir=(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}},ha=(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},pa=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=Gt(Math.floor(r),0,Math.max(0,t)),u=Gt(Math.floor(o),0,Math.max(0,n)),m=Gt(Math.ceil(s),0,Math.max(0,t)),f=Gt(Math.ceil(c),0,Math.max(0,n)),a=Math.max(0,m-l),v=Math.max(0,f-u);return{x:l,y:u,w:a,h:v}},An=(e,t,n)=>e+(t-e)*n,ba=(e,t,n)=>[An(e[0],t[0],n),An(e[1],t[1],n),An(e[2],t[2],n),An(e[3],t[3],n)],ga=e=>Ke(e)??[0,0,0,1],Cr=e=>e==="plasma"?["#0d0887","#6a00a8","#b12a90","#e16462","#fca636","#f0f921"]:e==="inferno"?["#000004","#420a68","#932667","#dd513a","#fca50a","#fcffa4"]:["#440154","#3b528b","#21918c","#5ec962","#fde725"],ya=e=>{const n=(typeof e=="string"?Cr(e):Array.isArray(e)&&e.length>0?e:Cr("viridis")).map(ga),i=Math.max(2,n.length),r=new Uint8Array(new ArrayBuffer(256*4));for(let s=0;s<256;s++){const c=s/255*(i-1),l=Math.min(i-2,Math.max(0,Math.floor(c))),u=c-l,m=ba(n[l],n[l+1],u);r[s*4+0]=Gt(Math.round(Rn(m[0])*255),0,255),r[s*4+1]=Gt(Math.round(Rn(m[1])*255),0,255),r[s*4+2]=Gt(Math.round(Rn(m[2])*255),0,255),r[s*4+3]=Gt(Math.round(Rn(m[3])*255),0,255)}return r},xa=e=>{if(typeof e=="string")return e;try{return JSON.stringify(e)}catch{return"custom"}},va=e=>e==="sqrt"?1:e==="log"?2:0;function wa(e,t){let n=!1;const i=(t==null?void 0:t.targetFormat)??ma,r=e.createBindGroupLayout({entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}},{binding:3,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]}),s=e.createBindGroupLayout({entries:[{binding:0,visibility:GPUShaderStage.FRAGMENT,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.FRAGMENT,buffer:{type:"storage"}},{binding:2,visibility:GPUShaderStage.FRAGMENT,buffer:{type:"storage"}},{binding:3,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:"unfilterable-float"}}]}),o=Ve(e,128,{label:"scatterDensity/computeUniforms"}),c=new ArrayBuffer(128),l=new Float32Array(c,0,20),u=new Uint32Array(c),m=Ve(e,48,{label:"scatterDensity/renderUniforms"}),f=new ArrayBuffer(48),a=new Uint32Array(f),v=or(e,fa,"scatterDensityBinning.wgsl"),M=e.createComputePipeline({label:"scatterDensity/binPointsPipeline",layout:e.createPipelineLayout({bindGroupLayouts:[r]}),compute:{module:v,entryPoint:"binPoints"}}),I=e.createComputePipeline({label:"scatterDensity/reduceMaxPipeline",layout:e.createPipelineLayout({bindGroupLayouts:[r]}),compute:{module:v,entryPoint:"reduceMax"}}),p=ct(e,{label:"scatterDensity/renderPipeline",bindGroupLayouts:[s],vertex:{code:Sr,label:"scatterDensityColormap.wgsl"},fragment:{code:Sr,label:"scatterDensityColormap.wgsl",formats:i,blend:void 0},primitive:{topology:"triangle-list",cullMode:"none"},multisample:{count:1}});let F=null,b=null,x=0,y=null,d=null,h="",N=null,w=null,C=null,R=-1,P=0,T=0,B=0,U=0,_=0,D=null,G=0,X=0,Z=2,V=!0,re=!1,le=new Uint32Array(0);const Y=()=>{if(n)throw new Error("ScatterDensityRenderer is disposed.")},ne=ue=>{const se=xa(ue.densityColormap);if(y||(y=e.createTexture({label:"scatterDensity/lutTexture",size:{width:256,height:1,depthOrArrayLayers:1},format:"rgba8unorm",usage:GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.COPY_DST}),d=y.createView(),h=""),se===h)return;const ye=ya(ue.densityColormap);e.queue.writeTexture({texture:y},ye,{bytesPerRow:256*4,rowsPerImage:1},{width:256,height:1,depthOrArrayLayers:1}),h=se},Se=(ue,se)=>{const ye=Math.max(1,ue|0)*Math.max(1,se|0);if(F&&b&&ye<=x)return;const K=Math.max(1,ye);if(x=Math.max(256,da(K)),F){try{F.destroy()}catch{}F=null}if(b){try{b.destroy()}catch{}b=null}F=e.createBuffer({label:"scatterDensity/binsBuffer",size:x*4,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST}),b=e.createBuffer({label:"scatterDensity/maxBuffer",size:4,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST}),le=new Uint32Array(x),N=null,w=null,V=!0},Ie=()=>{!F||!b||!d||!C||(N||(N=e.createBindGroup({label:"scatterDensity/computeBindGroup",layout:r,entries:[{binding:0,resource:{buffer:o}},{binding:1,resource:{buffer:C}},{binding:2,resource:{buffer:F}},{binding:3,resource:{buffer:b}}]})),w||(w=e.createBindGroup({label:"scatterDensity/renderBindGroup",layout:s,entries:[{binding:0,resource:{buffer:m}},{binding:1,resource:{buffer:F}},{binding:2,resource:{buffer:b}},{binding:3,resource:d}]})))};return{prepare:(ue,se,ye,K,ee,Ce,he,te,Re)=>{Y(),re=!0;const Ne=pa(te),Ae=te.devicePixelRatio,We=Number.isFinite(ue.binSize)?Math.max(1e-6,ue.binSize):4,qe=Math.max(1,Math.round(We*(Number.isFinite(Ae)&&Ae>0?Ae:1))),Le=Math.max(1,Math.ceil(Ne.w/qe)),Me=Math.max(1,Math.ceil(Ne.h/qe));Se(Le,Me),ne(ue);const Oe=va(ue.densityNormalization);C!==se&&(C=se,N=null,w=null,V=!0),R!==ye&&(R=ye,V=!0),(P!==K||T!==ee)&&(P=K,T=ee,V=!0),(B!==qe||U!==Le||_!==Me)&&(B=qe,U=Le,_=Me,V=!0),(!D||D.x!==Ne.x||D.y!==Ne.y||D.w!==Ne.w||D.h!==Ne.h)&&(D=Ne,V=!0),(G!==te.canvasWidth||X!==te.canvasHeight)&&(G=te.canvasWidth,X=te.canvasHeight,V=!0),Z!==Oe&&(Z=Oe,V=!0);const Ue=Re,et=(Ue==null?void 0:Ue.xMin)??0,$e=(Ue==null?void 0:Ue.xMax)??1,ot=(Ue==null?void 0:Ue.yMin)??0,ke=(Ue==null?void 0:Ue.yMax)??1,{a:ze,b:ht}=Ir(Ce,et,$e),{a:Ze,b:st}=Ir(he,ot,ke);ha(l,ze,ht,Ze,st),l[16]=te.canvasWidth>0?te.canvasWidth:1,l[17]=te.canvasHeight>0?te.canvasHeight:1,l[18]=0,l[19]=0,u[20]=Ne.x>>>0,u[21]=Ne.y>>>0,u[22]=Ne.w>>>0,u[23]=Ne.h>>>0,u[24]=qe>>>0,u[25]=Le>>>0,u[26]=Me>>>0,u[27]=(Math.max(0,K)|0)>>>0,u[28]=(Math.max(0,ee)|0)>>>0,u[29]=Oe>>>0,Ge(e,o,c),a[0]=Ne.x>>>0,a[1]=Ne.y>>>0,a[2]=Ne.w>>>0,a[3]=Ne.h>>>0,a[4]=qe>>>0,a[5]=Le>>>0,a[6]=Me>>>0,a[7]=Oe>>>0,Ge(e,m,f),Ie()},encodeCompute:ue=>{if(Y(),!re||!V)return;if(!F||!b||!N||R<=0){V=!1;return}if(!D||D.w<=0||D.h<=0){V=!1;return}e.queue.writeBuffer(F,0,le.buffer,0,x*4),e.queue.writeBuffer(b,0,new Uint32Array([0]).buffer);const se=U*_|0,ye=Math.max(0,T-P|0),K=ue.beginComputePass({label:"scatterDensity/computePass"});K.setBindGroup(0,N),K.setPipeline(M);const ee=256,Ce=Math.ceil(ye/ee);Ce>0&&K.dispatchWorkgroups(Ce),K.setPipeline(I);const he=Math.ceil(se/ee);he>0&&K.dispatchWorkgroups(he),K.end(),V=!1},render:ue=>{Y(),re&&(!w||!D||!d||D.w<=0||D.h<=0||(ue.setScissorRect(D.x,D.y,D.w,D.h),ue.setPipeline(p),ue.setBindGroup(0,w),ue.draw(3),G>0&&X>0&&ue.setScissorRect(0,0,G,X)))},dispose:()=>{if(!n){n=!0;try{o.destroy()}catch{}try{m.destroy()}catch{}if(F)try{F.destroy()}catch{}if(b)try{b.destroy()}catch{}if(F=null,b=null,x=0,y)try{y.destroy()}catch{}y=null,d=null,N=null,w=null,C=null}}}}var Tr=`// pie.wgsl
440
+ // Instanced anti-aliased pie-slice shader (instanced quad + SDF mask).
441
+ //
442
+ // - Per-instance vertex input:
443
+ // - center = vec2<f32> slice center (transformed by VSUniforms.transform)
444
+ // - startAngleRad = f32 start angle in radians
445
+ // - endAngleRad = f32 end angle in radians
446
+ // - radiiPx = vec2<f32>(innerRadiusPx, outerRadiusPx) in *device pixels*
447
+ // - color = vec4<f32> RGBA color in [0..1]
448
+ //
449
+ // - Draw call: draw(6, instanceCount) using triangle-list expansion in VS
450
+ //
451
+ // - Uniforms:
452
+ // - @group(0) @binding(0): VSUniforms { transform, viewportPx }
453
+ //
454
+ // Notes:
455
+ // - The quad is expanded in clip space using \`radiusPx\` and \`viewportPx\`.
456
+ // - Fragment uses an SDF mask for the circle boundary + an angular wedge mask.
457
+ // - Fully outside fragments are discarded to avoid unnecessary blending work.
458
+ //
459
+ // Conventions: matches other shaders in this repo (vsMain/fsMain, group 0 bindings,
460
+ // and explicit uniform padding/alignment where needed).
461
+
462
+ const PI: f32 = 3.141592653589793;
463
+ const TAU: f32 = 6.283185307179586; // 2*pi
464
+
465
+ struct VSUniforms {
466
+ transform: mat4x4<f32>,
467
+ viewportPx: vec2<f32>,
468
+ // Pad to 16-byte alignment (mat4x4 is 64B; vec2 adds 8B; pad to 80B).
469
+ _pad0: vec2<f32>,
470
+ };
471
+
472
+ @group(0) @binding(0) var<uniform> vsUniforms: VSUniforms;
473
+
474
+ struct VSIn {
475
+ @location(0) center: vec2<f32>,
476
+ @location(1) startAngleRad: f32,
477
+ @location(2) endAngleRad: f32,
478
+ @location(3) radiiPx: vec2<f32>, // (innerPx, outerPx)
479
+ @location(4) color: vec4<f32>,
480
+ };
481
+
482
+ struct VSOut {
483
+ @builtin(position) clipPosition: vec4<f32>,
484
+ @location(0) localPx: vec2<f32>,
485
+ @location(1) startAngleRad: f32,
486
+ @location(2) endAngleRad: f32,
487
+ @location(3) radiiPx: vec2<f32>,
488
+ @location(4) color: vec4<f32>,
489
+ };
490
+
491
+ @vertex
492
+ fn vsMain(in: VSIn, @builtin(vertex_index) vertexIndex: u32) -> VSOut {
493
+ // Fixed local corners for 2 triangles (triangle-list).
494
+ // \`localNdc\` is a quad in [-1, 1]^2; we convert it to pixel offsets via radiusPx.
495
+ let localNdc = array<vec2<f32>, 6>(
496
+ vec2<f32>(-1.0, -1.0),
497
+ vec2<f32>( 1.0, -1.0),
498
+ vec2<f32>(-1.0, 1.0),
499
+ vec2<f32>(-1.0, 1.0),
500
+ vec2<f32>( 1.0, -1.0),
501
+ vec2<f32>( 1.0, 1.0)
502
+ );
503
+
504
+ let corner = localNdc[vertexIndex];
505
+ let outerPx = in.radiiPx.y;
506
+ let localPx = corner * outerPx;
507
+
508
+ // Convert pixel offset to clip-space offset.
509
+ // Clip space spans [-1, 1] across the viewport, so px -> clip is (2 / viewportPx).
510
+ let localClip = localPx * (2.0 / vsUniforms.viewportPx);
511
+
512
+ let centerClip = (vsUniforms.transform * vec4<f32>(in.center, 0.0, 1.0)).xy;
513
+
514
+ var out: VSOut;
515
+ out.clipPosition = vec4<f32>(centerClip + localClip, 0.0, 1.0);
516
+ out.localPx = localPx;
517
+ out.startAngleRad = in.startAngleRad;
518
+ out.endAngleRad = in.endAngleRad;
519
+ out.radiiPx = in.radiiPx;
520
+ out.color = in.color;
521
+ return out;
522
+ }
523
+
524
+ fn wrapToTau(theta: f32) -> f32 {
525
+ // Maps theta to [0, TAU). (Input often comes from atan2 in [-PI, PI].)
526
+ return select(theta, theta + TAU, theta < 0.0);
527
+ }
528
+
529
+ @fragment
530
+ fn fsMain(in: VSOut) -> @location(0) vec4<f32> {
531
+ let p = in.localPx;
532
+ let r = length(p);
533
+
534
+ let innerPx = in.radiiPx.x;
535
+ let outerPx = in.radiiPx.y;
536
+
537
+ // --- Radial mask: ring between inner and outer radii (inner==0 => pie) ---
538
+ // Positive inside the ring, negative outside.
539
+ let radialDist = min(r - innerPx, outerPx - r);
540
+ let radialW = fwidth(radialDist);
541
+ let radialA = smoothstep(-radialW, radialW, radialDist);
542
+
543
+ if (radialA <= 0.0) {
544
+ discard;
545
+ }
546
+
547
+ // Compute fragment angle in [0, TAU).
548
+ let angle = wrapToTau(atan2(p.y, p.x));
549
+
550
+ // --- Angular mask: wedge between start/end angles with wrap ---
551
+ let start = in.startAngleRad;
552
+ let end = in.endAngleRad;
553
+
554
+ // Compute span in [0, 2π) with wrap.
555
+ var span = end - start;
556
+ span = span + select(0.0, TAU, span < 0.0);
557
+
558
+ // Compute rel in [0, 2π) with wrap.
559
+ var rel = angle - start;
560
+ rel = rel + select(0.0, TAU, rel < 0.0);
561
+
562
+ let inside = rel <= span;
563
+
564
+ // Signed angular distance (in radians) to nearest boundary.
565
+ // - Inside: +min(rel, span-rel)
566
+ // - Outside: -min(rel-span, 2π-rel)
567
+ let dIn = min(rel, max(span - rel, 0.0));
568
+ let dOutA = max(rel - span, 0.0);
569
+ let dOutB = max(TAU - rel, 0.0);
570
+ let dOut = min(dOutA, dOutB);
571
+
572
+ let signedAngleDist = select(-dOut, dIn, inside);
573
+
574
+ // Convert to approximate pixel distance to the boundary ray.
575
+ // (For small angles, perpendicular distance to a ray ≈ r * angle.)
576
+ let angleDistPx = signedAngleDist * max(r, 1.0);
577
+
578
+ let angW = fwidth(angleDistPx);
579
+ let angularA = smoothstep(-angW, angW, angleDistPx);
580
+
581
+ let aOut = radialA * angularA;
582
+ if (aOut <= 0.0) {
583
+ discard;
584
+ }
585
+
586
+ return vec4<f32>(in.color.rgb, in.color.a * aOut);
587
+ }
588
+
589
+ `;const Fa="bgra8unorm",Bn=40,wi=Bn/4,un=Math.PI*2,Pr=e=>Math.min(1,Math.max(0,e)),En=(e,t,n)=>Math.min(n,Math.max(t,e|0)),Rr=e=>{if(!Number.isFinite(e)||e<=0)return 1;const t=Math.ceil(e);return 2**Math.ceil(Math.log2(t))},Ar=e=>{if(!Number.isFinite(e))return 0;const t=e%un;return t<0?t+un:t},Na=(e,t)=>{const n=Ke(e);if(n)return[n[0],n[1],n[2],Pr(n[3])];const i=Ke(t);return i?[i[0],i[1],i[2],Pr(i[3])]:[0,0,0,1]},fn=(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},Ma=(e,t,n)=>{const i=(e==null?void 0:e[0])??"50%",r=(e==null?void 0:e[1])??"50%",s=fn(i,t),o=fn(r,n);return{x:Number.isFinite(s)?s:t*.5,y:Number.isFinite(o)?o:n*.5}},Sa=e=>Array.isArray(e),Ia=(e,t)=>{if(e==null)return{inner:0,outer:t*.7};if(Sa(e)){const r=fn(e[0],t),s=fn(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=fn(e,t),i=Math.max(0,Number.isFinite(n)?n:t*.7);return{inner:0,outer:Math.min(t,i)}},Ca=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=En(Math.floor(r),0,Math.max(0,t)),u=En(Math.floor(o),0,Math.max(0,n)),m=En(Math.ceil(s),0,Math.max(0,t)),f=En(Math.ceil(c),0,Math.max(0,n)),a=Math.max(0,m-l),v=Math.max(0,f-u);return{x:l,y:u,w:a,h:v}},Ta=new Float32Array([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]);function Pa(e,t){let n=!1;const i=(t==null?void 0:t.targetFormat)??Fa,r=e.createBindGroupLayout({entries:[{binding:0,visibility:GPUShaderStage.VERTEX,buffer:{type:"uniform"}}]}),s=Ve(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=ct(e,{label:"pieRenderer/pipeline",bindGroupLayouts:[r],vertex:{code:Tr,label:"pie.wgsl",buffers:[{arrayStride:Bn,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:Tr,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 m=null,f=0,a=new ArrayBuffer(0),v=new Float32Array(a),M=0,I=0,p=null;const F=()=>{if(n)throw new Error("PieRenderer is disposed.")},b=N=>{if(N<=v.length)return;const w=Math.max(8,Rr(N));a=new ArrayBuffer(w*4),v=new Float32Array(a)},x=(N,w)=>{const C=Number.isFinite(N)&&N>0?N:1,R=Number.isFinite(w)&&w>0?w:1;c.set(Ta,0),c[16]=C,c[17]=R,c[18]=0,c[19]=0,Ge(e,s,o)};return{prepare:(N,w)=>{var ee;F();const C=w.devicePixelRatio,R=C>0&&Number.isFinite(C)?C:1;M=w.canvasWidth,I=w.canvasHeight,x(w.canvasWidth,w.canvasHeight),p=Ca(w);const P=w.canvasWidth/R,T=w.canvasHeight/R;if(!(P>0)||!(T>0)){f=0;return}const B=P-w.left-w.right,U=T-w.top-w.bottom;if(!(B>0)||!(U>0)){f=0;return}const _=.5*Math.min(B,U);if(!(_>0)){f=0;return}const D=Ma(N.center,B,U),G=w.left+D.x,X=w.top+D.y,Z=G/P*2-1,V=1-X/T*2;if(!Number.isFinite(Z)||!Number.isFinite(V)){f=0;return}const re=Ia(N.radius,_),le=Math.max(0,Math.min(re.inner,re.outer)),Y=Math.max(le,re.outer),ne=le*R,Se=Y*R;if(!(Se>0)){f=0;return}let Ie=0,fe=0;for(let Ce=0;Ce<N.data.length;Ce++){const he=(ee=N.data[Ce])==null?void 0:ee.value;typeof he=="number"&&Number.isFinite(he)&&he>0&&(Ie+=he,fe++)}if(!(Ie>0)||fe===0){f=0;return}b(fe*wi);const oe=v,ve=typeof N.startAngle=="number"&&Number.isFinite(N.startAngle)?N.startAngle:90;let we=Ar(ve*Math.PI/180),ue=0,se=0,ye=0;for(let Ce=0;Ce<N.data.length;Ce++){const he=N.data[Ce],te=he==null?void 0:he.value;if(typeof te!="number"||!Number.isFinite(te)||te<=0)continue;ye++;const Re=ye===fe;let Ae=te/Ie*un;if(Re?Ae=Math.max(0,un-ue):Ae=Math.max(0,Math.min(un,Ae)),ue+=Ae,!(Ae>0))continue;const We=we,qe=Ar(we+Ae);we=qe;const[Le,Me,Oe,Ue]=Na(he.color,N.color);oe[se+0]=Z,oe[se+1]=V,oe[se+2]=We,oe[se+3]=qe,oe[se+4]=ne,oe[se+5]=Se,oe[se+6]=Le,oe[se+7]=Me,oe[se+8]=Oe,oe[se+9]=Ue,se+=wi}f=se/wi;const K=Math.max(4,f*Bn);if(!m||m.size<K){const Ce=Math.max(Math.max(4,Rr(K)),m?m.size:0);if(m)try{m.destroy()}catch{}m=e.createBuffer({label:"pieRenderer/instanceBuffer",size:Ce,usage:GPUBufferUsage.VERTEX|GPUBufferUsage.COPY_DST})}m&&f>0&&e.queue.writeBuffer(m,0,a,0,f*Bn)},render:N=>{F(),!(!m||f===0)&&(p&&M>0&&I>0&&N.setScissorRect(p.x,p.y,p.w,p.h),N.setPipeline(u),N.setBindGroup(0,l),N.setVertexBuffer(0,m),N.draw(6,f),p&&M>0&&I>0&&N.setScissorRect(0,0,M,I))},dispose:()=>{if(!n){if(n=!0,m)try{m.destroy()}catch{}m=null,f=0;try{s.destroy()}catch{}M=0,I=0,p=null}}}}var Br=`// candlestick.wgsl
590
+ // Instanced candlestick shader (bodies + wicks):
591
+ // - Per-instance vertex input:
592
+ // - xClip, openClip, closeClip, lowClip, highClip, bodyWidthClip (6 floats)
593
+ // - bodyColor rgba (4 floats)
594
+ // - Draw call: draw(18, instanceCount) using triangle-list expansion in VS
595
+ // - vertices 0-5: body quad (2 triangles)
596
+ // - vertices 6-11: upper wick (2 triangles)
597
+ // - vertices 12-17: lower wick (2 triangles)
598
+ // - Uniforms:
599
+ // - @group(0) @binding(0): VSUniforms { transform, wickWidthClip }
600
+
601
+ struct VSUniforms {
602
+ transform: mat4x4<f32>,
603
+ wickWidthClip: f32,
604
+ _pad0: f32,
605
+ _pad1: f32,
606
+ _pad2: f32,
607
+ };
608
+
609
+ @group(0) @binding(0) var<uniform> vsUniforms: VSUniforms;
610
+
611
+ struct VSIn {
612
+ @location(0) xClip: f32,
613
+ @location(1) openClip: f32,
614
+ @location(2) closeClip: f32,
615
+ @location(3) lowClip: f32,
616
+ @location(4) highClip: f32,
617
+ @location(5) bodyWidthClip: f32,
618
+ @location(6) bodyColor: vec4<f32>,
619
+ };
620
+
621
+ struct VSOut {
622
+ @builtin(position) clipPosition: vec4<f32>,
623
+ @location(0) color: vec4<f32>,
624
+ };
625
+
626
+ @vertex
627
+ fn vsMain(in: VSIn, @builtin(vertex_index) vertexIndex: u32) -> VSOut {
628
+ // Compute body bounds
629
+ let bodyTop = max(in.openClip, in.closeClip);
630
+ let bodyBottom = min(in.openClip, in.closeClip);
631
+ let bodyLeft = in.xClip - in.bodyWidthClip * 0.5;
632
+ let bodyRight = in.xClip + in.bodyWidthClip * 0.5;
633
+
634
+ // Wick bounds
635
+ let wickLeft = in.xClip - vsUniforms.wickWidthClip * 0.5;
636
+ let wickRight = in.xClip + vsUniforms.wickWidthClip * 0.5;
637
+
638
+ var pos: vec2<f32>;
639
+
640
+ if (vertexIndex < 6u) {
641
+ // Body quad (vertices 0-5)
642
+ let corners = array<vec2<f32>, 6>(
643
+ vec2<f32>(0.0, 0.0),
644
+ vec2<f32>(1.0, 0.0),
645
+ vec2<f32>(0.0, 1.0),
646
+ vec2<f32>(0.0, 1.0),
647
+ vec2<f32>(1.0, 0.0),
648
+ vec2<f32>(1.0, 1.0)
649
+ );
650
+ let corner = corners[vertexIndex];
651
+ let bodyMin = vec2<f32>(bodyLeft, bodyBottom);
652
+ let bodyMax = vec2<f32>(bodyRight, bodyTop);
653
+ pos = bodyMin + corner * (bodyMax - bodyMin);
654
+ } else if (vertexIndex < 12u) {
655
+ // Upper wick (vertices 6-11): from bodyTop to highClip
656
+ let idx = vertexIndex - 6u;
657
+ let corners = array<vec2<f32>, 6>(
658
+ vec2<f32>(0.0, 0.0),
659
+ vec2<f32>(1.0, 0.0),
660
+ vec2<f32>(0.0, 1.0),
661
+ vec2<f32>(0.0, 1.0),
662
+ vec2<f32>(1.0, 0.0),
663
+ vec2<f32>(1.0, 1.0)
664
+ );
665
+ let corner = corners[idx];
666
+ let wickMin = vec2<f32>(wickLeft, bodyTop);
667
+ let wickMax = vec2<f32>(wickRight, in.highClip);
668
+ pos = wickMin + corner * (wickMax - wickMin);
669
+ } else {
670
+ // Lower wick (vertices 12-17): from lowClip to bodyBottom
671
+ let idx = vertexIndex - 12u;
672
+ let corners = array<vec2<f32>, 6>(
673
+ vec2<f32>(0.0, 0.0),
674
+ vec2<f32>(1.0, 0.0),
675
+ vec2<f32>(0.0, 1.0),
676
+ vec2<f32>(0.0, 1.0),
677
+ vec2<f32>(1.0, 0.0),
678
+ vec2<f32>(1.0, 1.0)
679
+ );
680
+ let corner = corners[idx];
681
+ let wickMin = vec2<f32>(wickLeft, in.lowClip);
682
+ let wickMax = vec2<f32>(wickRight, bodyBottom);
683
+ pos = wickMin + corner * (wickMax - wickMin);
684
+ }
685
+
686
+ var out: VSOut;
687
+ out.clipPosition = vsUniforms.transform * vec4<f32>(pos, 0.0, 1.0);
688
+ out.color = in.bodyColor;
689
+ return out;
690
+ }
691
+
692
+ @fragment
693
+ fn fsMain(in: VSOut) -> @location(0) vec4<f32> {
694
+ return in.color;
695
+ }
696
+ `;const Ra="bgra8unorm",Aa=1,sn=40,Ht=sn/4,Ba=e=>Math.min(1,Math.max(0,e)),Dn=(e,t,n)=>Math.min(n,Math.max(t,e|0)),mn=e=>Ke(e)??[0,0,0,1],Un=e=>{if(!Number.isFinite(e)||e<=0)return 1;const t=Math.ceil(e);return 2**Math.ceil(Math.log2(t))},Ea=e=>{const t=e.trim().match(/^(\d+(?:\.\d+)?)%$/);if(!t)return null;const n=Number(t[1])/100;return Number.isFinite(n)?n:null},Da=e=>Array.isArray(e),Er=e=>Da(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}},La=e=>{const{left:t,right:n,top:i,bottom:r,canvasWidth:s,canvasHeight:o,devicePixelRatio:c}=e,l=t*c,u=s-n*c,m=i*c,f=o-r*c,a=l/s*2-1,v=u/s*2-1,M=1-m/o*2,I=1-f/o*2;return{left:a,right:v,top:M,bottom:I,width:v-a,height:M-I}},_a=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=Dn(Math.floor(r),0,Math.max(0,t)),u=Dn(Math.floor(o),0,Math.max(0,n)),m=Dn(Math.ceil(s),0,Math.max(0,t)),f=Dn(Math.ceil(c),0,Math.max(0,n)),a=Math.max(0,m-l),v=Math.max(0,f-u);return{x:l,y:u,w:a,h:v}},Ga=e=>{const t=[];for(let i=0;i<e.length;i++){const{timestamp:r}=Er(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},Wa=(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},Oa=()=>{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 $a(e,t){let n=!1;const i=(t==null?void 0:t.targetFormat)??Ra,r=e.createBindGroupLayout({entries:[{binding:0,visibility:GPUShaderStage.VERTEX,buffer:{type:"uniform"}}]}),s=Ve(e,80,{label:"candlestickRenderer/vsUniforms"});Ge(e,s,Oa());const o=new ArrayBuffer(80),c=new Float32Array(o),l=e.createBindGroup({layout:r,entries:[{binding:0,resource:{buffer:s}}]}),u=ct(e,{label:"candlestickRenderer/pipeline",bindGroupLayouts:[r],vertex:{code:Br,label:"candlestick.wgsl",buffers:[{arrayStride:sn,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:Br,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 m=null,f=0,a=new ArrayBuffer(0),v=new Float32Array(a),M=0,I=0,p=null,F=!1,b=null,x=0,y=new ArrayBuffer(0),d=new Float32Array(y);const h=()=>{if(n)throw new Error("CandlestickRenderer is disposed.")},N=T=>{if(T<=v.length)return;const B=Math.max(8,Un(T));a=new ArrayBuffer(B*4),v=new Float32Array(a)},w=T=>{if(T<=d.length)return;const B=Math.max(8,Un(T));y=new ArrayBuffer(B*4),d=new Float32Array(y)};return{prepare:(T,B,U,_,D,G)=>{if(h(),B.length===0){f=0,x=0;return}const X=Ua(D);if(!X){f=0,x=0;return}const Z=La(D),V=X.plotWidthCss>0?Z.width/X.plotWidthCss:0;M=D.canvasWidth,I=D.canvasHeight,p=_a(D);const re=Ga(B),le=Wa(U,re,Z,B.length);let Y=0;const ne=T.barWidth;if(typeof ne=="number")Y=Math.max(0,ne)*V;else if(typeof ne=="string"){const Re=Ea(ne);Y=Re==null?0:le*Ba(Re)}const Se=T.barMinWidth*V,Ie=T.barMaxWidth*V;Y=Math.min(Math.max(Y,Se),Ie);const fe=T.itemStyle.borderWidth??Aa,oe=Math.max(0,fe)*V;c.set([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,oe,0,0,0]),Ge(e,s,o);const ve=mn(T.itemStyle.upColor),we=mn(T.itemStyle.downColor),ue=mn(T.itemStyle.upBorderColor),se=mn(T.itemStyle.downBorderColor),ye=G?mn(G):[0,0,0,1];F=T.style==="hollow",N(B.length*Ht);const K=v;let ee=0;F&&w(B.length*Ht);const Ce=d;let he=0;for(let Re=0;Re<B.length;Re++){const{timestamp:Ne,open:Ae,close:We,low:qe,high:Le}=Er(B[Re]);if(!Number.isFinite(Ne)||!Number.isFinite(Ae)||!Number.isFinite(We)||!Number.isFinite(qe)||!Number.isFinite(Le))continue;const Me=U.scale(Ne),Oe=_.scale(Ae),Ue=_.scale(We),et=_.scale(qe),$e=_.scale(Le);if(!Number.isFinite(Me)||!Number.isFinite(Oe)||!Number.isFinite(Ue)||!Number.isFinite(et)||!Number.isFinite($e))continue;const ot=We>Ae;if(F){const ke=ot?ue:se;if(K[ee+0]=Me,K[ee+1]=Oe,K[ee+2]=Ue,K[ee+3]=et,K[ee+4]=$e,K[ee+5]=Y,K[ee+6]=ke[0],K[ee+7]=ke[1],K[ee+8]=ke[2],K[ee+9]=ke[3],ee+=Ht,ot){const ze=T.itemStyle.borderWidth*V,ht=Math.max(0,Y-2*ze);Ce[he+0]=Me,Ce[he+1]=Oe,Ce[he+2]=Ue,Ce[he+3]=et,Ce[he+4]=$e,Ce[he+5]=ht,Ce[he+6]=ye[0],Ce[he+7]=ye[1],Ce[he+8]=ye[2],Ce[he+9]=ye[3],he+=Ht}}else{const ke=ot?ve:we;K[ee+0]=Me,K[ee+1]=Oe,K[ee+2]=Ue,K[ee+3]=et,K[ee+4]=$e,K[ee+5]=Y,K[ee+6]=ke[0],K[ee+7]=ke[1],K[ee+8]=ke[2],K[ee+9]=ke[3],ee+=Ht}}f=ee/Ht,x=he/Ht;const te=Math.max(4,f*sn);if(!m||m.size<te){const Re=Math.max(Math.max(4,Un(te)),m?m.size:0);if(m)try{m.destroy()}catch{}m=e.createBuffer({label:"candlestickRenderer/instanceBuffer",size:Re,usage:GPUBufferUsage.VERTEX|GPUBufferUsage.COPY_DST})}if(f>0&&e.queue.writeBuffer(m,0,a,0,f*sn),F&&x>0){const Re=Math.max(4,x*sn);if(!b||b.size<Re){const Ne=Math.max(Math.max(4,Un(Re)),b?b.size:0);if(b)try{b.destroy()}catch{}b=e.createBuffer({label:"candlestickRenderer/hollowInstanceBuffer",size:Ne,usage:GPUBufferUsage.VERTEX|GPUBufferUsage.COPY_DST})}e.queue.writeBuffer(b,0,y,0,x*sn)}},render:T=>{h(),!(!m||f===0)&&(p&&M>0&&I>0&&T.setScissorRect(p.x,p.y,p.w,p.h),T.setPipeline(u),T.setBindGroup(0,l),T.setVertexBuffer(0,m),T.draw(18,f),F&&b&&x>0&&(T.setVertexBuffer(0,b),T.draw(6,x)),p&&M>0&&I>0&&T.setScissorRect(0,0,M,I))},dispose:()=>{if(!n){if(n=!0,m)try{m.destroy()}catch{}if(m=null,f=0,b)try{b.destroy()}catch{}b=null,x=0;try{s.destroy()}catch{}M=0,I=0,p=null}}}}var Dr=`// crosshair.wgsl
697
+ // Minimal crosshair line shader:
698
+ // - Vertex input: vec2<f32> position in clip-space coordinates
699
+ // - VS uniform: transform mat4 (identity)
700
+ // - FS uniform: solid RGBA color
701
+
702
+ struct VSUniforms {
703
+ transform: mat4x4<f32>,
704
+ };
705
+
706
+ @group(0) @binding(0) var<uniform> vsUniforms: VSUniforms;
707
+
708
+ struct FSUniforms {
709
+ color: vec4<f32>,
710
+ };
711
+
712
+ @group(0) @binding(1) var<uniform> fsUniforms: FSUniforms;
713
+
714
+ struct VSIn {
715
+ @location(0) position: vec2<f32>,
716
+ };
717
+
718
+ struct VSOut {
719
+ @builtin(position) clipPosition: vec4<f32>,
720
+ };
721
+
722
+ @vertex
723
+ fn vsMain(in: VSIn) -> VSOut {
724
+ var out: VSOut;
725
+ out.clipPosition = vsUniforms.transform * vec4<f32>(in.position, 0.0, 1.0);
726
+ return out;
727
+ }
728
+
729
+ @fragment
730
+ fn fsMain() -> @location(0) vec4<f32> {
731
+ return fsUniforms.color;
732
+ }
733
+
734
+ `;const ka=e=>e+3&-4,Va=1024,za=128,Xa=16384,Ha=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 Ya(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=ka(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=b=>({buffer:e.createBuffer({label:b,size:i,usage:GPUBufferUsage.VERTEX|GPUBufferUsage.COPY_DST}),mirror:new Uint32Array(s)}),c=[o("streamBuffer/a"),o("streamBuffer/b")];let l=!1,u=0,m=0;const f=()=>{if(l)throw new Error("createStreamBuffer: StreamBuffer is disposed.")},a=(b,x,y)=>{const d=c[b],h=d.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(d.buffer,0,x.buffer,x.byteOffset,N),h.set(x.subarray(0,y),0)},v=(b,x,y)=>{const d=c[b],h=d.mirror;if(y<0||y>x.length)throw new Error("createStreamBuffer.write: internal error (invalid usedWords).");const N=y<<2;if(N>0&&N<=Va){a(b,x,y);return}const w=[];let C=0,R=0,P=0;for(;P<y;){for(;P<y&&h[P]===x[P];)P++;if(P>=y)break;const T=P;for(P++;P<y&&h[P]!==x[P];)P++;const B=P;if(w.push([T,B]),C++,R+=B-T,C>za||R>Xa){a(b,x,y);return}}for(let T=0;T<w.length;T++){const[B,U]=w[T],_=B<<2,D=U-B<<2;e.queue.writeBuffer(d.buffer,_,x.buffer,x.byteOffset+_,D),h.set(x.subarray(B,U),B)}};return{write:b=>{if(f(),b.length&1)throw new Error("createStreamBuffer.write: data length must be even (vec2<f32> vertices).");const x=b.byteLength;if(x>i)throw new Error(`createStreamBuffer.write: data.byteLength (${x}) exceeds capacity (${i}). Increase maxSize.`);const y=b.length>>>1;if(x===0){m=y;return}const d=Ha(b),h=1-u;v(h,d,d.length),u=h,m=y},getBuffer:()=>(f(),c[u].buffer),getVertexCount:()=>(f(),m),dispose:()=>{if(!l){l=!0,m=0;for(const b of c)try{b.buffer.destroy()}catch{}}}}}const qa="bgra8unorm",Za=[1,1,1,.8],ja=8,Ka=6,Ja=4,Ur=8192,Qa=()=>{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},ec=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),Ln=(e,t,n)=>Math.min(n,Math.max(t,e|0)),tc=(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(ja,Math.round(n))),r=(i-1)/2,s=[];for(let o=0;o<i;o++)s.push(o-r);return s},on=(e,t)=>e/t*2-1,an=(e,t)=>1-e/t*2,_n=(e,t)=>{e.push(t[0],t[1],t[2],t[3])},Lr=(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=Ka,o=r+Ja;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 m=u,f=Math.min(u+r,i);f>m&&l.push([m,f]),u+=o}return l},nc=(e,t,n,i)=>{if(!Number.isFinite(e)||!Number.isFinite(t))throw new Error("CrosshairRenderer.prepare: x and y must be finite numbers.");if(!ec(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,m=s-n.bottom*o,f=Ln(Math.floor(c),0,Math.max(0,r)),a=Ln(Math.floor(u),0,Math.max(0,s)),v=Ln(Math.ceil(l),0,Math.max(0,r)),M=Ln(Math.ceil(m),0,Math.max(0,s)),I=Math.max(0,v-f),p=Math.max(0,M-a),F=e*o,b=t*o,x=tc(i.lineWidth,o);if(x.length===0||!i.showX&&!i.showY)return{vertices:new Float32Array(0),scissor:{x:f,y:a,w:I,h:p}};const y=[],d=i.showX?Lr(u,m):[],h=i.showY?Lr(c,l):[],w=((i.showX?d.length:0)+(i.showY?h.length:0))*x.length*2,C=w>0&&w<=Ur,R=B=>{const U=on(B,r),_=an(u,s),D=an(m,s);_n(y,[U,_,U,D])},P=B=>{const U=an(B,s),_=on(c,r),D=on(l,r);_n(y,[_,U,D,U])};if(i.showX)for(let B=0;B<x.length;B++){const U=F+x[B];if(!C){R(U);continue}const _=on(U,r);for(let D=0;D<d.length;D++){const[G,X]=d[D],Z=an(G,s),V=an(X,s);_n(y,[_,Z,_,V])}}if(i.showY)for(let B=0;B<x.length;B++){const U=b+x[B];if(!C){P(U);continue}const _=an(U,s);for(let D=0;D<h.length;D++){const[G,X]=h[D],Z=on(G,r),V=on(X,r);_n(y,[Z,_,V,_])}}return{vertices:new Float32Array(y),scissor:{x:f,y:a,w:I,h:p}}};function ic(e,t){let n=!1,i=!0;const r=(t==null?void 0:t.targetFormat)??qa,s=e.createBindGroupLayout({entries:[{binding:0,visibility:GPUShaderStage.VERTEX,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.FRAGMENT,buffer:{type:"uniform"}}]}),o=Ve(e,64,{label:"crosshairRenderer/vsUniforms"}),c=Ve(e,16,{label:"crosshairRenderer/fsUniforms"}),l=e.createBindGroup({layout:s,entries:[{binding:0,resource:{buffer:o}},{binding:1,resource:{buffer:c}}]}),u=ct(e,{label:"crosshairRenderer/pipeline",bindGroupLayouts:[s],vertex:{code:Dr,label:"crosshair.wgsl",buffers:[{arrayStride:8,stepMode:"vertex",attributes:[{shaderLocation:0,format:"float32x2",offset:0}]}]},fragment:{code:Dr,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}}),m=Ya(e,Ur*8);let f=0,a=0,v=0,M={x:0,y:0,w:0,h:0};const I=()=>{if(n)throw new Error("CrosshairRenderer is disposed.")};return{prepare:(y,d,h,N)=>{if(I(),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:C}=nc(y,d,h,N);w.byteLength===0?f=0:(m.write(w),f=m.getVertexCount()),Ge(e,o,Qa());const R=Ke(N.color)??Za,P=new ArrayBuffer(4*4);new Float32Array(P).set([R[0],R[1],R[2],R[3]]),Ge(e,c,P),a=h.canvasWidth,v=h.canvasHeight,M=C},render:y=>{I(),i&&f!==0&&(a<=0||v<=0||(y.setScissorRect(M.x,M.y,M.w,M.h),y.setPipeline(u),y.setBindGroup(0,l),y.setVertexBuffer(0,m.getBuffer()),y.draw(f),y.setScissorRect(0,0,a,v)))},setVisible:y=>{I(),i=!!y},dispose:()=>{if(!n){n=!0;try{o.destroy()}catch{}try{c.destroy()}catch{}m.dispose(),f=0,a=0,v=0,M={x:0,y:0,w:0,h:0}}}}}var _r=`// highlight.wgsl
735
+ // Draws an anti-aliased ring highlight around a point.
736
+ //
737
+ // Contract:
738
+ // - \`@builtin(position)\` in the fragment stage is framebuffer-space pixels.
739
+ // - The renderer supplies \`center\` and ring sizes in *device pixels*.
740
+
741
+ struct Uniforms {
742
+ center: vec2<f32>,
743
+ radius: f32,
744
+ thickness: f32,
745
+ color: vec4<f32>,
746
+ outlineColor: vec4<f32>,
747
+ };
748
+
749
+ @group(0) @binding(0) var<uniform> u: Uniforms;
750
+
751
+ struct VSOut {
752
+ @builtin(position) position: vec4<f32>,
753
+ };
754
+
755
+ @vertex
756
+ fn vsMain(@builtin(vertex_index) vertexIndex: u32) -> VSOut {
757
+ // Fullscreen triangle.
758
+ // Covers clip-space [-1,1] with 3 verts: (-1,-1), (3,-1), (-1,3)
759
+ let positions = array<vec2<f32>, 3>(
760
+ vec2<f32>(-1.0, -1.0),
761
+ vec2<f32>(3.0, -1.0),
762
+ vec2<f32>(-1.0, 3.0)
763
+ );
764
+
765
+ var out: VSOut;
766
+ out.position = vec4<f32>(positions[vertexIndex], 0.0, 1.0);
767
+ return out;
768
+ }
769
+
770
+ fn ringCoverage(distancePx: f32, radiusPx: f32, thicknessPx: f32) -> f32 {
771
+ let aa = 1.0; // ~1px antialias band (device pixels)
772
+ let halfT = max(0.5, thicknessPx * 0.5);
773
+ let a0 = smoothstep(radiusPx - halfT - aa, radiusPx - halfT + aa, distancePx);
774
+ let a1 = smoothstep(radiusPx + halfT - aa, radiusPx + halfT + aa, distancePx);
775
+ return clamp(a0 - a1, 0.0, 1.0);
776
+ }
777
+
778
+ @fragment
779
+ fn fsMain(@builtin(position) fragPos: vec4<f32>) -> @location(0) vec4<f32> {
780
+ let d = distance(fragPos.xy, u.center);
781
+
782
+ let ring = ringCoverage(d, u.radius, u.thickness);
783
+ let outline = ringCoverage(d, u.radius, u.thickness + 2.0);
784
+
785
+ let cover = max(ring, outline);
786
+ if (cover <= 0.0) {
787
+ discard;
788
+ }
789
+
790
+ // Blend between outline and ring color based on relative coverage,
791
+ // then apply total coverage as alpha.
792
+ let t = clamp(select(0.0, ring / cover, cover > 0.0), 0.0, 1.0);
793
+ let rgb = mix(u.outlineColor.rgb, u.color.rgb, t);
794
+ let a = mix(u.outlineColor.a, u.color.a, t) * cover;
795
+ return vec4<f32>(rgb, a);
796
+ }
797
+
798
+ `;const rc="bgra8unorm",sc=[1,1,1,1],Gn=e=>Math.min(1,Math.max(0,e)),Wn=(e,t,n)=>Math.min(n,Math.max(t,e|0)),oc=e=>Number.isFinite(e.x)&&Number.isFinite(e.y)&&Number.isFinite(e.w)&&Number.isFinite(e.h),ac=(e,t)=>{const n=Number.isFinite(t)?t:1;return[Gn(e[0]*n),Gn(e[1]*n),Gn(e[2]*n),Gn(e[3])]},cc=e=>.2126*e[0]+.7152*e[1]+.0722*e[2];function lc(e,t){let n=!1,i=!0;const r=(t==null?void 0:t.targetFormat)??rc,s=e.createBindGroupLayout({entries:[{binding:0,visibility:GPUShaderStage.FRAGMENT,buffer:{type:"uniform"}}]}),o=Ve(e,48,{label:"highlightRenderer/uniforms"}),c=e.createBindGroup({layout:s,entries:[{binding:0,resource:{buffer:o}}]}),l=ct(e,{label:"highlightRenderer/pipeline",bindGroupLayouts:[s],vertex:{code:_r,label:"highlight.wgsl"},fragment:{code:_r,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,m=0,f={x:0,y:0,w:0,h:0},a=!1;const v=()=>{if(n)throw new Error("HighlightRenderer is disposed.")};return{prepare:(b,x,y)=>{if(v(),!Number.isFinite(b.centerDeviceX)||!Number.isFinite(b.centerDeviceY))throw new Error("HighlightRenderer.prepare: point center must be finite.");if(!Number.isFinite(b.canvasWidth)||!Number.isFinite(b.canvasHeight)||b.canvasWidth<=0||b.canvasHeight<=0)throw new Error("HighlightRenderer.prepare: canvasWidth/canvasHeight must be positive finite numbers.");if(!oc(b.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 d=b.devicePixelRatio,h=Number.isFinite(d)&&d>0?d:1,N=y*h,w=Math.max(1,N*1.5),C=Math.max(1,Math.round(Math.max(2,w*.25))),R=Ke(x)??sc,P=ac(R,1.25),B=cc(R)>.7?[0,0,0,.9]:[1,1,1,.9],U=new ArrayBuffer(12*4);new Float32Array(U).set([b.centerDeviceX,b.centerDeviceY,w,C,P[0],P[1],P[2],1,B[0],B[1],B[2],B[3]]),Ge(e,o,U),u=b.canvasWidth,m=b.canvasHeight;const _=Wn(Math.floor(b.scissor.x),0,Math.max(0,b.canvasWidth)),D=Wn(Math.floor(b.scissor.y),0,Math.max(0,b.canvasHeight)),G=Wn(Math.ceil(b.scissor.x+b.scissor.w),0,Math.max(0,b.canvasWidth)),X=Wn(Math.ceil(b.scissor.y+b.scissor.h),0,Math.max(0,b.canvasHeight));f={x:_,y:D,w:Math.max(0,G-_),h:Math.max(0,X-D)},a=!0},render:b=>{v(),i&&a&&(u<=0||m<=0||f.w===0||f.h===0||(b.setScissorRect(f.x,f.y,f.w,f.h),b.setPipeline(l),b.setBindGroup(0,c),b.draw(3),b.setScissorRect(0,0,u,m)))},setVisible:b=>{v(),i=!!b},dispose:()=>{if(!n){n=!0;try{o.destroy()}catch{}u=0,m=0,f={x:0,y:0,w:0,h:0},a=!1}}}}const uc=6,fc=500;function mc(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 d=e.getBoundingClientRect();if(d.width===0||d.height===0)return null;const h=y.clientX-d.left,N=y.clientY-d.top,w=i.left,C=i.top,R=d.width-i.left-i.right,P=d.height-i.top-i.bottom,T=h-w,B=N-C,U=T>=0&&T<=R&&B>=0&&B<=P;return{x:h,y:N,gridX:T,gridY:B,plotWidthCss:R,plotHeightCss:P,isInGrid:U,originalEvent:y}},l=(y,d)=>{const h=c(d);if(h)for(const N of r[y])N(h)},u=y=>{s&&y.isPrimary&&y.pointerId===s.pointerId&&(s=null)},m=y=>{n||l("mousemove",y)},f=y=>{n||(u(y),l("mouseleave",y))},a=y=>{n||(u(y),l("mouseleave",y))},v=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 d=e.getBoundingClientRect();if(!(d.width===0||d.height===0)){s={pointerId:y.pointerId,startClientX:y.clientX,startClientY:y.clientY,startTimeMs:y.timeStamp};try{e.setPointerCapture(y.pointerId)}catch{}}},I=y=>{if(n||!y.isPrimary||!s||y.pointerId!==s.pointerId)return;const d=y.timeStamp-s.startTimeMs,h=y.clientX-s.startClientX,N=y.clientY-s.startClientY,w=h*h+N*N;s=null;try{e.hasPointerCapture(y.pointerId)&&(o=y.pointerId,e.releasePointerCapture(y.pointerId))}catch{}const C=uc;d<=fc&&w<=C*C&&l("click",y)};return e.addEventListener("pointermove",m,{passive:!0}),e.addEventListener("pointerleave",f,{passive:!0}),e.addEventListener("pointercancel",a,{passive:!0}),e.addEventListener("lostpointercapture",v,{passive:!0}),e.addEventListener("pointerdown",M,{passive:!0}),e.addEventListener("pointerup",I,{passive:!0}),{canvas:e,on:(y,d)=>{n||r[y].add(d)},off:(y,d)=>{r[y].delete(d)},updateGridArea:y=>{i=y},dispose:()=>{n||(n=!0,s=null,o=null,e.removeEventListener("pointermove",m),e.removeEventListener("pointerleave",f),e.removeEventListener("pointercancel",a),e.removeEventListener("lostpointercapture",v),e.removeEventListener("pointerdown",M),e.removeEventListener("pointerup",I),r.mousemove.clear(),r.click.clear(),r.mouseleave.clear())}}}const Gr=(e,t,n)=>Math.min(n,Math.max(t,e)),dc=(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}},hc=(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}},pc=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)},bc=e=>e.pointerType==="mouse"&&(e.buttons&4)!==0,gc=e=>e.pointerType==="mouse"&&e.shiftKey&&(e.buttons&1)!==0;function yc(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 I=M.originalEvent;if(!(M.isInGrid&&(gc(I)||bc(I)))){c();return}const F=M.plotWidthCss;if(!(F>0)||!Number.isFinite(F)){c();return}if(!s){s=!0,o=M.gridX;return}const b=M.gridX-o;if(o=M.gridX,!Number.isFinite(b)||b===0)return;const{start:x,end:y}=t.getRange(),d=y-x;if(!Number.isFinite(d)||d===0)return;const h=-(b/F)*d;!Number.isFinite(h)||h===0||t.pan(h)},u=M=>{r=null,c()},m=M=>{if(!i||n)return;const I=r;if(!I||!I.isInGrid)return;const p=I.plotWidthCss,F=I.plotHeightCss;if(!(p>0)||!(F>0))return;const b=dc(M,F),x=hc(M,p);if(Math.abs(x)>Math.abs(b)&&x!==0){const{start:R,end:P}=t.getRange(),T=P-R;if(!Number.isFinite(T)||T===0)return;const B=x/p*T;if(!Number.isFinite(B)||B===0)return;M.preventDefault(),t.pan(B);return}if(b===0)return;const y=pc(b);if(!(y>1))return;const{start:d,end:h}=t.getRange(),N=h-d;if(!Number.isFinite(N)||N===0)return;const w=Gr(I.gridX/p,0,1),C=Gr(d+w*N,0,100);M.preventDefault(),b<0?t.zoomIn(C,y):t.zoomOut(C,y)},f=()=>{n||i||(i=!0,e.on("mousemove",l),e.on("mouseleave",u),e.canvas.addEventListener("wheel",m,{passive:!1}))},a=()=>{n||!i||(i=!1,e.off("mousemove",l),e.off("mouseleave",u),e.canvas.removeEventListener("wheel",m),r=null,c())};return{enable:f,disable:a,dispose:()=>{n||(a(),n=!0)}}}const xc=.5,vc=100,lt=(e,t,n)=>Math.min(n,Math.max(t,e)),Fi=e=>lt(e,0,1),Wr=e=>Object.is(e,-0)?0:e,wc=e=>({start:e.start,end:e.end});function Fc(e,t,n){let i=0,r=100,s=null;const o=new Set;let c=(()=>{const h=Number.isFinite(n==null?void 0:n.minSpan)?n.minSpan:xc;return lt(Number.isFinite(h)?h:0,0,100)})(),l=(()=>{const h=Number.isFinite(n==null?void 0:n.maxSpan)?n.maxSpan:vc;return lt(Number.isFinite(h)?h:100,0,100)})(),u=Math.min(c,l),m=Math.max(c,l);const f=()=>{const h={start:i,end:r};if(s!==null&&s.start===h.start&&s.end===h.end)return;s=wc(h);const N=Array.from(o);for(const w of N)w({start:i,end:r})},a=(h,N,w)=>{if(w){if(typeof w=="string")switch(w){case"start":return{center:h,ratio:0};case"end":return{center:N,ratio:1};case"center":return{center:(h+N)*.5,ratio:.5}}if(w&&Number.isFinite(w.center)&&Number.isFinite(w.ratio))return{center:w.center,ratio:w.ratio}}},v=(h,N,w)=>{if(!Number.isFinite(h)||!Number.isFinite(N))return;let C=h,R=N;if(C>R){const B=C;C=R,R=B}let P=R-C;if(!Number.isFinite(P)||P<0)return;const T=lt(P,u,m);if(T!==P){const B=w!=null&&w.anchor&&Number.isFinite(w.anchor.center)?lt(w.anchor.center,0,100):(C+R)*.5,U=w!=null&&w.anchor&&Number.isFinite(w.anchor.ratio)?Fi(w.anchor.ratio):.5;C=B-U*T,R=C+T,P=T}if(P>100&&(C=0,R=100,P=100),C<0){const B=-C;C+=B,R+=B}if(R>100){const B=R-100;C-=B,R-=B}C=lt(C,0,100),R=lt(R,0,100),C=Wr(C),R=Wr(R),!(C===i&&R===r)&&(i=C,r=R,(w==null?void 0:w.emit)!==!1&&f())};return v(e,t,{emit:!1}),{getRange:()=>({start:i,end:r}),setRange:(h,N)=>{v(h,N)},setRangeAnchored:(h,N,w)=>{v(h,N,{anchor:a(h,N,w)})},setSpanConstraints:(h,N)=>{const w=typeof h=="number"&&Number.isFinite(h)?lt(h,0,100):c,C=typeof N=="number"&&Number.isFinite(N)?lt(N,0,100):l;if(w===c&&C===l)return;c=w,l=C,u=Math.min(c,l),m=Math.max(c,l);const R=i,P=r,T=1e-6,B=P>=100-T?"end":R<=0+T?"start":"center";v(R,P,{anchor:a(R,P,B)})},zoomIn:(h,N)=>{if(!Number.isFinite(h)||!Number.isFinite(N)||N<=1)return;const w=lt(h,0,100),C=r-i,R=C===0?.5:Fi((w-i)/C),P=C/N,T=w-R*P,B=T+P;v(T,B,{anchor:{center:w,ratio:R}})},zoomOut:(h,N)=>{if(!Number.isFinite(h)||!Number.isFinite(N)||N<=1)return;const w=lt(h,0,100),C=r-i,R=C===0?.5:Fi((w-i)/C),P=C*N,T=w-R*P,B=T+P;v(T,B,{anchor:{center:w,ratio:R}})},pan:h=>{Number.isFinite(h)&&v(i+h,r+h)},onChange:h=>(o.add(h),()=>{o.delete(h)})}}const Or=20,Nc=.01,Mc=.2,dn=4,$r=new WeakMap;function Sc(e,t,n){return e>=n.left&&e<=n.right&&t>=n.top&&t<=n.bottom}const Ni=e=>Math.min(1,Math.max(0,e)),Ic=e=>{const t=e.trim().match(/^(\d+(?:\.\d+)?)%$/);if(!t)return null;const n=Number(t[1])/100;return Number.isFinite(n)?n:null},Cc=e=>{if(typeof e!="string")return"";const t=e.trim();return t.length>0?t:""},Mi=e=>Array.isArray(e),hn=e=>Mi(e)?{x:e[0],y:e[1]}:{x:e.x,y:e.y},kr=e=>{if(Mi(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},Tc=e=>Mi(e)?e:[e.x,e.y,e.size],Pc=(e,t)=>{try{const n=e(t);return typeof n=="number"&&Number.isFinite(n)?n:null}catch{return null}},pn=(e,t)=>{const n=kr(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):dn;if(typeof i=="function"){const r=Pc(i,Tc(t));return r==null?dn:Math.max(0,r)}return dn},Rc=e=>{const t=$r.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):dn;let o=0,c=!1;for(let l=0;l<n.length;l++){const u=kr(n[l]);if(u==null)c=!0;else{const m=Math.max(0,u);m>o&&(o=m)}}r=c?Math.max(o,s):o}else for(let s=0;s<n.length;s++){const o=pn(e,n[s]);o>r&&(r=o)}return r=Number.isFinite(r)?Math.max(0,r):dn,$r.set(e,r),r};function Ac(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=Cc(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 Bc(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}=hn(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 Ec(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}=hn(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 Dc=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 Vr(e,t){const n=Ac(e),i=n.clusterCount,r=Bc(e),s=Ec(e,t,r),o=Dc(e),c=Ni(o.barGap??Nc),l=Ni(o.barCategoryGap??Mc),u=Math.max(0,s*(1-l)),m=i+Math.max(0,i-1)*c,f=m>0?u/m:0;let a=0;const v=o.barWidth;if(typeof v=="number")a=Math.max(0,v),a=Math.min(a,f);else if(typeof v=="string"){const p=Ic(v);a=p==null?0:f*Ni(p)}a>0||(a=f);const M=a*c,I=i*a+Math.max(0,i-1)*M;return{categoryStep:r,categoryWidthPx:s,barWidthPx:a,gapPx:M,clusterWidthPx:I,clusterSlots:n}}const Si=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}=hn(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}=hn(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 Lc(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=Si(e):s<=0&&0<=o?c=0:s>0?c=s:o<0?c=o:c=Si(e);let l=t.scale(c);return Number.isFinite(l)||(c=Si(e),l=t.scale(c)),Number.isFinite(l)||(c=0,l=t.scale(0)),{baselineDomain:c,baselinePx:l}}function _c(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 Gc=(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},Wc=(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 Ii(e,t,n,i,r,s=Or){var I;if(!Number.isFinite(t)||!Number.isFinite(n))return null;const o=Number.isFinite(s)?Math.max(0,s):Or,c=o*o,l=i.invert(t);if(!Number.isFinite(l))return null;let u=-1,m=-1,f=null,a=Number.POSITIVE_INFINITY;const v=[],M=[];for(let p=0;p<e.length;p++){const F=e[p];(F==null?void 0:F.type)==="bar"&&(v.push(F),M.push(p))}if(v.length>0){const p=Vr(v,i);if(p.barWidthPx>0&&p.clusterWidthPx>=0){const F=Uc(v,r),{baselineDomain:b,baselinePx:x}=Lc(v,r,F),{clusterSlots:y,barWidthPx:d,gapPx:h,clusterWidthPx:N,categoryWidthPx:w,categoryStep:C}=p,R=new Map;let P=null;for(let T=0;T<v.length;T++){const B=v[T],U=M[T]??-1;if(U<0)continue;const _=B.data,D=y.clusterIndexBySeries[T]??0,G=y.stackIdBySeries[T]??"";for(let X=0;X<_.length;X++){const{x:Z,y:V}=hn(_[X]);if(!Number.isFinite(Z)||!Number.isFinite(V))continue;const re=i.scale(Z);if(!Number.isFinite(re))continue;const le=re-N/2+D*(d+h),Y=le+d;let ne=b,Se=V;if(G!==""){let we=R.get(G);we||(we=new Map,R.set(G,we));const ue=_c(re,w,Z,C);let se=we.get(ue);se||(se={posSum:b,negSum:b},we.set(ue,se)),V>=0?(ne=se.posSum,Se=ne+V,se.posSum=Se):(ne=se.negSum,Se=ne+V,se.negSum=Se)}else ne=b,Se=V;const Ie=G!==""?r.scale(ne):x,fe=r.scale(Se);if(!Number.isFinite(Ie)||!Number.isFinite(fe))continue;const oe={left:le,right:Y,top:Math.min(Ie,fe),bottom:Math.max(Ie,fe)};if(!Sc(t,n,oe))continue;(P===null||oe.top<P.top||oe.top===P.top&&U>P.seriesIndex)&&(P={seriesIndex:U,dataIndex:X,top:oe.top})}}if(P){const T=(I=e[P.seriesIndex])==null?void 0:I.data[P.dataIndex];if(T)return{seriesIndex:P.seriesIndex,dataIndex:P.dataIndex,point:T,distance:0}}}}for(let p=0;p<e.length;p++){const F=e[p];if(F.type==="pie"||F.type==="candlestick")continue;const b=F.data,x=b.length;if(x===0)continue;const y=F.type==="scatter",d=y?F:null,h=d?Rc(d):0,N=y?(o+h)*(o+h):c,w=b[0];if(Array.isArray(w)){const R=b,P=Gc(R,l);let T=P-1,B=P;for(;T>=0||B<x;){const U=Math.min(a,N);let _=Number.POSITIVE_INFINITY;if(T>=0){const G=R[T][0];if(Number.isFinite(G)){const X=i.scale(G);if(Number.isFinite(X)){const Z=X-t;_=Z*Z}}}let D=Number.POSITIVE_INFINITY;if(B<x){const G=R[B][0];if(Number.isFinite(G)){const X=i.scale(G);if(Number.isFinite(X)){const Z=X-t;D=Z*Z}}}if(_>U&&D>U)break;if(_<=D&&_<=U&&T>=0){const G=R[T][1];if(Number.isFinite(G)){const X=r.scale(G);if(Number.isFinite(X)){const Z=X-n,V=_+Z*Z,re=b[T],le=d?(()=>{const Y=pn(d,re),ne=o+Y;return ne*ne})():c;V<=le&&(V<a||V===a&&(f===null||p<u||p===u&&T<m))&&(a=V,u=p,m=T,f=re)}}T--}else _<=D&&T--;if(D<=_&&D<=U&&B<x){const G=R[B][1];if(Number.isFinite(G)){const X=r.scale(G);if(Number.isFinite(X)){const Z=X-n,V=D+Z*Z,re=b[B],le=d?(()=>{const Y=pn(d,re),ne=o+Y;return ne*ne})():c;V<=le&&(V<a||V===a&&(f===null||p<u||p===u&&B<m))&&(a=V,u=p,m=B,f=re)}}B++}else D<_&&B++}}else{const R=b,P=Wc(R,l);let T=P-1,B=P;for(;T>=0||B<x;){const U=Math.min(a,N);let _=Number.POSITIVE_INFINITY;if(T>=0){const G=R[T].x;if(Number.isFinite(G)){const X=i.scale(G);if(Number.isFinite(X)){const Z=X-t;_=Z*Z}}}let D=Number.POSITIVE_INFINITY;if(B<x){const G=R[B].x;if(Number.isFinite(G)){const X=i.scale(G);if(Number.isFinite(X)){const Z=X-t;D=Z*Z}}}if(_>U&&D>U)break;if(_<=D&&_<=U&&T>=0){const G=R[T].y;if(Number.isFinite(G)){const X=r.scale(G);if(Number.isFinite(X)){const Z=X-n,V=_+Z*Z,re=b[T],le=d?(()=>{const Y=pn(d,re),ne=o+Y;return ne*ne})():c;V<=le&&(V<a||V===a&&(f===null||p<u||p===u&&T<m))&&(a=V,u=p,m=T,f=re)}}T--}else _<=D&&T--;if(D<=_&&D<=U&&B<x){const G=R[B].y;if(Number.isFinite(G)){const X=r.scale(G);if(Number.isFinite(X)){const Z=X-n,V=D+Z*Z,re=b[B],le=d?(()=>{const Y=pn(d,re),ne=o+Y;return ne*ne})():c;V<=le&&(V<a||V===a&&(f===null||p<u||p===u&&B<m))&&(a=V,u=p,m=B,f=re)}}B++}else D<_&&B++}}}return f===null||!Number.isFinite(a)?null:{seriesIndex:u,dataIndex:m,point:f,distance:Math.sqrt(a)}}const Ci=new WeakMap,zr=(e,t)=>{if(Ci.has(e))return Ci.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 Ci.set(e,n),n},Oc=(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=Vr(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,m=i.clusterSlots.clusterIndexBySeries[l]??0;c.set(u,m)}return{barWidth:r,gap:s,clusterWidth:o,clusterIndexByGlobalSeriesIndex:c}},Xr=(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},Hr=(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 Yr(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=Oc(e,n);for(let u=0;u<e.length;u++){const m=e[u];if(m.type==="pie"||m.type==="candlestick")continue;const f=m.data,a=f.length;if(a===0)continue;const v=f[0],M=Array.isArray(v);if(m.type==="bar"&&l){const x=l.clusterIndexByGlobalSeriesIndex.get(u);if(x!==void 0){const{barWidth:y,gap:d,clusterWidth:h}=l,N=-h/2+x*(y+d),w=0;if(Number.isFinite(y)&&y>0&&Number.isFinite(N)){let C=-1;const R=P=>{if(!Number.isFinite(P))return!1;const T=P+N,B=T+y;return t>=T-w&&t<B+w};if(zr(f,M))if(M){const P=f;for(let T=0;T<a;T++){const B=P[T][0];if(!Number.isFinite(B))continue;const U=n.scale(B);R(U)&&(C=C<0?T:Math.min(C,T))}}else{const P=f;for(let T=0;T<a;T++){const B=P[T].x;if(!Number.isFinite(B))continue;const U=n.scale(B);R(U)&&(C=C<0?T:Math.min(C,T))}}else{const P=n.invert(t-N);if(Number.isFinite(P)){const T=M?Xr(f,P):Hr(f,P),B=U=>{if(U<0||U>=a)return null;const _=M?f[U][0]:f[U].x;if(!Number.isFinite(_))return null;const D=n.scale(_);return Number.isFinite(D)?D:null};for(let U=T-1;U>=0;U--){const _=B(U);if(_===null)continue;const D=_+N,G=D+y;if(G+w<=t)break;t>=D-w&&t<G+w&&(C=C<0?U:Math.min(C,U))}for(let U=T;U<a;U++){const _=B(U);if(_===null)continue;const D=_+N;if(D-w>t)break;const G=D+y;t<G+w&&(C=C<0?U:Math.min(C,U))}}}if(C>=0){c.push({seriesIndex:u,dataIndex:C,point:f[C]});continue}}}}let I=-1,p=null,F=s;const b=(x,y)=>{!Number.isFinite(y)||!(y<F||y===F&&(I<0||x<I))||(F=y,I=x,p=f[x])};if(zr(f,M))if(M){const x=f;for(let y=0;y<a;y++){const d=x[y][0];if(!Number.isFinite(d))continue;const h=n.scale(d);if(!Number.isFinite(h))continue;const N=h-t;b(y,N*N)}}else{const x=f;for(let y=0;y<a;y++){const d=x[y].x;if(!Number.isFinite(d))continue;const h=n.scale(d);if(!Number.isFinite(h))continue;const N=h-t;b(y,N*N)}}else if(M){const x=f,y=Xr(x,o);let d=y-1,h=y;const N=w=>{const C=x[w][0];if(!Number.isFinite(C))return null;const R=n.scale(C);if(!Number.isFinite(R))return null;const P=R-t;return P*P};for(;d>=0||h<a;){for(;d>=0&&N(d)===null;)d--;for(;h<a&&N(h)===null;)h++;if(d<0&&h>=a)break;const w=d>=0?N(d)??Number.POSITIVE_INFINITY:Number.POSITIVE_INFINITY,C=h<a?N(h)??Number.POSITIVE_INFINITY:Number.POSITIVE_INFINITY;if(w>F&&C>F)break;w<=C?(d>=0&&w<=F&&b(d,w),d--,h<a&&C<=F&&C===w&&(b(h,C),h++)):(h<a&&C<=F&&b(h,C),h++)}}else{const x=f,y=Hr(x,o);let d=y-1,h=y;const N=w=>{const C=x[w].x;if(!Number.isFinite(C))return null;const R=n.scale(C);if(!Number.isFinite(R))return null;const P=R-t;return P*P};for(;d>=0||h<a;){for(;d>=0&&N(d)===null;)d--;for(;h<a&&N(h)===null;)h++;if(d<0&&h>=a)break;const w=d>=0?N(d)??Number.POSITIVE_INFINITY:Number.POSITIVE_INFINITY,C=h<a?N(h)??Number.POSITIVE_INFINITY:Number.POSITIVE_INFINITY;if(w>F&&C>F)break;w<=C?(d>=0&&w<=F&&b(d,w),d--,h<a&&C<=F&&C===w&&(b(h,C),h++)):(h<a&&C<=F&&b(h,C),h++)}}p!==null&&c.push({seriesIndex:u,dataIndex:I,point:p})}return c}const $c=e=>Math.min(1,Math.max(0,e)),kc=e=>{const t=e.trim().match(/^(\d+(?:\.\d+)?)%$/);if(!t)return null;const n=Number(t[1])/100;return Number.isFinite(n)?n:null},Ti=e=>Array.isArray(e),Yt=e=>Ti(e)?e[0]:e.timestamp,Vc=e=>Ti(e)?e[1]:e.open,zc=e=>Ti(e)?e[2]:e.close,qr=new WeakMap,Xc=e=>{const t=qr.get(e);if(t!==void 0)return t;const n=[];for(let s=0;s<e.length;s++){const o=Yt(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 qr.set(e,r),r};function Hc(e,t,n,i){if(t.length===0)return 0;const r=Xc(t);let s=0;if(Number.isFinite(r)&&r>0){let f=null;for(let a=0;a<t.length;a++){const v=Yt(t[a]);if(Number.isFinite(v)){f=v;break}}if(f!=null){const a=n.scale(f),v=n.scale(f+r),M=Math.abs(v-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=kc(c);o=f==null?0:s*$c(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,m=Math.max(l,u);return o=Math.min(Math.max(o,l),m),Number.isFinite(o)?o:0}const On=new WeakMap,Yc=e=>{const t=On.get(e);if(t!==void 0)return t;let n=Number.NEGATIVE_INFINITY;for(let i=0;i<e.length;i++){const r=Yt(e[i]);if(!Number.isFinite(r)||r<n)return On.set(e,!1),!1;n=r}return On.set(e,!0),!0},qc=(e,t)=>{let n=0,i=e.length;for(;n<i;){const r=n+i>>>1;Yt(e[r])<t?n=r+1:i=r}return n};function Zc(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 m=(a,v,M,I)=>{if(Number.isFinite(I)){if(I<u){u=I,l={seriesIndex:a,dataIndex:v,point:M};return}I===u&&l&&(v<l.dataIndex?l={seriesIndex:a,dataIndex:v,point:M}:v===l.dataIndex&&a<l.seriesIndex&&(l={seriesIndex:a,dataIndex:v,point:M}))}},f=a=>{const v=Vc(a),M=zc(a);if(!Number.isFinite(v)||!Number.isFinite(M))return!1;const I=r.scale(v),p=r.scale(M);if(!Number.isFinite(I)||!Number.isFinite(p))return!1;const F=Math.min(I,p),b=Math.max(I,p);return n>=F&&n<=b};for(let a=0;a<e.length;a++){const M=e[a].data,I=M.length;if(I===0)continue;if(!Yc(M)){for(let b=0;b<I;b++){const x=M[b],y=Yt(x);if(!Number.isFinite(y))continue;const d=i.scale(y);if(!Number.isFinite(d))continue;const h=Math.abs(t-d);h>c||f(x)&&m(a,b,x,h)}continue}const F=qc(M,o);for(let b=F-1;b>=0;b--){const x=M[b],y=Yt(x),d=i.scale(y);if(!Number.isFinite(d))continue;if(d<t-c)break;const h=Math.abs(t-d);h>c||f(x)&&m(a,b,x,h)}for(let b=F;b<I;b++){const x=M[b],y=Yt(x),d=i.scale(y);if(!Number.isFinite(d))continue;if(d>t+c)break;const h=Math.abs(t-d);h>c||f(x)&&m(a,b,x,h)}}return l}const qt=Math.PI*2,Pi=e=>{if(!Number.isFinite(e))return 0;const t=e%qt;return t<0?t+qt:t};function jc(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 m=Pi(Math.atan2(l,c)),f=n.series,a=f.data;let v=0,M=0;for(let y=0;y<a.length;y++){const d=(x=a[y])==null?void 0:x.value;typeof d=="number"&&Number.isFinite(d)&&d>0&&(v+=d,M++)}if(!(v>0)||M===0)return null;const I=typeof f.startAngle=="number"&&Number.isFinite(f.startAngle)?f.startAngle:90;let p=Pi(I*Math.PI/180),F=0,b=0;for(let y=0;y<a.length;y++){const d=a[y],h=d==null?void 0:d.value;if(typeof h!="number"||!Number.isFinite(h)||h<=0)continue;b++;const N=b===M;let C=h/v*qt;if(N?C=Math.max(0,qt-F):C=Math.max(0,Math.min(qt,C)),F+=C,!(C>0))continue;const R=p,P=Pi(p+C);p=P;let T=P-R;T<0&&(T+=qt);let B=m-R;if(B<0&&(B+=qt),B<=T)return{seriesIndex:n.seriesIndex,dataIndex:y,slice:d}}return null}const $n=(e,t)=>{if(!Number.isFinite(t))throw new Error(`${e} must be a finite number. Received: ${String(t)}`)};function kn(){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 Kc=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 Jc(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:(v,M,I,p)=>{if(u)return document.createElement("span");const F=document.createElement("span");F.textContent=v,F.style.position="absolute",F.style.left=`${M}px`,F.style.top=`${I}px`,F.style.pointerEvents="none",F.style.userSelect="none",F.style.whiteSpace="nowrap",F.style.lineHeight="1",(p==null?void 0:p.fontSize)!=null&&(F.style.fontSize=`${p.fontSize}px`),(p==null?void 0:p.color)!=null&&(F.style.color=p.color);const b=(p==null?void 0:p.rotation)??0,x=(p==null?void 0:p.anchor)??"start",{translateX:y,originX:d}=Kc(x);return F.style.transformOrigin=`${d} 50%`,F.style.transform=`translateX(${y}) translateY(-50%) rotate(${b}deg)`,l.appendChild(F),F},dispose:()=>{if(!u){u=!0;try{l.remove()}finally{o!==null&&(e.style.position=o),c!==null&&(e.style.overflow=c)}}}}}function Qc(e){return Math.max(e+1,Math.round(e*1.15))}function Vn(e,t,n){e.dir="auto",e.style.fontFamily=n.fontFamily,t.isTitle&&(e.style.fontWeight="600")}const el=(e,t)=>{var i;const n=(i=e.name)==null?void 0:i.trim();return n||`Series ${t+1}`},tl=(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"},nl=(e,t)=>{const n=e==null?void 0:e.trim();return n||`Slice ${t+1}`},il=(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 rl(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 v=[];for(let M=0;M<f.length;M++){const I=f[M];if(I.type==="pie")for(let p=0;p<I.data.length;p++){const F=I.data[p],b=document.createElement("div");b.style.display="flex",b.style.alignItems="center",b.style.gap="6px",b.style.lineHeight="1.1",b.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=il(F==null?void 0:F.color,M,p,a),x.style.border=`1px solid ${a.axisLineColor}`;const y=document.createElement("span");y.textContent=nl(F==null?void 0:F.name,p),b.appendChild(x),b.appendChild(y),v.push(b)}else{const p=document.createElement("div");p.style.display="flex",p.style.alignItems="center",p.style.gap="6px",p.style.lineHeight="1.1",p.style.whiteSpace="nowrap";const F=document.createElement("div");F.style.width="10px",F.style.height="10px",F.style.borderRadius="2px",F.style.flex="0 0 auto",F.style.background=tl(I,M,a),F.style.border=`1px solid ${a.axisLineColor}`;const b=document.createElement("span");b.textContent=el(I,M),p.appendChild(F),p.appendChild(b),v.push(p)}}o.replaceChildren(...v)},dispose:()=>{if(!l){l=!0;try{s.remove()}finally{r!==null&&(e.style.position=r)}}}}}const Zr=(e,t,n)=>n<t||e<t?t:e>n?n:e;function jr(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 m=()=>{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 p=r.style.visibility;r.style.visibility="hidden";const F=r.offsetWidth,b=r.offsetHeight;return r.style.visibility=p,{width:F,height:b}};return{show:(p,F,b)=>{if(o)return;c+=1,m();const x=f();r.innerHTML=b;const y=12,d=12,h=8;r.style.display="block",r.style.visibility="hidden";const{width:N,height:w}=a(),C=e.clientWidth,R=e.clientHeight;let P=p+y,T=F+d;if(P+N>C-h&&(P=p-y-N),T+w>R-h&&(T=F-d-w),P=Zr(P,h,C-h-N),T=Zr(T,h,R-h-w),r.style.left=`${P}px`,r.style.top=`${T}px`,r.style.visibility="visible",x){r.style.opacity="0";const B=c;u=window.requestAnimationFrame(()=>{u=null,!o&&B===c&&(r.style.opacity="1")})}else r.style.opacity="1"},hide:()=>{if(o)return;if(c+=1,m(),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 p=c;l=window.setTimeout(()=>{l=null,!o&&p===c&&(r.style.visibility="hidden",r.style.display="none")},s+50)},dispose:()=>{if(!o){o=!0;try{m(),r.remove()}finally{i!==null&&(e.style.position=i)}}}}}const zn="—";function xt(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}function Zt(e){if(!Number.isFinite(e))return zn;const i=(Object.is(e,-0)?0:e).toFixed(2).replace(/\.?0+$/,"");return i==="-0"?"0":i}function Kr(e){const t=e.seriesName.trim();return t.length>0?t:`Series ${e.seriesIndex+1}`}function Jr(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 Qr(e){return e.length===5}function sl(e,t){if(!Number.isFinite(e)||!Number.isFinite(t)||e===0)return zn;const n=(t-e)/e*100;return Number.isFinite(n)?`${n>0?"+":""}${n.toFixed(2)}%`:zn}function es(e,t){const n=xt(Kr(e)),i=xt(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:${xt(Jr(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 ts(e){const[,t,n,i,r]=e.value,s=xt(Kr(e)),o=xt(Jr(e.color)),c=Zt(t),l=Zt(r),u=Zt(i),m=Zt(n),f=n>t,a=f?"▲":"▼",v=f?"#22c55e":"#ef4444",M=sl(t,n),I=`O: ${c} H: ${l} L: ${u} C: ${m}`,p=xt(I),F=xt(a),b=xt(M),x=xt(v);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;">${p}</div>`,'<div style="display:flex;align-items:center;gap:6px;font-variant-numeric:tabular-nums;">',`<span style="color:${x};font-weight:700;">${F}</span>`,`<span style="color:${x};font-weight:600;">${b}</span>`,"</div>","</div>"].join("")}function ol(e){return ts(e)}function bn(e){return Qr(e.value)?ol(e):es(e,Zt(e.value[1]))}function Ri(e){if(e.length===0)return"";const t=`x: ${Zt(e[0].value[0])}`,n=`<div style="margin:0 0 6px 0;font-weight:600;font-variant-numeric:tabular-nums;white-space:nowrap;">${xt(t)}</div>`,i=e.map(r=>Qr(r.value)?ts(r):es(r,Zt(r.value[1]))).join('<div style="height:4px;"></div>');return`${n}${i}`}const al=e=>Number.isFinite(e)?e:0,cl=e=>Number.isFinite(e)?e:null;function ns(){const e=new Map;function t(s,o,c,l,u,m){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:m,startTime:null,out:a}),f}return e.set(f,{kind:"scalar",from:s,to:o,duration:c,easing:l,onUpdate:u,onComplete:m,startTime:null}),f}function n(s){e.delete(s)}function i(){e.clear()}function r(s){var l;const o=cl(s);if(o===null)return;const c=Array.from(e.keys());for(const u of c){const m=e.get(u);if(!m)continue;const f=m.startTime??o;m.startTime===null&&e.set(u,{...m,startTime:f});const a=al(m.duration),v=Math.max(0,o-f),M=a<=0||v>=a,I=a<=0?1:v/a,p=M?1:m.easing(I);if(m.kind==="scalar"){const F=m.from+(m.to-m.from)*p;if(m.onUpdate(F),!e.has(u))continue}else{const F=m.out.length;for(let b=0;b<F;b++){const x=m.from[b]??0,y=m.to[b]??0;m.out[b]=x+(y-x)*p}if(m.onUpdate(m.out),!e.has(u))continue}M&&((l=m.onComplete)==null||l.call(m),e.delete(u))}}return{animate:t,cancel:n,cancelAll:i,update:r}}const Xn=e=>Number.isNaN(e)||e<=0?0:e>=1?1:e;function is(e){return Xn(e)}function ll(e){const n=1-Xn(e);return 1-n*n*n}function ul(e){const t=Xn(e);if(t<.5)return 4*t*t*t;const n=-2*t+2;return 1-n*n*n/2}function fl(e){const t=Xn(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 ml(e){switch(e){case"linear":return is;case"cubicOut":return ll;case"cubicInOut":return ul;case"bounceOut":return fl;default:return is}}const Ye=Ki;function rs(e,t=1){return e?Ye(e)?e.clientWidth:e.width/t:0}function dl(e,t=1){return e?Ye(e)?e.clientHeight:e.height/t:0}const hl="bgra8unorm",gn=5,ss=6,Ai=4,pl=1,bl=4,Hn=24*60*60*1e3,gl=30*Hn,yl=365*Hn,xl=9,Bi=1,vl=6,Yn=e=>typeof e=="number"&&Number.isFinite(e)?e:null,vt=e=>typeof e=="number"&&Number.isFinite(e)?e:void 0,wl=2e4,Ei=e=>{throw new Error(`RenderCoordinator: unreachable value: ${String(e)}`)},qn=e=>Array.isArray(e),wt=e=>qn(e)?{x:e[0],y:e[1]}:{x:e.x,y:e.y},Di=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}=wt(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})},Fl=(e,t)=>{if(t.length===0)return e;let n=e;if(!n){const c=Di(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}=wt(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}},Nl=(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=ut(c)?c[0]:c.timestamp,u=ut(c)?c[3]:c.low,m=ut(c)?c[4]:c.high;!Number.isFinite(l)||!Number.isFinite(u)||!Number.isFinite(m)||(l<n&&(n=l),l>i&&(i=l),u<r&&(r=u),m>s&&(s=m))}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})},os=(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 v=f[a];if(ut(v)){const M=v[0],I=v[3],p=v[4];if(!Number.isFinite(M)||!Number.isFinite(I)||!Number.isFinite(p))continue;const F=Math.min(I,p),b=Math.max(I,p);M<n&&(n=M),M>i&&(i=M),F<r&&(r=F),b>s&&(s=b)}else{const M=v.timestamp,I=v.low,p=v.high;if(!Number.isFinite(M)||!Number.isFinite(I)||!Number.isFinite(p))continue;const F=Math.min(I,p),b=Math.max(I,p);M<n&&(n=M),M>i&&(i=M),F<r&&(r=F),b>s&&(s=b)}}continue}const m=c.data;for(let f=0;f<m.length;f++){const{x:a,y:v}=wt(m[f]);!Number.isFinite(a)||!Number.isFinite(v)||(a<n&&(n=a),a>i&&(i=a),v<r&&(r=v),v>s&&(s=v))}}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}},as=(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,m=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,v=Math.max(0,u),M=Math.max(0,m),I=Math.max(0,f),p=Math.max(0,a);return{left:v,right:M,top:I,bottom:p,canvasWidth:c,canvasHeight:l,devicePixelRatio:r}},Ml=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})`},cs=(e,t)=>{const n=Ke(e);if(!n)return e;const i=Math.max(0,Math.min(1,n[3]*t));return Ml([n[0],n[1],n[2],i])},Sl=(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)},Il=e=>{const{left:t,right:n,top:i,bottom:r,canvasWidth:s,canvasHeight:o,devicePixelRatio:c}=e,l=t*c,u=s-n*c,m=i*c,f=o-r*c,a=l/s*2-1,v=u/s*2-1,M=1-m/o*2,I=1-f/o*2;return{left:a,right:v,top:M,bottom:I}},Ft=e=>Math.min(1,Math.max(0,e)),Nt=(e,t,n)=>Math.min(n,Math.max(t,e|0)),jn=(e,t,n)=>e+(t-e)*Ft(n),Kn=(e,t,n)=>Zn(jn(e.min,t.min,n),jn(e.max,t.max,n)),ls=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=Nt(Math.floor(r),0,Math.max(0,t)),u=Nt(Math.floor(o),0,Math.max(0,n)),m=Nt(Math.ceil(s),0,Math.max(0,t)),f=Nt(Math.ceil(c),0,Math.max(0,n)),a=Math.max(0,m-l),v=Math.max(0,f-u);return{x:l,y:u,w:a,h:v}},Jn=(e,t)=>(e+1)/2*t,Ui=(e,t)=>(1-e)/2*t,Cl=e=>Array.isArray(e),us=e=>e.length>0&&Cl(e[0]),jt=new WeakMap,fs=(e,t)=>{const n=jt.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 jt.set(e,!1),!1;i=c}return jt.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 jt.set(e,!1),!1;i=o}return jt.set(e,!0),!0},ms=(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},ds=(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},hs=(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},ps=(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},Qn=(e,t,n)=>{const i=e.length;if(i===0||!Number.isFinite(t)||!Number.isFinite(n))return e;const r=us(e);if(fs(e,r)){const c=r?ms(e,t):hs(e,t),l=r?ds(e,n):ps(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}=wt(l);Number.isFinite(u)&&u>=t&&u<=n&&o.push(l)}return o},Tl=(e,t,n)=>{const i=e.length;if(i===0)return{start:0,end:0};if(!Number.isFinite(t)||!Number.isFinite(n))return{start:0,end:i};const r=us(e);if(!fs(e,r))return{start:0,end:i};const o=r?ms(e,t):hs(e,t),c=r?ds(e,n):ps(e,n);return c<=o?{start:0,end:0}:{start:o,end:c}};function ut(e){return Array.isArray(e)}const ei=new WeakMap,Pl=e=>{const t=ei.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=ut(r)?r[0]:r.timestamp;if(!Number.isFinite(s)||s<n)return ei.set(e,!1),!1;n=s}return ei.set(e,!0),!0},Rl=(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][0]<=t?n=r+1:i=r}return n},Bl=(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},El=(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},ti=(e,t,n)=>{const i=e.length;if(i===0||!Number.isFinite(t)||!Number.isFinite(n))return e;const r=Pl(e),s=i>0&&ut(e[0]);if(r){const c=s?Rl(e,t):Bl(e,t),l=s?Al(e,n):El(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=ut(l)?l[0]:l.timestamp;Number.isFinite(u)&&u>=t&&u<=n&&o.push(l)}return o},yn=(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},Dl=(e,t,n)=>{const i=(e==null?void 0:e[0])??"50%",r=(e==null?void 0:e[1])??"50%",s=yn(i,t),o=yn(r,n);return{x:Number.isFinite(s)?s:t*.5,y:Number.isFinite(o)?o:n*.5}},Ul=e=>Array.isArray(e),bs=(e,t)=>{if(e==null)return{inner:0,outer:t*.7};if(Ul(e)){const r=yn(e[0],t),s=yn(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=yn(e,t),i=Math.max(0,Number.isFinite(n)?n:t*.7);return{inner:0,outer:Math.min(t,i)}},Ll=6,_l=(e,t=Ll)=>{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))},gs=e=>{const t=_l(e);return new Intl.NumberFormat(void 0,{maximumFractionDigits:t})},ys=(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},ft=e=>String(Math.trunc(e)).padStart(2,"0"),Gl=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],xs=(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<Hn?`${ft(o)}:${ft(c)}`:t<=7*Hn?`${ft(r)}/${ft(s)} ${ft(o)}:${ft(c)}`:t<3*gl?`${ft(r)}/${ft(s)}`:t<=yl?`${Gl[n.getMonth()]??ft(r)} ${ft(s)}`:`${i}/${ft(r)}`},ni=(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},Wl=e=>{const{axisMin:t,axisMax:n,xScale:i,plotClipLeft:r,plotClipRight:s,canvasCssWidth:o,visibleRangeMs:c,measureCtx:l,measureCache:u,fontSize:m,fontFamily:f}=e,a=Yn(t)??i.invert(r),v=Yn(n)??i.invert(s);if(!l||o<=0)return{tickCount:gn,tickValues:ni(a,v,gn)};l.font=`${m}px ${f}`,u&&u.size>2e3&&u.clear();const M=u?`${m}px ${f}@@`:null;for(let I=xl;I>=Bi;I--){const p=ni(a,v,I);let F=Number.NEGATIVE_INFINITY,b=!0;for(let x=0;x<p.length;x++){const y=p[x],d=xs(y,c);if(d==null)continue;const h=(()=>{if(!M)return l.measureText(d).width;const T=M+d,B=u.get(T);if(B!=null)return B;const U=l.measureText(d).width;return u.set(T,U),U})(),N=i.scale(y),w=Jn(N,o),C=I===1?"middle":x===0?"start":x===p.length-1?"end":"middle",R=C==="start"?w:C==="end"?w-h:w-h*.5,P=C==="start"?w+h:C==="end"?w:w+h*.5;if(R<F+vl){b=!1;break}F=P}if(b)return{tickCount:I,tickValues:p}}return{tickCount:Bi,tickValues:ni(a,v,Bi)}},Kt=(e,t)=>{const n=os(e.series,t),i=vt(e.xAxis.min)??n.xMin,r=vt(e.xAxis.max)??n.xMax;return Zn(i,r)},Li=(e,t)=>{const n=os(e.series,t),i=vt(e.yAxis.min)??n.yMin,r=vt(e.yAxis.max)??n.yMax;return Zn(i,r)},Jt=(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}},vs=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:ml(t.easing)}},Ol=e=>vs(e),$l=e=>vs(e),_i=(e,t,n,i,r)=>{const s=e.point,o=ut(s)?s[0]:s.timestamp,c=ut(s)?s[1]:s.open,l=ut(s)?s[2]:s.close;if(!Number.isFinite(o)||!Number.isFinite(c)||!Number.isFinite(l))return null;const u=(c+l)/2,m=t.scale(o),f=n.scale(u);if(!Number.isFinite(m)||!Number.isFinite(f))return null;const a=i.left+m,v=i.top+f,M=Ye(r)?r.offsetLeft+a:a,I=Ye(r)?r.offsetTop+v:v;return!Number.isFinite(M)||!Number.isFinite(I)?null:{x:M,y:I}},ws=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}=wt(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},kl=(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)?ws(e):s<=0&&0<=o?0:s>0?s:o<0?o:ws(e)},Vl=(e,t,n,i)=>{const r=Ft(i);if(r>=1)return e;const s=kl(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 zl(e,t,n){var ks;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(g=>{var A;(A=n==null?void 0:n.onDeviceLost)==null||A.call(n,g.message||g.reason||"unknown")}).catch(()=>{});const r=e.preferredFormat??hl,s=(n==null?void 0:n.domOverlays)!==!1,o=s&&Ye(e.canvas)?e.canvas.parentElement:null,c=o?Jc(o):null,l=o?rl(o,"right"):null,u=(()=>{if(typeof document>"u")return null;try{return document.createElement("canvas").getContext("2d")}catch{return null}})(),m=u?new Map:null;let f=!1,a=t,v=t.series.length,M="pending",I=0;const p=ns();let F=null,b=!1;const x=ns();let y=null,d=1,h=null;const N={cartesianDataBySeriesIndex:[],pieDataBySeriesIndex:[]},w=()=>{N.cartesianDataBySeriesIndex.length=0,N.pieDataBySeriesIndex.length=0},C=(g,A,S,E)=>{if(g.length!==A.length)return null;const W=A.length;if(W===0)return E??[];const $=E&&E.length===W?E:(()=>{const q=new Array(W);for(let k=0;k<W;k++){const H=A[k],{x:J}=wt(H),j=qn(H)?H[2]:H==null?void 0:H.size;q[k]=qn(H)?j==null?[J,0]:[J,0,j]:j==null?{x:J,y:0}:{x:J,y:0,size:j}}return q})(),O=Ft(S);for(let q=0;q<W;q++){const k=wt(g[q]).y,H=wt(A[q]).y,J=Number.isFinite(k)&&Number.isFinite(H)?jn(k,H,O):H,j=$[q];qn(j)?j[1]=J:j.y=J}return $},R=(g,A,S,E)=>{var H,J;const W=g.data,$=A.data;if(W.length!==$.length)return A;const O=$.length,q=E&&E.length===O?E:(()=>{const j=new Array(O);for(let pe=0;pe<O;pe++)j[pe]={...$[pe],value:0};return j})(),k=Ft(S);for(let j=0;j<O;j++){const pe=(H=W[j])==null?void 0:H.value,me=(J=$[j])==null?void 0:J.value,Be=typeof pe=="number"&&typeof me=="number"&&Number.isFinite(pe)&&Number.isFinite(me)?Math.max(0,jn(pe,me,k)):typeof me=="number"&&Number.isFinite(me)?me:0;q[j].value=Be}return{...A,data:q}},P=(g,A,S,E)=>{if(g.length!==A.length)return A;const W=new Array(A.length);for(let $=0;$<A.length;$++){const O=g[$],q=A[$];if(O.type!==q.type){W[$]=q;continue}if(q.type==="pie"){const Be=(E==null?void 0:E.pieDataBySeriesIndex[$])??null,Xe=R(O,q,S,Be);E&&(E.pieDataBySeriesIndex[$]=Xe.data),W[$]=Xe;continue}const k=O,H=q,J=k.data,j=H.data;if(J.length!==j.length){W[$]=q;continue}if(j.length>wl){W[$]=q;continue}const pe=(E==null?void 0:E.cartesianDataBySeriesIndex[$])??null,me=C(J,j,S,pe);if(!me){W[$]=q;continue}E&&(E.cartesianDataBySeriesIndex[$]=me),W[$]={...q,data:me}}return W},T=(g,A,S)=>{const E=Kn(g.from.xBaseDomain,g.to.xBaseDomain,A),W=Jt(E,S),$=Kn(g.from.yBaseDomain,g.to.yBaseDomain,A),O=P(g.from.series,g.to.series,A,null);return{xBaseDomain:E,xVisibleDomain:{min:W.min,max:W.max},yBaseDomain:$,series:O}},B=new Set;let U=new Array(t.series.length).fill(null),_=new Array(t.series.length).fill(null),D=a.series,G=a.series,X=[],Z=!1,V=null,re=null,le=null,Y=!1;const ne=new Map;let Se=new Array(a.series.length).fill("unknown");const Ie=new Set;let fe=o&&((ks=a.tooltip)==null?void 0:ks.show)!==!1?jr(o):null,oe=null,ve=null,we=null;const ue=(g,A,S,E)=>{if(fe==null||fe.show(g,A,S),!s&&(n!=null&&n.onTooltipUpdate)){const W=Array.isArray(E)?E:[E];n.onTooltipUpdate({content:S,params:W,x:g,y:A})}},se=()=>{fe==null||fe.hide(),!s&&(n!=null&&n.onTooltipUpdate)&&n.onTooltipUpdate(null)},ye=()=>{oe=null,ve=null,we=null,se()},K=g=>{!s&&(n!=null&&n.onCrosshairMove)&&n.onCrosshairMove(g)},ee=g=>{!s&&(n!=null&&n.onHoverChange)&&n.onHoverChange(g)};((g,A)=>{if(l==null||l.update(g,A),!s&&(n!=null&&n.onLegendUpdate)){const S=g.map((E,W)=>({name:E.name??"",color:E.color??"#888",seriesIndex:W}));n.onLegendUpdate(S)}})(a.series,a.theme);let he=eo(i);const te=Ro(i,{targetFormat:r}),Re=ur(i,{targetFormat:r}),Ne=ur(i,{targetFormat:r}),Ae=ic(i,{targetFormat:r});Ae.setVisible(!1);const We=lc(i,{targetFormat:r});We.setVisible(!1);const qe=as(e,a),Le=s&&Ye(e.canvas)?mc(e.canvas,qe):null;let Me={source:"mouse",x:0,y:0,gridX:0,gridY:0,isInGrid:!1,hasPointer:!1},Oe=null,Ue;const et=new Set;let $e=null;const ot=(g,A)=>{const S=Array.from(et);for(const E of S)E(g,A)},ke=(g,A)=>{const S=g!==null&&Number.isFinite(g)?g:null;Oe===S&&Ue===A||(Oe=S,Ue=A,ot(Oe,Ue))},ze=()=>{var g;(g=n==null?void 0:n.onRequestRender)==null||g.call(n)},ht=g=>g?Number.isFinite(g.start)&&Number.isFinite(g.end)&&g.start<=0&&g.end>=100:!0,Ze=()=>{V!==null&&(cancelAnimationFrame(V),V=null),re!==null&&(clearTimeout(re),re=null),Z=!1},st=()=>{le!==null&&(clearTimeout(le),le=null)},Bt=()=>{var q;if(ne.size===0)return!1;Ie.clear();const g=(ie==null?void 0:ie.getRange())??null,A=ht(g),S=a.autoScroll===!0&&ie!=null&&a.xAxis.min==null&&a.xAxis.max==null,E=Kt(a,_),W=g?Jt(E,g):null;let $=!1;for(const[k,H]of ne){if(H.length===0)continue;const J=a.series[k];if(!(!J||J.type==="pie")){if($=!0,J.type==="candlestick"){let j=U[k];if(!j){const me=J.rawData??J.data;j=me.length===0?[]:me.slice(),U[k]=j,_[k]=J.rawBounds??null}const pe=H;j.push(...pe),_[k]=Nl(_[k],pe)}else{let j=U[k];if(!j){const me=J.rawData??J.data;j=me.length===0?[]:me.slice(),U[k]=j,_[k]=J.rawBounds??Di(j)}const pe=H;if(J.type==="line"&&J.sampling==="none"&&A&&Se[k]==="fullRawLine")try{he.appendSeries(k,pe),Ie.add(k)}catch{}j.push(...pe),_[k]=Fl(_[k],pe)}X[k]=null}}if(ne.clear(),!$)return!1;if(ie){const k=$i(),H=ie;(q=H.setSpanConstraints)==null||q.call(H,k.minSpan,k.maxSpan)}if(S&&g&&W){const k=g;if(k.end>=99.5){const H=k.end-k.start,J=ie;J.setRangeAnchored?J.setRangeAnchored(100-H,100,"end"):ie.setRange(100-H,100)}else{const H=Kt(a,_),J=H.max-H.min;if(Number.isFinite(J)&&J>0){const j=(W.min-H.min)/J*100,pe=(W.max-H.min)/J*100,me=Math.max(0,Math.min(100,j)),Be=Math.max(0,Math.min(100,pe));ie.setRange(me,Be)}}}ki();const O=(ie==null?void 0:ie.getRange())??null;return(O==null||ht(O))&&(G=D),!0},Et=g=>{if(f)return;const A=(g==null?void 0:g.requestRenderAfter)??!0,S=Bt(),E=(ie==null?void 0:ie.getRange())??null,W=ht(E),$=E!=null&&!W;let O=!1;Y?(Y=!1,st(),!E||W?G=D:ci(),O=!0):S&&$&&(Y=!1,st(),ci(),O=!0),(S||O)&&A&&ze()},Wt=g=>{f||Z||(V!==null&&(cancelAnimationFrame(V),V=null),re!==null&&(clearTimeout(re),re=null),Z=!0,V=requestAnimationFrame(()=>{if(V=null,f){Ze();return}re!==null&&(clearTimeout(re),re=null),Z=!1,Et()}),re=(typeof self<"u"?self:window).setTimeout(()=>{if(f){Ze();return}Z&&(V!==null&&(cancelAnimationFrame(V),V=null),Z=!1,re=null,Et())},16))},vn=()=>{f||(st(),Y=!1,le=(typeof self<"u"?self:window).setTimeout(()=>{le=null,!f&&(Y=!0,Wt())},100))},cn=(g,A)=>{let S,E;if(Ye(g)){const O=g.getBoundingClientRect();if(!(O.width>0)||!(O.height>0))return null;S=O.width,E=O.height}else{const O=e.devicePixelRatio??1;if(console.log("[getPlotSizeCssPx] OffscreenCanvas dimensions:",{canvasWidth:g.width,canvasHeight:g.height,dpr:O,calculatedCssWidth:g.width/O,calculatedCssHeight:g.height/O}),S=g.width/O,E=g.height/O,!(S>0)||!(E>0))return null}const W=S-A.left-A.right,$=E-A.top-A.bottom;return!(W>0)||!($>0)?null:{plotWidthCss:W,plotHeightCss:$}},mu=(g,A)=>{const S=e.canvas;if(!S)return null;const E=cn(S,g);if(!E)return null;const W=kn().domain(A.xDomain.min,A.xDomain.max).range(0,E.plotWidthCss),$=kn().domain(A.yDomain.min,A.yDomain.max).range(E.plotHeightCss,0),O={xScale:W,yScale:$,plotWidthCss:E.plotWidthCss,plotHeightCss:E.plotHeightCss};return console.log("[computeInteractionScalesGridCssPx] Computed interaction scales:",{canvasType:Ye(S)?"HTMLCanvasElement":"OffscreenCanvas",plotWidthCss:O.plotWidthCss,plotHeightCss:O.plotHeightCss,xDomain:A.xDomain,yDomain:A.yDomain,xRange:[0,E.plotWidthCss],yRange:[E.plotHeightCss,0]}),O},oi=(g,A,S)=>{const E=a.series[g],{x:W,y:$}=wt(S);return{seriesName:(E==null?void 0:E.name)??"",seriesIndex:g,dataIndex:A,value:[W,$],color:(E==null?void 0:E.color)??"#888"}},du=(g,A,S)=>{const E=a.series[g];return ut(S)?{seriesName:(E==null?void 0:E.name)??"",seriesIndex:g,dataIndex:A,value:[S[0],S[1],S[2],S[3],S[4]],color:(E==null?void 0:E.color)??"#888"}:{seriesName:(E==null?void 0:E.name)??"",seriesIndex:g,dataIndex:A,value:[S.timestamp,S.open,S.close,S.low,S.high],color:(E==null?void 0:E.color)??"#888"}},Wi=(g,A,S,E,W)=>{const $=.5*Math.min(E,W);if(!($>0))return null;for(let O=a.series.length-1;O>=0;O--){const q=g[O];if(q.type!=="pie")continue;const k=q,H=Dl(k.center,E,W),J=bs(k.radius,$),j=jc(A,S,{seriesIndex:O,series:k},H,J);if(j)return j}return null},Oi=(g,A,S,E)=>{for(let W=g.length-1;W>=0;W--){const $=g[W];if($.type!=="candlestick")continue;const O=$,q=Hc(O,O.data,E.xScale,E.plotWidthCss),k=Zc([O],A,S,E.xScale,E.yScale,q);if(!k)continue;return{params:du(W,k.dataIndex,k.point),match:{point:k.point},seriesIndex:W}}return null},hu=g=>{if(Me={source:"mouse",x:g.x,y:g.y,gridX:g.gridX,gridY:g.gridY,isInGrid:g.isInGrid,hasPointer:!0},g.isInGrid&&$e){const A=$e.xScale.invert(g.gridX);ke(Number.isFinite(A)?A:null,"mouse")}else g.isInGrid||ke(null,"mouse");Ae.setVisible(g.isInGrid),K(g.isInGrid?g.x:null),ee(g.isInGrid?g:null),ze()},pu=g=>{Me.source==="mouse"&&(Me={...Me,isInGrid:!1,hasPointer:!1},Ae.setVisible(!1),ye(),K(null),ee(null),ke(null,"mouse"),ze())};Le&&(Le.on("mousemove",hu),Le.on("mouseleave",pu));let ie=null,Je=null,Dt=null,Qt=null;const ai=new Set,bu=g=>{const A=Array.from(ai);for(const S of A)S(g)},gu=g=>{var O,q;const A=(O=g.dataZoom)==null?void 0:O.find(k=>(k==null?void 0:k.type)==="inside"),S=(q=g.dataZoom)==null?void 0:q.find(k=>(k==null?void 0:k.type)==="slider"),E=A??S;if(!E)return null;const W=Number.isFinite(E.start)?E.start:0,$=Number.isFinite(E.end)?E.end:100;return{start:W,end:$,hasInside:!!A}},wn=g=>Math.min(100,Math.max(0,g)),yu=g=>{let A=null,S=null;const E=g.dataZoom??[];for(const W of E)if(W&&!(W.type!=="inside"&&W.type!=="slider")){if(Number.isFinite(W.minSpan)){const $=wn(W.minSpan);A=A==null?$:Math.max(A,$)}if(Number.isFinite(W.maxSpan)){const $=wn(W.maxSpan);S=S==null?$:Math.min(S,$)}}return{minSpan:A??void 0,maxSpan:S??void 0}},xu=()=>{if(a.xAxis.type==="category")return null;let g=0;for(let S=0;S<a.series.length;S++){const E=a.series[S];if(E.type==="pie")continue;if(E.type==="candlestick"){const $=U[S]??E.rawData??E.data;g=Math.max(g,$.length);continue}const W=U[S]??E.rawData??E.data;g=Math.max(g,W.length)}if(g<2)return null;const A=100/(g-1);return Number.isFinite(A)?wn(A):null},$i=()=>{const g=yu(a),A=xu(),S=Number.isFinite(g.minSpan)?wn(g.minSpan):A??.5,E=Number.isFinite(g.maxSpan)?wn(g.maxSpan):100;return{minSpan:S,maxSpan:E}},Bs=()=>{var A;const g=gu(a);if(!g){Je==null||Je.dispose(),Je=null,Dt==null||Dt(),Dt=null,ie=null,Qt=null;return}if(ie){const S=$i(),E=ie;(A=E.setSpanConstraints)==null||A.call(E,S.minSpan,S.maxSpan),(Qt==null||Qt.start!==g.start||Qt.end!==g.end)&&(ie.setRange(g.start,g.end),Qt={start:g.start,end:g.end})}else{const S=$i();ie=Fc(g.start,g.end,S),Qt={start:g.start,end:g.end},Dt=ie.onChange(E=>{vu(),ze(),vn(),bu({start:E.start,end:E.end})})}g.hasInside&&Le?Je||(Je=yc(Le,ie),Je.enable()):(Je==null||Je.dispose(),Je=null)},Es=()=>{const g=a.series.length;U=new Array(g).fill(null),_=new Array(g).fill(null),ne.clear();for(let A=0;A<g;A++){const S=a.series[A];if(S.type==="pie")continue;if(S.type==="candlestick"){const $=S.rawData??S.data,O=$.length===0?[]:$.slice();U[A]=O,_[A]=S.rawBounds??null;continue}const E=S.rawData??S.data,W=E.length===0?[]:E.slice();U[A]=W,_[A]=S.rawBounds??Di(W)}},ki=()=>{const g=new Array(a.series.length);for(let A=0;A<a.series.length;A++){const S=a.series[A];if(S.type==="pie"){g[A]=S;continue}if(S.type==="candlestick"){const O=U[A]??S.rawData??S.data,q=_[A]??S.rawBounds??void 0,k=S.sampling==="ohlc"&&O.length>S.samplingThreshold?hi(O,S.samplingThreshold):O;g[A]={...S,rawData:O,rawBounds:q,data:k};continue}const E=U[A]??S.rawData??S.data,W=_[A]??S.rawBounds??void 0,$=nn(E,S.sampling,S.samplingThreshold);g[A]={...S,rawData:E,rawBounds:W,data:$}}D=g};function vu(){const g=(ie==null?void 0:ie.getRange())??null,A=Kt(a,_),S=Jt(A,g);if(g==null||Number.isFinite(g.start)&&Number.isFinite(g.end)&&g.start<=0&&g.end>=100){G=D;return}const W=new Array(D.length);for(let $=0;$<D.length;$++){const O=D[$];if(O.type==="pie"){W[$]=O;continue}const q=X[$];if(q&&S.min>=q.cachedRange.min&&S.max<=q.cachedRange.max){O.type==="candlestick"?W[$]={...O,data:ti(q.data,S.min,S.max)}:W[$]={...O,data:Qn(q.data,S.min,S.max)};continue}O.type==="candlestick"?W[$]={...O,data:ti(O.data,S.min,S.max)}:W[$]={...O,data:Qn(O.data,S.min,S.max)}}G=W}function ci(){const g=(ie==null?void 0:ie.getRange())??null,A=Kt(a,_),S=Jt(A,g),$=(S.max-S.min)*.1,O=S.min-$,q=S.max+$,k=2,H=2e5,J=32,j=Math.max(.001,Math.min(1,S.spanFraction)),pe=new Array(D.length);for(let me=0;me<D.length;me++){const Be=D[me];if(Be.type==="pie"){pe[me]=Be;continue}if(g==null||Number.isFinite(g.start)&&Number.isFinite(g.end)&&g.start<=0&&g.end>=100){pe[me]=Be;continue}if(Be.type==="candlestick"){const bt=U[me]??Be.rawData??Be.data,gt=ti(bt,O,q),Pe=Be.sampling,tn=Be.samplingThreshold,Fn=Number.isFinite(tn)?Math.max(1,tn|0):1,li=Math.min(H,Math.max(k,Fn*J)),Nn=Nt(Math.round(Fn/j),k,li),Mn=Pe==="ohlc"&&gt.length>Nn?hi(gt,Nn):gt;X[me]={data:Mn,cachedRange:{min:O,max:q},timestamp:Date.now()};const ui=ti(Mn,S.min,S.max);pe[me]={...Be,data:ui};continue}const Qe=U[me]??Be.rawData??Be.data,Q=Qn(Qe,O,q),Ee=Be.sampling,de=Be.samplingThreshold,Ct=Number.isFinite(de)?Math.max(1,de|0):1,en=Math.min(H,Math.max(k,Ct*J)),He=Nt(Math.round(Ct/j),k,en),ln=nn(Q,Ee,He);X[me]={data:ln,cachedRange:{min:O,max:q},timestamp:Date.now()};const $t=Qn(ln,S.min,S.max);pe[me]={...Be,data:$t}}G=pe}Es(),ki(),Bs(),ci(),X=new Array(a.series.length).fill(null);const pt=[],Mt=[],Ut=[],St=[],It=[],Lt=[],Vi=ta(i,{targetFormat:r}),Ds=g=>{for(;pt.length>g;){const A=pt.pop();A==null||A.dispose()}for(;pt.length<g;)pt.push(_o(i,{targetFormat:r}))},Us=g=>{for(;Mt.length>g;){const A=Mt.pop();A==null||A.dispose()}for(;Mt.length<g;)Mt.push(zo(i,{targetFormat:r}))},Ls=g=>{for(;Ut.length>g;){const A=Ut.pop();A==null||A.dispose()}for(;Ut.length<g;)Ut.push(ua(i,{targetFormat:r}))},_s=g=>{for(;St.length>g;){const A=St.pop();A==null||A.dispose()}for(;St.length<g;)St.push(wa(i,{targetFormat:r}))},Gs=g=>{for(;It.length>g;){const A=It.pop();A==null||A.dispose()}for(;It.length<g;)It.push(Pa(i,{targetFormat:r}))},Ws=g=>{for(;Lt.length>g;){const A=Lt.pop();A==null||A.dispose()}for(;Lt.length<g;)Lt.push($a(i,{targetFormat:r}))};Ds(a.series.length),Us(a.series.length),Ls(a.series.length),_s(a.series.length),Gs(a.series.length),Ws(a.series.length);const Ot=()=>{if(f)throw new Error("RenderCoordinator is disposed.")},Os=()=>{if(y)try{x.cancel(y)}catch{}y=null,d=1,h=null,w()},$s=(g,A)=>g.min===A.min&&g.max===A.max,wu=(g,A)=>{if(g.length!==A.length)return!0;for(let S=0;S<g.length;S++){const E=g[S],W=A[S];if(E.type!==W.type)return!0;if(E.type==="pie"){const $=E,O=W;if($.data!==O.data||$.data.length!==O.data.length)return!0}else{const $=E,O=W,q=$.rawData??$.data,k=O.rawData??O.data;if(q!==k||q.length!==k.length)return!0}}return!1},Fu=g=>{var Qe;Ot();const A=(ie==null?void 0:ie.getRange())??null,S=(()=>{if(h&&y){try{x.update(performance.now())}catch{}return T(h,d,A)}const Q=Kt(a,_),Ee=Jt(Q,A),de=Li(a,_);return{xBaseDomain:Q,xVisibleDomain:{min:Ee.min,max:Ee.max},yBaseDomain:de,series:G}})();Os();const E=wu(a.series,g.series);if(a=g,D=g.series,G=g.series,Se=new Array(g.series.length).fill("unknown"),X=new Array(g.series.length).fill(null),l==null||l.update(g.series,g.theme),st(),Y=!1,Ze(),Es(),ki(),Bs(),ci(),o){const Q=((Qe=a.tooltip)==null?void 0:Qe.show)!==!1;Q&&!fe&&(fe=jr(o),oe=null,ve=null,we=null),!Q&&fe&&ye()}else ye();const W=g.series.length;if(Ds(W),Us(W),Ls(W),_s(W),Gs(W),Ws(W),W<v)for(let Q=W;Q<v;Q++)he.removeSeries(Q);if(v=W,a.animation===!1&&M==="running"&&(p.cancelAll(),F=null,M="done",I=1),a.animation===!1){Os();return}const $=(ie==null?void 0:ie.getRange())??null,O=Kt(a,_),q=Jt(O,$),k=Li(a,_),H=G,J=!$s(S.xBaseDomain,O)||!$s(S.yBaseDomain,k);if(!(b&&(J||E)))return;const pe=$l(a.animation);if(!pe)return;h={from:{xBaseDomain:S.xBaseDomain,xVisibleDomain:S.xVisibleDomain,yBaseDomain:S.yBaseDomain,series:S.series},to:{xBaseDomain:O,xVisibleDomain:{min:q.min,max:q.max},yBaseDomain:k,series:H}},w();const me=pe.delayMs+pe.durationMs,Be=Q=>{const Ee=Ft(Q);if(!(me>0))return 1;const de=Ee*me;if(de<=pe.delayMs)return 0;if(!(pe.durationMs>0))return 1;const Ct=(de-pe.delayMs)/pe.durationMs;return pe.easing(Ct)};d=0;const Xe=x.animate(0,1,me,Be,Q=>{f||y!==Xe||(d=Ft(Q),d<1&&ze())},()=>{f||y!==Xe||(d=1,h=null,y=null,w())});y=Xe},Nu=(g,A)=>{if(Ot(),!Number.isFinite(g)||g<0||g>=a.series.length||!A||A.length===0)return;if(a.series[g].type==="pie"){B.has(g)||(B.add(g),console.warn(`RenderCoordinator.appendData(${g}, ...): pie series are not supported by streaming append.`));return}const E=ne.get(g);E?E.push(...A):ne.set(g,Array.from(A)),Wt()},Mu=g=>{switch(g.type){case"area":return!0;case"line":return g.areaStyle!=null;case"bar":return!1;case"scatter":return!1;case"pie":return!1;case"candlestick":return!1;default:return Ei(g)}};return{setOptions:Fu,appendData:Nu,getInteractionX:()=>Oe,setInteractionX:(g,A)=>{Ot();const S=g!==null&&Number.isFinite(g)?g:null;Me={...Me,source:S===null?"mouse":"sync"},ke(S,A),S===null&&Me.hasPointer===!1&&(Ae.setVisible(!1),We.setVisible(!1),se(),K(null)),ze()},onInteractionXChange:g=>(Ot(),et.add(g),()=>{et.delete(g)}),getZoomRange:()=>(ie==null?void 0:ie.getRange())??null,setZoomRange:(g,A)=>{Ot(),ie&&ie.setRange(g,A)},onZoomRangeChange:g=>(Ot(),ai.add(g),()=>{ai.delete(g)}),handlePointerEvent:g=>{if(Ot(),s||!e.canvas||!Number.isFinite(g.x)||!Number.isFinite(g.y)||!Number.isFinite(g.gridX)||!Number.isFinite(g.gridY)||!Number.isFinite(g.plotWidthCss)||!Number.isFinite(g.plotHeightCss))return;const{type:S,x:E,y:W,gridX:$,gridY:O,plotWidthCss:q,plotHeightCss:k,isInGrid:H}=g;if(S==="leave"){Me={...Me,isInGrid:!1,hasPointer:!1},Ae.setVisible(!1),oe=null,ve=null,we=null,se(),K(null),ee(null),ke(null,"mouse"),ze();return}if(S==="move"){Me={source:"mouse",x:E,y:W,gridX:$,gridY:O,isInGrid:H,hasPointer:!0},ze();return}if(S==="click"){if(!(n!=null&&n.onClickData))return;let J=null,j=null,pe=null;if(H&&$e){if(j=Wi(G,$,O,q,k),!j){const me=Oi(G,$,O,$e);me&&(pe={seriesIndex:me.seriesIndex,dataIndex:me.params.dataIndex,point:me.match.point})}!j&&!pe&&(J=Ii(G,$,O,$e.xScale,$e.yScale,20))}n.onClickData({x:E,y:W,gridX:$,gridY:O,isInGrid:H,nearest:J,pieSlice:j,candlestick:pe});return}if(S==="wheel"){if(!H||!ie)return;const J=g.deltaX??0,j=g.deltaY??0,pe=g.deltaMode??0,me=(bt,gt)=>{if(!Number.isFinite(bt)||bt===0)return 0;switch(pe){case 1:return bt*16;case 2:return bt*(Number.isFinite(gt)&&gt>0?gt:800);default:return bt}},Be=me(j,k),Xe=me(J,q);if(Math.abs(Xe)>Math.abs(Be)&&Xe!==0){const{start:bt,end:gt}=ie.getRange(),Pe=gt-bt;if(!Number.isFinite(Pe)||Pe===0)return;const tn=Xe/q*Pe;if(!Number.isFinite(tn)||tn===0)return;ie.pan(tn);return}if(Be===0)return;const Qe=Math.abs(Be);if(!Number.isFinite(Qe)||Qe===0)return;const Q=Math.min(Qe,200),de=Math.exp(Q*.002);if(!(de>1))return;const{start:Ct,end:en}=ie.getRange(),He=en-Ct;if(!Number.isFinite(He)||He===0)return;const ln=Math.min(1,Math.max(0,$/q)),$t=Math.min(100,Math.max(0,Ct+ln*He));Be<0?ie.zoomIn($t,de):ie.zoomOut($t,de),ze();return}},render:()=>{var Fn,li,Nn,Mn,ui,Vs,zs,Xs,Hs;if(Ot(),!e.canvasContext||!e.canvas)return;(ne.size>0||Y)&&(Ze(),Et({requestRenderAfter:!1}));const g=a.series.some(L=>L.type!=="pie"),A=G;if(M!=="done"){const L=Ol(a.animation),z=(()=>{for(let xe=0;xe<A.length;xe++){const ae=A[xe];switch(ae.type){case"pie":{if(ae.data.some(ce=>typeof(ce==null?void 0:ce.value)=="number"&&Number.isFinite(ce.value)&&ce.value>0))return!0;break}case"line":case"area":case"bar":case"scatter":case"candlestick":{if(ae.data.length>0)return!0;break}default:Ei(ae)}}return!1})();if(M==="pending"&&L&&z){const xe=L.delayMs+L.durationMs,ae=ce=>{const Te=Ft(ce);if(!(xe>0))return 1;const be=Te*xe;if(be<=L.delayMs)return 0;if(!(L.durationMs>0))return 1;const ge=(be-L.delayMs)/L.durationMs;return L.easing(ge)};I=0,M="running",F=p.animate(0,1,xe,ae,ce=>{f||M!=="running"||(I=Ft(ce),I<1&&ze())},()=>{f||(M="done",I=1,F=null)})}p.update(performance.now())}h!==null&&y&&x.update(performance.now());const S=as(e,a);Le==null||Le.updateGridArea(S);const E=(ie==null?void 0:ie.getRange())??null,W=h?Ft(d):1,$=h?Kn(h.from.xBaseDomain,h.to.xBaseDomain,W):Kt(a,_),O=h?Kn(h.from.yBaseDomain,h.to.yBaseDomain,W):Li(a,_),q=Jt($,E),k=Il(S),H=ls(S),J=kn().domain(q.min,q.max).range(k.left,k.right),j=kn().domain(O.min,O.max).range(k.bottom,k.top),pe=S.devicePixelRatio,me=e.canvas?rs(e.canvas,pe):0,Be=Math.abs(q.max-q.min);let Xe=gn,Qe=[];if(a.xAxis.type==="time"){const L=Wl({axisMin:Yn(a.xAxis.min),axisMax:Yn(a.xAxis.max),xScale:J,plotClipLeft:k.left,plotClipRight:k.right,canvasCssWidth:me,visibleRangeMs:Be,measureCtx:u,measureCache:m??void 0,fontSize:a.theme.fontSize,fontFamily:a.theme.fontFamily||"sans-serif"});Xe=L.tickCount,Qe=L.tickValues}else{const L=vt(a.xAxis.min)??J.invert(k.left),z=vt(a.xAxis.max)??J.invert(k.right);Qe=ni(L,z,Xe)}const Q=mu(S,{xDomain:{min:q.min,max:q.max},yDomain:O});$e=Q;const Ee=h&&W<1?P(h.from.series,h.to.series,W,N):G;if(Me.source==="mouse"&&Me.hasPointer&&Me.isInGrid&&Q){const L=Q.xScale.invert(Me.gridX);ke(Number.isFinite(L)?L:null,"mouse")}let de=Me;if(Me.source==="sync")if(Oe===null||!Q)de={...Me,hasPointer:!1,isInGrid:!1};else{const L=Q.xScale.scale(Oe),z=Q.plotHeightCss*.5,xe=Number.isFinite(L)&&Number.isFinite(z)&&L>=0&&L<=Q.plotWidthCss&&z>=0&&z<=Q.plotHeightCss;de={source:"sync",gridX:Number.isFinite(L)?L:0,gridY:Number.isFinite(z)?z:0,x:S.left+(Number.isFinite(L)?L:0),y:S.top+(Number.isFinite(z)?z:0),isInGrid:xe,hasPointer:xe}}if(te.prepare(S,{color:a.theme.gridLineColor}),g&&(Re.prepare(a.xAxis,J,"x",S,a.theme.axisLineColor,a.theme.axisTickColor,Xe),Ne.prepare(a.yAxis,j,"y",S,a.theme.axisLineColor,a.theme.axisTickColor,gn)),de.hasPointer&&de.isInGrid){const L={showX:!0,showY:de.source!=="sync",color:cs(a.theme.axisLineColor,.6),lineWidth:pl};Ae.prepare(de.x,de.y,S,L),Ae.setVisible(!0),K(de.x)}else Ae.setVisible(!1),K(null);if(de.source==="mouse"&&de.hasPointer&&de.isInGrid)if(Q){const L=Ii(Ee,de.gridX,de.gridY,Q.xScale,Q.yScale);if(L){const{x:z,y:xe}=wt(L.point),ae=Q.xScale.scale(z),ce=Q.yScale.scale(xe);if(Number.isFinite(ae)&&Number.isFinite(ce)){const Te=S.left+ae,be=S.top+ce,ge=ls(S),Fe={centerDeviceX:Te*S.devicePixelRatio,centerDeviceY:be*S.devicePixelRatio,devicePixelRatio:S.devicePixelRatio,canvasWidth:S.canvasWidth,canvasHeight:S.canvasHeight,scissor:ge},De=((Fn=a.series[L.seriesIndex])==null?void 0:Fn.color)??"#888";We.prepare(Fe,De,bl),We.setVisible(!0)}else We.setVisible(!1)}else We.setVisible(!1)}else We.setVisible(!1);else We.setVisible(!1);if(de.hasPointer&&de.isInGrid&&((li=a.tooltip)==null?void 0:li.show)!==!1){const L=e.canvas;if(console.log("[Tooltip block] State check:",{hasInteractionScales:!!Q,domOverlaysEnabled:s,hasCanvas:!!L,canvasType:L?Ye(L)?"HTMLCanvasElement":"OffscreenCanvas":"null",interactionScales:Q?{plotWidthCss:Q.plotWidthCss,plotHeightCss:Q.plotHeightCss}:null}),Q&&(!s||L&&Ye(L))){const z=(Nn=a.tooltip)==null?void 0:Nn.formatter,xe=((Mn=a.tooltip)==null?void 0:Mn.trigger)??"item",ae=Ye(L)?L.offsetLeft+de.x:de.x,ce=Ye(L)?L.offsetTop+de.y:de.y;if(de.source==="sync"){const Te=Yr(Ee,de.gridX,Q.xScale);if(Te.length===0)ye();else if(xe==="axis"){const be=Te.map(Fe=>oi(Fe.seriesIndex,Fe.dataIndex,Fe.point)),ge=z?z(be):Ri(be);ge&&(ge!==oe||ae!==ve||ce!==we)?(oe=ge,ve=ae,we=ce,ue(ae,ce,ge,be)):ge||ye()}else{const be=Te[0],ge=oi(be.seriesIndex,be.dataIndex,be.point),Fe=z?z(ge):bn(ge);Fe&&(Fe!==oe||ae!==ve||ce!==we)?(oe=Fe,ve=ae,we=ce,ue(ae,ce,Fe,ge)):Fe||ye()}}else if(xe==="axis"){const Te=Wi(Ee,de.gridX,de.gridY,Q.plotWidthCss,Q.plotHeightCss);if(Te){const be={seriesName:Te.slice.name,seriesIndex:Te.seriesIndex,dataIndex:Te.dataIndex,value:[0,Te.slice.value],color:Te.slice.color},ge=z?z([be]):bn(be);ge&&(ge!==oe||ae!==ve||ce!==we)?(oe=ge,ve=ae,we=ce,ue(ae,ce,ge,[be])):ge||ye()}else{const be=Oi(Ee,de.gridX,de.gridY,Q),ge=Yr(Ee,de.gridX,Q.xScale);if(ge.length===0)if(be){const Fe=[be.params],De=z?z(Fe):Ri(Fe);if(De){const _e=_i(be.match,Q.xScale,Q.yScale,S,L),tt=(_e==null?void 0:_e.x)??ae,yt=(_e==null?void 0:_e.y)??ce;(De!==oe||tt!==ve||yt!==we)&&(oe=De,ve=tt,we=yt,ue(tt,yt,De,Fe))}else ye()}else ye();else{const Fe=ge.map(_e=>oi(_e.seriesIndex,_e.dataIndex,_e.point));be&&Fe.push(be.params);const De=z?z(Fe):Ri(Fe);if(De){let _e=ae,tt=ce;if(be){const yt=_i(be.match,Q.xScale,Q.yScale,S,L);yt&&(_e=yt.x,tt=yt.y)}(De!==oe||_e!==ve||tt!==we)&&(oe=De,ve=_e,we=tt,ue(_e,tt,De,Fe))}else ye()}}}else{const Te=Wi(Ee,de.gridX,de.gridY,Q.plotWidthCss,Q.plotHeightCss);if(Te){const be={seriesName:Te.slice.name,seriesIndex:Te.seriesIndex,dataIndex:Te.dataIndex,value:[0,Te.slice.value],color:Te.slice.color},ge=z?z(be):bn(be);ge&&(ge!==oe||ae!==ve||ce!==we)?(oe=ge,ve=ae,we=ce,ue(ae,ce,ge,be)):ge||ye()}else{const be=Oi(Ee,de.gridX,de.gridY,Q);if(be){const Fe=z?z(be.params):bn(be.params);if(Fe){const De=_i(be.match,Q.xScale,Q.yScale,S,L),_e=(De==null?void 0:De.x)??ae,tt=(De==null?void 0:De.y)??ce;(Fe!==oe||_e!==ve||tt!==we)&&(oe=Fe,ve=_e,we=tt,ue(_e,tt,Fe,be.params))}else ye();return}const ge=Ii(Ee,de.gridX,de.gridY,Q.xScale,Q.yScale);if(!ge)ye();else{const Fe=oi(ge.seriesIndex,ge.dataIndex,ge.point),De=z?z(Fe):bn(Fe);De&&(De!==oe||ae!==ve||ce!==we)?(oe=De,ve=ae,we=ce,ue(ae,ce,De,Fe)):De||ye()}}}}else ye()}else ye();const Ct=a.yAxis.min??O.min,en=[],He=M==="running"?Ft(I):1;for(let L=0;L<Ee.length;L++){const z=Ee[L];switch(z.type){case"area":{const xe=z.baseline??Ct;pt[L].prepare(z,z.data,J,j,xe);break}case"line":{Ie.has(L)||he.setSeries(L,z.data);const xe=he.getSeriesBuffer(L);Mt[L].prepare(z,xe,J,j);const ae=(ie==null?void 0:ie.getRange())??null;if((ae==null||Number.isFinite(ae.start)&&Number.isFinite(ae.end)&&ae.start<=0&&ae.end>=100)&&z.sampling==="none"?Se[L]="fullRawLine":Se[L]="other",z.areaStyle){const Te={type:"area",name:z.name,rawData:z.data,data:z.data,color:z.areaStyle.color,areaStyle:z.areaStyle,sampling:z.sampling,samplingThreshold:z.samplingThreshold};pt[L].prepare(Te,Te.data,J,j,Ct)}break}case"bar":{en.push(z);break}case"scatter":{if(z.mode==="density"){const xe=U[L]??z.rawData??z.data;he.setSeries(L,xe);const ae=he.getSeriesBuffer(L),ce=he.getSeriesPointCount(L),{start:Te,end:be}=Tl(xe,q.min,q.max),ge=Nt(Te,0,ce),Fe=Nt(be,ge,ce);St[L].prepare(z,ae,ce,ge,Fe,J,j,S,_[L]??z.rawBounds)}else{const xe=He<1?{...z,color:cs(z.color,He)}:z;Ut[L].prepare(xe,z.data,J,j,S)}break}case"pie":{if(He<1){const xe=e.canvas,ae=(Q==null?void 0:Q.plotWidthCss)??(xe&&Ye(xe)?(ui=cn(xe,S))==null?void 0:ui.plotWidthCss:null),ce=(Q==null?void 0:Q.plotHeightCss)??(xe&&Ye(xe)?(Vs=cn(xe,S))==null?void 0:Vs.plotHeightCss:null),Te=typeof ae=="number"&&typeof ce=="number"?.5*Math.min(ae,ce):0;if(Te>0){const be=bs(z.radius,Te),ge=Math.max(0,be.inner)*He,Fe=Math.max(ge,be.outer)*He,De={...z,radius:[ge,Fe]};It[L].prepare(De,S);break}}It[L].prepare(z,S);break}case"candlestick":{Lt[L].prepare(z,z.data,J,j,S,a.theme.backgroundColor);break}default:Ei(z)}}const ln=He<1?Vl(j,k,en,He):j;Vi.prepare(en,he,J,ln,S);const $t=i.createCommandEncoder({label:"renderCoordinator/commandEncoder"});for(let L=0;L<Ee.length;L++){const z=Ee[L];z.type==="scatter"&&z.mode==="density"&&St[L].encodeCompute($t)}const bt=e.canvasContext.getCurrentTexture().createView(),gt=ho(a.theme.backgroundColor,{r:0,g:0,b:0,a:1}),Pe=$t.beginRenderPass({label:"renderCoordinator/renderPass",colorAttachments:[{view:bt,clearValue:gt,loadOp:"clear",storeOp:"store"}]});te.render(Pe);for(let L=0;L<Ee.length;L++)Ee[L].type==="pie"&&It[L].render(Pe);for(let L=0;L<Ee.length;L++)if(Mu(Ee[L]))if(He<1){const z=Nt(Math.floor(H.w*He),0,H.w);z>0&&H.h>0&&(Pe.setScissorRect(H.x,H.y,z,H.h),pt[L].render(Pe),Pe.setScissorRect(0,0,S.canvasWidth,S.canvasHeight))}else Pe.setScissorRect(H.x,H.y,H.w,H.h),pt[L].render(Pe),Pe.setScissorRect(0,0,S.canvasWidth,S.canvasHeight);H.w>0&&H.h>0&&(Pe.setScissorRect(H.x,H.y,H.w,H.h),Vi.render(Pe),Pe.setScissorRect(0,0,S.canvasWidth,S.canvasHeight));for(let L=0;L<Ee.length;L++)Ee[L].type==="candlestick"&&Lt[L].render(Pe);for(let L=0;L<Ee.length;L++){const z=Ee[L];z.type==="scatter"&&(z.mode==="density"?St[L].render(Pe):Ut[L].render(Pe))}for(let L=0;L<Ee.length;L++)if(Ee[L].type==="line")if(He<1){const z=Nt(Math.floor(H.w*He),0,H.w);z>0&&H.h>0&&(Pe.setScissorRect(H.x,H.y,z,H.h),Mt[L].render(Pe),Pe.setScissorRect(0,0,S.canvasWidth,S.canvasHeight))}else Pe.setScissorRect(H.x,H.y,H.w,H.h),Mt[L].render(Pe),Pe.setScissorRect(0,0,S.canvasWidth,S.canvasHeight);if(We.render(Pe),g&&(Re.render(Pe),Ne.render(Pe)),Ae.render(Pe),Pe.end(),i.queue.submit([$t.finish()]),b=!0,g&&(c&&o||!s&&(n==null?void 0:n.onAxisLabelsUpdate))){const L=e.canvas,z=rs(L,e.devicePixelRatio??1),xe=dl(L,e.devicePixelRatio??1);if(z<=0||xe<=0)return;const ae=Ye(L)?L.offsetLeft:0,ce=Ye(L)?L.offsetTop:0,Te=Jn(k.left,z),be=Jn(k.right,z),ge=Ui(k.top,xe),Fe=Ui(k.bottom,xe);c==null||c.clear();const De=[],_e=[],tt=a.xAxis.tickLength??ss,yt=Fe+tt+Ai+a.theme.fontSize*.5,Ys=a.xAxis.type==="time",Su=(()=>{if(Ys)return null;const je=vt(a.xAxis.min)??J.invert(k.left),at=vt(a.xAxis.max)??J.invert(k.right),kt=Xe===1?0:(at-je)/(Xe-1);return gs(kt)})();for(let je=0;je<Qe.length;je++){const at=Qe[je],kt=J.scale(at),Vt=Jn(kt,z),Tt=Qe.length===1?"middle":je===0?"start":je===Qe.length-1?"end":"middle",nt=Ys?xs(at,Be):ys(Su,at);if(nt==null)continue;const Pt={axis:"x",text:nt,x:ae+Vt,y:ce+yt,anchor:Tt,isTitle:!1};if(De.push(Pt),c){const Rt=c.addLabel(nt,ae+Vt,ce+yt,{fontSize:a.theme.fontSize,color:a.theme.textColor,anchor:Tt});Vn(Rt,Pt,a.theme)}}const zi=gn,Iu=a.yAxis.tickLength??ss,Xi=vt(a.yAxis.min)??j.invert(k.bottom),qs=vt(a.yAxis.max)??j.invert(k.top),Cu=(qs-Xi)/(zi-1),Tu=gs(Cu),Hi=Te-Iu-Ai,Yi=[];for(let je=0;je<zi;je++){const at=je/(zi-1),kt=Xi+at*(qs-Xi),Vt=j.scale(kt),Tt=Ui(Vt,xe),nt=ys(Tu,kt);if(nt==null)continue;const Pt={axis:"y",text:nt,x:ae+Hi,y:ce+Tt,anchor:"end",isTitle:!1};if(_e.push(Pt),c){const Rt=c.addLabel(nt,ae+Hi,ce+Tt,{fontSize:a.theme.fontSize,color:a.theme.textColor,anchor:"end"});Vn(Rt,Pt,a.theme),Yi.push(Rt)}}const qi=Qc(a.theme.fontSize),Zi=((zs=a.xAxis.name)==null?void 0:zs.trim())??"";if(Zi.length>0){const je=(Te+be)/2,at=yt+a.theme.fontSize*.5,Tt=((Xs=a.dataZoom)==null?void 0:Xs.some(Rt=>(Rt==null?void 0:Rt.type)==="slider"))??!1?xe-32:xe,nt=(at+Tt)/2,Pt={axis:"x",text:Zi,x:ae+je,y:ce+nt,anchor:"middle",isTitle:!0};if(De.push(Pt),c){const Rt=c.addLabel(Zi,ae+je,ce+nt,{fontSize:qi,color:a.theme.textColor,anchor:"middle"});Vn(Rt,Pt,a.theme)}}const ji=((Hs=a.yAxis.name)==null?void 0:Hs.trim())??"";if(ji.length>0){const je=Yi.length===0?Sl(_e,a.theme.fontSize):Yi.reduce((nt,Pt)=>Math.max(nt,Pt.getBoundingClientRect().width),0),at=(ge+Fe)/2,Vt=Hi-je-Ai-qi*.5,Tt={axis:"y",text:ji,x:ae+Vt,y:ce+at,anchor:"middle",rotation:-90,isTitle:!0};if(_e.push(Tt),c){const nt=c.addLabel(ji,ae+Vt,ce+at,{fontSize:qi,color:a.theme.textColor,anchor:"middle",rotation:-90});Vn(nt,Tt,a.theme)}}!s&&(n!=null&&n.onAxisLabelsUpdate)&&n.onAxisLabelsUpdate(De,_e)}},dispose:()=>{if(!f){f=!0;try{F&&p.cancel(F),p.cancelAll()}catch{}F=null,M="done",I=1;try{y&&x.cancel(y),x.cancelAll()}catch{}y=null,d=1,h=null,Ze(),st(),Y=!1,ne.clear(),Je==null||Je.dispose(),Je=null,Dt==null||Dt(),Dt=null,ie=null,Qt=null,ai.clear(),Le==null||Le.dispose(),Ae.dispose(),We.dispose();for(let g=0;g<pt.length;g++)pt[g].dispose();pt.length=0;for(let g=0;g<Mt.length;g++)Mt[g].dispose();Mt.length=0;for(let g=0;g<Ut.length;g++)Ut[g].dispose();Ut.length=0;for(let g=0;g<St.length;g++)St[g].dispose();St.length=0;for(let g=0;g<It.length;g++)It[g].dispose();It.length=0;for(let g=0;g<Lt.length;g++)Lt[g].dispose();Lt.length=0,Vi.dispose(),te.dispose(),Re.dispose(),Ne.dispose(),he.dispose(),fe==null||fe.dispose(),fe=null,l==null||l.dispose(),c==null||c.dispose()}}}}const Xl={left:60,right:20,top:40,bottom:40},ii=["#5470C6","#91CC75","#FAC858","#EE6666","#73C0DE","#3BA272","#FC8452","#9A60B4","#EA7CCC"],Fs={width:2,opacity:1},Ns={opacity:.25},mt={style:"classic",itemStyle:{upColor:"#22c55e",downColor:"#ef4444",upBorderColor:"#22c55e",downBorderColor:"#ef4444",borderWidth:1},barWidth:"80%",barMinWidth:1,barMaxWidth:50,sampling:"ohlc",samplingThreshold:5e3},ri={mode:"points",binSize:4,densityColormap:"viridis",densityNormalization:"log"},it={grid:Xl,xAxis:{type:"value"},yAxis:{type:"value"},autoScroll:!1,palette:ii},Hl={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},Yl={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 Gi(e){return e==="dark"?Hl:Yl}const ql=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,m=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,v=typeof l=="number"&&Number.isFinite(l)?l:void 0,M=typeof u=="number"&&Number.isFinite(u)?u:void 0;t.push({type:r,xAxisIndex:m,start:f,end:a,minSpan:v,maxSpan:M})}return t},xn=e=>Array.isArray(e)?e.filter(t=>typeof t=="string").map(t=>t.trim()).filter(t=>t.length>0):[],Zl=e=>{const t=Gi("dark");if(typeof e=="string"){const c=e.trim().toLowerCase();return Gi(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=xn(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}},At=e=>{if(typeof e!="string")return;const t=e.trim();return t.length>0?t:void 0},jl=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},Kl=e=>{if(typeof e!="string")return;const t=e.trim().toLowerCase();return t==="points"||t==="density"?t:void 0},Jl=e=>{if(typeof e!="string")return;const t=e.trim().toLowerCase();return t==="linear"||t==="sqrt"||t==="log"?t:void 0},Ql=e=>{if(typeof e!="number"||!Number.isFinite(e))return;const t=Math.floor(e);return t>0?Math.max(1,t):void 0},eu=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},tu=e=>{if(typeof e!="string")return;const t=e.trim().toLowerCase();return t==="none"||t==="ohlc"?t:void 0},Ms=e=>{if(typeof e!="number"||!Number.isFinite(e))return;const t=Math.floor(e);return t>0?t:void 0},Ss=e=>Array.isArray(e),si=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=Ss(o)?o[0]:o.x,l=Ss(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}},nu=e=>Array.isArray(e),iu=e=>{if(e.length===0)return;let t=Number.POSITIVE_INFINITY,n=Number.NEGATIVE_INFINITY,i=Number.POSITIVE_INFINITY,r=Number.NEGATIVE_INFINITY;if(nu(e[0])){const o=e;for(let c=0;c<o.length;c++){const l=o[c],u=l[0],m=l[3],f=l[4];if(!Number.isFinite(u)||!Number.isFinite(m)||!Number.isFinite(f))continue;const a=Math.min(m,f),v=Math.max(m,f);u<t&&(t=u),u>n&&(n=u),a<i&&(i=a),v>r&&(r=v)}}else{const o=e;for(let c=0;c<o.length;c++){const l=o[c],u=l.timestamp,m=l.low,f=l.high;if(!Number.isFinite(u)||!Number.isFinite(m)||!Number.isFinite(f))continue;const a=Math.min(m,f),v=Math.max(m,f);u<t&&(t=u),u>n&&(n=u),a<i&&(i=a),v>r&&(r=v)}}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}},ru=e=>{throw new Error(`Unhandled series type: ${(e==null?void 0:e.type)??"unknown"}`)};let Is=!1;const su=()=>{Is||(console.warn("ChartGPU: Candlestick series rendering is not yet implemented. Series will be skipped."),Is=!0)};function ou(e={}){var F,b,x,y;const t=Zl(e.theme),n=e.autoScroll,i=typeof n=="boolean"?n:it.autoScroll,r=e.animation,o=(typeof r=="boolean"||r!==null&&typeof r=="object"&&!Array.isArray(r)?r:void 0)??!0,c=xn(e.palette),l=c.length>0?{...t,colorPalette:c}:t,u=xn(l.colorPalette),m=u.length>0?u:xn(it.palette??ii).length>0?xn(it.palette??ii):Array.from(ii),f=m.length>0?m:["#000000"],a={...l,colorPalette:f.slice()},v={left:((F=e.grid)==null?void 0:F.left)??it.grid.left,right:((b=e.grid)==null?void 0:b.right)??it.grid.right,top:((x=e.grid)==null?void 0:x.top)??it.grid.top,bottom:((y=e.grid)==null?void 0:y.bottom)??it.grid.bottom},M=e.xAxis?{...it.xAxis,...e.xAxis,type:e.xAxis.type??it.xAxis.type}:{...it.xAxis},I=e.yAxis?{...it.yAxis,...e.yAxis,type:e.yAxis.type??it.yAxis.type}:{...it.yAxis},p=(e.series??[]).map((d,h)=>{var T,B,U,_,D,G,X,Z,V,re;const N=At(d.color),w=a.colorPalette[h%a.colorPalette.length],C=N??w,R=jl(d.sampling)??"lttb",P=Ms(d.samplingThreshold)??5e3;switch(d.type){case"area":{const Y=At((T=d.areaStyle)==null?void 0:T.color)??N??w,ne={opacity:((B=d.areaStyle)==null?void 0:B.opacity)??Ns.opacity,color:Y},Se=si(d.data);return{...d,rawData:d.data,data:nn(d.data,R,P),color:Y,areaStyle:ne,sampling:R,samplingThreshold:P,rawBounds:Se}}case"line":{const Y=At((U=d.lineStyle)==null?void 0:U.color)??N??w,ne={width:((_=d.lineStyle)==null?void 0:_.width)??Fs.width,opacity:((D=d.lineStyle)==null?void 0:D.opacity)??Fs.opacity,color:Y},{areaStyle:Se,...Ie}=d,fe=si(d.data),oe=nn(d.data,R,P);return{...Ie,rawData:d.data,data:oe,color:Y,lineStyle:ne,...d.areaStyle?{areaStyle:{opacity:d.areaStyle.opacity??Ns.opacity,color:At(d.areaStyle.color)??Y}}:{},sampling:R,samplingThreshold:P,rawBounds:fe}}case"bar":{const le=si(d.data);return{...d,rawData:d.data,data:nn(d.data,R,P),color:C,sampling:R,samplingThreshold:P,rawBounds:le}}case"scatter":{const le=si(d.data),Y=Kl(d.mode)??ri.mode,ne=Ql(d.binSize)??ri.binSize,Se=eu(d.densityColormap)??ri.densityColormap,Ie=Jl(d.densityNormalization)??ri.densityNormalization;return{...d,rawData:d.data,data:nn(d.data,R,P),color:C,mode:Y,binSize:ne,densityColormap:Se,densityNormalization:Ie,sampling:R,samplingThreshold:P,rawBounds:le}}case"pie":{const{sampling:le,samplingThreshold:Y,...ne}=d,Se=(d.data??[]).map((Ie,fe)=>{const oe=At(Ie==null?void 0:Ie.color),ve=a.colorPalette[(h+fe)%a.colorPalette.length];return{...Ie,color:oe??ve}});return{...ne,color:C,data:Se}}case"candlestick":{su();const le=tu(d.sampling)??mt.sampling,Y=Ms(d.samplingThreshold)??mt.samplingThreshold,ne={upColor:At((G=d.itemStyle)==null?void 0:G.upColor)??mt.itemStyle.upColor,downColor:At((X=d.itemStyle)==null?void 0:X.downColor)??mt.itemStyle.downColor,upBorderColor:At((Z=d.itemStyle)==null?void 0:Z.upBorderColor)??mt.itemStyle.upBorderColor,downBorderColor:At((V=d.itemStyle)==null?void 0:V.downBorderColor)??mt.itemStyle.downBorderColor,borderWidth:typeof((re=d.itemStyle)==null?void 0:re.borderWidth)=="number"&&Number.isFinite(d.itemStyle.borderWidth)?d.itemStyle.borderWidth:mt.itemStyle.borderWidth},Se=iu(d.data),Ie=le==="ohlc"&&d.data.length>Y?hi(d.data,Y):d.data;return{...d,rawData:d.data,data:Ie,color:C,style:d.style??mt.style,itemStyle:ne,barWidth:d.barWidth??mt.barWidth,barMinWidth:d.barMinWidth??mt.barMinWidth,barMaxWidth:d.barMaxWidth??mt.barMaxWidth,sampling:le,samplingThreshold:Y,rawBounds:Se}}default:return ru(d)}});return{grid:v,xAxis:M,yAxis:I,autoScroll:i,dataZoom:ql(e.dataZoom),animation:o,theme:a,palette:a.colorPalette,series:p}}const au=32+8,cu=e=>{var t;return((t=e.dataZoom)==null?void 0:t.some(n=>(n==null?void 0:n.type)==="slider"))??!1};function Cs(e={}){const t={...ou(e),tooltip:e.tooltip};return cu(e)?{...t,grid:{...t.grid,bottom:t.grid.bottom+au}}:t}const dt=120,lu=1e3/60,uu=1.5;function Ts(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 rt(e){return e instanceof Error?[e.message,e.stack]:[String(e),void 0]}class fu{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]=rt(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=js(t.canvas,s);let c=await Ks(o);const l=Cs(t.options);n=new MessageChannel;const m={renderPending:!1,disposed:!1,deviceLost:!1,performance:{frameTimestamps:new Float64Array(dt),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(p=>{m.deviceLost=!0,this.emit({type:"deviceLost",chartId:t.chartId,reason:p.reason==="destroyed"?"destroyed":"unknown",message:p.message||p.reason||"Device lost during initialization"})}).catch(()=>{}),c.device.addEventListener("uncapturederror",p=>{const F=p.error instanceof GPUValidationError?`WebGPU Validation Error: ${p.error.message}`:p.error instanceof GPUOutOfMemoryError?`WebGPU Out of Memory: ${p.error.message}`:`WebGPU Error: ${p.error.message}`;this.emitError(t.chartId,"RENDER_ERROR",F,"uncaptured_gpu_error")}));const f=zl(c,l,{domOverlays:!1,onRequestRender:()=>{!m.renderPending&&!m.disposed&&n&&(m.renderPending=!0,n.port2.postMessage(null))},onTooltipUpdate:p=>{if(this.emit({type:"tooltipUpdate",chartId:t.chartId,data:p}),p&&p.params.length>0){const F=p.params[0];this.emit({type:"hoverChange",chartId:t.chartId,payload:{seriesIndex:F.seriesIndex,dataIndex:F.dataIndex,value:F.value,x:p.x,y:p.y}})}else this.emit({type:"hoverChange",chartId:t.chartId,payload:null})},onLegendUpdate:p=>{this.emit({type:"legendUpdate",chartId:t.chartId,items:p})},onAxisLabelsUpdate:(p,F)=>{this.emit({type:"axisLabelsUpdate",chartId:t.chartId,xLabels:p,yLabels:F})},onCrosshairMove:p=>{p!==null&&this.emit({type:"crosshairMove",chartId:t.chartId,x:p})},onClickData:p=>{if(!(!p.nearest&&!p.pieSlice&&!p.candlestick)){if(p.nearest){this.emit({type:"click",chartId:t.chartId,payload:{seriesIndex:p.nearest.seriesIndex,dataIndex:p.nearest.dataIndex,value:p.nearest.point,x:p.x,y:p.y}});return}if(p.pieSlice){this.emit({type:"click",chartId:t.chartId,payload:{seriesIndex:p.pieSlice.seriesIndex,dataIndex:p.pieSlice.dataIndex,value:[p.pieSlice.slice.value,0],x:p.x,y:p.y}});return}p.candlestick&&this.emit({type:"click",chartId:t.chartId,payload:{seriesIndex:p.candlestick.seriesIndex,dataIndex:p.candlestick.dataIndex,value:p.candlestick.point,x:p.x,y:p.y}})}},onDeviceLost:p=>{m.deviceLost=!0,this.emit({type:"deviceLost",chartId:t.chartId,reason:p==="destroyed"?"destroyed":"unknown",message:p})}});f.onZoomRangeChange(p=>{this.emit({type:"zoomChange",chartId:t.chartId,start:p.start,end:p.end})});const a={chartId:t.chartId,gpuContext:c,coordinator:f,canvas:t.canvas,renderChannel:n,state:m};this.charts.set(t.chartId,a);const v=f.getZoomRange();if(n){const p=t.chartId,F=f,b=m;n.port1.onmessage=()=>{if(!b.disposed&&!b.deviceLost){b.renderPending=!1;const x=b.performance,y=performance.now();try{x.frameTimestamps[x.frameTimestampIndex]=y,x.frameTimestampIndex=(x.frameTimestampIndex+1)%dt,x.frameTimestampCount<dt&&x.frameTimestampCount++,x.totalFrames++,x.lastFrameTime>0&&(y-x.lastFrameTime>lu*uu?(x.totalDroppedFrames++,x.consecutiveDroppedFrames++,x.lastDropTimestamp=y):x.consecutiveDroppedFrames=0),x.lastFrameTime=y,F.render();const h=performance.now()-y;x.lastCPUTime=h;const N=this.calculatePerformanceMetrics(x);this.emit({type:"performance-update",chartId:p,metrics:N})}catch(d){const[h,N]=rt(d);this.emitError(p,"RENDER_ERROR",h,"render",N)}}else b.deviceLost&&(b.renderPending=!1)}}const M=c.adapter?{adapter:"WebGPU Adapter",features:c.adapter.features?[...c.adapter.features]:[]}:void 0,I={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:I,initialZoomRange:v}),!m.renderPending&&!m.disposed&&n&&(m.renderPending=!0,n.port2.postMessage(null))}catch(s){if(n)try{n.port1.close(),n.port2.close()}catch{}const[o,c]=rt(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=Cs(n);i.coordinator.setOptions(r)}catch(i){const[r,s]=rt(i);this.emitError(t,"UNKNOWN",r,"setOption",s)}}handleAppendData(t,n,i,r,s){try{Ts(n,"in appendData"),Ps(r,"in appendData");const o=this.getChartInstance(t,"appendData"),c=Rs(i,r,s);o.coordinator.appendData(n,c)}catch(o){const[c,l]=rt(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];Ts(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=Rs(o.data,o.pointCount,o.stride);i.coordinator.appendData(o.seriesIndex,c)}}catch(i){const[r,s]=rt(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 m=u.limits.maxTextureDimension2D,f=Math.max(1,Math.min(c,m)),a=Math.max(1,Math.min(l,m));i.canvas.width=f,i.canvas.height=a;const v=i.gpuContext.canvasContext,M=i.gpuContext.preferredFormat;if(!v)throw new Error("Canvas context is not available");if(!M)throw new Error("Preferred texture format is not available");try{v.configure({device:u,format:M,alphaMode:i.gpuContext.alphaMode})}catch(I){throw new Error(`Failed to reconfigure canvas context: ${I instanceof Error?I.message:String(I)}`)}n.requestRender&&!i.state.renderPending&&!i.state.disposed&&(i.state.renderPending=!0,i.renderChannel.port2.postMessage(null))}catch(i){const[r,s]=rt(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]=rt(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]=rt(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]=rt(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]=rt(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]=rt(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+dt)%dt;let s=0;for(let l=1;l<n;l++){const u=(r+l-1)%dt,m=(r+l)%dt,f=i[m]-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+dt)%dt,s=new Array(n-1);let o=Number.POSITIVE_INFINITY,c=Number.NEGATIVE_INFINITY,l=0;for(let v=1;v<n;v++){const M=(r+v-1)%dt,I=(r+v)%dt,p=i[I]-i[M];s[v-1]=p,p<o&&(o=p),p>c&&(c=p),l+=p}const u=l/s.length;s.sort((v,M)=>v-M);const m=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[m],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=Js(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]=rt(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 Rs(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 As=new fu;As.onMessage(e=>{self.postMessage(e)}),self.onmessage=async e=>{try{await As.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"})}})();
799
+ //# sourceMappingURL=worker-entry-ij26I5nu.js.map