chartai 0.0.11 → 1.0.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.
- package/dist/chart-library.d.ts +33 -146
- package/dist/chart-library.d.ts.map +1 -1
- package/dist/chart-library.js +378 -321
- package/dist/chart-library.min.js +1 -1
- package/dist/charts/area.d.ts +6 -0
- package/dist/charts/area.d.ts.map +1 -0
- package/dist/charts/area.js +65 -0
- package/dist/charts/area.min.js +1 -0
- package/dist/charts/bar.d.ts +11 -0
- package/dist/charts/bar.d.ts.map +1 -0
- package/dist/charts/bar.js +65 -0
- package/dist/charts/bar.min.js +1 -0
- package/dist/charts/boids.js +167 -0
- package/dist/charts/boids.min.js +18 -0
- package/dist/charts/candlestick.d.ts +21 -0
- package/dist/charts/candlestick.d.ts.map +1 -0
- package/dist/charts/candlestick.js +132 -0
- package/dist/charts/candlestick.min.js +32 -0
- package/dist/charts/line.d.ts +12 -0
- package/dist/charts/line.d.ts.map +1 -0
- package/dist/charts/line.js +62 -0
- package/dist/charts/line.min.js +1 -0
- package/dist/charts/scatter.d.ts +11 -0
- package/dist/charts/scatter.d.ts.map +1 -0
- package/dist/charts/scatter.js +46 -0
- package/dist/charts/scatter.min.js +1 -0
- package/dist/chunk-0jepamv9.js +7 -0
- package/dist/chunk-1p45ex5n.min.js +2 -0
- package/dist/chunk-831dem4f.js +4 -0
- package/dist/chunk-93yrr7er.js +35 -0
- package/dist/chunk-94kc81rr.min.js +2 -0
- package/dist/chunk-a27be8p9.js +105 -0
- package/dist/chunk-bfyv7z27.min.js +2 -0
- package/dist/chunk-dmaxrg6s.min.js +2 -0
- package/dist/chunk-e7d3zgw5.min.js +2 -0
- package/dist/chunk-g6m56ptf.js +609 -0
- package/dist/chunk-m17t3vjq.js +9 -0
- package/dist/chunk-me3qaz3m.min.js +2 -0
- package/dist/chunk-qr6mweck.min.js +2 -0
- package/dist/chunk-yabjrff2.js +11 -0
- package/dist/gpu-worker.js +625 -686
- package/dist/gpu-worker.min.js +1 -1
- package/dist/msg.d.ts +33 -0
- package/dist/msg.d.ts.map +1 -0
- package/dist/plugins/coords.d.ts +18 -0
- package/dist/plugins/coords.d.ts.map +1 -0
- package/dist/plugins/hover.d.ts +15 -2
- package/dist/plugins/hover.d.ts.map +1 -1
- package/dist/plugins/hover.js +103 -16
- package/dist/plugins/hover.min.js +1 -1
- package/dist/plugins/labels-panel.d.ts +4 -0
- package/dist/plugins/labels-panel.d.ts.map +1 -0
- package/dist/plugins/labels-panel.js +122 -0
- package/dist/plugins/labels-panel.min.js +1 -0
- package/dist/plugins/labels.d.ts +17 -2
- package/dist/plugins/labels.d.ts.map +1 -1
- package/dist/plugins/labels.js +11 -99
- package/dist/plugins/labels.min.js +1 -1
- package/dist/plugins/legend.d.ts +16 -0
- package/dist/plugins/legend.d.ts.map +1 -0
- package/dist/plugins/legend.js +282 -0
- package/dist/plugins/legend.min.js +21 -0
- package/dist/plugins/shared.d.ts +7 -0
- package/dist/plugins/shared.d.ts.map +1 -0
- package/dist/plugins/zoom.d.ts +10 -2
- package/dist/plugins/zoom.d.ts.map +1 -1
- package/dist/plugins/zoom.js +227 -97
- package/dist/plugins/zoom.min.js +1 -1
- package/dist/types.d.ts +179 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +0 -0
- package/dist/types.min.js +0 -0
- package/dist/worker-inline.d.ts +1 -1
- package/dist/worker-inline.d.ts.map +1 -1
- package/package.json +13 -12
- package/readme.md +51 -42
- package/dist/chunk-bgfkgcmg.js +0 -25
- package/dist/chunk-cj3zanvs.min.js +0 -2
package/dist/gpu-worker.min.js
CHANGED
|
@@ -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{f as m}from"./chunk-dmaxrg6s.js";import{m as H,n as V}from"./chunk-bfyv7z27.js";import"./chunk-me3qaz3m.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)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)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,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;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"}
|
package/dist/plugins/hover.d.ts
CHANGED
|
@@ -1,3 +1,16 @@
|
|
|
1
|
-
import type { ChartPlugin } from "../
|
|
2
|
-
export
|
|
1
|
+
import type { ChartPlugin, HoverData } from "../types.ts";
|
|
2
|
+
export interface HoverConfig {
|
|
3
|
+
onHover?: (data: HoverData | null) => void;
|
|
4
|
+
showTooltip?: boolean;
|
|
5
|
+
pillDecayMs?: number;
|
|
6
|
+
fontFamily?: string;
|
|
7
|
+
formatX?: (value: number) => string;
|
|
8
|
+
formatY?: (value: number) => string;
|
|
9
|
+
}
|
|
10
|
+
declare module "../types.ts" {
|
|
11
|
+
interface ChartPluginRegistry {
|
|
12
|
+
hover: HoverConfig;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
export declare const hoverPlugin: ChartPlugin<HoverConfig>;
|
|
3
16
|
//# sourceMappingURL=hover.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hover.d.ts","sourceRoot":"","sources":["../../src/plugins/hover.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"hover.d.ts","sourceRoot":"","sources":["../../src/plugins/hover.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAiB,SAAS,EAAE,MAAM,aAAa,CAAC;AAkEzE,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI,KAAK,IAAI,CAAC;IAC3C,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IACpC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;CACrC;AAED,OAAO,QAAQ,aAAa,CAAC;IAC3B,UAAU,mBAAmB;QAC3B,KAAK,EAAE,WAAW,CAAC;KACpB;CACF;AAiCD,eAAO,MAAM,WAAW,EAAE,WAAW,CAAC,WAAW,CAiPhD,CAAC"}
|
package/dist/plugins/hover.js
CHANGED
|
@@ -1,9 +1,91 @@
|
|
|
1
|
+
import {
|
|
2
|
+
DEFAULT_FONT
|
|
3
|
+
} from "../chunk-a27be8p9.js";
|
|
4
|
+
import {
|
|
5
|
+
MARGIN
|
|
6
|
+
} from "../chunk-831dem4f.js";
|
|
1
7
|
import {
|
|
2
8
|
ChartManager
|
|
3
|
-
} from "../
|
|
4
|
-
import"../chunk-
|
|
9
|
+
} from "../chunk-g6m56ptf.js";
|
|
10
|
+
import"../chunk-93yrr7er.js";
|
|
11
|
+
import"../chunk-m17t3vjq.js";
|
|
12
|
+
|
|
13
|
+
// src/plugins/coords.ts
|
|
14
|
+
function dataToScreen(dataX, dataY, chart, width, height) {
|
|
15
|
+
const rX = chart.bounds.maxX - chart.bounds.minX;
|
|
16
|
+
const rY = chart.bounds.maxY - chart.bounds.minY;
|
|
17
|
+
const vW = rX / chart.view.zoomX;
|
|
18
|
+
const vH = rY / chart.view.zoomY;
|
|
19
|
+
const vMinX = chart.bounds.minX + chart.view.panX * rX;
|
|
20
|
+
const vMinY = chart.bounds.minY + chart.view.panY * rY;
|
|
21
|
+
return {
|
|
22
|
+
x: (dataX - vMinX) / vW * width,
|
|
23
|
+
y: height * (1 - (dataY - vMinY) / vH)
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
function screenToData(screenX, screenY, chart, width, height) {
|
|
27
|
+
const rX = chart.bounds.maxX - chart.bounds.minX;
|
|
28
|
+
const rY = chart.bounds.maxY - chart.bounds.minY;
|
|
29
|
+
const vW = rX / chart.view.zoomX;
|
|
30
|
+
const vH = rY / chart.view.zoomY;
|
|
31
|
+
const vMinX = chart.bounds.minX + chart.view.panX * rX;
|
|
32
|
+
const vMinY = chart.bounds.minY + chart.view.panY * rY;
|
|
33
|
+
return {
|
|
34
|
+
x: vMinX + screenX / width * vW,
|
|
35
|
+
y: vMinY + (1 - screenY / height) * vH
|
|
36
|
+
};
|
|
37
|
+
}
|
|
5
38
|
|
|
6
39
|
// src/plugins/hover.ts
|
|
40
|
+
var MAX_HOVER_PX = 50;
|
|
41
|
+
function findNearestPoint(chart, screenX, screenY, width, height) {
|
|
42
|
+
if (chart.series.length === 0)
|
|
43
|
+
return null;
|
|
44
|
+
const { x: dataX, y: dataY } = screenToData(screenX, screenY, chart, width, height);
|
|
45
|
+
const rX = chart.bounds.maxX - chart.bounds.minX;
|
|
46
|
+
const vW = rX / chart.view.zoomX;
|
|
47
|
+
const vMinX = chart.bounds.minX + chart.view.panX * rX;
|
|
48
|
+
let bsi = -1, bi = -1, bdx = Infinity, bdy = Infinity;
|
|
49
|
+
for (let s = 0;s < chart.series.length; s++) {
|
|
50
|
+
const sr2 = chart.series[s];
|
|
51
|
+
const n = sr2.rawX.length;
|
|
52
|
+
if (n === 0)
|
|
53
|
+
continue;
|
|
54
|
+
let lo = 0, hi = n - 1;
|
|
55
|
+
while (lo < hi) {
|
|
56
|
+
const mid = lo + hi >> 1;
|
|
57
|
+
if (sr2.rawX[mid] < dataX)
|
|
58
|
+
lo = mid + 1;
|
|
59
|
+
else
|
|
60
|
+
hi = mid;
|
|
61
|
+
}
|
|
62
|
+
let idx = lo;
|
|
63
|
+
if (lo > 0 && Math.abs(sr2.rawX[lo - 1] - dataX) < Math.abs(sr2.rawX[lo] - dataX))
|
|
64
|
+
idx = lo - 1;
|
|
65
|
+
const dx = Math.abs(sr2.rawX[idx] - dataX);
|
|
66
|
+
const dy = Math.abs(sr2.rawY[idx] - dataY);
|
|
67
|
+
if (dx < bdx || dx === bdx && dy < bdy) {
|
|
68
|
+
bdx = dx;
|
|
69
|
+
bdy = dy;
|
|
70
|
+
bsi = s;
|
|
71
|
+
bi = idx;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
if (bsi === -1)
|
|
75
|
+
return null;
|
|
76
|
+
const sr = chart.series[bsi];
|
|
77
|
+
if (Math.abs((sr.rawX[bi] - vMinX) / vW * width - screenX) > MAX_HOVER_PX)
|
|
78
|
+
return null;
|
|
79
|
+
return {
|
|
80
|
+
x: sr.rawX[bi],
|
|
81
|
+
y: sr.rawY[bi],
|
|
82
|
+
index: bi,
|
|
83
|
+
screenX,
|
|
84
|
+
screenY,
|
|
85
|
+
seriesIndex: bsi,
|
|
86
|
+
seriesLabel: sr.label
|
|
87
|
+
};
|
|
88
|
+
}
|
|
7
89
|
var states = new WeakMap;
|
|
8
90
|
var drawBox = (ctx, x, y, w, h, r, fill, stroke) => {
|
|
9
91
|
ctx.beginPath();
|
|
@@ -17,7 +99,7 @@ var drawBox = (ctx, x, y, w, h, r, fill, stroke) => {
|
|
|
17
99
|
var hoverPlugin = {
|
|
18
100
|
name: "hover",
|
|
19
101
|
install(chart, el) {
|
|
20
|
-
const mgr = ChartManager
|
|
102
|
+
const mgr = ChartManager;
|
|
21
103
|
const ac = new AbortController;
|
|
22
104
|
const s = {
|
|
23
105
|
hoverResult: null,
|
|
@@ -51,13 +133,21 @@ var hoverPlugin = {
|
|
|
51
133
|
s.pillAnimRef = requestAnimationFrame(tick);
|
|
52
134
|
}
|
|
53
135
|
};
|
|
54
|
-
|
|
136
|
+
const handleHover = (clientX, clientY) => {
|
|
55
137
|
if (chart.dragging)
|
|
56
138
|
return;
|
|
57
139
|
const r = el.getBoundingClientRect();
|
|
58
|
-
update(
|
|
59
|
-
}
|
|
60
|
-
|
|
140
|
+
update(findNearestPoint(chart, clientX - r.left, clientY - r.top, r.width, r.height));
|
|
141
|
+
};
|
|
142
|
+
el.addEventListener("mousemove", (e) => handleHover(e.clientX, e.clientY), {
|
|
143
|
+
signal: ac.signal
|
|
144
|
+
});
|
|
145
|
+
el.addEventListener("touchmove", (e) => {
|
|
146
|
+
if (e.touches.length === 1) {
|
|
147
|
+
handleHover(e.touches[0].clientX, e.touches[0].clientY);
|
|
148
|
+
}
|
|
149
|
+
}, { signal: ac.signal, passive: true });
|
|
150
|
+
["mouseleave", "pointerdown", "touchend", "touchcancel"].forEach((ev) => el.addEventListener(ev, () => update(null), { signal: ac.signal }));
|
|
61
151
|
},
|
|
62
152
|
afterDraw(ctx, chart) {
|
|
63
153
|
const s = states.get(chart);
|
|
@@ -66,17 +156,14 @@ var hoverPlugin = {
|
|
|
66
156
|
const { hoverResult: hvr } = s;
|
|
67
157
|
const w = chart.width;
|
|
68
158
|
const h = chart.height;
|
|
69
|
-
const margin =
|
|
70
|
-
const dark = ChartManager.
|
|
159
|
+
const margin = MARGIN;
|
|
160
|
+
const dark = ChartManager.isDark;
|
|
71
161
|
const {
|
|
72
162
|
formatX = String,
|
|
73
163
|
formatY = String,
|
|
74
|
-
fontFamily =
|
|
164
|
+
fontFamily = DEFAULT_FONT
|
|
75
165
|
} = chart.config;
|
|
76
|
-
const
|
|
77
|
-
const ry = (chart.bounds.maxY - chart.bounds.minY) / chart.view.zoomY;
|
|
78
|
-
const px = (hvr.x - (chart.bounds.minX + chart.view.panX * (chart.bounds.maxX - chart.bounds.minX))) / rx * w;
|
|
79
|
-
const py = h * (1 - (hvr.y - (chart.bounds.minY + chart.view.panY * (chart.bounds.maxY - chart.bounds.minY))) / ry);
|
|
166
|
+
const { x: px, y: py } = dataToScreen(hvr.x, hvr.y, chart, w, h);
|
|
80
167
|
const mainSeries = chart.series[hvr.seriesIndex] || chart.series[0];
|
|
81
168
|
const rgb = `${Math.round(mainSeries.color.r * 255)},${Math.round(mainSeries.color.g * 255)},${Math.round(mainSeries.color.b * 255)}`;
|
|
82
169
|
const col = `rgb(${rgb})`;
|
|
@@ -106,7 +193,7 @@ var hoverPlugin = {
|
|
|
106
193
|
ser.rawX[m] < hvr.x ? l = m + 1 : r = m - 1;
|
|
107
194
|
}
|
|
108
195
|
return null;
|
|
109
|
-
}).filter(
|
|
196
|
+
}).filter((x) => x !== null);
|
|
110
197
|
seriesData.sort((a, b) => Math.abs(b.rawVal) - Math.abs(a.rawVal));
|
|
111
198
|
const totalSeries = seriesData.length;
|
|
112
199
|
const displayData = seriesData.slice(0, 5);
|
|
@@ -142,7 +229,7 @@ var hoverPlugin = {
|
|
|
142
229
|
ctx.restore();
|
|
143
230
|
};
|
|
144
231
|
drawPill(Math.max(margin.left, Math.min(w - margin.right, s.pillX)), h - margin.bottom + 4, formatX(hvr.x), true);
|
|
145
|
-
drawPill(
|
|
232
|
+
drawPill(margin.left, Math.max(9, Math.min(h - margin.bottom - 9, s.pillY)), formatY(hvr.y), false);
|
|
146
233
|
const boxW = Math.max(...displayData.map((d) => ctx.measureText(d.label + d.val).width)) + 40;
|
|
147
234
|
const boxH = 30 + displayData.length * 18 + (remainingCount > 0 ? 18 : 0);
|
|
148
235
|
let bx = hvr.screenX + 14, by = hvr.screenY - boxH - 6;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{g as N}from"../chunk-qr6mweck.js";import{j as h}from"../chunk-e7d3zgw5.js";import{l as E}from"../chunk-94kc81rr.js";import"../chunk-bfyv7z27.js";import"../chunk-me3qaz3m.js";function V(e,o,l,i,t){let a=l.bounds.maxX-l.bounds.minX,s=l.bounds.maxY-l.bounds.minY,n=a/l.view.zoomX,f=s/l.view.zoomY,u=l.bounds.minX+l.view.panX*a,m=l.bounds.minY+l.view.panY*s;return{x:(e-u)/n*i,y:t*(1-(o-m)/f)}}function B(e,o,l,i,t){let a=l.bounds.maxX-l.bounds.minX,s=l.bounds.maxY-l.bounds.minY,n=a/l.view.zoomX,f=s/l.view.zoomY,u=l.bounds.minX+l.view.panX*a,m=l.bounds.minY+l.view.panY*s;return{x:u+e/i*n,y:m+(1-o/t)*f}}var q=50;function O(e,o,l,i,t){if(e.series.length===0)return null;let{x:a,y:s}=B(o,l,e,i,t),n=e.bounds.maxX-e.bounds.minX,f=n/e.view.zoomX,u=e.bounds.minX+e.view.panX*n,m=-1,g=-1,M=1/0,$=1/0;for(let R=0;R<e.series.length;R++){let v=e.series[R],C=v.rawX.length;if(C===0)continue;let d=0,w=C-1;while(d<w){let X=d+w>>1;if(v.rawX[X]<a)d=X+1;else w=X}let S=d;if(d>0&&Math.abs(v.rawX[d-1]-a)<Math.abs(v.rawX[d]-a))S=d-1;let D=Math.abs(v.rawX[S]-a),H=Math.abs(v.rawY[S]-s);if(D<M||D===M&&H<$)M=D,$=H,m=R,g=S}if(m===-1)return null;let T=e.series[m];if(Math.abs((T.rawX[g]-u)/f*i-o)>q)return null;return{x:T.rawX[g],y:T.rawY[g],index:g,screenX:o,screenY:l,seriesIndex:m,seriesLabel:T.label}}var I=new WeakMap,z=(e,o,l,i,t,a,s,n)=>{e.beginPath(),e.roundRect(o,l,i,t,a),e.fillStyle=s,e.fill(),e.strokeStyle=n,e.lineWidth=1.5,e.stroke()},x={name:"hover",install(e,o){let l=E,i=new AbortController,t={hoverResult:null,pillX:0,pillY:0,pillTargetX:0,pillTargetY:0,pillAnimRef:null,abort:i};I.set(e,t);let a=(n)=>{if(e.config.onHover)e.config.onHover(n);if(!(e.config.showTooltip??!1))return;if(t.hoverResult=n,l.drawChart(e),n&&!t.pillAnimRef){let f=performance.now(),u=(m)=>{if(!t.hoverResult)return t.pillAnimRef=null;let g=1-Math.pow(0.5,(m-f)/(e.config.pillDecayMs??60));f=m,t.pillX+=(t.pillTargetX-t.pillX)*g,t.pillY+=(t.pillTargetY-t.pillY)*g,l.drawChart(e),t.pillAnimRef=requestAnimationFrame(u)};t.pillAnimRef=requestAnimationFrame(u)}},s=(n,f)=>{if(e.dragging)return;let u=o.getBoundingClientRect();a(O(e,n-u.left,f-u.top,u.width,u.height))};o.addEventListener("mousemove",(n)=>s(n.clientX,n.clientY),{signal:i.signal}),o.addEventListener("touchmove",(n)=>{if(n.touches.length===1)s(n.touches[0].clientX,n.touches[0].clientY)},{signal:i.signal,passive:!0}),["mouseleave","pointerdown","touchend","touchcancel"].forEach((n)=>o.addEventListener(n,()=>a(null),{signal:i.signal}))},afterDraw(e,o){let l=I.get(o);if(!l?.hoverResult||!o.config.showTooltip)return;let{hoverResult:i}=l,t=o.width,a=o.height,s=h,n=E.isDark,{formatX:f=String,formatY:u=String,fontFamily:m=N}=o.config,{x:g,y:M}=V(i.x,i.y,o,t,a),$=o.series[i.seriesIndex]||o.series[0],T=`${Math.round($.color.r*255)},${Math.round($.color.g*255)},${Math.round($.color.b*255)}`,R=`rgb(${T})`,v=n?`oklch(from ${R} calc(l + 0.1) c h)`:R;e.save(),e.setLineDash([4,3]),e.strokeStyle=`rgba(${T},0.4)`,e.stroke(new Path2D(`M${g} 0V${a-s.bottom}M${s.left} ${M}H${t}`)),e.restore(),e.beginPath(),e.arc(g,M,4.5,0,Math.PI*2),e.fillStyle=R,e.fill(),e.strokeStyle=n?"rgba(0,0,0,0.6)":"rgba(255,255,255,0.9)",e.stroke();let C=o.series.map((r)=>{let p=0,y=r.rawX.length-1;while(p<=y){let b=p+y>>1;if(Math.abs(r.rawX[b]-i.x)<0.0001)return{label:r.label,val:u(r.rawY[b]),rawVal:r.rawY[b],col:`rgb(${Math.round(r.color.r*255)},${Math.round(r.color.g*255)},${Math.round(r.color.b*255)})`};r.rawX[b]<i.x?p=b+1:y=b-1}return null}).filter((r)=>r!==null);C.sort((r,p)=>Math.abs(p.rawVal)-Math.abs(r.rawVal));let d=C.length,w=C.slice(0,5),S=d-w.length;if(l.pillTargetX=g,l.pillTargetY=M,!l.pillAnimRef)l.pillX=g,l.pillY=M;let D=(r,p,y,b)=>{e.font=`600 10px ${m}`;let W=e.measureText(y).width,P=W+12,Y=18,G=b?r-P/2:r-P,U=b?p:p-Y/2;e.save();let _=b?Math.atan((l.pillTargetX-l.pillX)/80)*0.2:Math.atan((l.pillTargetY-l.pillY)/80)*0.2;e.translate(r,p),e.rotate(_);let F=b?-P/2:-P,L=b?0:-Y/2;e.beginPath(),e.roundRect(F,L,P,Y,4),e.fillStyle=n?"rgba(0,0,0,0.75)":"rgba(255,255,255,0.75)",e.fill(),e.fillStyle=`rgba(${T},0.2)`,e.fill(),e.strokeStyle=v,e.lineWidth=1.5,e.stroke(),e.fillStyle=v,e.textAlign="center",e.textBaseline="middle",e.fillText(y,F+P/2,L+Y/2),e.restore()};D(Math.max(s.left,Math.min(t-s.right,l.pillX)),a-s.bottom+4,f(i.x),!0),D(s.left,Math.max(9,Math.min(a-s.bottom-9,l.pillY)),u(i.y),!1);let H=Math.max(...w.map((r)=>e.measureText(r.label+r.val).width))+40,X=30+w.length*18+(S>0?18:0),A=i.screenX+14,k=i.screenY-X-6;if(A+H>t)A=i.screenX-H-14;if(k=Math.max(4,Math.min(a-X-4,i.screenY-X-6)),z(e,A,k,H,X,6,n?"rgba(28,28,30,0.95)":"rgba(255,255,255,0.96)","rgba(0,0,0,0.08)"),e.textAlign="left",e.textBaseline="middle",e.fillStyle=n?"#888":"#999",e.fillText(f(i.x),A+10,k+15),w.forEach((r,p)=>{let y=k+35+p*18;e.fillStyle=r.col,e.beginPath(),e.roundRect(A+10,y-4,8,8,2),e.fill(),e.fillStyle=n?"#eee":"#1a1a1a",e.fillText(`${r.label}: ${r.val}`,A+24,y)}),S>0){let r=k+35+w.length*18;e.fillStyle=n?"#666":"#aaa",e.fillText(`+${S} more`,A+10,r)}},uninstall(e){let o=I.get(e);if(o?.pillAnimRef)cancelAnimationFrame(o.pillAnimRef);o?.abort.abort(),I.delete(e)}};export{x as hoverPlugin};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"labels-panel.d.ts","sourceRoot":"","sources":["../../src/plugins/labels-panel.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAA8B,MAAM,aAAa,CAAC;AAG3E,OAAO,EAGL,KAAK,YAAY,EAClB,MAAM,aAAa,CAAC;AAgDrB,eAAO,MAAM,iBAAiB,EAAE,WAAW,CAAC,YAAY,CAgFvD,CAAC"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import {
|
|
2
|
+
DEFAULT_FONT,
|
|
3
|
+
DEFAULT_LABEL_SIZE
|
|
4
|
+
} from "../chunk-a27be8p9.js";
|
|
5
|
+
import {
|
|
6
|
+
MARGIN
|
|
7
|
+
} from "../chunk-831dem4f.js";
|
|
8
|
+
import {
|
|
9
|
+
ChartManager
|
|
10
|
+
} from "../chunk-g6m56ptf.js";
|
|
11
|
+
import"../chunk-93yrr7er.js";
|
|
12
|
+
import"../chunk-m17t3vjq.js";
|
|
13
|
+
|
|
14
|
+
// src/plugins/labels-panel.ts
|
|
15
|
+
var niceTicks = (min, max, count) => {
|
|
16
|
+
const range = max - min;
|
|
17
|
+
if (range <= 0)
|
|
18
|
+
return [min];
|
|
19
|
+
const rough = range / count, mag = 10 ** Math.floor(Math.log10(rough)), res = rough / mag;
|
|
20
|
+
const step = mag * (res <= 1.5 ? 1 : res <= 3 ? 2 : res <= 7 ? 5 : 10);
|
|
21
|
+
const ticks = [];
|
|
22
|
+
for (let v = Math.ceil(min / step) * step;v <= max; v += step)
|
|
23
|
+
ticks.push(v);
|
|
24
|
+
return ticks;
|
|
25
|
+
};
|
|
26
|
+
var getViewState = (chart) => {
|
|
27
|
+
const { width: w, height: h } = chart, m = MARGIN;
|
|
28
|
+
const { bounds: b, view: v } = chart, fullX = b.maxX - b.minX, fullY = b.maxY - b.minY;
|
|
29
|
+
const rx = fullX / v.zoomX, ry = fullY / v.zoomY;
|
|
30
|
+
const mx = b.minX + v.panX * fullX, my = b.minY + v.panY * fullY;
|
|
31
|
+
const bgc = chart.config.bgColor ?? (ChartManager.isDark ? [0.11, 0.11, 0.12] : [0.98, 0.98, 0.98]);
|
|
32
|
+
return {
|
|
33
|
+
w,
|
|
34
|
+
h,
|
|
35
|
+
m,
|
|
36
|
+
rx,
|
|
37
|
+
ry,
|
|
38
|
+
mx,
|
|
39
|
+
my,
|
|
40
|
+
bg: `rgb(${Math.round(bgc[0] * 255)},${Math.round(bgc[1] * 255)},${Math.round(bgc[2] * 255)})`,
|
|
41
|
+
bgAlpha: `rgba(${Math.round(bgc[0] * 255)},${Math.round(bgc[1] * 255)},${Math.round(bgc[2] * 255)},0.95)`,
|
|
42
|
+
border: ChartManager.isDark ? "rgba(255,255,255,0.15)" : "rgba(0,0,0,0.15)",
|
|
43
|
+
font: chart.config.fontFamily ?? DEFAULT_FONT,
|
|
44
|
+
text: chart.config.textColor ?? (ChartManager.isDark ? "#c0c0c0" : "#333333"),
|
|
45
|
+
grid: chart.config.gridColor ?? (ChartManager.isDark ? "rgba(255,255,255,0.06)" : "rgba(0,0,0,0.06)")
|
|
46
|
+
};
|
|
47
|
+
};
|
|
48
|
+
var labelsPanelPlugin = {
|
|
49
|
+
name: "labels-panel",
|
|
50
|
+
beforeDraw(ctx, chart) {
|
|
51
|
+
const { w, h, m, rx, ry, mx, my, grid } = getViewState(chart);
|
|
52
|
+
ctx.strokeStyle = grid;
|
|
53
|
+
ctx.lineWidth = 1;
|
|
54
|
+
ctx.beginPath();
|
|
55
|
+
niceTicks(my, my + ry, 7).forEach((v) => {
|
|
56
|
+
const y = h * (1 - (v - my) / ry);
|
|
57
|
+
if (y > 5 && y < h - m.bottom - 5) {
|
|
58
|
+
ctx.moveTo(m.left, y);
|
|
59
|
+
ctx.lineTo(w, y);
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
niceTicks(mx, mx + rx, 8).forEach((v) => {
|
|
63
|
+
const x = w * ((v - mx) / rx);
|
|
64
|
+
if (x > m.left && x < w) {
|
|
65
|
+
ctx.moveTo(x, 0);
|
|
66
|
+
ctx.lineTo(x, h - m.bottom);
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
ctx.stroke();
|
|
70
|
+
},
|
|
71
|
+
afterDraw(ctx, chart) {
|
|
72
|
+
const { w, h, m, rx, ry, mx, my, bgAlpha, border, font, text } = getViewState(chart);
|
|
73
|
+
const {
|
|
74
|
+
formatX = String,
|
|
75
|
+
formatY = String,
|
|
76
|
+
labelSize = DEFAULT_LABEL_SIZE
|
|
77
|
+
} = chart.config;
|
|
78
|
+
ctx.fillStyle = bgAlpha;
|
|
79
|
+
ctx.fillRect(0, 0, m.left, h - m.bottom);
|
|
80
|
+
ctx.fillRect(0, h - m.bottom, w, m.bottom);
|
|
81
|
+
ctx.strokeStyle = border;
|
|
82
|
+
ctx.lineWidth = 1;
|
|
83
|
+
ctx.beginPath();
|
|
84
|
+
ctx.moveTo(0, 0);
|
|
85
|
+
ctx.lineTo(m.left, 0);
|
|
86
|
+
ctx.moveTo(m.left, 0);
|
|
87
|
+
ctx.lineTo(m.left, h - m.bottom);
|
|
88
|
+
ctx.moveTo(0, 0);
|
|
89
|
+
ctx.lineTo(0, h);
|
|
90
|
+
ctx.moveTo(0, h);
|
|
91
|
+
ctx.lineTo(w, h);
|
|
92
|
+
ctx.moveTo(m.left, h - m.bottom);
|
|
93
|
+
ctx.lineTo(w, h - m.bottom);
|
|
94
|
+
ctx.moveTo(w, h - m.bottom);
|
|
95
|
+
ctx.lineTo(w, h);
|
|
96
|
+
ctx.stroke();
|
|
97
|
+
ctx.font = `${labelSize}px ${font}`;
|
|
98
|
+
ctx.fillStyle = text;
|
|
99
|
+
ctx.textAlign = "center";
|
|
100
|
+
ctx.textBaseline = "middle";
|
|
101
|
+
niceTicks(my, my + ry, 7).forEach((v) => {
|
|
102
|
+
const y = h * (1 - (v - my) / ry);
|
|
103
|
+
if (y > 5 && y < h - m.bottom - 5)
|
|
104
|
+
ctx.fillText(formatY(v), m.left / 2, y);
|
|
105
|
+
});
|
|
106
|
+
ctx.textAlign = "right";
|
|
107
|
+
ctx.textBaseline = "top";
|
|
108
|
+
niceTicks(mx, mx + rx, 8).forEach((v) => {
|
|
109
|
+
const x = w * ((v - mx) / rx);
|
|
110
|
+
if (x < m.left - 10 || x > w + 30)
|
|
111
|
+
return;
|
|
112
|
+
ctx.save();
|
|
113
|
+
ctx.translate(x, h - m.bottom * 0.7);
|
|
114
|
+
ctx.rotate(-Math.PI / 14);
|
|
115
|
+
ctx.fillText(formatX(v), 0, 0);
|
|
116
|
+
ctx.restore();
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
};
|
|
120
|
+
export {
|
|
121
|
+
labelsPanelPlugin
|
|
122
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{g as C,h as M}from"../chunk-qr6mweck.js";import{j as y}from"../chunk-e7d3zgw5.js";import{l as T}from"../chunk-94kc81rr.js";import"../chunk-bfyv7z27.js";import"../chunk-me3qaz3m.js";var d=(o,f,n)=>{let t=f-o;if(t<=0)return[o];let e=t/n,l=10**Math.floor(Math.log10(e)),a=e/l,r=l*(a<=1.5?1:a<=3?2:a<=7?5:10),m=[];for(let s=Math.ceil(o/r)*r;s<=f;s+=r)m.push(s);return m},p=(o)=>{let{width:f,height:n}=o,t=y,{bounds:e,view:l}=o,a=e.maxX-e.minX,r=e.maxY-e.minY,m=a/l.zoomX,s=r/l.zoomY,b=e.minX+l.panX*a,i=e.minY+l.panY*r,g=o.config.bgColor??(T.isDark?[0.11,0.11,0.12]:[0.98,0.98,0.98]);return{w:f,h:n,m:t,rx:m,ry:s,mx:b,my:i,bg:`rgb(${Math.round(g[0]*255)},${Math.round(g[1]*255)},${Math.round(g[2]*255)})`,bgAlpha:`rgba(${Math.round(g[0]*255)},${Math.round(g[1]*255)},${Math.round(g[2]*255)},0.95)`,border:T.isDark?"rgba(255,255,255,0.15)":"rgba(0,0,0,0.15)",font:o.config.fontFamily??C,text:o.config.textColor??(T.isDark?"#c0c0c0":"#333333"),grid:o.config.gridColor??(T.isDark?"rgba(255,255,255,0.06)":"rgba(0,0,0,0.06)")}},E={name:"labels-panel",beforeDraw(o,f){let{w:n,h:t,m:e,rx:l,ry:a,mx:r,my:m,grid:s}=p(f);o.strokeStyle=s,o.lineWidth=1,o.beginPath(),d(m,m+a,7).forEach((b)=>{let i=t*(1-(b-m)/a);if(i>5&&i<t-e.bottom-5)o.moveTo(e.left,i),o.lineTo(n,i)}),d(r,r+l,8).forEach((b)=>{let i=n*((b-r)/l);if(i>e.left&&i<n)o.moveTo(i,0),o.lineTo(i,t-e.bottom)}),o.stroke()},afterDraw(o,f){let{w:n,h:t,m:e,rx:l,ry:a,mx:r,my:m,bgAlpha:s,border:b,font:i,text:g}=p(f),{formatX:k=String,formatY:v=String,labelSize:S=M}=f.config;o.fillStyle=s,o.fillRect(0,0,e.left,t-e.bottom),o.fillRect(0,t-e.bottom,n,e.bottom),o.strokeStyle=b,o.lineWidth=1,o.beginPath(),o.moveTo(0,0),o.lineTo(e.left,0),o.moveTo(e.left,0),o.lineTo(e.left,t-e.bottom),o.moveTo(0,0),o.lineTo(0,t),o.moveTo(0,t),o.lineTo(n,t),o.moveTo(e.left,t-e.bottom),o.lineTo(n,t-e.bottom),o.moveTo(n,t-e.bottom),o.lineTo(n,t),o.stroke(),o.font=`${S}px ${i}`,o.fillStyle=g,o.textAlign="center",o.textBaseline="middle",d(m,m+a,7).forEach((u)=>{let h=t*(1-(u-m)/a);if(h>5&&h<t-e.bottom-5)o.fillText(v(u),e.left/2,h)}),o.textAlign="right",o.textBaseline="top",d(r,r+l,8).forEach((u)=>{let h=n*((u-r)/l);if(h<e.left-10||h>n+30)return;o.save(),o.translate(h,t-e.bottom*0.7),o.rotate(-Math.PI/14),o.fillText(k(u),0,0),o.restore()})}};export{E as labelsPanelPlugin};
|
package/dist/plugins/labels.d.ts
CHANGED
|
@@ -1,3 +1,18 @@
|
|
|
1
|
-
import type { ChartPlugin } from "../
|
|
2
|
-
export declare const
|
|
1
|
+
import type { ChartPlugin } from "../types.ts";
|
|
2
|
+
export declare const DEFAULT_FONT = "-apple-system, BlinkMacSystemFont, \"Segoe UI\", system-ui, sans-serif";
|
|
3
|
+
export declare const DEFAULT_LABEL_SIZE = 12;
|
|
4
|
+
export interface LabelsConfig {
|
|
5
|
+
textColor?: string;
|
|
6
|
+
gridColor?: string;
|
|
7
|
+
fontFamily?: string;
|
|
8
|
+
labelSize?: number;
|
|
9
|
+
formatX?: (value: number) => string;
|
|
10
|
+
formatY?: (value: number) => string;
|
|
11
|
+
}
|
|
12
|
+
declare module "../types.ts" {
|
|
13
|
+
interface ChartPluginRegistry {
|
|
14
|
+
labels: LabelsConfig;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
export declare const labelsPlugin: ChartPlugin<LabelsConfig>;
|
|
3
18
|
//# sourceMappingURL=labels.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"labels.d.ts","sourceRoot":"","sources":["../../src/plugins/labels.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,
|
|
1
|
+
{"version":3,"file":"labels.d.ts","sourceRoot":"","sources":["../../src/plugins/labels.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAA8B,MAAM,aAAa,CAAC;AAI3E,eAAO,MAAM,YAAY,2EAC+C,CAAC;AACzE,eAAO,MAAM,kBAAkB,KAAK,CAAC;AAErC,MAAM,WAAW,YAAY;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IACpC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;CACrC;AAED,OAAO,QAAQ,aAAa,CAAC;IAC3B,UAAU,mBAAmB;QAC3B,MAAM,EAAE,YAAY,CAAC;KACtB;CACF;AA8CD,eAAO,MAAM,YAAY,EAAE,WAAW,CAAC,YAAY,CAgFlD,CAAC"}
|