JSFiddle - React, Tailwind, and code Playground

HTML

<div id="selectable">
  <p>Hello world, <b>Attack on Titan</b> season two!</p>
  <p>Another paragraph with sample text.</p>
</div>
<div id="notSelectable">
  <p>The selection will behave normally on this div.</p>
</div>

JavaScript

(function(el){
	var prevRangeInfo = {};
	el.addEventListener('mouseup',function(evt){
		if (document.createRange) { // Works on all browsers, including IE 9+
    	
			var selected = window.getSelection();
			/* if(selected.toString().length){ */
				var	d = document,
					nA = selected.anchorNode,
					oA = selected.anchorOffset,
					nF = selected.focusNode,
					oF = selected.focusOffset,
					range = d.createRange();
        
				range.setStart(nA,oA);
				range.setEnd(nF,oF);
				
				// Check if direction of selection is right to left
				if(range.startContainer !== nA || (nA === nF && oF < oA)){
					range.setStart(nF,oF);
					range.setEnd(nA,oA);
				}
				
				// Extend range to the next space or end of node
				while(range.endOffset < range.endContainer.textContent.length && !/\s$/.test(range.toString())){
					range.setEnd(range.endContainer, range.endOffset + 1);
				}
				// Extend range to the previous space or start of node
				while(range.startOffset > 0 && !/^\s/.test(range.toString())){
					range.setStart(range.startContainer, range.startOffset - 1);
				}
				
				// Remove spaces
				if(/\s$/.test(range.toString()) && range.endOffset > 0)
					range.setEnd(range.endContainer, range.endOffset - 1);
				if(/^\s/.test(range.toString()))
					range.setStart(range.startContainer, range.startOffset + 1);
				
        // Check if another range was previously selected
        if(prevRangeInfo.startContainer && nA === nF && oA === oF){
      		var rangeTryLeft = d.createRange(),
          	rangeTryRight = d.createRange(),
          	nAp = prevRangeInfo.startContainer;
            oAp = prevRangeInfo.startOffset;
            nFp = prevRangeInfo.endContainer;
            oFp = prevRangeInfo.endOffset;
          rangeTryLeft.setStart(nFp,oFp-1);
          rangeTryLeft.setEnd(range.endContainer,range.endOffset);
          rangeTryRight.setStart(range.startContainer,range.startOffset);
          rangeTryRight.setEnd(nAp,oAp+1);
          
          // Add...