JSFiddle - React, Tailwind, and code Playground

by Emanuele del Grande

HTML

<div class="logo">
    <span>CSS</span> <span>ContentEditable</span>
    <div>Safe contentEditable element</div>
</div>

<p>Studying JavaScript drag and drop interfaces. Objective: avoid pasting or dragging formatted text in contentEditable.</p>
<div>Here it is some <em>rich</em> and <strong>formatted</strong> HTML, which you can select and drag over the <code>contentEditable</code> element or copy and paste in it.</div>

<div contenteditable></div>

<div>
Pasting formatted content is avoided through the text/plain formatting of the HTML copied to clipbloard.
</div>

CSS

@import url(https://fonts.googleapis.com/css2?family=Inter:wght@100;200;300;400;500;600;700;800;900&display=swap);

:root {
  --font-color: #444;
  --font-family: Inter, Roboto, Arial, Helvetica;
  --font-size: 14px;
  --font-weight: 300;
  --letter-spacing: -0.5px;
  --main-color: #607f8b; /* #4ae */
  --inner-border-width: 1px;
  --border-color: #ddd;
  --v-padding: 10px;
}


/* GENERIC STYLE */
*, *:before, *:after { margin; 0; padding: 0; box-sizing: border-box; outline: none; }
html, body {
    font: 14px var(--font-family); color: var(--font-color); line-height: 1.4em;
    font-weight: var(--font-weight); letter-spacing: var(--letter-spacing);
}
.logo { font: 42px var(--font-family); margin: 0; padding: 10px 0 0 20px; font-weight: 800; letter-spacing: -3px; white-space: nowrap; }
.logo span:first-child {
    position: relative; top: 0; left: 0; padding: 0 13px 0 10px; color: var(--main-color); background: var(--main-color); color: #fff;
    clip-path: ellipse(100% 125% at 100% 50%); z-index: 1;
}
.logo span:nth-child(2) { position: relative;top: 0; left: 0; margin: 0 0 0 -13px; background: transparent; z-index: 2; }

.logo div { font: 12px var(--font-family); padding: 0 0 0 70px; letter-spacing: -0.5px; }


/* CONTENT EDITABLE STYLE */
div[contenteditable] {
    height: 100px; margin: 10px 0; padding: 10px; border: 1px solid #ccc; overflow: auto;
}

JavaScript

// Stupid DnD HTML5 API:
// https://www.quirksmode.org/blog/archives/2009/09/the_html5_drag.html

var editor = document.querySelector("div[contenteditable]");

editor.addEventListener("paste", function(e) {
    e.preventDefault();
    var text = e.clipboardData.getData("text/plain");
    document.execCommand("insertHTML", false, text);
});

editor.addEventListener("drop", function(e) {
	//e.preventDefault();
    //console.log(e);
    if (e.dataTransfer) {
    }
    //e.preventDefault();
	//e.stopPropagation();
});




document.ondragstart = function(event) {
  event.dataTransfer.setData("text/plain", "[%" + event.srcElement.innerHTML + "%]");
};

/* events fired on the draggable target */
document.addEventListener("drag", function(e) {}, false);
document.addEventListener("dragover", function(e) {}, false);
document.addEventListener("dragenter", function(e) {}, false);