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