Are these passwords cryptographically secure?
Yes for the random source: every character is chosen with the Web Crypto API's crypto.getRandomValues() (with unbiased selection and a secure shuffle), not Math.random(). Each character type you tick is guaranteed to appear when the length allows it. The strength label is still a simple entropy estimate, not a dictionary-aware audit.