diff --git a/src/index.ts b/src/index.ts
index f57f30f..b1de0f7 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -3,4 +3,48 @@ import RelativeTimeElement from './relative-time-element.js'
import TimeAgoElement from './time-ago-element.js'
import TimeUntilElement from './time-until-element.js'
+const root = (typeof globalThis !== 'undefined' ? globalThis : window) as typeof window
+try {
+ customElements.define('relative-time', RelativeTimeElement)
+ root.RelativeTimeElement = RelativeTimeElement
+} catch (e: unknown) {
+ if (!(e instanceof DOMException && e.name === 'NotSupportedError') && !(e instanceof ReferenceError)) throw e
+}
+
+try {
+ customElements.define('local-time', LocalTimeElement)
+ root.LocalTimeElement = LocalTimeElement
+} catch (e: unknown) {
+ if (!(e instanceof DOMException && e.name === 'NotSupportedError') && !(e instanceof ReferenceError)) throw e
+}
+
+try {
+ customElements.define('time-ago', TimeAgoElement)
+ root.TimeAgoElement = TimeAgoElement
+} catch (e: unknown) {
+ if (!(e instanceof DOMException && e.name === 'NotSupportedError') && !(e instanceof ReferenceError)) throw e
+}
+
+try {
+ customElements.define('time-until', TimeUntilElement)
+ root.TimeUntilElement = TimeUntilElement
+} catch (e: unknown) {
+ if (!(e instanceof DOMException && e.name === 'NotSupportedError') && !(e instanceof ReferenceError)) throw e
+}
+
+declare global {
+ interface Window {
+ RelativeTimeElement: typeof RelativeTimeElement
+ LocalTimeElement: typeof LocalTimeElement
+ TimeAgoElement: typeof TimeAgoElement
+ TimeUntilElement: typeof TimeUntilElement
+ }
+ interface HTMLElementTagNameMap {
+ 'relative-time': RelativeTimeElement
+ 'local-time': LocalTimeElement
+ 'time-ago': TimeAgoElement
+ 'time-until': TimeUntilElement
+ }
+}
+
export {LocalTimeElement, RelativeTimeElement, TimeAgoElement, TimeUntilElement}
diff --git a/src/local-time-element.ts b/src/local-time-element.ts
index 956897c..3055c6d 100644
--- a/src/local-time-element.ts
+++ b/src/local-time-element.ts
@@ -28,22 +28,3 @@ export default class LocalTimeElement extends RelativeTimeElement {
if (year === 'numeric' || year === '2-digit') return year
}
}
-
-// Public: LocalTimeElement constructor.
-//
-// var time = new LocalTimeElement()
-// # =>
-//
-if (!window.customElements.get('local-time')) {
- window.LocalTimeElement = LocalTimeElement
- window.customElements.define('local-time', LocalTimeElement)
-}
-
-declare global {
- interface Window {
- LocalTimeElement: typeof LocalTimeElement
- }
- interface HTMLElementTagNameMap {
- 'local-time': LocalTimeElement
- }
-}
diff --git a/src/relative-time-element.ts b/src/relative-time-element.ts
index 3c48216..7d91bd2 100644
--- a/src/relative-time-element.ts
+++ b/src/relative-time-element.ts
@@ -374,22 +374,3 @@ export default class RelativeTimeElement extends HTMLElement implements Intl.Dat
}
}
}
-
-// Public: RelativeTimeElement constructor.
-//
-// var time = new RelativeTimeElement()
-// # =>
-//
-if (!window.customElements.get('relative-time')) {
- window.RelativeTimeElement = RelativeTimeElement
- window.customElements.define('relative-time', RelativeTimeElement)
-}
-
-declare global {
- interface Window {
- RelativeTimeElement: typeof RelativeTimeElement
- }
- interface HTMLElementTagNameMap {
- 'relative-time': RelativeTimeElement
- }
-}
diff --git a/src/time-ago-element.ts b/src/time-ago-element.ts
index c670b41..c022204 100644
--- a/src/time-ago-element.ts
+++ b/src/time-ago-element.ts
@@ -6,17 +6,3 @@ export default class TimeAgoElement extends RelativeTimeElement {
return 'past'
}
}
-
-if (!window.customElements.get('time-ago')) {
- window.TimeAgoElement = TimeAgoElement
- window.customElements.define('time-ago', TimeAgoElement)
-}
-
-declare global {
- interface Window {
- TimeAgoElement: typeof TimeAgoElement
- }
- interface HTMLElementTagNameMap {
- 'time-ago': TimeAgoElement
- }
-}
diff --git a/src/time-until-element.ts b/src/time-until-element.ts
index 6ee58f2..be08fb7 100644
--- a/src/time-until-element.ts
+++ b/src/time-until-element.ts
@@ -6,17 +6,3 @@ export default class TimeUntilElement extends RelativeTimeElement {
return 'future'
}
}
-
-if (!window.customElements.get('time-until')) {
- window.TimeUntilElement = TimeUntilElement
- window.customElements.define('time-until', TimeUntilElement)
-}
-
-declare global {
- interface Window {
- TimeUntilElement: typeof TimeUntilElement
- }
- interface HTMLElementTagNameMap {
- 'time-until': TimeUntilElement
- }
-}
diff --git a/test/constructor.js b/test/constructor.js
index 7750379..e80fd71 100644
--- a/test/constructor.js
+++ b/test/constructor.js
@@ -1,6 +1,5 @@
import {assert} from '@open-wc/testing'
-import '../src/local-time-element.ts'
-import '../src/relative-time-element.ts'
+import '../src/index.ts'
suite('constructor', function () {
test('create local-time from document.createElement', function () {
diff --git a/test/local-time.js b/test/local-time.js
index a70934d..10079cd 100644
--- a/test/local-time.js
+++ b/test/local-time.js
@@ -1,5 +1,5 @@
import {assert} from '@open-wc/testing'
-import '../src/local-time-element.ts'
+import '../src/index.ts'
suite('local-time', function () {
let fixture
diff --git a/test/relative-time.js b/test/relative-time.js
index 0851329..2c42e50 100644
--- a/test/relative-time.js
+++ b/test/relative-time.js
@@ -1,5 +1,5 @@
import {assert} from '@open-wc/testing'
-import RelativeTimeElement from '../src/relative-time-element.ts'
+import {RelativeTimeElement} from '../src/index.ts'
suite('relative-time', function () {
let dateNow
diff --git a/test/time-ago.js b/test/time-ago.js
index 01ef85c..1abb9c6 100644
--- a/test/time-ago.js
+++ b/test/time-ago.js
@@ -1,5 +1,5 @@
import {assert} from '@open-wc/testing'
-import '../src/time-ago-element.ts'
+import '../src/index.ts'
suite('time-ago', function () {
let dateNow
diff --git a/test/time-until.js b/test/time-until.js
index 83b940d..ef9181f 100644
--- a/test/time-until.js
+++ b/test/time-until.js
@@ -1,5 +1,5 @@
import {assert} from '@open-wc/testing'
-import '../src/time-until-element.ts'
+import '../src/index.ts'
suite('time-until', function () {
test('always uses relative dates', function () {
diff --git a/test/title-format.js b/test/title-format.js
index db3d8e7..0f39c15 100644
--- a/test/title-format.js
+++ b/test/title-format.js
@@ -1,5 +1,5 @@
import {assert} from '@open-wc/testing'
-import '../src/local-time-element.ts'
+import '../src/index.ts'
suite('title-format', function () {
test('null getFormattedTitle if datetime is missing', function () {