Сначала вы дублируете первый слайд и вставляете в конец, а затем дублируете последний слайд и вставляете в начало:
var lastSlide = carousel_images[slidecount - 1].outerHTML;
var firstSlide = carousel_images[0].outerHTML;
carousel_slide.insertAdjacentHTML('afterbegin', lastSlide);
carousel_slide.insertAdjacentHTML('beforeend', firstSlide);
// Shift to the second slide:
carousel_slide.style.transform = `translateX(${-size}px)`;
При переходе к слайду перед первым (копия последнего ), вы ждете окончания анимации и молча переходите к последнему:
if (counter < 0) {
setTimeout(() => {
counter = carousel_images.length - 1;
carousel_slide.style.transition = "none";
carousel_slide.style.transform = `translateX(${-size * (counter + 1)}px)`;
}, 300);
}
А когда вы переходите к слайду после последнего (копия первого), вы молча переходите к первому :
if (counter >= carousel_images.length) {
setTimeout(() => {
counter = 0;
carousel_slide.style.transition = "none";
carousel_slide.style.transform = `translateX(${-size}px)`;
}, 300);
}
Рабочая демоверсия: https://codepen.io/bortao/pen/MWwOVbd