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.
Files changed (120) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/dist/charts/engine/data.cjs +1 -1
  3. package/dist/charts/engine/data.cjs.map +1 -1
  4. package/dist/charts/engine/data.d.cts +2 -0
  5. package/dist/charts/engine/data.d.ts +2 -0
  6. package/dist/charts/engine/data.js +6 -4
  7. package/dist/charts/engine/data.js.map +1 -1
  8. package/dist/charts/engine/defaults.cjs +1 -1
  9. package/dist/charts/engine/defaults.cjs.map +1 -1
  10. package/dist/charts/engine/defaults.js +22 -18
  11. package/dist/charts/engine/defaults.js.map +1 -1
  12. package/dist/charts/engine/graph/chart.cjs +1 -1
  13. package/dist/charts/engine/graph/chart.cjs.map +1 -1
  14. package/dist/charts/engine/graph/chart.js +532 -493
  15. package/dist/charts/engine/graph/chart.js.map +1 -1
  16. package/dist/charts/engine/graph/geometry.cjs +1 -1
  17. package/dist/charts/engine/graph/geometry.cjs.map +1 -1
  18. package/dist/charts/engine/graph/geometry.d.cts +12 -2
  19. package/dist/charts/engine/graph/geometry.d.ts +12 -2
  20. package/dist/charts/engine/graph/geometry.js +35 -31
  21. package/dist/charts/engine/graph/geometry.js.map +1 -1
  22. package/dist/charts/engine/model.cjs +1 -1
  23. package/dist/charts/engine/model.cjs.map +1 -1
  24. package/dist/charts/engine/model.js +95 -74
  25. package/dist/charts/engine/model.js.map +1 -1
  26. package/dist/charts/engine/orderbook/field.cjs +1 -1
  27. package/dist/charts/engine/orderbook/field.cjs.map +1 -1
  28. package/dist/charts/engine/orderbook/field.d.cts +15 -2
  29. package/dist/charts/engine/orderbook/field.d.ts +15 -2
  30. package/dist/charts/engine/orderbook/field.js +21 -9
  31. package/dist/charts/engine/orderbook/field.js.map +1 -1
  32. package/dist/charts/engine/orderbook/heatmap.cjs +1 -1
  33. package/dist/charts/engine/orderbook/heatmap.cjs.map +1 -1
  34. package/dist/charts/engine/orderbook/heatmap.d.cts +29 -0
  35. package/dist/charts/engine/orderbook/heatmap.d.ts +29 -0
  36. package/dist/charts/engine/orderbook/heatmap.js +576 -453
  37. package/dist/charts/engine/orderbook/heatmap.js.map +1 -1
  38. package/dist/charts/engine/orderbook/types.d.cts +36 -11
  39. package/dist/charts/engine/orderbook/types.d.ts +36 -11
  40. package/dist/charts/engine/presets.cjs +1 -1
  41. package/dist/charts/engine/presets.cjs.map +1 -1
  42. package/dist/charts/engine/presets.d.cts +16 -3
  43. package/dist/charts/engine/presets.d.ts +16 -3
  44. package/dist/charts/engine/presets.js +42 -32
  45. package/dist/charts/engine/presets.js.map +1 -1
  46. package/dist/charts/engine/scene.cjs +1 -1
  47. package/dist/charts/engine/scene.cjs.map +1 -1
  48. package/dist/charts/engine/scene.d.cts +4 -2
  49. package/dist/charts/engine/scene.d.ts +4 -2
  50. package/dist/charts/engine/scene.js +185 -107
  51. package/dist/charts/engine/scene.js.map +1 -1
  52. package/dist/charts/engine/three-d/oit.cjs +119 -34
  53. package/dist/charts/engine/three-d/oit.cjs.map +1 -1
  54. package/dist/charts/engine/three-d/oit.d.cts +65 -10
  55. package/dist/charts/engine/three-d/oit.d.ts +65 -10
  56. package/dist/charts/engine/three-d/oit.js +119 -34
  57. package/dist/charts/engine/three-d/oit.js.map +1 -1
  58. package/dist/charts/engine/three-d/render-types.cjs.map +1 -1
  59. package/dist/charts/engine/three-d/render-types.d.cts +19 -0
  60. package/dist/charts/engine/three-d/render-types.d.ts +19 -0
  61. package/dist/charts/engine/three-d/render-types.js.map +1 -1
  62. package/dist/charts/engine/three-d/shaders.cjs +14 -6
  63. package/dist/charts/engine/three-d/shaders.cjs.map +1 -1
  64. package/dist/charts/engine/three-d/shaders.d.cts +6 -1
  65. package/dist/charts/engine/three-d/shaders.d.ts +6 -1
  66. package/dist/charts/engine/three-d/shaders.js +40 -26
  67. package/dist/charts/engine/three-d/shaders.js.map +1 -1
  68. package/dist/charts/engine/three-d/webgl.cjs +1 -1
  69. package/dist/charts/engine/three-d/webgl.cjs.map +1 -1
  70. package/dist/charts/engine/three-d/webgl.js +167 -125
  71. package/dist/charts/engine/three-d/webgl.js.map +1 -1
  72. package/dist/charts/engine/three-d/webgpu.cjs +1 -1
  73. package/dist/charts/engine/three-d/webgpu.cjs.map +1 -1
  74. package/dist/charts/engine/three-d/webgpu.js +169 -140
  75. package/dist/charts/engine/three-d/webgpu.js.map +1 -1
  76. package/dist/charts/engine/trading/chart.cjs +1 -1
  77. package/dist/charts/engine/trading/chart.cjs.map +1 -1
  78. package/dist/charts/engine/trading/chart.js +1149 -1023
  79. package/dist/charts/engine/trading/chart.js.map +1 -1
  80. package/dist/charts/engine/trading/labels.cjs +1 -1
  81. package/dist/charts/engine/trading/labels.cjs.map +1 -1
  82. package/dist/charts/engine/trading/labels.js +12 -0
  83. package/dist/charts/engine/trading/labels.js.map +1 -1
  84. package/dist/charts/engine/trading/layout.cjs +2 -0
  85. package/dist/charts/engine/trading/layout.cjs.map +1 -0
  86. package/dist/charts/engine/trading/layout.d.cts +37 -0
  87. package/dist/charts/engine/trading/layout.d.ts +37 -0
  88. package/dist/charts/engine/trading/layout.js +63 -0
  89. package/dist/charts/engine/trading/layout.js.map +1 -0
  90. package/dist/charts/engine/trading/types.d.cts +24 -7
  91. package/dist/charts/engine/trading/types.d.ts +24 -7
  92. package/dist/charts/engine/types.d.cts +21 -8
  93. package/dist/charts/engine/types.d.ts +21 -8
  94. package/dist/core/contracts.cjs +1 -1
  95. package/dist/core/contracts.cjs.map +1 -1
  96. package/dist/core/contracts.js +1 -1
  97. package/dist/core/contracts.js.map +1 -1
  98. package/dist/native/charts/src/engine/data.cjs +1 -1
  99. package/dist/native/charts/src/engine/data.cjs.map +1 -1
  100. package/dist/native/charts/src/engine/data.js +6 -4
  101. package/dist/native/charts/src/engine/data.js.map +1 -1
  102. package/dist/native/charts/src/engine/model.cjs +1 -1
  103. package/dist/native/charts/src/engine/model.cjs.map +1 -1
  104. package/dist/native/charts/src/engine/model.js +104 -83
  105. package/dist/native/charts/src/engine/model.js.map +1 -1
  106. package/dist/native/charts/src/engine/presets.cjs +1 -1
  107. package/dist/native/charts/src/engine/presets.cjs.map +1 -1
  108. package/dist/native/charts/src/engine/presets.js +42 -32
  109. package/dist/native/charts/src/engine/presets.js.map +1 -1
  110. package/dist/native/charts/src/engine/scene.cjs +1 -1
  111. package/dist/native/charts/src/engine/scene.cjs.map +1 -1
  112. package/dist/native/charts/src/engine/scene.js +185 -107
  113. package/dist/native/charts/src/engine/scene.js.map +1 -1
  114. package/dist/taro/index.js +1263 -1152
  115. package/dist/vue/components/Chart/OrderBookHeatmap.vue.d.ts +11 -0
  116. package/dist/vue/components/Chart/orderbook.d.ts +7 -0
  117. package/dist/vue/components/Chart/orderbook.js +2 -0
  118. package/dist/vue/components/Chart/orderbook.js.map +1 -1
  119. package/dist/weapp/charts/canvas.js +234 -58
  120. 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 r=[e[0],e[1]];for(let n=2;n<e.length;n+=2){let i=e[n-2],a=e[n-1],o=e[n],s=e[n+1];if(Math.abs(t?o-i:s-a)>.5){if(t){let e=(a+s)/2;r.push(i,e,o,e)}else{let e=(i+o)/2;r.push(e,a,e,s)}}r.push(o,s)}return a(r,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=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},l=(e,t,n)=>{let r=c(e);if(r<=t+n+1e-6){if(e.length<4)return e;let i=u(e,(t+n>0?t/(t+n):.5)*r);return[i[0],i[1],i[0],i[1]]}let i=[],a=u(e,t),o=u(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},u=(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]},d=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]},f=(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)},p=(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)},m=(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)},h=(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]},g=(e,t,n,r,i,a,o,s)=>{let[c,l,u,d,f,p,g,_]=h(n,r,i,a,o);m(e,c,l,u,d,f,p,s),m(e,c,l,f,p,g,_,s),t.push(u,d,c,l,g,_,f,p,u,d,s,s)},_=(e,t,n,r)=>{let i=[],a=c(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=u(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=u(e,o);i.push(l[0],l[1],r,r)}return i},v=(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=p,exports.boundaryDistance=f,exports.cubicPoints=e,exports.dashPath=_,exports.distanceToPath=v,exports.endDirection=d,exports.filledArrow=g,exports.loopPath=s,exports.orthogonalPath=i,exports.pathLength=c,exports.pointAt=u,exports.quadraticPath=t,exports.roundCorners=a,exports.splinePath=n,exports.triangleArea=m,exports.trimPath=l;
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 r = [e[0], e[1]];
38
- for (let n = 2; n < e.length; n += 2) {
39
- let i = e[n - 2], a = e[n - 1], o = e[n], s = e[n + 1];
40
- if (Math.abs(t ? o - i : s - a) > .5) {
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 = (a + s) / 2;
43
- r.push(i, e, o, e);
43
+ let e = (s + l) / 2 + d;
44
+ i.push(o, e, c, e);
44
45
  } else {
45
- let e = (i + o) / 2;
46
- r.push(e, a, e, s);
46
+ let e = (o + c) / 2 + d;
47
+ i.push(e, s, e, l);
47
48
  }
48
49
  }
49
- r.push(o, s);
50
+ i.push(c, l);
50
51
  }
51
- return a(r, n);
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 = (e) => {
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
- }, l = (e, t, n) => {
71
- let r = c(e);
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 = u(e, (t + n > 0 ? t / (t + n) : .5) * r);
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 = u(e, t), o = u(e, r - n);
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
- }, u = (e, t) => {
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
- }, d = (e) => {
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
- }, f = (e, t, n, r, i) => {
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
- }, p = (e, t, n, r, i, a, o) => {
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
- }, m = (e, t, n, r, i, a, o, s) => {
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
- }, h = (e, t, n, r, i) => {
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
- }, g = (e, t, n, r, i, a, o, s) => {
172
- let [c, l, u, d, f, p, g, _] = h(n, r, i, a, o);
173
- m(e, c, l, u, d, f, p, s), m(e, c, l, f, p, g, _, s), t.push(u, d, c, l, g, _, f, p, u, d, s, s);
174
- }, _ = (e, t, n, r) => {
175
- let i = [], a = c(e), o = t + n;
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 = u(e, n);
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 = u(e, o);
186
+ let l = d(e, o);
183
187
  i.push(l[0], l[1], r, r);
184
188
  }
185
189
  return i;
186
- }, v = (e, t, n) => {
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, p as arrowHead, f as boundaryDistance, e as cubicPoints, _ as dashPath, v as distanceToPath, d as endDirection, g as filledArrow, s as loopPath, i as orthogonalPath, c as pathLength, u as pointAt, t as quadraticPath, a as roundCorners, n as splinePath, m as triangleArea, l as trimPath };
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":"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"}
@@ -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