Sounds like you've made a lot of improvements already, well done!
I took a quick look, and it looks like your site is an SPA, which means that the URL changes that you see as you navigate are not really "new navigations" as far as Chrome considers for web vitals today (see
https://web.dev/vitals-spa-faq/). There is work ongoing to help split vitals up by SPA routes to make it easier to find the source of layout shifts by route URL, rather than initial navigation URL. But, for now, be aware that shifts from anywhere on your site will affect those URLs, if you are soft-navigating to them and loading within a "single page".
What I find useful is to measure events like layout shifts in real time, not just the overall score, using a JS snippet like this, pasted in the console:
let cls = 0;
let totalCls = 0;
let sessionCls = 0;
let sessionDeadline = 0;
let sessionGaptime = 0;
new PerformanceObserver((list) => {
for (const entry of list.getEntries()) {
if (entry.hadRecentInput) {
// These are shifts that get ignored... but still report to console
console.log(`[ !CLS, with hadRecentInput ] Current: ${entry.value.toFixed(4)}`, entry);
continue;
}
if (sessionCls == 0 ||
entry.startTime > sessionDeadline ||
entry.startTime > sessionGaptime) {
sessionCls = 0;
sessionDeadline = entry.startTime + 5000;
}
totalCls += entry.value;
sessionCls += entry.value;
sessionGaptime = entry.startTime + 1000;
if (sessionCls > cls)
cls = sessionCls;
console.log(`[CLS] ${cls.toFixed(4)}, Current: ${entry.value.toFixed(4)}, Total: ${totalCls.toFixed(4)}`, entry);
}
}).observe({type: 'layout-shift', buffered: true});
Good Luck