VSCode is a webapp [1], that is most often used wrapped in a shell that lets it act as a desktop app.
Even if you do consider it separate from webapps, it should still work with tab navigation and screen readers, which rendering to `<canvas>` doesn't allow for (at least without some very hacky workarounds).
Flutter faces a similar problem; to render cross-platform, they use a custom layer not standard to the system, and then try to emulate all the behaviors of a native app, which often feels broken and unnatural and is wasted work because the engineers are just rewriting and reshipping everything the platform already offers—at the cost of accessibility and general user experience.