jQuery(window).on('elementor/frontend/init', function () {
elementorFrontend.hooks.addAction('frontend/element_ready/rkit-imagecomparison.default', function ($scope, $) {
let h, w;
const imgElement = $scope.find('.img-comp-img img');
function updateImageDimensions() {
const imgCompImgs = $scope.find('.img-comp-img img');
if (imgCompImgs.length === 0) return;
const naturalWidth = imgCompImgs[0].naturalWidth;
const naturalHeight = imgCompImgs[0].naturalHeight;
if (!naturalWidth || !naturalHeight) {
console.error('Natural dimensions not available.');
return;
}
// CARI ukuran container DI ATAS rkit-s-image
const parentContainer = $scope.find('.rkit-s-image').parent();
const containerWidth = parentContainer.width();
const containerHeight = parentContainer.height();
if (containerWidth === 0) {
return;
}
let finalWidth = containerWidth;
let finalHeight = containerHeight;
// Kalau parent container height 0, hitung pakai aspect ratio
if (containerHeight === 0) {
const aspectRatio = naturalWidth / naturalHeight;
finalHeight = finalWidth / aspectRatio;
}
const aspectRatios = naturalWidth / naturalHeight;
// const heightwidth = containerWidth / containerHeight;
w = finalWidth;
h = finalWidth / aspectRatios;
// console.log('Update dimensions:', { w, h });
const conWrap = $scope.find('.con-wrap');
const imgcomp = $scope.find('.img-comp-img');
conWrap.css({ height: h + 'px', width: w + 'px' });
imgcomp.css({ height: h + 'px', width: w + 'px' });
imgCompImgs.css({ height: h + 'px', width: w + 'px' });
}
function initComparisons() {
const container = $scope.find('.img-comp-container');
const sliderMode = container.data('slider-mode');
const showIcon = container.data('show-icon');
const overlays = $scope.find('.img-comp-overlay');
overlays.each(function () {
compareImages($(this));
});
function compareImages($img) {
let slider, clicked = 0;
if (sliderMode === 'vertical') {
$img.css('height', (h / 2) + "px");
$scope.find('.img-comp-slider.vertical').remove();
slider = $('
', { class: 'img-comp-slider vertical' });
if (showIcon === 'yes') {
slider.append('
');
slider.append('
');
}
$img.before(slider);
slider.css({
top: (h / 2) - (slider.outerHeight() / 2) + "px",
left: (w / 2) - (slider.outerWidth() / 2) + "px"
});
} else {
$img.css('width', (w / 2) + "px");
$scope.find('.img-comp-slider').remove();
slider = $('
', { class: 'img-comp-slider' });
if (showIcon === 'yes') {
slider.append('');
slider.append('');
}
$img.before(slider);
slider.css({
top: (h / 2) - (slider.outerHeight() / 2) + "px",
left: (w / 2) - (slider.outerWidth() / 2) + "px"
});
}
slider.on('mousedown touchstart', slideReady);
$(window).on('mouseup touchend', slideFinish);
function slideReady(e) {
e.preventDefault();
clicked = 1;
$(window).on('mousemove touchmove', slideMove);
}
function slideFinish() {
clicked = 0;
$(window).off('mousemove touchmove', slideMove);
}
function slideMove(e) {
if (clicked === 0) return false;
let pos = (sliderMode === 'vertical') ? getCursorPosVertical(e) : getCursorPosHorizontal(e);
pos = Math.max(0, Math.min(pos, (sliderMode === 'vertical' ? h : w)));
slide(pos);
}
function getCursorPosVertical(e) {
e = (e.changedTouches) ? e.changedTouches[0] : e;
const imgOffset = $img.offset();
return e.pageY - imgOffset.top;
}
function getCursorPosHorizontal(e) {
e = (e.changedTouches) ? e.changedTouches[0] : e;
const imgOffset = $img.offset();
return e.pageX - imgOffset.left;
}
function slide(pos) {
if (sliderMode === 'vertical') {
$img.css('height', pos + "px");
slider.css('top', pos - (slider.outerHeight() / 2) + "px");
} else {
$img.css('width', pos + "px");
slider.css('left', pos - (slider.outerWidth() / 2) + "px");
}
}
}
}
function initializeImage() {
updateImageDimensions();
initComparisons();
}
imgElement.on('load', function () {
setTimeout(initializeImage, 100);
});
if (imgElement[0].complete) {
setTimeout(initializeImage, 100);
}
// Ini yg baru bro
elementorFrontend.on('resize', function () {
// console.log('Elementor editor resized');
setTimeout(initializeImage, 200); // kasih delay kecil biar layout fix dulu
});
// Plus backup pakai ResizeObserver juga (kalau user resize manual di browser)
new ResizeObserver(() => {
setTimeout(initializeImage, 200);
}).observe($scope[0]);
});
});