Case converter & slug

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.