@mui/x-charts-premium 9.0.1 → 9.0.3

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 (240) hide show
  1. package/BarChartPremium/BarChartPremium.js +20 -1
  2. package/BarChartPremium/BarChartPremium.mjs +20 -1
  3. package/BarChartPremium/RangeBar/seriesConfig/getSeriesWithDefaultValues.d.mts +1 -0
  4. package/BarChartPremium/RangeBar/seriesConfig/getSeriesWithDefaultValues.d.ts +1 -0
  5. package/BarChartPremium/RangeBar/seriesConfig/seriesProcessor.js +16 -8
  6. package/BarChartPremium/RangeBar/seriesConfig/seriesProcessor.mjs +16 -8
  7. package/CHANGELOG.md +257 -0
  8. package/CandlestickChart/CandlestickChart.js +18 -0
  9. package/CandlestickChart/CandlestickChart.mjs +18 -0
  10. package/CandlestickChart/CandlestickPlot.js +27 -31
  11. package/CandlestickChart/CandlestickPlot.mjs +27 -31
  12. package/CandlestickChart/CandlestickWebGLProgram.js +0 -3
  13. package/CandlestickChart/CandlestickWebGLProgram.mjs +0 -3
  14. package/CandlestickChart/seriesConfig/getSeriesWithDefaultValues.d.mts +1 -0
  15. package/CandlestickChart/seriesConfig/getSeriesWithDefaultValues.d.ts +1 -0
  16. package/CandlestickChart/seriesConfig/seriesProcessor.js +21 -13
  17. package/CandlestickChart/seriesConfig/seriesProcessor.mjs +21 -13
  18. package/ChartsDataProviderPremium/ChartsDataProviderPremium.js +2 -2
  19. package/ChartsDataProviderPremium/ChartsDataProviderPremium.mjs +2 -2
  20. package/ChartsRadialDataProvider/index.d.mts +1 -0
  21. package/ChartsRadialDataProvider/index.d.ts +1 -0
  22. package/ChartsRadialDataProvider/index.js +16 -0
  23. package/ChartsRadialDataProvider/index.mjs +2 -0
  24. package/ChartsRadialDataProviderPremium/ChartsRadialDataProviderPremium.d.mts +35 -0
  25. package/ChartsRadialDataProviderPremium/ChartsRadialDataProviderPremium.d.ts +35 -0
  26. package/ChartsRadialDataProviderPremium/ChartsRadialDataProviderPremium.js +126 -0
  27. package/ChartsRadialDataProviderPremium/ChartsRadialDataProviderPremium.mjs +120 -0
  28. package/ChartsRadialDataProviderPremium/ChartsRadialDataProviderPremium.plugins.d.mts +5 -0
  29. package/ChartsRadialDataProviderPremium/ChartsRadialDataProviderPremium.plugins.d.ts +5 -0
  30. package/ChartsRadialDataProviderPremium/ChartsRadialDataProviderPremium.plugins.js +9 -0
  31. package/ChartsRadialDataProviderPremium/ChartsRadialDataProviderPremium.plugins.mjs +3 -0
  32. package/ChartsRadialDataProviderPremium/index.d.mts +3 -0
  33. package/ChartsRadialDataProviderPremium/index.d.ts +3 -0
  34. package/ChartsRadialDataProviderPremium/index.js +20 -0
  35. package/ChartsRadialDataProviderPremium/index.mjs +3 -0
  36. package/ChartsRadialDataProviderPremium/useChartsRadialDataProviderPremiumProps.d.mts +10 -0
  37. package/ChartsRadialDataProviderPremium/useChartsRadialDataProviderPremiumProps.d.ts +10 -0
  38. package/ChartsRadialDataProviderPremium/useChartsRadialDataProviderPremiumProps.js +25 -0
  39. package/ChartsRadialDataProviderPremium/useChartsRadialDataProviderPremiumProps.mjs +19 -0
  40. package/ChartsRadialGrid/index.d.mts +1 -0
  41. package/ChartsRadialGrid/index.d.ts +1 -0
  42. package/ChartsRadialGrid/index.js +16 -0
  43. package/ChartsRadialGrid/index.mjs +2 -0
  44. package/ChartsRadiusAxis/index.d.mts +1 -0
  45. package/ChartsRadiusAxis/index.d.ts +1 -0
  46. package/ChartsRadiusAxis/index.js +16 -0
  47. package/ChartsRadiusAxis/index.mjs +2 -0
  48. package/ChartsRotationAxis/index.d.mts +1 -0
  49. package/ChartsRotationAxis/index.d.ts +1 -0
  50. package/ChartsRotationAxis/index.js +16 -0
  51. package/ChartsRotationAxis/index.mjs +2 -0
  52. package/ChartsWebGLLayer/ChartsWebGLContext.d.mts +5 -0
  53. package/ChartsWebGLLayer/ChartsWebGLContext.d.ts +5 -0
  54. package/ChartsWebGLLayer/ChartsWebGLContext.js +31 -0
  55. package/ChartsWebGLLayer/ChartsWebGLContext.mjs +23 -0
  56. package/ChartsWebGLLayer/ChartsWebGLLayer.d.mts +0 -1
  57. package/ChartsWebGLLayer/ChartsWebGLLayer.d.ts +0 -1
  58. package/ChartsWebGLLayer/ChartsWebGLLayer.js +63 -12
  59. package/ChartsWebGLLayer/ChartsWebGLLayer.mjs +62 -10
  60. package/ChartsWebGLLayer/ChartsWebGLLayer.types.d.mts +26 -0
  61. package/ChartsWebGLLayer/ChartsWebGLLayer.types.d.ts +26 -0
  62. package/ChartsWebGLLayer/ChartsWebGLLayer.types.js +5 -0
  63. package/ChartsWebGLLayer/ChartsWebGLLayer.types.mjs +1 -0
  64. package/ChartsWebGLLayer/ChartsWebGLOrderContext.d.mts +6 -0
  65. package/ChartsWebGLLayer/ChartsWebGLOrderContext.d.ts +6 -0
  66. package/ChartsWebGLLayer/ChartsWebGLOrderContext.js +15 -0
  67. package/ChartsWebGLLayer/ChartsWebGLOrderContext.mjs +10 -0
  68. package/HeatmapPremium/HeatmapPlotPremium.js +2 -2
  69. package/HeatmapPremium/HeatmapPlotPremium.mjs +2 -2
  70. package/HeatmapPremium/HeatmapPremium.js +4 -1
  71. package/HeatmapPremium/HeatmapPremium.mjs +4 -1
  72. package/HeatmapPremium/webgl/HeatmapWebGLPlot.js +26 -33
  73. package/HeatmapPremium/webgl/HeatmapWebGLPlot.mjs +26 -33
  74. package/RadialBarChart/seriesConfig/axisTooltipGetter.d.mts +2 -0
  75. package/RadialBarChart/seriesConfig/axisTooltipGetter.d.ts +2 -0
  76. package/RadialBarChart/seriesConfig/axisTooltipGetter.js +13 -0
  77. package/RadialBarChart/seriesConfig/axisTooltipGetter.mjs +6 -0
  78. package/RadialBarChart/seriesConfig/descriptionGetter.d.mts +3 -0
  79. package/RadialBarChart/seriesConfig/descriptionGetter.d.ts +3 -0
  80. package/RadialBarChart/seriesConfig/descriptionGetter.js +34 -0
  81. package/RadialBarChart/seriesConfig/descriptionGetter.mjs +28 -0
  82. package/RadialBarChart/seriesConfig/extremums.d.mts +3 -0
  83. package/RadialBarChart/seriesConfig/extremums.d.ts +3 -0
  84. package/RadialBarChart/seriesConfig/extremums.js +44 -0
  85. package/RadialBarChart/seriesConfig/extremums.mjs +36 -0
  86. package/RadialBarChart/seriesConfig/getColor.d.mts +3 -0
  87. package/RadialBarChart/seriesConfig/getColor.d.ts +3 -0
  88. package/RadialBarChart/seriesConfig/getColor.js +61 -0
  89. package/RadialBarChart/seriesConfig/getColor.mjs +55 -0
  90. package/RadialBarChart/seriesConfig/getSeriesWithDefaultValues.d.mts +3 -0
  91. package/RadialBarChart/seriesConfig/getSeriesWithDefaultValues.d.ts +3 -0
  92. package/RadialBarChart/seriesConfig/getSeriesWithDefaultValues.js +16 -0
  93. package/RadialBarChart/seriesConfig/getSeriesWithDefaultValues.mjs +9 -0
  94. package/RadialBarChart/seriesConfig/index.d.mts +2 -0
  95. package/RadialBarChart/seriesConfig/index.d.ts +2 -0
  96. package/RadialBarChart/seriesConfig/index.js +37 -0
  97. package/RadialBarChart/seriesConfig/index.mjs +30 -0
  98. package/RadialBarChart/seriesConfig/keyboardFocusHandler.d.mts +3 -0
  99. package/RadialBarChart/seriesConfig/keyboardFocusHandler.d.ts +3 -0
  100. package/RadialBarChart/seriesConfig/keyboardFocusHandler.js +9 -0
  101. package/RadialBarChart/seriesConfig/keyboardFocusHandler.mjs +3 -0
  102. package/RadialBarChart/seriesConfig/legend.d.mts +3 -0
  103. package/RadialBarChart/seriesConfig/legend.d.ts +3 -0
  104. package/RadialBarChart/seriesConfig/legend.js +9 -0
  105. package/RadialBarChart/seriesConfig/legend.mjs +3 -0
  106. package/RadialBarChart/seriesConfig/seriesProcessor.d.mts +3 -0
  107. package/RadialBarChart/seriesConfig/seriesProcessor.d.ts +3 -0
  108. package/RadialBarChart/seriesConfig/seriesProcessor.js +137 -0
  109. package/RadialBarChart/seriesConfig/seriesProcessor.mjs +130 -0
  110. package/RadialBarChart/seriesConfig/tooltip.d.mts +3 -0
  111. package/RadialBarChart/seriesConfig/tooltip.d.ts +3 -0
  112. package/RadialBarChart/seriesConfig/tooltip.js +34 -0
  113. package/RadialBarChart/seriesConfig/tooltip.mjs +28 -0
  114. package/RadialBarChart/seriesConfig/tooltipPosition.d.mts +3 -0
  115. package/RadialBarChart/seriesConfig/tooltipPosition.d.ts +3 -0
  116. package/RadialBarChart/seriesConfig/tooltipPosition.js +11 -0
  117. package/RadialBarChart/seriesConfig/tooltipPosition.mjs +5 -0
  118. package/RadialLineChart/RadialArea.d.mts +12 -0
  119. package/RadialLineChart/RadialArea.d.ts +12 -0
  120. package/RadialLineChart/RadialArea.js +33 -0
  121. package/RadialLineChart/RadialArea.mjs +26 -0
  122. package/RadialLineChart/RadialAreaPlot.d.mts +5 -0
  123. package/RadialLineChart/RadialAreaPlot.d.ts +5 -0
  124. package/RadialLineChart/RadialAreaPlot.js +51 -0
  125. package/RadialLineChart/RadialAreaPlot.mjs +45 -0
  126. package/RadialLineChart/RadialLine.d.mts +12 -0
  127. package/RadialLineChart/RadialLine.d.ts +12 -0
  128. package/RadialLineChart/RadialLine.js +33 -0
  129. package/RadialLineChart/RadialLine.mjs +26 -0
  130. package/RadialLineChart/RadialLineChart.d.mts +62 -0
  131. package/RadialLineChart/RadialLineChart.d.ts +62 -0
  132. package/RadialLineChart/RadialLineChart.js +967 -0
  133. package/RadialLineChart/RadialLineChart.mjs +960 -0
  134. package/RadialLineChart/RadialLineChart.plugins.d.mts +4 -0
  135. package/RadialLineChart/RadialLineChart.plugins.d.ts +4 -0
  136. package/RadialLineChart/RadialLineChart.plugins.js +9 -0
  137. package/RadialLineChart/RadialLineChart.plugins.mjs +3 -0
  138. package/RadialLineChart/RadialLinePlot.d.mts +5 -0
  139. package/RadialLineChart/RadialLinePlot.d.ts +5 -0
  140. package/RadialLineChart/RadialLinePlot.js +50 -0
  141. package/RadialLineChart/RadialLinePlot.mjs +44 -0
  142. package/RadialLineChart/RadialMarkPlot.d.mts +5 -0
  143. package/RadialLineChart/RadialMarkPlot.d.ts +5 -0
  144. package/RadialLineChart/RadialMarkPlot.js +48 -0
  145. package/RadialLineChart/RadialMarkPlot.mjs +42 -0
  146. package/RadialLineChart/index.d.mts +4 -0
  147. package/RadialLineChart/index.d.ts +4 -0
  148. package/RadialLineChart/index.js +49 -0
  149. package/RadialLineChart/index.mjs +4 -0
  150. package/RadialLineChart/radialLineClasses.d.mts +25 -0
  151. package/RadialLineChart/radialLineClasses.d.ts +25 -0
  152. package/RadialLineChart/radialLineClasses.js +30 -0
  153. package/RadialLineChart/radialLineClasses.mjs +21 -0
  154. package/RadialLineChart/seriesConfig/axisTooltipGetter.d.mts +2 -0
  155. package/RadialLineChart/seriesConfig/axisTooltipGetter.d.ts +2 -0
  156. package/RadialLineChart/seriesConfig/axisTooltipGetter.js +13 -0
  157. package/RadialLineChart/seriesConfig/axisTooltipGetter.mjs +6 -0
  158. package/RadialLineChart/seriesConfig/descriptionGetter.d.mts +3 -0
  159. package/RadialLineChart/seriesConfig/descriptionGetter.d.ts +3 -0
  160. package/RadialLineChart/seriesConfig/descriptionGetter.js +39 -0
  161. package/RadialLineChart/seriesConfig/descriptionGetter.mjs +33 -0
  162. package/RadialLineChart/seriesConfig/extremums.d.mts +3 -0
  163. package/RadialLineChart/seriesConfig/extremums.d.ts +3 -0
  164. package/RadialLineChart/seriesConfig/extremums.js +48 -0
  165. package/RadialLineChart/seriesConfig/extremums.mjs +40 -0
  166. package/RadialLineChart/seriesConfig/getColor.d.mts +3 -0
  167. package/RadialLineChart/seriesConfig/getColor.d.ts +3 -0
  168. package/RadialLineChart/seriesConfig/getColor.js +61 -0
  169. package/RadialLineChart/seriesConfig/getColor.mjs +55 -0
  170. package/RadialLineChart/seriesConfig/getSeriesWithDefaultValues.d.mts +3 -0
  171. package/RadialLineChart/seriesConfig/getSeriesWithDefaultValues.d.ts +3 -0
  172. package/RadialLineChart/seriesConfig/getSeriesWithDefaultValues.js +13 -0
  173. package/RadialLineChart/seriesConfig/getSeriesWithDefaultValues.mjs +6 -0
  174. package/RadialLineChart/seriesConfig/index.d.mts +2 -0
  175. package/RadialLineChart/seriesConfig/index.d.ts +2 -0
  176. package/RadialLineChart/seriesConfig/index.js +37 -0
  177. package/RadialLineChart/seriesConfig/index.mjs +30 -0
  178. package/RadialLineChart/seriesConfig/keyboardFocusHandler.d.mts +3 -0
  179. package/RadialLineChart/seriesConfig/keyboardFocusHandler.d.ts +3 -0
  180. package/RadialLineChart/seriesConfig/keyboardFocusHandler.js +9 -0
  181. package/RadialLineChart/seriesConfig/keyboardFocusHandler.mjs +3 -0
  182. package/RadialLineChart/seriesConfig/legend.d.mts +3 -0
  183. package/RadialLineChart/seriesConfig/legend.d.ts +3 -0
  184. package/RadialLineChart/seriesConfig/legend.js +29 -0
  185. package/RadialLineChart/seriesConfig/legend.mjs +23 -0
  186. package/RadialLineChart/seriesConfig/seriesProcessor.d.mts +3 -0
  187. package/RadialLineChart/seriesConfig/seriesProcessor.d.ts +3 -0
  188. package/RadialLineChart/seriesConfig/seriesProcessor.js +142 -0
  189. package/RadialLineChart/seriesConfig/seriesProcessor.mjs +135 -0
  190. package/RadialLineChart/seriesConfig/tooltip.d.mts +3 -0
  191. package/RadialLineChart/seriesConfig/tooltip.d.ts +3 -0
  192. package/RadialLineChart/seriesConfig/tooltip.js +32 -0
  193. package/RadialLineChart/seriesConfig/tooltip.mjs +26 -0
  194. package/RadialLineChart/seriesConfig/tooltipPosition.d.mts +3 -0
  195. package/RadialLineChart/seriesConfig/tooltipPosition.d.ts +3 -0
  196. package/RadialLineChart/seriesConfig/tooltipPosition.js +11 -0
  197. package/RadialLineChart/seriesConfig/tooltipPosition.mjs +5 -0
  198. package/RadialLineChart/useRadialLineChartProps.d.mts +28 -0
  199. package/RadialLineChart/useRadialLineChartProps.d.ts +28 -0
  200. package/RadialLineChart/useRadialLineChartProps.js +99 -0
  201. package/RadialLineChart/useRadialLineChartProps.mjs +92 -0
  202. package/RadialLineChart/useRadialLinePlotData.d.mts +19 -0
  203. package/RadialLineChart/useRadialLinePlotData.d.ts +19 -0
  204. package/RadialLineChart/useRadialLinePlotData.js +79 -0
  205. package/RadialLineChart/useRadialLinePlotData.mjs +72 -0
  206. package/hooks/useRadialLineSeries.d.mts +34 -0
  207. package/hooks/useRadialLineSeries.d.ts +34 -0
  208. package/hooks/useRadialLineSeries.js +45 -0
  209. package/hooks/useRadialLineSeries.mjs +40 -0
  210. package/index.d.mts +7 -1
  211. package/index.d.ts +7 -1
  212. package/index.js +69 -1
  213. package/index.mjs +8 -2
  214. package/models/seriesType/index.d.mts +3 -1
  215. package/models/seriesType/index.d.ts +3 -1
  216. package/models/seriesType/index.js +22 -0
  217. package/models/seriesType/index.mjs +3 -1
  218. package/models/seriesType/ohlc.d.mts +7 -1
  219. package/models/seriesType/ohlc.d.ts +7 -1
  220. package/models/seriesType/radialBar.d.mts +23 -0
  221. package/models/seriesType/radialBar.d.ts +23 -0
  222. package/models/seriesType/radialBar.js +5 -0
  223. package/models/seriesType/radialBar.mjs +1 -0
  224. package/models/seriesType/radialLine.d.mts +26 -0
  225. package/models/seriesType/radialLine.d.ts +26 -0
  226. package/models/seriesType/radialLine.js +5 -0
  227. package/models/seriesType/radialLine.mjs +1 -0
  228. package/models/seriesType/rangeBar.d.mts +7 -1
  229. package/models/seriesType/rangeBar.d.ts +7 -1
  230. package/package.json +90 -6
  231. package/typeOverloads/modules.d.mts +48 -2
  232. package/typeOverloads/modules.d.ts +48 -2
  233. package/utils/webgl/useWebGLResizeObserver.d.mts +3 -2
  234. package/utils/webgl/useWebGLResizeObserver.d.ts +3 -2
  235. package/utils/webgl/useWebGLResizeObserver.js +3 -4
  236. package/utils/webgl/useWebGLResizeObserver.mjs +3 -4
  237. package/HeatmapPremium/webgl/HeatmapWebGLRenderer.d.mts +0 -4
  238. package/HeatmapPremium/webgl/HeatmapWebGLRenderer.d.ts +0 -4
  239. package/HeatmapPremium/webgl/HeatmapWebGLRenderer.js +0 -21
  240. package/HeatmapPremium/webgl/HeatmapWebGLRenderer.mjs +0 -15
@@ -1,3 +1,2 @@
1
1
  import * as React from 'react';
2
- export declare function useWebGLContext(): WebGL2RenderingContext | null;
3
2
  export declare const ChartsWebGLLayer: React.ForwardRefExoticComponent<Omit<React.PropsWithChildren<React.DetailedHTMLProps<React.CanvasHTMLAttributes<HTMLCanvasElement>, HTMLCanvasElement>>, "ref"> & React.RefAttributes<HTMLCanvasElement>>;
@@ -7,32 +7,75 @@ Object.defineProperty(exports, "__esModule", {
7
7
  value: true
8
8
  });
9
9
  exports.ChartsWebGLLayer = void 0;
10
- exports.useWebGLContext = useWebGLContext;
11
10
  var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
12
11
  var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutPropertiesLoose"));
13
12
  var React = _interopRequireWildcard(require("react"));
14
13
  var _useForkRef = _interopRequireDefault(require("@mui/utils/useForkRef"));
15
14
  var _internals = require("@mui/x-charts/internals");
16
15
  var _hooks = require("@mui/x-charts/hooks");
16
+ var _useWebGLResizeObserver = require("../utils/webgl/useWebGLResizeObserver");
17
+ var _ChartsWebGLContext = require("./ChartsWebGLContext");
18
+ var _ChartsWebGLOrderContext = require("./ChartsWebGLOrderContext");
17
19
  var _jsxRuntime = require("react/jsx-runtime");
18
20
  const _excluded = ["children"],
19
21
  _excluded2 = ["children"];
20
- const ChartsWebGLContext = /*#__PURE__*/React.createContext(null);
21
- if (process.env.NODE_ENV !== "production") ChartsWebGLContext.displayName = "ChartsWebGLContext";
22
- function useWebGLContext() {
23
- return React.useContext(ChartsWebGLContext);
24
- }
25
22
  const ChartsWebGLLayer = exports.ChartsWebGLLayer = /*#__PURE__*/React.forwardRef(function WebGLProvider(_ref, ref) {
26
23
  let {
27
24
  children
28
25
  } = _ref,
29
26
  props = (0, _objectWithoutPropertiesLoose2.default)(_ref, _excluded);
30
27
  const canvasRef = React.useRef(null);
31
- const [context, setContext] = React.useState(null);
28
+ const [glContext, setGlContext] = React.useState(null);
32
29
  const handleRef = (0, _useForkRef.default)(canvasRef, ref);
33
30
  const chartRoot = (0, _hooks.useChartRootRef)().current;
34
31
  const drawingArea = (0, _hooks.useDrawingArea)();
35
32
  const [, rerender] = React.useReducer(s => s + 1, 0);
33
+ const drawEntriesRef = React.useRef([]);
34
+ const renderScheduledRef = React.useRef(false);
35
+ const renderAll = React.useCallback(() => {
36
+ if (!glContext) {
37
+ return;
38
+ }
39
+ renderScheduledRef.current = false;
40
+ glContext.clearColor(0, 0, 0, 0.0);
41
+ glContext.clear(glContext.COLOR_BUFFER_BIT);
42
+ // Sort by order so z-order matches children's position in ChartsWebGLLayer,
43
+ // stable across remount.
44
+ const sorted = [...drawEntriesRef.current].sort((a, b) => a.order - b.order);
45
+ for (const {
46
+ drawRef
47
+ } of sorted) {
48
+ drawRef.current?.();
49
+ }
50
+ }, [glContext]);
51
+ const registerDraw = React.useCallback((drawRef, order) => {
52
+ const entry = {
53
+ drawRef,
54
+ order
55
+ };
56
+ drawEntriesRef.current.push(entry);
57
+ return () => {
58
+ const idx = drawEntriesRef.current.indexOf(entry);
59
+ if (idx >= 0) {
60
+ drawEntriesRef.current.splice(idx, 1);
61
+ }
62
+ };
63
+ }, []);
64
+ const requestRender = React.useCallback(() => {
65
+ renderScheduledRef.current = true;
66
+ // Trigger a re-render so the flush effect runs, even if only a child's state changed
67
+ rerender();
68
+ }, []);
69
+
70
+ // Centralized resize handling — render all plots on canvas resize
71
+ (0, _useWebGLResizeObserver.useWebGLResizeObserver)(glContext, renderAll);
72
+
73
+ // Flush scheduled renders after all children's effects have run
74
+ React.useEffect(() => {
75
+ if (renderScheduledRef.current) {
76
+ renderAll();
77
+ }
78
+ });
36
79
  React.useEffect(() => {
37
80
  /* The chart root isn't available on first render because the ref is only set after mounting the root component. */
38
81
  if (!chartRoot) {
@@ -48,7 +91,7 @@ const ChartsWebGLLayer = exports.ChartsWebGLLayer = /*#__PURE__*/React.forwardRe
48
91
  // Must prevent default otherwise the context won't be marked as restorable
49
92
  // https://registry.khronos.org/webgl/extensions/WEBGL_lose_context/
50
93
  event.preventDefault();
51
- setContext(null);
94
+ setGlContext(null);
52
95
  };
53
96
  const initializeContext = () => {
54
97
  const ctx = canvas.getContext('webgl2', {
@@ -60,7 +103,7 @@ const ChartsWebGLLayer = exports.ChartsWebGLLayer = /*#__PURE__*/React.forwardRe
60
103
  if (!ctx) {
61
104
  return;
62
105
  }
63
- setContext(ctx);
106
+ setGlContext(ctx);
64
107
  };
65
108
  canvas.addEventListener('webglcontextlost', handleContextLost);
66
109
  canvas.addEventListener('webglcontextrestored', initializeContext);
@@ -70,11 +113,16 @@ const ChartsWebGLLayer = exports.ChartsWebGLLayer = /*#__PURE__*/React.forwardRe
70
113
  canvas.removeEventListener('webglcontextrestored', initializeContext);
71
114
  };
72
115
  }, [chartRoot]);
116
+ const contextValue = React.useMemo(() => glContext ? {
117
+ gl: glContext,
118
+ registerDraw,
119
+ requestRender
120
+ } : null, [glContext, registerDraw, requestRender]);
73
121
  if (!chartRoot) {
74
122
  return null;
75
123
  }
76
- return /*#__PURE__*/(0, _jsxRuntime.jsxs)(ChartsWebGLContext.Provider, {
77
- value: context,
124
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_ChartsWebGLContext.ChartsWebGLContext.Provider, {
125
+ value: contextValue,
78
126
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(CanvasPositioner, {
79
127
  "aria-hidden": "true",
80
128
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)("canvas", (0, _extends2.default)({
@@ -88,7 +136,10 @@ const ChartsWebGLLayer = exports.ChartsWebGLLayer = /*#__PURE__*/React.forwardRe
88
136
  height: drawingArea.height
89
137
  }
90
138
  }))
91
- }), children]
139
+ }), React.Children.map(children, (child, index) => /*#__PURE__*/(0, _jsxRuntime.jsx)(_ChartsWebGLOrderContext.ChartsWebGLOrderContext.Provider, {
140
+ value: index,
141
+ children: child
142
+ }))]
92
143
  });
93
144
  });
94
145
  if (process.env.NODE_ENV !== "production") ChartsWebGLLayer.displayName = "ChartsWebGLLayer";
@@ -8,23 +8,67 @@ import * as React from 'react';
8
8
  import useForkRef from '@mui/utils/useForkRef';
9
9
  import { selectorChartSvgHeight, selectorChartSvgWidth, useStore } from '@mui/x-charts/internals';
10
10
  import { useDrawingArea, useChartRootRef } from '@mui/x-charts/hooks';
11
+ import { useWebGLResizeObserver } from "../utils/webgl/useWebGLResizeObserver.mjs";
12
+ import { ChartsWebGLContext } from "./ChartsWebGLContext.mjs";
13
+ import { ChartsWebGLOrderContext } from "./ChartsWebGLOrderContext.mjs";
11
14
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
12
- const ChartsWebGLContext = /*#__PURE__*/React.createContext(null);
13
- if (process.env.NODE_ENV !== "production") ChartsWebGLContext.displayName = "ChartsWebGLContext";
14
- export function useWebGLContext() {
15
- return React.useContext(ChartsWebGLContext);
16
- }
17
15
  export const ChartsWebGLLayer = /*#__PURE__*/React.forwardRef(function WebGLProvider(_ref, ref) {
18
16
  let {
19
17
  children
20
18
  } = _ref,
21
19
  props = _objectWithoutPropertiesLoose(_ref, _excluded);
22
20
  const canvasRef = React.useRef(null);
23
- const [context, setContext] = React.useState(null);
21
+ const [glContext, setGlContext] = React.useState(null);
24
22
  const handleRef = useForkRef(canvasRef, ref);
25
23
  const chartRoot = useChartRootRef().current;
26
24
  const drawingArea = useDrawingArea();
27
25
  const [, rerender] = React.useReducer(s => s + 1, 0);
26
+ const drawEntriesRef = React.useRef([]);
27
+ const renderScheduledRef = React.useRef(false);
28
+ const renderAll = React.useCallback(() => {
29
+ if (!glContext) {
30
+ return;
31
+ }
32
+ renderScheduledRef.current = false;
33
+ glContext.clearColor(0, 0, 0, 0.0);
34
+ glContext.clear(glContext.COLOR_BUFFER_BIT);
35
+ // Sort by order so z-order matches children's position in ChartsWebGLLayer,
36
+ // stable across remount.
37
+ const sorted = [...drawEntriesRef.current].sort((a, b) => a.order - b.order);
38
+ for (const {
39
+ drawRef
40
+ } of sorted) {
41
+ drawRef.current?.();
42
+ }
43
+ }, [glContext]);
44
+ const registerDraw = React.useCallback((drawRef, order) => {
45
+ const entry = {
46
+ drawRef,
47
+ order
48
+ };
49
+ drawEntriesRef.current.push(entry);
50
+ return () => {
51
+ const idx = drawEntriesRef.current.indexOf(entry);
52
+ if (idx >= 0) {
53
+ drawEntriesRef.current.splice(idx, 1);
54
+ }
55
+ };
56
+ }, []);
57
+ const requestRender = React.useCallback(() => {
58
+ renderScheduledRef.current = true;
59
+ // Trigger a re-render so the flush effect runs, even if only a child's state changed
60
+ rerender();
61
+ }, []);
62
+
63
+ // Centralized resize handling — render all plots on canvas resize
64
+ useWebGLResizeObserver(glContext, renderAll);
65
+
66
+ // Flush scheduled renders after all children's effects have run
67
+ React.useEffect(() => {
68
+ if (renderScheduledRef.current) {
69
+ renderAll();
70
+ }
71
+ });
28
72
  React.useEffect(() => {
29
73
  /* The chart root isn't available on first render because the ref is only set after mounting the root component. */
30
74
  if (!chartRoot) {
@@ -40,7 +84,7 @@ export const ChartsWebGLLayer = /*#__PURE__*/React.forwardRef(function WebGLProv
40
84
  // Must prevent default otherwise the context won't be marked as restorable
41
85
  // https://registry.khronos.org/webgl/extensions/WEBGL_lose_context/
42
86
  event.preventDefault();
43
- setContext(null);
87
+ setGlContext(null);
44
88
  };
45
89
  const initializeContext = () => {
46
90
  const ctx = canvas.getContext('webgl2', {
@@ -52,7 +96,7 @@ export const ChartsWebGLLayer = /*#__PURE__*/React.forwardRef(function WebGLProv
52
96
  if (!ctx) {
53
97
  return;
54
98
  }
55
- setContext(ctx);
99
+ setGlContext(ctx);
56
100
  };
57
101
  canvas.addEventListener('webglcontextlost', handleContextLost);
58
102
  canvas.addEventListener('webglcontextrestored', initializeContext);
@@ -62,11 +106,16 @@ export const ChartsWebGLLayer = /*#__PURE__*/React.forwardRef(function WebGLProv
62
106
  canvas.removeEventListener('webglcontextrestored', initializeContext);
63
107
  };
64
108
  }, [chartRoot]);
109
+ const contextValue = React.useMemo(() => glContext ? {
110
+ gl: glContext,
111
+ registerDraw,
112
+ requestRender
113
+ } : null, [glContext, registerDraw, requestRender]);
65
114
  if (!chartRoot) {
66
115
  return null;
67
116
  }
68
117
  return /*#__PURE__*/_jsxs(ChartsWebGLContext.Provider, {
69
- value: context,
118
+ value: contextValue,
70
119
  children: [/*#__PURE__*/_jsx(CanvasPositioner, {
71
120
  "aria-hidden": "true",
72
121
  children: /*#__PURE__*/_jsx("canvas", _extends({
@@ -80,7 +129,10 @@ export const ChartsWebGLLayer = /*#__PURE__*/React.forwardRef(function WebGLProv
80
129
  height: drawingArea.height
81
130
  }
82
131
  }))
83
- }), children]
132
+ }), React.Children.map(children, (child, index) => /*#__PURE__*/_jsx(ChartsWebGLOrderContext.Provider, {
133
+ value: index,
134
+ children: child
135
+ }))]
84
136
  });
85
137
  });
86
138
  if (process.env.NODE_ENV !== "production") ChartsWebGLLayer.displayName = "ChartsWebGLLayer";
@@ -0,0 +1,26 @@
1
+ import type * as React from 'react';
2
+ export type DrawEntry = {
3
+ drawRef: React.RefObject<(() => void) | null>;
4
+ order: number;
5
+ };
6
+ export interface ChartsWebGLContextValue {
7
+ gl: WebGL2RenderingContext;
8
+ /**
9
+ * Register a draw callback ref. Returns an unregister function.
10
+ * Callbacks are sorted by the provided `order` number so z-order follows the children's position
11
+ * in `ChartsWebGLLayer`, stable across unmount/remount (e.g. toggled via series visibility).
12
+ * @param {React.RefObject} drawRef A ref object whose current property is a draw callback function. The callback will be called with the WebGL context already set to this layer's canvas. Set to null to temporarily disable drawing without unregistering.
13
+ * @param {number} order Z-order index. Lower values draw first (behind higher values).
14
+ * @returns {Function} Unregister function to remove the draw callback from the layer.
15
+ */
16
+ registerDraw: (drawRef: React.RefObject<(() => void) | null>, order: number) => () => void;
17
+ /**
18
+ * Request a render frame. The layer will clear once, then call all registered draw callbacks in order.
19
+ */
20
+ requestRender: () => void;
21
+ }
22
+ export interface UseWebGLLayerValue {
23
+ gl: WebGL2RenderingContext;
24
+ registerDraw: (drawRef: React.RefObject<(() => void) | null>) => () => void;
25
+ requestRender: () => void;
26
+ }
@@ -0,0 +1,26 @@
1
+ import type * as React from 'react';
2
+ export type DrawEntry = {
3
+ drawRef: React.RefObject<(() => void) | null>;
4
+ order: number;
5
+ };
6
+ export interface ChartsWebGLContextValue {
7
+ gl: WebGL2RenderingContext;
8
+ /**
9
+ * Register a draw callback ref. Returns an unregister function.
10
+ * Callbacks are sorted by the provided `order` number so z-order follows the children's position
11
+ * in `ChartsWebGLLayer`, stable across unmount/remount (e.g. toggled via series visibility).
12
+ * @param {React.RefObject} drawRef A ref object whose current property is a draw callback function. The callback will be called with the WebGL context already set to this layer's canvas. Set to null to temporarily disable drawing without unregistering.
13
+ * @param {number} order Z-order index. Lower values draw first (behind higher values).
14
+ * @returns {Function} Unregister function to remove the draw callback from the layer.
15
+ */
16
+ registerDraw: (drawRef: React.RefObject<(() => void) | null>, order: number) => () => void;
17
+ /**
18
+ * Request a render frame. The layer will clear once, then call all registered draw callbacks in order.
19
+ */
20
+ requestRender: () => void;
21
+ }
22
+ export interface UseWebGLLayerValue {
23
+ gl: WebGL2RenderingContext;
24
+ registerDraw: (drawRef: React.RefObject<(() => void) | null>) => () => void;
25
+ requestRender: () => void;
26
+ }
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,6 @@
1
+ import * as React from 'react';
2
+ /**
3
+ * Provides the z-order index for a plot based on its position in `ChartsWebGLLayer`'s children.
4
+ * `useWebGLLayer` reads this and auto-binds it to `registerDraw` so consumers don't pass it manually.
5
+ */
6
+ export declare const ChartsWebGLOrderContext: React.Context<number>;
@@ -0,0 +1,6 @@
1
+ import * as React from 'react';
2
+ /**
3
+ * Provides the z-order index for a plot based on its position in `ChartsWebGLLayer`'s children.
4
+ * `useWebGLLayer` reads this and auto-binds it to `registerDraw` so consumers don't pass it manually.
5
+ */
6
+ export declare const ChartsWebGLOrderContext: React.Context<number>;
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ 'use client';
3
+
4
+ var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.ChartsWebGLOrderContext = void 0;
9
+ var React = _interopRequireWildcard(require("react"));
10
+ /**
11
+ * Provides the z-order index for a plot based on its position in `ChartsWebGLLayer`'s children.
12
+ * `useWebGLLayer` reads this and auto-binds it to `registerDraw` so consumers don't pass it manually.
13
+ */
14
+ const ChartsWebGLOrderContext = exports.ChartsWebGLOrderContext = /*#__PURE__*/React.createContext(0);
15
+ if (process.env.NODE_ENV !== "production") ChartsWebGLOrderContext.displayName = "ChartsWebGLOrderContext";
@@ -0,0 +1,10 @@
1
+ 'use client';
2
+
3
+ import * as React from 'react';
4
+
5
+ /**
6
+ * Provides the z-order index for a plot based on its position in `ChartsWebGLLayer`'s children.
7
+ * `useWebGLLayer` reads this and auto-binds it to `registerDraw` so consumers don't pass it manually.
8
+ */
9
+ export const ChartsWebGLOrderContext = /*#__PURE__*/React.createContext(0);
10
+ if (process.env.NODE_ENV !== "production") ChartsWebGLOrderContext.displayName = "ChartsWebGLOrderContext";
@@ -9,7 +9,7 @@ exports.HeatmapPlotPremium = HeatmapPlotPremium;
9
9
  var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
10
10
  var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutPropertiesLoose"));
11
11
  var _internals = require("@mui/x-charts-pro/internals");
12
- var _HeatmapWebGLRenderer = require("./webgl/HeatmapWebGLRenderer");
12
+ var _HeatmapWebGLPlot = require("./webgl/HeatmapWebGLPlot");
13
13
  var _jsxRuntime = require("react/jsx-runtime");
14
14
  const _excluded = ["renderer", "borderRadius"];
15
15
  function HeatmapPlotPremium(_ref) {
@@ -19,7 +19,7 @@ function HeatmapPlotPremium(_ref) {
19
19
  } = _ref,
20
20
  props = (0, _objectWithoutPropertiesLoose2.default)(_ref, _excluded);
21
21
  if (renderer === 'webgl') {
22
- return /*#__PURE__*/(0, _jsxRuntime.jsx)(_HeatmapWebGLRenderer.HeatmapWebGLRenderer, {
22
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_HeatmapWebGLPlot.HeatmapWebGLPlot, {
23
23
  borderRadius: borderRadius
24
24
  });
25
25
  }
@@ -4,7 +4,7 @@ import _extends from "@babel/runtime/helpers/esm/extends";
4
4
  import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
5
5
  const _excluded = ["renderer", "borderRadius"];
6
6
  import { HeatmapSVGPlot } from '@mui/x-charts-pro/internals';
7
- import { HeatmapWebGLRenderer } from "./webgl/HeatmapWebGLRenderer.mjs";
7
+ import { HeatmapWebGLPlot } from "./webgl/HeatmapWebGLPlot.mjs";
8
8
  import { jsx as _jsx } from "react/jsx-runtime";
9
9
  export function HeatmapPlotPremium(_ref) {
10
10
  let {
@@ -13,7 +13,7 @@ export function HeatmapPlotPremium(_ref) {
13
13
  } = _ref,
14
14
  props = _objectWithoutPropertiesLoose(_ref, _excluded);
15
15
  if (renderer === 'webgl') {
16
- return /*#__PURE__*/_jsx(HeatmapWebGLRenderer, {
16
+ return /*#__PURE__*/_jsx(HeatmapWebGLPlot, {
17
17
  borderRadius: borderRadius
18
18
  });
19
19
  }
@@ -345,6 +345,7 @@ process.env.NODE_ENV !== "production" ? HeatmapPremium.propTypes = {
345
345
  tickSize: _propTypes.default.number,
346
346
  tickSpacing: _propTypes.default.number,
347
347
  valueFormatter: _propTypes.default.func,
348
+ valueGetter: _propTypes.default.func,
348
349
  zoom: _propTypes.default.oneOfType([_propTypes.default.shape({
349
350
  filterMode: _propTypes.default.oneOf(['discard', 'keep']),
350
351
  maxEnd: _propTypes.default.number,
@@ -425,6 +426,7 @@ process.env.NODE_ENV !== "production" ? HeatmapPremium.propTypes = {
425
426
  tickSize: _propTypes.default.number,
426
427
  tickSpacing: _propTypes.default.number,
427
428
  valueFormatter: _propTypes.default.func,
429
+ valueGetter: _propTypes.default.func,
428
430
  width: _propTypes.default.oneOfType([_propTypes.default.oneOf(['auto']), _propTypes.default.number]),
429
431
  zoom: _propTypes.default.oneOfType([_propTypes.default.shape({
430
432
  filterMode: _propTypes.default.oneOf(['discard', 'keep']),
@@ -465,7 +467,8 @@ process.env.NODE_ENV !== "production" ? HeatmapPremium.propTypes = {
465
467
  dataKey: _propTypes.default.string,
466
468
  id: _propTypes.default.string,
467
469
  max: _propTypes.default.number,
468
- min: _propTypes.default.number
470
+ min: _propTypes.default.number,
471
+ valueGetter: _propTypes.default.func
469
472
  })),
470
473
  /**
471
474
  * The list of zoom data related to each axis.
@@ -338,6 +338,7 @@ process.env.NODE_ENV !== "production" ? HeatmapPremium.propTypes = {
338
338
  tickSize: PropTypes.number,
339
339
  tickSpacing: PropTypes.number,
340
340
  valueFormatter: PropTypes.func,
341
+ valueGetter: PropTypes.func,
341
342
  zoom: PropTypes.oneOfType([PropTypes.shape({
342
343
  filterMode: PropTypes.oneOf(['discard', 'keep']),
343
344
  maxEnd: PropTypes.number,
@@ -418,6 +419,7 @@ process.env.NODE_ENV !== "production" ? HeatmapPremium.propTypes = {
418
419
  tickSize: PropTypes.number,
419
420
  tickSpacing: PropTypes.number,
420
421
  valueFormatter: PropTypes.func,
422
+ valueGetter: PropTypes.func,
421
423
  width: PropTypes.oneOfType([PropTypes.oneOf(['auto']), PropTypes.number]),
422
424
  zoom: PropTypes.oneOfType([PropTypes.shape({
423
425
  filterMode: PropTypes.oneOf(['discard', 'keep']),
@@ -458,7 +460,8 @@ process.env.NODE_ENV !== "production" ? HeatmapPremium.propTypes = {
458
460
  dataKey: PropTypes.string,
459
461
  id: PropTypes.string,
460
462
  max: PropTypes.number,
461
- min: PropTypes.number
463
+ min: PropTypes.number,
464
+ valueGetter: PropTypes.func
462
465
  })),
463
466
  /**
464
467
  * The list of zoom data related to each axis.
@@ -10,24 +10,25 @@ exports.HeatmapWebGLPlot = HeatmapWebGLPlot;
10
10
  var React = _interopRequireWildcard(require("react"));
11
11
  var _hooks = require("@mui/x-charts/hooks");
12
12
  var _useEventCallback = _interopRequireDefault(require("@mui/utils/useEventCallback"));
13
- var _ChartsWebGLLayer = require("../../ChartsWebGLLayer/ChartsWebGLLayer");
13
+ var _ChartsWebGLContext = require("../../ChartsWebGLLayer/ChartsWebGLContext");
14
14
  var _hooks2 = require("../../hooks");
15
15
  var _shaders = require("./shaders");
16
- var _useWebGLResizeObserver = require("../../utils/webgl/useWebGLResizeObserver");
17
16
  var _utils = require("../../utils/webgl/utils");
18
17
  var _useHeatmapPlotData = require("./useHeatmapPlotData");
19
18
  var _jsxRuntime = require("react/jsx-runtime");
20
19
  function HeatmapWebGLPlot({
21
20
  borderRadius
22
21
  }) {
23
- const gl = (0, _ChartsWebGLLayer.useWebGLContext)();
22
+ const layer = (0, _ChartsWebGLContext.useWebGLLayer)();
24
23
  const series = (0, _hooks2.useHeatmapSeriesContext)();
25
24
  const seriesToDisplay = series?.series[series.seriesOrder[0]];
26
- if (!gl || !seriesToDisplay) {
25
+ if (!layer || !seriesToDisplay) {
27
26
  return null;
28
27
  }
29
28
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(HeatmapWebGLPlotImpl, {
30
- gl: gl,
29
+ gl: layer.gl,
30
+ registerDraw: layer.registerDraw,
31
+ requestRender: layer.requestRender,
31
32
  borderRadius: borderRadius ?? 0,
32
33
  series: seriesToDisplay
33
34
  });
@@ -35,6 +36,8 @@ function HeatmapWebGLPlot({
35
36
  function HeatmapWebGLPlotImpl(props) {
36
37
  const {
37
38
  gl,
39
+ registerDraw,
40
+ requestRender,
38
41
  borderRadius,
39
42
  series
40
43
  } = props;
@@ -49,21 +52,16 @@ function HeatmapWebGLPlotImpl(props) {
49
52
  });
50
53
  const [quadBuffer] = React.useState(() => (0, _utils.uploadQuadBuffer)(gl));
51
54
  const dataLength = series.data.length;
52
- const renderScheduledRef = React.useRef(false);
53
- const render = React.useCallback(() => {
54
- renderScheduledRef.current = false;
55
-
56
- // Clear and draw
57
- gl.clearColor(0, 0, 0, 0.0);
58
- gl.clear(gl.COLOR_BUFFER_BIT);
59
- gl.drawArraysInstanced(gl.TRIANGLE_STRIP, 0, 4, dataLength);
60
- }, [dataLength, gl]);
61
- const scheduleRender = React.useCallback(() => {
62
- renderScheduledRef.current = true;
63
- }, []);
64
-
65
- // On resize render directly to avoid a frame where the canvas is blank
66
- (0, _useWebGLResizeObserver.useWebGLResizeObserver)(render);
55
+ const drawRef = React.useRef(null);
56
+ React.useEffect(() => {
57
+ drawRef.current = () => {
58
+ gl.drawArraysInstanced(gl.TRIANGLE_STRIP, 0, 4, dataLength);
59
+ };
60
+ }, [gl, dataLength]);
61
+ React.useEffect(() => {
62
+ const unregister = registerDraw(drawRef);
63
+ return unregister;
64
+ }, [registerDraw]);
67
65
  React.useEffect(() => {
68
66
  /* Enable blending for transparency
69
67
  * These are global to the WebGL context and need to be set only once */
@@ -160,26 +158,21 @@ function HeatmapWebGLPlotImpl(props) {
160
158
  } else {
161
159
  setupBorderRadiusUniform();
162
160
  }
163
- scheduleRender();
164
- }, [gl, program, scheduleRender, seriesBorderRadius, setupBorderRadiusUniform,
161
+ requestRender();
162
+ }, [gl, program, requestRender, seriesBorderRadius, setupBorderRadiusUniform,
165
163
  // We use the event callback versions here because we only want this effect to trigger when the border radius changes
166
164
  setupAttributesEvent, setupUniformsEvent, vertexShader]);
167
165
  React.useEffect(() => {
168
166
  setupResolutionUniform();
169
- scheduleRender();
170
- }, [setupResolutionUniform, scheduleRender]);
167
+ requestRender();
168
+ }, [setupResolutionUniform, requestRender]);
171
169
  React.useEffect(() => {
172
170
  setupRectDimensionsUniform();
173
- scheduleRender();
174
- }, [setupRectDimensionsUniform, scheduleRender]);
171
+ requestRender();
172
+ }, [setupRectDimensionsUniform, requestRender]);
175
173
  React.useEffect(() => {
176
174
  setupAttributes();
177
- scheduleRender();
178
- }, [scheduleRender, setupAttributes]);
179
- React.useEffect(() => {
180
- if (renderScheduledRef.current) {
181
- render();
182
- }
183
- });
175
+ requestRender();
176
+ }, [requestRender, setupAttributes]);
184
177
  return null;
185
178
  }