Every case a codebase asks for, plus URL slugs that survive accents — ação becomes acao, not a-o.
Splitting is the hard part, not joining. Turning words into
kebab-case is trivial; deciding where the words are is not.
XMLHttpRequest has to break as XML · Http · Request, not
X · M · L · Http…, which means detecting a run of capitals followed by a
lowercase letter. That single rule is what most quick regexes miss.
Accents in slugs. Characters are decomposed (NFD) and the combining marks
stripped, so é becomes e rather than being deleted. German ß and
Nordic ø and å are mapped explicitly, because decomposition alone drops
them. Text with no Latin equivalent at all — Greek, Cyrillic, Japanese — is left intact
rather than silently erased, and flagged below.