(function () {
'use strict';
function clamp(value, min, max) {
return Math.min(Math.max(value, min), max);
}
/* =====================================================
TJÄNSTER – MANUELL BLÄDDRING
===================================================== */
const serviceTrack = document.querySelector('.rnv2-services__track');
const servicePrev = document.querySelector('.rnv2-services__prev');
const serviceNext = document.querySelector('.rnv2-services__next');
function serviceStep() {
if (!serviceTrack) return 320;
const firstCard = serviceTrack.querySelector('.rnv2-service');
if (!firstCard) return 320;
const trackStyle = window.getComputedStyle(serviceTrack);
const gap = parseFloat(
trackStyle.columnGap ||
trackStyle.gap ||
'0'
);
return firstCard.getBoundingClientRect().width + gap;
}
if (serviceTrack && servicePrev && serviceNext) {
servicePrev.addEventListener('click', function () {
serviceTrack.scrollBy({
left: -serviceStep(),
behavior: 'smooth'
});
});
serviceNext.addEventListener('click', function () {
serviceTrack.scrollBy({
left: serviceStep(),
behavior: 'smooth'
});
});
}
/* =====================================================
FÖRE & EFTER – DRAGREGLAGE
===================================================== */
document.querySelectorAll('.rnv2-compare').forEach(function (compare) {
const before = compare.querySelector('.rnv2-compare__before');
const divider = compare.querySelector('.rnv2-compare__divider');
const range = compare.querySelector('.rnv2-compare__range');
if (!before || !divider || !range) return;
function updateCompare(rawValue) {
const value = clamp(Number(rawValue), 0, 100);
before.style.clipPath =
'inset(0 ' + (100 - value) + '% 0 0)';
before.style.webkitClipPath =
'inset(0 ' + (100 - value) + '% 0 0)';
divider.style.left = value + '%';
}
updateCompare(range.value);
range.addEventListener('input', function () {
updateCompare(this.value);
});
});
/* =====================================================
FÖRE & EFTER – MANUELL SLIDE
===================================================== */
const resultsRoot = document.getElementById('rnv2Results');
if (resultsRoot) {
const slides = Array.from(
resultsRoot.querySelectorAll('.rnv2-result')
);
const dots = Array.from(
resultsRoot.querySelectorAll('.rnv2-results__dots button')
);
const prev = resultsRoot.querySelector('.rnv2-results__prev');
const next = resultsRoot.querySelector('.rnv2-results__next');
let current = 0;
function showResult(index) {
if (!slides.length) return;
current = (index + slides.length) % slides.length;
slides.forEach(function (slide, i) {
const active = i === current;
slide.classList.toggle('is-active', active);
slide.setAttribute(
'aria-hidden',
active ? 'false' : 'true'
);
});
dots.forEach(function (dot, i) {
const active = i === current;
dot.classList.toggle('is-active', active);
dot.setAttribute(
'aria-current',
active ? 'true' : 'false'
);
});
resultsRoot.dataset.current = String(current);
}
if (prev) {
prev.addEventListener('click', function () {
showResult(current - 1);
});
}
if (next) {
next.addEventListener('click', function () {
showResult(current + 1);
});
}
dots.forEach(function (dot) {
dot.addEventListener('click', function () {
showResult(Number(this.dataset.index || 0));
});
});
showResult(0);
}
/* =====================================================
OMDÖMEN – MANUELLT, ETT KORT I TAGET
===================================================== */
const reviewsRoot = document.querySelector('.rnv2-reviews');
if (reviewsRoot) {
const track = reviewsRoot.querySelector('.rnv2-reviews__track');
const cards = Array.from(
reviewsRoot.querySelectorAll('.rnv2-review')
);
const dots = Array.from(
reviewsRoot.querySelectorAll('.rnv2-reviews__dots button')
);
const prev = reviewsRoot.querySelector('.rnv2-reviews__prev');
const next = reviewsRoot.querySelector('.rnv2-reviews__next');
let currentReview = 0;
function showReview(index) {
if (!cards.length || !track) return;
currentReview =
(index + cards.length) % cards.length;
cards.forEach(function (card, i) {
card.classList.toggle(
'is-active',
i === currentReview
);
});
dots.forEach(function (dot, i) {
const active = i === currentReview;
dot.classList.toggle('is-active', active);
dot.setAttribute(
'aria-current',
active ? 'true' : 'false'
);
});
const activeCard = cards[currentReview];
track.scrollTo({
left: activeCard.offsetLeft,
behavior: 'smooth'
});
}
if (prev) {
prev.addEventListener('click', function () {
showReview(currentReview - 1);
});
}
if (next) {
next.addEventListener('click', function () {
showReview(currentReview + 1);
});
}
dots.forEach(function (dot) {
dot.addEventListener('click', function () {
showReview(Number(this.dataset.index || 0));
});
});
showReview(0);
}
})();