JSFiddle - React, Tailwind, and code Playground
HTML
<script src="https://getfirebug.com/firebug-lite-debug.js"></script>
<div class="swim-lane-wrapper">
<div class="swim-lane">
<!-- Category -->
<div class="category-card" id="1" data-sort="1">
<div class="category-text">
<span>Category 1</span>
</div>
</div>
<!-- Items -->
<div class="item-row-wrapper">
<div class="item-card">
<div class="item-text">
<span class="sort-item">Item 11</span>
</div>
</div>
<div class="item-card">
<div class="item-text">
<span class="sort-item">Item 12</span>
</div>
</div>
<div class="item-card">
<div class="item-text">
<span class="sort-item">Item 13</span>
</div>
</div>
</div>
</div>
<div class="swim-lane">
<!-- Category -->
<div class="category-card" id="2" data-sort="2">
<div class="category-text">
<span>Category 2</span>
</div>
</div>
<!-- Items -->
<div class="item-row-wrapper">
<div class="item-card">
<div class="item-text">
<span class="sort-item">Item 21</span>
</div>
</div>
<div class="item-card">
<div class="item-text">
<span class="sort-item">Item 22</span>
</div>
</div>
<div class="item-card">
<div class="item-text">
<span class="sort-item">Item 23</span>
</div>
</div>
</div>
</div>
</div>
CSS
.swim-lane-wrapper {}
.swim-lane {
display: inline-block;
white-space: nowrap;
float: left;
width: 100%;
height: 100%;
border: 1px solid grey;
padding: 5px;
margin-bottom: 3px;
}
.category-card {
display: inline-block;
white-space: nowrap;
float: left;
background-color: #FFF3CC;
border: #DFBC6A 1px solid;
width: 200px;
height: 85px;
line-height: 85px;
margin-right: 10px;
box-shadow: 2px 2px 2px #999;
cursor: move;
}
.category-text {
padding: 0px 8px 0px 8px;
font-size: 12px;
white-space: normal;
text-align: center;
vertical-align: middle;
height: 80%
}
.item-card {
display: inline-block;
vertical-align: top;
background-color: #edf3ff;
border: #6d71db 1px solid;
min-width: 100px;
height: 85px;
line-height: 85px;
margin-right: 10px;
box-shadow: 2px 2px 2px #999;
cursor: move;
}
.item-text {
padding: 0px 8px 0px 8px;
font-size: 12px;
white-space: normal;
text-align: center;
vertical-align: middle;
height: 80%
}
JavaScript
$(function() {
$(".swim-lane-wrapper").sortable({
axis: "Y",
handle: ".category-card",
connectWith: ".swim-lane-wrapper",
update: function(event, ui) {
console.log(ui)
},
})
});
$(function() {
$(".item-row-wrapper")
.sortable({
connectWith: ".item-row-wrapper",
update: function(event, ui) {},
})
.disableSelection();
});