The generator is not the hard part
Producing an unguessable string is a solved problem that takes one line of code. The hard problem is everything after: remembering it, storing it somewhere both safe and reachable, not reusing it, and getting it to the other person when a credential has to be shared. A password manager exists to solve those, and a standalone generator solves none of them.
So the honest recommendation is that if you are creating a login you will use repeatedly, you want a manager, and its generator is right there. What a manager is a clumsy fit for is the other category: a wifi key going on a card by the door, a database password destined for a secrets store, a one-off credential you are handing to a contractor, a seed for something that is not a login at all.
Length beats character classes, and it is not close
Every character you add multiplies the search space. Every mandated symbol adds roughly the same entropy as one more character while making the password harder to type and more likely to be written down. This is why the requirement to include an uppercase letter, a digit and a symbol produces Password1! on millions of accounts - the rule was satisfied and nothing was achieved.
Current guidance from the standards bodies has moved accordingly: favour length, drop composition rules, stop forcing periodic rotation, and check against lists of known-breached passwords instead. A long random string or a multi-word passphrase beats a short cryptic one every time, and is far likelier to be entered correctly on a phone.
When a passphrase is the better answer
Several random words are strong through length rather than through obscurity, and the crucial word is random - words you chose yourself are not, because human word choice is predictable in exactly the ways an attacker models. A generated four or five word phrase is easy to read aloud over a phone, easy to type on a television remote, and hard to mistranscribe.
That makes it the right shape for credentials that humans have to move around by hand: a wifi password, a device unlock code, a disk encryption phrase, the master password protecting everything else. Use a random string for anything a machine will handle, and a passphrase for anything a person will.