JSFiddle - React, Tailwind, and code Playground

HTML

<div id="callbackmenu">
    <ul>
        <li id="MenuItem1"><a href="#Item1">メニュー1</a></li>
        <li class="disabled" id="MenuItem2"><a href="#Item2">メニュー2</a></li>
        <li id="MenuItem3"><a href="#Item3">メニュー3</a>
            <ul>
                <li id="MenuItem3.1"><a href="#Item3.1">メニュー3.1</a></li>
                <li id="MenuItem3.2"><a href="#Item3.2">メニュー3.2</a></li>
                <li id="MenuItem3.3"><a href="#Item3.3">メニュー3.3</a>
                    <ul>
                        <li id="MenuItem3.3.1"><a href="#Item3.3.1">メニュー3.3.1</a></li>
                        <li id="MenuItem3.3.2"><a href="#Item3.3.2">メニュー3.3.2</a></li>
                        <li id="MenuItem3.3.3"><a href="#Item3.3.3">メニュー3.3.3</a></li>
                        <li id="MenuItem3.3.4"><a href="#Item3.3.4">メニュー3.3.4</a></li>
                    </ul>
                </li>
                <li id="MenuItem3.4"><a href="#Item3.4">メニュー3.4</a></li>
            </ul>
        </li>
        <li id="MenuItem4" class="separator"><a href="#Item4">メニュー4</a></li>
    </ul>
</div>

<div class="callback1">ここで右クリック</div>

CSS

/*!
 * jQuery Menu
 *
 * Written by sizeof(cat) <sizeofcat AT riseup DOT net>
 * Licensed under the MIT license
 * Version 2.0.0
 */
 
.catMenu {
    position: absolute;
    z-index: 99999;
    border: solid 1px #979797;
    background: #f1f1f1;
    padding: 2px 0;
    margin: 0;
    top: 0;
    left: 0;
    display: none;
    font-family: Arial, Helvetica, sans-serif;
    -o-box-shadow: 3px 3px 5px rgba(0, 0, 0, 0.3);
    -ms-box-shadow: 3px 3px 5px rgba(0, 0, 0, 0.3);
    -moz-box-shadow: 3px 3px 5px rgba(0, 0, 0, 0.3);
    -webkit-box-shadow: 3px 3px 5px rgba(0, 0, 0, 0.3);
    box-shadow: 3px 3px 5px rgba(0, 0, 0, 0.3);
}

.catMenu ul {
    list-style: none!important;
    padding: 0!important;
    margin: 0!important;
}

.catMenu li {
    margin: 1px 2px;
    padding: 1px;
    color: #333;
    box-sizing: content-box;
    -moz-box-sizing: content-box;
    list-style-type: none!important;
}

.catMenu a {
    text-decoration: none;
    color: inherit;
    display: block;
    line-height: 20px;
    height: 20px;
    outline: none;
    padding: 3px 5px 5px 5px;
    margin-left: 28px;
    border-left: 1px solid #e3e3e3;
    margin-top: -1px;
    margin-bottom: -3px;
    box-sizing: content-box;
    -moz-box-sizing: content-box;
    font-size: 14px;
}

.catMenu img {
    float: left;
    margin-top: 2px;
    margin-left: 6px;
}

.catMenu li.separator a {
    border-top: 1px solid #e3e3e3;
    margin-top: -4px;
    padding-top: 5px;
}

.catMenu li.separator,
.catMenu li.separator.hover {
    margin-top: 5px;
}

.catMenu li.hover {
    background-color: #e2ecf5;
    -moz-border-radius: 2px;
    -webkit-border-radius: 2px;
    -ms-border-radius: 2px;
    -o-border-radius: 2px;
    border-radius: 2px;
    border: 1px solid #acd8e5;
    padding: 0;
    margin: 1px 2px;
    background: -moz-linear-gradient(100% 100% 90deg, #e8f2fe, #daebf3);
    background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#daebf3), to(#e8f2fe));
    background:...

JavaScript

/*!
 * jQuery Menu
 *
 * Written by sizeof(cat) <sizeofcat AT riseup DOT net>
 * Licensed under the MIT license
 * Version 2.0.0
 */

(function($) {
    var classes = {
        popup_div: 'catMenu',
        separator: 'separator',
        hover: 'hover',
        disabled: 'disabled'
    },
    defaults = {
        menu: null,
        mouse_button: 'right',
        is_menu: true,
        min_width: 120,
        max_width: 0,
        delay: 500,
        keyboard: true,
        hover_intent: true,
        on_select: function(item) {},
        on_load: function() {},
        on_show: function() {},
        on_hide: function() {}
    },
    menus = [],
        methods = {
            init: function(options) {
                options = $.extend({}, defaults, options);
                if (!options.menu) {
                    return false;
                }
                var $menu;
                if ((typeof(options.menu) === 'object') && (options.menu.constructor.toString().match(/array/i) !== null || options.menu.length)) {
                    $menu = $('<div/>').append(build(options.menu));
                    $('body').append($menu);
                    $menu.data('catMenuDynamic', true);
                } else {
                    $menu = $(document.getElementById(options.menu));
                    $menu.data('catMenuDynamic', false);
                    $menu.data('catMenuOriginal', $menu.clone());
                }
                return this.each(function() {
                    var $this = $(this);
                    var event_namespace;
                    if (!$this.data('catMenu')) {
                        event_namespace = "catMenuContext-" + (new Date().getTime());
                        $this.data('catMenuEventNamespace', event_namespace).data('catMenuOptions', options).data('catMenu', $menu).data('catMenuEnable', true);
                        $menu.data('is_menu', options.is_menu);
                        if (!$menu.data('catMenuOwners')) {
     ...