JSFiddle - React, Tailwind, and code Playground

by Gerald Fullam

HTML

<div class="expandingTextarea">
    <pre><span></span><br /></pre>
    <textarea placeholder="Type as much as you like."></textarea>
</div>

CSS

body {
    margin: 20px;
}

textarea,
pre {
    margin: 0;
    padding: 0;
    border: 0;
    outline: 0;
}

.expandingTextarea {
    position: relative;
    border: 1px solid #888;
    background: #fff;
}

.expandingTextarea>textarea,
.expandingTextarea>pre {
    padding: 5px;
    font: 400 13px/16px helvetica, arial, sans-serif;
    white-space: pre-wrap;
    word-wrap: break-word;
    background: transparent;
    -webkit-box-sizing: border-box;
       -moz-box-sizing: border-box;
        -ms-box-sizing: border-box;
            box-sizing: border-box;
}

.expandingTextarea>textarea {
    position: absolute;
    top: 0;
    left: 0;
    overflow: hidden;
    width: 100%;
    height: 100%;
    resize: none;
}

.expandingTextarea>pre {
    display: block;
    visibility: hidden;
}

JavaScript

var $textarea = $('.expandingTextarea>textarea'),
    $mirror   = $('.expandingTextarea>pre>span');

$textarea.on('input propertychange', function () {
    $mirror.html($(this).val());
});