TL;DR: new CustomElementRegistry() gives a shadow root its own private set of custom element definitions, so two libraries can both own a <ui-button> on the same page. Firefox 159 shipped it on October 27, 2026, which makes scoped custom element registries Baseline Newly available.
The name nobody can share
Custom elements have always lived in one global phone book: window.customElements . Every tag name is registered once, for the whole page, forever.
So your app defines <ui-button> . Then you install a date picker that also ships a <ui-button> inside it. One of them loses:
customElements . define ( " ui-button " , AppButton ); customElements . define ( " ui-button " , PickerButton ); // NotSupportedError: Failed to execute 'define' on 'CustomElementRegistry': // the name "ui-button" has already been used with this registry
Enter fullscreen mode
Exit fullscreen mode
That is the exact message Chrome 156 threw when I ran it.…