JSFiddle - React, Tailwind, and code Playground

by David Avellan

HTML

<div class="acidjs-css3-treeview">
    <ul>
        <li>
            <input type="checkbox" id="node-0" /><label><input type="checkbox" /><span></span></label><label for="node-0">Striking</label>
			<ul>
		        <li>
		            <input type="checkbox" id="node-0-0" /><label><input type="checkbox" /><span></span></label><label for="node-0-0">Footwork</label>
		            <ul>
				        <li><input type="checkbox" id="node-0-0-0" /><label><input type="checkbox" /><span></span></label><label for="node-0-0-0">Stance</label></li>
				        <li><input type="checkbox" id="node-0-0-1" /><label><input type="checkbox" /><span></span></label><label for="node-0-0-1">Basic Movement</label></li>
				        <li><input type="checkbox" id="node-0-0-2" /><label><input type="checkbox" /><span></span></label><label for="node-0-0-2">Pendulum Steps</label></li>
				        <li><input type="checkbox" id="node-0-0-3" /><label><input type="checkbox" /><span></span></label><label for="node-0-0-3">Shuffle Steps</label></li> 
				        <li><input type="checkbox" id="node-0-0-4" /><label><input type="checkbox" /><span></span></label><label for="node-0-0-4">Circling</label></li>
				        <li><input type="checkbox" id="node-0-0-5" /><label><input type="checkbox" /><span></span></label><label for="node-0-0-5">Peek a boo</label></li>
				        <li><input type="checkbox" id="node-0-0-6" /><label><input type="checkbox" /><span></span></label><label for="node-0-0-6">Pivoting</label></li>
				        <li><input type="checkbox" id="node-0-0-7" /><label><input type="checkbox" /><span></span></label><label for="node-0-0-7">Switch Stance</label></li>
				        <li><input type="checkbox" id="node-0-0-8" /><label><input type="checkbox" /><span></span></label><label for="node-0-0-8">Shifting</label></li>
			        </ul>
		        </li>
		        <li>
		            <input type="checkbox" id="node-0-1" /><label><input type="checkbox" /><span></span></label><label...

CSS

/*
 * Imageless CSS3 Treeview with Checkbox Support
 * @namespace window.AcidJs
 * @class CSS3Treeview
 * @version 3.0
 * @author Martin Ivanov
 * @url developer website: http://wemakesites.net/
 * @url developer twitter: https://twitter.com/#!/wemakesitesnet
 * @url developer blog http://acidmartin.wordpress.com/
 **/
 
/*
 * Do you like this solution? Please, donate:
 * https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=QFUHPWJB2JDBS
 **/
 
.acidjs-css3-treeview,
.acidjs-css3-treeview *
{
    padding: 0;
    margin: 0;
    list-style: none;
}
 
.acidjs-css3-treeview label[for]::before,
.acidjs-css3-treeview label span::before
{
    content: "\25b6";
    display: inline-block;
    margin: 2px 0 0;
    width: 13px;
    height: 13px;
    vertical-align: top;
    text-align: center;
    color: #e74c3c;
    font-size: 8px;
    line-height: 13px;
}
 
.acidjs-css3-treeview li ul
{
    margin: 0 0 0 22px;
}
 
.acidjs-css3-treeview *
{
    vertical-align: middle;
}
 
.acidjs-css3-treeview
{
    font: normal 11px/16px "Segoe UI", Arial, Sans-serif;
}
 
.acidjs-css3-treeview li
{
    -webkit-user-select: none;
    -moz-user-select: none;
    user-select: none;
}
 
.acidjs-css3-treeview input[type="checkbox"]
{
    display: none;
}
 
.acidjs-css3-treeview label
{
    cursor: pointer;
}
 
.acidjs-css3-treeview label[for]::before
{
    -webkit-transform: translatex(-24px);
    -moz-transform: translatex(-24px);
    -ms-transform: translatex(-24px);
    -o-transform: translatex(-24px);
    transform: translatex(-24px);
}
 
.acidjs-css3-treeview label span::before
{
    -webkit-transform: translatex(16px);
    -moz-transform: translatex(16px);
    -ms-transform: translatex(16px);
    -o-transform: translatex(16px);
    transform: translatex(16px);
}
 
.acidjs-css3-treeview input[type="checkbox"][id]:checked ~ label[for]::before
{
    content: "\25bc";
}
 
.acidjs-css3-treeview input[type="checkbox"][id]:not(:checked) ~ ul
{
    display: none;
}
...

JavaScript

$(".acidjs-css3-treeview").delegate("label input:checkbox", "change", function() {
    var
        checkbox = $(this),
        selectNestedListCheckbox = checkbox.parents("li").children("label").children("input"),
        siblingCheckboxes = checkbox.parentsUntil("ul","li").children("label").children("input");
 
    if(checkbox.is(":checked")) {
        return selectNestedListCheckbox.prop("checked", true);
    }
   selectNestedListCheckbox.prop("checked", false);
});