Litmos Lane
by Maxim_Wolf
HTML
<div class="wolf-lane">
<h1 class="wolf-lane__title">
overdue / not compliant
</h1>
<button class="move move-left" disabled >
<
</button>
<ul class="wolf-list">
<li class="wolf-list__item" tabindex=0>l1</li>
<li class="wolf-list__item" tabindex=0>l2 l2 l2 l2 l2 l2 l2 l2 l2 l2 l2 l2 l2 l2 l2 l2 l2 l2 l2 l2 l2 l2 l2 l2 l2 l2 </li>
<li class="wolf-list__item" tabindex=0>l3</li>
<li class="wolf-list__item" tabindex=0>l4</li>
<li class="wolf-list__item" tabindex=0>l5</li>
</ul>
<button class="move move-right">
>
</button>
</div>
CSS
:root {
--litmos-scroll-button-size: 2.5em;
--litmos-lane-border: rgba(0, 0, 0, 0.5);
--litmos-lane-backbround: rbga(0, 0, 0, 0.3);
}
html {
scroll-behavior: smooth;
font-family: sans-serif;
}
.wolf-lane {
display: grid;
grid-template-columns: auto 1fr auto;
align-items: center;
border-radius: 1em;
background-color: var(--litmos-lane-backbround);
border-color: var(--litmos-lane-border);
border-width: 1px;
border-style: solid;
margin-left: calc(var(--litmos-scroll-button-size)/2);
margin-right: calc(var(--litmos-scroll-button-size)/2);
}
.wolf-lane__title {
grid-column: 1/-1;
padding-top: calc(var(--litmos-scroll-button-size)/2);
padding-left: calc(var(--litmos-scroll-button-size)/2);
margin: 0;
font-size: 1.2em;
text-transform: capitalize;
color: red;
}
.wolf-lane__title:before {
content: '';
display: inline-block;
width: 7px;
height: 24px;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none'%3E%3Cpath d='M0 0.574718L7 0.574707L5.51669 18.5747H1.47896L0 0.574718Z' fill='red'/%3E%3Cpath d='M1 20.5747H6V24.5747H1V20.5747Z' fill='red'/%3E%3C/svg%3E");
}
.wolf-list {
list-style: none;
padding: 0;
display: flex;
flex-wrap: nowrap;
overflow-x: scroll;
justify-content: start;
gap: 0.5em;
scrollbar-width: none;
}
.wolf-list::-webkit-scrollbar {
display: none;
}
.wolf-list::-moz-scrollbar {
display: none;
}
.wolf-list__item {
background-color: #336688;
overflow: hidden;
min-width: 12em;
max-width: 12em;
min-height: 11em;
color: #ccccFF;
padding: 0.5em;
border-radius: 0.5em;
}
.wolf-list__item:focus {
box-shadow: 0 0 4px red;
}
.move {
width: var(--litmos-scroll-button-size);
height: var(--litmos-scroll-button-size);
border-radius: 50%;
display: grid;
justify-items: center;
align-items: center;
padding: 0;
margin: 0;
}
.move.move-left {
margin-left: calc(-1*var(--litmos-scroll-button-size)/2);
/*z-index:...
JavaScript
const forseScroll = (left, container) => (e) => {
const item = container.querySelector('.wolf-list__item');
const sibling = item.nextElementSibling;
const size = sibling.getBoundingClientRect().left - item.getBoundingClientRect().left;
container.scrollBy({
top: 0,
left: (left ? -1 : 1) * size,
behavior: "smooth",
});
}
const item = document.querySelector('.wolf-list');
const left = document.querySelector('.move-left');
const right = document.querySelector('.move-right');
const handleLeft = forseScroll(true, item);
const handleRight = forseScroll(false, item);
left.addEventListener('click', handleLeft);
right.addEventListener('click', handleRight);