chartai 0.1.0 → 1.1.0

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.
Files changed (116) hide show
  1. package/dist/chart-library.d.ts +34 -146
  2. package/dist/chart-library.d.ts.map +1 -1
  3. package/dist/chart-library.js +411 -322
  4. package/dist/chart-library.min.js +1 -1
  5. package/dist/charts/area.d.ts +6 -0
  6. package/dist/charts/area.d.ts.map +1 -0
  7. package/dist/charts/area.js +65 -0
  8. package/dist/charts/area.min.js +1 -0
  9. package/dist/charts/bar.d.ts +11 -0
  10. package/dist/charts/bar.d.ts.map +1 -0
  11. package/dist/charts/bar.js +65 -0
  12. package/dist/charts/bar.min.js +1 -0
  13. package/dist/charts/boids.js +167 -0
  14. package/dist/charts/boids.min.js +18 -0
  15. package/dist/charts/candlestick.d.ts +21 -0
  16. package/dist/charts/candlestick.d.ts.map +1 -0
  17. package/dist/charts/candlestick.js +10 -0
  18. package/dist/charts/candlestick.min.js +1 -0
  19. package/dist/charts/experimental/baseline-area.js +70 -0
  20. package/dist/charts/experimental/baseline-area.min.js +1 -0
  21. package/dist/charts/experimental/bubble.js +48 -0
  22. package/dist/charts/experimental/bubble.min.js +1 -0
  23. package/dist/charts/experimental/error-band.js +111 -0
  24. package/dist/charts/experimental/error-band.min.js +1 -0
  25. package/dist/charts/experimental/heatmap.js +69 -0
  26. package/dist/charts/experimental/heatmap.min.js +1 -0
  27. package/dist/charts/experimental/histogram.js +139 -0
  28. package/dist/charts/experimental/histogram.min.js +7 -0
  29. package/dist/charts/experimental/ohlc.js +132 -0
  30. package/dist/charts/experimental/ohlc.min.js +32 -0
  31. package/dist/charts/experimental/step.js +67 -0
  32. package/dist/charts/experimental/step.min.js +1 -0
  33. package/dist/charts/experimental/waterfall.js +121 -0
  34. package/dist/charts/experimental/waterfall.min.js +7 -0
  35. package/dist/charts/line.d.ts +12 -0
  36. package/dist/charts/line.d.ts.map +1 -0
  37. package/dist/charts/line.js +62 -0
  38. package/dist/charts/line.min.js +1 -0
  39. package/dist/charts/scatter.d.ts +11 -0
  40. package/dist/charts/scatter.d.ts.map +1 -0
  41. package/dist/charts/scatter.js +46 -0
  42. package/dist/charts/scatter.min.js +1 -0
  43. package/dist/chunk-0eh4rzy9.min.js +2 -0
  44. package/dist/chunk-0jepamv9.js +7 -0
  45. package/dist/chunk-1ngxm8t2.js +129 -0
  46. package/dist/chunk-50bcv2hw.min.js +2 -0
  47. package/dist/chunk-5gtx3pza.js +9 -0
  48. package/dist/chunk-64q9a7nw.min.js +2 -0
  49. package/dist/chunk-831dem4f.js +4 -0
  50. package/dist/chunk-93yrr7er.js +35 -0
  51. package/dist/chunk-bbyt23tw.min.js +2 -0
  52. package/dist/chunk-cbydth3q.min.js +2 -0
  53. package/dist/chunk-cvtt04m6.min.js +2 -0
  54. package/dist/chunk-g2qmt43n.min.js +33 -0
  55. package/dist/chunk-gm0d4cgx.min.js +2 -0
  56. package/dist/chunk-mmsy3yqt.js +27 -0
  57. package/dist/chunk-n8ew0z0e.js +637 -0
  58. package/dist/chunk-t0kdz02m.js +129 -0
  59. package/dist/chunk-wdfq2fpx.min.js +2 -0
  60. package/dist/chunk-yabjrff2.js +11 -0
  61. package/dist/gpu-worker.js +630 -686
  62. package/dist/gpu-worker.min.js +1 -1
  63. package/dist/msg.d.ts +33 -0
  64. package/dist/msg.d.ts.map +1 -0
  65. package/dist/plugins/coords.d.ts +18 -0
  66. package/dist/plugins/coords.d.ts.map +1 -0
  67. package/dist/plugins/experimental/annotations.js +164 -0
  68. package/dist/plugins/experimental/annotations.min.js +1 -0
  69. package/dist/plugins/experimental/crosshair.js +82 -0
  70. package/dist/plugins/experimental/crosshair.min.js +1 -0
  71. package/dist/plugins/experimental/minimap.js +190 -0
  72. package/dist/plugins/experimental/minimap.min.js +1 -0
  73. package/dist/plugins/experimental/range-selector.js +220 -0
  74. package/dist/plugins/experimental/range-selector.min.js +1 -0
  75. package/dist/plugins/experimental/ruler.js +434 -0
  76. package/dist/plugins/experimental/ruler.min.js +59 -0
  77. package/dist/plugins/experimental/stats.js +229 -0
  78. package/dist/plugins/experimental/stats.min.js +8 -0
  79. package/dist/plugins/experimental/threshold.js +96 -0
  80. package/dist/plugins/experimental/threshold.min.js +1 -0
  81. package/dist/plugins/experimental/tooltip-pin.js +177 -0
  82. package/dist/plugins/experimental/tooltip-pin.min.js +1 -0
  83. package/dist/plugins/experimental/watermark.js +76 -0
  84. package/dist/plugins/experimental/watermark.min.js +1 -0
  85. package/dist/plugins/hover.d.ts +15 -2
  86. package/dist/plugins/hover.d.ts.map +1 -1
  87. package/dist/plugins/hover.js +75 -14
  88. package/dist/plugins/hover.min.js +1 -1
  89. package/dist/plugins/labels-panel.d.ts +4 -0
  90. package/dist/plugins/labels-panel.d.ts.map +1 -0
  91. package/dist/plugins/labels-panel.js +122 -0
  92. package/dist/plugins/labels-panel.min.js +1 -0
  93. package/dist/plugins/labels.d.ts +17 -2
  94. package/dist/plugins/labels.d.ts.map +1 -1
  95. package/dist/plugins/labels.js +11 -99
  96. package/dist/plugins/labels.min.js +1 -1
  97. package/dist/plugins/legend.d.ts +16 -0
  98. package/dist/plugins/legend.d.ts.map +1 -0
  99. package/dist/plugins/legend.js +353 -0
  100. package/dist/plugins/legend.min.js +37 -0
  101. package/dist/plugins/shared.d.ts +7 -0
  102. package/dist/plugins/shared.d.ts.map +1 -0
  103. package/dist/plugins/zoom.d.ts +10 -2
  104. package/dist/plugins/zoom.d.ts.map +1 -1
  105. package/dist/plugins/zoom.js +63 -62
  106. package/dist/plugins/zoom.min.js +1 -1
  107. package/dist/types.d.ts +187 -0
  108. package/dist/types.d.ts.map +1 -0
  109. package/dist/types.js +0 -0
  110. package/dist/types.min.js +0 -0
  111. package/dist/worker-inline.d.ts +1 -1
  112. package/dist/worker-inline.d.ts.map +1 -1
  113. package/package.json +11 -11
  114. package/readme.md +54 -42
  115. package/dist/chunk-bgfkgcmg.js +0 -25
  116. package/dist/chunk-cj3zanvs.min.js +0 -2
@@ -1 +1 @@
1
- import"./chunk-cj3zanvs.js";var m=256,X="struct Uniforms{width: f32,height: f32,viewMinX: f32,viewMaxX: f32,viewMinY: f32,viewMaxY: f32,pointCount: u32,isDark: f32,bgR: f32,bgG: f32,bgB: f32,pointRadius: f32,dataMinY: f32,dataMaxY: f32,dataMinX: f32,dataMaxX: f32,visibleStart: u32,visibleCount: u32,dispatchXCount: u32,maxSamplesPerPixel: u32,seriesCount: u32,_pad2: u32,_pad3: u32,_pad4: u32,};struct SeriesInfo{color: vec4f,visibleRange: vec2u,pointSize: f32,_pad: f32,};struct SeriesIndex{index: u32,_pad0: u32,_pad1: u32,_pad2: u32,};",w="fn lowerBound(val: f32,count: u32)-> u32{var lo = 0u;var hi = count;while(lo < hi){let mid =(lo + hi)/ 2u;if(dataX[mid] < val){lo = mid + 1u;}else{hi = mid;}}return lo;}";var C="struct Uniforms{width: f32,height: f32,viewMinX: f32,viewMaxX: f32,viewMinY: f32,viewMaxY: f32,pointCount: u32,isDark: f32,bgR: f32,bgG: f32,bgB: f32,pointRadius: f32,dataMinY: f32,dataMaxY: f32,dataMinX: f32,dataMaxX: f32,visibleStart: u32,visibleCount: u32,dispatchXCount: u32,maxSamplesPerPixel: u32,seriesCount: u32,_pad2: u32,_pad3: u32,_pad4: u32,};struct SeriesInfo{color: vec4f,visibleRange: vec2u,pointSize: f32,_pad: f32,};struct SeriesIndex{index: u32,_pad0: u32,_pad1: u32,_pad2: u32,};fn l(c:vec4f)->f32{return dot(c.rgb,vec3f(.299,.587,.114))+c.a*.25;}fn fxaa(u:vec2f,t:texture_2d<f32>,s:sampler)->vec4f{let r=1./vec2f(textureDimensions(t));let rM=textureSampleLevel(t,s,u,0.);let rN=textureSampleLevel(t,s,u+vec2f(0.,-r.y),0.);let rS=textureSampleLevel(t,s,u+vec2f(0.,r.y),0.);let rE=textureSampleLevel(t,s,u+vec2f(r.x,0.),0.);let rW=textureSampleLevel(t,s,u+vec2f(-r.x,0.),0.);let lM=l(rM);let lN=l(rN);let lS=l(rS);let lE=l(rE);let lW=l(rW);let mi=min(lM,min(min(lN,lS),min(lE,lW)));let ma=max(lM,max(max(lN,lS),max(lE,lW)));let ra=ma-mi;if(ra<max(.0833,ma*.166)){return rM;}let lNW=l(textureSampleLevel(t,s,u+vec2f(-r.x,-r.y),0.));let lNE=l(textureSampleLevel(t,s,u+vec2f(r.x,-r.y),0.));let lSW=l(textureSampleLevel(t,s,u+vec2f(-r.x,r.y),0.));let lSE=l(textureSampleLevel(t,s,u+vec2f(r.x,r.y),0.));let sB=min(.35,max(0.,abs((lN+lS+lE+lW)*.25-lM)/ra-.25)*1.33);let iH=abs(lNW+lNE-2.*lN)+abs(lW+lE-2.*lM)*2.+abs(lSW+lSE-2.*lS)>=abs(lNW+lSW-2.*lW)+abs(lN+lS-2.*lM)*2.+abs(lNE+lSE-2.*lE);let l1=select(lW,lN,iH);let l2=select(lE,lS,iH);let pD=abs(l2-lM)>abs(l1-lM);let sL=select(r.x,r.y,iH);let lA=.5*(select(l1,l2,pD)+lM);let gS=max(abs(l1-lM),abs(l2-lM))*.25;var eU=u;if(iH){eU.y+=select(-.5,.5,pD)*sL;}else{eU.x+=select(-.5,.5,pD)*sL;}let eS=select(vec2f(r.x,0.),vec2f(0.,r.y),iH);var uN=eU-eS;var uP=eU+eS;var eN=l(textureSampleLevel(t,s,uN,0.))-lA;var eP=l(textureSampleLevel(t,s,uP,0.))-lA;var dN=abs(eN)>=gS;var dP=abs(eP)>=gS;for(var i=1;i<8;i++){if(!dN){uN-=eS*1.5;eN=l(textureSampleLevel(t,s,uN,0.))-lA;dN=abs(eN)>=gS;}if(!dP){uP+=eS*1.5;eP=l(textureSampleLevel(t,s,uP,0.))-lA;dP=abs(eP)>=gS;}if(dN&&dP){break;}}let dtN=select(u.x-uN.x,u.y-uN.y,iH);let dtP=select(uP.x-u.x,uP.y-u.y,iH);let eB=select(0.,.5-min(dtN,dtP)/(dtN+dtP),(lM-lA<0.)!=(select(eP<0.,eN<0.,dtN<dtP)));var fU=u;let fL=max(eB,sB);if(iH){fU.y+=select(-1.,1.,pD)*fL*sL;}else{fU.x+=select(-1.,1.,pD)*fL*sL;}return textureSampleLevel(t,s,fU,0.);}@group(0)@binding(0)var<uniform> u: Uniforms;@group(0)@binding(1)var inputTex: texture_2d<f32>;@group(0)@binding(2)var samp: sampler;struct VertexOutput{@builtin(position)pos: vec4f,@location(0)uv: vec2f,};@vertex fn vs(@builtin(vertex_index)vi: u32)-> VertexOutput{var positions = array<vec2f,4>(vec2f(-1.0,-1.0),vec2f(1.0,-1.0),vec2f(-1.0,1.0),vec2f(1.0,1.0));var uvs = array<vec2f,4>(vec2f(0.0,1.0),vec2f(1.0,1.0),vec2f(0.0,0.0),vec2f(1.0,0.0));var out: VertexOutput;out.pos = vec4f(positions[vi],0.0,1.0);out.uv = uvs[vi];return out;}@fragment fn fs(in: VertexOutput)-> @location(0)vec4f{return fxaa(in.uv,inputTex,samp);}";var y=`${X}struct LineData{screenX: f32,minScreenY: f32,maxScreenY: f32,valid: f32,};@group(0)@binding(0)var<uniform> u: Uniforms;@group(0)@binding(1)var<storage,read> dataX: array<f32>;@group(0)@binding(2)var<storage,read> dataY: array<f32>;@group(0)@binding(3)var<storage,read_write> lineData: array<LineData>;@group(0)@binding(4)var<storage,read> allSeries: array<SeriesInfo>;${w}@compute @workgroup_size(${m})fn main(@builtin(global_invocation_id)id: vec3u){let outputIdx = id.x;let maxCols = u32(u.width);let count = u.pointCount;if(outputIdx >= maxCols || count == 0u){if(outputIdx < maxCols){lineData[outputIdx] = LineData(-1.0,-1.0,-1.0,0.0);}return;}let viewRangeX = u.viewMaxX - u.viewMinX;let viewRangeY = u.viewMaxY - u.viewMinY;if(viewRangeX < 0.0001 || viewRangeY < 0.0001){lineData[outputIdx] = LineData(-1.0,-1.0,-1.0,0.0);return;}let relPx = f32(outputIdx);let pixelMinX = u.viewMinX +(relPx / u.width)* viewRangeX;let pixelMaxX = u.viewMinX +((relPx + 1.0)/ u.width)* viewRangeX;let startIdx = lowerBound(pixelMinX,count);var endIdx = lowerBound(pixelMaxX,count);endIdx = min(endIdx,count);let centerX =(pixelMinX + pixelMaxX)* 0.5;if(startIdx >= endIdx){var bestIdx = startIdx;if(startIdx > 0u && startIdx < count){let distPrev = abs(dataX[startIdx - 1u] - centerX);let distCurr = abs(dataX[startIdx] - centerX);if(distPrev < distCurr){bestIdx = startIdx - 1u;}}else if(startIdx >= count && count > 0u){bestIdx = count - 1u;}if(bestIdx >= count){lineData[outputIdx] = LineData(-1.0,-1.0,-1.0,0.0);return;}let y = dataY[bestIdx];let normY =(y - u.viewMinY)/ viewRangeY;let screenY = 1.0 - normY;let normX =(dataX[bestIdx] - u.viewMinX)/ viewRangeX;let screenX = normX;lineData[outputIdx] = LineData(screenX,screenY,screenY,1.0);return;}var dataMinY = dataY[startIdx];var dataMaxY = dataY[startIdx];let rangeCount = endIdx - startIdx;let maxSamples = u.maxSamplesPerPixel;if(maxSamples > 1u && rangeCount > maxSamples){let stride = f32(rangeCount - 1u)/ f32(maxSamples - 1u);for(var s = 0u;s < maxSamples;s++){let idx = startIdx + u32(f32(s)* stride);if(idx < endIdx){let y = dataY[idx];dataMinY = min(dataMinY,y);dataMaxY = max(dataMaxY,y);}}let lastY = dataY[endIdx - 1u];dataMinY = min(dataMinY,lastY);dataMaxY = max(dataMaxY,lastY);}else{for(var i = startIdx + 1u;i < endIdx;i++){let y = dataY[i];dataMinY = min(dataMinY,y);dataMaxY = max(dataMaxY,y);}}let normX =(centerX - u.viewMinX)/ viewRangeX;let screenX = normX;let normMaxY =(dataMaxY - u.viewMinY)/ viewRangeY;let normMinY =(dataMinY - u.viewMinY)/ viewRangeY;let minScreenY = 1.0 - normMaxY;let maxScreenY = 1.0 - normMinY;lineData[outputIdx] = LineData(screenX,minScreenY,maxScreenY,1.0);}`,L=`${X}struct LineData{screenX: f32,minScreenY: f32,maxScreenY: f32,valid: f32,};@group(0)@binding(0)var<uniform> u: Uniforms;@group(0)@binding(1)var<storage,read> lineData: array<LineData>;@group(0)@binding(2)var<storage,read> allSeries: array<SeriesInfo>;struct VertexOutput{@builtin(position)pos: vec4f,@location(0)alpha: f32,@location(1)@interpolate(flat)seriesIdx: u32,};@vertex fn vs(@builtin(vertex_index)vi: u32,@builtin(instance_index)series_idx: u32)-> VertexOutput{var out: VertexOutput;out.seriesIdx = series_idx;let maxCols = u32(u.width);let segIdx = vi / 2u;let endpoint = vi % 2u;if(segIdx < maxCols){let d = lineData[segIdx];let y = select(d.maxScreenY,d.minScreenY,endpoint == 0u);out.pos = vec4f(d.screenX * 2.0 - 1.0,1.0 - y * 2.0,0.0,d.valid);out.alpha = d.valid;}else{let connIdx = segIdx - maxCols;if(connIdx + 1u >= maxCols){out.pos = vec4f(0.0,0.0,0.0,0.0);out.alpha = 0.0;return out;}let d0 = lineData[connIdx];let d1 = lineData[connIdx + 1u];let segValid = min(d0.valid,d1.valid);if(endpoint == 0u){let midY =(d0.minScreenY + d0.maxScreenY)* 0.5;out.pos = vec4f(d0.screenX * 2.0 - 1.0,1.0 - midY * 2.0,0.0,segValid);}else{let midY =(d1.minScreenY + d1.maxScreenY)* 0.5;out.pos = vec4f(d1.screenX * 2.0 - 1.0,1.0 - midY * 2.0,0.0,segValid);}out.alpha = segValid;}return out;}@fragment fn fs(in: VertexOutput)-> @location(0)vec4f{if(in.alpha < 0.1){discard;}let series = allSeries[in.seriesIdx];return vec4f(series.color.rgb,1.0);}`;var D=`${X}@group(0)@binding(0)var<uniform> u: Uniforms;@group(0)@binding(1)var<storage,read> dataX: array<f32>;@group(0)@binding(2)var<storage,read> dataY: array<f32>;@group(0)@binding(3)var outputTex: texture_storage_2d<rgba8unorm,write>;@group(0)@binding(4)var<storage,read> allSeries: array<SeriesInfo>;@group(0)@binding(5)var<uniform> seriesIdx: SeriesIndex;@compute @workgroup_size(${m})fn main(@builtin(global_invocation_id)id: vec3u){let series = allSeries[seriesIdx.index];let visStart = series.visibleRange.x;let visCount = series.visibleRange.y;let localIdx = id.y * u.dispatchXCount + id.x;if(localIdx >= visCount){return;}let idx = visStart + localIdx;let count = u.pointCount;if(idx >= count){return;}let x = dataX[idx];let y = dataY[idx];if(y < u.viewMinY || y > u.viewMaxY){return;}let width = u32(u.width);let height = u32(u.height);let rangeX = u.viewMaxX - u.viewMinX;let rangeY = u.viewMaxY - u.viewMinY;if(rangeX < 0.0001 || rangeY < 0.0001){return;}let normX =(x - u.viewMinX)/ rangeX;let normY =(y - u.viewMinY)/ rangeY;let screenX = normX;let screenY = 1.0 - normY;let pixelX = i32(screenX * f32(width));let pixelY = i32(screenY * f32(height));if(idx > visStart){let prevX = dataX[idx - 1u];let prevY = dataY[idx - 1u];let prevNormX =(prevX - u.viewMinX)/ rangeX;let prevNormY =(prevY - u.viewMinY)/ rangeY;let prevPx = i32(prevNormX * f32(width));let prevPy = i32((1.0 - prevNormY)* f32(height));if(pixelX == prevPx && pixelY == prevPy){return;}}let iWidth = i32(width);let iHeight = i32(height);if(pixelX < 0 || pixelX >= iWidth){return;}if(pixelY < 0 || pixelY >= iHeight){return;}let color = series.color;let radius = i32(series.pointSize);for(var dy = -radius;dy <= radius;dy++){for(var dx = -radius;dx <= radius;dx++){if(dx * dx + dy * dy > radius * radius){continue;}let px = pixelX + dx;let py = pixelY + dy;if(px >= 0 && px < iWidth && py >= 0 && py < iHeight){textureStore(outputTex,vec2i(px,py),color);}}}}`;var H=`${X}struct BarData{screenX: f32,minY: f32,maxY: f32,barWidth: f32,};@group(0)@binding(0)var<uniform> u: Uniforms;@group(0)@binding(1)var<storage,read> dataX: array<f32>;@group(0)@binding(2)var<storage,read> dataY: array<f32>;@group(0)@binding(3)var<storage,read_write> barData: array<BarData>;@group(0)@binding(4)var<storage,read> allSeries: array<SeriesInfo>;@group(0)@binding(5)var<uniform> seriesIdx: SeriesIndex;${w}fn barHalfWidth(idx: u32,count: u32)-> f32{if(count <= 1u){return(u.viewMaxX - u.viewMinX)* 0.4;}var spacing: f32;if(idx == 0u){spacing = dataX[1u] - dataX[0u];}else if(idx >= count - 1u){spacing = dataX[count - 1u] - dataX[count - 2u];}else{spacing = min(dataX[idx + 1u] - dataX[idx],dataX[idx] - dataX[idx - 1u]);}let seriesCount = max(1u,u.seriesCount);return(spacing * 0.4)/ f32(seriesCount);}@compute @workgroup_size(${m})fn main(@builtin(global_invocation_id)id: vec3u){let outputIdx = id.x;let maxCols = u32(u.width);let count = u.pointCount;if(outputIdx >= maxCols || count == 0u){if(outputIdx < maxCols){barData[outputIdx] = BarData(0.0,0.0,0.0,0.0);}return;}let viewRangeX = u.viewMaxX - u.viewMinX;let viewRangeY = u.viewMaxY - u.viewMinY;if(viewRangeX < 0.0001 || viewRangeY < 0.0001){barData[outputIdx] = BarData(0.0,0.0,0.0,0.0);return;}let relPx = f32(outputIdx);let pixelMinX = u.viewMinX +(relPx / u.width)* viewRangeX;let pixelMaxX = u.viewMinX +((relPx + 1.0)/ u.width)* viewRangeX;let startIdx = lowerBound(pixelMinX,count);var endIdx = lowerBound(pixelMaxX,count);endIdx = min(endIdx,count);let centerX =(pixelMinX + pixelMaxX)* 0.5;let onePixel = 1.0 / u.width;if(startIdx >= endIdx){var hit = false;var bestX: f32 = 0.0;var bestY: f32 = 0.0;var bestHW: f32 = 0.0;var bestDist: f32 = 1e10;if(startIdx < count){let bx = dataX[startIdx];let hw = barHalfWidth(startIdx,count);if(pixelMinX < bx + hw && pixelMaxX > bx - hw){let d = abs(bx - centerX);bestX = bx;bestY = dataY[startIdx];bestHW = hw;bestDist = d;hit = true;}}if(startIdx > 0u){let prev = startIdx - 1u;let bx = dataX[prev];let hw = barHalfWidth(prev,count);if(pixelMinX < bx + hw && pixelMaxX > bx - hw){let d = abs(bx - centerX);if(d < bestDist){bestX = bx;bestY = dataY[prev];bestHW = hw;bestDist = d;}hit = true;}}if(!hit){barData[outputIdx] = BarData(0.0,0.0,0.0,0.0);return;}let seriesCount = max(1u,u.seriesCount);let barOffset =(f32(seriesIdx.index)- f32(seriesCount - 1u)* 0.5)*(bestHW * 2.0);let offsetX = bestX + barOffset;let normX =(offsetX - u.viewMinX)/ viewRangeX;let fullWidth = bestHW * 2.0 / viewRangeX;let gapSize = max(onePixel,fullWidth * 0.05);let bw = max(fullWidth - gapSize,onePixel);barData[outputIdx] = BarData(normX,bestY,bestY,bw);return;}var dataMinY = dataY[startIdx];var dataMaxY = dataY[startIdx];let rangeCount = endIdx - startIdx;let maxSamples = u.maxSamplesPerPixel;if(maxSamples > 0u && rangeCount > maxSamples){let stride = f32(rangeCount - 1u)/ f32(maxSamples - 1u);for(var s = 0u;s < maxSamples;s++){let idx = startIdx + u32(f32(s)* stride);if(idx < endIdx){let y = dataY[idx];dataMinY = min(dataMinY,y);dataMaxY = max(dataMaxY,y);}}let lastY = dataY[endIdx - 1u];dataMinY = min(dataMinY,lastY);dataMaxY = max(dataMaxY,lastY);}else{for(var i = startIdx + 1u;i < endIdx;i++){let y = dataY[i];dataMinY = min(dataMinY,y);dataMaxY = max(dataMaxY,y);}}let hw = barHalfWidth(startIdx,count);let fullWidth = hw * 2.0 / viewRangeX;let gapSize = max(onePixel,fullWidth * 0.05);let bw = max(fullWidth - gapSize,onePixel);let seriesCount = max(1u,u.seriesCount);let barOffset =(f32(seriesIdx.index)- f32(seriesCount - 1u)* 0.5)*(hw * 2.0);let dataX_centered = dataX[startIdx] + barOffset;let normX =(dataX_centered - u.viewMinX)/ viewRangeX;barData[outputIdx] = BarData(normX,dataMinY,dataMaxY,bw);}`,U=`${X}struct BarData{screenX: f32,minY: f32,maxY: f32,barWidth: f32,};@group(0)@binding(0)var<uniform> u: Uniforms;@group(0)@binding(1)var<storage,read> barData: array<BarData>;@group(0)@binding(2)var<storage,read> allSeries: array<SeriesInfo>;struct VertexOutput{@builtin(position)pos: vec4f,@location(0)normY: f32,@location(1)@interpolate(flat)seriesIdx: u32,};@vertex fn vs(@builtin(vertex_index)vi: u32,@builtin(instance_index)series_idx: u32)-> VertexOutput{var out: VertexOutput;out.seriesIdx = series_idx;let maxCols = u32(u.width);let colIdx = vi / 6u;let vertexType = vi % 6u;if(colIdx >= maxCols){out.pos = vec4f(0.0,0.0,0.0,0.0);out.normY = 0.0;return out;}let bd = barData[colIdx];if(bd.barWidth <= 0.0){out.pos = vec4f(0.0,0.0,0.0,0.0);out.normY = 0.0;return out;}let viewRangeY = u.viewMaxY - u.viewMinY;let safeRangeY = select(viewRangeY,1.0,viewRangeY < 0.0001);let normMinY =(min(bd.minY,0.0)- u.viewMinY)/ safeRangeY;let normMaxY =(max(bd.maxY,0.0)- u.viewMinY)/ safeRangeY;let top = 1.0 - normMaxY;let bottom = 1.0 - normMinY;let halfW = bd.barWidth * 0.5;let left = bd.screenX - halfW;let right = bd.screenX + halfW;var positions = array<vec2f,6>(vec2f(left,bottom),vec2f(right,bottom),vec2f(left,top),vec2f(left,top),vec2f(right,bottom),vec2f(right,top));let screenPos = positions[vertexType];let clipX = screenPos.x * 2.0 - 1.0;let clipY = 1.0 - screenPos.y * 2.0;out.pos = vec4f(clipX,clipY,0.0,1.0);out.normY = normMaxY;return out;}@fragment fn fs(in: VertexOutput)-> @location(0)vec4f{let series = allSeries[in.seriesIdx];return vec4f(series.color.rgb,0.85);}`;var t,R,v=new Map,S=!1,p={},a={},N=0,P=0,_=!1,O=null,W=new ArrayBuffer(112),j=new Float32Array(W),F=new Uint32Array(W),A,q=(e,i)=>{if(!e.seriesStorageBuffer||e.series.length===0)return;let n=new Float32Array(e.series.length*8),l=new Uint32Array(n.buffer);for(let u=0;u<e.series.length;u++){let o=e.series[u],x=u*8;n[x+0]=o.colorR,n[x+1]=o.colorG,n[x+2]=o.colorB,n[x+3]=1,l[x+4]=o.visibleStart,l[x+5]=o.visibleCount,n[x+6]=i?.[u]??e.pointSize,n[x+7]=0}t.queue.writeBuffer(e.seriesStorageBuffer,0,n)},E=(e,i,n,l)=>{let u=j,o=F,x=e.maxX-e.minX,f=e.maxY-e.minY,Y=e.bgColor??(S?[0.11,0.11,0.12]:[0.98,0.98,0.98]);u.set([e.width,e.height,e.minX+e.panX*x,e.minX+e.panX*x+x/e.zoomX,e.minY+e.panY*f,e.minY+e.panY*f+f/e.zoomY],0),o[6]=i.pointCount,u.set([S?1:0,...Y,l??e.pointSize,e.minY,e.maxY,e.minX,e.maxX],7),o[16]=i.visibleStart,o[17]=i.visibleCount,o[18]=0,o[19]=e.maxSamplesPerPixel,o[20]=e.series.length,t.queue.writeBuffer(e.uniformBuffer,0,W)},T=(e,i,n,l,u)=>{let o=t.createShaderModule({code:i}),x=t.createShaderModule({code:n});a[`${e}Compute`]=t.createComputePipeline({layout:t.createPipelineLayout({bindGroupLayouts:[p[`${e}Compute`]]}),compute:{module:o,entryPoint:"main"}}),a[`${e}Render`]=t.createRenderPipeline({layout:t.createPipelineLayout({bindGroupLayouts:[p[`${e}Render`]]}),vertex:{module:x,entryPoint:"vs"},fragment:{module:x,entryPoint:"fs",targets:[{format:"rgba8unorm",blend:u}]},primitive:{topology:l}})};async function J(){if(t)return!0;if(!navigator.gpu)return postMessage({type:"error",message:"WebGPU not supported"}),!1;let e=await navigator.gpu.requestAdapter();if(!e)return postMessage({type:"error",message:"No GPU adapter found"}),!1;return t=await e.requestDevice({requiredLimits:{maxBufferSize:e.limits.maxBufferSize,maxStorageBufferBindingSize:e.limits.maxStorageBufferBindingSize}}),R=navigator.gpu.getPreferredCanvasFormat(),t.lost.then((i)=>{postMessage({type:"error",message:`GPU device lost: ${i.reason} - ${i.message}`})}),K(),postMessage({type:"gpu-ready"}),!0}function K(){p.lineCompute=t.createBindGroupLayout({entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:3,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}},{binding:4,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}}]}),p.lineRender=t.createBindGroupLayout({entries:[{binding:0,visibility:GPUShaderStage.VERTEX|GPUShaderStage.FRAGMENT,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.VERTEX,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.FRAGMENT,buffer:{type:"read-only-storage"}}]}),p.scatterCompute=t.createBindGroupLayout({entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:3,visibility:GPUShaderStage.COMPUTE,storageTexture:{access:"write-only",format:"rgba8unorm"}},{binding:4,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:5,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}}]}),p.fxaaRender=t.createBindGroupLayout({entries:[{binding:0,visibility:GPUShaderStage.VERTEX|GPUShaderStage.FRAGMENT,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:"float"}},{binding:2,visibility:GPUShaderStage.FRAGMENT,sampler:{}}]}),p.boxCompute=t.createBindGroupLayout({entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:3,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}},{binding:4,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:5,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}}]}),p.boxRender=p.lineRender,T("line",y,L,"line-list",{color:{srcFactor:"src-alpha",dstFactor:"one-minus-src-alpha"},alpha:{srcFactor:"one",dstFactor:"one-minus-src-alpha"}}),T("box",H,U,"triangle-list",{color:{srcFactor:"src-alpha",dstFactor:"one-minus-src-alpha"},alpha:{srcFactor:"one",dstFactor:"one-minus-src-alpha"}});let e=t.createShaderModule({code:D});a.scatterCompute=t.createComputePipeline({layout:t.createPipelineLayout({bindGroupLayouts:[p.scatterCompute]}),compute:{module:e,entryPoint:"main"}});let i=t.createShaderModule({code:C});a.fxaaRender=t.createRenderPipeline({layout:t.createPipelineLayout({bindGroupLayouts:[p.fxaaRender]}),vertex:{module:i,entryPoint:"vs"},fragment:{module:i,entryPoint:"fs",targets:[{format:R}]},primitive:{topology:"triangle-strip"}}),A=t.createSampler({magFilter:"linear",minFilter:"linear"})}function Q(e,i,n,l=3,u=0,o=null){let x=t?i.getContext("webgpu"):null;if(!x){postMessage({type:"error",message:`Failed to initialize WebGPU context: ${e}`});return}try{x.configure({device:t,format:R,alphaMode:"premultiplied"})}catch(M){postMessage({type:"error",message:`Failed to configure WebGPU context: ${e}`,err:M.toString()});return}let f=t.limits.maxTextureDimension2D,Y=Math.min(Math.floor(Number(i.width)||800),f),d=Math.min(Math.floor(Number(i.height)||400),f),g=t.createBuffer({size:112,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST}),I={id:e,canvas:i,ctx:x,type:n,visible:!0,pointSize:l,maxSamplesPerPixel:u,series:[],uniformBuffer:g,seriesStorageBuffer:null,outputTexture:null,outputTextureView:null,fxaaBindGroup:null,width:Y,height:d,panX:0,panY:0,zoomX:1,zoomY:1,minX:0,maxX:1,minY:0,maxY:1,bgColor:o,dirty:!0};try{$(I)}catch(M){postMessage({type:"error",message:`Cannot create chart ${e}: resource creation failed - ${M}`});return}v.set(e,I),postMessage({type:"chart-registered",id:e})}function $(e){if(e.outputTexture)e.outputTexture.destroy();let i=Math.max(1,e.width),n=Math.max(1,e.height),l=e.type==="scatter"?GPUTextureUsage.STORAGE_BINDING|GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.RENDER_ATTACHMENT:GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.RENDER_ATTACHMENT;e.outputTexture=t.createTexture({size:[i,n],format:"rgba8unorm",usage:l}),e.outputTextureView=e.outputTexture.createView(),e.fxaaBindGroup=t.createBindGroup({layout:p.fxaaRender,entries:[{binding:0,resource:{buffer:e.uniformBuffer}},{binding:1,resource:e.outputTextureView},{binding:2,resource:A}]})}function V(e,i,n){if(!e.seriesStorageBuffer)return;if(e.type==="scatter"){if(i.seriesIndexBuffer)i.seriesIndexBuffer.destroy();i.seriesIndexBuffer=t.createBuffer({size:16,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST});let l=new Uint32Array([n,0,0,0]);t.queue.writeBuffer(i.seriesIndexBuffer,0,l),i.computeBindGroup=t.createBindGroup({layout:p.scatterCompute,entries:[{binding:0,resource:{buffer:e.uniformBuffer}},{binding:1,resource:{buffer:i.dataX}},{binding:2,resource:{buffer:i.dataY}},{binding:3,resource:e.outputTextureView},{binding:4,resource:{buffer:e.seriesStorageBuffer}},{binding:5,resource:{buffer:i.seriesIndexBuffer}}]})}else{let l=e.type==="line"?p.lineCompute:p.boxCompute,u=e.type==="line"?p.lineRender:p.boxRender;if(i.lineBuffer)i.lineBuffer.destroy();if(i.lineBuffer=t.createBuffer({size:e.width*16,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.VERTEX}),e.type==="box"){if(i.seriesIndexBuffer)i.seriesIndexBuffer.destroy();i.seriesIndexBuffer=t.createBuffer({size:16,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST});let x=new Uint32Array([n,0,0,0]);t.queue.writeBuffer(i.seriesIndexBuffer,0,x)}let o=[{binding:0,resource:{buffer:e.uniformBuffer}},{binding:1,resource:{buffer:i.dataX}},{binding:2,resource:{buffer:i.dataY}},{binding:3,resource:{buffer:i.lineBuffer}},{binding:4,resource:{buffer:e.seriesStorageBuffer}}];if(e.type==="box"&&i.seriesIndexBuffer)o.push({binding:5,resource:{buffer:i.seriesIndexBuffer}});i.computeBindGroup=t.createBindGroup({layout:l,entries:o}),i.renderBindGroup=t.createBindGroup({layout:u,entries:[{binding:0,resource:{buffer:e.uniformBuffer}},{binding:1,resource:{buffer:i.lineBuffer}},{binding:2,resource:{buffer:e.seriesStorageBuffer}}]})}}function Z(e,i,n){if(i===e.width&&n===e.height)return;if(i<=0||n<=0)return;e.width=i,e.height=n,e.canvas.width=i,e.canvas.height=n;try{$(e);for(let l=0;l<e.series.length;l++)V(e,e.series[l],l)}catch(l){postMessage({type:"error",message:`resize failed for chart ${e.id}: ${l}`})}}function G(e,i,n){let l=v.get(e);if(!l||!t){if(!l)postMessage({type:"error",message:`update-series failed: chart ${e} not found`});return}try{l.minX=n.minX,l.maxX=n.maxX,l.minY=n.minY,l.maxY=n.maxY;for(let u of l.series){if(u.dataX.destroy(),u.dataY.destroy(),u.lineBuffer)u.lineBuffer.destroy();if(u.seriesIndexBuffer)u.seriesIndexBuffer.destroy()}if(l.series=[],l.seriesStorageBuffer)l.seriesStorageBuffer.destroy();if(i.length>0)l.seriesStorageBuffer=t.createBuffer({size:Math.max(32,i.length*32),usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST});for(let u of i){let o=t.createBuffer({size:Math.max(16,u.dataX.byteLength),usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST}),x=t.createBuffer({size:Math.max(16,u.dataY.byteLength),usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST});t.queue.writeBuffer(o,0,u.dataX),t.queue.writeBuffer(x,0,u.dataY);let f={label:u.label,colorR:u.colorR,colorG:u.colorG,colorB:u.colorB,dataX:o,dataY:x,lineBuffer:null,seriesIndexBuffer:null,pointCount:u.dataX.length,visibleStart:0,visibleCount:u.dataX.length,computeBindGroup:null,renderBindGroup:null};l.series.push(f)}for(let u=0;u<l.series.length;u++)V(l,l.series[u],u);postMessage({type:"bounds-update",id:e,...n})}catch(u){postMessage({type:"error",message:`update-series failed for chart ${e}: ${u}`})}}function z(e){if(!e.ctx)return;if(e.width===0||e.height===0)return;if(e.series.length===0)return;let i;try{i=e.ctx.getCurrentTexture().createView()}catch{return}k(e,i)}function k(e,i){let n=t.createCommandEncoder(),l;if(e.type==="scatter"){let f=e.width*e.height*4;l=e.series.map((Y)=>{let d=Math.max(1,Y.visibleCount),g=Math.PI*e.pointSize*e.pointSize;if(d*g>f)return Math.max(1,Math.sqrt(f/(d*Math.PI)));return e.pointSize})}if(q(e,l),e.series.length>0)E(e,e.series[0],0);n.beginRenderPass({colorAttachments:[{view:e.outputTextureView,loadOp:"clear",storeOp:"store",clearValue:{r:0,g:0,b:0,a:0}}]}).end();for(let x=0;x<e.series.length;x++){let f=e.series[x];if(f.pointCount===0)continue;if(e.type==="scatter"){let d=Math.ceil(f.visibleCount/m),g=Math.min(d,65535),I=Math.ceil(d/65535),M=new Uint32Array([g*m]);t.queue.writeBuffer(e.uniformBuffer,72,M);let r=n.beginComputePass();r.setPipeline(a.scatterCompute),r.setBindGroup(0,f.computeBindGroup),r.dispatchWorkgroups(g,I),r.end()}else{E(e,f,x);let Y=e.type==="line"?a.lineCompute:a.boxCompute,d=n.beginComputePass();d.setPipeline(Y),d.setBindGroup(0,f.computeBindGroup),d.dispatchWorkgroups(Math.ceil(e.width/m)),d.end()}}if(e.type!=="scatter"){let x=e.type==="line"?a.lineRender:a.boxRender,f=e.type==="line"?Math.max(0,e.width*4-2):e.width*6,Y=n.beginRenderPass({colorAttachments:[{view:e.outputTextureView,loadOp:"load",storeOp:"store"}]});Y.setPipeline(x);for(let d=0;d<e.series.length;d++){let g=e.series[d];if(g.pointCount===0)continue;Y.setBindGroup(0,g.renderBindGroup),Y.draw(f,1,0,d)}Y.end()}let o=n.beginRenderPass({colorAttachments:[{view:i,loadOp:"clear",storeOp:"store",clearValue:{r:0,g:0,b:0,a:0}}]});if(o.setPipeline(a.fxaaRender),e.fxaaBindGroup)o.setBindGroup(0,e.fxaaBindGroup);o.draw(4),o.end(),t.queue.submit([n.finish()])}function s(){if(!_)_=!0,requestAnimationFrame(ee)}function b(e){if(e.dirty=!0,e.visible)s()}function B(){let e=!1;for(let i of v.values())if(i.dirty=!0,i.visible)e=!0;if(e)s()}function c(){let e=0;for(let i of v.values())if(i.visible&&i.width>0)e++;return e}function h(){if(O!==null)return;O=setInterval(()=>{postMessage({type:"stats",fps:N,renderMs:P,totalCharts:v.size,activeCharts:c()}),N=0},1000)}function ee(){_=!1;let e=performance.now();for(let i of v.values())if(i.visible&&i.dirty&&i.width>0)z(i),i.dirty=!1;P=performance.now()-e,N++}self.onmessage=async(e)=>{let{type:i,...n}=e.data;switch(i){case"init":if(S=n.isDark||!1,await J())h();break;case"theme":S=n.isDark,B();break;case"register-chart":Q(n.id,n.canvas,n.chartType||"scatter",n.pointSize??3,n.maxSamplesPerPixel??100,n.bgColor??null);{let l=v.get(n.id);if(l)b(l)}break;case"unregister-chart":{let l=v.get(n.id);if(l){try{l.ctx.unconfigure()}catch{}if(l.uniformBuffer.destroy(),l.seriesStorageBuffer)l.seriesStorageBuffer.destroy();if(l.outputTexture)l.outputTexture.destroy();for(let u of l.series){if(u.dataX.destroy(),u.dataY.destroy(),u.lineBuffer)u.lineBuffer.destroy();if(u.seriesIndexBuffer)u.seriesIndexBuffer.destroy()}v.delete(n.id)}postMessage({type:"chart-unregistered",id:n.id});break}case"set-point-size":{let l=v.get(n.id);if(l)l.pointSize=Math.max(1,Math.min(8,n.pointSize)),b(l);break}case"set-max-samples":{let l=v.get(n.id);if(l)l.maxSamplesPerPixel=Math.max(0,n.maxSamplesPerPixel|0),b(l);break}case"set-style":{let l=v.get(n.id);if(l){if(n.bgColor!==void 0)l.bgColor=n.bgColor;b(l)}break}case"update-series":{G(n.id,n.series,n.bounds);let l=v.get(n.id);if(l)b(l);break}case"set-visibility":{let l=v.get(n.id);if(l){if(l.visible=n.visible,n.visible&&l.dirty)s()}break}case"view-transform":{let l=v.get(n.id);if(l)l.panX=n.panX,l.panY=n.panY,l.zoomX=Math.max(0.1,Math.min(1e6,n.zoomX)),l.zoomY=Math.max(0.1,Math.min(1e6,n.zoomY)),b(l);break}case"resize":{let l=v.get(n.id);if(l&&n.width>0&&n.height>0)Z(l,n.width,n.height),b(l);break}case"batch-view-transform":{let l=Math.max(0.1,Math.min(1e6,n.zoomX)),u=Math.max(0.1,Math.min(1e6,n.zoomY));for(let o of n.transforms){let x=v.get(o.id);if(x)x.panX=n.panX,x.panY=n.panY,x.zoomX=l,x.zoomY=u,x.dirty=!0}s();break}case"sync-view":for(let l of v.values())l.panX=n.panX,l.panY=n.panY,l.zoomX=n.zoomX,l.zoomY=n.zoomY;B();break}};
1
+ import{i as m}from"./chunk-64q9a7nw.js";import{r as H,s as V}from"./chunk-wdfq2fpx.js";import"./chunk-bbyt23tw.js";var W,k,X=new Map,P=new Map,R=!1,y,z,M,C=0,x=0,B=!1,u=null,E=new ArrayBuffer(64),f=new Float32Array(E),n=new Uint32Array(E);function v(j){let K=GPUBufferUsage.COPY_DST;for(let J of j)switch(J.toUpperCase()){case"STORAGE":K|=GPUBufferUsage.STORAGE;break;case"VERTEX":K|=GPUBufferUsage.VERTEX;break;case"UNIFORM":K|=GPUBufferUsage.UNIFORM;break;case"COPY_SRC":K|=GPUBufferUsage.COPY_SRC;break;case"COPY_DST":K|=GPUBufferUsage.COPY_DST;break;case"INDEX":K|=GPUBufferUsage.INDEX;break;case"INDIRECT":K|=GPUBufferUsage.INDIRECT;break}return K}function d(j,K,J){let q=J==="compute"?GPUShaderStage.COMPUTE:GPUShaderStage.VERTEX|GPUShaderStage.FRAGMENT;if(j==="uniforms"||j==="custom-uniforms"||j==="series-index")return{visibility:q,buffer:{type:"uniform"}};if(j==="render-target"){if(K)return{visibility:GPUShaderStage.COMPUTE,storageTexture:{access:"write-only",format:"rgba8unorm"}};return{visibility:q,texture:{sampleType:"float"}}}if(K)return{visibility:q,buffer:{type:"storage"}};return{visibility:q,buffer:{type:"read-only-storage"}}}function S(j,K,J,q,N){switch(j){case"uniforms":return{buffer:J.uniformBuffer};case"custom-uniforms":return{buffer:J.customUniformBuffer};case"series-info":return{buffer:J.seriesStorageBuffer};case"render-target":return J.outputTextureView;case"x-data":return{buffer:q.dataX};case"y-data":return{buffer:q.dataY};case"series-index":return{buffer:q.seriesIndexBuffer}}if(j.endsWith("-data")){let Q=j.slice(0,-5);return{buffer:q.extraBuffers.get(Q)}}if(N.config.bufferDefs.find((Q)=>Q.name===j)?.perSeries)return{buffer:q.seriesBuffers.get(j)};return{buffer:J.chartBuffers.get(j)}}function i(j){let K=new Map,J=new Map;for(let q=0;q<j.passes.length;q++){let N=j.passes[q],O=N.bindings.map((G)=>({binding:G.binding,...d(G.source,G.write,N.type)})),Q=W.createBindGroupLayout({entries:O});J.set(`pass-${q}`,Q);let $=W.createPipelineLayout({bindGroupLayouts:[Q]}),Z=W.createShaderModule({code:j.shaders[N.shader]});if(N.type==="compute")K.set(`pass-${q}`,W.createComputePipeline({layout:$,compute:{module:Z,entryPoint:"main"}}));else K.set(`pass-${q}`,W.createRenderPipeline({layout:$,vertex:{module:Z,entryPoint:"vs"},fragment:{module:Z,entryPoint:"fs",targets:[{format:"rgba8unorm",blend:N.blend}]},primitive:{topology:N.topology??"triangle-list"}}))}return{config:j,pipelines:K,passLayouts:J}}function h(j){if(!j.seriesStorageBuffer||j.series.length===0)return;let K=new Float32Array(j.series.length*8),J=new Uint32Array(K.buffer);for(let q=0;q<j.series.length;q++){let N=j.series[q],O=q*8;K[O+0]=N.colorR,K[O+1]=N.colorG,K[O+2]=N.colorB,K[O+3]=1,J[O+4]=N.visibleStart,J[O+5]=N.visibleCount}W.queue.writeBuffer(j.seriesStorageBuffer,0,K)}function I(j,K){let J=f,q=n,N=j.maxX-j.minX,O=j.maxY-j.minY,Q=j.bgColor??(R?[0.11,0.11,0.12]:[0.98,0.98,0.98]);J[0]=j.width,J[1]=j.height,J[2]=j.minX+j.panX*N,J[3]=j.minX+j.panX*N+N/j.zoomX,J[4]=j.minY+j.panY*O,J[5]=j.minY+j.panY*O+O/j.zoomY,q[6]=K.pointCount,q[7]=j.series.length,q[8]=R?1:0,J[9]=Q[0],J[10]=Q[1],J[11]=Q[2],J[12]=j.minX,J[13]=j.maxX,J[14]=j.minY,J[15]=j.maxY,W.queue.writeBuffer(j.uniformBuffer,0,E)}function g(j,K){if(!j.customUniformBuffer||K.uniformDefs.length===0)return;let J=K.uniformDefs.length,q=Math.ceil(J*4/16)*16,N=new ArrayBuffer(q),O=new Float32Array(N),Q=new Uint32Array(N);for(let $=0;$<J;$++){let Z=K.uniformDefs[$],G=j.customUniformValues[Z.name]??Z.default;if(Z.type==="u32")Q[$]=G>>>0;else O[$]=G}W.queue.writeBuffer(j.customUniformBuffer,0,N)}function b(j,K,J){for(let[,q]of j.chartBuffers)q.destroy();j.chartBuffers.clear();for(let q of K.config.bufferDefs)if(!q.perSeries){let N=Math.max(16,J[q.name]??16);j.chartBuffers.set(q.name,W.createBuffer({size:N,usage:v(q.usages)}))}if(K.config.uniformDefs.length>0){if(j.customUniformBuffer)j.customUniformBuffer.destroy();let q=Math.max(16,Math.ceil(K.config.uniformDefs.length*4/16)*16);j.customUniformBuffer=W.createBuffer({size:q,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST}),g(j,K.config)}}function l(j,K,J,q){for(let[,N]of j.seriesBuffers)N.destroy();j.seriesBuffers.clear();for(let N of J.config.bufferDefs)if(N.perSeries){let O=Math.max(16,q[N.name]??16);j.seriesBuffers.set(N.name,W.createBuffer({size:O,usage:v(N.usages)}))}if(j.seriesIndexBuffer)j.seriesIndexBuffer.destroy();j.seriesIndexBuffer=W.createBuffer({size:16,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST}),W.queue.writeBuffer(j.seriesIndexBuffer,0,new Uint32Array([K,0,0,0]))}function p(j,K){if(!j.seriesStorageBuffer)return;for(let J=0;J<j.series.length;J++){let q=j.series[J];q.passBindGroups=[];for(let N=0;N<K.config.passes.length;N++){let O=K.config.passes[N];if(!O.perSeries){q.passBindGroups.push(null);continue}let Q=K.passLayouts.get(`pass-${N}`);try{let $=O.bindings.map((Z)=>({binding:Z.binding,resource:S(Z.source,Z.write,j,q,K)}));q.passBindGroups.push(W.createBindGroup({layout:Q,entries:$}))}catch($){postMessage({type:H.ERROR,code:V.BIND_S}),q.passBindGroups.push(null)}}}j.chartPassBindGroups=[];for(let J=0;J<K.config.passes.length;J++){let q=K.config.passes[J];if(q.perSeries){j.chartPassBindGroups.push(null);continue}let N=K.passLayouts.get(`pass-${J}`);try{let O=q.bindings.map((Q)=>({binding:Q.binding,resource:S(Q.source,Q.write,j,null,K)}));j.chartPassBindGroups.push(W.createBindGroup({layout:N,entries:O}))}catch(O){postMessage({type:H.ERROR,code:V.BIND_C}),j.chartPassBindGroups.push(null)}}}function D(j){if(j.outputTexture)j.outputTexture.destroy();let K=Math.max(1,j.width),J=Math.max(1,j.height),q=P.get(j.rendererName),N=GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.RENDER_ATTACHMENT;if(q){for(let O of q.config.passes)if(O.type==="compute"){for(let Q of O.bindings)if(Q.source==="render-target"&&Q.write){N|=GPUTextureUsage.STORAGE_BINDING;break}}}j.outputTexture=W.createTexture({size:[K,J],format:"rgba8unorm",usage:N}),j.outputTextureView=j.outputTexture.createView(),j.blitBindGroup=W.createBindGroup({layout:z,entries:[{binding:0,resource:j.outputTextureView},{binding:1,resource:M}]})}function c(j){let K=P.get(j.rendererName);if(!K)return;if(!j.ctx||j.width===0||j.height===0||j.series.length===0)return;let J;try{J=j.ctx.getCurrentTexture().createView()}catch{return}let q=W.createCommandEncoder();if(h(j),j.series.length>0)I(j,j.series[0]);q.beginRenderPass({colorAttachments:[{view:j.outputTextureView,loadOp:"clear",storeOp:"store",clearValue:{r:0,g:0,b:0,a:0}}]}).end();for(let Q=0;Q<K.config.passes.length;Q++){let $=K.config.passes[Q],Z=K.pipelines.get(`pass-${Q}`);if(!Z)continue;if($.type==="compute")if($.perSeries)for(let G=0;G<j.series.length;G++){let T=j.series[G];if(T.pointCount===0||T.hidden)continue;I(j,T);let _=j.perSeriesPassMeta[G]?.[Q]?.dispatch??{x:1},A=T.passBindGroups[Q];if(!A)continue;let F=q.beginComputePass();F.setPipeline(Z),F.setBindGroup(0,A),F.dispatchWorkgroups(_.x,_.y??1,_.z??1),F.end()}else{let G=j.chartPassBindGroups[Q];if(!G)continue;let Y=j.perSeriesPassMeta[0]?.[Q]?.dispatch??{x:1},_=q.beginComputePass();_.setPipeline(Z),_.setBindGroup(0,G),_.dispatchWorkgroups(Y.x,Y.y??1,Y.z??1),_.end()}else if($.type==="render"){let T=j.perSeriesPassMeta[0]?.[Q]?.draw??0,Y=q.beginRenderPass({colorAttachments:[{view:j.outputTextureView,loadOp:$.loadOp??"load",storeOp:"store"}]});if(Y.setPipeline(Z),$.perSeries)for(let _=0;_<j.series.length;_++){let A=j.series[_];if(A.pointCount===0||A.hidden)continue;let F=A.passBindGroups[Q];if(!F)continue;Y.setBindGroup(0,F),Y.draw(T,1,0,_)}else{let _=j.chartPassBindGroups[Q];if(_)Y.setBindGroup(0,_),Y.draw(T,1,0,0)}Y.end()}}let O=q.beginRenderPass({colorAttachments:[{view:J,loadOp:"clear",storeOp:"store",clearValue:{r:0,g:0,b:0,a:0}}]});if(O.setPipeline(y),j.blitBindGroup)O.setBindGroup(0,j.blitBindGroup);O.draw(4),O.end(),W.queue.submit([q.finish()])}function U(){if(!B)B=!0,requestAnimationFrame(t)}function L(j){if(j.dirty=!0,j.visible)U()}function s(){let j=!1;for(let K of X.values())if(K.dirty=!0,K.visible)j=!0;if(j)U()}function t(){B=!1;let j=performance.now();for(let K of X.values())if(K.visible&&K.dirty&&K.width>0)c(K),K.dirty=!1;x=performance.now()-j,C++}function a(){let j=0;for(let K of X.values())if(K.visible&&K.width>0)j++;return j}async function e(){if(W)return!0;if(!navigator.gpu)return postMessage({type:H.ERROR,code:V.NO_GPU}),!1;let j=await navigator.gpu.requestAdapter();if(!j)return postMessage({type:H.ERROR,code:V.NO_ADAPTER}),!1;W=await j.requestDevice({requiredLimits:{maxBufferSize:j.limits.maxBufferSize,maxStorageBufferBindingSize:j.limits.maxStorageBufferBindingSize}}),k=navigator.gpu.getPreferredCanvasFormat(),W.lost.then((J)=>{postMessage({type:H.ERROR,code:V.DEVICE_LOST})}),z=W.createBindGroupLayout({entries:[{binding:0,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:"float"}},{binding:1,visibility:GPUShaderStage.FRAGMENT,sampler:{}}]});let K=W.createShaderModule({code:m});return y=W.createRenderPipeline({layout:W.createPipelineLayout({bindGroupLayouts:[z]}),vertex:{module:K,entryPoint:"vs"},fragment:{module:K,entryPoint:"fs",targets:[{format:k}]},primitive:{topology:"triangle-strip"}}),M=W.createSampler({magFilter:"linear",minFilter:"linear"}),u=setInterval(()=>{postMessage({type:H.STATS,fps:C,renderMs:x,totalCharts:X.size,activeCharts:a()}),C=0},1000),postMessage({type:H.GPU_READY}),!0}function o(j){j.dataX.destroy(),j.dataY.destroy();for(let[,K]of j.extraBuffers)K.destroy();for(let[,K]of j.seriesBuffers)K.destroy();if(j.seriesIndexBuffer)j.seriesIndexBuffer.destroy()}function r(j,K,J,q,N){let O=X.get(j);if(!O||!W)return;let Q=P.get(O.rendererName);if(!Q){postMessage({type:H.ERROR,code:V.NO_RENDERER});return}try{O.minX=J.minX,O.maxX=J.maxX,O.minY=J.minY,O.maxY=J.maxY,O.perSeriesPassMeta=N;for(let $ of O.series)o($);if(O.series=[],O.seriesStorageBuffer)O.seriesStorageBuffer.destroy();if(K.length>0)O.seriesStorageBuffer=W.createBuffer({size:Math.max(32,K.length*32),usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST});b(O,Q,q);for(let $=0;$<K.length;$++){let Z=K[$],G=W.createBuffer({size:Math.max(16,Z.dataX.byteLength),usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST}),T=W.createBuffer({size:Math.max(16,Z.dataY.byteLength),usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST});W.queue.writeBuffer(G,0,Z.dataX),W.queue.writeBuffer(T,0,Z.dataY);let Y=new Map;for(let[A,F]of Object.entries(Z.extra??{})){let w=W.createBuffer({size:Math.max(16,F.byteLength),usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST});W.queue.writeBuffer(w,0,F),Y.set(A,w)}let _={label:Z.label,colorR:Z.colorR,colorG:Z.colorG,colorB:Z.colorB,dataX:G,dataY:T,extraBuffers:Y,seriesBuffers:new Map,seriesIndexBuffer:null,pointCount:Z.dataX.length,visibleStart:0,visibleCount:Z.dataX.length,hidden:Z.hidden??!1,passBindGroups:[]};O.series.push(_),l(_,$,Q,q)}p(O,Q)}catch($){postMessage({type:H.ERROR,code:V.UPDATE})}}self.onmessage=async(j)=>{let{type:K,...J}=j.data;switch(K){case H.INIT:R=J.isDark||!1,await e();break;case H.THEME:R=J.isDark,s();break;case H.REGISTER_RENDERER:{if(!W){postMessage({type:H.ERROR,code:V.NOT_READY});break}let q={name:J.name,shaders:J.shaders,passes:J.passes,bufferDefs:J.bufferDefs??[],uniformDefs:J.uniformDefs??[]};try{P.set(J.name,i(q))}catch(N){postMessage({type:H.ERROR,code:V.COMPILE})}break}case H.REGISTER_CHART:{if(!W)break;let q=J.canvas.getContext("webgpu");if(!q){postMessage({type:H.ERROR,code:V.CTX_GET});break}try{q.configure({device:W,format:k,alphaMode:"premultiplied"})}catch(Z){postMessage({type:H.ERROR,code:V.CTX_CFG});break}let N=W.limits.maxTextureDimension2D,O=Math.min(Math.max(1,Math.floor(Number(J.canvas.width)||800)),N),Q=Math.min(Math.max(1,Math.floor(Number(J.canvas.height)||400)),N),$={id:J.id,canvas:J.canvas,ctx:q,rendererName:J.rendererName,visible:!0,series:[],uniformBuffer:W.createBuffer({size:64,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST}),seriesStorageBuffer:null,outputTexture:null,outputTextureView:null,blitBindGroup:null,chartBuffers:new Map,customUniformBuffer:null,customUniformValues:J.customUniformValues??{},chartPassBindGroups:[],perSeriesPassMeta:J.perSeriesPassMeta??[],width:O,height:Q,panX:0,panY:0,zoomX:1,zoomY:1,minX:0,maxX:1,maxY:1,minY:0,bgColor:J.bgColor??null,dirty:!0};try{D($)}catch(Z){postMessage({type:H.ERROR,code:V.TEX});break}X.set(J.id,$);break}case H.UNREGISTER_CHART:{let q=X.get(J.id);if(q){try{q.ctx.unconfigure()}catch{}if(q.uniformBuffer.destroy(),q.seriesStorageBuffer)q.seriesStorageBuffer.destroy();if(q.outputTexture)q.outputTexture.destroy();if(q.customUniformBuffer)q.customUniformBuffer.destroy();for(let[,N]of q.chartBuffers)N.destroy();for(let N of q.series)o(N);X.delete(J.id)}break}case H.UPDATE_SERIES:{r(J.id,J.series,J.bounds,J.bufferSizes??{},J.perSeriesPassMeta??[]);let q=X.get(J.id);if(q)L(q);break}case H.RESIZE:{let q=X.get(J.id);if(!q||J.width<=0||J.height<=0)break;let N=W.limits.maxTextureDimension2D,O=Math.min(J.width,N),Q=Math.min(J.height,N);if(O===q.width&&Q===q.height)break;if(q.width=O,q.height=Q,q.canvas.width=O,q.canvas.height=Q,J.perSeriesPassMeta?.length>0)q.perSeriesPassMeta=J.perSeriesPassMeta;let $=P.get(q.rendererName);try{if(D(q),$&&J.bufferSizes){b(q,$,J.bufferSizes);for(let Z=0;Z<q.series.length;Z++)l(q.series[Z],Z,$,J.bufferSizes);p(q,$)}}catch(Z){postMessage({type:H.ERROR,code:V.RESIZE})}L(q);break}case H.VIEW_TRANSFORM:{let q=X.get(J.id);if(q)q.panX=J.panX,q.panY=J.panY,q.zoomX=Math.max(0.1,Math.min(1e6,J.zoomX)),q.zoomY=Math.max(0.1,Math.min(1e6,J.zoomY)),L(q);break}case H.BATCH_VIEW_TRANSFORM:{let q=Math.max(0.1,Math.min(1e6,J.zoomX)),N=Math.max(0.1,Math.min(1e6,J.zoomY));for(let O of J.transforms){let Q=X.get(O.id);if(Q)Q.panX=J.panX,Q.panY=J.panY,Q.zoomX=q,Q.zoomY=N,Q.dirty=!0}U();break}case H.SET_VISIBILITY:{let q=X.get(J.id);if(q){if(q.visible=J.visible,J.visible&&q.dirty)U()}break}case H.SET_STYLE:{let q=X.get(J.id);if(q){if(J.bgColor!==void 0)q.bgColor=J.bgColor;if(J.hiddenSeries!==void 0)for(let N=0;N<q.series.length;N++)q.series[N].hidden=J.hiddenSeries.has(N);L(q)}break}case H.SET_UNIFORMS:{let q=X.get(J.id);if(!q)break;Object.assign(q.customUniformValues,J.values);let N=P.get(q.rendererName);if(N)g(q,N.config);L(q);break}}};
package/dist/msg.d.ts ADDED
@@ -0,0 +1,33 @@
1
+ export declare const M: {
2
+ readonly INIT: 0;
3
+ readonly THEME: 1;
4
+ readonly REGISTER_RENDERER: 2;
5
+ readonly REGISTER_CHART: 3;
6
+ readonly UNREGISTER_CHART: 4;
7
+ readonly UPDATE_SERIES: 5;
8
+ readonly RESIZE: 6;
9
+ readonly VIEW_TRANSFORM: 7;
10
+ readonly BATCH_VIEW_TRANSFORM: 8;
11
+ readonly SET_VISIBILITY: 9;
12
+ readonly SET_STYLE: 10;
13
+ readonly SET_UNIFORMS: 11;
14
+ readonly GPU_READY: 12;
15
+ readonly ERROR: 13;
16
+ readonly STATS: 14;
17
+ };
18
+ export declare const E: {
19
+ readonly NO_GPU: "e1:no-gpu";
20
+ readonly NO_ADAPTER: "e2:no-adapter";
21
+ readonly DEVICE_LOST: "e3:device-lost";
22
+ readonly NOT_READY: "e4:not-ready";
23
+ readonly COMPILE: "e5:compile";
24
+ readonly CTX_GET: "e6:ctx-get";
25
+ readonly CTX_CFG: "e7:ctx-cfg";
26
+ readonly TEX: "e8:tex";
27
+ readonly BIND_S: "e9:bind-s";
28
+ readonly BIND_C: "e10:bind-c";
29
+ readonly UPDATE: "e11:update";
30
+ readonly NO_RENDERER: "e12:no-renderer";
31
+ readonly RESIZE: "e13:resize";
32
+ };
33
+ //# sourceMappingURL=msg.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"msg.d.ts","sourceRoot":"","sources":["../src/msg.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,CAAC;;;;;;;;;;;;;;;;CAkBJ,CAAC;AAGX,eAAO,MAAM,CAAC;;;;;;;;;;;;;;CAcJ,CAAC"}
@@ -0,0 +1,18 @@
1
+ import type { InternalChart } from "../types.ts";
2
+ /**
3
+ * Convert a data-space point to canvas pixel coordinates.
4
+ * width/height should be the CSS pixel dimensions of the chart element.
5
+ */
6
+ export declare function dataToScreen(dataX: number, dataY: number, chart: InternalChart, width: number, height: number): {
7
+ x: number;
8
+ y: number;
9
+ };
10
+ /**
11
+ * Convert canvas pixel coordinates to data-space.
12
+ * width/height should be the CSS pixel dimensions of the chart element.
13
+ */
14
+ export declare function screenToData(screenX: number, screenY: number, chart: InternalChart, width: number, height: number): {
15
+ x: number;
16
+ y: number;
17
+ };
18
+ //# sourceMappingURL=coords.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coords.d.ts","sourceRoot":"","sources":["../../src/plugins/coords.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,aAAa,EACpB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAW1B;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,aAAa,EACpB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAW1B"}
@@ -0,0 +1,164 @@
1
+ import {
2
+ dataToScreen
3
+ } from "../../chunk-mmsy3yqt.js";
4
+ import {
5
+ DEFAULT_FONT
6
+ } from "../../chunk-1ngxm8t2.js";
7
+ import {
8
+ MARGIN
9
+ } from "../../chunk-831dem4f.js";
10
+ import {
11
+ ChartManager
12
+ } from "../../chunk-n8ew0z0e.js";
13
+ import"../../chunk-93yrr7er.js";
14
+ import"../../chunk-5gtx3pza.js";
15
+
16
+ // src/plugins/experimental/annotations.ts
17
+ var DEFAULT_COLOR = "rgba(100,100,200,0.8)";
18
+ function drawPill(ctx, txt, cx, cy, color, dark, fontFamily) {
19
+ ctx.font = `600 10px ${fontFamily}`;
20
+ const tw = ctx.measureText(txt).width;
21
+ const pw = tw + 12;
22
+ const ph = 18;
23
+ const px = cx - pw / 2;
24
+ const py = cy - ph / 2;
25
+ ctx.beginPath();
26
+ ctx.roundRect(px, py, pw, ph, 4);
27
+ ctx.fillStyle = dark ? "rgba(0,0,0,0.7)" : "rgba(255,255,255,0.9)";
28
+ ctx.fill();
29
+ ctx.strokeStyle = color;
30
+ ctx.lineWidth = 1.5;
31
+ ctx.setLineDash([]);
32
+ ctx.stroke();
33
+ ctx.fillStyle = color;
34
+ ctx.textAlign = "center";
35
+ ctx.textBaseline = "middle";
36
+ ctx.fillText(txt, cx, cy);
37
+ }
38
+ var annotationsPlugin = {
39
+ name: "annotations",
40
+ beforeDraw(ctx, chart) {
41
+ const annotations = chart.config.annotations ?? [];
42
+ const { width: w, height: h } = chart;
43
+ const m = MARGIN;
44
+ const dark = ChartManager.isDark;
45
+ const fontFamily = chart.config.fontFamily ?? DEFAULT_FONT;
46
+ const regions = annotations.filter((a) => a.type === "hregion" || a.type === "vregion");
47
+ if (regions.length === 0)
48
+ return;
49
+ ctx.save();
50
+ ctx.save();
51
+ ctx.beginPath();
52
+ ctx.rect(m.left, m.top, w - m.left - m.right, h - m.top - m.bottom);
53
+ ctx.clip();
54
+ for (const ann of regions) {
55
+ const color = ann.color ?? (dark ? "rgba(255,255,255,0.12)" : "rgba(0,0,0,0.08)");
56
+ const { y: sy1 } = dataToScreen(0, ann.value, chart, w, h);
57
+ const { x: sx1 } = dataToScreen(ann.value, 0, chart, w, h);
58
+ const v2 = ann.value2 ?? ann.value;
59
+ const { y: sy2 } = dataToScreen(0, v2, chart, w, h);
60
+ const { x: sx2 } = dataToScreen(v2, 0, chart, w, h);
61
+ ctx.fillStyle = color;
62
+ if (ann.type === "hregion") {
63
+ const top = Math.min(sy1, sy2);
64
+ const bottom = Math.max(sy1, sy2);
65
+ ctx.fillRect(m.left, top, w - m.left - m.right, bottom - top);
66
+ } else {
67
+ const left = Math.min(sx1, sx2);
68
+ const right = Math.max(sx1, sx2);
69
+ ctx.fillRect(left, m.top, right - left, h - m.top - m.bottom);
70
+ }
71
+ }
72
+ ctx.restore();
73
+ for (const ann of regions) {
74
+ if (!ann.label)
75
+ continue;
76
+ const color = ann.color ?? (dark ? "rgba(255,255,255,0.12)" : "rgba(0,0,0,0.08)");
77
+ const { y: sy1 } = dataToScreen(0, ann.value, chart, w, h);
78
+ const { x: sx1 } = dataToScreen(ann.value, 0, chart, w, h);
79
+ const v2 = ann.value2 ?? ann.value;
80
+ const { y: sy2 } = dataToScreen(0, v2, chart, w, h);
81
+ const { x: sx2 } = dataToScreen(v2, 0, chart, w, h);
82
+ if (ann.type === "hregion") {
83
+ const cy = (sy1 + sy2) / 2;
84
+ if (cy < m.top - 9 || cy > h - m.bottom + 9)
85
+ continue;
86
+ ctx.font = `600 10px ${fontFamily}`;
87
+ const pw = ctx.measureText(ann.label).width + 12;
88
+ const cx = w - m.right - pw / 2 - 4;
89
+ drawPill(ctx, ann.label, cx, cy, color, dark, fontFamily);
90
+ } else {
91
+ ctx.font = `600 10px ${fontFamily}`;
92
+ const tw = ctx.measureText(ann.label).width;
93
+ const pw = tw + 12;
94
+ const cx = (sx1 + sx2) / 2;
95
+ if (cx < m.left - (pw / 2 + 2) || cx > w - m.right + (pw / 2 + 2))
96
+ continue;
97
+ const cy = h - m.bottom / 2;
98
+ drawPill(ctx, ann.label, cx, cy, color, dark, fontFamily);
99
+ }
100
+ }
101
+ ctx.restore();
102
+ },
103
+ afterDraw(ctx, chart) {
104
+ const annotations = chart.config.annotations ?? [];
105
+ const { width: w, height: h } = chart;
106
+ const m = MARGIN;
107
+ const dark = ChartManager.isDark;
108
+ const fontFamily = chart.config.fontFamily ?? DEFAULT_FONT;
109
+ const lines = annotations.filter((a) => a.type === "hline" || a.type === "vline");
110
+ if (lines.length === 0)
111
+ return;
112
+ ctx.save();
113
+ ctx.save();
114
+ ctx.beginPath();
115
+ ctx.rect(m.left, m.top, w - m.left - m.right, h - m.top - m.bottom);
116
+ ctx.clip();
117
+ for (const ann of lines) {
118
+ const color = ann.color ?? DEFAULT_COLOR;
119
+ ctx.strokeStyle = color;
120
+ ctx.lineWidth = ann.lineWidth ?? 1.5;
121
+ ctx.setLineDash(ann.dash ?? []);
122
+ ctx.beginPath();
123
+ if (ann.type === "hline") {
124
+ const { y: sy } = dataToScreen(0, ann.value, chart, w, h);
125
+ ctx.moveTo(m.left, sy);
126
+ ctx.lineTo(w - m.right, sy);
127
+ } else {
128
+ const { x: sx } = dataToScreen(ann.value, 0, chart, w, h);
129
+ ctx.moveTo(sx, m.top);
130
+ ctx.lineTo(sx, h - m.bottom);
131
+ }
132
+ ctx.stroke();
133
+ }
134
+ ctx.restore();
135
+ for (const ann of lines) {
136
+ if (!ann.label)
137
+ continue;
138
+ const color = ann.color ?? DEFAULT_COLOR;
139
+ if (ann.type === "hline") {
140
+ const { y: sy } = dataToScreen(0, ann.value, chart, w, h);
141
+ if (sy < m.top - 9 || sy > h - m.bottom + 9)
142
+ continue;
143
+ ctx.font = `600 10px ${fontFamily}`;
144
+ const tw = ctx.measureText(ann.label).width;
145
+ const pw = tw + 12;
146
+ const cx = w - m.right - pw / 2 - 4;
147
+ drawPill(ctx, ann.label, cx, sy, color, dark, fontFamily);
148
+ } else {
149
+ const { x: sx } = dataToScreen(ann.value, 0, chart, w, h);
150
+ ctx.font = `600 10px ${fontFamily}`;
151
+ const tw = ctx.measureText(ann.label).width;
152
+ const pw = tw + 12;
153
+ if (sx < m.left - (pw / 2 + 2) || sx > w - m.right + (pw / 2 + 2))
154
+ continue;
155
+ const cy = h - m.bottom / 2;
156
+ drawPill(ctx, ann.label, sx, cy, color, dark, fontFamily);
157
+ }
158
+ }
159
+ ctx.restore();
160
+ }
161
+ };
162
+ export {
163
+ annotationsPlugin
164
+ };
@@ -0,0 +1 @@
1
+ import{j as K}from"../../chunk-cbydth3q.js";import{l as N}from"../../chunk-cvtt04m6.js";import{o as M}from"../../chunk-0eh4rzy9.js";import{q as E}from"../../chunk-50bcv2hw.js";import"../../chunk-wdfq2fpx.js";import"../../chunk-bbyt23tw.js";var R="rgba(100,100,200,0.8)";function D(j,H,I,z,B,u,Z){j.font=`600 10px ${Z}`;let W=j.measureText(H).width+12,q=18,Q=I-W/2,J=z-q/2;j.beginPath(),j.roundRect(Q,J,W,q,4),j.fillStyle=u?"rgba(0,0,0,0.7)":"rgba(255,255,255,0.9)",j.fill(),j.strokeStyle=B,j.lineWidth=1.5,j.setLineDash([]),j.stroke(),j.fillStyle=B,j.textAlign="center",j.textBaseline="middle",j.fillText(H,I,z)}var O={name:"annotations",beforeDraw(j,H){let I=H.config.annotations??[],{width:z,height:B}=H,u=M,Z=E.isDark,V=H.config.fontFamily??N,W=I.filter((q)=>q.type==="hregion"||q.type==="vregion");if(W.length===0)return;j.save(),j.save(),j.beginPath(),j.rect(u.left,u.top,z-u.left-u.right,B-u.top-u.bottom),j.clip();for(let q of W){let Q=q.color??(Z?"rgba(255,255,255,0.12)":"rgba(0,0,0,0.08)"),{y:J}=K(0,q.value,H,z,B),{x:b}=K(q.value,0,H,z,B),X=q.value2??q.value,{y:$}=K(0,X,H,z,B),{x:C}=K(X,0,H,z,B);if(j.fillStyle=Q,q.type==="hregion"){let Y=Math.min(J,$),G=Math.max(J,$);j.fillRect(u.left,Y,z-u.left-u.right,G-Y)}else{let Y=Math.min(b,C),G=Math.max(b,C);j.fillRect(Y,u.top,G-Y,B-u.top-u.bottom)}}j.restore();for(let q of W){if(!q.label)continue;let Q=q.color??(Z?"rgba(255,255,255,0.12)":"rgba(0,0,0,0.08)"),{y:J}=K(0,q.value,H,z,B),{x:b}=K(q.value,0,H,z,B),X=q.value2??q.value,{y:$}=K(0,X,H,z,B),{x:C}=K(X,0,H,z,B);if(q.type==="hregion"){let Y=(J+$)/2;if(Y<u.top-9||Y>B-u.bottom+9)continue;j.font=`600 10px ${V}`;let G=j.measureText(q.label).width+12,v=z-u.right-G/2-4;D(j,q.label,v,Y,Q,Z,V)}else{j.font=`600 10px ${V}`;let G=j.measureText(q.label).width+12,v=(b+C)/2;if(v<u.left-(G/2+2)||v>z-u.right+(G/2+2))continue;let U=B-u.bottom/2;D(j,q.label,v,U,Q,Z,V)}}j.restore()},afterDraw(j,H){let I=H.config.annotations??[],{width:z,height:B}=H,u=M,Z=E.isDark,V=H.config.fontFamily??N,W=I.filter((q)=>q.type==="hline"||q.type==="vline");if(W.length===0)return;j.save(),j.save(),j.beginPath(),j.rect(u.left,u.top,z-u.left-u.right,B-u.top-u.bottom),j.clip();for(let q of W){let Q=q.color??R;if(j.strokeStyle=Q,j.lineWidth=q.lineWidth??1.5,j.setLineDash(q.dash??[]),j.beginPath(),q.type==="hline"){let{y:J}=K(0,q.value,H,z,B);j.moveTo(u.left,J),j.lineTo(z-u.right,J)}else{let{x:J}=K(q.value,0,H,z,B);j.moveTo(J,u.top),j.lineTo(J,B-u.bottom)}j.stroke()}j.restore();for(let q of W){if(!q.label)continue;let Q=q.color??R;if(q.type==="hline"){let{y:J}=K(0,q.value,H,z,B);if(J<u.top-9||J>B-u.bottom+9)continue;j.font=`600 10px ${V}`;let X=j.measureText(q.label).width+12,$=z-u.right-X/2-4;D(j,q.label,$,J,Q,Z,V)}else{let{x:J}=K(q.value,0,H,z,B);j.font=`600 10px ${V}`;let X=j.measureText(q.label).width+12;if(J<u.left-(X/2+2)||J>z-u.right+(X/2+2))continue;let $=B-u.bottom/2;D(j,q.label,J,$,Q,Z,V)}}j.restore()}};export{O as annotationsPlugin};
@@ -0,0 +1,82 @@
1
+ import {
2
+ MARGIN
3
+ } from "../../chunk-831dem4f.js";
4
+ import {
5
+ ChartManager
6
+ } from "../../chunk-n8ew0z0e.js";
7
+ import"../../chunk-93yrr7er.js";
8
+ import"../../chunk-5gtx3pza.js";
9
+
10
+ // src/plugins/experimental/crosshair.ts
11
+ var states = new WeakMap;
12
+ var crosshairPlugin = {
13
+ name: "crosshair",
14
+ install(chart, el) {
15
+ const ac = new AbortController;
16
+ const state = {
17
+ mouseX: 0,
18
+ mouseY: 0,
19
+ visible: false,
20
+ abort: ac
21
+ };
22
+ states.set(chart, state);
23
+ el.addEventListener("mousemove", (e) => {
24
+ e.preventDefault();
25
+ if (chart.dragging)
26
+ return;
27
+ const r = el.getBoundingClientRect();
28
+ state.mouseX = e.clientX - r.left;
29
+ state.mouseY = e.clientY - r.top;
30
+ state.visible = true;
31
+ ChartManager.drawChart(chart);
32
+ }, { signal: ac.signal });
33
+ ["mouseleave", "pointerdown"].forEach((ev) => el.addEventListener(ev, () => {
34
+ state.visible = false;
35
+ ChartManager.drawChart(chart);
36
+ }, { signal: ac.signal }));
37
+ },
38
+ afterDraw(ctx, chart) {
39
+ const state = states.get(chart);
40
+ if (!state?.visible)
41
+ return;
42
+ const cfg = chart.config;
43
+ const showX = cfg.crosshairX ?? true;
44
+ const showY = cfg.crosshairY ?? true;
45
+ if (!showX && !showY)
46
+ return;
47
+ const { width: w, height: h } = chart;
48
+ const m = MARGIN;
49
+ const dark = ChartManager.isDark;
50
+ const color = cfg.crosshairColor ?? (dark ? "rgba(255,255,255,0.4)" : "rgba(0,0,0,0.3)");
51
+ const dash = cfg.crosshairDash ?? [4, 3];
52
+ const lineWidth = cfg.crosshairWidth ?? 1;
53
+ const { mouseX: mx, mouseY: my } = state;
54
+ if (mx < m.left || mx > w - m.right || my < m.top || my > h - m.bottom) {
55
+ state.visible = false;
56
+ return;
57
+ }
58
+ ctx.save();
59
+ ctx.strokeStyle = color;
60
+ ctx.lineWidth = lineWidth;
61
+ ctx.setLineDash(dash);
62
+ ctx.beginPath();
63
+ if (showX) {
64
+ ctx.moveTo(mx, m.top);
65
+ ctx.lineTo(mx, h - m.bottom);
66
+ }
67
+ if (showY) {
68
+ ctx.moveTo(m.left, my);
69
+ ctx.lineTo(w - m.right, my);
70
+ }
71
+ ctx.stroke();
72
+ ctx.restore();
73
+ },
74
+ uninstall(chart) {
75
+ const state = states.get(chart);
76
+ state?.abort.abort();
77
+ states.delete(chart);
78
+ }
79
+ };
80
+ export {
81
+ crosshairPlugin
82
+ };
@@ -0,0 +1 @@
1
+ import{o as g}from"../../chunk-0eh4rzy9.js";import{q as m}from"../../chunk-50bcv2hw.js";import"../../chunk-wdfq2fpx.js";import"../../chunk-bbyt23tw.js";var h=new WeakMap,w={name:"crosshair",install(e,s){let n=new AbortController,r={mouseX:0,mouseY:0,visible:!1,abort:n};h.set(e,r),s.addEventListener("mousemove",(o)=>{if(o.preventDefault(),e.dragging)return;let i=s.getBoundingClientRect();r.mouseX=o.clientX-i.left,r.mouseY=o.clientY-i.top,r.visible=!0,m.drawChart(e)},{signal:n.signal}),["mouseleave","pointerdown"].forEach((o)=>s.addEventListener(o,()=>{r.visible=!1,m.drawChart(e)},{signal:n.signal}))},afterDraw(e,s){let n=h.get(s);if(!n?.visible)return;let r=s.config,o=r.crosshairX??!0,i=r.crosshairY??!0;if(!o&&!i)return;let{width:u,height:b}=s,t=g,c=m.isDark,f=r.crosshairColor??(c?"rgba(255,255,255,0.4)":"rgba(0,0,0,0.3)"),C=r.crosshairDash??[4,3],d=r.crosshairWidth??1,{mouseX:a,mouseY:l}=n;if(a<t.left||a>u-t.right||l<t.top||l>b-t.bottom){n.visible=!1;return}if(e.save(),e.strokeStyle=f,e.lineWidth=d,e.setLineDash(C),e.beginPath(),o)e.moveTo(a,t.top),e.lineTo(a,b-t.bottom);if(i)e.moveTo(t.left,l),e.lineTo(u-t.right,l);e.stroke(),e.restore()},uninstall(e){h.get(e)?.abort.abort(),h.delete(e)}};export{w as crosshairPlugin};
@@ -0,0 +1,190 @@
1
+ import {
2
+ MARGIN
3
+ } from "../../chunk-831dem4f.js";
4
+ import {
5
+ ChartManager
6
+ } from "../../chunk-n8ew0z0e.js";
7
+ import"../../chunk-93yrr7er.js";
8
+ import"../../chunk-5gtx3pza.js";
9
+
10
+ // src/plugins/experimental/minimap.ts
11
+ var states = new WeakMap;
12
+ function getMinimapOrigin(pos, mSize, cw, ch) {
13
+ const pad = 8;
14
+ const m = MARGIN;
15
+ switch (pos) {
16
+ case "top-left":
17
+ return { mx: m.left + pad, my: m.top + pad };
18
+ case "top-right":
19
+ return { mx: cw - m.right - mSize - pad, my: m.top + pad };
20
+ case "bottom-left":
21
+ return { mx: m.left + pad, my: ch - m.bottom - mSize - pad };
22
+ case "bottom-right":
23
+ return { mx: cw - m.right - mSize - pad, my: ch - m.bottom - mSize - pad };
24
+ }
25
+ }
26
+ var minimapPlugin = {
27
+ name: "minimap",
28
+ install(chart, el) {
29
+ const ac = new AbortController;
30
+ states.set(chart, { abort: ac, drag: null, didDrag: false });
31
+ const getMinimapCoords = (e) => {
32
+ const cfg = chart.config;
33
+ const mSize = cfg.minimapSize ?? 120;
34
+ const pos = cfg.minimapPosition ?? "bottom-right";
35
+ const { width: cw, height: ch } = chart;
36
+ const r = el.getBoundingClientRect();
37
+ const scaleX = cw / r.width;
38
+ const scaleY = ch / r.height;
39
+ const cx = (e.clientX - r.left) * scaleX;
40
+ const cy = (e.clientY - r.top) * scaleY;
41
+ const { mx, my } = getMinimapOrigin(pos, mSize, cw, ch);
42
+ return { cx, cy, mx, my, mSize };
43
+ };
44
+ el.addEventListener("pointerdown", (e) => {
45
+ const { cx, cy, mx, my, mSize } = getMinimapCoords(e);
46
+ if (cx < mx || cx > mx + mSize || cy < my || cy > my + mSize)
47
+ return;
48
+ e.preventDefault();
49
+ e.stopPropagation();
50
+ el.setPointerCapture(e.pointerId);
51
+ const state = states.get(chart);
52
+ if (!state)
53
+ return;
54
+ const fx = (cx - mx) / mSize;
55
+ const fy = (cy - my) / mSize;
56
+ state.drag = {
57
+ startFx: fx,
58
+ startFy: fy,
59
+ startPanX: chart.view.panX,
60
+ startPanY: chart.view.panY
61
+ };
62
+ }, { signal: ac.signal });
63
+ window.addEventListener("pointermove", (e) => {
64
+ const state = states.get(chart);
65
+ if (!state?.drag)
66
+ return;
67
+ if (e.buttons === 0) {
68
+ state.drag = null;
69
+ return;
70
+ }
71
+ const { cx, cy, mx, my, mSize } = getMinimapCoords(e);
72
+ const fx = (cx - mx) / mSize;
73
+ const fy = (cy - my) / mSize;
74
+ const dfx = fx - state.drag.startFx;
75
+ const dfy = fy - state.drag.startFy;
76
+ const hv = chart.homeView;
77
+ chart.view.panX = Math.max(hv.panX, Math.min(hv.panX + 1 / hv.zoomX - 1 / chart.view.zoomX, state.drag.startPanX + dfx / hv.zoomX));
78
+ chart.view.panY = Math.max(hv.panY, Math.min(hv.panY + 1 / hv.zoomY - 1 / chart.view.zoomY, state.drag.startPanY - dfy / hv.zoomY));
79
+ if (Math.abs(dfx) > 0.005 || Math.abs(dfy) > 0.005)
80
+ state.didDrag = true;
81
+ ChartManager.requestRender(chart.id);
82
+ ChartManager.drawChart(chart);
83
+ }, { signal: ac.signal });
84
+ window.addEventListener("pointerup", () => {
85
+ const state = states.get(chart);
86
+ if (state) {
87
+ if (state.drag) {
88
+ setTimeout(() => {
89
+ if (state)
90
+ state.didDrag = false;
91
+ }, 50);
92
+ }
93
+ state.drag = null;
94
+ }
95
+ }, { signal: ac.signal });
96
+ el.addEventListener("click", (e) => {
97
+ const state = states.get(chart);
98
+ if (!state)
99
+ return;
100
+ if (state.didDrag) {
101
+ state.didDrag = false;
102
+ return;
103
+ }
104
+ const { cx, cy, mx, my, mSize } = getMinimapCoords(e);
105
+ if (cx < mx || cx > mx + mSize || cy < my || cy > my + mSize)
106
+ return;
107
+ e.preventDefault();
108
+ e.stopPropagation();
109
+ const fx = (cx - mx) / mSize;
110
+ const fy = (cy - my) / mSize;
111
+ const fyData = 1 - fy;
112
+ const hv = chart.homeView;
113
+ chart.view.panX = Math.max(hv.panX, Math.min(hv.panX + 1 / hv.zoomX - 1 / chart.view.zoomX, hv.panX + fx / hv.zoomX - 0.5 / chart.view.zoomX));
114
+ chart.view.panY = Math.max(hv.panY, Math.min(hv.panY + 1 / hv.zoomY - 1 / chart.view.zoomY, hv.panY + fyData / hv.zoomY - 0.5 / chart.view.zoomY));
115
+ ChartManager.requestRender(chart.id);
116
+ ChartManager.drawChart(chart);
117
+ }, { signal: ac.signal });
118
+ },
119
+ afterDraw(ctx, chart) {
120
+ const cfg = chart.config;
121
+ const mSize = cfg.minimapSize ?? 120;
122
+ const opacity = cfg.minimapOpacity ?? 0.85;
123
+ const pos = cfg.minimapPosition ?? "bottom-right";
124
+ const { width: cw, height: ch } = chart;
125
+ const dark = ChartManager.isDark;
126
+ const { mx, my } = getMinimapOrigin(pos, mSize, cw, ch);
127
+ const mw = mSize;
128
+ const mh = mSize;
129
+ const borderR = 6;
130
+ const innerPad = 4;
131
+ ctx.save();
132
+ ctx.globalAlpha = opacity;
133
+ const bgColor = cfg.bgColor ?? (dark ? [0.11, 0.11, 0.12] : [0.98, 0.98, 0.98]);
134
+ ctx.fillStyle = `rgb(${bgColor.map((c) => Math.round(c * 255)).join(",")})`;
135
+ ctx.beginPath();
136
+ ctx.roundRect(mx, my, mw, mh, borderR);
137
+ ctx.fill();
138
+ ctx.strokeStyle = dark ? "rgba(255,255,255,0.18)" : "rgba(0,0,0,0.14)";
139
+ ctx.lineWidth = 1;
140
+ ctx.stroke();
141
+ ctx.beginPath();
142
+ ctx.roundRect(mx + 1, my + 1, mw - 2, mh - 2, borderR - 1);
143
+ ctx.clip();
144
+ const { bounds: b } = chart;
145
+ const rangeX = b.maxX - b.minX || 1;
146
+ const rangeY = b.maxY - b.minY || 1;
147
+ for (const series of chart.series) {
148
+ if (series.rawX.length === 0)
149
+ continue;
150
+ const { r, g, b: bv } = series.color;
151
+ ctx.strokeStyle = `rgba(${Math.round(r * 255)},${Math.round(g * 255)},${Math.round(bv * 255)},0.7)`;
152
+ ctx.lineWidth = 1;
153
+ ctx.beginPath();
154
+ const step = Math.max(1, Math.floor(series.rawX.length / mw));
155
+ for (let i = 0;i < series.rawX.length; i += step) {
156
+ const px = mx + innerPad + (series.rawX[i] - b.minX) / rangeX * (mw - innerPad * 2);
157
+ const py = my + innerPad + (1 - (series.rawY[i] - b.minY) / rangeY) * (mh - innerPad * 2);
158
+ if (i === 0)
159
+ ctx.moveTo(px, py);
160
+ else
161
+ ctx.lineTo(px, py);
162
+ }
163
+ ctx.stroke();
164
+ }
165
+ const { view: v } = chart;
166
+ const hv = chart.homeView;
167
+ const homeRangeX = 1 / hv.zoomX;
168
+ const homeRangeY = 1 / hv.zoomY;
169
+ const vx = mx + innerPad + (v.panX - hv.panX) * hv.zoomX * (mw - innerPad * 2);
170
+ const vy = my + innerPad + (1 - (v.panY - hv.panY) * hv.zoomY - 1 / v.zoomY / homeRangeY) * (mh - innerPad * 2);
171
+ const vw = 1 / v.zoomX / homeRangeX * (mw - innerPad * 2);
172
+ const vh = 1 / v.zoomY / homeRangeY * (mh - innerPad * 2);
173
+ ctx.fillStyle = dark ? "rgba(255,255,255,0.12)" : "rgba(0,100,255,0.1)";
174
+ ctx.fillRect(vx, vy, vw, vh);
175
+ ctx.strokeStyle = dark ? "rgba(255,255,255,0.5)" : "rgba(0,100,255,0.6)";
176
+ ctx.lineWidth = 1.5;
177
+ ctx.strokeRect(vx, vy, vw, vh);
178
+ ctx.restore();
179
+ },
180
+ uninstall(chart) {
181
+ const s = states.get(chart);
182
+ if (s) {
183
+ s.abort.abort();
184
+ states.delete(chart);
185
+ }
186
+ }
187
+ };
188
+ export {
189
+ minimapPlugin
190
+ };
@@ -0,0 +1 @@
1
+ import{o as M}from"../../chunk-0eh4rzy9.js";import{q as G}from"../../chunk-50bcv2hw.js";import"../../chunk-wdfq2fpx.js";import"../../chunk-bbyt23tw.js";var A=new WeakMap;function b(j,F,Q,W){let q=M;switch(j){case"top-left":return{mx:q.left+8,my:q.top+8};case"top-right":return{mx:Q-q.right-F-8,my:q.top+8};case"bottom-left":return{mx:q.left+8,my:W-q.bottom-F-8};case"bottom-right":return{mx:Q-q.right-F-8,my:W-q.bottom-F-8}}}var g={name:"minimap",install(j,F){let Q=new AbortController;A.set(j,{abort:Q,drag:null,didDrag:!1});let W=(B)=>{let q=j.config,L=q.minimapSize??120,T=q.minimapPosition??"bottom-right",{width:J,height:H}=j,E=F.getBoundingClientRect(),P=J/E.width,U=H/E.height,$=(B.clientX-E.left)*P,K=(B.clientY-E.top)*U,{mx:V,my:Z}=b(T,L,J,H);return{cx:$,cy:K,mx:V,my:Z,mSize:L}};F.addEventListener("pointerdown",(B)=>{let{cx:q,cy:L,mx:T,my:J,mSize:H}=W(B);if(q<T||q>T+H||L<J||L>J+H)return;B.preventDefault(),B.stopPropagation(),F.setPointerCapture(B.pointerId);let E=A.get(j);if(!E)return;let P=(q-T)/H,U=(L-J)/H;E.drag={startFx:P,startFy:U,startPanX:j.view.panX,startPanY:j.view.panY}},{signal:Q.signal}),window.addEventListener("pointermove",(B)=>{let q=A.get(j);if(!q?.drag)return;if(B.buttons===0){q.drag=null;return}let{cx:L,cy:T,mx:J,my:H,mSize:E}=W(B),P=(L-J)/E,U=(T-H)/E,$=P-q.drag.startFx,K=U-q.drag.startFy,V=j.homeView;if(j.view.panX=Math.max(V.panX,Math.min(V.panX+1/V.zoomX-1/j.view.zoomX,q.drag.startPanX+$/V.zoomX)),j.view.panY=Math.max(V.panY,Math.min(V.panY+1/V.zoomY-1/j.view.zoomY,q.drag.startPanY-K/V.zoomY)),Math.abs($)>0.005||Math.abs(K)>0.005)q.didDrag=!0;G.requestRender(j.id),G.drawChart(j)},{signal:Q.signal}),window.addEventListener("pointerup",()=>{let B=A.get(j);if(B){if(B.drag)setTimeout(()=>{if(B)B.didDrag=!1},50);B.drag=null}},{signal:Q.signal}),F.addEventListener("click",(B)=>{let q=A.get(j);if(!q)return;if(q.didDrag){q.didDrag=!1;return}let{cx:L,cy:T,mx:J,my:H,mSize:E}=W(B);if(L<J||L>J+E||T<H||T>H+E)return;B.preventDefault(),B.stopPropagation();let P=(L-J)/E,$=1-(T-H)/E,K=j.homeView;j.view.panX=Math.max(K.panX,Math.min(K.panX+1/K.zoomX-1/j.view.zoomX,K.panX+P/K.zoomX-0.5/j.view.zoomX)),j.view.panY=Math.max(K.panY,Math.min(K.panY+1/K.zoomY-1/j.view.zoomY,K.panY+$/K.zoomY-0.5/j.view.zoomY)),G.requestRender(j.id),G.drawChart(j)},{signal:Q.signal})},afterDraw(j,F){let Q=F.config,W=Q.minimapSize??120,B=Q.minimapOpacity??0.85,q=Q.minimapPosition??"bottom-right",{width:L,height:T}=F,J=G.isDark,{mx:H,my:E}=b(q,W,L,T),P=W,U=W,$=6,K=4;j.save(),j.globalAlpha=B;let V=Q.bgColor??(J?[0.11,0.11,0.12]:[0.98,0.98,0.98]);j.fillStyle=`rgb(${V.map((_)=>Math.round(_*255)).join(",")})`,j.beginPath(),j.roundRect(H,E,P,U,6),j.fill(),j.strokeStyle=J?"rgba(255,255,255,0.18)":"rgba(0,0,0,0.14)",j.lineWidth=1,j.stroke(),j.beginPath(),j.roundRect(H+1,E+1,P-2,U-2,5),j.clip();let{bounds:Z}=F,l=Z.maxX-Z.minX||1,d=Z.maxY-Z.minY||1;for(let _ of F.series){if(_.rawX.length===0)continue;let{r:p,g:o,b:w}=_.color;j.strokeStyle=`rgba(${Math.round(p*255)},${Math.round(o*255)},${Math.round(w*255)},0.7)`,j.lineWidth=1,j.beginPath();let n=Math.max(1,Math.floor(_.rawX.length/P));for(let N=0;N<_.rawX.length;N+=n){let Y=H+4+(_.rawX[N]-Z.minX)/l*(P-8),C=E+4+(1-(_.rawY[N]-Z.minY)/d)*(U-8);if(N===0)j.moveTo(Y,C);else j.lineTo(Y,C)}j.stroke()}let{view:I}=F,D=F.homeView,f=1/D.zoomX,u=1/D.zoomY,O=H+4+(I.panX-D.panX)*D.zoomX*(P-8),X=E+4+(1-(I.panY-D.panY)*D.zoomY-1/I.zoomY/u)*(U-8),k=1/I.zoomX/f*(P-8),R=1/I.zoomY/u*(U-8);j.fillStyle=J?"rgba(255,255,255,0.12)":"rgba(0,100,255,0.1)",j.fillRect(O,X,k,R),j.strokeStyle=J?"rgba(255,255,255,0.5)":"rgba(0,100,255,0.6)",j.lineWidth=1.5,j.strokeRect(O,X,k,R),j.restore()},uninstall(j){let F=A.get(j);if(F)F.abort.abort(),A.delete(j)}};export{g as minimapPlugin};