Inline a small highlighter in demo
diff --git a/demo/index.html b/demo/index.html
index 2086d04..d013b26 100644
--- a/demo/index.html
+++ b/demo/index.html
@@ -25,14 +25,14 @@
       content: '📌';
       font-size: 75%;
     }
+    mark {
+      background-color: rgba(255, 255, 0, 0.5);
+      outline: 0.1px solid rgba(255, 100, 0, 0.8);
+    }
     #parsed {
       height: 15rem;
       overflow: scroll;
     }
-    .highlighted {
-      background-color: rgba(255, 255, 120, 0.5);
-      outline: 0.1px solid rgba(255, 100, 0, 0.8);
-    }
   </style>
   <main>
     <h1>Selector Demonstration</h1>
diff --git a/demo/index.js b/demo/index.js
index d65e87e..c4aa48e 100644
--- a/demo/index.js
+++ b/demo/index.js
@@ -25,12 +25,62 @@
   describeTextQuote,
 } from '@annotator/dom';
 import { makeRefinable } from '@annotator/selector';
-import highlightRange from 'dom-highlight-range';
 
 function clear() {
   corpus.innerHTML = selectable.innerHTML;
 }
 
+function highlight(range) {
+  for (const node of textNodes(range)) {
+    const mark = document.createElement('mark');
+    const markRange = document.createRange();
+    markRange.selectNode(node);
+    markRange.surroundContents(mark);
+  }
+}
+
+function textNodes(range) {
+  const nodes = [];
+
+  if (range.collapsed) return nodes;
+
+  let startNode = range.startContainer;
+  let startOffset = range.startOffset;
+
+  if (startNode.nodeType === 3) {
+    if (startOffset > 0 && startOffset < startNode.length) {
+      startNode = startNode.splitText(startOffset);
+      startOffset = 0;
+    }
+  }
+
+  let endNode = range.endContainer;
+  let endOffset = range.endOffset;
+
+  if (endNode.nodeType === 3) {
+    if (endOffset > 0 && endOffset < endNode.length) {
+      endNode = endNode.splitText(endOffset);
+      endOffset = 0;
+    }
+  }
+
+  const walker = document.createTreeWalker(document.documentElement);
+  walker.currentNode = startNode;
+
+  while (walker.currentNode !== endNode) {
+    if (walker.currentNode.nodeType === 3) {
+      nodes.push(walker.currentNode);
+    }
+    walker.nextNode();
+  }
+
+  if (endNode.nodeType === 3 && endOffset > 0) {
+    nodes.push(endNode);
+  }
+
+  return nodes;
+}
+
 const createSelector = makeRefinable(selector => {
   const selectorCreator = {
     TextQuoteSelector: createTextQuoteSelector,
@@ -59,7 +109,7 @@
   }
 
   for (const range of ranges) {
-    highlightRange(range, 'highlighted');
+    highlight(range);
   }
 
   parsed.innerText = JSON.stringify(selector, null, 2);
diff --git a/package.json b/package.json
index 514191f..2a043dc 100644
--- a/package.json
+++ b/package.json
@@ -48,7 +48,6 @@
     "chai": "^4.2.0",
     "core-js": "3",
     "cross-env": "^5.2.0",
-    "dom-highlight-range": "^1.0.1",
     "eslint": "^5.16.0",
     "eslint-config-prettier": "^4.1.0",
     "eslint-import-resolver-babel-module": "^5.0.1",
diff --git a/yarn.lock b/yarn.lock
index ea02686..2b38e5f 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -3291,10 +3291,6 @@
   dependencies:
     esutils "^2.0.2"
 
-dom-highlight-range@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/dom-highlight-range/-/dom-highlight-range-1.0.1.tgz#0634cb60fcf4565c2b222e32b66c626358148747"
-
 dom-node-iterator@^3.5.3:
   version "3.5.3"
   resolved "https://registry.yarnpkg.com/dom-node-iterator/-/dom-node-iterator-3.5.3.tgz#32b68aa440962f1734487029f544a3db704637b7"