@@ -11,10 +11,35 @@ let timeseriesData, barChartsData, allRunNames;
1111let activeTags = new Set ( ) ;
1212let layerComparisonsData ;
1313let latestRunsLookup = new Map ( ) ;
14+ let pendingCharts = new Map ( ) ; // Store chart data for lazy loading
15+ let chartObserver ; // Intersection observer for lazy loading charts
1416
1517// DOM Elements
1618let runSelect , selectedRunsDiv , suiteFiltersContainer , tagFiltersContainer ;
1719
20+ // Observer for lazy loading charts
21+ function initChartObserver ( ) {
22+ if ( chartObserver ) return ;
23+
24+ chartObserver = new IntersectionObserver ( ( entries ) => {
25+ entries . forEach ( entry => {
26+ if ( entry . isIntersecting ) {
27+ const containerId = entry . target . querySelector ( 'canvas' ) . id ;
28+ if ( pendingCharts . has ( containerId ) ) {
29+ const { data, type } = pendingCharts . get ( containerId ) ;
30+ createChart ( data , containerId , type ) ;
31+ pendingCharts . delete ( containerId ) ;
32+ chartObserver . unobserve ( entry . target ) ;
33+ }
34+ }
35+ } ) ;
36+ } , {
37+ root : null , // viewport (current view)
38+ rootMargin : '100px' , // Load charts a bit before they enter the viewport
39+ threshold : 0.1 // Start loading when 10% of the chart is within the rootMargin
40+ } ) ;
41+ }
42+
1843const colorPalette = [
1944 'rgb(255, 50, 80)' ,
2045 'rgb(255, 145, 15)' ,
@@ -230,29 +255,35 @@ function drawCharts(filteredTimeseriesData, filteredBarChartsData, filteredLayer
230255 document . querySelectorAll ( '.charts' ) . forEach ( container => container . innerHTML = '' ) ;
231256 chartInstances . forEach ( chart => chart . destroy ( ) ) ;
232257 chartInstances . clear ( ) ;
258+ pendingCharts . clear ( ) ;
259+
260+ initChartObserver ( ) ; // For lazy loading charts
233261
234262 // Create timeseries charts
235263 filteredTimeseriesData . forEach ( ( data , index ) => {
236264 const containerId = `timeseries-${ index } ` ;
237265 const container = createChartContainer ( data , containerId , 'benchmark' ) ;
238266 document . querySelector ( '.timeseries .charts' ) . appendChild ( container ) ;
239- createChart ( data , containerId , 'time' ) ;
267+ pendingCharts . set ( containerId , { data, type : 'time' } ) ;
268+ chartObserver . observe ( container ) ;
240269 } ) ;
241270
242271 // Create layer comparison charts
243272 filteredLayerComparisonsData . forEach ( ( data , index ) => {
244273 const containerId = `layer-comparison-${ index } ` ;
245274 const container = createChartContainer ( data , containerId , 'group' ) ;
246275 document . querySelector ( '.layer-comparisons .charts' ) . appendChild ( container ) ;
247- createChart ( data , containerId , 'time' ) ;
276+ pendingCharts . set ( containerId , { data, type : 'time' } ) ;
277+ chartObserver . observe ( container ) ;
248278 } ) ;
249279
250280 // Create bar charts
251281 filteredBarChartsData . forEach ( ( data , index ) => {
252282 const containerId = `barchart-${ index } ` ;
253283 const container = createChartContainer ( data , containerId , 'group' ) ;
254284 document . querySelector ( '.bar-charts .charts' ) . appendChild ( container ) ;
255- createChart ( data , containerId , 'bar' ) ;
285+ pendingCharts . set ( containerId , { data, type : 'bar' } ) ;
286+ chartObserver . observe ( container ) ;
256287 } ) ;
257288
258289 // Apply current filters
0 commit comments