@mui/x-charts-premium 9.0.3 → 9.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (179) hide show
  1. package/BarChartPremium/BarChartPremium.js +2 -1183
  2. package/BarChartPremium/BarChartPremium.mjs +2 -1183
  3. package/BarChartPremium/RangeBar/FocusedRangeBar.js +3 -0
  4. package/BarChartPremium/RangeBar/FocusedRangeBar.mjs +3 -0
  5. package/BarChartPremium/RangeBar/seriesConfig/seriesProcessor.js +2 -0
  6. package/BarChartPremium/RangeBar/seriesConfig/seriesProcessor.mjs +2 -0
  7. package/CHANGELOG.md +220 -0
  8. package/CandlestickChart/CandlestickChart.d.mts +2 -2
  9. package/CandlestickChart/CandlestickChart.d.ts +2 -2
  10. package/CandlestickChart/CandlestickChart.js +2 -1183
  11. package/CandlestickChart/CandlestickChart.mjs +2 -1183
  12. package/CandlestickChart/CandlestickWebGLProgram.d.mts +6 -11
  13. package/CandlestickChart/CandlestickWebGLProgram.d.ts +6 -11
  14. package/CandlestickChart/CandlestickWebGLProgram.js +136 -121
  15. package/CandlestickChart/CandlestickWebGLProgram.mjs +137 -122
  16. package/CandlestickChart/useCandlestickPlotData.d.mts +2 -2
  17. package/CandlestickChart/useCandlestickPlotData.d.ts +2 -2
  18. package/CandlestickChart/useCandlestickPlotData.js +121 -61
  19. package/CandlestickChart/useCandlestickPlotData.mjs +122 -61
  20. package/ChartsAxisHighlightValue/index.d.mts +1 -0
  21. package/ChartsAxisHighlightValue/index.d.ts +1 -0
  22. package/ChartsAxisHighlightValue/index.js +16 -0
  23. package/ChartsAxisHighlightValue/index.mjs +2 -0
  24. package/ChartsDataProviderPremium/ChartsDataProviderPremium.js +2 -2
  25. package/ChartsDataProviderPremium/ChartsDataProviderPremium.mjs +2 -2
  26. package/ChartsRadialAxisHighlight/index.d.mts +1 -0
  27. package/ChartsRadialAxisHighlight/index.d.ts +1 -0
  28. package/ChartsRadialAxisHighlight/index.js +16 -0
  29. package/ChartsRadialAxisHighlight/index.mjs +2 -0
  30. package/ChartsRadialDataProviderPremium/ChartsRadialDataProviderPremium.js +2 -2
  31. package/ChartsRadialDataProviderPremium/ChartsRadialDataProviderPremium.mjs +2 -2
  32. package/HeatmapPremium/HeatmapPremium.js +2 -155
  33. package/HeatmapPremium/HeatmapPremium.mjs +2 -155
  34. package/HeatmapPremium/webgl/HeatmapWebGLPlot.js +19 -112
  35. package/HeatmapPremium/webgl/HeatmapWebGLPlot.mjs +19 -111
  36. package/HeatmapPremium/webgl/HeatmapWebGLProgram.d.mts +24 -0
  37. package/HeatmapPremium/webgl/HeatmapWebGLProgram.d.ts +24 -0
  38. package/HeatmapPremium/webgl/HeatmapWebGLProgram.js +132 -0
  39. package/HeatmapPremium/webgl/HeatmapWebGLProgram.mjs +125 -0
  40. package/HeatmapPremium/webgl/shaders.d.mts +1 -1
  41. package/HeatmapPremium/webgl/shaders.d.ts +1 -1
  42. package/HeatmapPremium/webgl/shaders.js +1 -1
  43. package/HeatmapPremium/webgl/shaders.mjs +1 -1
  44. package/HeatmapPremium/webgl/useHeatmapPlotData.d.mts +3 -3
  45. package/HeatmapPremium/webgl/useHeatmapPlotData.d.ts +3 -3
  46. package/HeatmapPremium/webgl/useHeatmapPlotData.js +78 -26
  47. package/HeatmapPremium/webgl/useHeatmapPlotData.mjs +80 -26
  48. package/LICENSE +3 -1
  49. package/RadialBarChart/RadialBarChart.d.mts +60 -0
  50. package/RadialBarChart/RadialBarChart.d.ts +60 -0
  51. package/RadialBarChart/RadialBarChart.js +298 -0
  52. package/RadialBarChart/RadialBarChart.mjs +292 -0
  53. package/RadialBarChart/RadialBarChart.plugins.d.mts +4 -0
  54. package/RadialBarChart/RadialBarChart.plugins.d.ts +4 -0
  55. package/RadialBarChart/RadialBarChart.plugins.js +9 -0
  56. package/RadialBarChart/RadialBarChart.plugins.mjs +3 -0
  57. package/RadialBarChart/RadialBarElement.d.mts +16 -0
  58. package/RadialBarChart/RadialBarElement.d.ts +16 -0
  59. package/RadialBarChart/RadialBarElement.js +54 -0
  60. package/RadialBarChart/RadialBarElement.mjs +48 -0
  61. package/RadialBarChart/RadialBarPlot.d.mts +21 -0
  62. package/RadialBarChart/RadialBarPlot.d.ts +21 -0
  63. package/RadialBarChart/RadialBarPlot.js +85 -0
  64. package/RadialBarChart/RadialBarPlot.mjs +79 -0
  65. package/RadialBarChart/index.d.mts +3 -0
  66. package/RadialBarChart/index.d.ts +3 -0
  67. package/RadialBarChart/index.js +39 -0
  68. package/RadialBarChart/index.mjs +3 -0
  69. package/RadialBarChart/radialBarClasses.d.mts +15 -0
  70. package/RadialBarChart/radialBarClasses.d.ts +15 -0
  71. package/RadialBarChart/radialBarClasses.js +26 -0
  72. package/RadialBarChart/radialBarClasses.mjs +18 -0
  73. package/RadialBarChart/seriesConfig/seriesProcessor.js +4 -0
  74. package/RadialBarChart/seriesConfig/seriesProcessor.mjs +4 -0
  75. package/RadialBarChart/useRadialBarChartProps.d.mts +28 -0
  76. package/RadialBarChart/useRadialBarChartProps.d.ts +28 -0
  77. package/RadialBarChart/useRadialBarChartProps.js +100 -0
  78. package/RadialBarChart/useRadialBarChartProps.mjs +93 -0
  79. package/RadialBarChart/useRadialBarPlotData.d.mts +23 -0
  80. package/RadialBarChart/useRadialBarPlotData.d.ts +23 -0
  81. package/RadialBarChart/useRadialBarPlotData.js +94 -0
  82. package/RadialBarChart/useRadialBarPlotData.mjs +87 -0
  83. package/RadialLineChart/RadialArea.js +13 -1
  84. package/RadialLineChart/RadialArea.mjs +13 -1
  85. package/RadialLineChart/RadialLine.js +13 -1
  86. package/RadialLineChart/RadialLine.mjs +13 -1
  87. package/RadialLineChart/RadialLineChart.d.mts +11 -3
  88. package/RadialLineChart/RadialLineChart.d.ts +11 -3
  89. package/RadialLineChart/RadialLineChart.js +24 -673
  90. package/RadialLineChart/RadialLineChart.mjs +24 -673
  91. package/RadialLineChart/RadialLineHighlightElement.d.mts +15 -0
  92. package/RadialLineChart/RadialLineHighlightElement.d.ts +15 -0
  93. package/RadialLineChart/RadialLineHighlightElement.js +46 -0
  94. package/RadialLineChart/RadialLineHighlightElement.mjs +39 -0
  95. package/RadialLineChart/RadialLineHighlightPlot.d.mts +23 -0
  96. package/RadialLineChart/RadialLineHighlightPlot.d.ts +23 -0
  97. package/RadialLineChart/RadialLineHighlightPlot.js +92 -0
  98. package/RadialLineChart/RadialLineHighlightPlot.mjs +86 -0
  99. package/RadialLineChart/RadialMarkPlot.js +32 -3
  100. package/RadialLineChart/RadialMarkPlot.mjs +32 -3
  101. package/RadialLineChart/index.d.mts +3 -1
  102. package/RadialLineChart/index.d.ts +3 -1
  103. package/RadialLineChart/index.js +22 -0
  104. package/RadialLineChart/index.mjs +3 -1
  105. package/RadialLineChart/radialLineClasses.d.mts +3 -1
  106. package/RadialLineChart/radialLineClasses.d.ts +3 -1
  107. package/RadialLineChart/radialLineClasses.js +2 -1
  108. package/RadialLineChart/radialLineClasses.mjs +2 -1
  109. package/RadialLineChart/seriesConfig/getItemAtPosition.d.mts +6 -0
  110. package/RadialLineChart/seriesConfig/getItemAtPosition.d.ts +6 -0
  111. package/RadialLineChart/seriesConfig/getItemAtPosition.js +353 -0
  112. package/RadialLineChart/seriesConfig/getItemAtPosition.mjs +348 -0
  113. package/RadialLineChart/seriesConfig/getSeriesWithDefaultValues.js +2 -1
  114. package/RadialLineChart/seriesConfig/getSeriesWithDefaultValues.mjs +2 -1
  115. package/RadialLineChart/seriesConfig/index.js +2 -1
  116. package/RadialLineChart/seriesConfig/index.mjs +2 -1
  117. package/RadialLineChart/seriesConfig/seriesProcessor.js +4 -0
  118. package/RadialLineChart/seriesConfig/seriesProcessor.mjs +4 -0
  119. package/RadialLineChart/useRadialLineChartProps.d.mts +2 -0
  120. package/RadialLineChart/useRadialLineChartProps.d.ts +2 -0
  121. package/RadialLineChart/useRadialLineChartProps.js +16 -8
  122. package/RadialLineChart/useRadialLineChartProps.mjs +16 -8
  123. package/RadialLineChart/useRadialLinePlotData.d.mts +3 -1
  124. package/RadialLineChart/useRadialLinePlotData.d.ts +3 -1
  125. package/RadialLineChart/useRadialLinePlotData.js +5 -1
  126. package/RadialLineChart/useRadialLinePlotData.mjs +6 -2
  127. package/ScatterChartPremium/ScatterChartPremium.d.mts +25 -0
  128. package/ScatterChartPremium/ScatterChartPremium.d.ts +25 -0
  129. package/ScatterChartPremium/ScatterChartPremium.js +507 -0
  130. package/ScatterChartPremium/ScatterChartPremium.mjs +501 -0
  131. package/ScatterChartPremium/ScatterChartPremium.plugins.d.mts +3 -0
  132. package/ScatterChartPremium/ScatterChartPremium.plugins.d.ts +3 -0
  133. package/ScatterChartPremium/ScatterChartPremium.plugins.js +8 -0
  134. package/ScatterChartPremium/ScatterChartPremium.plugins.mjs +2 -0
  135. package/ScatterChartPremium/ScatterPlotPremium.d.mts +14 -0
  136. package/ScatterChartPremium/ScatterPlotPremium.d.ts +14 -0
  137. package/ScatterChartPremium/ScatterPlotPremium.js +28 -0
  138. package/ScatterChartPremium/ScatterPlotPremium.mjs +21 -0
  139. package/ScatterChartPremium/index.d.mts +3 -0
  140. package/ScatterChartPremium/index.d.ts +3 -0
  141. package/ScatterChartPremium/index.js +26 -0
  142. package/ScatterChartPremium/index.mjs +3 -0
  143. package/ScatterChartPremium/webgl/ScatterWebGLPlot.d.mts +4 -0
  144. package/ScatterChartPremium/webgl/ScatterWebGLPlot.d.ts +4 -0
  145. package/ScatterChartPremium/webgl/ScatterWebGLPlot.js +70 -0
  146. package/ScatterChartPremium/webgl/ScatterWebGLPlot.mjs +65 -0
  147. package/ScatterChartPremium/webgl/ScatterWebGLProgram.d.mts +18 -0
  148. package/ScatterChartPremium/webgl/ScatterWebGLProgram.d.ts +18 -0
  149. package/ScatterChartPremium/webgl/ScatterWebGLProgram.js +129 -0
  150. package/ScatterChartPremium/webgl/ScatterWebGLProgram.mjs +122 -0
  151. package/ScatterChartPremium/webgl/shaders.d.mts +2 -0
  152. package/ScatterChartPremium/webgl/shaders.d.ts +2 -0
  153. package/ScatterChartPremium/webgl/shaders.js +57 -0
  154. package/ScatterChartPremium/webgl/shaders.mjs +51 -0
  155. package/ScatterChartPremium/webgl/useScatterWebGLPlotData.d.mts +7 -0
  156. package/ScatterChartPremium/webgl/useScatterWebGLPlotData.d.ts +7 -0
  157. package/ScatterChartPremium/webgl/useScatterWebGLPlotData.js +140 -0
  158. package/ScatterChartPremium/webgl/useScatterWebGLPlotData.mjs +134 -0
  159. package/index.d.mts +3 -1
  160. package/index.d.ts +3 -1
  161. package/index.js +25 -1
  162. package/index.mjs +4 -2
  163. package/internals/index.d.mts +1 -0
  164. package/internals/index.d.ts +1 -0
  165. package/internals/index.js +13 -0
  166. package/internals/index.mjs +1 -0
  167. package/models/seriesType/radialLine.d.mts +7 -1
  168. package/models/seriesType/radialLine.d.ts +7 -1
  169. package/package.json +185 -115
  170. package/plugins/selectors/useChartCandlestickPosition.selectors.d.mts +1 -1
  171. package/plugins/selectors/useChartCandlestickPosition.selectors.d.ts +1 -1
  172. package/utils/webgl/parseColor.d.mts +2 -1
  173. package/utils/webgl/parseColor.d.ts +2 -1
  174. package/utils/webgl/parseColor.js +8 -7
  175. package/utils/webgl/parseColor.mjs +8 -7
  176. package/utils/webgl/utils.d.mts +13 -0
  177. package/utils/webgl/utils.d.ts +13 -0
  178. package/utils/webgl/utils.js +29 -0
  179. package/utils/webgl/utils.mjs +27 -0
@@ -7,7 +7,8 @@ exports.parseColor = parseColor;
7
7
  const colorCache = new Map();
8
8
 
9
9
  /**
10
- * Parse color string to RGBA object. Each channel is normalized to [0, 1].
10
+ * Parse color string to RGBA tuple. Each channel is in [0, 255], matching the byte
11
+ * representation we upload to GPU color buffers.
11
12
  * This function does not work in SSR.
12
13
  */
13
14
  function parseColor(color) {
@@ -38,10 +39,10 @@ function parseColorUsingRegex(color) {
38
39
  if (color.length === 3) {
39
40
  color = color.split('').map(char => char + char).join('');
40
41
  }
41
- const r = parseInt(color.slice(0, 2), 16) / 255;
42
- const g = parseInt(color.slice(2, 4), 16) / 255;
43
- const b = parseInt(color.slice(4, 6), 16) / 255;
44
- const a = color.length === 8 ? parseInt(color.substring(6, 8), 16) / 255 : 1;
42
+ const r = parseInt(color.slice(0, 2), 16);
43
+ const g = parseInt(color.slice(2, 4), 16);
44
+ const b = parseInt(color.slice(4, 6), 16);
45
+ const a = color.length === 8 ? parseInt(color.substring(6, 8), 16) : 255;
45
46
  return [r, g, b, a];
46
47
  }
47
48
 
@@ -62,7 +63,7 @@ function parseRgbaColor(color) {
62
63
  if (a < 0 || a > 1) {
63
64
  return null;
64
65
  }
65
- return [r / 255, g / 255, b / 255, a];
66
+ return [r, g, b, a * 255];
66
67
  }
67
68
  let canvas;
68
69
  function parseColorUsingCanvas(color) {
@@ -79,6 +80,6 @@ function parseColorUsingCanvas(color) {
79
80
  ctx.fillStyle = color;
80
81
  ctx.fillRect(0, 0, 1, 1);
81
82
  const [r, g, b, a] = ctx.getImageData(0, 0, 1, 1).data;
82
- const result = [r / 255, g / 255, b / 255, a / 255];
83
+ const result = [r, g, b, a];
83
84
  return result;
84
85
  }
@@ -1,7 +1,8 @@
1
1
  const colorCache = new Map();
2
2
 
3
3
  /**
4
- * Parse color string to RGBA object. Each channel is normalized to [0, 1].
4
+ * Parse color string to RGBA tuple. Each channel is in [0, 255], matching the byte
5
+ * representation we upload to GPU color buffers.
5
6
  * This function does not work in SSR.
6
7
  */
7
8
  export function parseColor(color) {
@@ -32,10 +33,10 @@ function parseColorUsingRegex(color) {
32
33
  if (color.length === 3) {
33
34
  color = color.split('').map(char => char + char).join('');
34
35
  }
35
- const r = parseInt(color.slice(0, 2), 16) / 255;
36
- const g = parseInt(color.slice(2, 4), 16) / 255;
37
- const b = parseInt(color.slice(4, 6), 16) / 255;
38
- const a = color.length === 8 ? parseInt(color.substring(6, 8), 16) / 255 : 1;
36
+ const r = parseInt(color.slice(0, 2), 16);
37
+ const g = parseInt(color.slice(2, 4), 16);
38
+ const b = parseInt(color.slice(4, 6), 16);
39
+ const a = color.length === 8 ? parseInt(color.substring(6, 8), 16) : 255;
39
40
  return [r, g, b, a];
40
41
  }
41
42
 
@@ -56,7 +57,7 @@ function parseRgbaColor(color) {
56
57
  if (a < 0 || a > 1) {
57
58
  return null;
58
59
  }
59
- return [r / 255, g / 255, b / 255, a];
60
+ return [r, g, b, a * 255];
60
61
  }
61
62
  let canvas;
62
63
  function parseColorUsingCanvas(color) {
@@ -73,6 +74,6 @@ function parseColorUsingCanvas(color) {
73
74
  ctx.fillStyle = color;
74
75
  ctx.fillRect(0, 0, 1, 1);
75
76
  const [r, g, b, a] = ctx.getImageData(0, 0, 1, 1).data;
76
- const result = [r / 255, g / 255, b / 255, a / 255];
77
+ const result = [r, g, b, a];
77
78
  return result;
78
79
  }
@@ -2,6 +2,19 @@ export declare function compileShader(gl: WebGL2RenderingContext, shaderSource:
2
2
  export declare function uploadQuadBuffer(gl: WebGL2RenderingContext): WebGLBuffer;
3
3
  export declare function bindQuadBuffer(gl: WebGL2RenderingContext, program: WebGLProgram, quadBuffer: WebGLBuffer): void;
4
4
  export declare function attachShader(gl: WebGL2RenderingContext, program: WebGLProgram, shaderSource: string, shaderType: WebGL2RenderingContext['FRAGMENT_SHADER'] | WebGL2RenderingContext['VERTEX_SHADER']): WebGLShader;
5
+ export type GrowableBuffer = {
6
+ buffer: WebGLBuffer;
7
+ capacity: number;
8
+ lastUploaded: ArrayBufferView | null;
9
+ };
10
+ export declare function createGrowableBuffer(gl: WebGL2RenderingContext): GrowableBuffer;
11
+ /**
12
+ * Uploads `data` into `target.buffer`. Reuses the existing GPU allocation via
13
+ * `bufferSubData` while the size fits, only re-allocating with `bufferData` when
14
+ * the data grows past the previous high-water mark. Skips the upload entirely
15
+ * when the same typed-array reference is passed twice in a row.
16
+ */
17
+ export declare function uploadGrowableBuffer(gl: WebGL2RenderingContext, target: GrowableBuffer, data: ArrayBufferView): void;
5
18
  /**
6
19
  * Logs WebGL errors to the console in development mode.
7
20
  */
@@ -2,6 +2,19 @@ export declare function compileShader(gl: WebGL2RenderingContext, shaderSource:
2
2
  export declare function uploadQuadBuffer(gl: WebGL2RenderingContext): WebGLBuffer;
3
3
  export declare function bindQuadBuffer(gl: WebGL2RenderingContext, program: WebGLProgram, quadBuffer: WebGLBuffer): void;
4
4
  export declare function attachShader(gl: WebGL2RenderingContext, program: WebGLProgram, shaderSource: string, shaderType: WebGL2RenderingContext['FRAGMENT_SHADER'] | WebGL2RenderingContext['VERTEX_SHADER']): WebGLShader;
5
+ export type GrowableBuffer = {
6
+ buffer: WebGLBuffer;
7
+ capacity: number;
8
+ lastUploaded: ArrayBufferView | null;
9
+ };
10
+ export declare function createGrowableBuffer(gl: WebGL2RenderingContext): GrowableBuffer;
11
+ /**
12
+ * Uploads `data` into `target.buffer`. Reuses the existing GPU allocation via
13
+ * `bufferSubData` while the size fits, only re-allocating with `bufferData` when
14
+ * the data grows past the previous high-water mark. Skips the upload entirely
15
+ * when the same typed-array reference is passed twice in a row.
16
+ */
17
+ export declare function uploadGrowableBuffer(gl: WebGL2RenderingContext, target: GrowableBuffer, data: ArrayBufferView): void;
5
18
  /**
6
19
  * Logs WebGL errors to the console in development mode.
7
20
  */
@@ -6,7 +6,9 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.attachShader = attachShader;
7
7
  exports.bindQuadBuffer = bindQuadBuffer;
8
8
  exports.compileShader = compileShader;
9
+ exports.createGrowableBuffer = createGrowableBuffer;
9
10
  exports.logWebGLErrors = logWebGLErrors;
11
+ exports.uploadGrowableBuffer = uploadGrowableBuffer;
10
12
  exports.uploadQuadBuffer = uploadQuadBuffer;
11
13
  function compileShader(gl, shaderSource, shaderType) {
12
14
  const shader = gl.createShader(shaderType);
@@ -34,6 +36,33 @@ function attachShader(gl, program, shaderSource, shaderType) {
34
36
  gl.attachShader(program, shader);
35
37
  return shader;
36
38
  }
39
+ function createGrowableBuffer(gl) {
40
+ return {
41
+ buffer: gl.createBuffer(),
42
+ capacity: 0,
43
+ lastUploaded: null
44
+ };
45
+ }
46
+
47
+ /**
48
+ * Uploads `data` into `target.buffer`. Reuses the existing GPU allocation via
49
+ * `bufferSubData` while the size fits, only re-allocating with `bufferData` when
50
+ * the data grows past the previous high-water mark. Skips the upload entirely
51
+ * when the same typed-array reference is passed twice in a row.
52
+ */
53
+ function uploadGrowableBuffer(gl, target, data) {
54
+ if (target.lastUploaded === data) {
55
+ return;
56
+ }
57
+ gl.bindBuffer(gl.ARRAY_BUFFER, target.buffer);
58
+ if (data.byteLength <= target.capacity) {
59
+ gl.bufferSubData(gl.ARRAY_BUFFER, 0, data);
60
+ } else {
61
+ gl.bufferData(gl.ARRAY_BUFFER, data, gl.DYNAMIC_DRAW);
62
+ target.capacity = data.byteLength;
63
+ }
64
+ target.lastUploaded = data;
65
+ }
37
66
 
38
67
  /**
39
68
  * Logs WebGL errors to the console in development mode.
@@ -24,6 +24,33 @@ export function attachShader(gl, program, shaderSource, shaderType) {
24
24
  gl.attachShader(program, shader);
25
25
  return shader;
26
26
  }
27
+ export function createGrowableBuffer(gl) {
28
+ return {
29
+ buffer: gl.createBuffer(),
30
+ capacity: 0,
31
+ lastUploaded: null
32
+ };
33
+ }
34
+
35
+ /**
36
+ * Uploads `data` into `target.buffer`. Reuses the existing GPU allocation via
37
+ * `bufferSubData` while the size fits, only re-allocating with `bufferData` when
38
+ * the data grows past the previous high-water mark. Skips the upload entirely
39
+ * when the same typed-array reference is passed twice in a row.
40
+ */
41
+ export function uploadGrowableBuffer(gl, target, data) {
42
+ if (target.lastUploaded === data) {
43
+ return;
44
+ }
45
+ gl.bindBuffer(gl.ARRAY_BUFFER, target.buffer);
46
+ if (data.byteLength <= target.capacity) {
47
+ gl.bufferSubData(gl.ARRAY_BUFFER, 0, data);
48
+ } else {
49
+ gl.bufferData(gl.ARRAY_BUFFER, data, gl.DYNAMIC_DRAW);
50
+ target.capacity = data.byteLength;
51
+ }
52
+ target.lastUploaded = data;
53
+ }
27
54
 
28
55
  /**
29
56
  * Logs WebGL errors to the console in development mode.