in src/performance/index.ts [128:169]
private CLS() {
if (!isLayoutShiftSupported()) {
return this.coreWebMetrics.clsTime = -1;
}
let partValue = 0;
let entryList: LayoutShift[] = [];
const handleEntries = (entries: LayoutShift[]) => {
entries.forEach((entry) => {
// Count layout shifts without recent user input only
if (!entry.hadRecentInput) {
const firstEntry = entryList[0];
const lastEntry = entryList[entryList.length - 1];
if (
partValue &&
entry.startTime - lastEntry.startTime < 1000 &&
entry.startTime - firstEntry.startTime < 5000
) {
partValue += entry.value;
} else {
partValue = entry.value;
}
entryList.push(entry);
}
});
if (partValue > 0) {
setTimeout(() => {
this.coreWebMetrics.clsTime = partValue;
}, 3000);
}
};
const obs = observe('layout-shift', handleEntries);
if (!obs) {
return;
}
onHidden(() => {
handleEntries(obs.takeRecords() as CLSMetric['entries']);
obs!.disconnect();
});
}