()
| 47 | }; |
| 48 | |
| 49 | async function main() { |
| 50 | const containerA = document.getElementById('chart-a'); |
| 51 | const containerB = document.getElementById('chart-b'); |
| 52 | if (!containerA || !containerB) throw new Error('Chart containers not found'); |
| 53 | |
| 54 | const dataA = createWave(400, { fn: 'sin', phase: 0, amplitude: 1 }); |
| 55 | const dataB = createWave(400, { fn: 'cos', phase: Math.PI / 6, amplitude: 0.9 }); |
| 56 | |
| 57 | const chartA = await ChartGPU.create(containerA, createOptions('sin(x)', dataA, '#4a9eff')); |
| 58 | const chartB = await ChartGPU.create(containerB, createOptions('cos(x + π/6)', dataB, '#ff4ab0')); |
| 59 | |
| 60 | const disconnect = connectCharts([chartA, chartB]); |
| 61 | |
| 62 | const attachResizeObserver = (container: HTMLElement, chart: ChartGPUInstance): ResizeObserver => { |
| 63 | let scheduled = false; |
| 64 | const ro = new ResizeObserver(() => { |
| 65 | if (scheduled) return; |
| 66 | scheduled = true; |
| 67 | requestAnimationFrame(() => { |
| 68 | scheduled = false; |
| 69 | chart.resize(); |
| 70 | }); |
| 71 | }); |
| 72 | ro.observe(container); |
| 73 | return ro; |
| 74 | }; |
| 75 | |
| 76 | const roA = attachResizeObserver(containerA, chartA); |
| 77 | const roB = attachResizeObserver(containerB, chartB); |
| 78 | |
| 79 | // Initial sizing/render. |
| 80 | chartA.resize(); |
| 81 | chartB.resize(); |
| 82 | |
| 83 | window.addEventListener('beforeunload', () => { |
| 84 | roA.disconnect(); |
| 85 | roB.disconnect(); |
| 86 | disconnect(); |
| 87 | chartA.dispose(); |
| 88 | chartB.dispose(); |
| 89 | }); |
| 90 | } |
| 91 | |
| 92 | if (document.readyState === 'loading') { |
| 93 | document.addEventListener('DOMContentLoaded', () => { |
no test coverage detected