diff --git a/src/generators/dom/visitors/Element/addBindings.ts b/src/generators/dom/visitors/Element/addBindings.ts
deleted file mode 100644
index 2e41cd1b19..0000000000
--- a/src/generators/dom/visitors/Element/addBindings.ts
+++ /dev/null
@@ -1,428 +0,0 @@
-import deindent from '../../../../utils/deindent';
-import flattenReference from '../../../../utils/flattenReference';
-import getStaticAttributeValue from '../../../../utils/getStaticAttributeValue';
-import { DomGenerator } from '../../index';
-import Block from '../../Block';
-import { Node } from '../../../../interfaces';
-import { State } from '../../interfaces';
-import getObject from '../../../../utils/getObject';
-import getTailSnippet from '../../../../utils/getTailSnippet';
-import stringifyProps from '../../../../utils/stringifyProps';
-import { generateRule } from '../../../../shared/index';
-import flatten from '../../../../utils/flattenReference';
-
-interface Binding {
- name: string;
-}
-
-const readOnlyMediaAttributes = new Set([
- 'duration',
- 'buffered',
- 'seekable',
- 'played'
-]);
-
-function isMediaNode(name: string) {
- return name === 'audio' || name === 'video';
-}
-
-const events = [
- {
- eventNames: ['input'],
- filter: (node: Node, binding: Binding) =>
- node.name === 'textarea' ||
- node.name === 'input' && !/radio|checkbox/.test(getStaticAttributeValue(node, 'type'))
- },
- {
- eventNames: ['change'],
- filter: (node: Node, binding: Binding) =>
- node.name === 'select' ||
- node.name === 'input' && /radio|checkbox|range/.test(getStaticAttributeValue(node, 'type'))
- },
-
- // media events
- {
- eventNames: ['timeupdate'],
- filter: (node: Node, binding: Binding) =>
- isMediaNode(node.name) &&
- (binding.name === 'currentTime' || binding.name === 'played')
- },
- {
- eventNames: ['durationchange'],
- filter: (node: Node, binding: Binding) =>
- isMediaNode(node.name) &&
- binding.name === 'duration'
- },
- {
- eventNames: ['play', 'pause'],
- filter: (node: Node, binding: Binding) =>
- isMediaNode(node.name) &&
- binding.name === 'paused'
- },
- {
- eventNames: ['progress'],
- filter: (node: Node, binding: Binding) =>
- isMediaNode(node.name) &&
- binding.name === 'buffered'
- },
- {
- eventNames: ['loadedmetadata'],
- filter: (node: Node, binding: Binding) =>
- isMediaNode(node.name) &&
- (binding.name === 'buffered' || binding.name === 'seekable')
- }
-];
-
-export default function addBindings(
- generator: DomGenerator,
- block: Block,
- state: State,
- node: Node
-) {
- const bindings: Node[] = node.attributes.filter((a: Node) => a.type === 'Binding');
- if (bindings.length === 0) return;
-
- if (node.name === 'select' || isMediaNode(node.name)) generator.hasComplexBindings = true;
-
- const needsLock = node.name !== 'input' || !/radio|checkbox|range|color/.test(getStaticAttributeValue(node, 'type'));
-
- const mungedBindings = bindings.map(binding => {
- const isReadOnly = isMediaNode(node.name) && readOnlyMediaAttributes.has(binding.name);
-
- let updateCondition: string;
-
- const { name } = getObject(binding.value);
- const { contexts } = block.contextualise(binding.value);
- const { snippet } = binding.metadata;
-
- // special case: if you have e.g. ``
- // and `selected` is an object chosen with a