minerva-design 1.6.0 → 1.7.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/CHANGELOG.md +13 -0
- package/dist/charts/engine/data.cjs +1 -1
- package/dist/charts/engine/data.cjs.map +1 -1
- package/dist/charts/engine/data.d.cts +2 -0
- package/dist/charts/engine/data.d.ts +2 -0
- package/dist/charts/engine/data.js +6 -4
- package/dist/charts/engine/data.js.map +1 -1
- package/dist/charts/engine/defaults.cjs +1 -1
- package/dist/charts/engine/defaults.cjs.map +1 -1
- package/dist/charts/engine/defaults.js +22 -18
- package/dist/charts/engine/defaults.js.map +1 -1
- package/dist/charts/engine/graph/chart.cjs +1 -1
- package/dist/charts/engine/graph/chart.cjs.map +1 -1
- package/dist/charts/engine/graph/chart.js +532 -493
- package/dist/charts/engine/graph/chart.js.map +1 -1
- package/dist/charts/engine/graph/geometry.cjs +1 -1
- package/dist/charts/engine/graph/geometry.cjs.map +1 -1
- package/dist/charts/engine/graph/geometry.d.cts +12 -2
- package/dist/charts/engine/graph/geometry.d.ts +12 -2
- package/dist/charts/engine/graph/geometry.js +35 -31
- package/dist/charts/engine/graph/geometry.js.map +1 -1
- package/dist/charts/engine/model.cjs +1 -1
- package/dist/charts/engine/model.cjs.map +1 -1
- package/dist/charts/engine/model.js +95 -74
- package/dist/charts/engine/model.js.map +1 -1
- package/dist/charts/engine/orderbook/field.cjs +1 -1
- package/dist/charts/engine/orderbook/field.cjs.map +1 -1
- package/dist/charts/engine/orderbook/field.d.cts +15 -2
- package/dist/charts/engine/orderbook/field.d.ts +15 -2
- package/dist/charts/engine/orderbook/field.js +21 -9
- package/dist/charts/engine/orderbook/field.js.map +1 -1
- package/dist/charts/engine/orderbook/heatmap.cjs +1 -1
- package/dist/charts/engine/orderbook/heatmap.cjs.map +1 -1
- package/dist/charts/engine/orderbook/heatmap.d.cts +29 -0
- package/dist/charts/engine/orderbook/heatmap.d.ts +29 -0
- package/dist/charts/engine/orderbook/heatmap.js +576 -453
- package/dist/charts/engine/orderbook/heatmap.js.map +1 -1
- package/dist/charts/engine/orderbook/types.d.cts +36 -11
- package/dist/charts/engine/orderbook/types.d.ts +36 -11
- package/dist/charts/engine/presets.cjs +1 -1
- package/dist/charts/engine/presets.cjs.map +1 -1
- package/dist/charts/engine/presets.d.cts +16 -3
- package/dist/charts/engine/presets.d.ts +16 -3
- package/dist/charts/engine/presets.js +42 -32
- package/dist/charts/engine/presets.js.map +1 -1
- package/dist/charts/engine/scene.cjs +1 -1
- package/dist/charts/engine/scene.cjs.map +1 -1
- package/dist/charts/engine/scene.d.cts +4 -2
- package/dist/charts/engine/scene.d.ts +4 -2
- package/dist/charts/engine/scene.js +185 -107
- package/dist/charts/engine/scene.js.map +1 -1
- package/dist/charts/engine/three-d/oit.cjs +119 -34
- package/dist/charts/engine/three-d/oit.cjs.map +1 -1
- package/dist/charts/engine/three-d/oit.d.cts +65 -10
- package/dist/charts/engine/three-d/oit.d.ts +65 -10
- package/dist/charts/engine/three-d/oit.js +119 -34
- package/dist/charts/engine/three-d/oit.js.map +1 -1
- package/dist/charts/engine/three-d/render-types.cjs.map +1 -1
- package/dist/charts/engine/three-d/render-types.d.cts +19 -0
- package/dist/charts/engine/three-d/render-types.d.ts +19 -0
- package/dist/charts/engine/three-d/render-types.js.map +1 -1
- package/dist/charts/engine/three-d/shaders.cjs +14 -6
- package/dist/charts/engine/three-d/shaders.cjs.map +1 -1
- package/dist/charts/engine/three-d/shaders.d.cts +6 -1
- package/dist/charts/engine/three-d/shaders.d.ts +6 -1
- package/dist/charts/engine/three-d/shaders.js +40 -26
- package/dist/charts/engine/three-d/shaders.js.map +1 -1
- package/dist/charts/engine/three-d/webgl.cjs +1 -1
- package/dist/charts/engine/three-d/webgl.cjs.map +1 -1
- package/dist/charts/engine/three-d/webgl.js +167 -125
- package/dist/charts/engine/three-d/webgl.js.map +1 -1
- package/dist/charts/engine/three-d/webgpu.cjs +1 -1
- package/dist/charts/engine/three-d/webgpu.cjs.map +1 -1
- package/dist/charts/engine/three-d/webgpu.js +169 -140
- package/dist/charts/engine/three-d/webgpu.js.map +1 -1
- package/dist/charts/engine/trading/chart.cjs +1 -1
- package/dist/charts/engine/trading/chart.cjs.map +1 -1
- package/dist/charts/engine/trading/chart.js +1149 -1023
- package/dist/charts/engine/trading/chart.js.map +1 -1
- package/dist/charts/engine/trading/labels.cjs +1 -1
- package/dist/charts/engine/trading/labels.cjs.map +1 -1
- package/dist/charts/engine/trading/labels.js +12 -0
- package/dist/charts/engine/trading/labels.js.map +1 -1
- package/dist/charts/engine/trading/layout.cjs +2 -0
- package/dist/charts/engine/trading/layout.cjs.map +1 -0
- package/dist/charts/engine/trading/layout.d.cts +37 -0
- package/dist/charts/engine/trading/layout.d.ts +37 -0
- package/dist/charts/engine/trading/layout.js +63 -0
- package/dist/charts/engine/trading/layout.js.map +1 -0
- package/dist/charts/engine/trading/types.d.cts +24 -7
- package/dist/charts/engine/trading/types.d.ts +24 -7
- package/dist/charts/engine/types.d.cts +21 -8
- package/dist/charts/engine/types.d.ts +21 -8
- package/dist/core/contracts.cjs +1 -1
- package/dist/core/contracts.cjs.map +1 -1
- package/dist/core/contracts.js +1 -1
- package/dist/core/contracts.js.map +1 -1
- package/dist/native/charts/src/engine/data.cjs +1 -1
- package/dist/native/charts/src/engine/data.cjs.map +1 -1
- package/dist/native/charts/src/engine/data.js +6 -4
- package/dist/native/charts/src/engine/data.js.map +1 -1
- package/dist/native/charts/src/engine/model.cjs +1 -1
- package/dist/native/charts/src/engine/model.cjs.map +1 -1
- package/dist/native/charts/src/engine/model.js +104 -83
- package/dist/native/charts/src/engine/model.js.map +1 -1
- package/dist/native/charts/src/engine/presets.cjs +1 -1
- package/dist/native/charts/src/engine/presets.cjs.map +1 -1
- package/dist/native/charts/src/engine/presets.js +42 -32
- package/dist/native/charts/src/engine/presets.js.map +1 -1
- package/dist/native/charts/src/engine/scene.cjs +1 -1
- package/dist/native/charts/src/engine/scene.cjs.map +1 -1
- package/dist/native/charts/src/engine/scene.js +185 -107
- package/dist/native/charts/src/engine/scene.js.map +1 -1
- package/dist/taro/index.js +1263 -1152
- package/dist/vue/components/Chart/OrderBookHeatmap.vue.d.ts +11 -0
- package/dist/vue/components/Chart/orderbook.d.ts +7 -0
- package/dist/vue/components/Chart/orderbook.js +2 -0
- package/dist/vue/components/Chart/orderbook.js.map +1 -1
- package/dist/weapp/charts/canvas.js +234 -58
- package/package.json +1 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var e=(e,t,n,r,i,a,o,s,c)=>{let l=Math.hypot(r-t,i-n)+Math.hypot(a-r,o-i)+Math.hypot(s-a,c-o),u=Math.max(4,Math.min(28,Math.ceil(l/10)));for(let l=1;l<=u;l++){let d=l/u,f=1-d,p=f*f*f,m=3*f*f*d,h=3*f*d*d,g=d*d*d;e.push(p*t+m*r+h*a+g*s,p*n+m*i+h*o+g*c)}},t=(t,n,r,i,a,o)=>{let s=[t,n];return e(s,t,n,t+(r-t)*2/3,n+(i-n)*2/3,a+(r-a)*2/3,o+(i-o)*2/3,a,o),s},n=(t,n)=>{let r=[t[0],t[1]];for(let i=2;i<t.length;i+=2){let a=t[i-2],o=t[i-1],s=t[i],c=t[i+1];if(n){let t=(o+c)/2;e(r,a,o,a,t,s,t,s,c)}else{let t=(a+s)/2;e(r,a,o,t,o,t,c,s,c)}}return r},r=(e,t,n,r,i,a)=>{let o=e[e.length-2],s=e[e.length-1],c=Math.hypot(t-o,n-s),l=Math.hypot(r-t,i-n),u=Math.min(a,c/2,l/2);if(u<.5){e.push(t,n);return}let d=t-(t-o)/c*u,f=n-(n-s)/c*u,p=t+(r-t)/l*u,m=n+(i-n)/l*u;e.push(d,f);for(let r=1;r<=4;r++){let i=r/4,a=1-i;e.push(a*a*d+2*a*i*t+i*i*p,a*a*f+2*a*i*n+i*i*m)}},i=(e,t,n)=>{let
|
|
1
|
+
var e=(e,t,n,r,i,a,o,s,c)=>{let l=Math.hypot(r-t,i-n)+Math.hypot(a-r,o-i)+Math.hypot(s-a,c-o),u=Math.max(4,Math.min(28,Math.ceil(l/10)));for(let l=1;l<=u;l++){let d=l/u,f=1-d,p=f*f*f,m=3*f*f*d,h=3*f*d*d,g=d*d*d;e.push(p*t+m*r+h*a+g*s,p*n+m*i+h*o+g*c)}},t=(t,n,r,i,a,o)=>{let s=[t,n];return e(s,t,n,t+(r-t)*2/3,n+(i-n)*2/3,a+(r-a)*2/3,o+(i-o)*2/3,a,o),s},n=(t,n)=>{let r=[t[0],t[1]];for(let i=2;i<t.length;i+=2){let a=t[i-2],o=t[i-1],s=t[i],c=t[i+1];if(n){let t=(o+c)/2;e(r,a,o,a,t,s,t,s,c)}else{let t=(a+s)/2;e(r,a,o,t,o,t,c,s,c)}}return r},r=(e,t,n,r,i,a)=>{let o=e[e.length-2],s=e[e.length-1],c=Math.hypot(t-o,n-s),l=Math.hypot(r-t,i-n),u=Math.min(a,c/2,l/2);if(u<.5){e.push(t,n);return}let d=t-(t-o)/c*u,f=n-(n-s)/c*u,p=t+(r-t)/l*u,m=n+(i-n)/l*u;e.push(d,f);for(let r=1;r<=4;r++){let i=r/4,a=1-i;e.push(a*a*d+2*a*i*t+i*i*p,a*a*f+2*a*i*n+i*i*m)}},i=(e,t,n,r=0)=>{let i=[e[0],e[1]];for(let a=2;a<e.length;a+=2){let o=e[a-2],s=e[a-1],c=e[a],l=e[a+1],u=t?c-o:l-s;if(Math.abs(u)>.5){let e=t?l-s:c-o,a=Math.max(0,Math.abs(e)/2-n),d=Math.max(-a,Math.min(a,-r*Math.sign(u)*Math.sign(e)));if(t){let e=(s+l)/2+d;i.push(o,e,c,e)}else{let e=(o+c)/2+d;i.push(e,s,e,l)}}i.push(c,l)}return a(i,n)},a=(e,t)=>{let n=[e[0],e[1]],i=e.length-2;for(let a=2;a<i;a+=2)r(n,e[a],e[a+1],e[a+2],e[a+3],t);return i>=2&&n.push(e[i],e[i+1]),n},o=(e,t,n,r=1)=>{let i=(e+t)/2,a=Math.abs(t-e)/2,o=2*Math.max(4,Math.min(32,Math.ceil(a/12))),s=[],c=e<t?Math.PI:0,l=e<t?0:Math.PI;for(let e=0;e<=o;e++){let t=c+(l-c)*e/o;s.push(i+a*Math.cos(t),n-a*r*Math.sin(t))}return s},s=(t,n,r,i,a,o)=>{let s=.42,c=.8,l=Math.max(i,a)+o*2.2,u=r-s,d=r+s,f=[t+Math.cos(u)*i,n+Math.sin(u)*i];return e(f,f[0],f[1],t+Math.cos(r-c)*l,n+Math.sin(r-c)*l,t+Math.cos(r+c)*l,n+Math.sin(r+c)*l,t+Math.cos(d)*a,n+Math.sin(d)*a),f},c=(t,n,r,i,a,o,s,c=0)=>{let l=Math.cos(a),u=Math.sin(a),d=Math.abs(l)*i>=Math.abs(u)*r,f=d?l<0?-1:1:0,m=d?0:u<0?-1:1,h=-m,g=f,_=d?i/2:r/2,v=d?r/2:i/2,y=Math.min(s/2,_*.85),b=p(!0,r,i,l,u),x=Math.max(-(_-y),Math.min(_-y,l*b*h+u*b*g)),S=t+f*v+h*(x-y),C=n+m*v+g*(x-y),w=t+f*(v+c)+h*(x+y),T=n+m*(v+c)+g*(x+y),E=o*1.33,D=[S,C];return e(D,S,C,S+f*E-h*y*.6,C+m*E-g*y*.6,w+f*E+h*y*.6,T+m*E+g*y*.6,w,T),D},l=e=>{let t=0;for(let n=2;n<e.length;n+=2)t+=Math.hypot(e[n]-e[n-2],e[n+1]-e[n-1]);return t},u=(e,t,n)=>{let r=l(e);if(r<=t+n+1e-6){if(e.length<4)return e;let i=d(e,(t+n>0?t/(t+n):.5)*r);return[i[0],i[1],i[0],i[1]]}let i=[],a=d(e,t),o=d(e,r-n);i.push(a[0],a[1]);let s=0;for(let a=2;a<e.length;a+=2)s+=Math.hypot(e[a]-e[a-2],e[a+1]-e[a-1]),s>t&&s<r-n&&i.push(e[a],e[a+1]);return i.push(o[0],o[1]),i},d=(e,t)=>{let n=0;for(let r=2;r<e.length;r+=2){let i=e[r]-e[r-2],a=e[r+1]-e[r-1],o=Math.hypot(i,a);if(n+o>=t&&o>0){let s=(t-n)/o;return[e[r-2]+i*s,e[r-1]+a*s,i/o,a/o]}n+=o}let r=e.length-2,i=r>=2?e[r]-e[r-2]:1,a=r>=2?e[r+1]-e[r-1]:0,o=Math.hypot(i,a)||1;return[e[r],e[r+1],i/o,a/o]},f=e=>{for(let t=e.length-4;t>=0;t-=2){let n=e[e.length-2]-e[t],r=e[e.length-1]-e[t+1],i=Math.hypot(n,r);if(i>1e-9)return[n/i,r/i]}return[1,0]},p=(e,t,n,r,i)=>{if(!e)return t/2;let a=Math.abs(r),o=Math.abs(i),s=a>1e-9?t/2/a:1/0,c=o>1e-9?n/2/o:1/0;return Math.min(s,c)},m=(e,t,n,r,i,a,o)=>{let s=a*.42,c=t-r*a,l=n-i*a,u=c-i*s,d=l+r*s,f=c+i*s,p=l-r*s;e.push(u,d,t,n,f,p,u,d,o,o),e.push(t,n,c,l,o,o);let m=(u+c)/2,h=(d+l)/2,g=(f+c)/2,_=(p+l)/2;e.push(t,n,m,h,o,o,t,n,g,_,o,o)},h=(e,t,n,r,i,a,o,s)=>{let c=[t,n,r,i,a,o];c[0]>c[2]&&(c=[c[2],c[3],c[0],c[1],c[4],c[5]]),c[2]>c[4]&&(c=[c[0],c[1],c[4],c[5],c[2],c[3]]),c[0]>c[2]&&(c=[c[2],c[3],c[0],c[1],c[4],c[5]]);let[l,u,d,f,p,m]=c;if(!(p-l>1e-12))return;let h=u+(m-u)*(d-l)/(p-l);e.push(l,u,u,d,Math.max(f,h),Math.min(f,h),p,m,m,s,s,s)},g=(e,t,n,r,i)=>{let a=i*.5,o=e-n*i,s=t-r*i;return[e,t,o-r*a,s+n*a,e-n*i*.72,t-r*i*.72,o+r*a,s-n*a]},_=(e,t,n,r,i,a,o,s)=>{let[c,l,u,d,f,p,m,_]=g(n,r,i,a,o);h(e,c,l,u,d,f,p,s),h(e,c,l,f,p,m,_,s),t.push(u,d,c,l,m,_,f,p,u,d,s,s)},v=(e,t,n,r)=>{let i=[],a=l(e),o=t+n;if(o<=0||a<=0)return e.slice();for(let n=0;n<a;n+=o){let o=Math.min(a,n+t),s=d(e,n);i.push(s[0],s[1]);let c=0;for(let t=2;t<e.length;t+=2)c+=Math.hypot(e[t]-e[t-2],e[t+1]-e[t-1]),c>n&&c<o&&i.push(e[t],e[t+1]);let l=d(e,o);i.push(l[0],l[1],r,r)}return i},y=(e,t,n)=>{let r=1/0;for(let i=2;i<e.length;i+=2){let a=e[i-2],o=e[i-1],s=e[i]-a,c=e[i+1]-o,l=s*s+c*c,u=l>0?Math.max(0,Math.min(1,((t-a)*s+(n-o)*c)/l)):0,d=a+s*u-t,f=o+c*u-n;r=Math.min(r,d*d+f*f)}return r};exports.arcPath=o,exports.arrowHead=m,exports.boundaryDistance=p,exports.boxLoopPath=c,exports.cubicPoints=e,exports.dashPath=v,exports.distanceToPath=y,exports.endDirection=f,exports.filledArrow=_,exports.loopPath=s,exports.orthogonalPath=i,exports.pathLength=l,exports.pointAt=d,exports.quadraticPath=t,exports.roundCorners=a,exports.splinePath=n,exports.triangleArea=h,exports.trimPath=u;
|
|
2
2
|
//# sourceMappingURL=geometry.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"geometry.cjs","names":["cubicPoints","length","x1","x0","y1","y0","x2","y2","x3","y3","segments","i","t","u","a","b","c","d","out","quadraticPath","cx","cy","splinePath","points","vertical","my","mx","corner","px","py","inLen","outLen","nx","ny","r","radius","ax","ay","bx","by","orthogonalPath","corners","roundCorners","last","arcPath","from","to","y","rise","loopPath","open","wide","reach","start","end","size","a0","angle","a1","x","pathLength","trimPath","total","p","pointAt","startPoint","endPoint","walked","dx","dy","l","distance","k","endDirection","boundaryDistance","box","width","ux","uy","tx","ty","height","arrowHead","w","lx","ly","rx","ry","gap","triangleArea","y13","arrowCorners","filledArrow","fill","outline","dashPath","period","dash","space","distanceToPath","best","qx","qy"],"sources":["../../../../../charts/src/engine/graph/geometry.ts"],"sourcesContent":["// Edge geometry in layout units: curves sampled into polylines, trimming at\n// the node boundaries, arrowheads and dashes. Polylines are flat\n// `[x0, y0, x1, y1, …]` arrays.\n\n/** Points of a cubic Bézier (the start point excluded) */\nexport const cubicPoints = (\n out: number[],\n x0: number,\n y0: number,\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n x3: number,\n y3: number,\n): void => {\n const length =\n Math.hypot(x1 - x0, y1 - y0) +\n Math.hypot(x2 - x1, y2 - y1) +\n Math.hypot(x3 - x2, y3 - y2);\n const segments = Math.max(4, Math.min(28, Math.ceil(length / 10)));\n for (let i = 1; i <= segments; i++) {\n const t = i / segments;\n const u = 1 - t;\n const a = u * u * u;\n const b = 3 * u * u * t;\n const c = 3 * u * t * t;\n const d = t * t * t;\n out.push(\n a * x0 + b * x1 + c * x2 + d * x3,\n a * y0 + b * y1 + c * y2 + d * y3,\n );\n }\n};\n\n/** Points of a quadratic Bézier (the start point included) */\nexport const quadraticPath = (\n x0: number,\n y0: number,\n cx: number,\n cy: number,\n x1: number,\n y1: number,\n): number[] => {\n const out = [x0, y0];\n cubicPoints(\n out,\n x0,\n y0,\n x0 + ((cx - x0) * 2) / 3,\n y0 + ((cy - y0) * 2) / 3,\n x1 + ((cx - x1) * 2) / 3,\n y1 + ((cy - y1) * 2) / 3,\n x1,\n y1,\n );\n return out;\n};\n\n/**\n * Smooth path through waypoints whose tangents follow the flow axis\n * (vertical for top → bottom layouts): C1 at every waypoint\n */\nexport const splinePath = (\n points: readonly number[],\n vertical: boolean,\n): number[] => {\n const out = [points[0], points[1]];\n for (let i = 2; i < points.length; i += 2) {\n const x0 = points[i - 2];\n const y0 = points[i - 1];\n const x1 = points[i];\n const y1 = points[i + 1];\n if (vertical) {\n const my = (y0 + y1) / 2;\n cubicPoints(out, x0, y0, x0, my, x1, my, x1, y1);\n } else {\n const mx = (x0 + x1) / 2;\n cubicPoints(out, x0, y0, mx, y0, mx, y1, x1, y1);\n }\n }\n return out;\n};\n\n/** Rounded corner from the end of `out` through (cx, cy) towards (nx, ny) */\nconst corner = (\n out: number[],\n cx: number,\n cy: number,\n nx: number,\n ny: number,\n radius: number,\n) => {\n const px = out[out.length - 2];\n const py = out[out.length - 1];\n const inLen = Math.hypot(cx - px, cy - py);\n const outLen = Math.hypot(nx - cx, ny - cy);\n const r = Math.min(radius, inLen / 2, outLen / 2);\n if (r < 0.5) {\n out.push(cx, cy);\n return;\n }\n const ax = cx - ((cx - px) / inLen) * r;\n const ay = cy - ((cy - py) / inLen) * r;\n const bx = cx + ((nx - cx) / outLen) * r;\n const by = cy + ((ny - cy) / outLen) * r;\n out.push(ax, ay);\n // quadratic arc around the corner\n for (let i = 1; i <= 4; i++) {\n const t = i / 4;\n const u = 1 - t;\n out.push(\n u * u * ax + 2 * u * t * cx + t * t * bx,\n u * u * ay + 2 * u * t * cy + t * t * by,\n );\n }\n};\n\n/**\n * Orthogonal path through waypoints: along the flow axis to the middle,\n * across, then along the axis again, with rounded corners\n */\nexport const orthogonalPath = (\n points: readonly number[],\n vertical: boolean,\n radius: number,\n): number[] => {\n const corners: number[] = [points[0], points[1]];\n for (let i = 2; i < points.length; i += 2) {\n const x0 = points[i - 2];\n const y0 = points[i - 1];\n const x1 = points[i];\n const y1 = points[i + 1];\n if (Math.abs(vertical ? x1 - x0 : y1 - y0) > 0.5) {\n if (vertical) {\n const my = (y0 + y1) / 2;\n corners.push(x0, my, x1, my);\n } else {\n const mx = (x0 + x1) / 2;\n corners.push(mx, y0, mx, y1);\n }\n }\n corners.push(x1, y1);\n }\n return roundCorners(corners, radius);\n};\n\n/** Polyline with rounded corners */\nexport const roundCorners = (\n corners: readonly number[],\n radius: number,\n): number[] => {\n const out = [corners[0], corners[1]];\n const last = corners.length - 2;\n for (let i = 2; i < last; i += 2) {\n corner(\n out,\n corners[i],\n corners[i + 1],\n corners[i + 2],\n corners[i + 3],\n radius,\n );\n }\n if (last >= 2) out.push(corners[last], corners[last + 1]);\n return out;\n};\n\n/** Upper half circle between two points of the x axis (arc diagrams) */\nexport const arcPath = (\n ax: number,\n bx: number,\n y: number,\n rise = 1,\n): number[] => {\n const cx = (ax + bx) / 2;\n const r = Math.abs(bx - ax) / 2;\n const segments = 2 * Math.max(4, Math.min(32, Math.ceil(r / 12)));\n const out: number[] = [];\n const from = ax < bx ? Math.PI : 0;\n const to = ax < bx ? 0 : Math.PI;\n for (let i = 0; i <= segments; i++) {\n const a = from + ((to - from) * i) / segments;\n out.push(cx + r * Math.cos(a), y - r * rise * Math.sin(a));\n }\n return out;\n};\n\n/**\n * Self-loop of a node at (x, y): a teardrop leaving the boundary at\n * `start` units from the center and coming back at `end` units, centered on\n * the direction `angle`, reaching about `size` units beyond the boundary\n */\nexport const loopPath = (\n x: number,\n y: number,\n angle: number,\n start: number,\n end: number,\n size: number,\n): number[] => {\n const open = 0.42;\n const wide = 0.8;\n const reach = Math.max(start, end) + size * 2.2;\n const a0 = angle - open;\n const a1 = angle + open;\n const out = [x + Math.cos(a0) * start, y + Math.sin(a0) * start];\n cubicPoints(\n out,\n out[0],\n out[1],\n x + Math.cos(angle - wide) * reach,\n y + Math.sin(angle - wide) * reach,\n x + Math.cos(angle + wide) * reach,\n y + Math.sin(angle + wide) * reach,\n x + Math.cos(a1) * end,\n y + Math.sin(a1) * end,\n );\n return out;\n};\n\n/** Length of a polyline */\nexport const pathLength = (points: readonly number[]): number => {\n let length = 0;\n for (let i = 2; i < points.length; i += 2)\n length += Math.hypot(\n points[i] - points[i - 2],\n points[i + 1] - points[i - 1],\n );\n return length;\n};\n\n/** Removes `start` / `end` units from the ends of a polyline */\nexport const trimPath = (\n points: number[],\n start: number,\n end: number,\n): number[] => {\n const total = pathLength(points);\n if (total <= start + end + 1e-6) {\n // too short: a zero-length segment in the middle keeps the direction\n if (points.length < 4) return points;\n const t = start + end > 0 ? start / (start + end) : 0.5;\n const p = pointAt(points, t * total);\n return [p[0], p[1], p[0], p[1]];\n }\n const out: number[] = [];\n const startPoint = pointAt(points, start);\n const endPoint = pointAt(points, total - end);\n out.push(startPoint[0], startPoint[1]);\n let walked = 0;\n for (let i = 2; i < points.length; i += 2) {\n walked += Math.hypot(\n points[i] - points[i - 2],\n points[i + 1] - points[i - 1],\n );\n if (walked > start && walked < total - end)\n out.push(points[i], points[i + 1]);\n }\n out.push(endPoint[0], endPoint[1]);\n return out;\n};\n\n/** Point and direction at a distance along a polyline */\nexport const pointAt = (\n points: readonly number[],\n distance: number,\n): [number, number, number, number] => {\n let walked = 0;\n for (let i = 2; i < points.length; i += 2) {\n const dx = points[i] - points[i - 2];\n const dy = points[i + 1] - points[i - 1];\n const l = Math.hypot(dx, dy);\n if (walked + l >= distance && l > 0) {\n const t = (distance - walked) / l;\n return [points[i - 2] + dx * t, points[i - 1] + dy * t, dx / l, dy / l];\n }\n walked += l;\n }\n const k = points.length - 2;\n const dx = k >= 2 ? points[k] - points[k - 2] : 1;\n const dy = k >= 2 ? points[k + 1] - points[k - 1] : 0;\n const l = Math.hypot(dx, dy) || 1;\n return [points[k], points[k + 1], dx / l, dy / l];\n};\n\n/** Direction at the end of a polyline (unit vector) */\nexport const endDirection = (points: readonly number[]): [number, number] => {\n for (let i = points.length - 4; i >= 0; i -= 2) {\n const dx = points[points.length - 2] - points[i];\n const dy = points[points.length - 1] - points[i + 1];\n const l = Math.hypot(dx, dy);\n if (l > 1e-9) return [dx / l, dy / l];\n }\n return [1, 0];\n};\n\n/** Distance from the center of a node to its boundary in direction (ux, uy) */\nexport const boundaryDistance = (\n box: boolean,\n width: number,\n height: number,\n ux: number,\n uy: number,\n): number => {\n if (!box) return width / 2;\n const ax = Math.abs(ux);\n const ay = Math.abs(uy);\n const tx = ax > 1e-9 ? width / 2 / ax : Infinity;\n const ty = ay > 1e-9 ? height / 2 / ay : Infinity;\n return Math.min(tx, ty);\n};\n\n/**\n * Arrowhead at (tx, ty) pointing along (ux, uy): the outline of a narrow\n * triangle and its axis, drawn with the line width it looks solid\n */\nexport const arrowHead = (\n out: number[],\n tx: number,\n ty: number,\n ux: number,\n uy: number,\n length: number,\n gap: number,\n): void => {\n const w = length * 0.42;\n const bx = tx - ux * length;\n const by = ty - uy * length;\n const lx = bx - uy * w;\n const ly = by + ux * w;\n const rx = bx + uy * w;\n const ry = by - ux * w;\n out.push(lx, ly, tx, ty, rx, ry, lx, ly, gap, gap);\n out.push(tx, ty, bx, by, gap, gap);\n const mx = (lx + bx) / 2;\n const my = (ly + by) / 2;\n const nx = (rx + bx) / 2;\n const ny = (ry + by) / 2;\n out.push(tx, ty, mx, my, gap, gap, tx, ty, nx, ny, gap, gap);\n};\n\n/** Filled triangle as area points (x, top, bottom): two x-monotone pieces */\nexport const triangleArea = (\n out: number[],\n ax: number,\n ay: number,\n bx: number,\n by: number,\n cx: number,\n cy: number,\n gap: number,\n): void => {\n // sort the corners by x\n let p = [ax, ay, bx, by, cx, cy];\n if (p[0] > p[2]) p = [p[2], p[3], p[0], p[1], p[4], p[5]];\n if (p[2] > p[4]) p = [p[0], p[1], p[4], p[5], p[2], p[3]];\n if (p[0] > p[2]) p = [p[2], p[3], p[0], p[1], p[4], p[5]];\n const [x1, y1, x2, y2, x3, y3] = p;\n if (!(x3 - x1 > 1e-12)) return;\n // the long side at the middle corner; the larger y is always the top, so\n // every triangle winds the same way (overlapping ones never cancel)\n const y13 = y1 + ((y3 - y1) * (x2 - x1)) / (x3 - x1);\n out.push(\n x1,\n y1,\n y1,\n x2,\n Math.max(y2, y13),\n Math.min(y2, y13),\n x3,\n y3,\n y3,\n gap,\n gap,\n gap,\n );\n};\n\n/** Corners of a filled (\"stealth\") arrowhead: tip, left, notch, right */\nconst arrowCorners = (\n tx: number,\n ty: number,\n ux: number,\n uy: number,\n length: number,\n): number[] => {\n const w = length * 0.5;\n const bx = tx - ux * length;\n const by = ty - uy * length;\n return [\n tx,\n ty,\n bx - uy * w,\n by + ux * w,\n tx - ux * length * 0.72,\n ty - uy * length * 0.72,\n bx + uy * w,\n by - ux * w,\n ];\n};\n\n/**\n * Filled arrowhead at (tx, ty) pointing along (ux, uy): area triangles in\n * `fill`, its outline (anti-aliased edges) in `outline`\n */\nexport const filledArrow = (\n fill: number[],\n outline: number[],\n tx: number,\n ty: number,\n ux: number,\n uy: number,\n length: number,\n gap: number,\n): void => {\n const [x0, y0, lx, ly, nx, ny, rx, ry] = arrowCorners(tx, ty, ux, uy, length);\n triangleArea(fill, x0, y0, lx, ly, nx, ny, gap);\n triangleArea(fill, x0, y0, nx, ny, rx, ry, gap);\n outline.push(lx, ly, x0, y0, rx, ry, nx, ny, lx, ly, gap, gap);\n};\n\n/** Splits a polyline into dashes (`dash` / `space` in layout units) */\nexport const dashPath = (\n points: readonly number[],\n dash: number,\n space: number,\n gap: number,\n): number[] => {\n const out: number[] = [];\n const total = pathLength(points);\n const period = dash + space;\n if (period <= 0 || total <= 0) return points.slice();\n for (let start = 0; start < total; start += period) {\n const end = Math.min(total, start + dash);\n const a = pointAt(points, start);\n out.push(a[0], a[1]);\n let walked = 0;\n for (let i = 2; i < points.length; i += 2) {\n walked += Math.hypot(\n points[i] - points[i - 2],\n points[i + 1] - points[i - 1],\n );\n if (walked > start && walked < end) out.push(points[i], points[i + 1]);\n }\n const b = pointAt(points, end);\n out.push(b[0], b[1], gap, gap);\n }\n return out;\n};\n\n/** Squared distance from (px, py) to a polyline */\nexport const distanceToPath = (\n points: readonly number[],\n px: number,\n py: number,\n): number => {\n let best = Infinity;\n for (let i = 2; i < points.length; i += 2) {\n const ax = points[i - 2];\n const ay = points[i - 1];\n const dx = points[i] - ax;\n const dy = points[i + 1] - ay;\n const l = dx * dx + dy * dy;\n const t =\n l > 0\n ? Math.max(0, Math.min(1, ((px - ax) * dx + (py - ay) * dy) / l))\n : 0;\n const qx = ax + dx * t - px;\n const qy = ay + dy * t - py;\n best = Math.min(best, qx * qx + qy * qy);\n }\n return best;\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"geometry.cjs","names":["cubicPoints","length","x1","x0","y1","y0","x2","y2","x3","y3","segments","i","t","u","a","b","c","d","out","quadraticPath","cx","cy","splinePath","points","vertical","my","mx","corner","px","py","inLen","outLen","nx","ny","r","radius","ax","ay","bx","by","orthogonalPath","corners","across","along","limit","shift","lane","roundCorners","last","arcPath","from","to","y","rise","loopPath","open","wide","reach","start","end","size","a0","angle","a1","x","boxLoopPath","s","leftRight","h","w","tx","ty","half","depth","sp","spread","dist","boundaryDistance","endGap","lift","pathLength","trimPath","total","p","pointAt","startPoint","endPoint","walked","dx","dy","l","distance","k","endDirection","box","width","ux","uy","height","arrowHead","lx","ly","rx","ry","gap","triangleArea","y13","arrowCorners","filledArrow","fill","outline","dashPath","period","dash","space","distanceToPath","best","qx","qy"],"sources":["../../../../../charts/src/engine/graph/geometry.ts"],"sourcesContent":["// Edge geometry in layout units: curves sampled into polylines, trimming at\n// the node boundaries, arrowheads and dashes. Polylines are flat\n// `[x0, y0, x1, y1, …]` arrays.\n\n/** Points of a cubic Bézier (the start point excluded) */\nexport const cubicPoints = (\n out: number[],\n x0: number,\n y0: number,\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n x3: number,\n y3: number,\n): void => {\n const length =\n Math.hypot(x1 - x0, y1 - y0) +\n Math.hypot(x2 - x1, y2 - y1) +\n Math.hypot(x3 - x2, y3 - y2);\n const segments = Math.max(4, Math.min(28, Math.ceil(length / 10)));\n for (let i = 1; i <= segments; i++) {\n const t = i / segments;\n const u = 1 - t;\n const a = u * u * u;\n const b = 3 * u * u * t;\n const c = 3 * u * t * t;\n const d = t * t * t;\n out.push(\n a * x0 + b * x1 + c * x2 + d * x3,\n a * y0 + b * y1 + c * y2 + d * y3,\n );\n }\n};\n\n/** Points of a quadratic Bézier (the start point included) */\nexport const quadraticPath = (\n x0: number,\n y0: number,\n cx: number,\n cy: number,\n x1: number,\n y1: number,\n): number[] => {\n const out = [x0, y0];\n cubicPoints(\n out,\n x0,\n y0,\n x0 + ((cx - x0) * 2) / 3,\n y0 + ((cy - y0) * 2) / 3,\n x1 + ((cx - x1) * 2) / 3,\n y1 + ((cy - y1) * 2) / 3,\n x1,\n y1,\n );\n return out;\n};\n\n/**\n * Smooth path through waypoints whose tangents follow the flow axis\n * (vertical for top → bottom layouts): C1 at every waypoint\n */\nexport const splinePath = (\n points: readonly number[],\n vertical: boolean,\n): number[] => {\n const out = [points[0], points[1]];\n for (let i = 2; i < points.length; i += 2) {\n const x0 = points[i - 2];\n const y0 = points[i - 1];\n const x1 = points[i];\n const y1 = points[i + 1];\n if (vertical) {\n const my = (y0 + y1) / 2;\n cubicPoints(out, x0, y0, x0, my, x1, my, x1, y1);\n } else {\n const mx = (x0 + x1) / 2;\n cubicPoints(out, x0, y0, mx, y0, mx, y1, x1, y1);\n }\n }\n return out;\n};\n\n/** Rounded corner from the end of `out` through (cx, cy) towards (nx, ny) */\nconst corner = (\n out: number[],\n cx: number,\n cy: number,\n nx: number,\n ny: number,\n radius: number,\n) => {\n const px = out[out.length - 2];\n const py = out[out.length - 1];\n const inLen = Math.hypot(cx - px, cy - py);\n const outLen = Math.hypot(nx - cx, ny - cy);\n const r = Math.min(radius, inLen / 2, outLen / 2);\n if (r < 0.5) {\n out.push(cx, cy);\n return;\n }\n const ax = cx - ((cx - px) / inLen) * r;\n const ay = cy - ((cy - py) / inLen) * r;\n const bx = cx + ((nx - cx) / outLen) * r;\n const by = cy + ((ny - cy) / outLen) * r;\n out.push(ax, ay);\n // quadratic arc around the corner\n for (let i = 1; i <= 4; i++) {\n const t = i / 4;\n const u = 1 - t;\n out.push(\n u * u * ax + 2 * u * t * cx + t * t * bx,\n u * u * ay + 2 * u * t * cy + t * t * by,\n );\n }\n};\n\n/**\n * Orthogonal path through waypoints: along the flow axis to the middle,\n * across, then along the axis again, with rounded corners. `lane` moves the\n * crossing segments of a route that sits `lane` units off to the + side of\n * the cross axis: such routes turn earlier when heading to the + side (later\n * otherwise), so parallel routes nest instead of crossing each other\n */\nexport const orthogonalPath = (\n points: readonly number[],\n vertical: boolean,\n radius: number,\n lane = 0,\n): number[] => {\n const corners: number[] = [points[0], points[1]];\n for (let i = 2; i < points.length; i += 2) {\n const x0 = points[i - 2];\n const y0 = points[i - 1];\n const x1 = points[i];\n const y1 = points[i + 1];\n const across = vertical ? x1 - x0 : y1 - y0;\n if (Math.abs(across) > 0.5) {\n const along = vertical ? y1 - y0 : x1 - x0;\n const limit = Math.max(0, Math.abs(along) / 2 - radius);\n const shift = Math.max(\n -limit,\n Math.min(limit, -lane * Math.sign(across) * Math.sign(along)),\n );\n if (vertical) {\n const my = (y0 + y1) / 2 + shift;\n corners.push(x0, my, x1, my);\n } else {\n const mx = (x0 + x1) / 2 + shift;\n corners.push(mx, y0, mx, y1);\n }\n }\n corners.push(x1, y1);\n }\n return roundCorners(corners, radius);\n};\n\n/** Polyline with rounded corners */\nexport const roundCorners = (\n corners: readonly number[],\n radius: number,\n): number[] => {\n const out = [corners[0], corners[1]];\n const last = corners.length - 2;\n for (let i = 2; i < last; i += 2) {\n corner(\n out,\n corners[i],\n corners[i + 1],\n corners[i + 2],\n corners[i + 3],\n radius,\n );\n }\n if (last >= 2) out.push(corners[last], corners[last + 1]);\n return out;\n};\n\n/** Upper half circle between two points of the x axis (arc diagrams) */\nexport const arcPath = (\n ax: number,\n bx: number,\n y: number,\n rise = 1,\n): number[] => {\n const cx = (ax + bx) / 2;\n const r = Math.abs(bx - ax) / 2;\n const segments = 2 * Math.max(4, Math.min(32, Math.ceil(r / 12)));\n const out: number[] = [];\n const from = ax < bx ? Math.PI : 0;\n const to = ax < bx ? 0 : Math.PI;\n for (let i = 0; i <= segments; i++) {\n const a = from + ((to - from) * i) / segments;\n out.push(cx + r * Math.cos(a), y - r * rise * Math.sin(a));\n }\n return out;\n};\n\n/**\n * Self-loop of a node at (x, y): a teardrop leaving the boundary at\n * `start` units from the center and coming back at `end` units, centered on\n * the direction `angle`, reaching about `size` units beyond the boundary\n */\nexport const loopPath = (\n x: number,\n y: number,\n angle: number,\n start: number,\n end: number,\n size: number,\n): number[] => {\n const open = 0.42;\n const wide = 0.8;\n const reach = Math.max(start, end) + size * 2.2;\n const a0 = angle - open;\n const a1 = angle + open;\n const out = [x + Math.cos(a0) * start, y + Math.sin(a0) * start];\n cubicPoints(\n out,\n out[0],\n out[1],\n x + Math.cos(angle - wide) * reach,\n y + Math.sin(angle - wide) * reach,\n x + Math.cos(angle + wide) * reach,\n y + Math.sin(angle + wide) * reach,\n x + Math.cos(a1) * end,\n y + Math.sin(a1) * end,\n );\n return out;\n};\n\n/**\n * Self-loop on a side of a w × h box centered at (x, y): the side hit by the\n * direction `angle`, with feet `spread` units apart along the side (clamped\n * to it), reaching `reach` units beyond it. The end stops `endGap` units off\n * the side (room for an arrowhead pointing into the box)\n */\nexport const boxLoopPath = (\n x: number,\n y: number,\n w: number,\n h: number,\n angle: number,\n reach: number,\n spread: number,\n endGap = 0,\n): number[] => {\n const c = Math.cos(angle);\n const s = Math.sin(angle);\n const leftRight = Math.abs(c) * h >= Math.abs(s) * w;\n const nx = leftRight ? (c < 0 ? -1 : 1) : 0;\n const ny = leftRight ? 0 : s < 0 ? -1 : 1;\n // tangent: the normal turned a quarter clockwise\n const tx = -ny;\n const ty = nx;\n const half = leftRight ? h / 2 : w / 2;\n const depth = leftRight ? w / 2 : h / 2;\n const sp = Math.min(spread / 2, half * 0.85);\n const dist = boundaryDistance(true, w, h, c, s);\n const u = Math.max(\n -(half - sp),\n Math.min(half - sp, c * dist * tx + s * dist * ty),\n );\n const ax = x + nx * depth + tx * (u - sp);\n const ay = y + ny * depth + ty * (u - sp);\n const bx = x + nx * (depth + endGap) + tx * (u + sp);\n const by = y + ny * (depth + endGap) + ty * (u + sp);\n const lift = reach * 1.33;\n const out = [ax, ay];\n cubicPoints(\n out,\n ax,\n ay,\n ax + nx * lift - tx * sp * 0.6,\n ay + ny * lift - ty * sp * 0.6,\n bx + nx * lift + tx * sp * 0.6,\n by + ny * lift + ty * sp * 0.6,\n bx,\n by,\n );\n return out;\n};\n\n/** Length of a polyline */\nexport const pathLength = (points: readonly number[]): number => {\n let length = 0;\n for (let i = 2; i < points.length; i += 2)\n length += Math.hypot(\n points[i] - points[i - 2],\n points[i + 1] - points[i - 1],\n );\n return length;\n};\n\n/** Removes `start` / `end` units from the ends of a polyline */\nexport const trimPath = (\n points: number[],\n start: number,\n end: number,\n): number[] => {\n const total = pathLength(points);\n if (total <= start + end + 1e-6) {\n // too short: a zero-length segment in the middle keeps the direction\n if (points.length < 4) return points;\n const t = start + end > 0 ? start / (start + end) : 0.5;\n const p = pointAt(points, t * total);\n return [p[0], p[1], p[0], p[1]];\n }\n const out: number[] = [];\n const startPoint = pointAt(points, start);\n const endPoint = pointAt(points, total - end);\n out.push(startPoint[0], startPoint[1]);\n let walked = 0;\n for (let i = 2; i < points.length; i += 2) {\n walked += Math.hypot(\n points[i] - points[i - 2],\n points[i + 1] - points[i - 1],\n );\n if (walked > start && walked < total - end)\n out.push(points[i], points[i + 1]);\n }\n out.push(endPoint[0], endPoint[1]);\n return out;\n};\n\n/** Point and direction at a distance along a polyline */\nexport const pointAt = (\n points: readonly number[],\n distance: number,\n): [number, number, number, number] => {\n let walked = 0;\n for (let i = 2; i < points.length; i += 2) {\n const dx = points[i] - points[i - 2];\n const dy = points[i + 1] - points[i - 1];\n const l = Math.hypot(dx, dy);\n if (walked + l >= distance && l > 0) {\n const t = (distance - walked) / l;\n return [points[i - 2] + dx * t, points[i - 1] + dy * t, dx / l, dy / l];\n }\n walked += l;\n }\n const k = points.length - 2;\n const dx = k >= 2 ? points[k] - points[k - 2] : 1;\n const dy = k >= 2 ? points[k + 1] - points[k - 1] : 0;\n const l = Math.hypot(dx, dy) || 1;\n return [points[k], points[k + 1], dx / l, dy / l];\n};\n\n/** Direction at the end of a polyline (unit vector) */\nexport const endDirection = (points: readonly number[]): [number, number] => {\n for (let i = points.length - 4; i >= 0; i -= 2) {\n const dx = points[points.length - 2] - points[i];\n const dy = points[points.length - 1] - points[i + 1];\n const l = Math.hypot(dx, dy);\n if (l > 1e-9) return [dx / l, dy / l];\n }\n return [1, 0];\n};\n\n/** Distance from the center of a node to its boundary in direction (ux, uy) */\nexport const boundaryDistance = (\n box: boolean,\n width: number,\n height: number,\n ux: number,\n uy: number,\n): number => {\n if (!box) return width / 2;\n const ax = Math.abs(ux);\n const ay = Math.abs(uy);\n const tx = ax > 1e-9 ? width / 2 / ax : Infinity;\n const ty = ay > 1e-9 ? height / 2 / ay : Infinity;\n return Math.min(tx, ty);\n};\n\n/**\n * Arrowhead at (tx, ty) pointing along (ux, uy): the outline of a narrow\n * triangle and its axis, drawn with the line width it looks solid\n */\nexport const arrowHead = (\n out: number[],\n tx: number,\n ty: number,\n ux: number,\n uy: number,\n length: number,\n gap: number,\n): void => {\n const w = length * 0.42;\n const bx = tx - ux * length;\n const by = ty - uy * length;\n const lx = bx - uy * w;\n const ly = by + ux * w;\n const rx = bx + uy * w;\n const ry = by - ux * w;\n out.push(lx, ly, tx, ty, rx, ry, lx, ly, gap, gap);\n out.push(tx, ty, bx, by, gap, gap);\n const mx = (lx + bx) / 2;\n const my = (ly + by) / 2;\n const nx = (rx + bx) / 2;\n const ny = (ry + by) / 2;\n out.push(tx, ty, mx, my, gap, gap, tx, ty, nx, ny, gap, gap);\n};\n\n/** Filled triangle as area points (x, top, bottom): two x-monotone pieces */\nexport const triangleArea = (\n out: number[],\n ax: number,\n ay: number,\n bx: number,\n by: number,\n cx: number,\n cy: number,\n gap: number,\n): void => {\n // sort the corners by x\n let p = [ax, ay, bx, by, cx, cy];\n if (p[0] > p[2]) p = [p[2], p[3], p[0], p[1], p[4], p[5]];\n if (p[2] > p[4]) p = [p[0], p[1], p[4], p[5], p[2], p[3]];\n if (p[0] > p[2]) p = [p[2], p[3], p[0], p[1], p[4], p[5]];\n const [x1, y1, x2, y2, x3, y3] = p;\n if (!(x3 - x1 > 1e-12)) return;\n // the long side at the middle corner; the larger y is always the top, so\n // every triangle winds the same way (overlapping ones never cancel)\n const y13 = y1 + ((y3 - y1) * (x2 - x1)) / (x3 - x1);\n out.push(\n x1,\n y1,\n y1,\n x2,\n Math.max(y2, y13),\n Math.min(y2, y13),\n x3,\n y3,\n y3,\n gap,\n gap,\n gap,\n );\n};\n\n/** Corners of a filled (\"stealth\") arrowhead: tip, left, notch, right */\nconst arrowCorners = (\n tx: number,\n ty: number,\n ux: number,\n uy: number,\n length: number,\n): number[] => {\n const w = length * 0.5;\n const bx = tx - ux * length;\n const by = ty - uy * length;\n return [\n tx,\n ty,\n bx - uy * w,\n by + ux * w,\n tx - ux * length * 0.72,\n ty - uy * length * 0.72,\n bx + uy * w,\n by - ux * w,\n ];\n};\n\n/**\n * Filled arrowhead at (tx, ty) pointing along (ux, uy): area triangles in\n * `fill`, its outline (anti-aliased edges) in `outline`\n */\nexport const filledArrow = (\n fill: number[],\n outline: number[],\n tx: number,\n ty: number,\n ux: number,\n uy: number,\n length: number,\n gap: number,\n): void => {\n const [x0, y0, lx, ly, nx, ny, rx, ry] = arrowCorners(tx, ty, ux, uy, length);\n triangleArea(fill, x0, y0, lx, ly, nx, ny, gap);\n triangleArea(fill, x0, y0, nx, ny, rx, ry, gap);\n outline.push(lx, ly, x0, y0, rx, ry, nx, ny, lx, ly, gap, gap);\n};\n\n/** Splits a polyline into dashes (`dash` / `space` in layout units) */\nexport const dashPath = (\n points: readonly number[],\n dash: number,\n space: number,\n gap: number,\n): number[] => {\n const out: number[] = [];\n const total = pathLength(points);\n const period = dash + space;\n if (period <= 0 || total <= 0) return points.slice();\n for (let start = 0; start < total; start += period) {\n const end = Math.min(total, start + dash);\n const a = pointAt(points, start);\n out.push(a[0], a[1]);\n let walked = 0;\n for (let i = 2; i < points.length; i += 2) {\n walked += Math.hypot(\n points[i] - points[i - 2],\n points[i + 1] - points[i - 1],\n );\n if (walked > start && walked < end) out.push(points[i], points[i + 1]);\n }\n const b = pointAt(points, end);\n out.push(b[0], b[1], gap, gap);\n }\n return out;\n};\n\n/** Squared distance from (px, py) to a polyline */\nexport const distanceToPath = (\n points: readonly number[],\n px: number,\n py: number,\n): number => {\n let best = Infinity;\n for (let i = 2; i < points.length; i += 2) {\n const ax = points[i - 2];\n const ay = points[i - 1];\n const dx = points[i] - ax;\n const dy = points[i + 1] - ay;\n const l = dx * dx + dy * dy;\n const t =\n l > 0\n ? Math.max(0, Math.min(1, ((px - ax) * dx + (py - ay) * dy) / l))\n : 0;\n const qx = ax + dx * t - px;\n const qy = ay + dy * t - py;\n best = Math.min(best, qx * qx + qy * qy);\n }\n return best;\n};\n"],"mappings":"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"}
|
|
@@ -9,9 +9,12 @@ export declare const quadraticPath: (x0: number, y0: number, cx: number, cy: num
|
|
|
9
9
|
export declare const splinePath: (points: readonly number[], vertical: boolean) => number[];
|
|
10
10
|
/**
|
|
11
11
|
* Orthogonal path through waypoints: along the flow axis to the middle,
|
|
12
|
-
* across, then along the axis again, with rounded corners
|
|
12
|
+
* across, then along the axis again, with rounded corners. `lane` moves the
|
|
13
|
+
* crossing segments of a route that sits `lane` units off to the + side of
|
|
14
|
+
* the cross axis: such routes turn earlier when heading to the + side (later
|
|
15
|
+
* otherwise), so parallel routes nest instead of crossing each other
|
|
13
16
|
*/
|
|
14
|
-
export declare const orthogonalPath: (points: readonly number[], vertical: boolean, radius: number) => number[];
|
|
17
|
+
export declare const orthogonalPath: (points: readonly number[], vertical: boolean, radius: number, lane?: number) => number[];
|
|
15
18
|
/** Polyline with rounded corners */
|
|
16
19
|
export declare const roundCorners: (corners: readonly number[], radius: number) => number[];
|
|
17
20
|
/** Upper half circle between two points of the x axis (arc diagrams) */
|
|
@@ -22,6 +25,13 @@ export declare const arcPath: (ax: number, bx: number, y: number, rise?: number)
|
|
|
22
25
|
* the direction `angle`, reaching about `size` units beyond the boundary
|
|
23
26
|
*/
|
|
24
27
|
export declare const loopPath: (x: number, y: number, angle: number, start: number, end: number, size: number) => number[];
|
|
28
|
+
/**
|
|
29
|
+
* Self-loop on a side of a w × h box centered at (x, y): the side hit by the
|
|
30
|
+
* direction `angle`, with feet `spread` units apart along the side (clamped
|
|
31
|
+
* to it), reaching `reach` units beyond it. The end stops `endGap` units off
|
|
32
|
+
* the side (room for an arrowhead pointing into the box)
|
|
33
|
+
*/
|
|
34
|
+
export declare const boxLoopPath: (x: number, y: number, w: number, h: number, angle: number, reach: number, spread: number, endGap?: number) => number[];
|
|
25
35
|
/** Length of a polyline */
|
|
26
36
|
export declare const pathLength: (points: readonly number[]) => number;
|
|
27
37
|
/** Removes `start` / `end` units from the ends of a polyline */
|
|
@@ -9,9 +9,12 @@ export declare const quadraticPath: (x0: number, y0: number, cx: number, cy: num
|
|
|
9
9
|
export declare const splinePath: (points: readonly number[], vertical: boolean) => number[];
|
|
10
10
|
/**
|
|
11
11
|
* Orthogonal path through waypoints: along the flow axis to the middle,
|
|
12
|
-
* across, then along the axis again, with rounded corners
|
|
12
|
+
* across, then along the axis again, with rounded corners. `lane` moves the
|
|
13
|
+
* crossing segments of a route that sits `lane` units off to the + side of
|
|
14
|
+
* the cross axis: such routes turn earlier when heading to the + side (later
|
|
15
|
+
* otherwise), so parallel routes nest instead of crossing each other
|
|
13
16
|
*/
|
|
14
|
-
export declare const orthogonalPath: (points: readonly number[], vertical: boolean, radius: number) => number[];
|
|
17
|
+
export declare const orthogonalPath: (points: readonly number[], vertical: boolean, radius: number, lane?: number) => number[];
|
|
15
18
|
/** Polyline with rounded corners */
|
|
16
19
|
export declare const roundCorners: (corners: readonly number[], radius: number) => number[];
|
|
17
20
|
/** Upper half circle between two points of the x axis (arc diagrams) */
|
|
@@ -22,6 +25,13 @@ export declare const arcPath: (ax: number, bx: number, y: number, rise?: number)
|
|
|
22
25
|
* the direction `angle`, reaching about `size` units beyond the boundary
|
|
23
26
|
*/
|
|
24
27
|
export declare const loopPath: (x: number, y: number, angle: number, start: number, end: number, size: number) => number[];
|
|
28
|
+
/**
|
|
29
|
+
* Self-loop on a side of a w × h box centered at (x, y): the side hit by the
|
|
30
|
+
* direction `angle`, with feet `spread` units apart along the side (clamped
|
|
31
|
+
* to it), reaching `reach` units beyond it. The end stops `endGap` units off
|
|
32
|
+
* the side (room for an arrowhead pointing into the box)
|
|
33
|
+
*/
|
|
34
|
+
export declare const boxLoopPath: (x: number, y: number, w: number, h: number, angle: number, reach: number, spread: number, endGap?: number) => number[];
|
|
25
35
|
/** Length of a polyline */
|
|
26
36
|
export declare const pathLength: (points: readonly number[]) => number;
|
|
27
37
|
/** Removes `start` / `end` units from the ends of a polyline */
|
|
@@ -33,22 +33,23 @@ var e = (e, t, n, r, i, a, o, s, c) => {
|
|
|
33
33
|
let i = r / 4, a = 1 - i;
|
|
34
34
|
e.push(a * a * d + 2 * a * i * t + i * i * p, a * a * f + 2 * a * i * n + i * i * m);
|
|
35
35
|
}
|
|
36
|
-
}, i = (e, t, n) => {
|
|
37
|
-
let
|
|
38
|
-
for (let
|
|
39
|
-
let
|
|
40
|
-
if (Math.abs(
|
|
36
|
+
}, i = (e, t, n, r = 0) => {
|
|
37
|
+
let i = [e[0], e[1]];
|
|
38
|
+
for (let a = 2; a < e.length; a += 2) {
|
|
39
|
+
let o = e[a - 2], s = e[a - 1], c = e[a], l = e[a + 1], u = t ? c - o : l - s;
|
|
40
|
+
if (Math.abs(u) > .5) {
|
|
41
|
+
let e = t ? l - s : c - o, a = Math.max(0, Math.abs(e) / 2 - n), d = Math.max(-a, Math.min(a, -r * Math.sign(u) * Math.sign(e)));
|
|
41
42
|
if (t) {
|
|
42
|
-
let e = (
|
|
43
|
-
|
|
43
|
+
let e = (s + l) / 2 + d;
|
|
44
|
+
i.push(o, e, c, e);
|
|
44
45
|
} else {
|
|
45
|
-
let e = (
|
|
46
|
-
|
|
46
|
+
let e = (o + c) / 2 + d;
|
|
47
|
+
i.push(e, s, e, l);
|
|
47
48
|
}
|
|
48
49
|
}
|
|
49
|
-
|
|
50
|
+
i.push(c, l);
|
|
50
51
|
}
|
|
51
|
-
return a(
|
|
52
|
+
return a(i, n);
|
|
52
53
|
}, a = (e, t) => {
|
|
53
54
|
let n = [e[0], e[1]], i = e.length - 2;
|
|
54
55
|
for (let a = 2; a < i; a += 2) r(n, e[a], e[a + 1], e[a + 2], e[a + 3], t);
|
|
@@ -63,15 +64,18 @@ var e = (e, t, n, r, i, a, o, s, c) => {
|
|
|
63
64
|
}, s = (t, n, r, i, a, o) => {
|
|
64
65
|
let s = .42, c = .8, l = Math.max(i, a) + o * 2.2, u = r - s, d = r + s, f = [t + Math.cos(u) * i, n + Math.sin(u) * i];
|
|
65
66
|
return e(f, f[0], f[1], t + Math.cos(r - c) * l, n + Math.sin(r - c) * l, t + Math.cos(r + c) * l, n + Math.sin(r + c) * l, t + Math.cos(d) * a, n + Math.sin(d) * a), f;
|
|
66
|
-
}, c = (
|
|
67
|
+
}, c = (t, n, r, i, a, o, s, c = 0) => {
|
|
68
|
+
let l = Math.cos(a), u = Math.sin(a), d = Math.abs(l) * i >= Math.abs(u) * r, f = d ? l < 0 ? -1 : 1 : 0, m = d ? 0 : u < 0 ? -1 : 1, h = -m, g = f, _ = d ? i / 2 : r / 2, v = d ? r / 2 : i / 2, y = Math.min(s / 2, _ * .85), b = p(!0, r, i, l, u), x = Math.max(-(_ - y), Math.min(_ - y, l * b * h + u * b * g)), S = t + f * v + h * (x - y), C = n + m * v + g * (x - y), w = t + f * (v + c) + h * (x + y), T = n + m * (v + c) + g * (x + y), E = o * 1.33, D = [S, C];
|
|
69
|
+
return e(D, S, C, S + f * E - h * y * .6, C + m * E - g * y * .6, w + f * E + h * y * .6, T + m * E + g * y * .6, w, T), D;
|
|
70
|
+
}, l = (e) => {
|
|
67
71
|
let t = 0;
|
|
68
72
|
for (let n = 2; n < e.length; n += 2) t += Math.hypot(e[n] - e[n - 2], e[n + 1] - e[n - 1]);
|
|
69
73
|
return t;
|
|
70
|
-
},
|
|
71
|
-
let r =
|
|
74
|
+
}, u = (e, t, n) => {
|
|
75
|
+
let r = l(e);
|
|
72
76
|
if (r <= t + n + 1e-6) {
|
|
73
77
|
if (e.length < 4) return e;
|
|
74
|
-
let i =
|
|
78
|
+
let i = d(e, (t + n > 0 ? t / (t + n) : .5) * r);
|
|
75
79
|
return [
|
|
76
80
|
i[0],
|
|
77
81
|
i[1],
|
|
@@ -79,12 +83,12 @@ var e = (e, t, n, r, i, a, o, s, c) => {
|
|
|
79
83
|
i[1]
|
|
80
84
|
];
|
|
81
85
|
}
|
|
82
|
-
let i = [], a =
|
|
86
|
+
let i = [], a = d(e, t), o = d(e, r - n);
|
|
83
87
|
i.push(a[0], a[1]);
|
|
84
88
|
let s = 0;
|
|
85
89
|
for (let a = 2; a < e.length; a += 2) s += Math.hypot(e[a] - e[a - 2], e[a + 1] - e[a - 1]), s > t && s < r - n && i.push(e[a], e[a + 1]);
|
|
86
90
|
return i.push(o[0], o[1]), i;
|
|
87
|
-
},
|
|
91
|
+
}, d = (e, t) => {
|
|
88
92
|
let n = 0;
|
|
89
93
|
for (let r = 2; r < e.length; r += 2) {
|
|
90
94
|
let i = e[r] - e[r - 2], a = e[r + 1] - e[r - 1], o = Math.hypot(i, a);
|
|
@@ -106,22 +110,22 @@ var e = (e, t, n, r, i, a, o, s, c) => {
|
|
|
106
110
|
i / o,
|
|
107
111
|
a / o
|
|
108
112
|
];
|
|
109
|
-
},
|
|
113
|
+
}, f = (e) => {
|
|
110
114
|
for (let t = e.length - 4; t >= 0; t -= 2) {
|
|
111
115
|
let n = e[e.length - 2] - e[t], r = e[e.length - 1] - e[t + 1], i = Math.hypot(n, r);
|
|
112
116
|
if (i > 1e-9) return [n / i, r / i];
|
|
113
117
|
}
|
|
114
118
|
return [1, 0];
|
|
115
|
-
},
|
|
119
|
+
}, p = (e, t, n, r, i) => {
|
|
116
120
|
if (!e) return t / 2;
|
|
117
121
|
let a = Math.abs(r), o = Math.abs(i), s = a > 1e-9 ? t / 2 / a : Infinity, c = o > 1e-9 ? n / 2 / o : Infinity;
|
|
118
122
|
return Math.min(s, c);
|
|
119
|
-
},
|
|
123
|
+
}, m = (e, t, n, r, i, a, o) => {
|
|
120
124
|
let s = a * .42, c = t - r * a, l = n - i * a, u = c - i * s, d = l + r * s, f = c + i * s, p = l - r * s;
|
|
121
125
|
e.push(u, d, t, n, f, p, u, d, o, o), e.push(t, n, c, l, o, o);
|
|
122
126
|
let m = (u + c) / 2, h = (d + l) / 2, g = (f + c) / 2, _ = (p + l) / 2;
|
|
123
127
|
e.push(t, n, m, h, o, o, t, n, g, _, o, o);
|
|
124
|
-
},
|
|
128
|
+
}, h = (e, t, n, r, i, a, o, s) => {
|
|
125
129
|
let c = [
|
|
126
130
|
t,
|
|
127
131
|
n,
|
|
@@ -156,7 +160,7 @@ var e = (e, t, n, r, i, a, o, s, c) => {
|
|
|
156
160
|
if (!(p - l > 1e-12)) return;
|
|
157
161
|
let h = u + (m - u) * (d - l) / (p - l);
|
|
158
162
|
e.push(l, u, u, d, Math.max(f, h), Math.min(f, h), p, m, m, s, s, s);
|
|
159
|
-
},
|
|
163
|
+
}, g = (e, t, n, r, i) => {
|
|
160
164
|
let a = i * .5, o = e - n * i, s = t - r * i;
|
|
161
165
|
return [
|
|
162
166
|
e,
|
|
@@ -168,22 +172,22 @@ var e = (e, t, n, r, i, a, o, s, c) => {
|
|
|
168
172
|
o + r * a,
|
|
169
173
|
s - n * a
|
|
170
174
|
];
|
|
171
|
-
},
|
|
172
|
-
let [c, l, u, d, f, p,
|
|
173
|
-
|
|
174
|
-
},
|
|
175
|
-
let i = [], a =
|
|
175
|
+
}, _ = (e, t, n, r, i, a, o, s) => {
|
|
176
|
+
let [c, l, u, d, f, p, m, _] = g(n, r, i, a, o);
|
|
177
|
+
h(e, c, l, u, d, f, p, s), h(e, c, l, f, p, m, _, s), t.push(u, d, c, l, m, _, f, p, u, d, s, s);
|
|
178
|
+
}, v = (e, t, n, r) => {
|
|
179
|
+
let i = [], a = l(e), o = t + n;
|
|
176
180
|
if (o <= 0 || a <= 0) return e.slice();
|
|
177
181
|
for (let n = 0; n < a; n += o) {
|
|
178
|
-
let o = Math.min(a, n + t), s =
|
|
182
|
+
let o = Math.min(a, n + t), s = d(e, n);
|
|
179
183
|
i.push(s[0], s[1]);
|
|
180
184
|
let c = 0;
|
|
181
185
|
for (let t = 2; t < e.length; t += 2) c += Math.hypot(e[t] - e[t - 2], e[t + 1] - e[t - 1]), c > n && c < o && i.push(e[t], e[t + 1]);
|
|
182
|
-
let l =
|
|
186
|
+
let l = d(e, o);
|
|
183
187
|
i.push(l[0], l[1], r, r);
|
|
184
188
|
}
|
|
185
189
|
return i;
|
|
186
|
-
},
|
|
190
|
+
}, y = (e, t, n) => {
|
|
187
191
|
let r = Infinity;
|
|
188
192
|
for (let i = 2; i < e.length; i += 2) {
|
|
189
193
|
let a = e[i - 2], o = e[i - 1], s = e[i] - a, c = e[i + 1] - o, l = s * s + c * c, u = l > 0 ? Math.max(0, Math.min(1, ((t - a) * s + (n - o) * c) / l)) : 0, d = a + s * u - t, f = o + c * u - n;
|
|
@@ -192,6 +196,6 @@ var e = (e, t, n, r, i, a, o, s, c) => {
|
|
|
192
196
|
return r;
|
|
193
197
|
};
|
|
194
198
|
//#endregion
|
|
195
|
-
export { o as arcPath,
|
|
199
|
+
export { o as arcPath, m as arrowHead, p as boundaryDistance, c as boxLoopPath, e as cubicPoints, v as dashPath, y as distanceToPath, f as endDirection, _ as filledArrow, s as loopPath, i as orthogonalPath, l as pathLength, d as pointAt, t as quadraticPath, a as roundCorners, n as splinePath, h as triangleArea, u as trimPath };
|
|
196
200
|
|
|
197
201
|
//# sourceMappingURL=geometry.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"geometry.js","names":["cubicPoints","length","x1","x0","y1","y0","x2","y2","x3","y3","segments","i","t","u","a","b","c","d","quadraticPath","out","cx","cy","splinePath","points","vertical","my","mx","corner","px","py","inLen","outLen","nx","ny","r","radius","ax","ay","bx","by","orthogonalPath","corners","roundCorners","last","arcPath","from","to","y","rise","loopPath","open","wide","reach","start","end","size","a0","angle","a1","x","pathLength","trimPath","total","p","pointAt","startPoint","endPoint","walked","dx","dy","l","distance","k","endDirection","boundaryDistance","box","width","ux","uy","tx","ty","height","arrowHead","w","lx","ly","rx","ry","gap","triangleArea","y13","arrowCorners","filledArrow","fill","outline","dashPath","period","dash","space","distanceToPath","best","qx","qy"],"sources":["../../../../../charts/src/engine/graph/geometry.ts"],"sourcesContent":["// Edge geometry in layout units: curves sampled into polylines, trimming at\n// the node boundaries, arrowheads and dashes. Polylines are flat\n// `[x0, y0, x1, y1, …]` arrays.\n\n/** Points of a cubic Bézier (the start point excluded) */\nexport const cubicPoints = (\n out: number[],\n x0: number,\n y0: number,\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n x3: number,\n y3: number,\n): void => {\n const length =\n Math.hypot(x1 - x0, y1 - y0) +\n Math.hypot(x2 - x1, y2 - y1) +\n Math.hypot(x3 - x2, y3 - y2);\n const segments = Math.max(4, Math.min(28, Math.ceil(length / 10)));\n for (let i = 1; i <= segments; i++) {\n const t = i / segments;\n const u = 1 - t;\n const a = u * u * u;\n const b = 3 * u * u * t;\n const c = 3 * u * t * t;\n const d = t * t * t;\n out.push(\n a * x0 + b * x1 + c * x2 + d * x3,\n a * y0 + b * y1 + c * y2 + d * y3,\n );\n }\n};\n\n/** Points of a quadratic Bézier (the start point included) */\nexport const quadraticPath = (\n x0: number,\n y0: number,\n cx: number,\n cy: number,\n x1: number,\n y1: number,\n): number[] => {\n const out = [x0, y0];\n cubicPoints(\n out,\n x0,\n y0,\n x0 + ((cx - x0) * 2) / 3,\n y0 + ((cy - y0) * 2) / 3,\n x1 + ((cx - x1) * 2) / 3,\n y1 + ((cy - y1) * 2) / 3,\n x1,\n y1,\n );\n return out;\n};\n\n/**\n * Smooth path through waypoints whose tangents follow the flow axis\n * (vertical for top → bottom layouts): C1 at every waypoint\n */\nexport const splinePath = (\n points: readonly number[],\n vertical: boolean,\n): number[] => {\n const out = [points[0], points[1]];\n for (let i = 2; i < points.length; i += 2) {\n const x0 = points[i - 2];\n const y0 = points[i - 1];\n const x1 = points[i];\n const y1 = points[i + 1];\n if (vertical) {\n const my = (y0 + y1) / 2;\n cubicPoints(out, x0, y0, x0, my, x1, my, x1, y1);\n } else {\n const mx = (x0 + x1) / 2;\n cubicPoints(out, x0, y0, mx, y0, mx, y1, x1, y1);\n }\n }\n return out;\n};\n\n/** Rounded corner from the end of `out` through (cx, cy) towards (nx, ny) */\nconst corner = (\n out: number[],\n cx: number,\n cy: number,\n nx: number,\n ny: number,\n radius: number,\n) => {\n const px = out[out.length - 2];\n const py = out[out.length - 1];\n const inLen = Math.hypot(cx - px, cy - py);\n const outLen = Math.hypot(nx - cx, ny - cy);\n const r = Math.min(radius, inLen / 2, outLen / 2);\n if (r < 0.5) {\n out.push(cx, cy);\n return;\n }\n const ax = cx - ((cx - px) / inLen) * r;\n const ay = cy - ((cy - py) / inLen) * r;\n const bx = cx + ((nx - cx) / outLen) * r;\n const by = cy + ((ny - cy) / outLen) * r;\n out.push(ax, ay);\n // quadratic arc around the corner\n for (let i = 1; i <= 4; i++) {\n const t = i / 4;\n const u = 1 - t;\n out.push(\n u * u * ax + 2 * u * t * cx + t * t * bx,\n u * u * ay + 2 * u * t * cy + t * t * by,\n );\n }\n};\n\n/**\n * Orthogonal path through waypoints: along the flow axis to the middle,\n * across, then along the axis again, with rounded corners\n */\nexport const orthogonalPath = (\n points: readonly number[],\n vertical: boolean,\n radius: number,\n): number[] => {\n const corners: number[] = [points[0], points[1]];\n for (let i = 2; i < points.length; i += 2) {\n const x0 = points[i - 2];\n const y0 = points[i - 1];\n const x1 = points[i];\n const y1 = points[i + 1];\n if (Math.abs(vertical ? x1 - x0 : y1 - y0) > 0.5) {\n if (vertical) {\n const my = (y0 + y1) / 2;\n corners.push(x0, my, x1, my);\n } else {\n const mx = (x0 + x1) / 2;\n corners.push(mx, y0, mx, y1);\n }\n }\n corners.push(x1, y1);\n }\n return roundCorners(corners, radius);\n};\n\n/** Polyline with rounded corners */\nexport const roundCorners = (\n corners: readonly number[],\n radius: number,\n): number[] => {\n const out = [corners[0], corners[1]];\n const last = corners.length - 2;\n for (let i = 2; i < last; i += 2) {\n corner(\n out,\n corners[i],\n corners[i + 1],\n corners[i + 2],\n corners[i + 3],\n radius,\n );\n }\n if (last >= 2) out.push(corners[last], corners[last + 1]);\n return out;\n};\n\n/** Upper half circle between two points of the x axis (arc diagrams) */\nexport const arcPath = (\n ax: number,\n bx: number,\n y: number,\n rise = 1,\n): number[] => {\n const cx = (ax + bx) / 2;\n const r = Math.abs(bx - ax) / 2;\n const segments = 2 * Math.max(4, Math.min(32, Math.ceil(r / 12)));\n const out: number[] = [];\n const from = ax < bx ? Math.PI : 0;\n const to = ax < bx ? 0 : Math.PI;\n for (let i = 0; i <= segments; i++) {\n const a = from + ((to - from) * i) / segments;\n out.push(cx + r * Math.cos(a), y - r * rise * Math.sin(a));\n }\n return out;\n};\n\n/**\n * Self-loop of a node at (x, y): a teardrop leaving the boundary at\n * `start` units from the center and coming back at `end` units, centered on\n * the direction `angle`, reaching about `size` units beyond the boundary\n */\nexport const loopPath = (\n x: number,\n y: number,\n angle: number,\n start: number,\n end: number,\n size: number,\n): number[] => {\n const open = 0.42;\n const wide = 0.8;\n const reach = Math.max(start, end) + size * 2.2;\n const a0 = angle - open;\n const a1 = angle + open;\n const out = [x + Math.cos(a0) * start, y + Math.sin(a0) * start];\n cubicPoints(\n out,\n out[0],\n out[1],\n x + Math.cos(angle - wide) * reach,\n y + Math.sin(angle - wide) * reach,\n x + Math.cos(angle + wide) * reach,\n y + Math.sin(angle + wide) * reach,\n x + Math.cos(a1) * end,\n y + Math.sin(a1) * end,\n );\n return out;\n};\n\n/** Length of a polyline */\nexport const pathLength = (points: readonly number[]): number => {\n let length = 0;\n for (let i = 2; i < points.length; i += 2)\n length += Math.hypot(\n points[i] - points[i - 2],\n points[i + 1] - points[i - 1],\n );\n return length;\n};\n\n/** Removes `start` / `end` units from the ends of a polyline */\nexport const trimPath = (\n points: number[],\n start: number,\n end: number,\n): number[] => {\n const total = pathLength(points);\n if (total <= start + end + 1e-6) {\n // too short: a zero-length segment in the middle keeps the direction\n if (points.length < 4) return points;\n const t = start + end > 0 ? start / (start + end) : 0.5;\n const p = pointAt(points, t * total);\n return [p[0], p[1], p[0], p[1]];\n }\n const out: number[] = [];\n const startPoint = pointAt(points, start);\n const endPoint = pointAt(points, total - end);\n out.push(startPoint[0], startPoint[1]);\n let walked = 0;\n for (let i = 2; i < points.length; i += 2) {\n walked += Math.hypot(\n points[i] - points[i - 2],\n points[i + 1] - points[i - 1],\n );\n if (walked > start && walked < total - end)\n out.push(points[i], points[i + 1]);\n }\n out.push(endPoint[0], endPoint[1]);\n return out;\n};\n\n/** Point and direction at a distance along a polyline */\nexport const pointAt = (\n points: readonly number[],\n distance: number,\n): [number, number, number, number] => {\n let walked = 0;\n for (let i = 2; i < points.length; i += 2) {\n const dx = points[i] - points[i - 2];\n const dy = points[i + 1] - points[i - 1];\n const l = Math.hypot(dx, dy);\n if (walked + l >= distance && l > 0) {\n const t = (distance - walked) / l;\n return [points[i - 2] + dx * t, points[i - 1] + dy * t, dx / l, dy / l];\n }\n walked += l;\n }\n const k = points.length - 2;\n const dx = k >= 2 ? points[k] - points[k - 2] : 1;\n const dy = k >= 2 ? points[k + 1] - points[k - 1] : 0;\n const l = Math.hypot(dx, dy) || 1;\n return [points[k], points[k + 1], dx / l, dy / l];\n};\n\n/** Direction at the end of a polyline (unit vector) */\nexport const endDirection = (points: readonly number[]): [number, number] => {\n for (let i = points.length - 4; i >= 0; i -= 2) {\n const dx = points[points.length - 2] - points[i];\n const dy = points[points.length - 1] - points[i + 1];\n const l = Math.hypot(dx, dy);\n if (l > 1e-9) return [dx / l, dy / l];\n }\n return [1, 0];\n};\n\n/** Distance from the center of a node to its boundary in direction (ux, uy) */\nexport const boundaryDistance = (\n box: boolean,\n width: number,\n height: number,\n ux: number,\n uy: number,\n): number => {\n if (!box) return width / 2;\n const ax = Math.abs(ux);\n const ay = Math.abs(uy);\n const tx = ax > 1e-9 ? width / 2 / ax : Infinity;\n const ty = ay > 1e-9 ? height / 2 / ay : Infinity;\n return Math.min(tx, ty);\n};\n\n/**\n * Arrowhead at (tx, ty) pointing along (ux, uy): the outline of a narrow\n * triangle and its axis, drawn with the line width it looks solid\n */\nexport const arrowHead = (\n out: number[],\n tx: number,\n ty: number,\n ux: number,\n uy: number,\n length: number,\n gap: number,\n): void => {\n const w = length * 0.42;\n const bx = tx - ux * length;\n const by = ty - uy * length;\n const lx = bx - uy * w;\n const ly = by + ux * w;\n const rx = bx + uy * w;\n const ry = by - ux * w;\n out.push(lx, ly, tx, ty, rx, ry, lx, ly, gap, gap);\n out.push(tx, ty, bx, by, gap, gap);\n const mx = (lx + bx) / 2;\n const my = (ly + by) / 2;\n const nx = (rx + bx) / 2;\n const ny = (ry + by) / 2;\n out.push(tx, ty, mx, my, gap, gap, tx, ty, nx, ny, gap, gap);\n};\n\n/** Filled triangle as area points (x, top, bottom): two x-monotone pieces */\nexport const triangleArea = (\n out: number[],\n ax: number,\n ay: number,\n bx: number,\n by: number,\n cx: number,\n cy: number,\n gap: number,\n): void => {\n // sort the corners by x\n let p = [ax, ay, bx, by, cx, cy];\n if (p[0] > p[2]) p = [p[2], p[3], p[0], p[1], p[4], p[5]];\n if (p[2] > p[4]) p = [p[0], p[1], p[4], p[5], p[2], p[3]];\n if (p[0] > p[2]) p = [p[2], p[3], p[0], p[1], p[4], p[5]];\n const [x1, y1, x2, y2, x3, y3] = p;\n if (!(x3 - x1 > 1e-12)) return;\n // the long side at the middle corner; the larger y is always the top, so\n // every triangle winds the same way (overlapping ones never cancel)\n const y13 = y1 + ((y3 - y1) * (x2 - x1)) / (x3 - x1);\n out.push(\n x1,\n y1,\n y1,\n x2,\n Math.max(y2, y13),\n Math.min(y2, y13),\n x3,\n y3,\n y3,\n gap,\n gap,\n gap,\n );\n};\n\n/** Corners of a filled (\"stealth\") arrowhead: tip, left, notch, right */\nconst arrowCorners = (\n tx: number,\n ty: number,\n ux: number,\n uy: number,\n length: number,\n): number[] => {\n const w = length * 0.5;\n const bx = tx - ux * length;\n const by = ty - uy * length;\n return [\n tx,\n ty,\n bx - uy * w,\n by + ux * w,\n tx - ux * length * 0.72,\n ty - uy * length * 0.72,\n bx + uy * w,\n by - ux * w,\n ];\n};\n\n/**\n * Filled arrowhead at (tx, ty) pointing along (ux, uy): area triangles in\n * `fill`, its outline (anti-aliased edges) in `outline`\n */\nexport const filledArrow = (\n fill: number[],\n outline: number[],\n tx: number,\n ty: number,\n ux: number,\n uy: number,\n length: number,\n gap: number,\n): void => {\n const [x0, y0, lx, ly, nx, ny, rx, ry] = arrowCorners(tx, ty, ux, uy, length);\n triangleArea(fill, x0, y0, lx, ly, nx, ny, gap);\n triangleArea(fill, x0, y0, nx, ny, rx, ry, gap);\n outline.push(lx, ly, x0, y0, rx, ry, nx, ny, lx, ly, gap, gap);\n};\n\n/** Splits a polyline into dashes (`dash` / `space` in layout units) */\nexport const dashPath = (\n points: readonly number[],\n dash: number,\n space: number,\n gap: number,\n): number[] => {\n const out: number[] = [];\n const total = pathLength(points);\n const period = dash + space;\n if (period <= 0 || total <= 0) return points.slice();\n for (let start = 0; start < total; start += period) {\n const end = Math.min(total, start + dash);\n const a = pointAt(points, start);\n out.push(a[0], a[1]);\n let walked = 0;\n for (let i = 2; i < points.length; i += 2) {\n walked += Math.hypot(\n points[i] - points[i - 2],\n points[i + 1] - points[i - 1],\n );\n if (walked > start && walked < end) out.push(points[i], points[i + 1]);\n }\n const b = pointAt(points, end);\n out.push(b[0], b[1], gap, gap);\n }\n return out;\n};\n\n/** Squared distance from (px, py) to a polyline */\nexport const distanceToPath = (\n points: readonly number[],\n px: number,\n py: number,\n): number => {\n let best = Infinity;\n for (let i = 2; i < points.length; i += 2) {\n const ax = points[i - 2];\n const ay = points[i - 1];\n const dx = points[i] - ax;\n const dy = points[i + 1] - ay;\n const l = dx * dx + dy * dy;\n const t =\n l > 0\n ? Math.max(0, Math.min(1, ((px - ax) * dx + (py - ay) * dy) / l))\n : 0;\n const qx = ax + dx * t - px;\n const qy = ay + dy * t - py;\n best = Math.min(best, qx * qx + qy * qy);\n }\n return best;\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"geometry.js","names":["cubicPoints","length","x1","x0","y1","y0","x2","y2","x3","y3","segments","i","t","u","a","b","c","d","quadraticPath","out","cx","cy","splinePath","points","vertical","my","mx","corner","px","py","inLen","outLen","nx","ny","r","radius","ax","ay","bx","by","orthogonalPath","corners","across","along","limit","shift","lane","roundCorners","last","arcPath","from","to","y","rise","loopPath","open","wide","reach","start","end","size","a0","angle","a1","x","boxLoopPath","s","leftRight","h","w","tx","ty","half","depth","sp","spread","dist","boundaryDistance","endGap","lift","pathLength","trimPath","total","p","pointAt","startPoint","endPoint","walked","dx","dy","l","distance","k","endDirection","box","width","ux","uy","height","arrowHead","lx","ly","rx","ry","gap","triangleArea","y13","arrowCorners","filledArrow","fill","outline","dashPath","period","dash","space","distanceToPath","best","qx","qy"],"sources":["../../../../../charts/src/engine/graph/geometry.ts"],"sourcesContent":["// Edge geometry in layout units: curves sampled into polylines, trimming at\n// the node boundaries, arrowheads and dashes. Polylines are flat\n// `[x0, y0, x1, y1, …]` arrays.\n\n/** Points of a cubic Bézier (the start point excluded) */\nexport const cubicPoints = (\n out: number[],\n x0: number,\n y0: number,\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n x3: number,\n y3: number,\n): void => {\n const length =\n Math.hypot(x1 - x0, y1 - y0) +\n Math.hypot(x2 - x1, y2 - y1) +\n Math.hypot(x3 - x2, y3 - y2);\n const segments = Math.max(4, Math.min(28, Math.ceil(length / 10)));\n for (let i = 1; i <= segments; i++) {\n const t = i / segments;\n const u = 1 - t;\n const a = u * u * u;\n const b = 3 * u * u * t;\n const c = 3 * u * t * t;\n const d = t * t * t;\n out.push(\n a * x0 + b * x1 + c * x2 + d * x3,\n a * y0 + b * y1 + c * y2 + d * y3,\n );\n }\n};\n\n/** Points of a quadratic Bézier (the start point included) */\nexport const quadraticPath = (\n x0: number,\n y0: number,\n cx: number,\n cy: number,\n x1: number,\n y1: number,\n): number[] => {\n const out = [x0, y0];\n cubicPoints(\n out,\n x0,\n y0,\n x0 + ((cx - x0) * 2) / 3,\n y0 + ((cy - y0) * 2) / 3,\n x1 + ((cx - x1) * 2) / 3,\n y1 + ((cy - y1) * 2) / 3,\n x1,\n y1,\n );\n return out;\n};\n\n/**\n * Smooth path through waypoints whose tangents follow the flow axis\n * (vertical for top → bottom layouts): C1 at every waypoint\n */\nexport const splinePath = (\n points: readonly number[],\n vertical: boolean,\n): number[] => {\n const out = [points[0], points[1]];\n for (let i = 2; i < points.length; i += 2) {\n const x0 = points[i - 2];\n const y0 = points[i - 1];\n const x1 = points[i];\n const y1 = points[i + 1];\n if (vertical) {\n const my = (y0 + y1) / 2;\n cubicPoints(out, x0, y0, x0, my, x1, my, x1, y1);\n } else {\n const mx = (x0 + x1) / 2;\n cubicPoints(out, x0, y0, mx, y0, mx, y1, x1, y1);\n }\n }\n return out;\n};\n\n/** Rounded corner from the end of `out` through (cx, cy) towards (nx, ny) */\nconst corner = (\n out: number[],\n cx: number,\n cy: number,\n nx: number,\n ny: number,\n radius: number,\n) => {\n const px = out[out.length - 2];\n const py = out[out.length - 1];\n const inLen = Math.hypot(cx - px, cy - py);\n const outLen = Math.hypot(nx - cx, ny - cy);\n const r = Math.min(radius, inLen / 2, outLen / 2);\n if (r < 0.5) {\n out.push(cx, cy);\n return;\n }\n const ax = cx - ((cx - px) / inLen) * r;\n const ay = cy - ((cy - py) / inLen) * r;\n const bx = cx + ((nx - cx) / outLen) * r;\n const by = cy + ((ny - cy) / outLen) * r;\n out.push(ax, ay);\n // quadratic arc around the corner\n for (let i = 1; i <= 4; i++) {\n const t = i / 4;\n const u = 1 - t;\n out.push(\n u * u * ax + 2 * u * t * cx + t * t * bx,\n u * u * ay + 2 * u * t * cy + t * t * by,\n );\n }\n};\n\n/**\n * Orthogonal path through waypoints: along the flow axis to the middle,\n * across, then along the axis again, with rounded corners. `lane` moves the\n * crossing segments of a route that sits `lane` units off to the + side of\n * the cross axis: such routes turn earlier when heading to the + side (later\n * otherwise), so parallel routes nest instead of crossing each other\n */\nexport const orthogonalPath = (\n points: readonly number[],\n vertical: boolean,\n radius: number,\n lane = 0,\n): number[] => {\n const corners: number[] = [points[0], points[1]];\n for (let i = 2; i < points.length; i += 2) {\n const x0 = points[i - 2];\n const y0 = points[i - 1];\n const x1 = points[i];\n const y1 = points[i + 1];\n const across = vertical ? x1 - x0 : y1 - y0;\n if (Math.abs(across) > 0.5) {\n const along = vertical ? y1 - y0 : x1 - x0;\n const limit = Math.max(0, Math.abs(along) / 2 - radius);\n const shift = Math.max(\n -limit,\n Math.min(limit, -lane * Math.sign(across) * Math.sign(along)),\n );\n if (vertical) {\n const my = (y0 + y1) / 2 + shift;\n corners.push(x0, my, x1, my);\n } else {\n const mx = (x0 + x1) / 2 + shift;\n corners.push(mx, y0, mx, y1);\n }\n }\n corners.push(x1, y1);\n }\n return roundCorners(corners, radius);\n};\n\n/** Polyline with rounded corners */\nexport const roundCorners = (\n corners: readonly number[],\n radius: number,\n): number[] => {\n const out = [corners[0], corners[1]];\n const last = corners.length - 2;\n for (let i = 2; i < last; i += 2) {\n corner(\n out,\n corners[i],\n corners[i + 1],\n corners[i + 2],\n corners[i + 3],\n radius,\n );\n }\n if (last >= 2) out.push(corners[last], corners[last + 1]);\n return out;\n};\n\n/** Upper half circle between two points of the x axis (arc diagrams) */\nexport const arcPath = (\n ax: number,\n bx: number,\n y: number,\n rise = 1,\n): number[] => {\n const cx = (ax + bx) / 2;\n const r = Math.abs(bx - ax) / 2;\n const segments = 2 * Math.max(4, Math.min(32, Math.ceil(r / 12)));\n const out: number[] = [];\n const from = ax < bx ? Math.PI : 0;\n const to = ax < bx ? 0 : Math.PI;\n for (let i = 0; i <= segments; i++) {\n const a = from + ((to - from) * i) / segments;\n out.push(cx + r * Math.cos(a), y - r * rise * Math.sin(a));\n }\n return out;\n};\n\n/**\n * Self-loop of a node at (x, y): a teardrop leaving the boundary at\n * `start` units from the center and coming back at `end` units, centered on\n * the direction `angle`, reaching about `size` units beyond the boundary\n */\nexport const loopPath = (\n x: number,\n y: number,\n angle: number,\n start: number,\n end: number,\n size: number,\n): number[] => {\n const open = 0.42;\n const wide = 0.8;\n const reach = Math.max(start, end) + size * 2.2;\n const a0 = angle - open;\n const a1 = angle + open;\n const out = [x + Math.cos(a0) * start, y + Math.sin(a0) * start];\n cubicPoints(\n out,\n out[0],\n out[1],\n x + Math.cos(angle - wide) * reach,\n y + Math.sin(angle - wide) * reach,\n x + Math.cos(angle + wide) * reach,\n y + Math.sin(angle + wide) * reach,\n x + Math.cos(a1) * end,\n y + Math.sin(a1) * end,\n );\n return out;\n};\n\n/**\n * Self-loop on a side of a w × h box centered at (x, y): the side hit by the\n * direction `angle`, with feet `spread` units apart along the side (clamped\n * to it), reaching `reach` units beyond it. The end stops `endGap` units off\n * the side (room for an arrowhead pointing into the box)\n */\nexport const boxLoopPath = (\n x: number,\n y: number,\n w: number,\n h: number,\n angle: number,\n reach: number,\n spread: number,\n endGap = 0,\n): number[] => {\n const c = Math.cos(angle);\n const s = Math.sin(angle);\n const leftRight = Math.abs(c) * h >= Math.abs(s) * w;\n const nx = leftRight ? (c < 0 ? -1 : 1) : 0;\n const ny = leftRight ? 0 : s < 0 ? -1 : 1;\n // tangent: the normal turned a quarter clockwise\n const tx = -ny;\n const ty = nx;\n const half = leftRight ? h / 2 : w / 2;\n const depth = leftRight ? w / 2 : h / 2;\n const sp = Math.min(spread / 2, half * 0.85);\n const dist = boundaryDistance(true, w, h, c, s);\n const u = Math.max(\n -(half - sp),\n Math.min(half - sp, c * dist * tx + s * dist * ty),\n );\n const ax = x + nx * depth + tx * (u - sp);\n const ay = y + ny * depth + ty * (u - sp);\n const bx = x + nx * (depth + endGap) + tx * (u + sp);\n const by = y + ny * (depth + endGap) + ty * (u + sp);\n const lift = reach * 1.33;\n const out = [ax, ay];\n cubicPoints(\n out,\n ax,\n ay,\n ax + nx * lift - tx * sp * 0.6,\n ay + ny * lift - ty * sp * 0.6,\n bx + nx * lift + tx * sp * 0.6,\n by + ny * lift + ty * sp * 0.6,\n bx,\n by,\n );\n return out;\n};\n\n/** Length of a polyline */\nexport const pathLength = (points: readonly number[]): number => {\n let length = 0;\n for (let i = 2; i < points.length; i += 2)\n length += Math.hypot(\n points[i] - points[i - 2],\n points[i + 1] - points[i - 1],\n );\n return length;\n};\n\n/** Removes `start` / `end` units from the ends of a polyline */\nexport const trimPath = (\n points: number[],\n start: number,\n end: number,\n): number[] => {\n const total = pathLength(points);\n if (total <= start + end + 1e-6) {\n // too short: a zero-length segment in the middle keeps the direction\n if (points.length < 4) return points;\n const t = start + end > 0 ? start / (start + end) : 0.5;\n const p = pointAt(points, t * total);\n return [p[0], p[1], p[0], p[1]];\n }\n const out: number[] = [];\n const startPoint = pointAt(points, start);\n const endPoint = pointAt(points, total - end);\n out.push(startPoint[0], startPoint[1]);\n let walked = 0;\n for (let i = 2; i < points.length; i += 2) {\n walked += Math.hypot(\n points[i] - points[i - 2],\n points[i + 1] - points[i - 1],\n );\n if (walked > start && walked < total - end)\n out.push(points[i], points[i + 1]);\n }\n out.push(endPoint[0], endPoint[1]);\n return out;\n};\n\n/** Point and direction at a distance along a polyline */\nexport const pointAt = (\n points: readonly number[],\n distance: number,\n): [number, number, number, number] => {\n let walked = 0;\n for (let i = 2; i < points.length; i += 2) {\n const dx = points[i] - points[i - 2];\n const dy = points[i + 1] - points[i - 1];\n const l = Math.hypot(dx, dy);\n if (walked + l >= distance && l > 0) {\n const t = (distance - walked) / l;\n return [points[i - 2] + dx * t, points[i - 1] + dy * t, dx / l, dy / l];\n }\n walked += l;\n }\n const k = points.length - 2;\n const dx = k >= 2 ? points[k] - points[k - 2] : 1;\n const dy = k >= 2 ? points[k + 1] - points[k - 1] : 0;\n const l = Math.hypot(dx, dy) || 1;\n return [points[k], points[k + 1], dx / l, dy / l];\n};\n\n/** Direction at the end of a polyline (unit vector) */\nexport const endDirection = (points: readonly number[]): [number, number] => {\n for (let i = points.length - 4; i >= 0; i -= 2) {\n const dx = points[points.length - 2] - points[i];\n const dy = points[points.length - 1] - points[i + 1];\n const l = Math.hypot(dx, dy);\n if (l > 1e-9) return [dx / l, dy / l];\n }\n return [1, 0];\n};\n\n/** Distance from the center of a node to its boundary in direction (ux, uy) */\nexport const boundaryDistance = (\n box: boolean,\n width: number,\n height: number,\n ux: number,\n uy: number,\n): number => {\n if (!box) return width / 2;\n const ax = Math.abs(ux);\n const ay = Math.abs(uy);\n const tx = ax > 1e-9 ? width / 2 / ax : Infinity;\n const ty = ay > 1e-9 ? height / 2 / ay : Infinity;\n return Math.min(tx, ty);\n};\n\n/**\n * Arrowhead at (tx, ty) pointing along (ux, uy): the outline of a narrow\n * triangle and its axis, drawn with the line width it looks solid\n */\nexport const arrowHead = (\n out: number[],\n tx: number,\n ty: number,\n ux: number,\n uy: number,\n length: number,\n gap: number,\n): void => {\n const w = length * 0.42;\n const bx = tx - ux * length;\n const by = ty - uy * length;\n const lx = bx - uy * w;\n const ly = by + ux * w;\n const rx = bx + uy * w;\n const ry = by - ux * w;\n out.push(lx, ly, tx, ty, rx, ry, lx, ly, gap, gap);\n out.push(tx, ty, bx, by, gap, gap);\n const mx = (lx + bx) / 2;\n const my = (ly + by) / 2;\n const nx = (rx + bx) / 2;\n const ny = (ry + by) / 2;\n out.push(tx, ty, mx, my, gap, gap, tx, ty, nx, ny, gap, gap);\n};\n\n/** Filled triangle as area points (x, top, bottom): two x-monotone pieces */\nexport const triangleArea = (\n out: number[],\n ax: number,\n ay: number,\n bx: number,\n by: number,\n cx: number,\n cy: number,\n gap: number,\n): void => {\n // sort the corners by x\n let p = [ax, ay, bx, by, cx, cy];\n if (p[0] > p[2]) p = [p[2], p[3], p[0], p[1], p[4], p[5]];\n if (p[2] > p[4]) p = [p[0], p[1], p[4], p[5], p[2], p[3]];\n if (p[0] > p[2]) p = [p[2], p[3], p[0], p[1], p[4], p[5]];\n const [x1, y1, x2, y2, x3, y3] = p;\n if (!(x3 - x1 > 1e-12)) return;\n // the long side at the middle corner; the larger y is always the top, so\n // every triangle winds the same way (overlapping ones never cancel)\n const y13 = y1 + ((y3 - y1) * (x2 - x1)) / (x3 - x1);\n out.push(\n x1,\n y1,\n y1,\n x2,\n Math.max(y2, y13),\n Math.min(y2, y13),\n x3,\n y3,\n y3,\n gap,\n gap,\n gap,\n );\n};\n\n/** Corners of a filled (\"stealth\") arrowhead: tip, left, notch, right */\nconst arrowCorners = (\n tx: number,\n ty: number,\n ux: number,\n uy: number,\n length: number,\n): number[] => {\n const w = length * 0.5;\n const bx = tx - ux * length;\n const by = ty - uy * length;\n return [\n tx,\n ty,\n bx - uy * w,\n by + ux * w,\n tx - ux * length * 0.72,\n ty - uy * length * 0.72,\n bx + uy * w,\n by - ux * w,\n ];\n};\n\n/**\n * Filled arrowhead at (tx, ty) pointing along (ux, uy): area triangles in\n * `fill`, its outline (anti-aliased edges) in `outline`\n */\nexport const filledArrow = (\n fill: number[],\n outline: number[],\n tx: number,\n ty: number,\n ux: number,\n uy: number,\n length: number,\n gap: number,\n): void => {\n const [x0, y0, lx, ly, nx, ny, rx, ry] = arrowCorners(tx, ty, ux, uy, length);\n triangleArea(fill, x0, y0, lx, ly, nx, ny, gap);\n triangleArea(fill, x0, y0, nx, ny, rx, ry, gap);\n outline.push(lx, ly, x0, y0, rx, ry, nx, ny, lx, ly, gap, gap);\n};\n\n/** Splits a polyline into dashes (`dash` / `space` in layout units) */\nexport const dashPath = (\n points: readonly number[],\n dash: number,\n space: number,\n gap: number,\n): number[] => {\n const out: number[] = [];\n const total = pathLength(points);\n const period = dash + space;\n if (period <= 0 || total <= 0) return points.slice();\n for (let start = 0; start < total; start += period) {\n const end = Math.min(total, start + dash);\n const a = pointAt(points, start);\n out.push(a[0], a[1]);\n let walked = 0;\n for (let i = 2; i < points.length; i += 2) {\n walked += Math.hypot(\n points[i] - points[i - 2],\n points[i + 1] - points[i - 1],\n );\n if (walked > start && walked < end) out.push(points[i], points[i + 1]);\n }\n const b = pointAt(points, end);\n out.push(b[0], b[1], gap, gap);\n }\n return out;\n};\n\n/** Squared distance from (px, py) to a polyline */\nexport const distanceToPath = (\n points: readonly number[],\n px: number,\n py: number,\n): number => {\n let best = Infinity;\n for (let i = 2; i < points.length; i += 2) {\n const ax = points[i - 2];\n const ay = points[i - 1];\n const dx = points[i] - ax;\n const dy = points[i + 1] - ay;\n const l = dx * dx + dy * dy;\n const t =\n l > 0\n ? Math.max(0, Math.min(1, ((px - ax) * dx + (py - ay) * dy) / l))\n : 0;\n const qx = ax + dx * t - px;\n const qy = ay + dy * t - py;\n best = Math.min(best, qx * qx + qy * qy);\n }\n return best;\n};\n"],"mappings":";AAKA,IAAaA,KACX,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,MACS;CACT,IAAMC,IACJ,KAAK,MAAMC,IAAKC,GAAIC,IAAKC,CAAE,IAC3B,KAAK,MAAMC,IAAKJ,GAAIK,IAAKH,CAAE,IAC3B,KAAK,MAAMI,IAAKF,GAAIG,IAAKF,CAAE,GACvBG,IAAW,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,KAAK,KAAKT,IAAS,EAAE,CAAC,CAAC;CACjE,KAAK,IAAIU,IAAI,GAAGA,KAAKD,GAAU,KAAK;EAClC,IAAME,IAAID,IAAID,GACRG,IAAI,IAAID,GACRE,IAAID,IAAIA,IAAIA,GACZE,IAAI,IAAIF,IAAIA,IAAID,GAChBI,IAAI,IAAIH,IAAID,IAAIA,GAChBK,IAAIL,IAAIA,IAAIA;EAClB,EAAI,KACFE,IAAIX,IAAKY,IAAIb,IAAKc,IAAIV,IAAKW,IAAIT,GAC/BM,IAAIT,IAAKU,IAAIX,IAAKY,IAAIT,IAAKU,IAAIR,CACjC;CACF;AACF,GAGaS,KACX,GACA,GACA,GACA,GACA,GACA,MACa;CACb,IAAMC,IAAM,CAAChB,GAAIE,CAAE;CAYnB,OAXAL,EACEmB,GACAhB,GACAE,GACAF,KAAOiB,IAAKjB,KAAM,IAAK,GACvBE,KAAOgB,IAAKhB,KAAM,IAAK,GACvBH,KAAOkB,IAAKlB,KAAM,IAAK,GACvBE,KAAOiB,IAAKjB,KAAM,IAAK,GACvBF,GACAE,CACF,GACOe;AACT,GAMaG,KACX,GACA,MACa;CACb,IAAMH,IAAM,CAACI,EAAO,IAAIA,EAAO,EAAE;CACjC,KAAK,IAAI,IAAI,GAAG,IAAIA,EAAO,QAAQ,KAAK,GAAG;EACzC,IAAMpB,IAAKoB,EAAO,IAAI,IAChBlB,IAAKkB,EAAO,IAAI,IAChBrB,IAAKqB,EAAO,IACZnB,IAAKmB,EAAO,IAAI;EACtB,IAAIC,GAAU;GACZ,IAAMC,KAAMpB,IAAKD,KAAM;GACvB,EAAYe,GAAKhB,GAAIE,GAAIF,GAAIsB,GAAIvB,GAAIuB,GAAIvB,GAAIE,CAAE;EACjD,OAAO;GACL,IAAMsB,KAAMvB,IAAKD,KAAM;GACvB,EAAYiB,GAAKhB,GAAIE,GAAIqB,GAAIrB,GAAIqB,GAAItB,GAAIF,GAAIE,CAAE;EACjD;CACF;CACA,OAAOe;AACT,GAGMQ,KACJ,GACA,GACA,GACA,GACA,GACA,MACG;CACH,IAAMC,IAAKT,EAAIA,EAAI,SAAS,IACtBU,IAAKV,EAAIA,EAAI,SAAS,IACtBW,IAAQ,KAAK,MAAMV,IAAKQ,GAAIP,IAAKQ,CAAE,GACnCE,IAAS,KAAK,MAAMC,IAAKZ,GAAIa,IAAKZ,CAAE,GACpCa,IAAI,KAAK,IAAIC,GAAQL,IAAQ,GAAGC,IAAS,CAAC;CAChD,IAAIG,IAAI,IAAK;EACX,EAAI,KAAKd,GAAIC,CAAE;EACf;CACF;CACA,IAAMe,IAAKhB,KAAOA,IAAKQ,KAAME,IAASI,GAChCG,IAAKhB,KAAOA,IAAKQ,KAAMC,IAASI,GAChCI,IAAKlB,KAAOY,IAAKZ,KAAMW,IAAUG,GACjCK,IAAKlB,KAAOY,IAAKZ,KAAMU,IAAUG;CACvC,EAAI,KAAKE,GAAIC,CAAE;CAEf,KAAK,IAAI1B,IAAI,GAAGA,KAAK,GAAG,KAAK;EAC3B,IAAMC,IAAID,IAAI,GACRE,IAAI,IAAID;EACd,EAAI,KACFC,IAAIA,IAAIuB,IAAK,IAAIvB,IAAID,IAAIQ,IAAKR,IAAIA,IAAI0B,GACtCzB,IAAIA,IAAIwB,IAAK,IAAIxB,IAAID,IAAIS,IAAKT,IAAIA,IAAI2B,CACxC;CACF;AACF,GASaC,KACX,GACA,GACA,GACA,IAAO,MACM;CACb,IAAMC,IAAoB,CAAClB,EAAO,IAAIA,EAAO,EAAE;CAC/C,KAAK,IAAIZ,IAAI,GAAGA,IAAIY,EAAO,QAAQ,KAAK,GAAG;EACzC,IAAMpB,IAAKoB,EAAOZ,IAAI,IAChBN,IAAKkB,EAAOZ,IAAI,IAChBT,IAAKqB,EAAOZ,IACZP,IAAKmB,EAAOZ,IAAI,IAChB+B,IAASlB,IAAWtB,IAAKC,IAAKC,IAAKC;EACzC,IAAI,KAAK,IAAIqC,CAAM,IAAI,IAAK;GAC1B,IAAMC,IAAQnB,IAAWpB,IAAKC,IAAKH,IAAKC,GAClCyC,IAAQ,KAAK,IAAI,GAAG,KAAK,IAAID,CAAK,IAAI,IAAIR,CAAM,GAChDU,IAAQ,KAAK,IACjB,CAACD,GACD,KAAK,IAAIA,GAAO,CAACE,IAAO,KAAK,KAAKJ,CAAM,IAAI,KAAK,KAAKC,CAAK,CAAC,CAC9D;GACA,IAAInB,GAAU;IACZ,IAAMC,KAAMpB,IAAKD,KAAM,IAAIyC;IAC3B,EAAQ,KAAK1C,GAAIsB,GAAIvB,GAAIuB,CAAE;GAC7B,OAAO;IACL,IAAMC,KAAMvB,IAAKD,KAAM,IAAI2C;IAC3B,EAAQ,KAAKnB,GAAIrB,GAAIqB,GAAItB,CAAE;GAC7B;EACF;EACA,EAAQ,KAAKF,GAAIE,CAAE;CACrB;CACA,OAAO2C,EAAaN,GAASN,CAAM;AACrC,GAGaY,KACX,GACA,MACa;CACb,IAAM5B,IAAM,CAACsB,EAAQ,IAAIA,EAAQ,EAAE,GAC7BO,IAAOP,EAAQ,SAAS;CAC9B,KAAK,IAAI9B,IAAI,GAAGA,IAAIqC,GAAM,KAAK,GAC7B,EACE7B,GACAsB,EAAQ9B,IACR8B,EAAQ9B,IAAI,IACZ8B,EAAQ9B,IAAI,IACZ8B,EAAQ9B,IAAI,IACZwB,CACF;CAGF,OADIa,KAAQ,KAAG7B,EAAI,KAAKsB,EAAQO,IAAOP,EAAQO,IAAO,EAAE,GACjD7B;AACT,GAGa8B,KACX,GACA,GACA,GACA,IAAO,MACM;CACb,IAAM7B,KAAMgB,IAAKE,KAAM,GACjBJ,IAAI,KAAK,IAAII,IAAKF,CAAE,IAAI,GACxB1B,IAAW,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,KAAK,KAAKwB,IAAI,EAAE,CAAC,CAAC,GAC1Df,IAAgB,CAAC,GACjB+B,IAAOd,IAAKE,IAAK,KAAK,KAAK,GAC3Ba,IAAKf,IAAKE,IAAK,IAAI,KAAK;CAC9B,KAAK,IAAI3B,IAAI,GAAGA,KAAKD,GAAU,KAAK;EAClC,IAAMI,IAAIoC,KAASC,IAAKD,KAAQvC,IAAKD;EACrC,EAAI,KAAKU,IAAKc,IAAI,KAAK,IAAIpB,CAAC,GAAGsC,IAAIlB,IAAImB,IAAO,KAAK,IAAIvC,CAAC,CAAC;CAC3D;CACA,OAAOK;AACT,GAOamC,KACX,GACA,GACA,GACA,GACA,GACA,MACa;CACb,IAAMC,IAAO,KACPC,IAAO,IACPC,IAAQ,KAAK,IAAIC,GAAOC,CAAG,IAAIC,IAAO,KACtCC,IAAKC,IAAQP,GACbQ,IAAKD,IAAQP,GACbpC,IAAM,CAAC6C,IAAI,KAAK,IAAIH,CAAE,IAAIH,GAAON,IAAI,KAAK,IAAIS,CAAE,IAAIH,CAAK;CAY/D,OAXA1D,EACEmB,GACAA,EAAI,IACJA,EAAI,IACJ6C,IAAI,KAAK,IAAIF,IAAQN,CAAI,IAAIC,GAC7BL,IAAI,KAAK,IAAIU,IAAQN,CAAI,IAAIC,GAC7BO,IAAI,KAAK,IAAIF,IAAQN,CAAI,IAAIC,GAC7BL,IAAI,KAAK,IAAIU,IAAQN,CAAI,IAAIC,GAC7BO,IAAI,KAAK,IAAID,CAAE,IAAIJ,GACnBP,IAAI,KAAK,IAAIW,CAAE,IAAIJ,CACrB,GACOxC;AACT,GAQa8C,KACX,GACA,GACA,GACA,GACA,GACA,GACA,GACA,IAAS,MACI;CACb,IAAMjD,IAAI,KAAK,IAAI8C,CAAK,GAClBI,IAAI,KAAK,IAAIJ,CAAK,GAClBK,IAAY,KAAK,IAAInD,CAAC,IAAIoD,KAAK,KAAK,IAAIF,CAAC,IAAIG,GAC7CrC,IAAKmC,IAAanD,IAAI,IAAI,KAAK,IAAK,GACpCiB,IAAKkC,IAAY,IAAID,IAAI,IAAI,KAAK,GAElCI,IAAK,CAACrC,GACNsC,IAAKvC,GACLwC,IAAOL,IAAYC,IAAI,IAAIC,IAAI,GAC/BI,IAAQN,IAAYE,IAAI,IAAID,IAAI,GAChCM,IAAK,KAAK,IAAIC,IAAS,GAAGH,IAAO,GAAI,GACrCI,IAAOC,EAAiB,IAAMR,GAAGD,GAAGpD,GAAGkD,CAAC,GACxCrD,IAAI,KAAK,IACb,EAAE2D,IAAOE,IACT,KAAK,IAAIF,IAAOE,GAAI1D,IAAI4D,IAAON,IAAKJ,IAAIU,IAAOL,CAAE,CACnD,GACMnC,IAAK4B,IAAIhC,IAAKyC,IAAQH,KAAMzD,IAAI6D,IAChCrC,IAAKe,IAAInB,IAAKwC,IAAQF,KAAM1D,IAAI6D,IAChCpC,IAAK0B,IAAIhC,KAAMyC,IAAQK,KAAUR,KAAMzD,IAAI6D,IAC3CnC,IAAKa,IAAInB,KAAMwC,IAAQK,KAAUP,KAAM1D,IAAI6D,IAC3CK,IAAOtB,IAAQ,MACftC,IAAM,CAACiB,GAAIC,CAAE;CAYnB,OAXArC,EACEmB,GACAiB,GACAC,GACAD,IAAKJ,IAAK+C,IAAOT,IAAKI,IAAK,IAC3BrC,IAAKJ,IAAK8C,IAAOR,IAAKG,IAAK,IAC3BpC,IAAKN,IAAK+C,IAAOT,IAAKI,IAAK,IAC3BnC,IAAKN,IAAK8C,IAAOR,IAAKG,IAAK,IAC3BpC,GACAC,CACF,GACOpB;AACT,GAGa6D,KAAc,MAAsC;CAC/D,IAAI/E,IAAS;CACb,KAAK,IAAIU,IAAI,GAAGA,IAAIY,EAAO,QAAQ,KAAK,GACtC,KAAU,KAAK,MACbA,EAAOZ,KAAKY,EAAOZ,IAAI,IACvBY,EAAOZ,IAAI,KAAKY,EAAOZ,IAAI,EAC7B;CACF,OAAOV;AACT,GAGagF,KACX,GACA,GACA,MACa;CACb,IAAMC,IAAQF,EAAWzD,CAAM;CAC/B,IAAI2D,KAASxB,IAAQC,IAAM,MAAM;EAE/B,IAAIpC,EAAO,SAAS,GAAG,OAAOA;EAE9B,IAAM4D,IAAIC,EAAQ7D,IADRmC,IAAQC,IAAM,IAAID,KAASA,IAAQC,KAAO,MACtBuB,CAAK;EACnC,OAAO;GAACC,EAAE;GAAIA,EAAE;GAAIA,EAAE;GAAIA,EAAE;EAAE;CAChC;CACA,IAAMhE,IAAgB,CAAC,GACjBkE,IAAaD,EAAQ7D,GAAQmC,CAAK,GAClC4B,IAAWF,EAAQ7D,GAAQ2D,IAAQvB,CAAG;CAC5C,EAAI,KAAK0B,EAAW,IAAIA,EAAW,EAAE;CACrC,IAAIE,IAAS;CACb,KAAK,IAAI5E,IAAI,GAAGA,IAAIY,EAAO,QAAQ,KAAK,GAKtC,AAJA,KAAU,KAAK,MACbA,EAAOZ,KAAKY,EAAOZ,IAAI,IACvBY,EAAOZ,IAAI,KAAKY,EAAOZ,IAAI,EAC7B,GACI4E,IAAS7B,KAAS6B,IAASL,IAAQvB,KACrCxC,EAAI,KAAKI,EAAOZ,IAAIY,EAAOZ,IAAI,EAAE;CAGrC,OADAQ,EAAI,KAAKmE,EAAS,IAAIA,EAAS,EAAE,GAC1BnE;AACT,GAGaiE,KACX,GACA,MACqC;CACrC,IAAIG,IAAS;CACb,KAAK,IAAI5E,IAAI,GAAGA,IAAIY,EAAO,QAAQ,KAAK,GAAG;EACzC,IAAMiE,IAAKjE,EAAOZ,KAAKY,EAAOZ,IAAI,IAC5B8E,IAAKlE,EAAOZ,IAAI,KAAKY,EAAOZ,IAAI,IAChC+E,IAAI,KAAK,MAAMF,GAAIC,CAAE;EAC3B,IAAIF,IAASG,KAAKC,KAAYD,IAAI,GAAG;GACnC,IAAM9E,KAAK+E,IAAWJ,KAAUG;GAChC,OAAO;IAACnE,EAAOZ,IAAI,KAAK6E,IAAK5E;IAAGW,EAAOZ,IAAI,KAAK8E,IAAK7E;IAAG4E,IAAKE;IAAGD,IAAKC;GAAC;EACxE;EACA,KAAUA;CACZ;CACA,IAAME,IAAIrE,EAAO,SAAS,GACpBiE,IAAKI,KAAK,IAAIrE,EAAOqE,KAAKrE,EAAOqE,IAAI,KAAK,GAC1CH,IAAKG,KAAK,IAAIrE,EAAOqE,IAAI,KAAKrE,EAAOqE,IAAI,KAAK,GAC9CF,IAAI,KAAK,MAAMF,GAAIC,CAAE,KAAK;CAChC,OAAO;EAAClE,EAAOqE;EAAIrE,EAAOqE,IAAI;EAAIJ,IAAKE;EAAGD,IAAKC;CAAC;AAClD,GAGaG,KAAgB,MAAgD;CAC3E,KAAK,IAAIlF,IAAIY,EAAO,SAAS,GAAGZ,KAAK,GAAG,KAAK,GAAG;EAC9C,IAAM6E,IAAKjE,EAAOA,EAAO,SAAS,KAAKA,EAAOZ,IACxC8E,IAAKlE,EAAOA,EAAO,SAAS,KAAKA,EAAOZ,IAAI,IAC5C+E,IAAI,KAAK,MAAMF,GAAIC,CAAE;EAC3B,IAAIC,IAAI,MAAM,OAAO,CAACF,IAAKE,GAAGD,IAAKC,CAAC;CACtC;CACA,OAAO,CAAC,GAAG,CAAC;AACd,GAGab,KACX,GACA,GACA,GACA,GACA,MACW;CACX,IAAI,CAACiB,GAAK,OAAOC,IAAQ;CACzB,IAAM3D,IAAK,KAAK,IAAI4D,CAAE,GAChB3D,IAAK,KAAK,IAAI4D,CAAE,GAChB3B,IAAKlC,IAAK,OAAO2D,IAAQ,IAAI3D,IAAK,UAClCmC,IAAKlC,IAAK,OAAO6D,IAAS,IAAI7D,IAAK;CACzC,OAAO,KAAK,IAAIiC,GAAIC,CAAE;AACxB,GAMa4B,KACX,GACA,GACA,GACA,GACA,GACA,GACA,MACS;CACT,IAAM9B,IAAIpE,IAAS,KACbqC,IAAKgC,IAAK0B,IAAK/F,GACfsC,IAAKgC,IAAK0B,IAAKhG,GACfmG,IAAK9D,IAAK2D,IAAK5B,GACfgC,IAAK9D,IAAKyD,IAAK3B,GACfiC,IAAKhE,IAAK2D,IAAK5B,GACfkC,IAAKhE,IAAKyD,IAAK3B;CAErB,AADAlD,EAAI,KAAKiF,GAAIC,GAAI/B,GAAIC,GAAI+B,GAAIC,GAAIH,GAAIC,GAAIG,GAAKA,CAAG,GACjDrF,EAAI,KAAKmD,GAAIC,GAAIjC,GAAIC,GAAIiE,GAAKA,CAAG;CACjC,IAAM9E,KAAM0E,IAAK9D,KAAM,GACjBb,KAAM4E,IAAK9D,KAAM,GACjBP,KAAMsE,IAAKhE,KAAM,GACjBL,KAAMsE,IAAKhE,KAAM;CACvB,EAAI,KAAK+B,GAAIC,GAAI7C,GAAID,GAAI+E,GAAKA,GAAKlC,GAAIC,GAAIvC,GAAIC,GAAIuE,GAAKA,CAAG;AAC7D,GAGaC,KACX,GACA,GACA,GACA,GACA,GACA,GACA,GACA,MACS;CAET,IAAItB,IAAI;EAAC/C;EAAIC;EAAIC;EAAIC;EAAInB;EAAIC;CAAE;CAG/B,AAFI8D,EAAE,KAAKA,EAAE,OAAI,IAAI;EAACA,EAAE;EAAIA,EAAE;EAAIA,EAAE;EAAIA,EAAE;EAAIA,EAAE;EAAIA,EAAE;CAAE,IACpDA,EAAE,KAAKA,EAAE,OAAI,IAAI;EAACA,EAAE;EAAIA,EAAE;EAAIA,EAAE;EAAIA,EAAE;EAAIA,EAAE;EAAIA,EAAE;CAAE,IACpDA,EAAE,KAAKA,EAAE,OAAI,IAAI;EAACA,EAAE;EAAIA,EAAE;EAAIA,EAAE;EAAIA,EAAE;EAAIA,EAAE;EAAIA,EAAE;CAAE;CACxD,IAAM,CAACjF,GAAIE,GAAIE,GAAIC,GAAIC,GAAIC,KAAM0E;CACjC,IAAI,EAAE3E,IAAKN,IAAK,QAAQ;CAGxB,IAAMwG,IAAMtG,KAAOK,IAAKL,MAAOE,IAAKJ,MAAQM,IAAKN;CACjD,EAAI,KACFA,GACAE,GACAA,GACAE,GACA,KAAK,IAAIC,GAAImG,CAAG,GAChB,KAAK,IAAInG,GAAImG,CAAG,GAChBlG,GACAC,GACAA,GACA+F,GACAA,GACAA,CACF;AACF,GAGMG,KACJ,GACA,GACA,GACA,GACA,MACa;CACb,IAAMtC,IAAIpE,IAAS,IACbqC,IAAKgC,IAAK0B,IAAK/F,GACfsC,IAAKgC,IAAK0B,IAAKhG;CACrB,OAAO;EACLqE;EACAC;EACAjC,IAAK2D,IAAK5B;EACV9B,IAAKyD,IAAK3B;EACVC,IAAK0B,IAAK/F,IAAS;EACnBsE,IAAK0B,IAAKhG,IAAS;EACnBqC,IAAK2D,IAAK5B;EACV9B,IAAKyD,IAAK3B;CACZ;AACF,GAMauC,KACX,GACA,GACA,GACA,GACA,GACA,GACA,GACA,MACS;CACT,IAAM,CAACzG,GAAIE,GAAI+F,GAAIC,GAAIrE,GAAIC,GAAIqE,GAAIC,KAAMI,EAAarC,GAAIC,GAAIyB,GAAIC,GAAIhG,CAAM;CAG5E,AAFAwG,EAAaI,GAAM1G,GAAIE,GAAI+F,GAAIC,GAAIrE,GAAIC,GAAIuE,CAAG,GAC9CC,EAAaI,GAAM1G,GAAIE,GAAI2B,GAAIC,GAAIqE,GAAIC,GAAIC,CAAG,GAC9CM,EAAQ,KAAKV,GAAIC,GAAIlG,GAAIE,GAAIiG,GAAIC,GAAIvE,GAAIC,GAAImE,GAAIC,GAAIG,GAAKA,CAAG;AAC/D,GAGaO,KACX,GACA,GACA,GACA,MACa;CACb,IAAM5F,IAAgB,CAAC,GACjB+D,IAAQF,EAAWzD,CAAM,GACzByF,IAASC,IAAOC;CACtB,IAAIF,KAAU,KAAK9B,KAAS,GAAG,OAAO3D,EAAO,MAAM;CACnD,KAAK,IAAImC,IAAQ,GAAGA,IAAQwB,GAAO,KAAS8B,GAAQ;EAClD,IAAMrD,IAAM,KAAK,IAAIuB,GAAOxB,IAAQuD,CAAI,GAClCnG,IAAIsE,EAAQ7D,GAAQmC,CAAK;EAC/B,EAAI,KAAK5C,EAAE,IAAIA,EAAE,EAAE;EACnB,IAAIyE,IAAS;EACb,KAAK,IAAI5E,IAAI,GAAGA,IAAIY,EAAO,QAAQ,KAAK,GAKtC,AAJA,KAAU,KAAK,MACbA,EAAOZ,KAAKY,EAAOZ,IAAI,IACvBY,EAAOZ,IAAI,KAAKY,EAAOZ,IAAI,EAC7B,GACI4E,IAAS7B,KAAS6B,IAAS5B,KAAKxC,EAAI,KAAKI,EAAOZ,IAAIY,EAAOZ,IAAI,EAAE;EAEvE,IAAMI,IAAIqE,EAAQ7D,GAAQoC,CAAG;EAC7B,EAAI,KAAK5C,EAAE,IAAIA,EAAE,IAAIyF,GAAKA,CAAG;CAC/B;CACA,OAAOrF;AACT,GAGagG,KACX,GACA,GACA,MACW;CACX,IAAIC,IAAO;CACX,KAAK,IAAI,IAAI,GAAG,IAAI7F,EAAO,QAAQ,KAAK,GAAG;EACzC,IAAMa,IAAKb,EAAO,IAAI,IAChBc,IAAKd,EAAO,IAAI,IAChBiE,IAAKjE,EAAO,KAAKa,GACjBqD,IAAKlE,EAAO,IAAI,KAAKc,GACrB,IAAImD,IAAKA,IAAKC,IAAKA,GACnB7E,IACJ,IAAI,IACA,KAAK,IAAI,GAAG,KAAK,IAAI,KAAKgB,IAAKQ,KAAMoD,KAAM3D,IAAKQ,KAAMoD,KAAM,CAAC,CAAC,IAC9D,GACA4B,IAAKjF,IAAKoD,IAAK5E,IAAIgB,GACnB0F,IAAKjF,IAAKoD,IAAK7E,IAAIiB;EACzB,IAAO,KAAK,IAAIuF,GAAMC,IAAKA,IAAKC,IAAKA,CAAE;CACzC;CACA,OAAOF;AACT"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e=require("./data.cjs"),t=require("./color.cjs"),n=require("./locale.cjs"),r=require("./labels.cjs"),i=require("./scale.cjs"),a=require("./format.cjs"),o=require("./spatial.cjs");var s={scale:1,offset:0,log:!0},c=e=>{if(typeof e==`object`&&e&&!(`length`in e)){let t=e.x;return t&&t.length?t[0]:void 0}let t=e;for(let e=0;e<Math.min(t.length,8);e++){let n=t[e];if(Array.isArray(n))return n[0];if(n&&typeof n==`object`)return n.x}},l=e=>{for(let t of e){let e=c(t);if(e instanceof Date)return`time`;if(typeof e==`string`)return`category`}return`linear`},u=(e,t,n,r,i)=>({type:t,reverse:!!e?.reverse,categories:n,title:e?.title,format:e?.format,grid:e?.grid??r,visible:e?.visible??!0,tickCount:e?.tickCount,locale:i,timeZone:e?.timeZone??`local`}),d=e=>{let t={};if(!e)return t;for(let n of Object.keys(e))e[n]!==void 0&&(t[n]=e[n]);return t},f=e=>{let t=1/0,n=-1/0;for(let r=0;r<e.length;r++){let i=e[r];Number.isFinite(i)&&(i<t&&(t=i),i>n&&(n=i))}return[t,n]},p=(e,t)=>{let n=1/0;return e.forEach((e,r)=>{let i=t[r]?e:Float64Array.from(e).sort();for(let e=1;e<i.length;e++){let t=i[e]-i[e-1];t>0&&t<n&&(n=t)}}),n},m=(e,t,n)=>{if(n)return 1;let r=p(e.map(e=>t===`x`?e.cols.x:e.cols.y),e.map(e=>t===`x`&&e.cols.sorted));return Number.isFinite(r)?r:1},h=(e,t)=>{let n=new Map;if(t)for(let{s:t,stack:r}of e){let e=n.get(r);e||n.set(r,e=new Map);let{x:i,y:a,count:o}=t.cols;for(let t=0;t<o;t++){let n=a[t];if(!Number.isFinite(n))continue;let r=e.get(i[t])??[0,0];n>=0?r[0]+=n:r[1]-=n,e.set(i[t],r)}}let r=new Map,i=new Map;for(let{stack:t}of e)i.set(t,(i.get(t)??0)+1);return e.map(({s:e,stack:a})=>{let{x:o,y:s,count:c}=e.cols;if(!t&&i.get(a)===1){let e=new Float64Array(c),t=new Float64Array(c);for(let n=0;n<c;n++){let r=s[n],i=Number.isFinite(r);e[n]=i?0:NaN,t[n]=i?r:NaN}return{base:e,top:t}}let l=r.get(a);l||r.set(a,l=new Map);let u=n.get(a),d=new Float64Array(c),f=new Float64Array(c);for(let e=0;e<c;e++){let t=s[e];if(!Number.isFinite(t)){d[e]=NaN,f[e]=NaN;continue}if(u){let n=u.get(o[e]),r=n?t>=0?n[0]:n[1]:0;t=r>0?t/r*100:0}let n=l.get(o[e])??[0,0],r=t>=0?n[0]:n[1];d[e]=r,f[e]=r+t,t>=0?n[0]+=t:n[1]+=t,l.set(o[e],n)}return{base:d,top:f}})},ee=`var(--success-color, #16a34a)`,te=`var(--danger-color, #dc2626)`,g=e=>{for(let t of e){if(typeof t!=`object`||!t||!(`length`in t))continue;let e=t;for(let t=0;t<Math.min(e.length,8);t++){let n=e[t];if(n&&typeof n==`object`&&!Array.isArray(n)){let e=n;if(e.y instanceof Date||e.y0 instanceof Date)return!0}}}return!1},_=e=>Number(e.toPrecision(12)),v=e=>{let t=10**Math.floor(Math.log10(e)+1e-9),n=e/t;return(n<1.5?2:n<3.5?5:10)*t},y=(e,t,n,r)=>{let[a,o]=n,s=i.tickStep(a,o,r),c=s>0?Math.round((o-a)/s):0;if([e,t]=i.ensureSpan(e,t),c<1||Math.abs(c*s-(o-a))>s*1e-6)return i.niceDomain(e,t,r);let l=i.tickStep(e,t,c);for(let n=0;n<40&&l>0;n++){let n=Math.floor(e/l+1e-9)*l;if(n+c*l>=t-l*1e-9)return[_(n),_(n+c*l)];l=v(l)}return i.niceDomain(e,t,r)},b=new WeakMap,x=(e,t)=>{let n=`${t.scale},${t.offset},${!!t.log}`,r=b.get(e);if(r&&r.key===n)return r.cols;let i=C(t),a=e=>e?e.map(i):null,o=e,s={...o,y:o.y.map(i),open:a(o.open),high:a(o.high),low:a(o.low),y0:a(o.y0),q1:a(o.q1),q3:a(o.q3),outliers:o.outliers?o.outliers.map(e=>e?.map(i)):null};if(t.log){let e=[1/0,-1/0],t=t=>{if(t)for(let n=0;n<t.length;n++){let r=t[n];Number.isFinite(r)&&(r<e[0]&&(e[0]=r),r>e[1]&&(e[1]=r))}};for(let e of[s.y,s.y0,s.high,s.low,s.q1,s.q3])t(e);s.outliers?.forEach(e=>t(e)),s.yMin=e[0]<=e[1]?e[0]:NaN,s.yMax=e[0]<=e[1]?e[1]:NaN}else{let e=i(o.yMin),t=i(o.yMax);s.yMin=Math.min(e,t),s.yMax=Math.max(e,t)}return b.set(e,{key:n,cols:s}),s},S=e=>{let t=Math.floor(e[0]+1e-9),n=Math.ceil(e[1]-1e-9);return[t,n>t?n:t+1]},ne=(e,t,n=-1/0)=>{let r=C(t),i=e=>e?e.map(r):null,a=e.stackBase;e.cols=x(e.cols,t),e.barBase=e.barBase&&!e.floating?e.barBase.map(e=>e===0?t.log?-1/0:r(0):r(e)):i(e.barBase),e.barTop=i(e.barTop),e.stackTop=i(e.stackTop),e.stackBase=a&&a===e.raw.y0?e.cols.y0:a?i(a):e.type===`area`?new Float64Array(e.cols.count).fill(n):null},C=e=>t=>(e.log?Math.log10(t):t)*e.scale+e.offset,w=(e,t)=>e.y.type===`log`?Math.log10(t):t,T=(e,t)=>e.y.type===`log`?10**t:t,E=(e,t)=>e.x.type===`log`?Math.log10(t):t,D=(e,t)=>e.x.type===`log`?10**t:t,O=(e,t)=>({x:[D(e,t.x[0]),D(e,t.x[1])],y:[T(e,t.y[0]),T(e,t.y[1])]}),k=(e,t,n)=>({x:t.x?[E(e,t.x[0]),E(e,t.x[1])]:n.x,y:t.y?[w(e,t.y[0]),w(e,t.y[1])]:n.y}),A=new WeakMap,re=e=>{let t=A.get(e);if(t)return t;let n=e.x.map(e=>e>0?Math.log10(e):NaN),r=e.y,i=!1;for(let t=0;t<e.count;t++)Number.isFinite(n[t])||(i||(r=Float64Array.from(e.y)),i=!0,r[t]=NaN);let[a,o]=f(n),s={...e,x:n,y:r,xMin:a,xMax:o,sorted:e.sorted&&!i};return A.set(e,s),s},ie=(e,t)=>{for(let n of[e.barBase,e.stackBase])if(n)for(let e=0;e<n.length;e++)n[e]===-1/0&&(n[e]=t)},ae=(e,t)=>{let[n,r]=e.valueRange,i=e.colorMidpoint,a;return a=i!==null&&i>n&&i<r?t<i?(t-n)/(i-n)*.5:.5+(t-i)/(r-i)*.5:(t-n)/(r-n||1),a<0?0:a>1?1:a},oe=(e,n,r,i)=>{let a=t.luminance(r.background)<.4;if(e===`diverging`){let e=t.mixOklab(r.surface,r.textMuted,a?.12:.08),o=e=>a?t.withLightness(e,.7,1.25):t.withLightness(e,.5,1.05),s=n=>t.mixOklab(e,o(n),.5);return[o(i),s(i),e,s(n),o(n)]}return a?[t.mixOklab(r.surface,n,.14),t.withLightness(n,.46,.95),t.withLightness(n,.64,1.2),t.withLightness(n,.8,1.15)]:[t.mixOklab(r.surface,n,.06),t.withLightness(n,.8,.6),t.withLightness(n,.58,1),t.withLightness(n,.36,.9)]},se=(o,c,p,_,v=null)=>{let b=v??c.resolve??((e,n)=>t.resolveStaticColor(e,{},n)),w=o.series,T=n.resolveLocale(o.locale),E=typeof o.tooltip==`object`?o.tooltip:void 0,D=r.chartLabels(T,{...d(E?.labels),...d(o.labels)}),O=w.map(e=>e.data),k=o.xAxis?.type??l(O),A=k===`category`?[...o.xAxis?.categories??e.collectCategories(O)]:[],se=new Map(A.map((e,t)=>[e,t])),ce=e.xResolver(k,e=>se.get(e)??NaN),j=o.yAxis,M=w.filter(e=>e.type===`heatmap`).map(e=>e.data),N=j?.type===`category`||!j?.type&&M.length?[...j?.categories??e.collectYCategories(M)]:[],P=j?.type===`category`||N.length?`category`:j?.type===`time`||!j?.type&&g(O)?`time`:j?.type===`log`?`log`:`linear`,F=P===`log`,le=new Map(N.map((e,t)=>[e,t])),ue=e=>typeof e==`number`?e:typeof e==`string`?P===`category`?le.get(e)??NaN:P===`time`?Date.parse(e):Number(e):e instanceof Date?e.getTime():NaN,de=`${k}|${A.join(``)}|${P}|${N.join(``)}`,I=o.stackMode===`percent`,fe=o.orientation===`horizontal`,pe=new Set,L=w.map((n,r)=>{let i=n.id??`#${r}`;for(;pe.has(i);)i+=`'`;pe.add(i);let a=_.get(i);(!a||a.data!==n.data||a.resolverKey!==de)&&(a={data:n.data,resolverKey:de,cols:e.normalizeData(n.data,ce,ue)},_.set(i,a));let o=n.type??`line`,s=c.palette[r%c.palette.length],l=n.color?b(n.color,s):s,u=a.cols,d=null;if((o===`scatter`||o===`bar`||o===`boxplot`)&&u.colors){let e=new Map;d=u.colors.map(t=>{if(t===void 0)return;let n=e.get(t);return n||e.set(t,n=b(t,l)),n})}let f=[],m=[0,1],h=null,g=null,v=null;if(o===`heatmap`){let e=n.colorScale,r=e===`diverging`?`diverging`:`sequential`;f=typeof e==`object`&&e.length?e.map(e=>b(e,l)):oe(r,l,c,b(te,[.86,.15,.15,1])),m=n.valueRange?[n.valueRange[0],n.valueRange[1]]:[u.valueMin,u.valueMax],Number.isFinite(m[0])||(m=[0,1]);let[i,a]=m;g=n.colorMidpoint??(r===`diverging`&&typeof e!=`object`?i<0&&a>0?0:(i+a)/2:null);let o=t.oklabRamp(f);v=o;let s=u.value??u.y,d={valueRange:m,colorMidpoint:g};h=new Uint32Array(u.count);for(let e=0;e<u.count;e++){let t=s[e];Number.isFinite(t)&&Number.isFinite(u.y[e])&&(h[e]=o[Math.round(ae(d,t)*255)])}}let y=n.connector?typeof n.connector==`object`?n.connector:{}:null,x=n.id??String(r);return{index:r,key:i,id:x,name:n.name??`${D.series} ${r+1}`,type:o,color:l,colorCss:t.toCss(l),lineWidth:n.lineWidth??(o===`candlestick`?1:o===`boxplot`?1.5:2),pointSize:n.pointSize??(o===`boxplot`?6:8),opacity:n.opacity??(o===`area`?.28:o===`scatter`?.78:o===`boxplot`?.22:1),hidden:!!n.hidden||p.has(x),showLabels:!!n.showLabels,curve:n.curve??`linear`,cols:u,raw:u,yAxis:n.yAxis===`right`&&!fe?`right`:`left`,floating:o===`bar`&&!!u.y0,barOffset:0,barHalfWidth:0,barBase:null,barTop:null,stackBase:null,stackTop:null,pointColors:d,upColor:o===`candlestick`?b(n.upColor??ee,[.09,.64,.29,1]):l,downColor:o===`candlestick`?b(n.downColor??te,[.86,.15,.15,1]):l,cellColors:h,cellHalf:{x:.5,y:.5},colorScale:f,valueRange:m,colorMidpoint:g,colorLut:v,tooltip:n.tooltip!==!1,outlierShape:n.outlierShape??`hollow`,outlierSize:n.outlierSize??n.pointSize??7,connector:y&&o===`bar`?{color:y.color?b(y.color,c.textMuted):c.textMuted,dash:[...y.dash??[3,3]],width:y.width??1}:null,radius:n.radius??(o===`heatmap`?2:o===`boxplot`?0:3),format:n.format,valueName:n.valueName}}),R=L.filter(e=>!e.hidden),z=k===`log`;if(z)for(let e of L)e.cols=re(e.raw);let B=L.length>0&&L.every(e=>e.type===`scatter`||e.type===`heatmap`),V=R.filter(e=>e.type===`bar`||e.type===`boxplot`),H=R.filter(e=>e.type===`bar`),me=m(V,`x`,k===`category`);if(V.length){let e=new Map,t=e=>w[e.index].stack??`\u0000${e.key}`;for(let n of V)e.has(t(n))||e.set(t(n),e.size);let n=0;for(let e of V){let t=w[e.index].barWidth;t!==void 0&&t>n&&(n=Math.min(1,t))}let r=me*(n||(e.size>1?.78:.62)),i=r/e.size;for(let n of V){let a=e.get(t(n))??0;n.barOffset=-r/2+i*(a+.5),n.barHalfWidth=i/2*(e.size>1?.86:1)}let a=H.filter(e=>!e.floating),o=h(a.map(e=>({s:e,stack:t(e)})),!1),s=I?h(a.filter(e=>w[e.index].stack!==void 0).map(e=>({s:e,stack:t(e)})),!0):[],c=0;a.forEach((e,t)=>{let n=I&&w[e.index].stack!==void 0?s[c++]:o[t];e.barBase=n.base,e.barTop=n.top});for(let e of H){let{y:t,y0:n,count:r}=e.cols;if(!e.floating||!n)continue;let i=new Float64Array(r),a=new Float64Array(r);for(let e=0;e<r;e++){let r=Number.isFinite(t[e]);i[e]=r?Number.isFinite(n[e])?n[e]:0:NaN,a[e]=r?t[e]:NaN}e.barBase=i,e.barTop=a}}for(let e of R)e.type===`area`&&e.cols.y0&&w[e.index].stack===void 0&&(e.stackBase=e.cols.y0);let U=R.filter(e=>(e.type===`line`||e.type===`area`)&&w[e.index].stack!==void 0);if(U.length){let e=h(U.map(e=>({s:e,stack:w[e.index].stack??``})),I);U.forEach((t,n)=>{t.stackBase=e[n].base,t.stackTop=e[n].top})}let W=R.filter(e=>e.type===`candlestick`),he=m(W,`x`,k===`category`);for(let e of W)e.barHalfWidth=he*.3;let G=R.filter(e=>e.type===`heatmap`);if(G.length){let e=m(G,`x`,k===`category`)/2,t=m(G,`y`,P===`category`)/2;for(let n of G)n.cellHalf={x:e,y:t}}let K=o.xAxis,q;if(k===`category`)q=[-.5,Math.max(1,A.length)-.5];else{let e=[];for(let t of R){e.push(t.cols.xMin,t.cols.xMax);let n=t.type===`bar`||t.type===`boxplot`?me/2:t.type===`candlestick`?he/2:t.type===`heatmap`?t.cellHalf.x:0;n&&e.push(t.cols.xMin-n,t.cols.xMax+n)}q=i.ensureSpan(...f(e),k===`time`?[Date.now()-864e5,Date.now()]:[0,1]);let t=L.every(e=>e.type===`scatter`);if(t){let e=(q[1]-q[0])*.04;q=[q[0]-e,q[1]+e]}(K?.nice??(t&&k===`linear`))&&k===`linear`&&(q=i.niceDomain(q[0],q[1],K?.tickCount??6)),z&&K?.nice!==!1&&(q=S(q))}let ge=e=>z?Math.log10(e):e;if(K?.min!==void 0&&(q[0]=ge(K.min)),K?.max!==void 0&&(q[1]=ge(K.max)),q=i.ensureSpan(q[0],q[1]),F)for(let e of L)e.yAxis!==`right`&&e.type!==`heatmap`&&ne(e,s);let _e=(e,t,n=!1)=>{let r=[];for(let t of e)t.type===`bar`&&t.barBase&&t.barTop?r.push(...f(t.barBase),...f(t.barTop)):t.stackBase&&t.stackTop?r.push(...f(t.stackBase),...f(t.stackTop)):t.type===`heatmap`?r.push(t.cols.yMin-t.cellHalf.y,t.cols.yMax+t.cellHalf.y):r.push(t.cols.yMin,t.cols.yMax);let i=e.filter(e=>e.type===`bar`);if(!n&&(i.some(e=>!e.floating)||t)&&r.push(0),i.some(e=>e.showLabels)){let[e,t]=f(r);t>0&&r.push(t+(t-Math.min(0,e))*.1),e<0&&r.push(e-(Math.max(0,t)-e)*.1)}return r},ve=R.filter(e=>e.yAxis===`left`),J=ve.length?ve:R,ye=J.filter(e=>e.type===`bar`),Y;if(P===`category`)Y=[-.5,Math.max(1,N.length)-.5];else{let e=_e(J,j?.zero,F),t=ye.length>0||J.some(e=>e.type===`area`);if(Y=i.ensureSpan(...f(e)),L.every(e=>e.type===`scatter`)){let e=(Y[1]-Y[0])*.06;Y=[Y[0]-e,Y[1]+e]}else if((W.length||J.some(e=>e.type===`boxplot`))&&!ye.length){let e=(Y[1]-Y[0])*.04;Y=[Y[0]-e,Y[1]+e]}(j?.nice??!G.length)&&P===`linear`&&(Y=i.niceDomain(Y[0],Y[1],j?.tickCount??5)),F&&j?.nice!==!1&&(Y=S(Y)),I&&(H.length||U.length)&&(Y=[f(e)[0]<0?-100:0,100]),t&&!j?.zero&&!F&&Y[0]<0&&f(e)[0]>=0&&(Y[0]=0)}let be=e=>F?Math.log10(e):e;if(j?.min!==void 0&&(Y[0]=be(j.min)),j?.max!==void 0&&(Y[1]=be(j.max)),Y=i.ensureSpan(Y[0],Y[1]),F)for(let e of L)e.yAxis===`left`&&ie(e,Y[0]);let X=o.yAxis2,xe=null,Z=null,Q=L.filter(e=>e.yAxis===`right`);if(Q.length&&P!==`category`){let e=X?.type===`log`,t=Q.filter(e=>!e.hidden),n=e?t.flatMap(e=>{let t=x(e.raw,s);return[t.yMin,t.yMax]}):_e(t,X?.zero),[r,a]=i.ensureSpan(...f(n)),o=X?.nice===!1?[r,a]:e?S([r,a]):y(r,a,Y,j?.tickCount??5),c=t=>e?Math.log10(t):t;X?.min!==void 0&&(o[0]=c(X.min)),X?.max!==void 0&&(o[1]=c(X.max)),o=i.ensureSpan(o[0],o[1]);let l=(Y[1]-Y[0])/(o[1]-o[0]),d={scale:l,offset:Y[0]-o[0]*l,log:e};Z=d;let p=e?Y[0]:C(d)(Math.min(Math.max(0,o[0]),o[1]));for(let e of Q)ne(e,d,p),ie(e,Y[0]);xe=u(X,e?`log`:`linear`,[],!1,T)}let Se=P===`time`&&L.some(e=>e.type===`bar`)&&L.every(e=>e.type===`bar`?e.floating:e.type===`scatter`),$=o.interaction===!1?!1:o.interaction===!0||o.interaction===void 0?!0:o.interaction.zoom??!0,Ce=$===!1?{x:!1,y:!1}:$===!0?{x:!0,y:B}:{x:$.includes(`x`),y:$.includes(`y`)},we=j?.format??(I&&(H.length||U.length)?e=>a.formatPercent(e,T):void 0);return{series:L,x:u(K,k,A,!1,T),y:{...u(j,P,N,P!==`category`,T),format:we},y2:xe,y2Map:Z,horizontal:fe,locale:T,labels:D,formatValue:a.valueFormatter(T),base:{x:q,y:Y},allScatter:B,zoom:Ce,tooltipMode:E?.mode??(B?`nearest`:Se?`item`:`axis`),baseline:F?Y[0]:Math.min(Math.max(0,Y[0]),Y[1]),minSpan:{x:k===`category`?1:(q[1]-q[0])*1e-7,y:P===`category`?1:(Y[1]-Y[0])*1e-7},percent:I,stacks:w.map(e=>e.stack!==void 0&&(e.type===`bar`||e.type===`line`||e.type===`area`||!e.type)?`${e.type===`bar`?`bar`:`line`}:${e.stack}`:null)}},ce=(e,t)=>e.barTop?e.barTop[t]:e.stackTop?e.stackTop[t]:e.cols.y[t],j=new WeakMap,M=e=>{let t=j.get(e.cols);return t||(t=new o.GridIndex(e.cols.x,e.cols.y,e.cols.count),j.set(e.cols,t)),t};exports.alignedDomain=y,exports.buildModel=se,exports.detectXType=l,exports.fromPlotX=D,exports.fromPlotY=T,exports.gridOf=M,exports.heatPosition=ae,exports.heatmapStops=oe,exports.plottedY=ce,exports.toPlotX=E,exports.toPlotY=w,exports.viewFromValues=k,exports.viewToValues=O;
|
|
1
|
+
const e=require("./data.cjs"),t=require("./color.cjs"),n=require("./locale.cjs"),r=require("./labels.cjs"),i=require("./scale.cjs"),a=require("./format.cjs"),o=require("./spatial.cjs");var s={scale:1,offset:0,log:!0},c=e=>{if(typeof e==`object`&&e&&!(`length`in e)){let t=e.x;return t&&t.length?t[0]:void 0}let t=e;for(let e=0;e<Math.min(t.length,8);e++){let n=t[e];if(Array.isArray(n))return n[0];if(n&&typeof n==`object`)return n.x}},l=e=>{for(let t of e){let e=c(t);if(e instanceof Date)return`time`;if(typeof e==`string`)return`category`}return`linear`},u=(e,t,n,r,i)=>({type:t,reverse:!!e?.reverse,categories:n,title:e?.title,format:e?.format,grid:e?.grid??r,visible:e?.visible??!0,tickCount:e?.tickCount,locale:i,timeZone:e?.timeZone??`local`}),d=e=>{let t={};if(!e)return t;for(let n of Object.keys(e))e[n]!==void 0&&(t[n]=e[n]);return t},f=e=>{let t=1/0,n=-1/0;for(let r=0;r<e.length;r++){let i=e[r];Number.isFinite(i)&&(i<t&&(t=i),i>n&&(n=i))}return[t,n]},p=(e,t)=>{let n=1/0;return e.forEach((e,r)=>{let i=t[r]?e:Float64Array.from(e).sort();for(let e=1;e<i.length;e++){let t=i[e]-i[e-1];t>0&&t<n&&(n=t)}}),n},m=(e,t,n)=>{if(n)return 1;let r=p(e.map(e=>t===`x`?e.cols.x:e.cols.y),e.map(e=>t===`x`&&e.cols.sorted));return Number.isFinite(r)?r:1},h=(e,t)=>{let n=new Map;if(t)for(let{s:t,stack:r}of e){let e=n.get(r);e||n.set(r,e=new Map);let{x:i,y:a,count:o}=t.cols;for(let t=0;t<o;t++){let n=a[t];if(!Number.isFinite(n))continue;let r=e.get(i[t])??[0,0];n>=0?r[0]+=n:r[1]-=n,e.set(i[t],r)}}let r=new Map,i=new Map;for(let{stack:t}of e)i.set(t,(i.get(t)??0)+1);return e.map(({s:e,stack:a})=>{let{x:o,y:s,count:c}=e.cols;if(!t&&i.get(a)===1){let e=new Float64Array(c),t=new Float64Array(c);for(let n=0;n<c;n++){let r=s[n],i=Number.isFinite(r);e[n]=i?0:NaN,t[n]=i?r:NaN}return{base:e,top:t}}let l=r.get(a);l||r.set(a,l=new Map);let u=n.get(a),d=new Float64Array(c),f=new Float64Array(c);for(let e=0;e<c;e++){let t=s[e];if(!Number.isFinite(t)){d[e]=NaN,f[e]=NaN;continue}if(u){let n=u.get(o[e]),r=n?t>=0?n[0]:n[1]:0;t=r>0?t/r*100:0}let n=l.get(o[e])??[0,0],r=t>=0?n[0]:n[1];d[e]=r,f[e]=r+t,t>=0?n[0]+=t:n[1]+=t,l.set(o[e],n)}return{base:d,top:f}})},ee=`var(--success-color, #16a34a)`,te=`var(--danger-color, #dc2626)`,g=e=>{for(let t of e){if(typeof t!=`object`||!t||!(`length`in t))continue;let e=t;for(let t=0;t<Math.min(e.length,8);t++){let n=e[t];if(n&&typeof n==`object`&&!Array.isArray(n)){let e=n;if(e.y instanceof Date||e.y0 instanceof Date)return!0}}}return!1},_=e=>Number(e.toPrecision(12)),v=e=>{let t=10**Math.floor(Math.log10(e)+1e-9),n=e/t;return(n<1.5?2:n<3.5?5:10)*t},y=(e,t,n,r)=>{let[a,o]=n,s=i.tickStep(a,o,r),c=s>0?Math.round((o-a)/s):0;if([e,t]=i.ensureSpan(e,t),c<1||Math.abs(c*s-(o-a))>s*1e-6)return i.niceDomain(e,t,r);let l=i.tickStep(e,t,c);for(let n=0;n<40&&l>0;n++){let n=Math.floor(e/l+1e-9)*l;if(n+c*l>=t-l*1e-9)return[_(n),_(n+c*l)];l=v(l)}return i.niceDomain(e,t,r)},b=new WeakMap,x=(e,t)=>{let n=`${t.scale},${t.offset},${!!t.log}`,r=b.get(e);if(r&&r.key===n)return r.cols;let i=C(t),a=e=>e?e.map(i):null,o=e,s={...o,y:o.y.map(i),open:a(o.open),high:a(o.high),low:a(o.low),y0:a(o.y0),q1:a(o.q1),q3:a(o.q3),outliers:o.outliers?o.outliers.map(e=>e?.map(i)):null};if(t.log){let e=[1/0,-1/0],t=t=>{if(t)for(let n=0;n<t.length;n++){let r=t[n];Number.isFinite(r)&&(r<e[0]&&(e[0]=r),r>e[1]&&(e[1]=r))}};for(let e of[s.y,s.y0,s.high,s.low,s.q1,s.q3])t(e);s.outliers?.forEach(e=>t(e)),s.yMin=e[0]<=e[1]?e[0]:NaN,s.yMax=e[0]<=e[1]?e[1]:NaN}else{let e=i(o.yMin),t=i(o.yMax);s.yMin=Math.min(e,t),s.yMax=Math.max(e,t)}return b.set(e,{key:n,cols:s}),s},ne=e=>{let t=Math.floor(e[0]+1e-9),n=Math.ceil(e[1]-1e-9);return[t,n>t?n:t+1]},S=(e,t)=>Math.log10(Number((e*10**t).toPrecision(12))),re=e=>{let t=e=>{let t=Math.floor(e+1e-9),n=t;for(let r of[2,5]){let i=S(r,t);i<=e+1e-9&&(n=i)}return n},n=e=>{let t=Math.floor(e-1e-9);for(let n of[1,2,5]){let r=S(n,t);if(r>=e-1e-9)return r}return t+1},r=t(e[0]),i=n(e[1]);return[r,i>r+1e-9?i:n(r+1e-6)]},ie=(e,t,n=-1/0)=>{let r=C(t),i=e=>e?e.map(r):null,a=e.stackBase;e.cols=x(e.cols,t),e.barBase=e.barBase&&!e.floating?e.barBase.map(e=>e===0?t.log?-1/0:r(0):r(e)):i(e.barBase),e.barTop=i(e.barTop),e.stackTop=i(e.stackTop),e.stackBase=a&&a===e.raw.y0?e.cols.y0:a?i(a):e.type===`area`?new Float64Array(e.cols.count).fill(n):null},C=e=>t=>(e.log?Math.log10(t):t)*e.scale+e.offset,w=(e,t)=>e.y.type===`log`?Math.log10(t):t,T=(e,t)=>e.y.type===`log`?10**t:t,E=(e,t)=>e.x.type===`log`?Math.log10(t):t,D=(e,t)=>e.x.type===`log`?10**t:t,O=(e,t)=>({x:[D(e,t.x[0]),D(e,t.x[1])],y:[T(e,t.y[0]),T(e,t.y[1])]}),k=(e,t,n)=>({x:t.x?[E(e,t.x[0]),E(e,t.x[1])]:n.x,y:t.y?[w(e,t.y[0]),w(e,t.y[1])]:n.y}),A=new WeakMap,ae=e=>{let t=A.get(e);if(t)return t;let n=e.x.map(e=>e>0?Math.log10(e):NaN),r=e.y,i=!1;for(let t=0;t<e.count;t++)Number.isFinite(n[t])||(i||(r=Float64Array.from(e.y)),i=!0,r[t]=NaN);let[a,o]=f(n),s={...e,x:n,y:r,xMin:a,xMax:o,sorted:e.sorted&&!i};return A.set(e,s),s},oe=(e,t)=>{for(let n of[e.barBase,e.stackBase])if(n)for(let e=0;e<n.length;e++)n[e]===-1/0&&(n[e]=t)},se=(e,t)=>{let[n,r]=e.valueRange,i=e.colorMidpoint,a;return a=i!==null&&i>n&&i<r?t<i?(t-n)/(i-n)*.5:.5+(t-i)/(r-i)*.5:(t-n)/(r-n||1),a<0?0:a>1?1:a},ce=(e,n,r,i)=>{let a=t.luminance(r.background)<.4;if(e===`diverging`){let e=t.mixOklab(r.surface,r.textMuted,a?.12:.08),o=e=>a?t.withLightness(e,.7,1.25):t.withLightness(e,.5,1.05),s=n=>t.mixOklab(e,o(n),.5);return[o(i),s(i),e,s(n),o(n)]}return a?[t.mixOklab(r.surface,n,.14),t.withLightness(n,.46,.95),t.withLightness(n,.64,1.2),t.withLightness(n,.8,1.15)]:[t.mixOklab(r.surface,n,.06),t.withLightness(n,.8,.6),t.withLightness(n,.58,1),t.withLightness(n,.36,.9)]},le=(o,c,p,_,v=null)=>{let b=v??c.resolve??((e,n)=>t.resolveStaticColor(e,{},n)),S=o.series,w=n.resolveLocale(o.locale),T=typeof o.tooltip==`object`?o.tooltip:void 0,E=r.chartLabels(w,{...d(T?.labels),...d(o.labels)}),D=S.map(e=>e.data),O=o.xAxis?.type??l(D),k=O===`category`?[...o.xAxis?.categories??e.collectCategories(D)]:[],A=new Map(k.map((e,t)=>[e,t])),le=e.xResolver(O,e=>A.get(e)??NaN),j=o.yAxis,M=S.filter(e=>e.type===`heatmap`).map(e=>e.data),N=j?.type===`category`||!j?.type&&M.length?[...j?.categories??e.collectYCategories(M)]:[],P=j?.type===`category`||N.length?`category`:j?.type===`time`||!j?.type&&g(D)?`time`:j?.type===`log`?`log`:`linear`,F=P===`log`,ue=new Map(N.map((e,t)=>[e,t])),de=e=>typeof e==`number`?e:typeof e==`string`?P===`category`?ue.get(e)??NaN:P===`time`?Date.parse(e):Number(e):e instanceof Date?e.getTime():NaN,fe=`${O}|${k.join(``)}|${P}|${N.join(``)}`,I=o.stackMode===`percent`,pe=o.orientation===`horizontal`,me=new Set,L=S.map((n,r)=>{let i=n.id??`#${r}`;for(;me.has(i);)i+=`'`;me.add(i);let a=_.get(i);(!a||a.data!==n.data||a.resolverKey!==fe)&&(a={data:n.data,resolverKey:fe,cols:e.normalizeData(n.data,le,de)},_.set(i,a));let o=n.type??`line`,s=c.palette[r%c.palette.length],l=n.color?b(n.color,s):s,u=a.cols,d=null;if((o===`scatter`||o===`bar`||o===`boxplot`)&&u.colors){let e=new Map;d=u.colors.map(t=>{if(t===void 0)return;let n=e.get(t);return n||e.set(t,n=b(t,l)),n})}let f=[],m=[0,1],h=null,g=null,v=null;if(o===`heatmap`){let e=n.colorScale,r=e===`diverging`?`diverging`:`sequential`;f=typeof e==`object`&&e.length?e.map(e=>b(e,l)):ce(r,l,c,b(te,[.86,.15,.15,1])),m=n.valueRange?[n.valueRange[0],n.valueRange[1]]:[u.valueMin,u.valueMax],Number.isFinite(m[0])||(m=[0,1]);let[i,a]=m;g=n.colorMidpoint??(r===`diverging`&&typeof e!=`object`?i<0&&a>0?0:(i+a)/2:null);let o=t.oklabRamp(f);v=o;let s=u.value??u.y,d={valueRange:m,colorMidpoint:g};h=new Uint32Array(u.count);for(let e=0;e<u.count;e++){let t=s[e];Number.isFinite(t)&&Number.isFinite(u.y[e])&&(h[e]=o[Math.round(se(d,t)*255)])}}let y=n.connector?typeof n.connector==`object`?n.connector:{}:null,x=n.id??String(r);return{index:r,key:i,id:x,name:n.name??`${E.series} ${r+1}`,type:o,color:l,colorCss:t.toCss(l),lineWidth:n.lineWidth??(o===`candlestick`?1:o===`boxplot`?1.5:2),pointSize:n.pointSize??(o===`boxplot`?6:8),opacity:n.opacity??(o===`area`?.28:o===`scatter`?.78:o===`boxplot`?.22:1),hidden:!!n.hidden||p.has(x),showLabels:!!n.showLabels,curve:n.curve??`linear`,cols:u,raw:u,yAxis:n.yAxis===`right`&&!pe?`right`:`left`,floating:o===`bar`&&!!u.y0,barOffset:0,barHalfWidth:0,barBase:null,barTop:null,stackBase:null,stackTop:null,pointColors:d,upColor:o===`candlestick`?b(n.upColor??ee,[.09,.64,.29,1]):l,downColor:o===`candlestick`?b(n.downColor??te,[.86,.15,.15,1]):l,cellColors:h,cellHalf:{x:.5,y:.5},colorScale:f,valueRange:m,colorMidpoint:g,colorLut:v,tooltip:n.tooltip!==!1,outlierShape:n.outlierShape??`hollow`,outlierSize:n.outlierSize??n.pointSize??7,connector:y&&o===`bar`?{color:y.color?b(y.color,c.textMuted):c.textMuted,dash:[...y.dash??[3,3]],width:y.width??1}:null,radius:n.radius??(o===`heatmap`?2:o===`boxplot`?0:3),format:n.format,valueName:n.valueName}}),R=L.filter(e=>!e.hidden),z=O===`log`;if(z)for(let e of L)e.cols=ae(e.raw);let B=L.length>0&&L.every(e=>e.type===`scatter`||e.type===`heatmap`),V=R.filter(e=>e.type===`bar`||e.type===`boxplot`),H=R.filter(e=>e.type===`bar`),he=m(V,`x`,O===`category`);if(V.length){let e=new Map,t=e=>S[e.index].stack??`\u0000${e.key}`;for(let n of V)e.has(t(n))||e.set(t(n),e.size);let n=0;for(let e of V){let t=S[e.index].barWidth;t!==void 0&&t>n&&(n=Math.min(1,t))}let r=he*(n||(e.size>1?.78:.62)),i=r/e.size;for(let n of V){let a=e.get(t(n))??0;n.barOffset=-r/2+i*(a+.5),n.barHalfWidth=i/2*(e.size>1?.86:1)}let a=H.filter(e=>!e.floating),o=h(a.map(e=>({s:e,stack:t(e)})),!1),s=I?h(a.filter(e=>S[e.index].stack!==void 0).map(e=>({s:e,stack:t(e)})),!0):[],c=0;a.forEach((e,t)=>{let n=I&&S[e.index].stack!==void 0?s[c++]:o[t];e.barBase=n.base,e.barTop=n.top});for(let e of H){let{y:t,y0:n,count:r}=e.cols;if(!e.floating||!n)continue;let i=new Float64Array(r),a=new Float64Array(r);for(let e=0;e<r;e++){let r=Number.isFinite(t[e]);i[e]=r?Number.isFinite(n[e])?n[e]:0:NaN,a[e]=r?t[e]:NaN}e.barBase=i,e.barTop=a}}for(let e of R)e.type===`area`&&e.cols.y0&&S[e.index].stack===void 0&&(e.stackBase=e.cols.y0);let U=R.filter(e=>(e.type===`line`||e.type===`area`)&&S[e.index].stack!==void 0);if(U.length){let e=h(U.map(e=>({s:e,stack:S[e.index].stack??``})),I);U.forEach((t,n)=>{t.stackBase=e[n].base,t.stackTop=e[n].top})}let W=R.filter(e=>e.type===`candlestick`),ge=m(W,`x`,O===`category`);for(let e of W)e.barHalfWidth=ge*.3;let G=R.filter(e=>e.type===`heatmap`);if(G.length){let e=m(G,`x`,O===`category`)/2,t=m(G,`y`,P===`category`)/2;for(let n of G)n.cellHalf={x:e,y:t}}let K=o.xAxis,q;if(O===`category`)q=[-.5,Math.max(1,k.length)-.5];else{let e=[];for(let t of R){e.push(t.cols.xMin,t.cols.xMax);let n=t.type===`bar`||t.type===`boxplot`?he/2:t.type===`candlestick`?ge/2:t.type===`heatmap`?t.cellHalf.x:0;n&&e.push(t.cols.xMin-n,t.cols.xMax+n)}q=i.ensureSpan(...f(e),O===`time`?[Date.now()-864e5,Date.now()]:[0,1]);let t=L.every(e=>e.type===`scatter`);if(t){let e=(q[1]-q[0])*.04;q=[q[0]-e,q[1]+e]}(K?.nice??(t&&O===`linear`))&&O===`linear`&&(q=i.niceDomain(q[0],q[1],K?.tickCount??6)),z&&K?.nice!==!1&&(q=re(q))}let _e=e=>z?Math.log10(e):e;if(K?.min!==void 0&&(q[0]=_e(K.min)),K?.max!==void 0&&(q[1]=_e(K.max)),q=i.ensureSpan(q[0],q[1]),F)for(let e of L)e.yAxis!==`right`&&e.type!==`heatmap`&&ie(e,s);let ve=(e,t,n=!1)=>{let r=[];for(let t of e)t.type===`bar`&&t.barBase&&t.barTop?r.push(...f(t.barBase),...f(t.barTop)):t.stackBase&&t.stackTop?r.push(...f(t.stackBase),...f(t.stackTop)):t.type===`heatmap`?r.push(t.cols.yMin-t.cellHalf.y,t.cols.yMax+t.cellHalf.y):r.push(t.cols.yMin,t.cols.yMax);let i=e.filter(e=>e.type===`bar`);if(!n&&(i.some(e=>!e.floating)||t)&&r.push(0),i.some(e=>e.showLabels)){let[e,t]=f(r);t>0&&r.push(t+(t-Math.min(0,e))*.1),e<0&&r.push(e-(Math.max(0,t)-e)*.1)}return r},ye=R.filter(e=>e.yAxis===`left`),J=ye.length?ye:R,be=J.filter(e=>e.type===`bar`),Y;if(P===`category`)Y=[-.5,Math.max(1,N.length)-.5];else{let e=ve(J,j?.zero,F),t=be.length>0||J.some(e=>e.type===`area`);if(Y=i.ensureSpan(...f(e)),L.every(e=>e.type===`scatter`)){let e=(Y[1]-Y[0])*.06;Y=[Y[0]-e,Y[1]+e]}else if((W.length||J.some(e=>e.type===`boxplot`))&&!be.length){let e=(Y[1]-Y[0])*.04;Y=[Y[0]-e,Y[1]+e]}(j?.nice??!G.length)&&P===`linear`&&(Y=i.niceDomain(Y[0],Y[1],j?.tickCount??5)),F&&j?.nice!==!1&&(Y=ne(Y)),I&&(H.length||U.length)&&(Y=[f(e)[0]<0?-100:0,100]),t&&!j?.zero&&!F&&Y[0]<0&&f(e)[0]>=0&&(Y[0]=0)}let xe=e=>F?Math.log10(e):e;if(j?.min!==void 0&&(Y[0]=xe(j.min)),j?.max!==void 0&&(Y[1]=xe(j.max)),Y=i.ensureSpan(Y[0],Y[1]),F)for(let e of L)e.yAxis===`left`&&oe(e,Y[0]);let X=o.yAxis2,Se=null,Z=null,Q=L.filter(e=>e.yAxis===`right`);if(Q.length&&P!==`category`){let e=X?.type===`log`,t=Q.filter(e=>!e.hidden),n=e?t.flatMap(e=>{let t=x(e.raw,s);return[t.yMin,t.yMax]}):ve(t,X?.zero),[r,a]=i.ensureSpan(...f(n)),o=X?.nice===!1?[r,a]:e?ne([r,a]):y(r,a,Y,j?.tickCount??5),c=t=>e?Math.log10(t):t;X?.min!==void 0&&(o[0]=c(X.min)),X?.max!==void 0&&(o[1]=c(X.max)),o=i.ensureSpan(o[0],o[1]);let l=(Y[1]-Y[0])/(o[1]-o[0]),d={scale:l,offset:Y[0]-o[0]*l,log:e};Z=d;let p=e?Y[0]:C(d)(Math.min(Math.max(0,o[0]),o[1]));for(let e of Q)ie(e,d,p),oe(e,Y[0]);Se=u(X,e?`log`:`linear`,[],!1,w)}let Ce=P===`time`&&L.some(e=>e.type===`bar`)&&L.every(e=>e.type===`bar`?e.floating:e.type===`scatter`),$=o.interaction===!1?!1:o.interaction===!0||o.interaction===void 0?!0:o.interaction.zoom??!0,we=$===!1?{x:!1,y:!1}:$===!0?{x:!0,y:B}:{x:$.includes(`x`),y:$.includes(`y`)},Te=j?.format??(I&&(H.length||U.length)?e=>a.formatPercent(e,w):void 0);return{series:L,x:u(K,O,k,!1,w),y:{...u(j,P,N,P!==`category`,w),format:Te},y2:Se,y2Map:Z,horizontal:pe,locale:w,labels:E,formatValue:a.valueFormatter(w),base:{x:q,y:Y},allScatter:B,zoom:we,tooltipMode:T?.mode??(B?`nearest`:Ce?`item`:`axis`),baseline:F?Y[0]:Math.min(Math.max(0,Y[0]),Y[1]),minSpan:{x:O===`category`?1:(q[1]-q[0])*1e-7,y:P===`category`?1:(Y[1]-Y[0])*1e-7},percent:I,stacks:S.map(e=>e.stack!==void 0&&(e.type===`bar`||e.type===`line`||e.type===`area`||!e.type)?`${e.type===`bar`?`bar`:`line`}:${e.stack}`:null)}},j=(e,t)=>e.barTop?e.barTop[t]:e.stackTop?e.stackTop[t]:e.cols.y[t],M=new WeakMap,N=e=>{let t=M.get(e.cols);return t||(t=new o.GridIndex(e.cols.x,e.cols.y,e.cols.count),M.set(e.cols,t)),t};exports.alignedDomain=y,exports.buildModel=le,exports.detectXType=l,exports.fromPlotX=D,exports.fromPlotY=T,exports.gridOf=N,exports.heatPosition=se,exports.heatmapStops=ce,exports.plottedY=j,exports.toPlotX=E,exports.toPlotY=w,exports.viewFromValues=k,exports.viewToValues=O;
|
|
2
2
|
//# sourceMappingURL=model.cjs.map
|