JSFiddle - React, Tailwind, and code Playground

HTML

<script src="//cdnjs.cloudflare.com/ajax/libs/fabric.js/1.4.13/fabric.min.js"></script>
<canvas class="panelSmiley" 
    data-text="Hello World!"
    data-animate="true"
    style="border:1px solid #ddd;">
</canvas>

JavaScript

var panelSmiley = function (target, options) {
    options.text = options.text || {};
    options.board = options.board || {};
    options.stake = options.stake || {};
    options.smiley = options.smiley || {};
    options.animate = options.animate || {};

    var _opt = {
        text: {
            text: options.text.text || 'Your text!',
            color: options.text.color || 'black',
            font: options.text.font || 'Sans Serif',
            size: options.text.size || '16',
        },
        board: {
            background: options.board.background || 'white',
            border: options.board.border || 'black',
        },
        stake: {
            color: options.stake.color || '#884c30',
        },
        smiley: {
            image: options.smiley.image || 'http://www.lexpage.net/static/images/smiley/smile.gif',
            offsetX: options.smiley.offsetX || 0,
            offsetY: options.smiley.offsetY || 0,
        },
        animate: {
            animation: options.animate.animation || false,
            duration: options.animate.duration || 600,
        },
    };

    var CST = {
        MARGIN_V: 5,
        MARGIN_H: 6,
        TEXT_PADDING_V: 5,
        TEXT_PADDING_H: 10,
        STAKE_HEIGHT: 25,
        STAKE_WIDTH: 4,
        BORDER_WIDTH: 1,
    };

    // Save the bears, save the global scopes
    (function () {
        var text = new fabric.Text(_opt.text.text, {
            fontFamily: _opt.text.font,
            fontSize: _opt.text.size,
            fill: _opt.text.color,
            textAlign: 'center',
            left: CST.TEXT_PADDING_H + CST.BORDER_WIDTH,
            top: CST.TEXT_PADDING_V + CST.BORDER_WIDTH,
        });

        var board = new fabric.Rect({
            width: text.width + 2 * CST.TEXT_PADDING_H,
            height: text.height + 2 * CST.TEXT_PADDING_V,
            fill: _opt.board.background,
            stroke: _opt.board.border,
            strokeLineJoin: 'round',
            strokeWidth:...