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
package/CHANGELOG.md CHANGED
@@ -1,5 +1,18 @@
1
1
  # minerva-design
2
2
 
3
+ ## 1.7.0
4
+
5
+ ### Minor Changes
6
+
7
+ - test(docs): give the feed crossing test room under ci coverage
8
+ feat(charts): order book heatmap legend, size unit, rank-blended heat and fast smoke check
9
+
10
+ ## 1.6.1
11
+
12
+ ### Patch Changes
13
+
14
+ - fix(charts): readable bookmap heat field, exact front transparency layer and gantt routing
15
+
3
16
  ## 1.6.0
4
17
 
5
18
  ### Minor Changes
@@ -1,2 +1,2 @@
1
- var e=e=>typeof e==`object`&&!!e&&!(`length`in e)&&`y`in e,t=(e,t)=>(n,r)=>{if(typeof n==`number`)return n;if(n instanceof Date)return n.getTime();if(typeof n==`string`){if(e===`category`)return t(n);if(e===`time`)return Date.parse(n);let i=Number(n);return Number.isNaN(i)?r:i}return r},n=e=>typeof e==`number`?e:e==null?NaN:e instanceof Date?e.getTime():Number(e),r=(e,t,n)=>{if(!e)return;let r=e[t];r<n.min&&(n.min=r),r>n.max&&(n.max=r)},i=t=>{let n=new Set;for(let r of t){if(e(r)){let e=r.y;if(!ArrayBuffer.isView(e))for(let t=0;t<e.length;t++){let r=e[t];typeof r==`string`&&n.add(r)}continue}let t=r;for(let e=0;e<t.length;e++){let r=t[e],i=Array.isArray(r)?r[1]:r&&typeof r==`object`?r.y:void 0;typeof i==`string`&&n.add(i)}}return[...n]},a=t=>{let n=new Set,r=e=>{typeof e==`string`&&n.add(e)};for(let n of t){if(e(n)){let e=n.x;if(e&&!ArrayBuffer.isView(e))for(let t=0;t<e.length;t++)r(e[t]);continue}let t=n;for(let e=0;e<t.length;e++){let n=t[e];Array.isArray(n)?r(n[0]):n&&typeof n==`object`&&r(n.x)}}return[...n]},o=(e,t,n,i)=>{let a=1/0,o=-1/0,s=!0,c=-1/0,{high:l,low:u,value:d,y0:f,q1:p,q3:m,outliers:h}=i,g=1/0,_=-1/0,v={min:1/0,max:-1/0},y=!!(l||u||f||p||m||h);for(let i=0;i<n;i++){let n=e[i];if(!Number.isFinite(n)){t[i]=NaN;continue}n<c&&(s=!1),c=n;let d=t[i];if(Number.isFinite(d)&&(n<a&&(a=n),n>o&&(o=n),d<g&&(g=d),d>_&&(_=d),y)){v.min=g,v.max=_,r(l,i,v),r(u,i,v),r(f,i,v),r(p,i,v),r(m,i,v);let e=h?.[i];if(e)for(let t of e)t<v.min&&(v.min=t),t>v.max&&(v.max=t);g=v.min,_=v.max}}let b=1/0,x=-1/0;if(d)for(let e=0;e<n;e++){let t=d[e];Number.isFinite(t)&&(t<b&&(b=t),t>x&&(x=t))}let S=a>o;return{x:e,y:t,count:n,sorted:s,xMin:S?NaN:a,xMax:S?NaN:o,yMin:S?NaN:g,yMax:S?NaN:_,valueMin:b>x?NaN:b,valueMax:b>x?NaN:x,...i}},s=(e,t)=>{if(!e)return null;if(e instanceof Float64Array&&e.length>=t)return e.length===t?e:e.subarray(0,t);let r=new Float64Array(t);for(let i=0;i<t;i++)r[i]=n(e[i]);return r},c=(t,r,i=n)=>{let a={size:null,colors:null,labels:null,open:null,high:null,low:null,value:null,y0:null,q1:null,q3:null,outliers:null,details:null};if(e(t)){let e=t.y.length,c=new Float64Array(e),l=t.x;if(!l)for(let t=0;t<e;t++)c[t]=t;else if(ArrayBuffer.isView(l)&&l.length>=e)c.set(l.length===e?l:l.subarray(0,e));else for(let t=0;t<e;t++)c[t]=r(l[t],t);let u=t.y,d;if(ArrayBuffer.isView(u))d=new Float64Array(e),d.set(u);else{d=new Float64Array(e);for(let t=0;t<e;t++)d[t]=i(u[t])}let f=null;if(t.size){f=new Float32Array(e);for(let r=0;r<e;r++)f[r]=n(t.size[r])}return o(c,d,e,{...a,size:f,open:s(t.open,e),high:s(t.high,e),low:s(t.low,e),value:s(t.value,e),y0:s(t.y0,e),q1:s(t.q1,e),q3:s(t.q3,e)})}let c=t,l=c.length,u=new Float64Array(l),d=new Float64Array(l),f=null,p=null,m=null,h=null,g=null,_=null,v=null,y=null,b=null,x=null,S=null,C=null,w=()=>new Float64Array(l).fill(NaN);for(let e=0;e<l;e++){let t=c[e];if(t==null||typeof t==`number`)u[e]=e,d[e]=n(t);else if(Array.isArray(t))u[e]=r(t[0],e),d[e]=i(t[1]);else if(typeof t==`object`){let a=t;u[e]=a.x===void 0?e:r(a.x,e),d[e]=i(a.y),a.size!==void 0&&(f??(f=new Float32Array(l).fill(NaN)),f[e]=a.size),a.color!==void 0&&(p??(p=Array(l)),p[e]=a.color),a.label!==void 0&&(m??(m=Array(l)),m[e]=a.label),a.open!==void 0&&((h??(h=w()))[e]=n(a.open)),a.high!==void 0&&((g??(g=w()))[e]=n(a.high)),a.low!==void 0&&((_??(_=w()))[e]=n(a.low)),a.value!==void 0&&((v??(v=w()))[e]=n(a.value)),a.y0!==void 0&&((y??(y=w()))[e]=n(a.y0)),a.q1!==void 0&&((b??(b=w()))[e]=n(a.q1)),a.q3!==void 0&&((x??(x=w()))[e]=n(a.q3)),a.outliers!==void 0&&a.outliers.length&&(S??(S=Array(l)),S[e]=a.outliers),a.details!==void 0&&a.details.length&&(C??(C=Array(l)),C[e]=a.details)}else u[e]=e,d[e]=NaN}return o(u,d,l,{size:f,colors:p,labels:m,open:h,high:g,low:_,value:v,y0:y,q1:b,q3:x,outliers:S,details:C})},l=(e,t,n)=>{let r=0,i=t;for(;r<i;){let t=r+i>>>1;e[t]<n?r=t+1:i=t}return r},u=(e,t,n,r)=>{if(n===0)return-1;let i=l(e,n,r),a=i-1,o=i;for(;a>=0&&!Number.isFinite(t[a]);)a--;for(;o<n&&!Number.isFinite(t[o]);)o++;return a<0?o<n?o:-1:o>=n||r-e[a]<=e[o]-r?a:o};exports.collectCategories=a,exports.collectYCategories=i,exports.lowerBound=l,exports.nearestIndex=u,exports.normalizeData=c,exports.xResolver=t;
1
+ var e=e=>typeof e==`object`&&!!e&&!(`length`in e)&&`y`in e,t=(e,t)=>(n,r)=>{if(typeof n==`number`)return n;if(n instanceof Date)return n.getTime();if(typeof n==`string`){if(e===`category`)return t(n);if(e===`time`)return Date.parse(n);let i=Number(n);return Number.isNaN(i)?r:i}return r},n=e=>typeof e==`number`?e:e==null?NaN:e instanceof Date?e.getTime():Number(e),r=(e,t,n)=>{if(!e)return;let r=e[t];r<n.min&&(n.min=r),r>n.max&&(n.max=r)},i=t=>{let n=new Set;for(let r of t){if(e(r)){let e=r.y;if(!ArrayBuffer.isView(e))for(let t=0;t<e.length;t++){let r=e[t];typeof r==`string`&&n.add(r)}continue}let t=r;for(let e=0;e<t.length;e++){let r=t[e],i=Array.isArray(r)?r[1]:r&&typeof r==`object`?r.y:void 0;typeof i==`string`&&n.add(i)}}return[...n]},a=t=>{let n=new Set,r=e=>{typeof e==`string`&&n.add(e)};for(let n of t){if(e(n)){let e=n.x;if(e&&!ArrayBuffer.isView(e))for(let t=0;t<e.length;t++)r(e[t]);continue}let t=n;for(let e=0;e<t.length;e++){let n=t[e];Array.isArray(n)?r(n[0]):n&&typeof n==`object`&&r(n.x)}}return[...n]},o=(e,t,n,i)=>{let a=1/0,o=-1/0,s=!0,c=-1/0,{high:l,low:u,value:d,y0:f,q1:p,q3:m,outliers:h}=i,g=1/0,_=-1/0,v={min:1/0,max:-1/0},y=!!(l||u||f||p||m||h);for(let i=0;i<n;i++){let n=e[i];if(!Number.isFinite(n)){t[i]=NaN;continue}n<c&&(s=!1),c=n;let d=t[i];if(Number.isFinite(d)&&(n<a&&(a=n),n>o&&(o=n),d<g&&(g=d),d>_&&(_=d),y)){v.min=g,v.max=_,r(l,i,v),r(u,i,v),r(f,i,v),r(p,i,v),r(m,i,v);let e=h?.[i];if(e)for(let t of e)t<v.min&&(v.min=t),t>v.max&&(v.max=t);g=v.min,_=v.max}}let b=1/0,x=-1/0;if(d)for(let e=0;e<n;e++){let t=d[e];Number.isFinite(t)&&(t<b&&(b=t),t>x&&(x=t))}let S=a>o;return{x:e,y:t,count:n,sorted:s,xMin:S?NaN:a,xMax:S?NaN:o,yMin:S?NaN:g,yMax:S?NaN:_,valueMin:b>x?NaN:b,valueMax:b>x?NaN:x,...i}},s=(e,t)=>{if(!e)return null;if(e instanceof Float64Array&&e.length>=t)return e.length===t?e:e.subarray(0,t);let r=new Float64Array(t);for(let i=0;i<t;i++)r[i]=n(e[i]);return r},c=(t,r,i=n)=>{let a={size:null,colors:null,labels:null,open:null,high:null,low:null,value:null,y0:null,q1:null,q3:null,outliers:null,details:null,ids:null};if(e(t)){let e=t.y.length,c=new Float64Array(e),l=t.x;if(!l)for(let t=0;t<e;t++)c[t]=t;else if(ArrayBuffer.isView(l)&&l.length>=e)c.set(l.length===e?l:l.subarray(0,e));else for(let t=0;t<e;t++)c[t]=r(l[t],t);let u=t.y,d;if(ArrayBuffer.isView(u))d=new Float64Array(e),d.set(u);else{d=new Float64Array(e);for(let t=0;t<e;t++)d[t]=i(u[t])}let f=null;if(t.size){f=new Float32Array(e);for(let r=0;r<e;r++)f[r]=n(t.size[r])}return o(c,d,e,{...a,size:f,open:s(t.open,e),high:s(t.high,e),low:s(t.low,e),value:s(t.value,e),y0:s(t.y0,e),q1:s(t.q1,e),q3:s(t.q3,e)})}let c=t,l=c.length,u=new Float64Array(l),d=new Float64Array(l),f=null,p=null,m=null,h=null,g=null,_=null,v=null,y=null,b=null,x=null,S=null,C=null,w=null,T=()=>new Float64Array(l).fill(NaN);for(let e=0;e<l;e++){let t=c[e];if(t==null||typeof t==`number`)u[e]=e,d[e]=n(t);else if(Array.isArray(t))u[e]=r(t[0],e),d[e]=i(t[1]);else if(typeof t==`object`){let a=t;u[e]=a.x===void 0?e:r(a.x,e),d[e]=i(a.y),a.size!==void 0&&(f??(f=new Float32Array(l).fill(NaN)),f[e]=a.size),a.color!==void 0&&(p??(p=Array(l)),p[e]=a.color),a.label!==void 0&&(m??(m=Array(l)),m[e]=a.label),a.open!==void 0&&((h??(h=T()))[e]=n(a.open)),a.high!==void 0&&((g??(g=T()))[e]=n(a.high)),a.low!==void 0&&((_??(_=T()))[e]=n(a.low)),a.value!==void 0&&((v??(v=T()))[e]=n(a.value)),a.y0!==void 0&&((y??(y=T()))[e]=n(a.y0)),a.q1!==void 0&&((b??(b=T()))[e]=n(a.q1)),a.q3!==void 0&&((x??(x=T()))[e]=n(a.q3)),a.outliers!==void 0&&a.outliers.length&&(S??(S=Array(l)),S[e]=a.outliers),a.details!==void 0&&a.details.length&&(C??(C=Array(l)),C[e]=a.details),a.id!==void 0&&(w??(w=Array(l)),w[e]=a.id)}else u[e]=e,d[e]=NaN}return o(u,d,l,{size:f,colors:p,labels:m,open:h,high:g,low:_,value:v,y0:y,q1:b,q3:x,outliers:S,details:C,ids:w})},l=(e,t,n)=>{let r=0,i=t;for(;r<i;){let t=r+i>>>1;e[t]<n?r=t+1:i=t}return r},u=(e,t,n,r)=>{if(n===0)return-1;let i=l(e,n,r),a=i-1,o=i;for(;a>=0&&!Number.isFinite(t[a]);)a--;for(;o<n&&!Number.isFinite(t[o]);)o++;return a<0?o<n?o:-1:o>=n||r-e[a]<=e[o]-r?a:o};exports.collectCategories=a,exports.collectYCategories=i,exports.lowerBound=l,exports.nearestIndex=u,exports.normalizeData=c,exports.xResolver=t;
2
2
  //# sourceMappingURL=data.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"data.cjs","names":["isColumns","data","xResolver","value","type","categoryIndex","n","index","toNumber","v","widen","column","i","range","collectYCategories","seen","datas","ys","list","item","collectCategories","add","xs","finalize","xMin","xMax","sorted","prev","extra","yMin","yMax","more","high","low","y0","q1","q3","outliers","count","xi","x","yi","y","out","valueMin","valueMax","empty","values","normalizeData","none","resolveX","resolveY","size","colors","labels","open","details","nanColumn","d","lowerBound","lo","hi","mid","nearestIndex","left","right"],"sources":["../../../../charts/src/engine/data.ts"],"sourcesContent":["// Normalization of series data into columns (Float64Array).\n\nimport type {\n ChartAxisType,\n ChartSeriesData,\n ChartTooltipDetail,\n ChartXValue,\n} from \"./types\";\n\nexport interface SeriesColumns {\n x: Float64Array;\n /** NaN where the value is missing */\n y: Float64Array;\n size: Float32Array | null;\n colors: (string | undefined)[] | null;\n labels: (string | undefined)[] | null;\n /** Candlesticks: open / high / low (y is the close) */\n open: Float64Array | null;\n high: Float64Array | null;\n low: Float64Array | null;\n /** Heatmaps: values of the cells */\n value: Float64Array | null;\n /** Floating bars / range areas: starts (lower edges); NaN where missing */\n y0: Float64Array | null;\n /** Box plots: quartiles and outliers */\n q1: Float64Array | null;\n q3: Float64Array | null;\n outliers: (readonly number[] | undefined)[] | null;\n /** Extra tooltip rows of the points (object data only) */\n details: (readonly ChartTooltipDetail[] | undefined)[] | null;\n count: number;\n /** x is non-decreasing (binary search, decimation) */\n sorted: boolean;\n /** Extent of the finite points (NaN when there is none); high / low included */\n xMin: number;\n xMax: number;\n yMin: number;\n yMax: number;\n /** Extent of the finite `value`s (NaN when there is none) */\n valueMin: number;\n valueMax: number;\n}\n\ntype XResolver = (value: ChartXValue, index: number) => number;\n/** Converts a y value (a category name on category y axes) to a number */\nexport type YResolver = (value: unknown) => number;\n\ntype Extra = Pick<\n SeriesColumns,\n | \"size\"\n | \"colors\"\n | \"labels\"\n | \"open\"\n | \"high\"\n | \"low\"\n | \"value\"\n | \"y0\"\n | \"q1\"\n | \"q3\"\n | \"outliers\"\n | \"details\"\n>;\n\nconst isColumns = (\n data: ChartSeriesData,\n): data is {\n x?: ArrayLike<number> | readonly ChartXValue[];\n y: ArrayLike<number> | readonly (number | string | null)[];\n y0?: ArrayLike<number> | readonly (number | null)[];\n size?: ArrayLike<number>;\n open?: ArrayLike<number>;\n high?: ArrayLike<number>;\n low?: ArrayLike<number>;\n q1?: ArrayLike<number>;\n q3?: ArrayLike<number>;\n value?: ArrayLike<number> | readonly (number | null)[];\n} =>\n typeof data === \"object\" &&\n data !== null &&\n !(\"length\" in data) &&\n \"y\" in data;\n\n/** Converts an x value to a number for the axis type */\nexport const xResolver = (\n type: ChartAxisType,\n categoryIndex: (name: string) => number,\n): XResolver => {\n return (value, index) => {\n if (typeof value === \"number\") return value;\n if (value instanceof Date) return value.getTime();\n if (typeof value === \"string\") {\n if (type === \"category\") return categoryIndex(value);\n if (type === \"time\") return Date.parse(value);\n const n = Number(value);\n return Number.isNaN(n) ? index : n;\n }\n return index;\n };\n};\n\nconst toNumber = (v: unknown): number =>\n typeof v === \"number\"\n ? v\n : v === null || v === undefined\n ? NaN\n : v instanceof Date\n ? v.getTime()\n : Number(v);\n\n/** Includes the finite values of a column at `i` in an extent */\nconst widen = (\n column: Float64Array | null,\n i: number,\n range: { min: number; max: number },\n) => {\n if (!column) return;\n const v = column[i];\n if (v < range.min) range.min = v;\n if (v > range.max) range.max = v;\n};\n\n/** Category names used by string y values (heatmap rows), in order of appearance */\nexport const collectYCategories = (\n datas: readonly ChartSeriesData[],\n): string[] => {\n const seen = new Set<string>();\n for (const data of datas) {\n if (isColumns(data)) {\n const ys = data.y;\n if (!ArrayBuffer.isView(ys)) {\n for (let i = 0; i < ys.length; i++) {\n const v = ys[i];\n if (typeof v === \"string\") seen.add(v);\n }\n }\n continue;\n }\n const list = data as ArrayLike<unknown>;\n for (let i = 0; i < list.length; i++) {\n const item = list[i];\n const v = Array.isArray(item)\n ? item[1]\n : item && typeof item === \"object\"\n ? (item as { y?: unknown }).y\n : undefined;\n if (typeof v === \"string\") seen.add(v);\n }\n }\n return [...seen];\n};\n\n/** Category names used by string x values, in order of appearance */\nexport const collectCategories = (\n datas: readonly ChartSeriesData[],\n): string[] => {\n const seen = new Set<string>();\n const add = (v: unknown) => {\n if (typeof v === \"string\") seen.add(v);\n };\n for (const data of datas) {\n if (isColumns(data)) {\n const xs = data.x;\n if (xs && !ArrayBuffer.isView(xs)) {\n for (let i = 0; i < xs.length; i++) add(xs[i]);\n }\n continue;\n }\n const list = data as ArrayLike<unknown>;\n for (let i = 0; i < list.length; i++) {\n const item = list[i];\n if (Array.isArray(item)) add(item[0]);\n else if (item && typeof item === \"object\")\n add((item as { x?: unknown }).x);\n }\n }\n return [...seen];\n};\n\nconst finalize = (\n x: Float64Array,\n y: Float64Array,\n count: number,\n extra: Extra,\n): SeriesColumns => {\n let xMin = Infinity;\n let xMax = -Infinity;\n let sorted = true;\n let prev = -Infinity;\n const { high, low, value, y0, q1, q3, outliers } = extra;\n let yMin = Infinity;\n let yMax = -Infinity;\n const range = { min: Infinity, max: -Infinity };\n const more = !!(high || low || y0 || q1 || q3 || outliers);\n for (let i = 0; i < count; i++) {\n const xi = x[i];\n if (!Number.isFinite(xi)) {\n y[i] = NaN;\n continue;\n }\n if (xi < prev) sorted = false;\n prev = xi;\n const yi = y[i];\n if (!Number.isFinite(yi)) continue;\n if (xi < xMin) xMin = xi;\n if (xi > xMax) xMax = xi;\n if (yi < yMin) yMin = yi;\n if (yi > yMax) yMax = yi;\n if (more) {\n // comparisons with NaN are false: missing values are skipped\n range.min = yMin;\n range.max = yMax;\n widen(high, i, range);\n widen(low, i, range);\n widen(y0, i, range);\n widen(q1, i, range);\n widen(q3, i, range);\n const out = outliers?.[i];\n if (out) {\n for (const v of out) {\n if (v < range.min) range.min = v;\n if (v > range.max) range.max = v;\n }\n }\n yMin = range.min;\n yMax = range.max;\n }\n }\n let valueMin = Infinity;\n let valueMax = -Infinity;\n if (value) {\n for (let i = 0; i < count; i++) {\n const v = value[i];\n if (!Number.isFinite(v)) continue;\n if (v < valueMin) valueMin = v;\n if (v > valueMax) valueMax = v;\n }\n }\n const empty = xMin > xMax;\n return {\n x,\n y,\n count,\n sorted,\n xMin: empty ? NaN : xMin,\n xMax: empty ? NaN : xMax,\n yMin: empty ? NaN : yMin,\n yMax: empty ? NaN : yMax,\n valueMin: valueMin > valueMax ? NaN : valueMin,\n valueMax: valueMin > valueMax ? NaN : valueMax,\n ...extra,\n };\n};\n\nconst column = (\n values: ArrayLike<unknown> | undefined,\n count: number,\n): Float64Array | null => {\n if (!values) return null;\n if (values instanceof Float64Array && values.length >= count) {\n return values.length === count ? values : values.subarray(0, count);\n }\n const out = new Float64Array(count);\n for (let i = 0; i < count; i++) out[i] = toNumber(values[i]);\n return out;\n};\n\n/** Turns any supported data form into columns */\nexport const normalizeData = (\n data: ChartSeriesData,\n resolveX: XResolver,\n resolveY: YResolver = toNumber,\n): SeriesColumns => {\n const none: Extra = {\n size: null,\n colors: null,\n labels: null,\n open: null,\n high: null,\n low: null,\n value: null,\n y0: null,\n q1: null,\n q3: null,\n outliers: null,\n details: null,\n };\n if (isColumns(data)) {\n const count = data.y.length;\n const x = new Float64Array(count);\n const xs = data.x;\n if (!xs) {\n for (let i = 0; i < count; i++) x[i] = i;\n } else if (ArrayBuffer.isView(xs) && xs.length >= count) {\n // typed arrays: a plain copy (the hot path of large data sets)\n x.set(\n (xs.length === count\n ? xs\n : (xs as unknown as Float64Array).subarray(\n 0,\n count,\n )) as ArrayLike<number>,\n );\n } else {\n for (let i = 0; i < count; i++) x[i] = resolveX(xs[i] as ChartXValue, i);\n }\n const ys = data.y;\n let y: Float64Array;\n if (ArrayBuffer.isView(ys)) {\n // finalize writes NaN at invalid x: copy so the input is never changed\n y = new Float64Array(count);\n y.set(ys as ArrayLike<number>);\n } else {\n y = new Float64Array(count);\n for (let i = 0; i < count; i++) y[i] = resolveY(ys[i]);\n }\n let size: Float32Array | null = null;\n if (data.size) {\n size = new Float32Array(count);\n for (let i = 0; i < count; i++) size[i] = toNumber(data.size[i]);\n }\n return finalize(x, y, count, {\n ...none,\n size,\n open: column(data.open, count),\n high: column(data.high, count),\n low: column(data.low, count),\n value: column(data.value, count),\n y0: column(data.y0, count),\n q1: column(data.q1, count),\n q3: column(data.q3, count),\n });\n }\n\n const list = data as ArrayLike<unknown>;\n const count = list.length;\n const x = new Float64Array(count);\n const y = new Float64Array(count);\n let size: Float32Array | null = null;\n let colors: (string | undefined)[] | null = null;\n let labels: (string | undefined)[] | null = null;\n let open: Float64Array | null = null;\n let high: Float64Array | null = null;\n let low: Float64Array | null = null;\n let value: Float64Array | null = null;\n let y0: Float64Array | null = null;\n let q1: Float64Array | null = null;\n let q3: Float64Array | null = null;\n let outliers: (readonly number[] | undefined)[] | null = null;\n let details: (readonly ChartTooltipDetail[] | undefined)[] | null = null;\n const nanColumn = () => new Float64Array(count).fill(NaN);\n\n for (let i = 0; i < count; i++) {\n const item = list[i];\n if (item === null || item === undefined || typeof item === \"number\") {\n x[i] = i;\n y[i] = toNumber(item);\n } else if (Array.isArray(item)) {\n x[i] = resolveX(item[0] as ChartXValue, i);\n y[i] = resolveY(item[1]);\n } else if (typeof item === \"object\") {\n const d = item as {\n x?: ChartXValue;\n y?: number | string | null;\n size?: number;\n color?: string;\n label?: string;\n open?: number;\n high?: number;\n low?: number;\n value?: number | null;\n y0?: number | Date | null;\n q1?: number;\n q3?: number;\n outliers?: readonly number[];\n details?: readonly ChartTooltipDetail[];\n };\n x[i] = d.x === undefined ? i : resolveX(d.x, i);\n y[i] = resolveY(d.y);\n if (d.size !== undefined) {\n size ??= new Float32Array(count).fill(NaN);\n size[i] = d.size;\n }\n if (d.color !== undefined) {\n colors ??= new Array<string | undefined>(count);\n colors[i] = d.color;\n }\n if (d.label !== undefined) {\n labels ??= new Array<string | undefined>(count);\n labels[i] = d.label;\n }\n if (d.open !== undefined) (open ??= nanColumn())[i] = toNumber(d.open);\n if (d.high !== undefined) (high ??= nanColumn())[i] = toNumber(d.high);\n if (d.low !== undefined) (low ??= nanColumn())[i] = toNumber(d.low);\n if (d.value !== undefined) (value ??= nanColumn())[i] = toNumber(d.value);\n if (d.y0 !== undefined) (y0 ??= nanColumn())[i] = toNumber(d.y0);\n if (d.q1 !== undefined) (q1 ??= nanColumn())[i] = toNumber(d.q1);\n if (d.q3 !== undefined) (q3 ??= nanColumn())[i] = toNumber(d.q3);\n if (d.outliers !== undefined && d.outliers.length) {\n outliers ??= new Array<readonly number[] | undefined>(count);\n outliers[i] = d.outliers;\n }\n if (d.details !== undefined && d.details.length) {\n details ??= new Array<readonly ChartTooltipDetail[] | undefined>(count);\n details[i] = d.details;\n }\n } else {\n x[i] = i;\n y[i] = NaN;\n }\n }\n return finalize(x, y, count, {\n size,\n colors,\n labels,\n open,\n high,\n low,\n value,\n y0,\n q1,\n q3,\n outliers,\n details,\n });\n};\n\n/** First index whose x is >= value (sorted x) */\nexport const lowerBound = (\n x: ArrayLike<number>,\n count: number,\n value: number,\n): number => {\n let lo = 0;\n let hi = count;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n if (x[mid] < value) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n};\n\n/** Index of the point with the closest x and a finite y (sorted x), -1 if none */\nexport const nearestIndex = (\n x: ArrayLike<number>,\n y: ArrayLike<number>,\n count: number,\n value: number,\n): number => {\n if (count === 0) return -1;\n const i = lowerBound(x, count, value);\n let left = i - 1;\n let right = i;\n while (left >= 0 && !Number.isFinite(y[left])) left--;\n while (right < count && !Number.isFinite(y[right])) right++;\n if (left < 0) return right < count ? right : -1;\n if (right >= count) return left;\n return value - x[left] <= x[right] - value ? left : right;\n};\n"],"mappings":"AA+DA,IAAMA,EACJ,GAaA,OAAOC,GAAS,YAChBA,GACA,EAAE,WAAYA,IACd,MAAOA,EAGIC,GACX,EACA,KAEQ,EAAO,IAAU,CACvB,GAAI,OAAOC,GAAU,SAAU,OAAOA,EACtC,GAAIA,aAAiB,KAAM,OAAOA,EAAM,QAAQ,EAChD,GAAI,OAAOA,GAAU,SAAU,CAC7B,GAAIC,IAAS,WAAY,OAAOC,EAAcF,CAAK,EACnD,GAAIC,IAAS,OAAQ,OAAO,KAAK,MAAMD,CAAK,EAC5C,IAAMG,EAAI,OAAOH,CAAK,EACtB,OAAO,OAAO,MAAMG,CAAC,EAAIC,EAAQD,CACnC,CACA,OAAOC,CACT,EAGIC,EAAY,GAChB,OAAOC,GAAM,SACTA,EACAA,GAAM,KACJ,IACAA,aAAa,KACXA,EAAE,QAAQ,EACV,OAAOA,CAAC,EAGZC,GACJ,EACA,EACA,IACG,CACH,GAAI,CAACC,EAAQ,OACb,IAAMF,EAAIE,EAAOC,GACbH,EAAII,EAAM,MAAK,EAAM,IAAMJ,GAC3BA,EAAII,EAAM,MAAK,EAAM,IAAMJ,EACjC,EAGaK,EACX,GACa,CACb,IAAMC,EAAO,IAAI,IACjB,IAAK,IAAMd,KAAQe,EAAO,CACxB,GAAIhB,EAAUC,CAAI,EAAG,CACnB,IAAMgB,EAAKhB,EAAK,EAChB,GAAI,CAAC,YAAY,OAAOgB,CAAE,EACxB,IAAK,IAAIL,EAAI,EAAGA,EAAIK,EAAG,OAAQ,IAAK,CAClC,IAAMR,EAAIQ,EAAGL,GACT,OAAOH,GAAM,UAAUM,EAAK,IAAIN,CAAC,CACvC,CAEF,QACF,CACA,IAAMS,EAAOjB,EACb,IAAK,IAAIW,EAAI,EAAGA,EAAIM,EAAK,OAAQ,IAAK,CACpC,IAAMC,EAAOD,EAAKN,GACZH,EAAI,MAAM,QAAQU,CAAI,EACxBA,EAAK,GACLA,GAAQ,OAAOA,GAAS,SACrBA,EAAyB,EAC1B,IAAA,GACF,OAAOV,GAAM,UAAUM,EAAK,IAAIN,CAAC,CACvC,CACF,CACA,MAAO,CAAC,GAAGM,CAAI,CACjB,EAGaK,EACX,GACa,CACb,IAAML,EAAO,IAAI,IACXM,EAAO,GAAe,CACtB,OAAOZ,GAAM,UAAUM,EAAK,IAAIN,CAAC,CACvC,EACA,IAAK,IAAMR,KAAQe,EAAO,CACxB,GAAIhB,EAAUC,CAAI,EAAG,CACnB,IAAMqB,EAAKrB,EAAK,EAChB,GAAIqB,GAAM,CAAC,YAAY,OAAOA,CAAE,EAC9B,IAAK,IAAIV,EAAI,EAAGA,EAAIU,EAAG,OAAQ,IAAKD,EAAIC,EAAGV,EAAE,EAE/C,QACF,CACA,IAAMM,EAAOjB,EACb,IAAK,IAAIW,EAAI,EAAGA,EAAIM,EAAK,OAAQ,IAAK,CACpC,IAAMC,EAAOD,EAAKN,GACd,MAAM,QAAQO,CAAI,EAAGE,EAAIF,EAAK,EAAE,EAC3BA,GAAQ,OAAOA,GAAS,UAC/BE,EAAKF,EAAyB,CAAC,CACnC,CACF,CACA,MAAO,CAAC,GAAGJ,CAAI,CACjB,EAEMQ,GACJ,EACA,EACA,EACA,IACkB,CAClB,IAAIC,EAAO,IACPC,EAAO,KACPC,EAAS,GACTC,EAAO,KACL,CAAE,OAAM,MAAK,QAAO,KAAI,KAAI,KAAI,YAAaC,EAC/CC,EAAO,IACPC,EAAO,KACLjB,EAAQ,CAAE,IAAK,IAAU,IAAK,IAAU,EACxCkB,EAAO,CAAC,EAAEC,GAAQC,GAAOC,GAAMC,GAAMC,GAAMC,GACjD,IAAK,IAAI,EAAI,EAAG,EAAIC,EAAO,IAAK,CAC9B,IAAMC,EAAKC,EAAE,GACb,GAAI,CAAC,OAAO,SAASD,CAAE,EAAG,CACxB,EAAE,GAAK,IACP,QACF,CACIA,EAAKZ,IAAM,EAAS,IACxB,EAAOY,EACP,IAAME,EAAKC,EAAE,GACb,GAAK,OAAO,SAASD,CAAE,IACnBF,EAAKf,IAAM,EAAOe,GAClBA,EAAKd,IAAM,EAAOc,GAClBE,EAAKZ,IAAM,EAAOY,GAClBA,EAAKX,IAAM,EAAOW,GAClBV,GAAM,CAER,EAAM,IAAMF,EACZ,EAAM,IAAMC,EACZpB,EAAMsB,EAAM,EAAGnB,CAAK,EACpBH,EAAMuB,EAAK,EAAGpB,CAAK,EACnBH,EAAMwB,EAAI,EAAGrB,CAAK,EAClBH,EAAMyB,EAAI,EAAGtB,CAAK,EAClBH,EAAM0B,EAAI,EAAGvB,CAAK,EAClB,IAAM8B,EAAMN,IAAW,GACvB,GAAIM,EACF,IAAK,IAAMlC,KAAKkC,EACVlC,EAAII,EAAM,MAAK,EAAM,IAAMJ,GAC3BA,EAAII,EAAM,MAAK,EAAM,IAAMJ,GAGnC,EAAOI,EAAM,IACb,EAAOA,EAAM,GACf,CACF,CACA,IAAI+B,EAAW,IACXC,EAAW,KACf,GAAI1C,EACF,IAAK,IAAIS,EAAI,EAAGA,EAAI0B,EAAO,IAAK,CAC9B,IAAM7B,EAAIN,EAAMS,GACX,OAAO,SAASH,CAAC,IAClBA,EAAImC,IAAU,EAAWnC,GACzBA,EAAIoC,IAAU,EAAWpC,GAC/B,CAEF,IAAMqC,EAAQtB,EAAOC,EACrB,MAAO,CACL,IACA,IACA,QACA,SACA,KAAMqB,EAAQ,IAAMtB,EACpB,KAAMsB,EAAQ,IAAMrB,EACpB,KAAMqB,EAAQ,IAAMjB,EACpB,KAAMiB,EAAQ,IAAMhB,EACpB,SAAUc,EAAWC,EAAW,IAAMD,EACtC,SAAUA,EAAWC,EAAW,IAAMA,EACtC,GAAGjB,CACL,CACF,EAEMjB,GACJ,EACA,IACwB,CACxB,GAAI,CAACoC,EAAQ,OAAO,KACpB,GAAIA,aAAkB,cAAgBA,EAAO,QAAUT,EACrD,OAAOS,EAAO,SAAWT,EAAQS,EAASA,EAAO,SAAS,EAAGT,CAAK,EAEpE,IAAMK,EAAM,IAAI,aAAaL,CAAK,EAClC,IAAK,IAAI,EAAI,EAAG,EAAIA,EAAO,IAAK,EAAI,GAAK9B,EAASuC,EAAO,EAAE,EAC3D,OAAOJ,CACT,EAGaK,GACX,EACA,EACA,EAAsBxC,IACJ,CAClB,IAAMyC,EAAc,CAClB,KAAM,KACN,OAAQ,KACR,OAAQ,KACR,KAAM,KACN,KAAM,KACN,IAAK,KACL,MAAO,KACP,GAAI,KACJ,GAAI,KACJ,GAAI,KACJ,SAAU,KACV,QAAS,IACX,EACA,GAAIjD,EAAUC,CAAI,EAAG,CACnB,IAAMqC,EAAQrC,EAAK,EAAE,OACfuC,EAAI,IAAI,aAAaF,CAAK,EAC1BhB,EAAKrB,EAAK,EAChB,GAAI,CAACqB,EACH,IAAK,IAAIV,EAAI,EAAGA,EAAI0B,EAAO,IAAK,EAAE1B,GAAKA,OAClC,GAAI,YAAY,OAAOU,CAAE,GAAKA,EAAG,QAAUgB,EAEhDE,EAAE,IACClB,EAAG,SAAWgB,EACXhB,EACCA,EAA+B,SAC9B,EACAgB,CACF,CACN,OAEA,IAAK,IAAI1B,EAAI,EAAGA,EAAI0B,EAAO,IAAK,EAAE1B,GAAKsC,EAAS5B,EAAGV,GAAmBA,CAAC,EAEzE,IAAMK,EAAKhB,EAAK,EACZyC,EACJ,GAAI,YAAY,OAAOzB,CAAE,EAEvB,EAAI,IAAI,aAAaqB,CAAK,EAC1BI,EAAE,IAAIzB,CAAuB,MACxB,CACL,EAAI,IAAI,aAAaqB,CAAK,EAC1B,IAAK,IAAI1B,EAAI,EAAGA,EAAI0B,EAAO,IAAK,EAAE1B,GAAKuC,EAASlC,EAAGL,EAAE,CACvD,CACA,IAAIwC,EAA4B,KAChC,GAAInD,EAAK,KAAM,CACb,EAAO,IAAI,aAAaqC,CAAK,EAC7B,IAAK,IAAI1B,EAAI,EAAGA,EAAI0B,EAAO,IAAK,EAAK1B,GAAKJ,EAASP,EAAK,KAAKW,EAAE,CACjE,CACA,OAAOW,EAASiB,EAAGE,EAAGJ,EAAO,CAC3B,GAAGW,EACH,OACA,KAAMtC,EAAOV,EAAK,KAAMqC,CAAK,EAC7B,KAAM3B,EAAOV,EAAK,KAAMqC,CAAK,EAC7B,IAAK3B,EAAOV,EAAK,IAAKqC,CAAK,EAC3B,MAAO3B,EAAOV,EAAK,MAAOqC,CAAK,EAC/B,GAAI3B,EAAOV,EAAK,GAAIqC,CAAK,EACzB,GAAI3B,EAAOV,EAAK,GAAIqC,CAAK,EACzB,GAAI3B,EAAOV,EAAK,GAAIqC,CAAK,CAC3B,CAAC,CACH,CAEA,IAAMpB,EAAOjB,EACPqC,EAAQpB,EAAK,OACbsB,EAAI,IAAI,aAAaF,CAAK,EAC1BI,EAAI,IAAI,aAAaJ,CAAK,EAC5Bc,EAA4B,KAC5BC,EAAwC,KACxCC,EAAwC,KACxCC,EAA4B,KAC5BvB,EAA4B,KAC5BC,EAA2B,KAC3B9B,EAA6B,KAC7B+B,EAA0B,KAC1BC,EAA0B,KAC1BC,EAA0B,KAC1BC,EAAqD,KACrDmB,EAAgE,KAC9DC,MAAkB,IAAI,aAAanB,CAAK,CAAC,CAAC,KAAK,GAAG,EAExD,IAAK,IAAI1B,EAAI,EAAGA,EAAI0B,EAAO,IAAK,CAC9B,IAAMnB,EAAOD,EAAKN,GAClB,GAAIO,GAAS,MAA8B,OAAOA,GAAS,SACzD,EAAEP,GAAKA,EACP,EAAEA,GAAKJ,EAASW,CAAI,OACf,GAAI,MAAM,QAAQA,CAAI,EAC3B,EAAEP,GAAKsC,EAAS/B,EAAK,GAAmBP,CAAC,EACzC,EAAEA,GAAKuC,EAAShC,EAAK,EAAE,OAClB,GAAI,OAAOA,GAAS,SAAU,CACnC,IAAMuC,EAAIvC,EAgBV,EAAEP,GAAK8C,EAAE,IAAM,IAAA,GAAY9C,EAAIsC,EAASQ,EAAE,EAAG9C,CAAC,EAC9C,EAAEA,GAAKuC,EAASO,EAAE,CAAC,EACfA,EAAE,OAAS,IAAA,KACbN,IAAA,EAAS,IAAI,aAAad,CAAK,CAAC,CAAC,KAAK,GAAG,GACzC,EAAK1B,GAAK8C,EAAE,MAEVA,EAAE,QAAU,IAAA,KACdL,IAAA,EAAe,MAA0Bf,CAAK,GAC9C,EAAO1B,GAAK8C,EAAE,OAEZA,EAAE,QAAU,IAAA,KACdJ,IAAA,EAAe,MAA0BhB,CAAK,GAC9C,EAAO1B,GAAK8C,EAAE,OAEZA,EAAE,OAAS,IAAA,KAAW,CAACH,IAAA,EAASE,EAAU,GAAA,CAAG7C,GAAKJ,EAASkD,EAAE,IAAI,GACjEA,EAAE,OAAS,IAAA,KAAW,CAAC1B,IAAA,EAASyB,EAAU,GAAA,CAAG7C,GAAKJ,EAASkD,EAAE,IAAI,GACjEA,EAAE,MAAQ,IAAA,KAAW,CAACzB,IAAA,EAAQwB,EAAU,GAAA,CAAG7C,GAAKJ,EAASkD,EAAE,GAAG,GAC9DA,EAAE,QAAU,IAAA,KAAW,CAACvD,IAAA,EAAUsD,EAAU,GAAA,CAAG7C,GAAKJ,EAASkD,EAAE,KAAK,GACpEA,EAAE,KAAO,IAAA,KAAW,CAACxB,IAAA,EAAOuB,EAAU,GAAA,CAAG7C,GAAKJ,EAASkD,EAAE,EAAE,GAC3DA,EAAE,KAAO,IAAA,KAAW,CAACvB,IAAA,EAAOsB,EAAU,GAAA,CAAG7C,GAAKJ,EAASkD,EAAE,EAAE,GAC3DA,EAAE,KAAO,IAAA,KAAW,CAACtB,IAAA,EAAOqB,EAAU,GAAA,CAAG7C,GAAKJ,EAASkD,EAAE,EAAE,GAC3DA,EAAE,WAAa,IAAA,IAAaA,EAAE,SAAS,SACzCrB,IAAA,EAAiB,MAAqCC,CAAK,GAC3D,EAAS1B,GAAK8C,EAAE,UAEdA,EAAE,UAAY,IAAA,IAAaA,EAAE,QAAQ,SACvCF,IAAA,EAAgB,MAAiDlB,CAAK,GACtE,EAAQ1B,GAAK8C,EAAE,QAEnB,KACE,GAAE9C,GAAKA,EACP,EAAEA,GAAK,GAEX,CACA,OAAOW,EAASiB,EAAGE,EAAGJ,EAAO,CAC3B,OACA,SACA,SACA,OACA,OACA,MACA,QACA,KACA,KACA,KACA,WACA,SACF,CAAC,CACH,EAGaqB,GACX,EACA,EACA,IACW,CACX,IAAIC,EAAK,EACLC,EAAKvB,EACT,KAAOsB,EAAKC,GAAI,CACd,IAAMC,EAAOF,EAAKC,IAAQ,EACtBrB,EAAEsB,GAAO3D,EAAO,EAAK2D,EAAM,EAC1B,EAAKA,CACZ,CACA,OAAOF,CACT,EAGaG,GACX,EACA,EACA,EACA,IACW,CACX,GAAIzB,IAAU,EAAG,MAAO,GACxB,IAAM,EAAIqB,EAAWnB,EAAGF,EAAOnC,CAAK,EAChC6D,EAAO,EAAI,EACXC,EAAQ,EACZ,KAAOD,GAAQ,GAAK,CAAC,OAAO,SAAStB,EAAEsB,EAAK,GAAG,IAC/C,KAAOC,EAAQ3B,GAAS,CAAC,OAAO,SAASI,EAAEuB,EAAM,GAAG,IAGpD,OAFID,EAAO,EAAUC,EAAQ3B,EAAQ2B,EAAQ,GACzCA,GAAS3B,GACNnC,EAAQqC,EAAEwB,IAASxB,EAAEyB,GAAS9D,EADV6D,EACyBC,CACtD"}
1
+ {"version":3,"file":"data.cjs","names":["isColumns","data","xResolver","value","type","categoryIndex","n","index","toNumber","v","widen","column","i","range","collectYCategories","seen","datas","ys","list","item","collectCategories","add","xs","finalize","xMin","xMax","sorted","prev","extra","yMin","yMax","more","high","low","y0","q1","q3","outliers","count","xi","x","yi","y","out","valueMin","valueMax","empty","values","normalizeData","none","resolveX","resolveY","size","colors","labels","open","details","ids","nanColumn","d","lowerBound","lo","hi","mid","nearestIndex","left","right"],"sources":["../../../../charts/src/engine/data.ts"],"sourcesContent":["// Normalization of series data into columns (Float64Array).\n\nimport type {\n ChartAxisType,\n ChartSeriesData,\n ChartTooltipDetail,\n ChartXValue,\n} from \"./types\";\n\nexport interface SeriesColumns {\n x: Float64Array;\n /** NaN where the value is missing */\n y: Float64Array;\n size: Float32Array | null;\n colors: (string | undefined)[] | null;\n labels: (string | undefined)[] | null;\n /** Candlesticks: open / high / low (y is the close) */\n open: Float64Array | null;\n high: Float64Array | null;\n low: Float64Array | null;\n /** Heatmaps: values of the cells */\n value: Float64Array | null;\n /** Floating bars / range areas: starts (lower edges); NaN where missing */\n y0: Float64Array | null;\n /** Box plots: quartiles and outliers */\n q1: Float64Array | null;\n q3: Float64Array | null;\n outliers: (readonly number[] | undefined)[] | null;\n /** Extra tooltip rows of the points (object data only) */\n details: (readonly ChartTooltipDetail[] | undefined)[] | null;\n /** Identifiers of the points (object data only; `dependencies`) */\n ids: (string | undefined)[] | null;\n count: number;\n /** x is non-decreasing (binary search, decimation) */\n sorted: boolean;\n /** Extent of the finite points (NaN when there is none); high / low included */\n xMin: number;\n xMax: number;\n yMin: number;\n yMax: number;\n /** Extent of the finite `value`s (NaN when there is none) */\n valueMin: number;\n valueMax: number;\n}\n\ntype XResolver = (value: ChartXValue, index: number) => number;\n/** Converts a y value (a category name on category y axes) to a number */\nexport type YResolver = (value: unknown) => number;\n\ntype Extra = Pick<\n SeriesColumns,\n | \"size\"\n | \"colors\"\n | \"labels\"\n | \"open\"\n | \"high\"\n | \"low\"\n | \"value\"\n | \"y0\"\n | \"q1\"\n | \"q3\"\n | \"outliers\"\n | \"details\"\n | \"ids\"\n>;\n\nconst isColumns = (\n data: ChartSeriesData,\n): data is {\n x?: ArrayLike<number> | readonly ChartXValue[];\n y: ArrayLike<number> | readonly (number | string | null)[];\n y0?: ArrayLike<number> | readonly (number | null)[];\n size?: ArrayLike<number>;\n open?: ArrayLike<number>;\n high?: ArrayLike<number>;\n low?: ArrayLike<number>;\n q1?: ArrayLike<number>;\n q3?: ArrayLike<number>;\n value?: ArrayLike<number> | readonly (number | null)[];\n} =>\n typeof data === \"object\" &&\n data !== null &&\n !(\"length\" in data) &&\n \"y\" in data;\n\n/** Converts an x value to a number for the axis type */\nexport const xResolver = (\n type: ChartAxisType,\n categoryIndex: (name: string) => number,\n): XResolver => {\n return (value, index) => {\n if (typeof value === \"number\") return value;\n if (value instanceof Date) return value.getTime();\n if (typeof value === \"string\") {\n if (type === \"category\") return categoryIndex(value);\n if (type === \"time\") return Date.parse(value);\n const n = Number(value);\n return Number.isNaN(n) ? index : n;\n }\n return index;\n };\n};\n\nconst toNumber = (v: unknown): number =>\n typeof v === \"number\"\n ? v\n : v === null || v === undefined\n ? NaN\n : v instanceof Date\n ? v.getTime()\n : Number(v);\n\n/** Includes the finite values of a column at `i` in an extent */\nconst widen = (\n column: Float64Array | null,\n i: number,\n range: { min: number; max: number },\n) => {\n if (!column) return;\n const v = column[i];\n if (v < range.min) range.min = v;\n if (v > range.max) range.max = v;\n};\n\n/** Category names used by string y values (heatmap rows), in order of appearance */\nexport const collectYCategories = (\n datas: readonly ChartSeriesData[],\n): string[] => {\n const seen = new Set<string>();\n for (const data of datas) {\n if (isColumns(data)) {\n const ys = data.y;\n if (!ArrayBuffer.isView(ys)) {\n for (let i = 0; i < ys.length; i++) {\n const v = ys[i];\n if (typeof v === \"string\") seen.add(v);\n }\n }\n continue;\n }\n const list = data as ArrayLike<unknown>;\n for (let i = 0; i < list.length; i++) {\n const item = list[i];\n const v = Array.isArray(item)\n ? item[1]\n : item && typeof item === \"object\"\n ? (item as { y?: unknown }).y\n : undefined;\n if (typeof v === \"string\") seen.add(v);\n }\n }\n return [...seen];\n};\n\n/** Category names used by string x values, in order of appearance */\nexport const collectCategories = (\n datas: readonly ChartSeriesData[],\n): string[] => {\n const seen = new Set<string>();\n const add = (v: unknown) => {\n if (typeof v === \"string\") seen.add(v);\n };\n for (const data of datas) {\n if (isColumns(data)) {\n const xs = data.x;\n if (xs && !ArrayBuffer.isView(xs)) {\n for (let i = 0; i < xs.length; i++) add(xs[i]);\n }\n continue;\n }\n const list = data as ArrayLike<unknown>;\n for (let i = 0; i < list.length; i++) {\n const item = list[i];\n if (Array.isArray(item)) add(item[0]);\n else if (item && typeof item === \"object\")\n add((item as { x?: unknown }).x);\n }\n }\n return [...seen];\n};\n\nconst finalize = (\n x: Float64Array,\n y: Float64Array,\n count: number,\n extra: Extra,\n): SeriesColumns => {\n let xMin = Infinity;\n let xMax = -Infinity;\n let sorted = true;\n let prev = -Infinity;\n const { high, low, value, y0, q1, q3, outliers } = extra;\n let yMin = Infinity;\n let yMax = -Infinity;\n const range = { min: Infinity, max: -Infinity };\n const more = !!(high || low || y0 || q1 || q3 || outliers);\n for (let i = 0; i < count; i++) {\n const xi = x[i];\n if (!Number.isFinite(xi)) {\n y[i] = NaN;\n continue;\n }\n if (xi < prev) sorted = false;\n prev = xi;\n const yi = y[i];\n if (!Number.isFinite(yi)) continue;\n if (xi < xMin) xMin = xi;\n if (xi > xMax) xMax = xi;\n if (yi < yMin) yMin = yi;\n if (yi > yMax) yMax = yi;\n if (more) {\n // comparisons with NaN are false: missing values are skipped\n range.min = yMin;\n range.max = yMax;\n widen(high, i, range);\n widen(low, i, range);\n widen(y0, i, range);\n widen(q1, i, range);\n widen(q3, i, range);\n const out = outliers?.[i];\n if (out) {\n for (const v of out) {\n if (v < range.min) range.min = v;\n if (v > range.max) range.max = v;\n }\n }\n yMin = range.min;\n yMax = range.max;\n }\n }\n let valueMin = Infinity;\n let valueMax = -Infinity;\n if (value) {\n for (let i = 0; i < count; i++) {\n const v = value[i];\n if (!Number.isFinite(v)) continue;\n if (v < valueMin) valueMin = v;\n if (v > valueMax) valueMax = v;\n }\n }\n const empty = xMin > xMax;\n return {\n x,\n y,\n count,\n sorted,\n xMin: empty ? NaN : xMin,\n xMax: empty ? NaN : xMax,\n yMin: empty ? NaN : yMin,\n yMax: empty ? NaN : yMax,\n valueMin: valueMin > valueMax ? NaN : valueMin,\n valueMax: valueMin > valueMax ? NaN : valueMax,\n ...extra,\n };\n};\n\nconst column = (\n values: ArrayLike<unknown> | undefined,\n count: number,\n): Float64Array | null => {\n if (!values) return null;\n if (values instanceof Float64Array && values.length >= count) {\n return values.length === count ? values : values.subarray(0, count);\n }\n const out = new Float64Array(count);\n for (let i = 0; i < count; i++) out[i] = toNumber(values[i]);\n return out;\n};\n\n/** Turns any supported data form into columns */\nexport const normalizeData = (\n data: ChartSeriesData,\n resolveX: XResolver,\n resolveY: YResolver = toNumber,\n): SeriesColumns => {\n const none: Extra = {\n size: null,\n colors: null,\n labels: null,\n open: null,\n high: null,\n low: null,\n value: null,\n y0: null,\n q1: null,\n q3: null,\n outliers: null,\n details: null,\n ids: null,\n };\n if (isColumns(data)) {\n const count = data.y.length;\n const x = new Float64Array(count);\n const xs = data.x;\n if (!xs) {\n for (let i = 0; i < count; i++) x[i] = i;\n } else if (ArrayBuffer.isView(xs) && xs.length >= count) {\n // typed arrays: a plain copy (the hot path of large data sets)\n x.set(\n (xs.length === count\n ? xs\n : (xs as unknown as Float64Array).subarray(\n 0,\n count,\n )) as ArrayLike<number>,\n );\n } else {\n for (let i = 0; i < count; i++) x[i] = resolveX(xs[i] as ChartXValue, i);\n }\n const ys = data.y;\n let y: Float64Array;\n if (ArrayBuffer.isView(ys)) {\n // finalize writes NaN at invalid x: copy so the input is never changed\n y = new Float64Array(count);\n y.set(ys as ArrayLike<number>);\n } else {\n y = new Float64Array(count);\n for (let i = 0; i < count; i++) y[i] = resolveY(ys[i]);\n }\n let size: Float32Array | null = null;\n if (data.size) {\n size = new Float32Array(count);\n for (let i = 0; i < count; i++) size[i] = toNumber(data.size[i]);\n }\n return finalize(x, y, count, {\n ...none,\n size,\n open: column(data.open, count),\n high: column(data.high, count),\n low: column(data.low, count),\n value: column(data.value, count),\n y0: column(data.y0, count),\n q1: column(data.q1, count),\n q3: column(data.q3, count),\n });\n }\n\n const list = data as ArrayLike<unknown>;\n const count = list.length;\n const x = new Float64Array(count);\n const y = new Float64Array(count);\n let size: Float32Array | null = null;\n let colors: (string | undefined)[] | null = null;\n let labels: (string | undefined)[] | null = null;\n let open: Float64Array | null = null;\n let high: Float64Array | null = null;\n let low: Float64Array | null = null;\n let value: Float64Array | null = null;\n let y0: Float64Array | null = null;\n let q1: Float64Array | null = null;\n let q3: Float64Array | null = null;\n let outliers: (readonly number[] | undefined)[] | null = null;\n let details: (readonly ChartTooltipDetail[] | undefined)[] | null = null;\n let ids: (string | undefined)[] | null = null;\n const nanColumn = () => new Float64Array(count).fill(NaN);\n\n for (let i = 0; i < count; i++) {\n const item = list[i];\n if (item === null || item === undefined || typeof item === \"number\") {\n x[i] = i;\n y[i] = toNumber(item);\n } else if (Array.isArray(item)) {\n x[i] = resolveX(item[0] as ChartXValue, i);\n y[i] = resolveY(item[1]);\n } else if (typeof item === \"object\") {\n const d = item as {\n x?: ChartXValue;\n y?: number | string | null;\n size?: number;\n color?: string;\n label?: string;\n open?: number;\n high?: number;\n low?: number;\n value?: number | null;\n y0?: number | Date | null;\n q1?: number;\n q3?: number;\n outliers?: readonly number[];\n details?: readonly ChartTooltipDetail[];\n id?: string;\n };\n x[i] = d.x === undefined ? i : resolveX(d.x, i);\n y[i] = resolveY(d.y);\n if (d.size !== undefined) {\n size ??= new Float32Array(count).fill(NaN);\n size[i] = d.size;\n }\n if (d.color !== undefined) {\n colors ??= new Array<string | undefined>(count);\n colors[i] = d.color;\n }\n if (d.label !== undefined) {\n labels ??= new Array<string | undefined>(count);\n labels[i] = d.label;\n }\n if (d.open !== undefined) (open ??= nanColumn())[i] = toNumber(d.open);\n if (d.high !== undefined) (high ??= nanColumn())[i] = toNumber(d.high);\n if (d.low !== undefined) (low ??= nanColumn())[i] = toNumber(d.low);\n if (d.value !== undefined) (value ??= nanColumn())[i] = toNumber(d.value);\n if (d.y0 !== undefined) (y0 ??= nanColumn())[i] = toNumber(d.y0);\n if (d.q1 !== undefined) (q1 ??= nanColumn())[i] = toNumber(d.q1);\n if (d.q3 !== undefined) (q3 ??= nanColumn())[i] = toNumber(d.q3);\n if (d.outliers !== undefined && d.outliers.length) {\n outliers ??= new Array<readonly number[] | undefined>(count);\n outliers[i] = d.outliers;\n }\n if (d.details !== undefined && d.details.length) {\n details ??= new Array<readonly ChartTooltipDetail[] | undefined>(count);\n details[i] = d.details;\n }\n if (d.id !== undefined) {\n ids ??= new Array<string | undefined>(count);\n ids[i] = d.id;\n }\n } else {\n x[i] = i;\n y[i] = NaN;\n }\n }\n return finalize(x, y, count, {\n size,\n colors,\n labels,\n open,\n high,\n low,\n value,\n y0,\n q1,\n q3,\n outliers,\n details,\n ids,\n });\n};\n\n/** First index whose x is >= value (sorted x) */\nexport const lowerBound = (\n x: ArrayLike<number>,\n count: number,\n value: number,\n): number => {\n let lo = 0;\n let hi = count;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n if (x[mid] < value) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n};\n\n/** Index of the point with the closest x and a finite y (sorted x), -1 if none */\nexport const nearestIndex = (\n x: ArrayLike<number>,\n y: ArrayLike<number>,\n count: number,\n value: number,\n): number => {\n if (count === 0) return -1;\n const i = lowerBound(x, count, value);\n let left = i - 1;\n let right = i;\n while (left >= 0 && !Number.isFinite(y[left])) left--;\n while (right < count && !Number.isFinite(y[right])) right++;\n if (left < 0) return right < count ? right : -1;\n if (right >= count) return left;\n return value - x[left] <= x[right] - value ? left : right;\n};\n"],"mappings":"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"}
@@ -20,6 +20,8 @@ export interface SeriesColumns {
20
20
  outliers: (readonly number[] | undefined)[] | null;
21
21
  /** Extra tooltip rows of the points (object data only) */
22
22
  details: (readonly ChartTooltipDetail[] | undefined)[] | null;
23
+ /** Identifiers of the points (object data only; `dependencies`) */
24
+ ids: (string | undefined)[] | null;
23
25
  count: number;
24
26
  /** x is non-decreasing (binary search, decimation) */
25
27
  sorted: boolean;
@@ -20,6 +20,8 @@ export interface SeriesColumns {
20
20
  outliers: (readonly number[] | undefined)[] | null;
21
21
  /** Extra tooltip rows of the points (object data only) */
22
22
  details: (readonly ChartTooltipDetail[] | undefined)[] | null;
23
+ /** Identifiers of the points (object data only; `dependencies`) */
24
+ ids: (string | undefined)[] | null;
23
25
  count: number;
24
26
  /** x is non-decreasing (binary search, decimation) */
25
27
  sorted: boolean;
@@ -106,7 +106,8 @@ var e = (e) => typeof e == "object" && !!e && !("length" in e) && "y" in e, t =
106
106
  q1: null,
107
107
  q3: null,
108
108
  outliers: null,
109
- details: null
109
+ details: null,
110
+ ids: null
110
111
  };
111
112
  if (e(t)) {
112
113
  let e = t.y.length, c = new Float64Array(e), l = t.x;
@@ -136,14 +137,14 @@ var e = (e) => typeof e == "object" && !!e && !("length" in e) && "y" in e, t =
136
137
  q3: s(t.q3, e)
137
138
  });
138
139
  }
139
- let c = t, l = c.length, u = new Float64Array(l), d = new Float64Array(l), f = null, p = null, m = null, h = null, g = null, _ = null, v = null, y = null, b = null, x = null, S = null, C = null, w = () => new Float64Array(l).fill(NaN);
140
+ let c = t, l = c.length, u = new Float64Array(l), d = new Float64Array(l), f = null, p = null, m = null, h = null, g = null, _ = null, v = null, y = null, b = null, x = null, S = null, C = null, w = null, T = () => new Float64Array(l).fill(NaN);
140
141
  for (let e = 0; e < l; e++) {
141
142
  let t = c[e];
142
143
  if (t == null || typeof t == "number") u[e] = e, d[e] = n(t);
143
144
  else if (Array.isArray(t)) u[e] = r(t[0], e), d[e] = i(t[1]);
144
145
  else if (typeof t == "object") {
145
146
  let a = t;
146
- u[e] = a.x === void 0 ? e : r(a.x, e), d[e] = i(a.y), a.size !== void 0 && (f ?? (f = new Float32Array(l).fill(NaN)), f[e] = a.size), a.color !== void 0 && (p ?? (p = Array(l)), p[e] = a.color), a.label !== void 0 && (m ?? (m = Array(l)), m[e] = a.label), a.open !== void 0 && ((h ?? (h = w()))[e] = n(a.open)), a.high !== void 0 && ((g ?? (g = w()))[e] = n(a.high)), a.low !== void 0 && ((_ ?? (_ = w()))[e] = n(a.low)), a.value !== void 0 && ((v ?? (v = w()))[e] = n(a.value)), a.y0 !== void 0 && ((y ?? (y = w()))[e] = n(a.y0)), a.q1 !== void 0 && ((b ?? (b = w()))[e] = n(a.q1)), a.q3 !== void 0 && ((x ?? (x = w()))[e] = n(a.q3)), a.outliers !== void 0 && a.outliers.length && (S ?? (S = Array(l)), S[e] = a.outliers), a.details !== void 0 && a.details.length && (C ?? (C = Array(l)), C[e] = a.details);
147
+ u[e] = a.x === void 0 ? e : r(a.x, e), d[e] = i(a.y), a.size !== void 0 && (f ?? (f = new Float32Array(l).fill(NaN)), f[e] = a.size), a.color !== void 0 && (p ?? (p = Array(l)), p[e] = a.color), a.label !== void 0 && (m ?? (m = Array(l)), m[e] = a.label), a.open !== void 0 && ((h ?? (h = T()))[e] = n(a.open)), a.high !== void 0 && ((g ?? (g = T()))[e] = n(a.high)), a.low !== void 0 && ((_ ?? (_ = T()))[e] = n(a.low)), a.value !== void 0 && ((v ?? (v = T()))[e] = n(a.value)), a.y0 !== void 0 && ((y ?? (y = T()))[e] = n(a.y0)), a.q1 !== void 0 && ((b ?? (b = T()))[e] = n(a.q1)), a.q3 !== void 0 && ((x ?? (x = T()))[e] = n(a.q3)), a.outliers !== void 0 && a.outliers.length && (S ?? (S = Array(l)), S[e] = a.outliers), a.details !== void 0 && a.details.length && (C ?? (C = Array(l)), C[e] = a.details), a.id !== void 0 && (w ?? (w = Array(l)), w[e] = a.id);
147
148
  } else u[e] = e, d[e] = NaN;
148
149
  }
149
150
  return o(u, d, l, {
@@ -158,7 +159,8 @@ var e = (e) => typeof e == "object" && !!e && !("length" in e) && "y" in e, t =
158
159
  q1: b,
159
160
  q3: x,
160
161
  outliers: S,
161
- details: C
162
+ details: C,
163
+ ids: w
162
164
  });
163
165
  }, l = (e, t, n) => {
164
166
  let r = 0, i = t;
@@ -1 +1 @@
1
- {"version":3,"file":"data.js","names":["isColumns","data","xResolver","value","type","categoryIndex","n","index","toNumber","v","widen","column","i","range","collectYCategories","seen","datas","ys","list","item","collectCategories","add","xs","finalize","xMin","xMax","sorted","prev","extra","yMin","yMax","more","high","low","y0","q1","q3","outliers","count","xi","x","yi","y","out","valueMin","valueMax","empty","values","normalizeData","none","resolveX","resolveY","size","colors","labels","open","details","nanColumn","d","lowerBound","lo","hi","mid","nearestIndex","left","right"],"sources":["../../../../charts/src/engine/data.ts"],"sourcesContent":["// Normalization of series data into columns (Float64Array).\n\nimport type {\n ChartAxisType,\n ChartSeriesData,\n ChartTooltipDetail,\n ChartXValue,\n} from \"./types\";\n\nexport interface SeriesColumns {\n x: Float64Array;\n /** NaN where the value is missing */\n y: Float64Array;\n size: Float32Array | null;\n colors: (string | undefined)[] | null;\n labels: (string | undefined)[] | null;\n /** Candlesticks: open / high / low (y is the close) */\n open: Float64Array | null;\n high: Float64Array | null;\n low: Float64Array | null;\n /** Heatmaps: values of the cells */\n value: Float64Array | null;\n /** Floating bars / range areas: starts (lower edges); NaN where missing */\n y0: Float64Array | null;\n /** Box plots: quartiles and outliers */\n q1: Float64Array | null;\n q3: Float64Array | null;\n outliers: (readonly number[] | undefined)[] | null;\n /** Extra tooltip rows of the points (object data only) */\n details: (readonly ChartTooltipDetail[] | undefined)[] | null;\n count: number;\n /** x is non-decreasing (binary search, decimation) */\n sorted: boolean;\n /** Extent of the finite points (NaN when there is none); high / low included */\n xMin: number;\n xMax: number;\n yMin: number;\n yMax: number;\n /** Extent of the finite `value`s (NaN when there is none) */\n valueMin: number;\n valueMax: number;\n}\n\ntype XResolver = (value: ChartXValue, index: number) => number;\n/** Converts a y value (a category name on category y axes) to a number */\nexport type YResolver = (value: unknown) => number;\n\ntype Extra = Pick<\n SeriesColumns,\n | \"size\"\n | \"colors\"\n | \"labels\"\n | \"open\"\n | \"high\"\n | \"low\"\n | \"value\"\n | \"y0\"\n | \"q1\"\n | \"q3\"\n | \"outliers\"\n | \"details\"\n>;\n\nconst isColumns = (\n data: ChartSeriesData,\n): data is {\n x?: ArrayLike<number> | readonly ChartXValue[];\n y: ArrayLike<number> | readonly (number | string | null)[];\n y0?: ArrayLike<number> | readonly (number | null)[];\n size?: ArrayLike<number>;\n open?: ArrayLike<number>;\n high?: ArrayLike<number>;\n low?: ArrayLike<number>;\n q1?: ArrayLike<number>;\n q3?: ArrayLike<number>;\n value?: ArrayLike<number> | readonly (number | null)[];\n} =>\n typeof data === \"object\" &&\n data !== null &&\n !(\"length\" in data) &&\n \"y\" in data;\n\n/** Converts an x value to a number for the axis type */\nexport const xResolver = (\n type: ChartAxisType,\n categoryIndex: (name: string) => number,\n): XResolver => {\n return (value, index) => {\n if (typeof value === \"number\") return value;\n if (value instanceof Date) return value.getTime();\n if (typeof value === \"string\") {\n if (type === \"category\") return categoryIndex(value);\n if (type === \"time\") return Date.parse(value);\n const n = Number(value);\n return Number.isNaN(n) ? index : n;\n }\n return index;\n };\n};\n\nconst toNumber = (v: unknown): number =>\n typeof v === \"number\"\n ? v\n : v === null || v === undefined\n ? NaN\n : v instanceof Date\n ? v.getTime()\n : Number(v);\n\n/** Includes the finite values of a column at `i` in an extent */\nconst widen = (\n column: Float64Array | null,\n i: number,\n range: { min: number; max: number },\n) => {\n if (!column) return;\n const v = column[i];\n if (v < range.min) range.min = v;\n if (v > range.max) range.max = v;\n};\n\n/** Category names used by string y values (heatmap rows), in order of appearance */\nexport const collectYCategories = (\n datas: readonly ChartSeriesData[],\n): string[] => {\n const seen = new Set<string>();\n for (const data of datas) {\n if (isColumns(data)) {\n const ys = data.y;\n if (!ArrayBuffer.isView(ys)) {\n for (let i = 0; i < ys.length; i++) {\n const v = ys[i];\n if (typeof v === \"string\") seen.add(v);\n }\n }\n continue;\n }\n const list = data as ArrayLike<unknown>;\n for (let i = 0; i < list.length; i++) {\n const item = list[i];\n const v = Array.isArray(item)\n ? item[1]\n : item && typeof item === \"object\"\n ? (item as { y?: unknown }).y\n : undefined;\n if (typeof v === \"string\") seen.add(v);\n }\n }\n return [...seen];\n};\n\n/** Category names used by string x values, in order of appearance */\nexport const collectCategories = (\n datas: readonly ChartSeriesData[],\n): string[] => {\n const seen = new Set<string>();\n const add = (v: unknown) => {\n if (typeof v === \"string\") seen.add(v);\n };\n for (const data of datas) {\n if (isColumns(data)) {\n const xs = data.x;\n if (xs && !ArrayBuffer.isView(xs)) {\n for (let i = 0; i < xs.length; i++) add(xs[i]);\n }\n continue;\n }\n const list = data as ArrayLike<unknown>;\n for (let i = 0; i < list.length; i++) {\n const item = list[i];\n if (Array.isArray(item)) add(item[0]);\n else if (item && typeof item === \"object\")\n add((item as { x?: unknown }).x);\n }\n }\n return [...seen];\n};\n\nconst finalize = (\n x: Float64Array,\n y: Float64Array,\n count: number,\n extra: Extra,\n): SeriesColumns => {\n let xMin = Infinity;\n let xMax = -Infinity;\n let sorted = true;\n let prev = -Infinity;\n const { high, low, value, y0, q1, q3, outliers } = extra;\n let yMin = Infinity;\n let yMax = -Infinity;\n const range = { min: Infinity, max: -Infinity };\n const more = !!(high || low || y0 || q1 || q3 || outliers);\n for (let i = 0; i < count; i++) {\n const xi = x[i];\n if (!Number.isFinite(xi)) {\n y[i] = NaN;\n continue;\n }\n if (xi < prev) sorted = false;\n prev = xi;\n const yi = y[i];\n if (!Number.isFinite(yi)) continue;\n if (xi < xMin) xMin = xi;\n if (xi > xMax) xMax = xi;\n if (yi < yMin) yMin = yi;\n if (yi > yMax) yMax = yi;\n if (more) {\n // comparisons with NaN are false: missing values are skipped\n range.min = yMin;\n range.max = yMax;\n widen(high, i, range);\n widen(low, i, range);\n widen(y0, i, range);\n widen(q1, i, range);\n widen(q3, i, range);\n const out = outliers?.[i];\n if (out) {\n for (const v of out) {\n if (v < range.min) range.min = v;\n if (v > range.max) range.max = v;\n }\n }\n yMin = range.min;\n yMax = range.max;\n }\n }\n let valueMin = Infinity;\n let valueMax = -Infinity;\n if (value) {\n for (let i = 0; i < count; i++) {\n const v = value[i];\n if (!Number.isFinite(v)) continue;\n if (v < valueMin) valueMin = v;\n if (v > valueMax) valueMax = v;\n }\n }\n const empty = xMin > xMax;\n return {\n x,\n y,\n count,\n sorted,\n xMin: empty ? NaN : xMin,\n xMax: empty ? NaN : xMax,\n yMin: empty ? NaN : yMin,\n yMax: empty ? NaN : yMax,\n valueMin: valueMin > valueMax ? NaN : valueMin,\n valueMax: valueMin > valueMax ? NaN : valueMax,\n ...extra,\n };\n};\n\nconst column = (\n values: ArrayLike<unknown> | undefined,\n count: number,\n): Float64Array | null => {\n if (!values) return null;\n if (values instanceof Float64Array && values.length >= count) {\n return values.length === count ? values : values.subarray(0, count);\n }\n const out = new Float64Array(count);\n for (let i = 0; i < count; i++) out[i] = toNumber(values[i]);\n return out;\n};\n\n/** Turns any supported data form into columns */\nexport const normalizeData = (\n data: ChartSeriesData,\n resolveX: XResolver,\n resolveY: YResolver = toNumber,\n): SeriesColumns => {\n const none: Extra = {\n size: null,\n colors: null,\n labels: null,\n open: null,\n high: null,\n low: null,\n value: null,\n y0: null,\n q1: null,\n q3: null,\n outliers: null,\n details: null,\n };\n if (isColumns(data)) {\n const count = data.y.length;\n const x = new Float64Array(count);\n const xs = data.x;\n if (!xs) {\n for (let i = 0; i < count; i++) x[i] = i;\n } else if (ArrayBuffer.isView(xs) && xs.length >= count) {\n // typed arrays: a plain copy (the hot path of large data sets)\n x.set(\n (xs.length === count\n ? xs\n : (xs as unknown as Float64Array).subarray(\n 0,\n count,\n )) as ArrayLike<number>,\n );\n } else {\n for (let i = 0; i < count; i++) x[i] = resolveX(xs[i] as ChartXValue, i);\n }\n const ys = data.y;\n let y: Float64Array;\n if (ArrayBuffer.isView(ys)) {\n // finalize writes NaN at invalid x: copy so the input is never changed\n y = new Float64Array(count);\n y.set(ys as ArrayLike<number>);\n } else {\n y = new Float64Array(count);\n for (let i = 0; i < count; i++) y[i] = resolveY(ys[i]);\n }\n let size: Float32Array | null = null;\n if (data.size) {\n size = new Float32Array(count);\n for (let i = 0; i < count; i++) size[i] = toNumber(data.size[i]);\n }\n return finalize(x, y, count, {\n ...none,\n size,\n open: column(data.open, count),\n high: column(data.high, count),\n low: column(data.low, count),\n value: column(data.value, count),\n y0: column(data.y0, count),\n q1: column(data.q1, count),\n q3: column(data.q3, count),\n });\n }\n\n const list = data as ArrayLike<unknown>;\n const count = list.length;\n const x = new Float64Array(count);\n const y = new Float64Array(count);\n let size: Float32Array | null = null;\n let colors: (string | undefined)[] | null = null;\n let labels: (string | undefined)[] | null = null;\n let open: Float64Array | null = null;\n let high: Float64Array | null = null;\n let low: Float64Array | null = null;\n let value: Float64Array | null = null;\n let y0: Float64Array | null = null;\n let q1: Float64Array | null = null;\n let q3: Float64Array | null = null;\n let outliers: (readonly number[] | undefined)[] | null = null;\n let details: (readonly ChartTooltipDetail[] | undefined)[] | null = null;\n const nanColumn = () => new Float64Array(count).fill(NaN);\n\n for (let i = 0; i < count; i++) {\n const item = list[i];\n if (item === null || item === undefined || typeof item === \"number\") {\n x[i] = i;\n y[i] = toNumber(item);\n } else if (Array.isArray(item)) {\n x[i] = resolveX(item[0] as ChartXValue, i);\n y[i] = resolveY(item[1]);\n } else if (typeof item === \"object\") {\n const d = item as {\n x?: ChartXValue;\n y?: number | string | null;\n size?: number;\n color?: string;\n label?: string;\n open?: number;\n high?: number;\n low?: number;\n value?: number | null;\n y0?: number | Date | null;\n q1?: number;\n q3?: number;\n outliers?: readonly number[];\n details?: readonly ChartTooltipDetail[];\n };\n x[i] = d.x === undefined ? i : resolveX(d.x, i);\n y[i] = resolveY(d.y);\n if (d.size !== undefined) {\n size ??= new Float32Array(count).fill(NaN);\n size[i] = d.size;\n }\n if (d.color !== undefined) {\n colors ??= new Array<string | undefined>(count);\n colors[i] = d.color;\n }\n if (d.label !== undefined) {\n labels ??= new Array<string | undefined>(count);\n labels[i] = d.label;\n }\n if (d.open !== undefined) (open ??= nanColumn())[i] = toNumber(d.open);\n if (d.high !== undefined) (high ??= nanColumn())[i] = toNumber(d.high);\n if (d.low !== undefined) (low ??= nanColumn())[i] = toNumber(d.low);\n if (d.value !== undefined) (value ??= nanColumn())[i] = toNumber(d.value);\n if (d.y0 !== undefined) (y0 ??= nanColumn())[i] = toNumber(d.y0);\n if (d.q1 !== undefined) (q1 ??= nanColumn())[i] = toNumber(d.q1);\n if (d.q3 !== undefined) (q3 ??= nanColumn())[i] = toNumber(d.q3);\n if (d.outliers !== undefined && d.outliers.length) {\n outliers ??= new Array<readonly number[] | undefined>(count);\n outliers[i] = d.outliers;\n }\n if (d.details !== undefined && d.details.length) {\n details ??= new Array<readonly ChartTooltipDetail[] | undefined>(count);\n details[i] = d.details;\n }\n } else {\n x[i] = i;\n y[i] = NaN;\n }\n }\n return finalize(x, y, count, {\n size,\n colors,\n labels,\n open,\n high,\n low,\n value,\n y0,\n q1,\n q3,\n outliers,\n details,\n });\n};\n\n/** First index whose x is >= value (sorted x) */\nexport const lowerBound = (\n x: ArrayLike<number>,\n count: number,\n value: number,\n): number => {\n let lo = 0;\n let hi = count;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n if (x[mid] < value) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n};\n\n/** Index of the point with the closest x and a finite y (sorted x), -1 if none */\nexport const nearestIndex = (\n x: ArrayLike<number>,\n y: ArrayLike<number>,\n count: number,\n value: number,\n): number => {\n if (count === 0) return -1;\n const i = lowerBound(x, count, value);\n let left = i - 1;\n let right = i;\n while (left >= 0 && !Number.isFinite(y[left])) left--;\n while (right < count && !Number.isFinite(y[right])) right++;\n if (left < 0) return right < count ? right : -1;\n if (right >= count) return left;\n return value - x[left] <= x[right] - value ? left : right;\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"data.js","names":["isColumns","data","xResolver","value","type","categoryIndex","n","index","toNumber","v","widen","column","i","range","collectYCategories","seen","datas","ys","list","item","collectCategories","add","xs","finalize","xMin","xMax","sorted","prev","extra","yMin","yMax","more","high","low","y0","q1","q3","outliers","count","xi","x","yi","y","out","valueMin","valueMax","empty","values","normalizeData","none","resolveX","resolveY","size","colors","labels","open","details","ids","nanColumn","d","lowerBound","lo","hi","mid","nearestIndex","left","right"],"sources":["../../../../charts/src/engine/data.ts"],"sourcesContent":["// Normalization of series data into columns (Float64Array).\n\nimport type {\n ChartAxisType,\n ChartSeriesData,\n ChartTooltipDetail,\n ChartXValue,\n} from \"./types\";\n\nexport interface SeriesColumns {\n x: Float64Array;\n /** NaN where the value is missing */\n y: Float64Array;\n size: Float32Array | null;\n colors: (string | undefined)[] | null;\n labels: (string | undefined)[] | null;\n /** Candlesticks: open / high / low (y is the close) */\n open: Float64Array | null;\n high: Float64Array | null;\n low: Float64Array | null;\n /** Heatmaps: values of the cells */\n value: Float64Array | null;\n /** Floating bars / range areas: starts (lower edges); NaN where missing */\n y0: Float64Array | null;\n /** Box plots: quartiles and outliers */\n q1: Float64Array | null;\n q3: Float64Array | null;\n outliers: (readonly number[] | undefined)[] | null;\n /** Extra tooltip rows of the points (object data only) */\n details: (readonly ChartTooltipDetail[] | undefined)[] | null;\n /** Identifiers of the points (object data only; `dependencies`) */\n ids: (string | undefined)[] | null;\n count: number;\n /** x is non-decreasing (binary search, decimation) */\n sorted: boolean;\n /** Extent of the finite points (NaN when there is none); high / low included */\n xMin: number;\n xMax: number;\n yMin: number;\n yMax: number;\n /** Extent of the finite `value`s (NaN when there is none) */\n valueMin: number;\n valueMax: number;\n}\n\ntype XResolver = (value: ChartXValue, index: number) => number;\n/** Converts a y value (a category name on category y axes) to a number */\nexport type YResolver = (value: unknown) => number;\n\ntype Extra = Pick<\n SeriesColumns,\n | \"size\"\n | \"colors\"\n | \"labels\"\n | \"open\"\n | \"high\"\n | \"low\"\n | \"value\"\n | \"y0\"\n | \"q1\"\n | \"q3\"\n | \"outliers\"\n | \"details\"\n | \"ids\"\n>;\n\nconst isColumns = (\n data: ChartSeriesData,\n): data is {\n x?: ArrayLike<number> | readonly ChartXValue[];\n y: ArrayLike<number> | readonly (number | string | null)[];\n y0?: ArrayLike<number> | readonly (number | null)[];\n size?: ArrayLike<number>;\n open?: ArrayLike<number>;\n high?: ArrayLike<number>;\n low?: ArrayLike<number>;\n q1?: ArrayLike<number>;\n q3?: ArrayLike<number>;\n value?: ArrayLike<number> | readonly (number | null)[];\n} =>\n typeof data === \"object\" &&\n data !== null &&\n !(\"length\" in data) &&\n \"y\" in data;\n\n/** Converts an x value to a number for the axis type */\nexport const xResolver = (\n type: ChartAxisType,\n categoryIndex: (name: string) => number,\n): XResolver => {\n return (value, index) => {\n if (typeof value === \"number\") return value;\n if (value instanceof Date) return value.getTime();\n if (typeof value === \"string\") {\n if (type === \"category\") return categoryIndex(value);\n if (type === \"time\") return Date.parse(value);\n const n = Number(value);\n return Number.isNaN(n) ? index : n;\n }\n return index;\n };\n};\n\nconst toNumber = (v: unknown): number =>\n typeof v === \"number\"\n ? v\n : v === null || v === undefined\n ? NaN\n : v instanceof Date\n ? v.getTime()\n : Number(v);\n\n/** Includes the finite values of a column at `i` in an extent */\nconst widen = (\n column: Float64Array | null,\n i: number,\n range: { min: number; max: number },\n) => {\n if (!column) return;\n const v = column[i];\n if (v < range.min) range.min = v;\n if (v > range.max) range.max = v;\n};\n\n/** Category names used by string y values (heatmap rows), in order of appearance */\nexport const collectYCategories = (\n datas: readonly ChartSeriesData[],\n): string[] => {\n const seen = new Set<string>();\n for (const data of datas) {\n if (isColumns(data)) {\n const ys = data.y;\n if (!ArrayBuffer.isView(ys)) {\n for (let i = 0; i < ys.length; i++) {\n const v = ys[i];\n if (typeof v === \"string\") seen.add(v);\n }\n }\n continue;\n }\n const list = data as ArrayLike<unknown>;\n for (let i = 0; i < list.length; i++) {\n const item = list[i];\n const v = Array.isArray(item)\n ? item[1]\n : item && typeof item === \"object\"\n ? (item as { y?: unknown }).y\n : undefined;\n if (typeof v === \"string\") seen.add(v);\n }\n }\n return [...seen];\n};\n\n/** Category names used by string x values, in order of appearance */\nexport const collectCategories = (\n datas: readonly ChartSeriesData[],\n): string[] => {\n const seen = new Set<string>();\n const add = (v: unknown) => {\n if (typeof v === \"string\") seen.add(v);\n };\n for (const data of datas) {\n if (isColumns(data)) {\n const xs = data.x;\n if (xs && !ArrayBuffer.isView(xs)) {\n for (let i = 0; i < xs.length; i++) add(xs[i]);\n }\n continue;\n }\n const list = data as ArrayLike<unknown>;\n for (let i = 0; i < list.length; i++) {\n const item = list[i];\n if (Array.isArray(item)) add(item[0]);\n else if (item && typeof item === \"object\")\n add((item as { x?: unknown }).x);\n }\n }\n return [...seen];\n};\n\nconst finalize = (\n x: Float64Array,\n y: Float64Array,\n count: number,\n extra: Extra,\n): SeriesColumns => {\n let xMin = Infinity;\n let xMax = -Infinity;\n let sorted = true;\n let prev = -Infinity;\n const { high, low, value, y0, q1, q3, outliers } = extra;\n let yMin = Infinity;\n let yMax = -Infinity;\n const range = { min: Infinity, max: -Infinity };\n const more = !!(high || low || y0 || q1 || q3 || outliers);\n for (let i = 0; i < count; i++) {\n const xi = x[i];\n if (!Number.isFinite(xi)) {\n y[i] = NaN;\n continue;\n }\n if (xi < prev) sorted = false;\n prev = xi;\n const yi = y[i];\n if (!Number.isFinite(yi)) continue;\n if (xi < xMin) xMin = xi;\n if (xi > xMax) xMax = xi;\n if (yi < yMin) yMin = yi;\n if (yi > yMax) yMax = yi;\n if (more) {\n // comparisons with NaN are false: missing values are skipped\n range.min = yMin;\n range.max = yMax;\n widen(high, i, range);\n widen(low, i, range);\n widen(y0, i, range);\n widen(q1, i, range);\n widen(q3, i, range);\n const out = outliers?.[i];\n if (out) {\n for (const v of out) {\n if (v < range.min) range.min = v;\n if (v > range.max) range.max = v;\n }\n }\n yMin = range.min;\n yMax = range.max;\n }\n }\n let valueMin = Infinity;\n let valueMax = -Infinity;\n if (value) {\n for (let i = 0; i < count; i++) {\n const v = value[i];\n if (!Number.isFinite(v)) continue;\n if (v < valueMin) valueMin = v;\n if (v > valueMax) valueMax = v;\n }\n }\n const empty = xMin > xMax;\n return {\n x,\n y,\n count,\n sorted,\n xMin: empty ? NaN : xMin,\n xMax: empty ? NaN : xMax,\n yMin: empty ? NaN : yMin,\n yMax: empty ? NaN : yMax,\n valueMin: valueMin > valueMax ? NaN : valueMin,\n valueMax: valueMin > valueMax ? NaN : valueMax,\n ...extra,\n };\n};\n\nconst column = (\n values: ArrayLike<unknown> | undefined,\n count: number,\n): Float64Array | null => {\n if (!values) return null;\n if (values instanceof Float64Array && values.length >= count) {\n return values.length === count ? values : values.subarray(0, count);\n }\n const out = new Float64Array(count);\n for (let i = 0; i < count; i++) out[i] = toNumber(values[i]);\n return out;\n};\n\n/** Turns any supported data form into columns */\nexport const normalizeData = (\n data: ChartSeriesData,\n resolveX: XResolver,\n resolveY: YResolver = toNumber,\n): SeriesColumns => {\n const none: Extra = {\n size: null,\n colors: null,\n labels: null,\n open: null,\n high: null,\n low: null,\n value: null,\n y0: null,\n q1: null,\n q3: null,\n outliers: null,\n details: null,\n ids: null,\n };\n if (isColumns(data)) {\n const count = data.y.length;\n const x = new Float64Array(count);\n const xs = data.x;\n if (!xs) {\n for (let i = 0; i < count; i++) x[i] = i;\n } else if (ArrayBuffer.isView(xs) && xs.length >= count) {\n // typed arrays: a plain copy (the hot path of large data sets)\n x.set(\n (xs.length === count\n ? xs\n : (xs as unknown as Float64Array).subarray(\n 0,\n count,\n )) as ArrayLike<number>,\n );\n } else {\n for (let i = 0; i < count; i++) x[i] = resolveX(xs[i] as ChartXValue, i);\n }\n const ys = data.y;\n let y: Float64Array;\n if (ArrayBuffer.isView(ys)) {\n // finalize writes NaN at invalid x: copy so the input is never changed\n y = new Float64Array(count);\n y.set(ys as ArrayLike<number>);\n } else {\n y = new Float64Array(count);\n for (let i = 0; i < count; i++) y[i] = resolveY(ys[i]);\n }\n let size: Float32Array | null = null;\n if (data.size) {\n size = new Float32Array(count);\n for (let i = 0; i < count; i++) size[i] = toNumber(data.size[i]);\n }\n return finalize(x, y, count, {\n ...none,\n size,\n open: column(data.open, count),\n high: column(data.high, count),\n low: column(data.low, count),\n value: column(data.value, count),\n y0: column(data.y0, count),\n q1: column(data.q1, count),\n q3: column(data.q3, count),\n });\n }\n\n const list = data as ArrayLike<unknown>;\n const count = list.length;\n const x = new Float64Array(count);\n const y = new Float64Array(count);\n let size: Float32Array | null = null;\n let colors: (string | undefined)[] | null = null;\n let labels: (string | undefined)[] | null = null;\n let open: Float64Array | null = null;\n let high: Float64Array | null = null;\n let low: Float64Array | null = null;\n let value: Float64Array | null = null;\n let y0: Float64Array | null = null;\n let q1: Float64Array | null = null;\n let q3: Float64Array | null = null;\n let outliers: (readonly number[] | undefined)[] | null = null;\n let details: (readonly ChartTooltipDetail[] | undefined)[] | null = null;\n let ids: (string | undefined)[] | null = null;\n const nanColumn = () => new Float64Array(count).fill(NaN);\n\n for (let i = 0; i < count; i++) {\n const item = list[i];\n if (item === null || item === undefined || typeof item === \"number\") {\n x[i] = i;\n y[i] = toNumber(item);\n } else if (Array.isArray(item)) {\n x[i] = resolveX(item[0] as ChartXValue, i);\n y[i] = resolveY(item[1]);\n } else if (typeof item === \"object\") {\n const d = item as {\n x?: ChartXValue;\n y?: number | string | null;\n size?: number;\n color?: string;\n label?: string;\n open?: number;\n high?: number;\n low?: number;\n value?: number | null;\n y0?: number | Date | null;\n q1?: number;\n q3?: number;\n outliers?: readonly number[];\n details?: readonly ChartTooltipDetail[];\n id?: string;\n };\n x[i] = d.x === undefined ? i : resolveX(d.x, i);\n y[i] = resolveY(d.y);\n if (d.size !== undefined) {\n size ??= new Float32Array(count).fill(NaN);\n size[i] = d.size;\n }\n if (d.color !== undefined) {\n colors ??= new Array<string | undefined>(count);\n colors[i] = d.color;\n }\n if (d.label !== undefined) {\n labels ??= new Array<string | undefined>(count);\n labels[i] = d.label;\n }\n if (d.open !== undefined) (open ??= nanColumn())[i] = toNumber(d.open);\n if (d.high !== undefined) (high ??= nanColumn())[i] = toNumber(d.high);\n if (d.low !== undefined) (low ??= nanColumn())[i] = toNumber(d.low);\n if (d.value !== undefined) (value ??= nanColumn())[i] = toNumber(d.value);\n if (d.y0 !== undefined) (y0 ??= nanColumn())[i] = toNumber(d.y0);\n if (d.q1 !== undefined) (q1 ??= nanColumn())[i] = toNumber(d.q1);\n if (d.q3 !== undefined) (q3 ??= nanColumn())[i] = toNumber(d.q3);\n if (d.outliers !== undefined && d.outliers.length) {\n outliers ??= new Array<readonly number[] | undefined>(count);\n outliers[i] = d.outliers;\n }\n if (d.details !== undefined && d.details.length) {\n details ??= new Array<readonly ChartTooltipDetail[] | undefined>(count);\n details[i] = d.details;\n }\n if (d.id !== undefined) {\n ids ??= new Array<string | undefined>(count);\n ids[i] = d.id;\n }\n } else {\n x[i] = i;\n y[i] = NaN;\n }\n }\n return finalize(x, y, count, {\n size,\n colors,\n labels,\n open,\n high,\n low,\n value,\n y0,\n q1,\n q3,\n outliers,\n details,\n ids,\n });\n};\n\n/** First index whose x is >= value (sorted x) */\nexport const lowerBound = (\n x: ArrayLike<number>,\n count: number,\n value: number,\n): number => {\n let lo = 0;\n let hi = count;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n if (x[mid] < value) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n};\n\n/** Index of the point with the closest x and a finite y (sorted x), -1 if none */\nexport const nearestIndex = (\n x: ArrayLike<number>,\n y: ArrayLike<number>,\n count: number,\n value: number,\n): number => {\n if (count === 0) return -1;\n const i = lowerBound(x, count, value);\n let left = i - 1;\n let right = i;\n while (left >= 0 && !Number.isFinite(y[left])) left--;\n while (right < count && !Number.isFinite(y[right])) right++;\n if (left < 0) return right < count ? right : -1;\n if (right >= count) return left;\n return value - x[left] <= x[right] - value ? left : right;\n};\n"],"mappings":";AAkEA,IAAMA,KACJ,MAaA,OAAOC,KAAS,cAChBA,KACA,EAAE,YAAYA,MACd,OAAOA,GAGIC,KACX,GACA,OAEQ,GAAO,MAAU;CACvB,IAAI,OAAOC,KAAU,UAAU,OAAOA;CACtC,IAAIA,aAAiB,MAAM,OAAOA,EAAM,QAAQ;CAChD,IAAI,OAAOA,KAAU,UAAU;EAC7B,IAAIC,MAAS,YAAY,OAAOC,EAAcF,CAAK;EACnD,IAAIC,MAAS,QAAQ,OAAO,KAAK,MAAMD,CAAK;EAC5C,IAAMG,IAAI,OAAOH,CAAK;EACtB,OAAO,OAAO,MAAMG,CAAC,IAAIC,IAAQD;CACnC;CACA,OAAOC;AACT,GAGIC,KAAY,MAChB,OAAOC,KAAM,WACTA,IACAA,KAAM,OACJ,MACAA,aAAa,OACXA,EAAE,QAAQ,IACV,OAAOA,CAAC,GAGZC,KACJ,GACA,GACA,MACG;CACH,IAAI,CAACC,GAAQ;CACb,IAAMF,IAAIE,EAAOC;CAEjB,AADIH,IAAII,EAAM,QAAK,EAAM,MAAMJ,IAC3BA,IAAII,EAAM,QAAK,EAAM,MAAMJ;AACjC,GAGaK,KACX,MACa;CACb,IAAMC,oBAAO,IAAI,IAAY;CAC7B,KAAK,IAAMd,KAAQe,GAAO;EACxB,IAAIhB,EAAUC,CAAI,GAAG;GACnB,IAAMgB,IAAKhB,EAAK;GAChB,IAAI,CAAC,YAAY,OAAOgB,CAAE,GACxB,KAAK,IAAIL,IAAI,GAAGA,IAAIK,EAAG,QAAQ,KAAK;IAClC,IAAMR,IAAIQ,EAAGL;IACb,AAAI,OAAOH,KAAM,YAAUM,EAAK,IAAIN,CAAC;GACvC;GAEF;EACF;EACA,IAAMS,IAAOjB;EACb,KAAK,IAAIW,IAAI,GAAGA,IAAIM,EAAK,QAAQ,KAAK;GACpC,IAAMC,IAAOD,EAAKN,IACZH,IAAI,MAAM,QAAQU,CAAI,IACxBA,EAAK,KACLA,KAAQ,OAAOA,KAAS,WACrBA,EAAyB,IAC1B,KAAA;GACN,AAAI,OAAOV,KAAM,YAAUM,EAAK,IAAIN,CAAC;EACvC;CACF;CACA,OAAO,CAAC,GAAGM,CAAI;AACjB,GAGaK,KACX,MACa;CACb,IAAML,oBAAO,IAAI,IAAY,GACvBM,KAAO,MAAe;EAC1B,AAAI,OAAOZ,KAAM,YAAUM,EAAK,IAAIN,CAAC;CACvC;CACA,KAAK,IAAMR,KAAQe,GAAO;EACxB,IAAIhB,EAAUC,CAAI,GAAG;GACnB,IAAMqB,IAAKrB,EAAK;GAChB,IAAIqB,KAAM,CAAC,YAAY,OAAOA,CAAE,GAC9B,KAAK,IAAIV,IAAI,GAAGA,IAAIU,EAAG,QAAQ,KAAK,EAAIA,EAAGV,EAAE;GAE/C;EACF;EACA,IAAMM,IAAOjB;EACb,KAAK,IAAIW,IAAI,GAAGA,IAAIM,EAAK,QAAQ,KAAK;GACpC,IAAMC,IAAOD,EAAKN;GAClB,AAAI,MAAM,QAAQO,CAAI,IAAGE,EAAIF,EAAK,EAAE,IAC3BA,KAAQ,OAAOA,KAAS,YAC/BE,EAAKF,EAAyB,CAAC;EACnC;CACF;CACA,OAAO,CAAC,GAAGJ,CAAI;AACjB,GAEMQ,KACJ,GACA,GACA,GACA,MACkB;CAClB,IAAIC,IAAO,UACPC,IAAO,WACPC,IAAS,IACTC,IAAO,WACL,EAAE,SAAM,QAAK,UAAO,OAAI,OAAI,OAAI,gBAAaC,GAC/CC,IAAO,UACPC,IAAO,WACLjB,IAAQ;EAAE,KAAK;EAAU,KAAK;CAAU,GACxCkB,IAAO,CAAC,EAAEC,KAAQC,KAAOC,KAAMC,KAAMC,KAAMC;CACjD,KAAK,IAAI,IAAI,GAAG,IAAIC,GAAO,KAAK;EAC9B,IAAMC,IAAKC,EAAE;EACb,IAAI,CAAC,OAAO,SAASD,CAAE,GAAG;GACxB,EAAE,KAAK;GACP;EACF;EAEA,AADIA,IAAKZ,MAAM,IAAS,KACxB,IAAOY;EACP,IAAME,IAAKC,EAAE;EACb,IAAK,OAAO,SAASD,CAAE,MACnBF,IAAKf,MAAM,IAAOe,IAClBA,IAAKd,MAAM,IAAOc,IAClBE,IAAKZ,MAAM,IAAOY,IAClBA,IAAKX,MAAM,IAAOW,IAClBV,IAAM;GAQR,AANA,EAAM,MAAMF,GACZ,EAAM,MAAMC,GACZpB,EAAMsB,GAAM,GAAGnB,CAAK,GACpBH,EAAMuB,GAAK,GAAGpB,CAAK,GACnBH,EAAMwB,GAAI,GAAGrB,CAAK,GAClBH,EAAMyB,GAAI,GAAGtB,CAAK,GAClBH,EAAM0B,GAAI,GAAGvB,CAAK;GAClB,IAAM8B,IAAMN,IAAW;GACvB,IAAIM,GACF,KAAK,IAAMlC,KAAKkC,GAEd,AADIlC,IAAII,EAAM,QAAK,EAAM,MAAMJ,IAC3BA,IAAII,EAAM,QAAK,EAAM,MAAMJ;GAInC,AADA,IAAOI,EAAM,KACb,IAAOA,EAAM;EACf;CACF;CACA,IAAI+B,IAAW,UACXC,IAAW;CACf,IAAI1C,GACF,KAAK,IAAIS,IAAI,GAAGA,IAAI0B,GAAO,KAAK;EAC9B,IAAM7B,IAAIN,EAAMS;EAChB,AAAK,OAAO,SAASH,CAAC,MAClBA,IAAImC,MAAU,IAAWnC,IACzBA,IAAIoC,MAAU,IAAWpC;CAC/B;CAEF,IAAMqC,IAAQtB,IAAOC;CACrB,OAAO;EACL;EACA;EACA;EACA;EACA,MAAMqB,IAAQ,MAAMtB;EACpB,MAAMsB,IAAQ,MAAMrB;EACpB,MAAMqB,IAAQ,MAAMjB;EACpB,MAAMiB,IAAQ,MAAMhB;EACpB,UAAUc,IAAWC,IAAW,MAAMD;EACtC,UAAUA,IAAWC,IAAW,MAAMA;EACtC,GAAGjB;CACL;AACF,GAEMjB,KACJ,GACA,MACwB;CACxB,IAAI,CAACoC,GAAQ,OAAO;CACpB,IAAIA,aAAkB,gBAAgBA,EAAO,UAAUT,GACrD,OAAOS,EAAO,WAAWT,IAAQS,IAASA,EAAO,SAAS,GAAGT,CAAK;CAEpE,IAAMK,IAAM,IAAI,aAAaL,CAAK;CAClC,KAAK,IAAI,IAAI,GAAG,IAAIA,GAAO,KAAK,EAAI,KAAK9B,EAASuC,EAAO,EAAE;CAC3D,OAAOJ;AACT,GAGaK,KACX,GACA,GACA,IAAsBxC,MACJ;CAClB,IAAMyC,IAAc;EAClB,MAAM;EACN,QAAQ;EACR,QAAQ;EACR,MAAM;EACN,MAAM;EACN,KAAK;EACL,OAAO;EACP,IAAI;EACJ,IAAI;EACJ,IAAI;EACJ,UAAU;EACV,SAAS;EACT,KAAK;CACP;CACA,IAAIjD,EAAUC,CAAI,GAAG;EACnB,IAAMqC,IAAQrC,EAAK,EAAE,QACfuC,IAAI,IAAI,aAAaF,CAAK,GAC1BhB,IAAKrB,EAAK;EAChB,IAAI,CAACqB,GACH,KAAK,IAAIV,IAAI,GAAGA,IAAI0B,GAAO,KAAK,EAAE1B,KAAKA;OAClC,IAAI,YAAY,OAAOU,CAAE,KAAKA,EAAG,UAAUgB,GAEhD,EAAE,IACChB,EAAG,WAAWgB,IACXhB,IACCA,EAA+B,SAC9B,GACAgB,CACF,CACN;OAEA,KAAK,IAAI1B,IAAI,GAAGA,IAAI0B,GAAO,KAAK,EAAE1B,KAAKsC,EAAS5B,EAAGV,IAAmBA,CAAC;EAEzE,IAAMK,IAAKhB,EAAK,GACZyC;EACJ,IAAI,YAAY,OAAOzB,CAAE,GAGvB,AADA,IAAI,IAAI,aAAaqB,CAAK,GAC1BI,EAAE,IAAIzB,CAAuB;OACxB;GACL,IAAI,IAAI,aAAaqB,CAAK;GAC1B,KAAK,IAAI1B,IAAI,GAAGA,IAAI0B,GAAO,KAAK,EAAE1B,KAAKuC,EAASlC,EAAGL,EAAE;EACvD;EACA,IAAIwC,IAA4B;EAChC,IAAInD,EAAK,MAAM;GACb,IAAO,IAAI,aAAaqC,CAAK;GAC7B,KAAK,IAAI1B,IAAI,GAAGA,IAAI0B,GAAO,KAAK,EAAK1B,KAAKJ,EAASP,EAAK,KAAKW,EAAE;EACjE;EACA,OAAOW,EAASiB,GAAGE,GAAGJ,GAAO;GAC3B,GAAGW;GACH;GACA,MAAMtC,EAAOV,EAAK,MAAMqC,CAAK;GAC7B,MAAM3B,EAAOV,EAAK,MAAMqC,CAAK;GAC7B,KAAK3B,EAAOV,EAAK,KAAKqC,CAAK;GAC3B,OAAO3B,EAAOV,EAAK,OAAOqC,CAAK;GAC/B,IAAI3B,EAAOV,EAAK,IAAIqC,CAAK;GACzB,IAAI3B,EAAOV,EAAK,IAAIqC,CAAK;GACzB,IAAI3B,EAAOV,EAAK,IAAIqC,CAAK;EAC3B,CAAC;CACH;CAEA,IAAMpB,IAAOjB,GACPqC,IAAQpB,EAAK,QACbsB,IAAI,IAAI,aAAaF,CAAK,GAC1BI,IAAI,IAAI,aAAaJ,CAAK,GAC5Bc,IAA4B,MAC5BC,IAAwC,MACxCC,IAAwC,MACxCC,IAA4B,MAC5BvB,IAA4B,MAC5BC,IAA2B,MAC3B9B,IAA6B,MAC7B+B,IAA0B,MAC1BC,IAA0B,MAC1BC,IAA0B,MAC1BC,IAAqD,MACrDmB,IAAgE,MAChEC,IAAqC,MACnCC,UAAkB,IAAI,aAAapB,CAAK,CAAC,CAAC,KAAK,GAAG;CAExD,KAAK,IAAI1B,IAAI,GAAGA,IAAI0B,GAAO,KAAK;EAC9B,IAAMnB,IAAOD,EAAKN;EAClB,IAAIO,KAAS,QAA8B,OAAOA,KAAS,UAEzD,AADA,EAAEP,KAAKA,GACP,EAAEA,KAAKJ,EAASW,CAAI;OACf,IAAI,MAAM,QAAQA,CAAI,GAE3B,AADA,EAAEP,KAAKsC,EAAS/B,EAAK,IAAmBP,CAAC,GACzC,EAAEA,KAAKuC,EAAShC,EAAK,EAAE;OAClB,IAAI,OAAOA,KAAS,UAAU;GACnC,IAAMwC,IAAIxC;GA8CV,AA7BA,EAAEP,KAAK+C,EAAE,MAAM,KAAA,IAAY/C,IAAIsC,EAASS,EAAE,GAAG/C,CAAC,GAC9C,EAAEA,KAAKuC,EAASQ,EAAE,CAAC,GACfA,EAAE,SAAS,KAAA,MACbP,MAAA,IAAS,IAAI,aAAad,CAAK,CAAC,CAAC,KAAK,GAAG,IACzC,EAAK1B,KAAK+C,EAAE,OAEVA,EAAE,UAAU,KAAA,MACdN,MAAA,IAAe,MAA0Bf,CAAK,IAC9C,EAAO1B,KAAK+C,EAAE,QAEZA,EAAE,UAAU,KAAA,MACdL,MAAA,IAAe,MAA0BhB,CAAK,IAC9C,EAAO1B,KAAK+C,EAAE,QAEZA,EAAE,SAAS,KAAA,MAAW,CAACJ,MAAA,IAASG,EAAU,GAAA,CAAG9C,KAAKJ,EAASmD,EAAE,IAAI,IACjEA,EAAE,SAAS,KAAA,MAAW,CAAC3B,MAAA,IAAS0B,EAAU,GAAA,CAAG9C,KAAKJ,EAASmD,EAAE,IAAI,IACjEA,EAAE,QAAQ,KAAA,MAAW,CAAC1B,MAAA,IAAQyB,EAAU,GAAA,CAAG9C,KAAKJ,EAASmD,EAAE,GAAG,IAC9DA,EAAE,UAAU,KAAA,MAAW,CAACxD,MAAA,IAAUuD,EAAU,GAAA,CAAG9C,KAAKJ,EAASmD,EAAE,KAAK,IACpEA,EAAE,OAAO,KAAA,MAAW,CAACzB,MAAA,IAAOwB,EAAU,GAAA,CAAG9C,KAAKJ,EAASmD,EAAE,EAAE,IAC3DA,EAAE,OAAO,KAAA,MAAW,CAACxB,MAAA,IAAOuB,EAAU,GAAA,CAAG9C,KAAKJ,EAASmD,EAAE,EAAE,IAC3DA,EAAE,OAAO,KAAA,MAAW,CAACvB,MAAA,IAAOsB,EAAU,GAAA,CAAG9C,KAAKJ,EAASmD,EAAE,EAAE,IAC3DA,EAAE,aAAa,KAAA,KAAaA,EAAE,SAAS,WACzCtB,MAAA,IAAiB,MAAqCC,CAAK,IAC3D,EAAS1B,KAAK+C,EAAE,WAEdA,EAAE,YAAY,KAAA,KAAaA,EAAE,QAAQ,WACvCH,MAAA,IAAgB,MAAiDlB,CAAK,IACtE,EAAQ1B,KAAK+C,EAAE,UAEbA,EAAE,OAAO,KAAA,MACXF,MAAA,IAAY,MAA0BnB,CAAK,IAC3C,EAAI1B,KAAK+C,EAAE;EAEf,OAEE,AADA,EAAE/C,KAAKA,GACP,EAAEA,KAAK;CAEX;CACA,OAAOW,EAASiB,GAAGE,GAAGJ,GAAO;EAC3B;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CAAC;AACH,GAGasB,KACX,GACA,GACA,MACW;CACX,IAAIC,IAAK,GACLC,IAAKxB;CACT,OAAOuB,IAAKC,IAAI;EACd,IAAMC,IAAOF,IAAKC,MAAQ;EAC1B,AAAItB,EAAEuB,KAAO5D,IAAO,IAAK4D,IAAM,IAC1B,IAAKA;CACZ;CACA,OAAOF;AACT,GAGaG,KACX,GACA,GACA,GACA,MACW;CACX,IAAI1B,MAAU,GAAG,OAAO;CACxB,IAAM,IAAIsB,EAAWpB,GAAGF,GAAOnC,CAAK,GAChC8D,IAAO,IAAI,GACXC,IAAQ;CACZ,OAAOD,KAAQ,KAAK,CAAC,OAAO,SAASvB,EAAEuB,EAAK,IAAG;CAC/C,OAAOC,IAAQ5B,KAAS,CAAC,OAAO,SAASI,EAAEwB,EAAM,IAAG;CAGpD,OAFID,IAAO,IAAUC,IAAQ5B,IAAQ4B,IAAQ,KACzCA,KAAS5B,KACNnC,IAAQqC,EAAEyB,MAASzB,EAAE0B,KAAS/D,IADV8D,IACyBC;AACtD"}
@@ -1,2 +1,2 @@
1
- var e=Symbol.for(`minerva-design.charts.defaults`),t=()=>{let t=globalThis;return t[e]??(t[e]={renderer:`auto`,listeners:new Set})},n=[`auto`,`webgpu`,`webgl2`,`webgl`,`canvas2d`],r=e=>{let r=n.includes(e)?e:`auto`,i=t();if(i.renderer!==r){i.renderer=r;for(let e of[...i.listeners])try{e(r)}catch(e){queueMicrotask(()=>{throw e})}}},i=()=>t().renderer,a=e=>{let{listeners:n}=t();return n.add(e),()=>{n.delete(e)}},o=e=>!e||e===`auto`?i():e;exports.getDefaultChartRenderer=i,exports.resolveRendererPreference=o,exports.setDefaultChartRenderer=r,exports.subscribeDefaultChartRenderer=a;
1
+ var e=Symbol.for(`minerva-design.charts.defaults`),t=Symbol.for(`minerva-design.charts.defaultRenderer`),n=()=>{let n=globalThis,i=n[e];if(!i){let a=n[t];i={renderer:r.find(e=>e===a)??`auto`,listeners:new Set},n[e]=i}return i},r=[`auto`,`webgpu`,`webgl2`,`webgl`,`canvas2d`],i=e=>{let t=r.includes(e)?e:`auto`,i=n();if(i.renderer!==t){i.renderer=t;for(let e of[...i.listeners])try{e(t)}catch(e){queueMicrotask(()=>{throw e})}}},a=()=>n().renderer,o=e=>{let{listeners:t}=n();return t.add(e),()=>{t.delete(e)}},s=e=>!e||e===`auto`?a():e;exports.getDefaultChartRenderer=a,exports.resolveRendererPreference=s,exports.setDefaultChartRenderer=i,exports.subscribeDefaultChartRenderer=o;
2
2
  //# sourceMappingURL=defaults.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"defaults.cjs","names":["KEY","state","host","PREFERENCES","setDefaultChartRenderer","next","preference","current","listener","error","getDefaultChartRenderer","subscribeDefaultChartRenderer","listeners","resolveRendererPreference"],"sources":["../../../../charts/src/engine/defaults.ts"],"sourcesContent":["// Process-wide chart defaults. Charts whose `renderer` option is unset or\n// \"auto\" use the default backend preference set here, so an app (or a docs\n// site) can switch every chart between WebGPU, WebGL2, WebGL and Canvas2D\n// in one place.\n\nimport type { ChartRendererPreference } from \"./types\";\n\ntype RendererListener = (preference: ChartRendererPreference) => void;\n\ninterface DefaultsState {\n renderer: ChartRendererPreference;\n listeners: Set<RendererListener>;\n}\n\n// Kept on globalThis so that every copy of the engine on a page (the React\n// build, a Web Components bundle, ...) shares the same default.\nconst KEY = Symbol.for(\"minerva-design.charts.defaults\");\n\nconst state = (): DefaultsState => {\n const host = globalThis as unknown as Record<symbol, DefaultsState>;\n return (host[KEY] ??= { renderer: \"auto\", listeners: new Set() });\n};\n\nconst PREFERENCES: readonly ChartRendererPreference[] = [\n \"auto\",\n \"webgpu\",\n \"webgl2\",\n \"webgl\",\n \"canvas2d\",\n];\n\n/**\n * Sets the backend used by charts with `renderer` unset or \"auto\". Mounted\n * charts follow the change live (they recreate their renderer); charts with\n * an explicit backend are unaffected. \"auto\" restores the automatic\n * WebGPU -> WebGL2 -> WebGL -> Canvas2D detection.\n */\nexport const setDefaultChartRenderer = (\n preference: ChartRendererPreference,\n): void => {\n const next = PREFERENCES.includes(preference) ? preference : \"auto\";\n const current = state();\n if (current.renderer === next) return;\n current.renderer = next;\n for (const listener of [...current.listeners]) {\n // a failing listener must not keep the others (other copies of the\n // engine, other frameworks) from hearing about the change\n try {\n listener(next);\n } catch (error) {\n queueMicrotask(() => {\n throw error;\n });\n }\n }\n};\n\n/** The backend preference charts with `renderer: \"auto\"` start from */\nexport const getDefaultChartRenderer = (): ChartRendererPreference =>\n state().renderer;\n\n/** Calls `listener` whenever the default renderer changes; returns an unsubscribe function */\nexport const subscribeDefaultChartRenderer = (\n listener: RendererListener,\n): (() => void) => {\n const { listeners } = state();\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n};\n\n/**\n * The preference a chart actually uses: its own, else the global default.\n * A backend forced through the default counts as forced (it may run on a\n * software GPU), exactly like a chart's own `renderer` option.\n */\nexport const resolveRendererPreference = (\n preference: ChartRendererPreference | undefined,\n): ChartRendererPreference =>\n !preference || preference === \"auto\" ? getDefaultChartRenderer() : preference;\n"],"mappings":"AAgBA,IAAMA,EAAM,OAAO,IAAI,gCAAgC,EAEjDC,MAA6B,CACjC,IAAMC,EAAO,WACb,OAAQA,EAAKF,KAAL,EAAKA,GAAS,CAAE,SAAU,OAAQ,UAAW,IAAI,GAAM,EACjE,EAEMG,EAAkD,CACtD,OACA,SACA,SACA,QACA,UACF,EAQaC,EACX,GACS,CACT,IAAMC,EAAOF,EAAY,SAASG,CAAU,EAAIA,EAAa,OACvDC,EAAUN,EAAM,EACtB,GAAIM,EAAQ,WAAaF,EACzB,GAAQ,SAAWA,EACnB,IAAK,IAAMG,IAAY,CAAC,GAAGD,EAAQ,SAAS,EAG1C,GAAI,CACFC,EAASH,CAAI,CACf,OAASI,EAAO,CACd,mBAAqB,CACnB,MAAMA,CACR,CAAC,CACH,CAViB,CAYrB,EAGaC,MACXT,EAAM,CAAC,CAAC,SAGGU,EACX,GACiB,CACjB,GAAM,CAAE,aAAcV,EAAM,EAE5B,OADAW,EAAU,IAAIJ,CAAQ,MACT,CACXI,EAAU,OAAOJ,CAAQ,CAC3B,CACF,EAOaK,EACX,GAEA,CAACP,GAAcA,IAAe,OAASI,EAAwB,EAAIJ"}
1
+ {"version":3,"file":"defaults.cjs","names":["KEY","SEED","state","host","current","seed","PREFERENCES","option","setDefaultChartRenderer","next","preference","listener","error","getDefaultChartRenderer","subscribeDefaultChartRenderer","listeners","resolveRendererPreference"],"sources":["../../../../charts/src/engine/defaults.ts"],"sourcesContent":["// Process-wide chart defaults. Charts whose `renderer` option is unset or\n// \"auto\" use the default backend preference set here, so an app (or a docs\n// site) can switch every chart between WebGPU, WebGL2, WebGL and Canvas2D\n// in one place.\n\nimport type { ChartRendererPreference } from \"./types\";\n\ntype RendererListener = (preference: ChartRendererPreference) => void;\n\ninterface DefaultsState {\n renderer: ChartRendererPreference;\n listeners: Set<RendererListener>;\n}\n\n// Kept on globalThis so that every copy of the engine on a page (the React\n// build, a Web Components bundle, ...) shares the same default.\nconst KEY = Symbol.for(\"minerva-design.charts.defaults\");\n\n/**\n * Lets a page choose the default before any copy of the engine has loaded\n * (e.g. a tiny boot script restoring a saved choice without importing the\n * charts): `globalThis[Symbol.for(\"minerva-design.charts.defaultRenderer\")]\n * = \"canvas2d\"`. Read once, when the first engine copy creates the shared\n * state; afterwards use `setDefaultChartRenderer`. Invalid values mean \"auto\".\n */\nconst SEED = Symbol.for(\"minerva-design.charts.defaultRenderer\");\n\nconst state = (): DefaultsState => {\n const host = globalThis as unknown as Record<symbol, unknown>;\n let current = host[KEY] as DefaultsState | undefined;\n if (!current) {\n const seed = host[SEED];\n current = {\n renderer: PREFERENCES.find((option) => option === seed) ?? \"auto\",\n listeners: new Set(),\n };\n host[KEY] = current;\n }\n return current;\n};\n\nconst PREFERENCES: readonly ChartRendererPreference[] = [\n \"auto\",\n \"webgpu\",\n \"webgl2\",\n \"webgl\",\n \"canvas2d\",\n];\n\n/**\n * Sets the backend used by charts with `renderer` unset or \"auto\". Mounted\n * charts follow the change live (they recreate their renderer); charts with\n * an explicit backend are unaffected. \"auto\" restores the automatic\n * WebGPU -> WebGL2 -> WebGL -> Canvas2D detection.\n */\nexport const setDefaultChartRenderer = (\n preference: ChartRendererPreference,\n): void => {\n const next = PREFERENCES.includes(preference) ? preference : \"auto\";\n const current = state();\n if (current.renderer === next) return;\n current.renderer = next;\n for (const listener of [...current.listeners]) {\n // a failing listener must not keep the others (other copies of the\n // engine, other frameworks) from hearing about the change\n try {\n listener(next);\n } catch (error) {\n queueMicrotask(() => {\n throw error;\n });\n }\n }\n};\n\n/** The backend preference charts with `renderer: \"auto\"` start from */\nexport const getDefaultChartRenderer = (): ChartRendererPreference =>\n state().renderer;\n\n/** Calls `listener` whenever the default renderer changes; returns an unsubscribe function */\nexport const subscribeDefaultChartRenderer = (\n listener: RendererListener,\n): (() => void) => {\n const { listeners } = state();\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n};\n\n/**\n * The preference a chart actually uses: its own, else the global default.\n * A backend forced through the default counts as forced (it may run on a\n * software GPU), exactly like a chart's own `renderer` option.\n */\nexport const resolveRendererPreference = (\n preference: ChartRendererPreference | undefined,\n): ChartRendererPreference =>\n !preference || preference === \"auto\" ? getDefaultChartRenderer() : preference;\n"],"mappings":"AAgBA,IAAMA,EAAM,OAAO,IAAI,gCAAgC,EASjDC,EAAO,OAAO,IAAI,uCAAuC,EAEzDC,MAA6B,CACjC,IAAMC,EAAO,WACTC,EAAUD,EAAKH,GACnB,GAAI,CAACI,EAAS,CACZ,IAAMC,EAAOF,EAAKF,GAClB,EAAU,CACR,SAAUK,EAAY,KAAM,GAAWC,IAAWF,CAAI,GAAK,OAC3D,UAAW,IAAI,GACjB,EACA,EAAKL,GAAOI,CACd,CACA,OAAOA,CACT,EAEME,EAAkD,CACtD,OACA,SACA,SACA,QACA,UACF,EAQaE,EACX,GACS,CACT,IAAMC,EAAOH,EAAY,SAASI,CAAU,EAAIA,EAAa,OACvDN,EAAUF,EAAM,EACtB,GAAIE,EAAQ,WAAaK,EACzB,GAAQ,SAAWA,EACnB,IAAK,IAAME,IAAY,CAAC,GAAGP,EAAQ,SAAS,EAG1C,GAAI,CACFO,EAASF,CAAI,CACf,OAASG,EAAO,CACd,mBAAqB,CACnB,MAAMA,CACR,CAAC,CACH,CAViB,CAYrB,EAGaC,MACXX,EAAM,CAAC,CAAC,SAGGY,EACX,GACiB,CACjB,GAAM,CAAE,aAAcZ,EAAM,EAE5B,OADAa,EAAU,IAAIJ,CAAQ,MACT,CACXI,EAAU,OAAOJ,CAAQ,CAC3B,CACF,EAOaK,EACX,GAEA,CAACN,GAAcA,IAAe,OAASG,EAAwB,EAAIH"}
@@ -1,35 +1,39 @@
1
1
  //#region src/engine/defaults.ts
2
- var e = Symbol.for("minerva-design.charts.defaults"), t = () => {
3
- let t = globalThis;
4
- return t[e] ?? (t[e] = {
5
- renderer: "auto",
6
- listeners: /* @__PURE__ */ new Set()
7
- });
8
- }, n = [
2
+ var e = Symbol.for("minerva-design.charts.defaults"), t = Symbol.for("minerva-design.charts.defaultRenderer"), n = () => {
3
+ let n = globalThis, i = n[e];
4
+ if (!i) {
5
+ let a = n[t];
6
+ i = {
7
+ renderer: r.find((e) => e === a) ?? "auto",
8
+ listeners: /* @__PURE__ */ new Set()
9
+ }, n[e] = i;
10
+ }
11
+ return i;
12
+ }, r = [
9
13
  "auto",
10
14
  "webgpu",
11
15
  "webgl2",
12
16
  "webgl",
13
17
  "canvas2d"
14
- ], r = (e) => {
15
- let r = n.includes(e) ? e : "auto", i = t();
16
- if (i.renderer !== r) {
17
- i.renderer = r;
18
+ ], i = (e) => {
19
+ let t = r.includes(e) ? e : "auto", i = n();
20
+ if (i.renderer !== t) {
21
+ i.renderer = t;
18
22
  for (let e of [...i.listeners]) try {
19
- e(r);
23
+ e(t);
20
24
  } catch (e) {
21
25
  queueMicrotask(() => {
22
26
  throw e;
23
27
  });
24
28
  }
25
29
  }
26
- }, i = () => t().renderer, a = (e) => {
27
- let { listeners: n } = t();
28
- return n.add(e), () => {
29
- n.delete(e);
30
+ }, a = () => n().renderer, o = (e) => {
31
+ let { listeners: t } = n();
32
+ return t.add(e), () => {
33
+ t.delete(e);
30
34
  };
31
- }, o = (e) => !e || e === "auto" ? i() : e;
35
+ }, s = (e) => !e || e === "auto" ? a() : e;
32
36
  //#endregion
33
- export { i as getDefaultChartRenderer, o as resolveRendererPreference, r as setDefaultChartRenderer, a as subscribeDefaultChartRenderer };
37
+ export { a as getDefaultChartRenderer, s as resolveRendererPreference, i as setDefaultChartRenderer, o as subscribeDefaultChartRenderer };
34
38
 
35
39
  //# sourceMappingURL=defaults.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"defaults.js","names":["KEY","state","host","PREFERENCES","setDefaultChartRenderer","next","preference","current","listener","error","getDefaultChartRenderer","subscribeDefaultChartRenderer","listeners","resolveRendererPreference"],"sources":["../../../../charts/src/engine/defaults.ts"],"sourcesContent":["// Process-wide chart defaults. Charts whose `renderer` option is unset or\n// \"auto\" use the default backend preference set here, so an app (or a docs\n// site) can switch every chart between WebGPU, WebGL2, WebGL and Canvas2D\n// in one place.\n\nimport type { ChartRendererPreference } from \"./types\";\n\ntype RendererListener = (preference: ChartRendererPreference) => void;\n\ninterface DefaultsState {\n renderer: ChartRendererPreference;\n listeners: Set<RendererListener>;\n}\n\n// Kept on globalThis so that every copy of the engine on a page (the React\n// build, a Web Components bundle, ...) shares the same default.\nconst KEY = Symbol.for(\"minerva-design.charts.defaults\");\n\nconst state = (): DefaultsState => {\n const host = globalThis as unknown as Record<symbol, DefaultsState>;\n return (host[KEY] ??= { renderer: \"auto\", listeners: new Set() });\n};\n\nconst PREFERENCES: readonly ChartRendererPreference[] = [\n \"auto\",\n \"webgpu\",\n \"webgl2\",\n \"webgl\",\n \"canvas2d\",\n];\n\n/**\n * Sets the backend used by charts with `renderer` unset or \"auto\". Mounted\n * charts follow the change live (they recreate their renderer); charts with\n * an explicit backend are unaffected. \"auto\" restores the automatic\n * WebGPU -> WebGL2 -> WebGL -> Canvas2D detection.\n */\nexport const setDefaultChartRenderer = (\n preference: ChartRendererPreference,\n): void => {\n const next = PREFERENCES.includes(preference) ? preference : \"auto\";\n const current = state();\n if (current.renderer === next) return;\n current.renderer = next;\n for (const listener of [...current.listeners]) {\n // a failing listener must not keep the others (other copies of the\n // engine, other frameworks) from hearing about the change\n try {\n listener(next);\n } catch (error) {\n queueMicrotask(() => {\n throw error;\n });\n }\n }\n};\n\n/** The backend preference charts with `renderer: \"auto\"` start from */\nexport const getDefaultChartRenderer = (): ChartRendererPreference =>\n state().renderer;\n\n/** Calls `listener` whenever the default renderer changes; returns an unsubscribe function */\nexport const subscribeDefaultChartRenderer = (\n listener: RendererListener,\n): (() => void) => {\n const { listeners } = state();\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n};\n\n/**\n * The preference a chart actually uses: its own, else the global default.\n * A backend forced through the default counts as forced (it may run on a\n * software GPU), exactly like a chart's own `renderer` option.\n */\nexport const resolveRendererPreference = (\n preference: ChartRendererPreference | undefined,\n): ChartRendererPreference =>\n !preference || preference === \"auto\" ? getDefaultChartRenderer() : preference;\n"],"mappings":";AAgBA,IAAMA,IAAM,OAAO,IAAI,gCAAgC,GAEjDC,UAA6B;CACjC,IAAMC,IAAO;CACb,OAAQA,EAAKF,OAAL,EAAKA,KAAS;EAAE,UAAU;EAAQ,2BAAW,IAAI,IAAI;CAAE;AACjE,GAEMG,IAAkD;CACtD;CACA;CACA;CACA;CACA;AACF,GAQaC,KACX,MACS;CACT,IAAMC,IAAOF,EAAY,SAASG,CAAU,IAAIA,IAAa,QACvDC,IAAUN,EAAM;CACtB,IAAIM,EAAQ,aAAaF,GACzB;IAAQ,WAAWA;EACnB,KAAK,IAAMG,KAAY,CAAC,GAAGD,EAAQ,SAAS,GAG1C,IAAI;GACF,EAASF,CAAI;EACf,SAASI,GAAO;GACd,qBAAqB;IACnB,MAAMA;GACR,CAAC;EACH;CAViB;AAYrB,GAGaC,UACXT,EAAM,CAAC,CAAC,UAGGU,KACX,MACiB;CACjB,IAAM,EAAE,iBAAcV,EAAM;CAE5B,OADAW,EAAU,IAAIJ,CAAQ,SACT;EACX,EAAU,OAAOA,CAAQ;CAC3B;AACF,GAOaK,KACX,MAEA,CAACP,KAAcA,MAAe,SAASI,EAAwB,IAAIJ"}
1
+ {"version":3,"file":"defaults.js","names":["KEY","SEED","state","host","current","seed","PREFERENCES","option","setDefaultChartRenderer","next","preference","listener","error","getDefaultChartRenderer","subscribeDefaultChartRenderer","listeners","resolveRendererPreference"],"sources":["../../../../charts/src/engine/defaults.ts"],"sourcesContent":["// Process-wide chart defaults. Charts whose `renderer` option is unset or\n// \"auto\" use the default backend preference set here, so an app (or a docs\n// site) can switch every chart between WebGPU, WebGL2, WebGL and Canvas2D\n// in one place.\n\nimport type { ChartRendererPreference } from \"./types\";\n\ntype RendererListener = (preference: ChartRendererPreference) => void;\n\ninterface DefaultsState {\n renderer: ChartRendererPreference;\n listeners: Set<RendererListener>;\n}\n\n// Kept on globalThis so that every copy of the engine on a page (the React\n// build, a Web Components bundle, ...) shares the same default.\nconst KEY = Symbol.for(\"minerva-design.charts.defaults\");\n\n/**\n * Lets a page choose the default before any copy of the engine has loaded\n * (e.g. a tiny boot script restoring a saved choice without importing the\n * charts): `globalThis[Symbol.for(\"minerva-design.charts.defaultRenderer\")]\n * = \"canvas2d\"`. Read once, when the first engine copy creates the shared\n * state; afterwards use `setDefaultChartRenderer`. Invalid values mean \"auto\".\n */\nconst SEED = Symbol.for(\"minerva-design.charts.defaultRenderer\");\n\nconst state = (): DefaultsState => {\n const host = globalThis as unknown as Record<symbol, unknown>;\n let current = host[KEY] as DefaultsState | undefined;\n if (!current) {\n const seed = host[SEED];\n current = {\n renderer: PREFERENCES.find((option) => option === seed) ?? \"auto\",\n listeners: new Set(),\n };\n host[KEY] = current;\n }\n return current;\n};\n\nconst PREFERENCES: readonly ChartRendererPreference[] = [\n \"auto\",\n \"webgpu\",\n \"webgl2\",\n \"webgl\",\n \"canvas2d\",\n];\n\n/**\n * Sets the backend used by charts with `renderer` unset or \"auto\". Mounted\n * charts follow the change live (they recreate their renderer); charts with\n * an explicit backend are unaffected. \"auto\" restores the automatic\n * WebGPU -> WebGL2 -> WebGL -> Canvas2D detection.\n */\nexport const setDefaultChartRenderer = (\n preference: ChartRendererPreference,\n): void => {\n const next = PREFERENCES.includes(preference) ? preference : \"auto\";\n const current = state();\n if (current.renderer === next) return;\n current.renderer = next;\n for (const listener of [...current.listeners]) {\n // a failing listener must not keep the others (other copies of the\n // engine, other frameworks) from hearing about the change\n try {\n listener(next);\n } catch (error) {\n queueMicrotask(() => {\n throw error;\n });\n }\n }\n};\n\n/** The backend preference charts with `renderer: \"auto\"` start from */\nexport const getDefaultChartRenderer = (): ChartRendererPreference =>\n state().renderer;\n\n/** Calls `listener` whenever the default renderer changes; returns an unsubscribe function */\nexport const subscribeDefaultChartRenderer = (\n listener: RendererListener,\n): (() => void) => {\n const { listeners } = state();\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n};\n\n/**\n * The preference a chart actually uses: its own, else the global default.\n * A backend forced through the default counts as forced (it may run on a\n * software GPU), exactly like a chart's own `renderer` option.\n */\nexport const resolveRendererPreference = (\n preference: ChartRendererPreference | undefined,\n): ChartRendererPreference =>\n !preference || preference === \"auto\" ? getDefaultChartRenderer() : preference;\n"],"mappings":";AAgBA,IAAMA,IAAM,OAAO,IAAI,gCAAgC,GASjDC,IAAO,OAAO,IAAI,uCAAuC,GAEzDC,UAA6B;CACjC,IAAMC,IAAO,YACTC,IAAUD,EAAKH;CACnB,IAAI,CAACI,GAAS;EACZ,IAAMC,IAAOF,EAAKF;EAKlB,AAJA,IAAU;GACR,UAAUK,EAAY,MAAM,MAAWC,MAAWF,CAAI,KAAK;GAC3D,2BAAW,IAAI,IAAI;EACrB,GACA,EAAKL,KAAOI;CACd;CACA,OAAOA;AACT,GAEME,IAAkD;CACtD;CACA;CACA;CACA;CACA;AACF,GAQaE,KACX,MACS;CACT,IAAMC,IAAOH,EAAY,SAASI,CAAU,IAAIA,IAAa,QACvDN,IAAUF,EAAM;CACtB,IAAIE,EAAQ,aAAaK,GACzB;IAAQ,WAAWA;EACnB,KAAK,IAAME,KAAY,CAAC,GAAGP,EAAQ,SAAS,GAG1C,IAAI;GACF,EAASK,CAAI;EACf,SAASG,GAAO;GACd,qBAAqB;IACnB,MAAMA;GACR,CAAC;EACH;CAViB;AAYrB,GAGaC,UACXX,EAAM,CAAC,CAAC,UAGGY,KACX,MACiB;CACjB,IAAM,EAAE,iBAAcZ,EAAM;CAE5B,OADAa,EAAU,IAAIJ,CAAQ,SACT;EACX,EAAU,OAAOA,CAAQ;CAC3B;AACF,GAOaK,KACX,MAEA,CAACN,KAAcA,MAAe,SAASG,EAAwB,IAAIH"}