Reviews
<style>
/* =================================
CUSTOMER REVIEWS
================================= */
.customer-reviews {
max-width: 1200px;
margin: 0 auto;
padding: 45px 20px;
font-family: Arial, sans-serif;
box-sizing: border-box;
overflow: hidden;
}
/* =================================
HEADING
================================= */
.reviews-heading {
text-align: center;
margin-bottom: 30px;
}
.reviews-heading h2 {
font-size: 32px;
font-weight: 700;
margin: 0 0 8px;
color: #7B1134;
letter-spacing: -0.5px;
line-height: 1.2;
}
.heading-heart {
color: #7B1134;
font-size: 23px;
display: inline-block;
margin-right: 5px;
vertical-align: 2px;
}
.reviews-heading p {
color: #777;
font-size: 15px;
margin: 0;
}
/* =================================
CAROUSEL WRAPPER
================================= */
.reviews-wrapper {
position: relative;
width: 100%;
}
/* =================================
CAROUSEL
================================= */
.reviews-grid {
display: flex;
gap: 20px;
overflow-x: auto;
overflow-y: hidden;
scroll-snap-type: x mandatory;
scroll-behavior: smooth;
-webkit-overflow-scrolling: touch;
scrollbar-width: none;
padding: 5px 3px 15px;
cursor: grab;
touch-action: pan-x;
user-select: none;
}
.reviews-grid:active {
cursor: grabbing;
}
.reviews-grid::-webkit-scrollbar {
display: none;
}
/* =================================
REVIEW CARD
================================= */
.review-card {
flex: 0 0 calc((100% - 40px) / 3);
box-sizing: border-box;
background: #fff;
border: 1px solid #e8e8e8;
border-radius: 14px;
padding: 22px;
box-shadow: 0 4px 15px rgba(0,0,0,0.06);
scroll-snap-align: start;
scroll-snap-stop: always;
transition:
transform 0.25s ease,
box-shadow 0.25s ease;
}
.review-card:hover {
transform: translateY(-3px);
box-shadow: 0 7px 20px rgba(0,0,0,0.09);
}
/* =================================
STARS
================================= */
.review-stars {
color: #f5b301;
font-size: 18px;
letter-spacing: 2px;
margin-bottom: 12px;
}
/* =================================
REVIEW TEXT
================================= */
.review-text {
font-size: 15px;
line-height: 1.6;
color: #333;
margin: 0 0 18px;
min-height: 72px;
}
/* =================================
REVIEWER
================================= */
.reviewer {
display: flex;
align-items: center;
gap: 10px;
border-top: 1px solid #eee;
padding-top: 14px;
}
.reviewer-avatar {
width: 40px;
height: 40px;
min-width: 40px;
border-radius: 50%;
background: #f1f1f1;
display: flex;
align-items: center;
justify-content: center;
font-weight: 700;
font-size: 13px;
color: #555;
}
.reviewer-name {
font-size: 14px;
font-weight: 700;
color: #222;
margin: 0;
}
.verified {
font-size: 12px;
color: #168a45;
margin-top: 3px;
}
/* =================================
ARROWS
================================= */
.review-arrow {
position: absolute;
top: 50%;
transform: translateY(-50%);
width: 42px;
height: 42px;
border-radius: 50%;
border: 1px solid #ddd;
background: #fff;
box-shadow: 0 3px 12px rgba(0,0,0,0.12);
cursor: pointer;
z-index: 10;
display: flex;
align-items: center;
justify-content: center;
font-size: 21px;
color: #7B1134;
transition:
all 0.2s ease;
}
.review-arrow:hover {
transform: translateY(-50%) scale(1.06);
background: #7B1134;
color: #fff;
border-color: #7B1134;
}
.review-prev {
left: -18px;
}
.review-next {
right: -18px;
}
/* =================================
DOTS
================================= */
.review-dots {
display: flex;
justify-content: center;
gap: 7px;
margin-top: 8px;
}
.review-dot {
width: 7px;
height: 7px;
border-radius: 50%;
background: #d5d5d5;
transition: all 0.3s ease;
cursor: pointer;
}
.review-dot.active {
width: 20px;
border-radius: 10px;
background: #7B1134;
}
/* =================================
TABLET
================================= */
@media (max-width: 900px) {
.review-card {
flex: 0 0 calc((100% - 20px) / 2);
}
.review-prev {
left: -10px;
}
.review-next {
right: -10px;
}
}
/* =================================
MOBILE
================================= */
@media (max-width: 600px) {
.customer-reviews {
padding: 28px 12px 30px;
}
/* Small attractive heading */
.reviews-heading {
margin-bottom: 20px;
padding: 0 8px;
}
.reviews-heading h2 {
font-size: 21px;
line-height: 1.25;
letter-spacing: -0.3px;
margin-bottom: 5px;
color: #7B1134;
}
.heading-heart {
font-size: 17px;
margin-right: 3px;
vertical-align: 1px;
}
.reviews-heading p {
font-size: 12px;
line-height: 1.4;
color: #888;
}
/* Mobile carousel */
.reviews-grid {
gap: 14px;
padding: 4px 2px 12px;
}
/* One card at a time */
.review-card {
flex: 0 0 100%;
min-width: 100%;
padding: 18px;
border-radius: 13px;
}
.review-stars {
font-size: 17px;
margin-bottom: 10px;
}
.review-text {
font-size: 14px;
line-height: 1.55;
min-height: auto;
margin-bottom: 17px;
}
.reviewer-avatar {
width: 38px;
height: 38px;
min-width: 38px;
}
/* Finger swipe ke liye arrows hide */
.review-arrow {
display: none;
}
}
/* =================================
SMALL MOBILE
================================= */
@media (max-width: 380px) {
.reviews-heading h2 {
font-size: 19px;
}
.heading-heart {
font-size: 16px;
}
.reviews-heading p {
font-size: 11px;
}
.review-card {
padding: 16px;
}
}
/* =================================
REDUCE MOTION
================================= */
@media (prefers-reduced-motion: reduce) {
.reviews-grid {
scroll-behavior: auto;
}
.review-card {
transition: none;
}
}
</style>
<!-- =================================
CUSTOMER REVIEWS
================================= -->
<section class="customer-reviews">
<div class="reviews-heading">
<h2>
<span class="heading-heart"></span>
♥ What Our Customers Say
♥ </h2>
<p>Real feedback from our happy customers</p>
</div>
<div class="reviews-wrapper">
<!-- PREVIOUS -->
<button class="review-arrow review-prev" id="reviewPrev" aria-label="Previous review" type="button">
❮
</button>
<!-- CAROUSEL -->
<div class="reviews-grid" id="reviewsCarousel">
<!-- REVIEW 1 -->
<div class="review-card">
<div class="review-stars">★★★★★</div>
<p class="review-text">
Bohat zabardast loafers hain. Quality honestly pictures se bhi better hai. Comfortable bhi hain.
</p>
<div class="reviewer">
<div class="reviewer-avatar">MH</div>
<div>
<p class="reviewer-name">Muhammad Hamza</p>
<div class="verified">✓ Verified Purchase</div>
</div>
</div>
</div>
<!-- REVIEW 2 -->
<div class="review-card">
<div class="review-stars">★★★★★</div>
<p class="review-text">
Received my parcel today. Shoes ka look bohat premium hai and fitting bhi perfect hai.
</p>
<div class="reviewer">
<div class="reviewer-avatar">UA</div>
<div>
<p class="reviewer-name">Usman Ali</p>
<div class="verified">✓ Verified Purchase</div>
</div>
</div>
</div>
<!-- REVIEW 3 -->
<div class="review-card">
<div class="review-stars">★★★★★</div>
<p class="review-text">
Office ke liye liye thay, really satisfied. All day wear ke baad bhi feet comfortable rehte hain.
</p>
<div class="reviewer">
<div class="reviewer-avatar">AK</div>
<div>
<p class="reviewer-name">Ahsan Khan</p>
<div class="verified">✓ Verified Purchase</div>
</div>
</div>
</div>
<!-- REVIEW 4 -->
<div class="review-card">
<div class="review-stars">★★★★★</div>
<p class="review-text">
Bhai quality kamaal ki hai. Price ke according bohat achi deal mili.
</p>
<div class="reviewer">
<div class="reviewer-avatar">BA</div>
<div>
<p class="reviewer-name">Bilal Ahmed</p>
<div class="verified">✓ Verified Purchase</div>
</div>
</div>
</div>
<!-- REVIEW 5 -->
<div class="review-card">
<div class="review-stars">★★★★★</div>
<p class="review-text">
Very classy loafers. Formal dressing ke sath bohat achay lagte hain.
</p>
<div class="reviewer">
<div class="reviewer-avatar">SM</div>
<div>
<p class="reviewer-name">Saad Malik</p>
<div class="verified">✓ Verified Purchase</div>
</div>
</div>
</div>
<!-- REVIEW 6 -->
<div class="review-card">
<div class="review-stars">★★★★★</div>
<p class="review-text">
Size bilkul perfect aya. Material soft hai aur walking mein koi issue nahi.
</p>
<div class="reviewer">
<div class="reviewer-avatar">AR</div>
<div>
<p class="reviewer-name">Ali Raza</p>
<div class="verified">✓ Verified Purchase</div>
</div>
</div>
</div>
<!-- REVIEW 7 -->
<div class="review-card">
<div class="review-stars">★★★★★</div>
<p class="review-text">
Honestly didn't expect this quality at this price. Bohat satisfied hoon.
</p>
<div class="reviewer">
<div class="reviewer-avatar">HS</div>
<div>
<p class="reviewer-name">Hassan Shah</p>
<div class="verified">✓ Verified Purchase</div>
</div>
</div>
</div>
<!-- REVIEW 8 -->
<div class="review-card">
<div class="review-stars">★★★★★</div>
<p class="review-text">
Design simple but premium hai. Jeans aur shalwar kameez dono ke sath achay lagte hain.
</p>
<div class="reviewer">
<div class="reviewer-avatar">ZA</div>
<div>
<p class="reviewer-name">Zain Ahmed</p>
<div class="verified">✓ Verified Purchase</div>
</div>
</div>
</div>
<!-- REVIEW 9 -->
<div class="review-card">
<div class="review-stars">★★★★★</div>
<p class="review-text">
Parcel time pe receive hua aur packing bhi achi thi. Shoes are really comfortable.
</p>
<div class="reviewer">
<div class="reviewer-avatar">FK</div>
<div>
<p class="reviewer-name">Fahad Khan</p>
<div class="verified">✓ Verified Purchase</div>
</div>
</div>
</div>
<!-- REVIEW 10 -->
<div class="review-card">
<div class="review-stars">★★★★★</div>
<p class="review-text">
Bohat comfortable pair hai. Daily office use ke liye highly recommended.
</p>
<div class="reviewer">
<div class="reviewer-avatar">MH</div>
<div>
<p class="reviewer-name">Muneeb Hassan</p>
<div class="verified">✓ Verified Purchase</div>
</div>
</div>
</div>
<!-- =================================
APNE BAQI REVIEWS YAHAN RAKHEIN
SAME .review-card FORMAT MEIN
================================= -->
</div>
<!-- NEXT -->
<button class="review-arrow review-next" id="reviewNext" aria-label="Next review" type="button">
❯
</button>
</div>
<!-- DOTS -->
<div class="review-dots" id="reviewDots">
</div>
</section>
<script>
(function () {
const carousel =
document.getElementById("reviewsCarousel");
const prevButton =
document.getElementById("reviewPrev");
const nextButton =
document.getElementById("reviewNext");
const dotsContainer =
document.getElementById("reviewDots");
if (!carousel) return;
const cards =
carousel.querySelectorAll(".review-card");
if (!cards.length) return;
let currentIndex = 0;
let autoSlide = null;
let isDragging = false;
let startX = 0;
let startScrollLeft = 0;
/* =================================
VISIBLE CARDS
================================= */
function getVisibleCards() {
if (window.innerWidth <= 600) {
return 1;
}
if (window.innerWidth <= 900) {
return 2;
}
return 3;
}
/* =================================
MAX SLIDE
================================= */
function getMaxIndex() {
return Math.max(
0,
cards.length - getVisibleCards()
);
}
/* =================================
CREATE DOTS
================================= */
function createDots() {
dotsContainer.innerHTML = "";
const totalSlides =
getMaxIndex() + 1;
for (
let i = 0;
i < totalSlides;
i++
) {
const dot =
document.createElement("span");
dot.className =
"review-dot";
if (i === currentIndex) {
dot.classList.add("active");
}
dot.addEventListener(
"click",
function () {
stopAutoSlide();
slideTo(i);
startAutoSlide();
}
);
dotsContainer.appendChild(dot);
}
}
/* =================================
UPDATE DOTS
================================= */
function updateDots() {
const dots =
dotsContainer.querySelectorAll(
".review-dot"
);
dots.forEach(
function (dot, index) {
dot.classList.toggle(
"active",
index === currentIndex
);
}
);
}
/* =================================
SLIDE TO CARD
================================= */
function slideTo(index) {
const maxIndex =
getMaxIndex();
if (index > maxIndex) {
index = 0;
}
if (index < 0) {
index = maxIndex;
}
currentIndex = index;
const card =
cards[currentIndex];
if (!card) return;
carousel.scrollTo({
left: card.offsetLeft -
carousel.offsetLeft,
behavior: "smooth"
});
updateDots();
}
/* =================================
NEXT
================================= */
function nextSlide() {
slideTo(currentIndex + 1);
}
/* =================================
PREVIOUS
================================= */
function previousSlide() {
slideTo(currentIndex - 1);
}
/* =================================
AUTO SLIDE
================================= */
function startAutoSlide() {
stopAutoSlide();
autoSlide =
setInterval(
function () {
nextSlide();
},
3500
);
}
function stopAutoSlide() {
if (autoSlide) {
clearInterval(autoSlide);
autoSlide = null;
}
}
/* =================================
BUTTONS
================================= */
if (nextButton) {
nextButton.addEventListener(
"click",
function () {
stopAutoSlide();
nextSlide();
startAutoSlide();
}
);
}
if (prevButton) {
prevButton.addEventListener(
"click",
function () {
stopAutoSlide();
previousSlide();
startAutoSlide();
}
);
}
/* =================================
TOUCH / FINGER SWIPE
================================= */
carousel.addEventListener(
"touchstart",
function (event) {
stopAutoSlide();
startX =
event.touches[0].clientX;
},
{
passive: true
}
);
carousel.addEventListener(
"touchend",
function (event) {
const endX =
event.changedTouches[0].clientX;
const difference =
startX - endX;
if (difference > 50) {
nextSlide();
}
else if (difference < -50) {
previousSlide();
}
startAutoSlide();
},
{
passive: true
}
);
/* =================================
DESKTOP MOUSE DRAG
================================= */
carousel.addEventListener(
"mousedown",
function (event) {
isDragging = true;
startX = event.clientX;
startScrollLeft =
carousel.scrollLeft;
stopAutoSlide();
}
);
carousel.addEventListener(
"mousemove",
function (event) {
if (!isDragging) return;
const distance =
event.clientX - startX;
carousel.scrollLeft =
startScrollLeft - distance;
}
);
carousel.addEventListener(
"mouseup",
function (event) {
if (!isDragging) return;
isDragging = false;
const distance =
startX - event.clientX;
if (Math.abs(distance) > 50) {
if (distance > 0) {
nextSlide();
}
else {
previousSlide();
}
}
else {
currentIndex =
findClosestCard();
updateDots();
}
startAutoSlide();
}
);
carousel.addEventListener(
"mouseleave",
function () {
if (isDragging) {
isDragging = false;
currentIndex =
findClosestCard();
updateDots();
}
startAutoSlide();
}
);
/* =================================
FIND CLOSEST CARD
================================= */
function findClosestCard() {
let closest = 0;
let smallest =
Infinity;
cards.forEach(
function (card, index) {
const difference =
Math.abs(
card.offsetLeft -
carousel.scrollLeft
);
if (difference < smallest) {
smallest = difference;
closest = index;
}
}
);
return Math.min(
closest,
getMaxIndex()
);
}
/* =================================
MANUAL SCROLL
DOT UPDATE
================================= */
let scrollTimer;
carousel.addEventListener(
"scroll",
function () {
clearTimeout(scrollTimer);
scrollTimer =
setTimeout(
function () {
if (!isDragging) {
currentIndex =
findClosestCard();
updateDots();
}
},
100
);
},
{
passive: true
}
);
/* =================================
RESIZE
================================= */
let resizeTimer;
window.addEventListener(
"resize",
function () {
clearTimeout(resizeTimer);
resizeTimer =
setTimeout(
function () {
currentIndex =
Math.min(
currentIndex,
getMaxIndex()
);
createDots();
slideTo(currentIndex);
},
200
);
}
);
/* =================================
INITIALIZE
================================= */
createDots();
slideTo(0);
startAutoSlide();
})();
</script>
```
