diff --git a/web/CHANGELOG.md b/web/CHANGELOG.md
index ebd6c29..b25ed97 100644
--- a/web/CHANGELOG.md
+++ b/web/CHANGELOG.md
@@ -17,6 +17,7 @@
 - Various extension methods bridging `dart:html` APIs are added to make it
   easier to migrate. `@Equivalence` annotations are now added to extension
   methods to document 1-1 replacements of `dart:html` APIs.
+- Combined stream provider extensions to one per type.
 
 ## 1.1.1
 
diff --git a/web/lib/src/helpers/events/events.dart b/web/lib/src/helpers/events/events.dart
index 63f3999..6d5fcb2 100644
--- a/web/lib/src/helpers/events/events.dart
+++ b/web/lib/src/helpers/events/events.dart
@@ -6,7 +6,93 @@
 import 'providers.dart';
 import 'streams.dart';
 
-extension ElementEventGetters on Element {
+extension AudioNodeEvents on AudioNode {
+  Stream<Event> get onEnded => EventStreamProviders.endedEvent.forTarget(this);
+}
+
+extension BroadcastChannelEvents on BroadcastChannel {
+  Stream<MessageEvent> get onMessage =>
+      EventStreamProviders.messageEvent.forTarget(this);
+}
+
+extension DocumentEvents on Document {
+  Stream<Event> get onBlur => EventStreamProviders.blurEvent.forTarget(this);
+
+  Stream<MouseEvent> get onClick =>
+      EventStreamProviders.clickEvent.forTarget(this);
+
+  Stream<MouseEvent> get onDrag =>
+      EventStreamProviders.dragEvent.forTarget(this);
+
+  Stream<MouseEvent> get onDragEnd =>
+      EventStreamProviders.dragEndEvent.forTarget(this);
+
+  Stream<MouseEvent> get onDragEnter =>
+      EventStreamProviders.dragEnterEvent.forTarget(this);
+
+  Stream<MouseEvent> get onDragLeave =>
+      EventStreamProviders.dragLeaveEvent.forTarget(this);
+
+  Stream<MouseEvent> get onDragOver =>
+      EventStreamProviders.dragOverEvent.forTarget(this);
+
+  Stream<MouseEvent> get onDragStart =>
+      EventStreamProviders.dragStartEvent.forTarget(this);
+
+  Stream<MouseEvent> get onDrop =>
+      EventStreamProviders.dropEvent.forTarget(this);
+
+  Stream<Event> get onInput => EventStreamProviders.inputEvent.forTarget(this);
+
+  Stream<KeyboardEvent> get onKeyDown =>
+      EventStreamProviders.keyDownEvent.forTarget(this);
+
+  Stream<KeyboardEvent> get onKeyUp =>
+      EventStreamProviders.keyUpEvent.forTarget(this);
+
+  Stream<Event> get onLoad => EventStreamProviders.loadEvent.forTarget(this);
+
+  Stream<MouseEvent> get onMouseDown =>
+      EventStreamProviders.mouseDownEvent.forTarget(this);
+
+  Stream<MouseEvent> get onMouseEnter =>
+      EventStreamProviders.mouseEnterEvent.forTarget(this);
+
+  Stream<MouseEvent> get onMouseLeave =>
+      EventStreamProviders.mouseLeaveEvent.forTarget(this);
+
+  Stream<MouseEvent> get onMouseMove =>
+      EventStreamProviders.mouseMoveEvent.forTarget(this);
+
+  Stream<MouseEvent> get onMouseOut =>
+      EventStreamProviders.mouseOutEvent.forTarget(this);
+
+  Stream<MouseEvent> get onMouseOver =>
+      EventStreamProviders.mouseOverEvent.forTarget(this);
+
+  Stream<MouseEvent> get onMouseUp =>
+      EventStreamProviders.mouseUpEvent.forTarget(this);
+
+  Stream<WheelEvent> get onMouseWheel =>
+      EventStreamProviders.mouseWheelEvent.forTarget(this);
+
+  Stream<TouchEvent> get onTouchCancel =>
+      EventStreamProviders.touchCancelEvent.forTarget(this);
+
+  Stream<TouchEvent> get onTouchEnd =>
+      EventStreamProviders.touchEndEvent.forTarget(this);
+
+  Stream<TouchEvent> get onTouchMove =>
+      EventStreamProviders.touchMoveEvent.forTarget(this);
+
+  Stream<TouchEvent> get onTouchStart =>
+      EventStreamProviders.touchStartEvent.forTarget(this);
+
+  Stream<Event> get onVisibilityChange =>
+      EventStreamProviders.visibilityChangeEvent.forTarget(this);
+}
+
+extension ElementEvents on Element {
   ElementStream<Event> get onAbort =>
       EventStreamProviders.abortEvent.forElement(this);
 
@@ -106,9 +192,6 @@
   ElementStream<Event> get onLoad =>
       EventStreamProviders.loadEvent.forElement(this);
 
-  ElementStream<Event> get onUnload =>
-      EventStreamProviders.unloadEvent.forElement(this);
-
   ElementStream<Event> get onLoadedData =>
       EventStreamProviders.loadedDataEvent.forElement(this);
 
@@ -136,6 +219,9 @@
   ElementStream<MouseEvent> get onMouseUp =>
       EventStreamProviders.mouseUpEvent.forElement(this);
 
+  ElementStream<WheelEvent> get onMouseWheel =>
+      EventStreamProviders.mouseWheelEvent.forElement(this);
+
   ElementStream<ClipboardEvent> get onPaste =>
       EventStreamProviders.pasteEvent.forElement(this);
 
@@ -205,6 +291,12 @@
   ElementStream<TouchEvent> get onTouchStart =>
       EventStreamProviders.touchStartEvent.forElement(this);
 
+  ElementStream<TransitionEvent> get onTransitionEnd =>
+      EventStreamProviders.transitionEndEvent.forElement(this);
+
+  ElementStream<Event> get onUnload =>
+      EventStreamProviders.unloadEvent.forElement(this);
+
   ElementStream<Event> get onVolumeChange =>
       EventStreamProviders.volumeChangeEvent.forElement(this);
 
@@ -221,19 +313,7 @@
       EventStreamProviders.wheelEvent.forElement(this);
 }
 
-extension XHRGetters on XMLHttpRequest {
-  Stream<ProgressEvent> get onLoad =>
-      EventStreamProviders.loadEvent.forTarget(this);
-  Stream<ProgressEvent> get onError =>
-      EventStreamProviders.errorEvent.forTarget(this);
-  Stream<ProgressEvent> get onProgress =>
-      EventStreamProviders.progressEvent.forTarget(this);
-
-  Stream<Event> get onReadyStateChange =>
-      EventStreamProviders.readyStateChangeEvent.forTarget(this);
-}
-
-extension EventSourceEventGetters on EventSource {
+extension EventSourceEvents on EventSource {
   Stream<Event> get onError =>
       EventStreamProviders.errorEventSourceEvent.forTarget(this);
 
@@ -243,82 +323,57 @@
   Stream<Event> get onOpen => EventStreamProviders.openEvent.forTarget(this);
 }
 
-extension FileReaderEventGetters on FileReader {
+extension FileReaderEvents on FileReader {
   Stream<ProgressEvent> get onAbort =>
       EventStreamProviders.abortEvent.forTarget(this);
+
   Stream<ProgressEvent> get onError =>
       EventStreamProviders.errorEvent.forTarget(this);
+
   Stream<ProgressEvent> get onLoad =>
       EventStreamProviders.loadEvent.forTarget(this);
+
   Stream<ProgressEvent> get onLoadEnd =>
       EventStreamProviders.loadEndEvent.forTarget(this);
+
   Stream<ProgressEvent> get onLoadStart =>
       EventStreamProviders.loadStartEvent.forTarget(this);
+
   Stream<ProgressEvent> get onProgress =>
       EventStreamProviders.progressEvent.forTarget(this);
 }
 
-extension AutoElementEventGetters on AudioNode {
-  Stream<Event> get onEnded => EventStreamProviders.endedEvent.forTarget(this);
-}
-
-extension FontFaceSetGetters on FontFaceSet {
+extension FontFaceSetEvents on FontFaceSet {
   Stream<FontFaceSetLoadEvent> get onLoadingDone =>
       EventStreamProviders.loadingDoneEvent.forTarget(this);
 }
 
-extension WindowEventGetters on Window {
-  Stream<BeforeUnloadEvent> get onBeforeUnload =>
-      EventStreamProviders.beforeUnloadEvent.forTarget(this);
+extension PerformanceEvents on Performance {
+  Stream<Event> get onResourceTimingBufferFull =>
+      EventStreamProviders.resourceTimingBufferFull.forTarget(this);
+}
 
-  Stream<Event> get onBlur => EventStreamProviders.blurEvent.forTarget(this);
+extension WebSocketEvents on WebSocket {
+  Stream<CloseEvent> get onClose =>
+      EventStreamProviders.closeEvent.forTarget(this);
 
-  Stream<KeyboardEvent> get onKeyDown =>
-      EventStreamProviders.keyDownEvent.forTarget(this);
-
-  Stream<KeyboardEvent> get onKeyPress =>
-      EventStreamProviders.keyPressEvent.forTarget(this);
-
-  Stream<Event> get onLoad => EventStreamProviders.loadEvent.forTarget(this);
+  Stream<Event> get onError =>
+      EventStreamProviders.errorEventSourceEvent.forTarget(this);
 
   Stream<MessageEvent> get onMessage =>
       EventStreamProviders.messageEvent.forTarget(this);
 
-  Stream<PopStateEvent> get onPopState =>
-      EventStreamProviders.popStateEvent.forTarget(this);
+  Stream<Event> get onOpen => EventStreamProviders.openEvent.forTarget(this);
+}
 
-  Stream<TouchEvent> get onTouchCancel =>
-      EventStreamProviders.touchCancelEvent.forTarget(this);
+extension WindowEvents on Window {
+  Stream<Event> get onAnimationEnd =>
+      EventStreamProviders.animationEndEvent.forTarget(this);
 
-  Stream<TouchEvent> get onTouchEnd =>
-      EventStreamProviders.touchEndEvent.forTarget(this);
+  Stream<BeforeUnloadEvent> get onBeforeUnload =>
+      EventStreamProviders.beforeUnloadEvent.forTarget(this);
 
-  Stream<TouchEvent> get onTouchMove =>
-      EventStreamProviders.touchMoveEvent.forTarget(this);
-
-  Stream<TouchEvent> get onTouchStart =>
-      EventStreamProviders.touchStartEvent.forTarget(this);
-
-  Stream<MouseEvent> get onMouseDown =>
-      EventStreamProviders.mouseDownEvent.forTarget(this);
-
-  Stream<MouseEvent> get onMouseEnter =>
-      EventStreamProviders.mouseEnterEvent.forTarget(this);
-
-  Stream<MouseEvent> get onMouseLeave =>
-      EventStreamProviders.mouseLeaveEvent.forTarget(this);
-
-  Stream<MouseEvent> get onMouseMove =>
-      EventStreamProviders.mouseMoveEvent.forTarget(this);
-
-  Stream<MouseEvent> get onMouseOut =>
-      EventStreamProviders.mouseOutEvent.forTarget(this);
-
-  Stream<MouseEvent> get onMouseOver =>
-      EventStreamProviders.mouseOverEvent.forTarget(this);
-
-  Stream<MouseEvent> get onMouseUp =>
-      EventStreamProviders.mouseUpEvent.forTarget(this);
+  Stream<Event> get onBlur => EventStreamProviders.blurEvent.forTarget(this);
 
   Stream<MouseEvent> get onDrag =>
       EventStreamProviders.dragEvent.forTarget(this);
@@ -340,34 +395,19 @@
 
   Stream<Event> get onFocus => EventStreamProviders.focusEvent.forTarget(this);
 
-  Stream<Event> get onAnimationEnd =>
-      EventStreamProviders.animationEndEvent.forTarget(this);
+  Stream<KeyboardEvent> get onKeyDown =>
+      EventStreamProviders.keyDownEvent.forTarget(this);
 
-  Stream<Event> get onResize =>
-      EventStreamProviders.resizeEvent.forTarget(this);
-
-  Stream<Event> get onScroll =>
-      EventStreamProviders.scrollEvent.forTarget(this);
-
-  Stream<Event> get onStorage =>
-      EventStreamProviders.storageEvent.forTarget(this);
+  Stream<KeyboardEvent> get onKeyPress =>
+      EventStreamProviders.keyPressEvent.forTarget(this);
 
   Stream<KeyboardEvent> get onKeyUp =>
       EventStreamProviders.keyUpEvent.forTarget(this);
-}
 
-extension DocumentEventGetters on Document {
-  Stream<TouchEvent> get onTouchCancel =>
-      EventStreamProviders.touchCancelEvent.forTarget(this);
+  Stream<Event> get onLoad => EventStreamProviders.loadEvent.forTarget(this);
 
-  Stream<TouchEvent> get onTouchEnd =>
-      EventStreamProviders.touchEndEvent.forTarget(this);
-
-  Stream<TouchEvent> get onTouchMove =>
-      EventStreamProviders.touchMoveEvent.forTarget(this);
-
-  Stream<TouchEvent> get onTouchStart =>
-      EventStreamProviders.touchStartEvent.forTarget(this);
+  Stream<MessageEvent> get onMessage =>
+      EventStreamProviders.messageEvent.forTarget(this);
 
   Stream<MouseEvent> get onMouseDown =>
       EventStreamProviders.mouseDownEvent.forTarget(this);
@@ -390,81 +430,47 @@
   Stream<MouseEvent> get onMouseUp =>
       EventStreamProviders.mouseUpEvent.forTarget(this);
 
-  Stream<MouseEvent> get onDrag =>
-      EventStreamProviders.dragEvent.forTarget(this);
-
-  Stream<MouseEvent> get onDragEnd =>
-      EventStreamProviders.dragEndEvent.forTarget(this);
-
-  Stream<MouseEvent> get onDragEnter =>
-      EventStreamProviders.dragEnterEvent.forTarget(this);
-
-  Stream<MouseEvent> get onDragLeave =>
-      EventStreamProviders.dragLeaveEvent.forTarget(this);
-
-  Stream<MouseEvent> get onDragOver =>
-      EventStreamProviders.dragOverEvent.forTarget(this);
-
-  Stream<MouseEvent> get onDragStart =>
-      EventStreamProviders.dragStartEvent.forTarget(this);
-
-  Stream<MouseEvent> get onDrop =>
-      EventStreamProviders.dropEvent.forTarget(this);
-
-  Stream<Event> get onInput => EventStreamProviders.inputEvent.forTarget(this);
-
-  Stream<KeyboardEvent> get onKeyUp =>
-      EventStreamProviders.keyUpEvent.forTarget(this);
-
-  Stream<KeyboardEvent> get onKeyDown =>
-      EventStreamProviders.keyDownEvent.forTarget(this);
-
   Stream<WheelEvent> get onMouseWheel =>
       EventStreamProviders.mouseWheelEvent.forTarget(this);
 
-  Stream<Event> get onVisibilityChange =>
-      EventStreamProviders.visibilityChangeEvent.forTarget(this);
+  Stream<PopStateEvent> get onPopState =>
+      EventStreamProviders.popStateEvent.forTarget(this);
 
-  Stream<Event> get onBlur => EventStreamProviders.blurEvent.forTarget(this);
+  Stream<Event> get onResize =>
+      EventStreamProviders.resizeEvent.forTarget(this);
 
-  Stream<Event> get onLoad => EventStreamProviders.loadEvent.forTarget(this);
+  Stream<Event> get onScroll =>
+      EventStreamProviders.scrollEvent.forTarget(this);
 
-  Stream<MouseEvent> get onClick =>
-      EventStreamProviders.clickEvent.forTarget(this);
-}
+  Stream<Event> get onStorage =>
+      EventStreamProviders.storageEvent.forTarget(this);
 
-extension ElementCustomEvents on Element {
-  ElementStream<WheelEvent> get onMouseWheel =>
-      EventStreamProviders.mouseWheelEvent.forElement(this);
+  Stream<TouchEvent> get onTouchCancel =>
+      EventStreamProviders.touchCancelEvent.forTarget(this);
 
-  ElementStream<TransitionEvent> get onTransitionEnd =>
-      EventStreamProviders.transitionEndEvent.forElement(this);
-}
+  Stream<TouchEvent> get onTouchEnd =>
+      EventStreamProviders.touchEndEvent.forTarget(this);
 
-extension BroadcastChannelEvents on BroadcastChannel {
-  Stream<MessageEvent> get onMessage =>
-      EventStreamProviders.messageEvent.forTarget(this);
-}
+  Stream<TouchEvent> get onTouchMove =>
+      EventStreamProviders.touchMoveEvent.forTarget(this);
 
-extension PerformanceEvents on Performance {
-  Stream<Event> get onResourceTimingBufferFull =>
-      EventStreamProviders.resourceTimingBufferFull.forTarget(this);
-}
-
-extension WindowCustomEvents on Window {
-  Stream<WheelEvent> get onMouseWheel =>
-      EventStreamProviders.mouseWheelEvent.forTarget(this);
+  Stream<TouchEvent> get onTouchStart =>
+      EventStreamProviders.touchStartEvent.forTarget(this);
 
   Stream<TransitionEvent> get onTransitionEnd =>
       EventStreamProviders.transitionEndEvent.forTarget(this);
 }
 
-extension WebSocketEvents on WebSocket {
-  Stream<Event> get onOpen => EventStreamProviders.openEvent.forTarget(this);
-  Stream<MessageEvent> get onMessage =>
-      EventStreamProviders.messageEvent.forTarget(this);
-  Stream<CloseEvent> get onClose =>
-      EventStreamProviders.closeEvent.forTarget(this);
-  Stream<Event> get onError =>
-      EventStreamProviders.errorEventSourceEvent.forTarget(this);
+extension XMLHttpRequestEvents on XMLHttpRequest {
+  Stream<ProgressEvent> get onError =>
+      EventStreamProviders.errorEvent.forTarget(this);
+
+  Stream<ProgressEvent> get onLoad =>
+      EventStreamProviders.loadEvent.forTarget(this);
+
+  Stream<ProgressEvent> get onProgress =>
+      EventStreamProviders.progressEvent.forTarget(this);
+
+  Stream<Event> get onReadyStateChange =>
+      EventStreamProviders.readyStateChangeEvent.forTarget(this);
 }
diff --git a/web/lib/src/helpers/extensions.dart b/web/lib/src/helpers/extensions.dart
index f3022cf..ba458c0 100644
--- a/web/lib/src/helpers/extensions.dart
+++ b/web/lib/src/helpers/extensions.dart
@@ -84,6 +84,11 @@
   }
 }
 
+extension DataTransferExtension on DataTransfer {
+  @Equivalence(type: 'DataTransfer', member: 'files')
+  List<File>? get filesAsList => has('files') ? files.asList() : null;
+}
+
 extension DocumentExtension on Document {
   @Equivalence(
     type: 'Document',
@@ -113,58 +118,8 @@
 
 /// Contains subtype members that were moved up in `dart:html` to `Element`.
 extension ElementExtension on Element {
-  @Equivalence(type: 'Element', member: 'style')
-  external CSSStyleDeclaration get style;
-
-  @Equivalence(type: 'Element', member: 'classes')
-  CssClassSet get classes => ElementCssClassSet(this);
-
-  @Equivalence(type: 'Element', member: 'getComputedStyle')
-  CSSStyleDeclaration getComputedStyle([String? pseudoElement]) {
-    pseudoElement ??= '';
-    return window.getComputedStyle(this, pseudoElement);
-  }
-
-  @Equivalence(type: 'Element', member: 'tabIndex')
-  external int? get tabIndex;
-  @Equivalence(type: 'Element', member: 'tabIndex')
-  external set tabIndex(int? v);
-
-  @Equivalence(type: 'Element', member: 'dir')
-  external String? get dir;
-  @Equivalence(type: 'Element', member: 'dir')
-  external set dir(String? s);
-
-  @Equivalence(type: 'Element', member: 'innerText')
-  external String get innerText;
-  @Equivalence(type: 'Element', member: 'innerText')
-  external set innerText(String value);
-
-  @Equivalence(type: 'Element', member: 'offsetLeft')
-  external int get offsetLeft;
-  @Equivalence(type: 'Element', member: 'offsetTop')
-  external int get offsetTop;
-  @Equivalence(type: 'Element', member: 'offsetWidth')
-  external int get offsetWidth;
-  @Equivalence(type: 'Element', member: 'offsetHeight')
-  external int get offsetHeight;
-
-  @Equivalence(type: 'Element', member: 'offset')
-  Rectangle get offset =>
-      Rectangle(offsetLeft, offsetTop, offsetWidth, offsetHeight);
-
-  @Equivalence(type: 'Element', member: 'offsetParent')
-  external Element? get offsetParent;
-
-  @Equivalence(type: 'Element', member: 'focus')
-  external void focus();
-  @Equivalence(type: 'Element', member: 'click')
-  external void click();
-  @Equivalence(type: 'Element', member: 'blur')
-  external void blur();
-
-  @Equivalence(type: 'Element', member: 'attributes')
-  Map<String, String> get attributesAsMap => ElementAttributeMap(this);
+  @Equivalence(type: 'Element', member: 'appendText')
+  void appendText(String text) => append(Text(text));
 
   @Equivalence(type: 'Element', member: 'attributes')
   set attributes(Map<String, String> value) {
@@ -175,9 +130,53 @@
     });
   }
 
+  @Equivalence(type: 'Element', member: 'attributes')
+  Map<String, String> get attributesAsMap => ElementAttributeMap(this);
+
+  @Equivalence(type: 'Element', member: 'blur')
+  external void blur();
+
+  @Equivalence(type: 'Element', member: 'borderEdge')
+  CssRect get borderEdge => BorderCssRect(this);
+
+  /// Returns [children] as a modifiable [List].
+  @Equivalence(type: 'Element', member: 'children')
+  List<Element> get childrenAsList => HTMLCollectionListWrapper(this, children);
+
+  @Equivalence(type: 'Element', member: 'classes')
+  CssClassSet get classes => ElementCssClassSet(this);
+
+  @Equivalence(type: 'Element', member: 'click')
+  external void click();
+
   @Equivalence(type: 'Element', member: 'dataset')
   Map<String, String> get dataset => DataAttributeMap(attributesAsMap);
 
+  @Equivalence(type: 'Element', member: 'dir')
+  external String? get dir;
+  @Equivalence(type: 'Element', member: 'dir')
+  external set dir(String? s);
+
+  @Equivalence(type: 'Element', member: 'documentOffset')
+  Point get documentOffset => offsetTo(document.documentElement!);
+
+  @Equivalence(type: 'Element', member: 'focus')
+  external void focus();
+
+  @Equivalence(type: 'Element', member: 'getComputedStyle')
+  CSSStyleDeclaration getComputedStyle([String? pseudoElement]) {
+    pseudoElement ??= '';
+    return window.getComputedStyle(this, pseudoElement);
+  }
+
+  @Equivalence(type: 'Element', member: 'innerText')
+  external String get innerText;
+  @Equivalence(type: 'Element', member: 'innerText')
+  external set innerText(String value);
+
+  @Equivalence(type: 'Element', member: 'marginEdge')
+  CssRect get marginEdge => MarginCssRect(this);
+
   @Equivalence(type: 'Element', member: 'matchesWithAncestors')
   bool matchesWithAncestors(String selectors) {
     var elem = this as Element?;
@@ -191,19 +190,18 @@
   @Equivalence(type: 'Element', member: 'namespaceUri')
   String? get namespaceUri => namespaceURI;
 
-  @Equivalence(
-    type: 'Element',
-    member: 'querySelectorAll',
-    details:
-        "'dart:html' returned a `_FrozenElementList`, which provided "
-        'additional helpers like stream listeners.',
-  )
-  JSImmutableListWrapper<NodeList, T> querySelectorAllAsList<T extends Element>(
-    String selectors,
-  ) => JSImmutableListWrapper<NodeList, T>(querySelectorAll(selectors));
+  @Equivalence(type: 'Element', member: 'offset')
+  Rectangle get offset =>
+      Rectangle(offsetLeft, offsetTop, offsetWidth, offsetHeight);
 
-  @Equivalence(type: 'Element', member: 'appendText')
-  void appendText(String text) => append(Text(text));
+  @Equivalence(type: 'Element', member: 'offsetHeight')
+  external int get offsetHeight;
+
+  @Equivalence(type: 'Element', member: 'offsetLeft')
+  external int get offsetLeft;
+
+  @Equivalence(type: 'Element', member: 'offsetParent')
+  external Element? get offsetParent;
 
   @Equivalence(type: 'Element', member: 'offsetTo')
   Point offsetTo(Element parent) =>
@@ -227,8 +225,26 @@
     return Point(p.x + current.offsetLeft, p.y + current.offsetTop);
   }
 
-  @Equivalence(type: 'Element', member: 'marginEdge')
-  CssRect get marginEdge => MarginCssRect(this);
+  @Equivalence(type: 'Element', member: 'offsetTop')
+  external int get offsetTop;
+
+  @Equivalence(type: 'Element', member: 'offsetWidth')
+  external int get offsetWidth;
+
+  @Equivalence(
+    type: 'Element',
+    member: 'querySelectorAll',
+    details:
+        "'dart:html' returned a `_FrozenElementList`, which provided "
+        'additional helpers like stream listeners.',
+  )
+  JSImmutableListWrapper<NodeList, T> querySelectorAllAsList<T extends Element>(
+    String selectors,
+  ) => JSImmutableListWrapper<NodeList, T>(querySelectorAll(selectors));
+
+  @Equivalence(type: 'Element', member: 'scrollIntoViewIfNeeded')
+  @JS('scrollIntoViewIfNeeded')
+  external void scrollIntoViewIfNeeded([bool? centerIfNeeded]);
 
   @Equivalence(type: 'Element', member: 'scrollIntoView')
   void scrollIntoViewWithAlignment([ScrollAlignment? alignment]) {
@@ -248,19 +264,13 @@
     }
   }
 
-  @Equivalence(type: 'Element', member: 'scrollIntoViewIfNeeded')
-  @JS('scrollIntoViewIfNeeded')
-  external void scrollIntoViewIfNeeded([bool? centerIfNeeded]);
+  @Equivalence(type: 'Element', member: 'style')
+  external CSSStyleDeclaration get style;
 
-  @Equivalence(type: 'Element', member: 'borderEdge')
-  CssRect get borderEdge => BorderCssRect(this);
-
-  @Equivalence(type: 'Element', member: 'documentOffset')
-  Point get documentOffset => offsetTo(document.documentElement!);
-
-  /// Returns [children] as a modifiable [List].
-  @Equivalence(type: 'Element', member: 'children')
-  List<Element> get childrenAsList => HTMLCollectionListWrapper(this, children);
+  @Equivalence(type: 'Element', member: 'tabIndex')
+  external int? get tabIndex;
+  @Equivalence(type: 'Element', member: 'tabIndex')
+  external set tabIndex(int? v);
 }
 
 extension EventExtension on Event {
@@ -280,24 +290,17 @@
   }
 }
 
-extension InputElementExtension on HTMLInputElement {
-  @Equivalence(type: 'InputElement', member: 'files')
-  List<File>? get filesAsList => files?.asList();
-}
-
-extension DataTransferExtension on DataTransfer {
-  @Equivalence(type: 'DataTransfer', member: 'files')
-  List<File>? get filesAsList => has('files') ? files.asList() : null;
-}
-
 extension FileListExtension on FileList {
   List<File> asList() => JSImmutableListWrapper<FileList, File>(this);
-  @Equivalence(type: 'FileList', member: 'first')
-  File get first => item(0)!;
-  @Equivalence(type: 'FileList', member: 'isEmpty')
-  bool get isEmpty => length == 0;
+
   @Equivalence(type: 'FileList', member: 'elementAt')
   File elementAt(int i) => item(i)!;
+
+  @Equivalence(type: 'FileList', member: 'first')
+  File get first => item(0)!;
+
+  @Equivalence(type: 'FileList', member: 'isEmpty')
+  bool get isEmpty => length == 0;
 }
 
 extension HTMLCanvasElementExtension on HTMLCanvasElement {
@@ -305,10 +308,6 @@
   CanvasRenderingContext2D get context2D =>
       getContext('2d') as CanvasRenderingContext2D;
 
-  @Equivalence(type: 'CanvasElement', member: 'toDataUrl')
-  String toDataUrl([String type = 'image/png', num? quality]) =>
-      (quality == null) ? toDataURL(type) : toDataURL(type, quality.toJS);
-
   @Equivalence(type: 'CanvasElement', member: 'getContext3d')
   RenderingContext? getContext3d({
     bool alpha = true,
@@ -346,18 +345,25 @@
     }
     return completer.future;
   }
+
+  @Equivalence(type: 'CanvasElement', member: 'toDataUrl')
+  String toDataUrl([String type = 'image/png', num? quality]) =>
+      (quality == null) ? toDataURL(type) : toDataURL(type, quality.toJS);
 }
 
 extension HTMLCollectionExtension on HTMLCollection {
+  List<Element> asList() =>
+      JSImmutableListWrapper<HTMLCollection, Element>(this);
+
+  @Equivalence(type: 'HtmlCollection', member: 'first')
+  Element get first => item(0)!;
+
   @Equivalence(type: 'HtmlCollection', member: 'isEmpty')
   bool get isEmpty => length == 0;
 
   @Equivalence(type: 'HtmlCollection', member: 'isNotEmpty')
   bool get isNotEmpty => length > 0;
 
-  @Equivalence(type: 'HtmlCollection', member: 'first')
-  Element get first => item(0)!;
-
   @Equivalence(type: 'HtmlCollection', member: 'last')
   Element get last => item(length - 1)!;
 
@@ -371,36 +377,178 @@
 
   @Equivalence(type: 'HtmlCollection', member: '[]')
   Element operator [](int i) => item(i)!;
+}
 
-  List<Element> asList() =>
-      JSImmutableListWrapper<HTMLCollection, Element>(this);
+extension HTMLInputElementExtension on HTMLInputElement {
+  @Equivalence(type: 'InputElement', member: 'files')
+  List<File>? get filesAsList => files?.asList();
+}
+
+extension MouseEventExtension on MouseEvent {
+  @Equivalence(type: 'MouseEvent', member: 'client')
+  Point get client => Point(clientX, clientY);
+
+  // This really belongs on the `DragEvent` subtype, but `dart:html` moved it
+  // up.
+  @Equivalence(type: 'MouseEvent', member: 'dataTransfer')
+  external DataTransfer get dataTransfer;
+
+  @Equivalence(type: 'MouseEvent', member: 'page')
+  Point get page => Point(pageX, pageY);
+
+  @Equivalence(type: 'MouseEvent', member: 'screen')
+  Point get screen => Point(screenX, screenY);
+}
+
+extension NodeExtension on Node {
+  @Equivalence(type: 'Node', member: 'append')
+  Node append(Node other) => appendChild(other);
+
+  /// Returns [childNodes] as a modifiable [List].
+  @Equivalence(type: 'Node', member: 'childNodes')
+  List<Node> get childNodesAsList => NodeListListWrapper(this, childNodes);
+
+  @Equivalence(type: 'Node', member: 'clone')
+  Node clone(bool? deep) => cloneNode(deep ?? false);
+
+  @Equivalence(type: 'Node', member: 'insertAllBefore')
+  void insertAllBefore(Iterable<Node> newNodes, Node child) {
+    // `toList` to avoid potential infinite recursion if `newNodes` is a wrapper
+    // around this `Node`.
+    for (var node in newNodes.toList()) {
+      insertBefore(node, child);
+    }
+  }
+
+  @Equivalence(type: 'Node', member: 'nextNode')
+  Node? get nextNode => nextSibling;
+
+  @Equivalence(type: 'Node', member: 'nodes')
+  List<Node> get nodes => childNodesAsList;
+
+  @Equivalence(type: 'Node', member: 'nodes')
+  set nodes(Iterable<Node> value) {
+    final copy = value.toList();
+    text = '';
+    for (final node in copy) {
+      appendChild(node);
+    }
+  }
+
+  @Equivalence(type: 'Node', member: 'parent')
+  Element? get parent => parentElement;
+
+  @Equivalence(type: 'Node', member: 'remove')
+  void remove() {
+    final parent = parentNode;
+    if (parent != null) {
+      parent.removeChild(this);
+    }
+  }
+
+  @Equivalence(type: 'Node', member: 'text')
+  String? get text => textContent;
+
+  @Equivalence(type: 'Node', member: 'text')
+  set text(String? s) => textContent = s;
+}
+
+extension NodeListExtension on NodeList {
+  /// Returns node list as an immutable [List].
+  List<T> asList<T extends Node>() => JSImmutableListWrapper<NodeList, T>(this);
+
+  @Equivalence(type: 'NodeList', member: 'elementAt')
+  Node elementAt(int i) => item(i)!;
+
+  @Equivalence(type: 'NodeList', member: 'isEmpty')
+  bool get isEmpty => length == 0;
+}
+
+extension StorageExtension on Storage {
+  @Equivalence(type: 'Storage', member: '[]')
+  String? operator [](String key) => getItem(key);
+
+  @Equivalence(type: 'Storage', member: '[]=')
+  void operator []=(String key, String value) => setItem(key, value);
+}
+
+extension TouchEventExtension on TouchEvent {
+  // Safari still doesn't support `TouchEvent`s:
+  // https://developer.mozilla.org/en-US/docs/Web/API/TouchEvent
+  @Equivalence(type: 'TouchEvent', member: 'supported')
+  static bool get supported {
+    try {
+      TouchEvent('touches');
+      return true;
+    } catch (e) {
+      return false;
+    }
+  }
+}
+
+extension TouchExtension on Touch {
+  @Equivalence(type: 'Touch', member: 'client')
+  Point get client => Point(clientX, clientY);
+
+  @Equivalence(type: 'Touch', member: 'page')
+  Point get page => Point(pageX, pageY);
+}
+
+extension TouchListExtension on TouchList {
+  List<Touch> asList() => JSImmutableListWrapper<TouchList, Touch>(this);
+
+  @Equivalence(type: 'TouchList', member: 'elementAt')
+  Touch elementAt(int i) => item(i)!;
+
+  @Equivalence(type: 'TouchList', member: 'first')
+  Touch get first => item(0)!;
+
+  @Equivalence(type: 'TouchList', member: 'isEmpty')
+  bool get isEmpty => length == 0;
+}
+
+extension UriExtension on Uri {
+  /// Converts this to a JavaScript [URL] object.
+  ///
+  /// Throws an [ArgumentError] if this isn't an absolute URL, since [URL] can
+  /// only represent absolute URLs.
+  URL get toJS {
+    try {
+      return URL(toString());
+    } catch (_) {
+      throw ArgumentError.value(this, 'this', '"$this" isn\'t a valid JS URL.');
+    }
+  }
+}
+
+extension URLExtension on URL {
+  /// Converts this to a Dart [Uri] object.
+  Uri get toDart => Uri.parse(toString());
+}
+
+extension WindowExtension on Window {
+  @Equivalence(type: 'Window', member: 'animationFrame')
+  Future<num> get animationFrame {
+    final completer = Completer<num>.sync();
+    void getTimestamp(num timestamp) {
+      completer.complete(timestamp);
+    }
+
+    requestAnimationFrame(getTimestamp.toJS);
+    return completer.future;
+  }
+
+  @Equivalence(type: 'Window', member: 'console')
+  StringConsole get console => StringConsole(dom.console);
+
+  @Equivalence(type: 'Window', member: 'localStorage')
+  StorageMap get localStorageAsMap => StorageMap(localStorage);
+
+  @Equivalence(type: 'Window', member: 'sessionStorage')
+  StorageMap get sessionStorageAsMap => StorageMap(sessionStorage);
 }
 
 extension XMLHttpRequestExtension on XMLHttpRequest {
-  @Equivalence(type: 'HttpRequest', member: 'responseHeaders')
-  Map<String, String> get responseHeaders {
-    final headers = <String, String>{};
-    final headersString = getAllResponseHeaders();
-    final headersList = headersString.split('\r\n');
-    for (final header in headersList) {
-      if (header.isEmpty) {
-        continue;
-      }
-      final splitIdx = header.indexOf(': ');
-      if (splitIdx == -1) {
-        continue;
-      }
-      final key = header.substring(0, splitIdx).toLowerCase();
-      final value = header.substring(splitIdx + 2);
-      if (headers.containsKey(key)) {
-        headers[key] = '${headers[key]}, $value';
-      } else {
-        headers[key] = value;
-      }
-    }
-    return headers;
-  }
-
   @Equivalence(type: 'HttpRequest', member: 'request')
   static Future<XMLHttpRequest> request(
     String url, {
@@ -469,168 +617,31 @@
 
     return completer.future;
   }
-}
 
-extension URLToUri on URL {
-  /// Converts this to a Dart [Uri] object.
-  Uri get toDart => Uri.parse(toString());
-}
-
-extension UriToURL on Uri {
-  /// Converts this to a JavaScript [URL] object.
-  ///
-  /// Throws an [ArgumentError] if this isn't an absolute URL, since [URL] can
-  /// only represent absolute URLs.
-  URL get toJS {
-    try {
-      return URL(toString());
-    } catch (_) {
-      throw ArgumentError.value(this, 'this', '"$this" isn\'t a valid JS URL.');
+  @Equivalence(type: 'HttpRequest', member: 'responseHeaders')
+  Map<String, String> get responseHeaders {
+    final headers = <String, String>{};
+    final headersString = getAllResponseHeaders();
+    final headersList = headersString.split('\r\n');
+    for (final header in headersList) {
+      if (header.isEmpty) {
+        continue;
+      }
+      final splitIdx = header.indexOf(': ');
+      if (splitIdx == -1) {
+        continue;
+      }
+      final key = header.substring(0, splitIdx).toLowerCase();
+      final value = header.substring(splitIdx + 2);
+      if (headers.containsKey(key)) {
+        headers[key] = '${headers[key]}, $value';
+      } else {
+        headers[key] = value;
+      }
     }
+    return headers;
   }
 }
 
-extension MouseEventExtension on MouseEvent {
-  @Equivalence(type: 'MouseEvent', member: 'client')
-  Point get client => Point(clientX, clientY);
-
-  @Equivalence(type: 'MouseEvent', member: 'screen')
-  Point get screen => Point(screenX, screenY);
-
-  @Equivalence(type: 'MouseEvent', member: 'page')
-  Point get page => Point(pageX, pageY);
-
-  // This really belongs on the `DragEvent` subtype, but `dart:html` moved it
-  // up.
-  @Equivalence(type: 'MouseEvent', member: 'dataTransfer')
-  external DataTransfer get dataTransfer;
-}
-
-extension NodeExtension on Node {
-  @Equivalence(type: 'Node', member: 'text')
-  String? get text => textContent;
-
-  @Equivalence(type: 'Node', member: 'text')
-  set text(String? s) => textContent = s;
-
-  @Equivalence(type: 'Node', member: 'append')
-  Node append(Node other) => appendChild(other);
-
-  @Equivalence(type: 'Node', member: 'clone')
-  Node clone(bool? deep) => cloneNode(deep ?? false);
-
-  @Equivalence(type: 'Node', member: 'parent')
-  Element? get parent => parentElement;
-
-  @Equivalence(type: 'Node', member: 'nextNode')
-  Node? get nextNode => nextSibling;
-
-  @Equivalence(type: 'Node', member: 'remove')
-  void remove() {
-    final parent = parentNode;
-    if (parent != null) {
-      parent.removeChild(this);
-    }
-  }
-
-  @Equivalence(type: 'Node', member: 'insertAllBefore')
-  void insertAllBefore(Iterable<Node> newNodes, Node child) {
-    // `toList` to avoid potential infinite recursion if `newNodes` is a wrapper
-    // around this `Node`.
-    for (var node in newNodes.toList()) {
-      insertBefore(node, child);
-    }
-  }
-
-  /// Returns [childNodes] as a modifiable [List].
-  @Equivalence(type: 'Node', member: 'childNodes')
-  List<Node> get childNodesAsList => NodeListListWrapper(this, childNodes);
-
-  @Equivalence(type: 'Node', member: 'nodes')
-  List<Node> get nodes => childNodesAsList;
-
-  @Equivalence(type: 'Node', member: 'nodes')
-  set nodes(Iterable<Node> value) {
-    final copy = value.toList();
-    text = '';
-    for (final node in copy) {
-      appendChild(node);
-    }
-  }
-}
-
-extension NodeListExtension on NodeList {
-  /// Returns node list as an immutable [List].
-  List<T> asList<T extends Node>() => JSImmutableListWrapper<NodeList, T>(this);
-
-  @Equivalence(type: 'NodeList', member: 'isEmpty')
-  bool get isEmpty => length == 0;
-
-  @Equivalence(type: 'NodeList', member: 'elementAt')
-  Node elementAt(int i) => item(i)!;
-}
-
-extension StorageExtension on Storage {
-  @Equivalence(type: 'Storage', member: '[]')
-  String? operator [](String key) => getItem(key);
-
-  @Equivalence(type: 'Storage', member: '[]=')
-  void operator []=(String key, String value) => setItem(key, value);
-}
-
-extension TouchEventExtension on TouchEvent {
-  // Safari still doesn't support `TouchEvent`s:
-  // https://developer.mozilla.org/en-US/docs/Web/API/TouchEvent
-  @Equivalence(type: 'TouchEvent', member: 'supported')
-  static bool get supported {
-    try {
-      TouchEvent('touches');
-      return true;
-    } catch (e) {
-      return false;
-    }
-  }
-}
-
-extension TouchExtension on Touch {
-  @Equivalence(type: 'Touch', member: 'page')
-  Point get page => Point(pageX, pageY);
-
-  @Equivalence(type: 'Touch', member: 'client')
-  Point get client => Point(clientX, clientY);
-}
-
-extension TouchListExtension on TouchList {
-  List<Touch> asList() => JSImmutableListWrapper<TouchList, Touch>(this);
-  @Equivalence(type: 'TouchList', member: 'first')
-  Touch get first => item(0)!;
-  @Equivalence(type: 'TouchList', member: 'isEmpty')
-  bool get isEmpty => length == 0;
-  @Equivalence(type: 'TouchList', member: 'elementAt')
-  Touch elementAt(int i) => item(i)!;
-}
-
-extension WindowExtension on Window {
-  @Equivalence(type: 'Window', member: 'animationFrame')
-  Future<num> get animationFrame {
-    final completer = Completer<num>.sync();
-    void getTimestamp(num timestamp) {
-      completer.complete(timestamp);
-    }
-
-    requestAnimationFrame(getTimestamp.toJS);
-    return completer.future;
-  }
-
-  @Equivalence(type: 'Window', member: 'console')
-  StringConsole get console => StringConsole(dom.console);
-
-  @Equivalence(type: 'Window', member: 'localStorage')
-  StorageMap get localStorageAsMap => StorageMap(localStorage);
-
-  @Equivalence(type: 'Window', member: 'sessionStorage')
-  StorageMap get sessionStorageAsMap => StorageMap(sessionStorage);
-}
-
 @Equivalence(type: null, member: 'querySelector')
 Element? querySelector(String selectors) => document.querySelector(selectors);
