()
| 4885 | }; |
| 4886 | |
| 4887 | const dispose: RenderCoordinator['dispose'] = () => { |
| 4888 | if (disposed) return; |
| 4889 | disposed = true; |
| 4890 | |
| 4891 | // Story 5.16: stop intro animation and avoid further render requests. |
| 4892 | try { |
| 4893 | if (introAnimId) introAnimController.cancel(introAnimId); |
| 4894 | introAnimController.cancelAll(); |
| 4895 | } catch { |
| 4896 | // best-effort |
| 4897 | } |
| 4898 | introAnimId = null; |
| 4899 | introPhase = 'done'; |
| 4900 | introProgress01 = 1; |
| 4901 | |
| 4902 | // Story 5.17: stop update animation and avoid further render requests. |
| 4903 | try { |
| 4904 | if (updateAnimId) updateAnimController.cancel(updateAnimId); |
| 4905 | updateAnimController.cancelAll(); |
| 4906 | } catch { |
| 4907 | // best-effort |
| 4908 | } |
| 4909 | updateAnimId = null; |
| 4910 | updateProgress01 = 1; |
| 4911 | updateTransition = null; |
| 4912 | |
| 4913 | cancelScheduledFlush(); |
| 4914 | cancelZoomResampleDebounce(); |
| 4915 | zoomResampleDue = false; |
| 4916 | |
| 4917 | pendingAppendByIndex.clear(); |
| 4918 | |
| 4919 | insideZoom?.dispose(); |
| 4920 | insideZoom = null; |
| 4921 | unsubscribeZoom?.(); |
| 4922 | unsubscribeZoom = null; |
| 4923 | zoomState = null; |
| 4924 | lastOptionsZoomRange = null; |
| 4925 | zoomRangeListeners.clear(); |
| 4926 | |
| 4927 | eventManager?.dispose(); |
| 4928 | crosshairRenderer.dispose(); |
| 4929 | highlightRenderer.dispose(); |
| 4930 | |
| 4931 | for (let i = 0; i < areaRenderers.length; i++) { |
| 4932 | areaRenderers[i].dispose(); |
| 4933 | } |
| 4934 | areaRenderers.length = 0; |
| 4935 | |
| 4936 | for (let i = 0; i < lineRenderers.length; i++) { |
| 4937 | lineRenderers[i].dispose(); |
| 4938 | } |
| 4939 | lineRenderers.length = 0; |
| 4940 | |
| 4941 | for (let i = 0; i < scatterRenderers.length; i++) { |
| 4942 | scatterRenderers[i].dispose(); |
| 4943 | } |
| 4944 | scatterRenderers.length = 0; |
nothing calls this directly
no test coverage detected