<p> </p>
<p><link href="https://fonts.googleapis.com" rel="preconnect" /> <link href="https://fonts.gstatic.com" rel="preconnect" crossorigin="" /> <link href="https://fonts.googleapis.com/css2?family=Cormorant+Garamond:ital,wght@0,300;0,400;0,600;0,700;1,300;1,400&family=DM+Sans:wght@300;400;500&display=swap" rel="stylesheet" /></p>
<style>
:root {
--bg: #080706;
--surface: #0f0e0d;
--surface-alt: #0a0908;
--border: #1e1c1a;
--border-light: #282422;
--accent: #d4b896;
--accent-gold: #c9a96e;
--star: #d4a843;
--text-primary: #f0ece4;
--text-body: rgba(240,236,228,0.7);
--text-muted: #7a7470;
--text-dim: #3a3835;
--font-display: 'Cormorant Garamond', serif;
--font-body: 'DM Sans', sans-serif;
}
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
body {
background: var(--bg);
color: var(--text-primary);
font-family: var(--font-body);
font-weight: 300;
}
a { color: inherit; text-decoration: none; }
/* ---- NAV ---- */
.site-header {
position: sticky; top: 0; z-index: 100;
padding: 1.1rem 3rem;
background: rgba(8,7,6,0.96);
border-bottom: 1px solid var(--border);
backdrop-filter: blur(12px);
}
nav { display: flex; align-items: center; justify-content: space-between; }
.nav-logo { font-family: var(--font-display); font-size: 1rem; font-weight: 600; letter-spacing: 0.45em; }
.nav-links { display: flex; list-style: none; gap: 1.8rem; align-items: center; }
.nav-links a { font-size: 0.68rem; letter-spacing: 0.14em; text-transform: uppercase; opacity: 0.45; transition: opacity 0.2s; }
.nav-links a:hover, .nav-links a.active { opacity: 1; }
.nav-cta { opacity: 1 !important; border: 1px solid rgba(255,255,255,0.25); padding: 0.38rem 0.95rem; border-radius: 2px; }
/* ---- PAGE LAYOUT ---- */
.page-wrap { max-width: 1000px; margin: 0 auto; padding: 0 2rem 6rem; }
/* ---- PAGE HEADER ---- */
.page-header {
padding: 5vh 0 4vh;
border-bottom: 1px solid var(--border);
}
.page-header-eyebrow { font-size: 0.6rem; letter-spacing: 0.3em; text-transform: uppercase; color: var(--accent); margin-bottom: 1rem; }
.page-header-title {
font-family: var(--font-display); font-size: clamp(2.8rem, 6vw, 5.5rem);
font-weight: 700; line-height: 0.92;
}
.page-header-title em { font-style: italic; color: var(--accent); font-weight: 300; }
/* ---- RATING SUMMARY BAR ---- */
.rating-summary {
padding: 2.5rem 0 2rem;
display: flex; gap: 4rem; align-items: flex-start;
border-bottom: 1px solid var(--border);
}
.rating-big-block { display: flex; flex-direction: column; align-items: center; gap: 0.5rem; min-width: 110px; }
.rating-num { font-family: var(--font-display); font-size: 4.5rem; font-weight: 700; color: var(--accent); line-height: 1; }
.stars-lg { display: flex; gap: 4px; }
.star-icon { color: var(--star); font-size: 1rem; }
.star-icon.empty { color: var(--text-dim); }
.rating-total { font-size: 0.6rem; letter-spacing: 0.15em; text-transform: uppercase; color: var(--text-muted); }
.rating-bars { flex: 1; display: flex; flex-direction: column; gap: 7px; padding-top: 0.4rem; }
.bar-row { display: grid; grid-template-columns: 28px 1fr 36px; gap: 10px; align-items: center; }
.bar-label { font-size: 0.72rem; color: var(--text-muted); text-align: right; }
.bar-track { height: 4px; background: var(--border-light); border-radius: 2px; overflow: hidden; }
.bar-fill { height: 100%; background: var(--star); border-radius: 2px; }
.bar-count { font-size: 0.6rem; color: var(--text-muted); }
.rating-tags { display: flex; flex-direction: column; gap: 0.6rem; padding-top: 0.3rem; }
.rating-tag-row { display: flex; align-items: center; gap: 0.7rem; }
.tag-label { font-size: 0.65rem; color: var(--text-muted); width: 100px; }
.tag-dots { display: flex; gap: 3px; }
.dot { width: 7px; height: 7px; border-radius: 50%; background: var(--border-light); }
.dot.filled { background: var(--star); }
/* ---- FILTER ROW ---- */
.filter-row {
padding: 1.2rem 0;
display: flex; align-items: center; gap: 0.7rem; flex-wrap: wrap;
border-bottom: 1px solid var(--border);
}
.filter-label { font-size: 0.58rem; letter-spacing: 0.2em; text-transform: uppercase; color: var(--text-muted); margin-right: 0.3rem; }
.filter-chip {
font-size: 0.64rem; padding: 0.3rem 0.85rem; border-radius: 20px;
border: 1px solid var(--border-light); color: var(--text-muted);
background: transparent; cursor: pointer; transition: all 0.2s; font-family: var(--font-body);
}
.filter-chip:hover, .filter-chip.active { border-color: var(--accent); color: var(--accent); }
/* ---- REVIEW LIST ---- */
.reviews-list { display: flex; flex-direction: column; }
/* ---- SINGLE REVIEW ---- */
.review-item {
padding: 2.2rem 0;
border-bottom: 1px solid var(--border);
}
.review-item:last-child { border-bottom: none; }
/* Row 1: stars + name + date */
.review-meta {
display: flex; align-items: center; gap: 1rem;
margin-bottom: 0.9rem;
}
.review-stars { display: flex; gap: 2px; }
.review-stars .s { color: var(--star); font-size: 0.82rem; }
.review-stars .s.empty { color: var(--text-dim); }
.review-divider { width: 1px; height: 14px; background: var(--border-light); }
.review-name { font-size: 0.82rem; font-weight: 400; color: var(--text-primary); }
.review-date { font-size: 0.72rem; color: var(--text-muted); margin-left: auto; }
/* Verified badge */
.review-verified {
font-size: 0.56rem; letter-spacing: 0.16em; text-transform: uppercase;
color: var(--accent-gold); margin-bottom: 0.75rem;
display: flex; align-items: center; gap: 5px;
}
.review-verified svg { width: 10px; height: 10px; }
/* Review title */
.review-title {
font-size: 0.88rem; font-weight: 500; color: var(--text-primary);
margin-bottom: 0.5rem;
}
/* Review body */
.review-body {
font-size: 0.88rem; line-height: 1.8; color: var(--text-body);
font-weight: 300; max-width: 72ch;
}
/* Photo thumbnails — exactly like Shopee */
.review-photos {
display: flex; gap: 8px; margin-top: 1.1rem; flex-wrap: wrap;
}
.review-photo-thumb {
width: 90px; height: 90px; border-radius: 3px; overflow: hidden;
border: 1px solid var(--border-light); cursor: pointer; position: relative;
flex-shrink: 0;
}
.review-photo-thumb img {
width: 100%; height: 100%; object-fit: cover;
transition: transform 0.3s;
}
.review-photo-thumb:hover img { transform: scale(1.04); }
/* Seller reply */
.review-reply {
margin-top: 1.2rem;
padding: 1rem 1.3rem;
background: var(--surface);
border-radius: 3px;
border-left: 2px solid rgba(212,184,150,0.25);
max-width: 72ch;
}
.reply-header {
display: flex; justify-content: space-between; align-items: center;
margin-bottom: 0.45rem;
}
.reply-label { font-size: 0.6rem; letter-spacing: 0.18em; text-transform: uppercase; color: var(--accent); font-weight: 400; }
.reply-date { font-size: 0.6rem; color: var(--text-muted); }
.reply-text { font-size: 0.82rem; line-height: 1.7; color: var(--text-muted); font-weight: 300; }
/* Helpful row */
.review-helpful {
display: flex; align-items: center; gap: 1.2rem;
margin-top: 1rem;
}
.helpful-label { font-size: 0.62rem; color: var(--text-muted); }
.helpful-btn {
font-size: 0.62rem; color: var(--text-muted);
border: 1px solid var(--border); border-radius: 20px;
padding: 0.25rem 0.8rem; background: transparent; cursor: pointer;
font-family: var(--font-body); transition: all 0.2s;
}
.helpful-btn:hover { border-color: var(--accent-gold); color: var(--accent-gold); }
/* Lightbox */
#lightbox {
display: none; position: fixed; inset: 0; z-index: 500;
background: rgba(0,0,0,0.92); align-items: center; justify-content: center;
}
#lightbox.open { display: flex; }
#lightbox img { max-width: 90vw; max-height: 90vh; object-fit: contain; border-radius: 3px; }
#lightbox-close {
position: fixed; top: 1.5rem; right: 1.5rem;
font-size: 1.5rem; color: rgba(255,255,255,0.5); cursor: pointer;
background: none; border: none; font-family: var(--font-body);
}
/* ---- FOOTER ---- */
.page-footer {
border-top: 1px solid var(--border);
padding: 2.5rem 3rem;
display: flex; justify-content: space-between; align-items: center;
}
.footer-brand { font-family: var(--font-display); font-size: 0.85rem; font-weight: 600; letter-spacing: 0.4em; }
.footer-links { display: flex; gap: 2rem; }
.footer-links a { font-size: 0.6rem; letter-spacing: 0.14em; text-transform: uppercase; color: var(--text-muted); transition: color 0.2s; }
.footer-links a:hover { color: var(--accent); }
@media (max-width: 768px) {
.site-header { padding: 1rem 1.2rem; }
.nav-links li:nth-child(1), .nav-links li:nth-child(2) { display: none; }
.page-wrap { padding: 0 1.2rem 4rem; }
.rating-summary { flex-wrap: wrap; gap: 2rem; }
.rating-tags { display: none; }
.review-date { display: none; }
.review-photo-thumb { width: 72px; height: 72px; }
.page-footer { flex-direction: column; gap: 1.5rem; align-items: flex-start; }
.wr-row { grid-template-columns: 1fr; }
}
/* ---- WRITE REVIEW ---- */
.write-review-wrap {
padding: 1.4rem 0;
border-bottom: 1px solid var(--border);
}
.write-review-btn {
display: inline-flex; align-items: center; gap: 0.55rem;
font-size: 0.7rem; font-weight: 400; letter-spacing: 0.18em; text-transform: uppercase;
color: var(--accent); border: 1px solid rgba(212,184,150,0.35);
padding: 0.65rem 1.4rem; border-radius: 2px; cursor: pointer;
background: transparent; font-family: var(--font-body);
transition: all 0.2s;
}
.write-review-btn:hover { border-color: var(--accent); background: rgba(212,184,150,0.06); }
.write-review-btn svg { width: 13px; height: 13px; }
.write-review-panel {
display: none; margin-top: 1.4rem;
padding: 2rem 2.2rem;
background: var(--surface);
border: 1px solid var(--border-light);
border-radius: 3px;
}
.write-review-panel.open { display: block; }
.wr-title-line {
font-family: var(--font-display); font-size: 1.5rem; font-weight: 600;
margin-bottom: 1.6rem; color: var(--text-primary);
}
.wr-section { margin-bottom: 1.3rem; }
.wr-label {
display: block; font-size: 0.58rem; letter-spacing: 0.22em;
text-transform: uppercase; color: var(--text-muted); margin-bottom: 0.55rem;
}
.wr-stars { display: flex; gap: 5px; cursor: pointer; }
.wr-star { font-size: 2rem; color: var(--text-dim); transition: color 0.12s; line-height: 1; user-select: none; }
.wr-star.lit { color: var(--star); }
.wr-row { display: grid; grid-template-columns: 1fr 1fr; gap: 1rem; }
.wr-input, .wr-textarea {
width: 100%; background: var(--bg); border: 1px solid var(--border);
color: var(--text-primary); font-family: var(--font-body); font-size: 0.88rem;
padding: 0.72rem 1rem; border-radius: 2px; outline: none; transition: border-color 0.2s;
}
.wr-input:focus, .wr-textarea:focus { border-color: rgba(212,184,150,0.5); }
.wr-textarea { resize: vertical; min-height: 110px; line-height: 1.7; }
.wr-actions { display: flex; align-items: center; gap: 1.2rem; margin-top: 0.6rem; }
.wr-submit {
padding: 0.85rem 2.2rem; background: var(--accent); color: #000;
font-family: var(--font-body); font-size: 0.7rem; font-weight: 500;
letter-spacing: 0.2em; text-transform: uppercase;
border: none; border-radius: 2px; cursor: pointer; transition: background 0.2s;
}
.wr-submit:hover { background: var(--accent-gold); }
.wr-cancel {
font-size: 0.68rem; color: var(--text-muted); background: none; border: none;
cursor: pointer; font-family: var(--font-body); letter-spacing: 0.1em; text-transform: uppercase;
transition: color 0.2s;
}
.wr-cancel:hover { color: var(--text-primary); }
.wr-success {
display: none; padding: 1rem 1.2rem; border-left: 2px solid var(--accent);
background: rgba(212,184,150,0.06); font-size: 0.82rem; color: var(--accent);
margin-top: 1rem; border-radius: 0 2px 2px 0;
}
/* ---- COMMENTS ---- */
.review-comments { margin-top: 0.9rem; }
.comment-item {
padding: 0.75rem 1rem;
background: rgba(255,255,255,0.022);
border-left: 2px solid var(--border-light);
border-radius: 0 2px 2px 0;
margin-bottom: 0.45rem;
}
.comment-meta { display: flex; align-items: center; gap: 0.7rem; margin-bottom: 0.3rem; }
.comment-name { font-size: 0.74rem; font-weight: 400; color: var(--text-primary); }
.comment-date { font-size: 0.6rem; color: var(--text-muted); margin-left: auto; }
.comment-body { font-size: 0.82rem; line-height: 1.65; color: var(--text-body); }
.comment-toggle-btn {
font-size: 0.61rem; color: var(--text-muted); background: none; border: none;
cursor: pointer; font-family: var(--font-body); padding: 0.15rem 0;
letter-spacing: 0.08em; transition: color 0.2s; display: inline-flex; align-items: center; gap: 4px;
margin-left: auto;
}
.comment-toggle-btn:hover { color: var(--accent); }
.comment-form {
display: none; margin-top: 0.75rem;
padding: 1rem 1.1rem;
background: var(--surface);
border: 1px solid var(--border);
border-radius: 3px;
}
.comment-form.open { display: block; }
.cf-row { margin-bottom: 0.65rem; }
.cf-input, .cf-textarea {
width: 100%; background: var(--bg); border: 1px solid var(--border);
color: var(--text-primary); font-family: var(--font-body); font-size: 0.82rem;
padding: 0.55rem 0.8rem; border-radius: 2px; outline: none; transition: border-color 0.2s;
}
.cf-input:focus, .cf-textarea:focus { border-color: rgba(212,184,150,0.45); }
.cf-textarea { resize: vertical; min-height: 72px; line-height: 1.6; }
.cf-submit {
font-size: 0.6rem; font-weight: 500; letter-spacing: 0.16em; text-transform: uppercase;
padding: 0.48rem 1.1rem; background: var(--accent); color: #000;
border: none; border-radius: 2px; cursor: pointer; font-family: var(--font-body);
transition: background 0.2s;
}
.cf-submit:hover { background: var(--accent-gold); }
.cf-cancel {
margin-left: 0.8rem; font-size: 0.6rem; color: var(--text-muted);
background: none; border: none; cursor: pointer; font-family: var(--font-body);
transition: color 0.2s;
}
.cf-cancel:hover { color: var(--text-primary); }
/* new review highlight */
@keyframes newHighlight {
from { background: rgba(212,184,150,0.1); }
to { background: transparent; }
}
.review-item.new-flash { animation: newHighlight 1.8s ease-out forwards; }
</style>
<header class="site-header"><nav><a class="nav-logo" href="https://repet.store/pages/index.html">REPET</a>
<ul class="nav-links">
<li><a href="https://repet.store/pages/why-tofu.html">Why Tofu?</a></li>
<li><a class="active" href="https://repet.store/pages/reviews.html">Reviews</a></li>
<li><a href="https://repet.store/pages/brand.html">Brand Story</a></li>
<li><a class="nav-cta" href="https://repet.store/pages/product.html">Shop Now</a></li>
</ul>
</nav></header>
<div class="page-wrap"><!-- PAGE HEADER -->
<div class="page-header">
<p class="page-header-eyebrow">REPET Level-S Natural Tofu Cat Litter · Verified Purchases</p>
<h1 class="page-header-title">Customer<br /><em>Reviews</em></h1>
</div>
<!-- RATING SUMMARY -->
<div class="rating-summary">
<div class="rating-big-block">
<div class="rating-num">4.8</div>
<div class="stars-lg"><span class="star-icon">★</span><span class="star-icon">★</span> <span class="star-icon">★</span><span class="star-icon">★</span> <span class="star-icon">★</span></div>
<div class="rating-total">2,461 reviews</div>
</div>
<div class="rating-bars">
<div class="bar-row"><span class="bar-label">5 ★</span>
<div class="bar-track">
<div class="bar-fill" style="width: 78%;"> </div>
</div>
<span class="bar-count">1,919</span></div>
<div class="bar-row"><span class="bar-label">4 ★</span>
<div class="bar-track">
<div class="bar-fill" style="width: 16%;"> </div>
</div>
<span class="bar-count">394</span></div>
<div class="bar-row"><span class="bar-label">3 ★</span>
<div class="bar-track">
<div class="bar-fill" style="width: 4%;"> </div>
</div>
<span class="bar-count">99</span></div>
<div class="bar-row"><span class="bar-label">2 ★</span>
<div class="bar-track">
<div class="bar-fill" style="width: 1%;"> </div>
</div>
<span class="bar-count">25</span></div>
<div class="bar-row"><span class="bar-label">1 ★</span>
<div class="bar-track">
<div class="bar-fill" style="width: 1%;"> </div>
</div>
<span class="bar-count">24</span></div>
</div>
<div class="rating-tags">
<div class="rating-tag-row"><span class="tag-label">Dust Control</span>
<div class="tag-dots">
<div class="dot filled"> </div>
<div class="dot filled"> </div>
<div class="dot filled"> </div>
<div class="dot filled"> </div>
<div class="dot filled"> </div>
</div>
</div>
<div class="rating-tag-row"><span class="tag-label">Clumping</span>
<div class="tag-dots">
<div class="dot filled"> </div>
<div class="dot filled"> </div>
<div class="dot filled"> </div>
<div class="dot filled"> </div>
<div class="dot filled"> </div>
</div>
</div>
<div class="rating-tag-row"><span class="tag-label">Odour Control</span>
<div class="tag-dots">
<div class="dot filled"> </div>
<div class="dot filled"> </div>
<div class="dot filled"> </div>
<div class="dot filled"> </div>
<div class="dot"> </div>
</div>
</div>
<div class="rating-tag-row"><span class="tag-label">Flushability</span>
<div class="tag-dots">
<div class="dot filled"> </div>
<div class="dot filled"> </div>
<div class="dot filled"> </div>
<div class="dot filled"> </div>
<div class="dot filled"> </div>
</div>
</div>
<div class="rating-tag-row"><span class="tag-label">Value</span>
<div class="tag-dots">
<div class="dot filled"> </div>
<div class="dot filled"> </div>
<div class="dot filled"> </div>
<div class="dot filled"> </div>
<div class="dot"> </div>
</div>
</div>
</div>
</div>
<!-- FILTER -->
<div class="filter-row"><span class="filter-label">Filter by</span> <button class="filter-chip active">All Reviews</button> <button class="filter-chip">5 Stars</button> <button class="filter-chip">4 Stars</button> <button class="filter-chip">With Photos</button></div>
<!-- WRITE A REVIEW -->
<div class="write-review-wrap"><button class="write-review-btn"> Write a Review </button>
<div id="write-review-panel" class="write-review-panel">
<div class="wr-title-line">Share your experience</div>
<form id="wr-form">
<div class="wr-section"><label class="wr-label">Your Rating *</label>
<div id="wr-stars" class="wr-stars"><span class="wr-star" data-n="1">★</span> <span class="wr-star" data-n="2">★</span> <span class="wr-star" data-n="3">★</span> <span class="wr-star" data-n="4">★</span> <span class="wr-star" data-n="5">★</span></div>
</div>
<div class="wr-row">
<div class="wr-section"><label class="wr-label" for="wr-name">Display Name *</label> <input id="wr-name" class="wr-input" required="" type="text" placeholder="e.g. @catmom_uk" /></div>
<div class="wr-section"><label class="wr-label" for="wr-title">Review Title <span style="opacity: .45;">(optional)</span></label> <input id="wr-title" class="wr-input" type="text" placeholder="Sum it up in one line" /></div>
</div>
<div class="wr-section"><label class="wr-label" for="wr-body">Your Review *</label> <textarea id="wr-body" class="wr-textarea" required="" placeholder="What did you love? How did your cat respond? Any tips?"></textarea></div>
<div class="wr-actions"><button class="wr-submit" type="submit">Post Review</button> <button class="wr-cancel" type="button">Cancel</button></div>
</form>
<div id="wr-success" class="wr-success">Thank you — your review has been posted!</div>
</div>
</div>
<!-- REVIEWS LIST -->
<div class="reviews-list"><!-- 1 -->
<div class="review-item" data-stars="5" data-has-photos="true">
<div class="review-meta">
<div class="review-stars"><span class="s">★</span><span class="s">★</span><span class="s">★</span><span class="s">★</span><span class="s">★</span></div>
<div class="review-divider"> </div>
<span class="review-name">Limary Alva 🇵🇷</span> <span class="review-date">17 June 2026 02:08</span></div>
<div class="review-verified">Verified Purchase · REPET Level-S Natural Tofu Cat Litter</div>
<p class="review-body">Esta arena de tofu me encantó por qué no suelta polvo y se disuelve con el agua, lo mejor es que es natural.</p>
<div class="review-photos">
<div class="review-photo-thumb"><img src="https://img-va.myshopline.com/image/store/1749217664136/photo-dissolving.jpg" alt="Tofu litter dissolving in water" /></div>
<div class="review-photo-thumb"><img src="https://img-va.myshopline.com/image/store/1749217664136/photo-pellets-closeup.jpg" alt="Tofu litter pellets close-up" /></div>
</div>
<div class="review-reply">
<div class="reply-header"><span class="reply-label">Seller Reply</span> <span class="reply-date">24 June 2026 23:16</span></div>
<p class="reply-text">:) Thank you for your like.</p>
</div>
<div class="review-helpful"><span class="helpful-label">Helpful?</span> <button class="helpful-btn">👍 Yes (24)</button> <button class="helpful-btn">No (1)</button></div>
</div>
<!-- 2 -->
<div class="review-item" data-stars="4" data-has-photos="false">
<div class="review-meta">
<div class="review-stars"><span class="s">★</span><span class="s">★</span><span class="s">★</span><span class="s">★</span><span class="s empty">★</span></div>
<div class="review-divider"> </div>
<span class="review-name">@l*****7</span> <span class="review-date">29 June 2026</span></div>
<div class="review-verified">Verified Purchase · REPET Level-S Natural Tofu Cat Litter · Default</div>
<p class="review-body">Good product. No dust at all, my cat adapted quickly. Will buy again.</p>
<div class="review-helpful"><span class="helpful-label">Helpful?</span> <button class="helpful-btn">👍 Yes (8)</button> <button class="helpful-btn">No (0)</button></div>
</div>
<!-- 3 -->
<div class="review-item" data-stars="5" data-has-photos="true">
<div class="review-meta">
<div class="review-stars"><span class="s">★</span><span class="s">★</span><span class="s">★</span><span class="s">★</span><span class="s">★</span></div>
<div class="review-divider"> </div>
<span class="review-name">Emma T. 🇬🇧</span> <span class="review-date">14 June 2026 09:33</span></div>
<div class="review-verified">Verified Purchase · REPET Level-S Natural Tofu Cat Litter</div>
<p class="review-title">Best litter I've ever used. Not going back.</p>
<p class="review-body">Switched from clay three months ago. Zero dust, genuinely zero — I tested it wearing a black t-shirt while scooping. The clumps hold their shape perfectly. Flushed it for the first time and it dissolved completely in under a minute. My cat took to it first try with no transition period at all.</p>
<div class="review-photos">
<div class="review-photo-thumb"><img src="https://img-va.myshopline.com/image/store/1749217664136/photo-wire-clumps.jpg" alt="Solid clumps on wire scoop" /></div>
<div class="review-photo-thumb"><img src="https://img-va.myshopline.com/image/store/1749217664136/photo-beige-round.jpg" alt="Litter in round litter box" /></div>
</div>
<div class="review-helpful"><span class="helpful-label">Helpful?</span> <button class="helpful-btn">👍 Yes (61)</button> <button class="helpful-btn">No (2)</button></div>
</div>
<!-- 4 -->
<div class="review-item" data-stars="5" data-has-photos="true">
<div class="review-meta">
<div class="review-stars"><span class="s">★</span><span class="s">★</span><span class="s">★</span><span class="s">★</span><span class="s">★</span></div>
<div class="review-divider"> </div>
<span class="review-name">Charlotte W. 🇬🇧</span> <span class="review-date">2 June 2026 18:11</span></div>
<div class="review-verified">Verified Purchase · REPET Level-S Natural Tofu Cat Litter</div>
<p class="review-title">My vet recommended it after respiratory issues</p>
<p class="review-body">My cat was diagnosed with mild asthma and the vet told us to switch to a natural, dust-free litter immediately. Found REPET and the difference was noticeable in week one. No more sneezing fits at the box, no dust film on the floor mat. The vet noticed improved breathing at the follow-up. I now tell every cat owner I meet.</p>
<div class="review-photos">
<div class="review-photo-thumb"><img src="https://img-va.myshopline.com/image/store/1749217664136/photo-grey-corner.jpg" alt="Clean litter box setup" /></div>
</div>
<div class="review-helpful"><span class="helpful-label">Helpful?</span> <button class="helpful-btn">👍 Yes (88)</button> <button class="helpful-btn">No (1)</button></div>
</div>
<!-- 5 -->
<div class="review-item" data-stars="5" data-has-photos="true">
<div class="review-meta">
<div class="review-stars"><span class="s">★</span><span class="s">★</span><span class="s">★</span><span class="s">★</span><span class="s">★</span></div>
<div class="review-divider"> </div>
<span class="review-name">Sophie L. 🇫🇷</span> <span class="review-date">20 May 2026 14:22</span></div>
<div class="review-verified">Verified Purchase · REPET Level-S Natural Tofu Cat Litter</div>
<p class="review-body">Mon chat est très difficile avec les litières mais il a accepté celle-ci immédiatement. Zéro poussière, excellente absorption, et ça se jette dans les toilettes. Je ne reviendrai jamais en arrière.</p>
<div class="review-photos">
<div class="review-photo-thumb"><img src="https://img-va.myshopline.com/image/store/1749217664136/photo-pellets-hand.jpg" alt="Tofu litter pellets in hand" /></div>
</div>
<div class="review-reply">
<div class="reply-header"><span class="reply-label">Seller Reply</span> <span class="reply-date">25 May 2026</span></div>
<p class="reply-text">Merci beaucoup! So happy your cat approved right away 🐾</p>
</div>
<div class="review-helpful"><span class="helpful-label">Helpful?</span> <button class="helpful-btn">👍 Yes (32)</button> <button class="helpful-btn">No (0)</button></div>
</div>
<!-- 6 -->
<div class="review-item" data-stars="5" data-has-photos="true">
<div class="review-meta">
<div class="review-stars"><span class="s">★</span><span class="s">★</span><span class="s">★</span><span class="s">★</span><span class="s">★</span></div>
<div class="review-divider"> </div>
<span class="review-name">@h*****7 🇨🇦</span> <span class="review-date">8 June 2026 20:44</span></div>
<div class="review-verified">Verified Purchase · REPET Level-S Natural Tofu Cat Litter</div>
<p class="review-title">I work from home and I can't smell our cats anymore</p>
<p class="review-body">I work from home so I smell everything. Since switching to REPET the house genuinely smells clean. Had a friend visit who said "your place smells like a spa." Three cats. That's the level of odour control we're talking about.</p>
<div class="review-photos">
<div class="review-photo-thumb"><img src="https://img-va.myshopline.com/image/store/1749217664136/photo-room-setup.jpg" alt="Multi-cat litter room setup" /></div>
</div>
<div class="review-helpful"><span class="helpful-label">Helpful?</span> <button class="helpful-btn">👍 Yes (54)</button> <button class="helpful-btn">No (0)</button></div>
</div>
<!-- 7 -->
<div class="review-item" data-stars="5" data-has-photos="true">
<div class="review-meta">
<div class="review-stars"><span class="s">★</span><span class="s">★</span><span class="s">★</span><span class="s">★</span><span class="s">★</span></div>
<div class="review-divider"> </div>
<span class="review-name">@cat_mama_k*** 🇺🇸</span> <span class="review-date">28 May 2026 11:07</span></div>
<div class="review-verified">Verified Purchase · REPET Level-S Natural Tofu Cat Litter</div>
<p class="review-title">Remarkable difference for sensitive cats</p>
<p class="review-body">My senior cat has asthma. Switched to this on the vet's suggestion and within a week she was breathing visibly easier. No more morning sneezing, no dust film on the litter mat. The food-grade ingredients give real peace of mind — she grooms her paws constantly and I'm no longer worried about what she's ingesting.</p>
<div class="review-photos">
<div class="review-photo-thumb"><img src="https://img-va.myshopline.com/image/store/1749217664136/photo-sage-stepbox.jpg" alt="Litter box with entry step mat" /></div>
<div class="review-photo-thumb"><img src="https://img-va.myshopline.com/image/store/1749217664136/photo-green-scoop.jpg" alt="Scooping tofu litter" /></div>
</div>
<div class="review-helpful"><span class="helpful-label">Helpful?</span> <button class="helpful-btn">👍 Yes (77)</button> <button class="helpful-btn">No (3)</button></div>
</div>
<!-- 8 -->
<div class="review-item" data-stars="5" data-has-photos="true">
<div class="review-meta">
<div class="review-stars"><span class="s">★</span><span class="s">★</span><span class="s">★</span><span class="s">★</span><span class="s">★</span></div>
<div class="review-divider"> </div>
<span class="review-name">@tiff_and_cats 🇦🇺</span> <span class="review-date">1 June 2026 07:51</span></div>
<div class="review-verified">Verified Purchase · REPET Level-S Natural Tofu Cat Litter</div>
<p class="review-body">I've spent a small fortune on premium clay and silica. This costs less, performs better, and I don't feel guilty throwing it away. The 7L bag lasts my two cats almost exactly a month when I top up weekly. The maths just work.</p>
<div class="review-photos">
<div class="review-photo-thumb"><img src="https://img-va.myshopline.com/image/store/1749217664136/photo-blue-box.jpg" alt="Tofu litter in blue litter box" /></div>
</div>
<div class="review-helpful"><span class="helpful-label">Helpful?</span> <button class="helpful-btn">👍 Yes (43)</button> <button class="helpful-btn">No (1)</button></div>
</div>
<!-- 9 -->
<div class="review-item" data-stars="4" data-has-photos="true">
<div class="review-meta">
<div class="review-stars"><span class="s">★</span><span class="s">★</span><span class="s">★</span><span class="s">★</span><span class="s empty">★</span></div>
<div class="review-divider"> </div>
<span class="review-name">Tom C. 🇬🇧</span> <span class="review-date">16 June 2026 16:30</span></div>
<div class="review-verified">Verified Purchase · REPET Level-S Natural Tofu Cat Litter</div>
<p class="review-body">Really impressed with the quality and the flushable feature is brilliant — makes litter duty so much cleaner. Only reason it's not 5 stars is I'd love a larger bag option. Two cats go through it quickly. Otherwise a perfect product I'll keep buying.</p>
<div class="review-photos">
<div class="review-photo-thumb"><img src="https://img-va.myshopline.com/image/store/1749217664136/photo-large-grey.jpg" alt="Litter box setup" /></div>
</div>
<div class="review-reply">
<div class="reply-header"><span class="reply-label">Seller Reply</span> <span class="reply-date">20 June 2026</span></div>
<p class="reply-text">Noted on the larger bag — we're working on a multi-pack option. Thank you for the feedback!</p>
</div>
<div class="review-helpful"><span class="helpful-label">Helpful?</span> <button class="helpful-btn">👍 Yes (19)</button> <button class="helpful-btn">No (0)</button></div>
</div>
<!-- 10 -->
<div class="review-item" data-stars="5" data-has-photos="false">
<div class="review-meta">
<div class="review-stars"><span class="s">★</span><span class="s">★</span><span class="s">★</span><span class="s">★</span><span class="s">★</span></div>
<div class="review-divider"> </div>
<span class="review-name">Nadia M. 🇩🇪</span> <span class="review-date">25 May 2026 13:18</span></div>
<div class="review-verified">Verified Purchase · REPET Level-S Natural Tofu Cat Litter</div>
<p class="review-body">Sehr gute Qualität. Kein Staub, toller Klumpeneffekt, und tatsächlich spülbar. Meine zwei Katzen haben es sofort akzeptiert ohne jede Übergangsphase. Würde sie immer wieder kaufen.</p>
<div class="review-helpful"><span class="helpful-label">Helpful?</span> <button class="helpful-btn">👍 Yes (28)</button> <button class="helpful-btn">No (0)</button></div>
</div>
<!-- 11 -->
<div class="review-item" data-stars="5" data-has-photos="true">
<div class="review-meta">
<div class="review-stars"><span class="s">★</span><span class="s">★</span><span class="s">★</span><span class="s">★</span><span class="s">★</span></div>
<div class="review-divider"> </div>
<span class="review-name">@queenofcats__ 🇬🇧</span> <span class="review-date">11 June 2026 10:02</span></div>
<div class="review-verified">Verified Purchase · REPET Level-S Natural Tofu Cat Litter</div>
<p class="review-title">Foster home tested — all kittens approved</p>
<p class="review-body">I run a small foster home for kittens and have trialled probably 15 litters over two years. REPET is the only one where none of the kittens showed any dust irritation and all of them transitioned without protest. The food-safe grade matters hugely when kittens groom so frequently.</p>
<div class="review-photos">
<div class="review-photo-thumb"><img src="https://img-va.myshopline.com/image/store/1749217664136/photo-box-tile.jpg" alt="Tofu litter in clean litter box" /></div>
<div class="review-photo-thumb"><img src="https://img-va.myshopline.com/image/store/1749217664136/photo-pellets-top.jpg" alt="Tofu litter pellets overhead view" /></div>
</div>
<div class="review-reply">
<div class="reply-header"><span class="reply-label">Seller Reply</span> <span class="reply-date">14 June 2026</span></div>
<p class="reply-text">Thank you for the incredible work you do with fosters. We're proud REPET plays a part in it 🐱</p>
</div>
<div class="review-helpful"><span class="helpful-label">Helpful?</span> <button class="helpful-btn">👍 Yes (105)</button> <button class="helpful-btn">No (2)</button></div>
</div>
<!-- 12 -->
<div class="review-item" data-stars="5" data-has-photos="false">
<div class="review-meta">
<div class="review-stars"><span class="s">★</span><span class="s">★</span><span class="s">★</span><span class="s">★</span><span class="s">★</span></div>
<div class="review-divider"> </div>
<span class="review-name">Seren J. 🇬🇧</span> <span class="review-date">22 May 2026 08:44</span></div>
<div class="review-verified">Verified Purchase · REPET Level-S Natural Tofu Cat Litter</div>
<p class="review-body">Changed my entire relationship with litter duty. Scoop, drop in the toilet, flush. Done in 20 seconds. No bag. No bin smell. No guilt. I used to dread this task. Now it's oddly satisfying.</p>
<div class="review-helpful"><span class="helpful-label">Helpful?</span> <button class="helpful-btn">👍 Yes (37)</button> <button class="helpful-btn">No (0)</button></div>
</div>
<!-- 13 -->
<div class="review-item" data-stars="5" data-has-photos="false">
<div class="review-meta">
<div class="review-stars"><span class="s">★</span><span class="s">★</span><span class="s">★</span><span class="s">★</span><span class="s">★</span></div>
<div class="review-divider"> </div>
<span class="review-name">@maria_gato 🇪🇸</span> <span class="review-date">18 June 2026 21:05</span></div>
<div class="review-verified">Verified Purchase · REPET Level-S Natural Tofu Cat Litter</div>
<p class="review-body">Mi gato tiene alergias y el cambio ha sido increíble. Nada de polvo, nada de estornudos. La arena dura mucho tiempo y se puede tirar al váter. Vale cada céntimo.</p>
<div class="review-helpful"><span class="helpful-label">Helpful?</span> <button class="helpful-btn">👍 Yes (21)</button> <button class="helpful-btn">No (0)</button></div>
</div>
<!-- 14 -->
<div class="review-item" data-stars="4" data-has-photos="true">
<div class="review-meta">
<div class="review-stars"><span class="s">★</span><span class="s">★</span><span class="s">★</span><span class="s">★</span><span class="s empty">★</span></div>
<div class="review-divider"> </div>
<span class="review-name">@p_****8 🇺🇸</span> <span class="review-date">12 June 2026 15:55</span></div>
<div class="review-verified">Verified Purchase · REPET Level-S Natural Tofu Cat Litter</div>
<p class="review-body">Great product. My cat took a couple of days to adjust to the pellet texture but now uses it happily every time. Clumping is excellent and I can genuinely confirm zero dust on the floor mat. Will reorder.</p>
<div class="review-photos">
<div class="review-photo-thumb"><img src="https://img-va.myshopline.com/image/store/1749217664136/photo-indicator.jpg" alt="Litter with wetness indicator after use" /></div>
</div>
<div class="review-helpful"><span class="helpful-label">Helpful?</span> <button class="helpful-btn">👍 Yes (14)</button> <button class="helpful-btn">No (1)</button></div>
</div>
<!-- 15 -->
<div class="review-item" data-stars="5" data-has-photos="true">
<div class="review-meta">
<div class="review-stars"><span class="s">★</span><span class="s">★</span><span class="s">★</span><span class="s">★</span><span class="s">★</span></div>
<div class="review-divider"> </div>
<span class="review-name">@sarah_review_ 🇺🇸</span> <span class="review-date">26 May 2026 19:12</span></div>
<div class="review-verified">Verified Purchase · REPET Level-S Natural Tofu Cat Litter</div>
<p class="review-title">Detailed test: dust, clumping, flush — all pass</p>
<p class="review-body">Dust: wore a black shirt while scooping — nothing. Clumping: solid every time, doesn't crumble mid-scoop. Flush: tested three different toilets, dissolves in 30–60 seconds every time. Odour: covers urine completely. Cat acceptance: both cats used it first try. 5/5 across every dimension I could think to test.</p>
<div class="review-photos">
<div class="review-photo-thumb"><img src="https://img-va.myshopline.com/image/store/1749217664136/photo-steel-scooped.jpg" alt="Scooped clumps in steel tray" /></div>
<div class="review-photo-thumb"><img src="https://img-va.myshopline.com/image/store/1749217664136/photo-wire-clumps.jpg" alt="Firm clumps held on wire scoop" /></div>
<div class="review-photo-thumb"><img src="https://img-va.myshopline.com/image/store/1749217664136/photo-dissolving.jpg" alt="Clump dissolving in water — flush test" /></div>
</div>
<div class="review-reply">
<div class="reply-header"><span class="reply-label">Seller Reply</span> <span class="reply-date">29 May 2026</span></div>
<p class="reply-text">The most thorough review we've received. The black shirt test made us smile. Thank you 🖤</p>
</div>
<div class="review-helpful"><span class="helpful-label">Helpful?</span> <button class="helpful-btn">👍 Yes (142)</button> <button class="helpful-btn">No (3)</button></div>
</div>
<!-- 16 -->
<div class="review-item" data-stars="5" data-has-photos="true">
<div class="review-meta">
<div class="review-stars"><span class="s">★</span><span class="s">★</span><span class="s">★</span><span class="s">★</span><span class="s">★</span></div>
<div class="review-divider"> </div>
<span class="review-name">Maya R. 🇮🇱</span> <span class="review-date">5 June 2026 12:38</span></div>
<div class="review-verified">Verified Purchase · REPET Level-S Natural Tofu Cat Litter</div>
<p class="review-body">The smell when you open the bag is like fresh tofu — mild, clean, nothing synthetic. Cats took to it immediately. The flushable claim is 100% not marketing: the clump dissolves completely. And odour control is the best in 6 years of cat ownership.</p>
<div class="review-photos">
<div class="review-photo-thumb"><img src="https://img-va.myshopline.com/image/store/1749217664136/photo-pellets-closeup.jpg" alt="Fresh tofu litter pellets" /></div>
</div>
<div class="review-helpful"><span class="helpful-label">Helpful?</span> <button class="helpful-btn">👍 Yes (46)</button> <button class="helpful-btn">No (0)</button></div>
</div>
<!-- 17 -->
<div class="review-item" data-stars="4" data-has-photos="false">
<div class="review-meta">
<div class="review-stars"><span class="s">★</span><span class="s">★</span><span class="s">★</span><span class="s">★</span><span class="s empty">★</span></div>
<div class="review-divider"> </div>
<span class="review-name">@kitty_keeper 🇦🇺</span> <span class="review-date">27 May 2026 09:04</span></div>
<div class="review-verified">Verified Purchase · REPET Level-S Natural Tofu Cat Litter</div>
<p class="review-body">Two months in. Odour control is genuinely impressive — guests have no idea we have cats. Minor note: pellets are larger than I expected, but my cat adjusted within two days and I've had no issues since. Would recommend.</p>
<div class="review-helpful"><span class="helpful-label">Helpful?</span> <button class="helpful-btn">👍 Yes (22)</button> <button class="helpful-btn">No (1)</button></div>
</div>
<!-- 18 -->
<div class="review-item" data-stars="5" data-has-photos="false">
<div class="review-meta">
<div class="review-stars"><span class="s">★</span><span class="s">★</span><span class="s">★</span><span class="s">★</span><span class="s">★</span></div>
<div class="review-divider"> </div>
<span class="review-name">@f*****2 🇸🇬</span> <span class="review-date">3 June 2026 17:29</span></div>
<div class="review-verified">Verified Purchase · REPET Level-S Natural Tofu Cat Litter</div>
<p class="review-body">S-Grade food safety means even when my kitten licks her paws after using the box, I'm not worried. That peace of mind alone is worth the price — before you even count the dust-free and flushable benefits. Only litter I'd recommend to first-time cat owners.</p>
<div class="review-helpful"><span class="helpful-label">Helpful?</span> <button class="helpful-btn">👍 Yes (59)</button> <button class="helpful-btn">No (0)</button></div>
</div>
<!-- 19 -->
<div class="review-item" data-stars="5" data-has-photos="false">
<div class="review-meta">
<div class="review-stars"><span class="s">★</span><span class="s">★</span><span class="s">★</span><span class="s">★</span><span class="s">★</span></div>
<div class="review-divider"> </div>
<span class="review-name">Priya K. 🇬🇧</span> <span class="review-date">9 June 2026 11:17</span></div>
<div class="review-verified">Verified Purchase · REPET Level-S Natural Tofu Cat Litter</div>
<p class="review-body">Small flat, always worried about smell when people visit. This changed everything. The odour neutralisation is not marketing — it genuinely works at the molecular level, not just masking. My flat smells clean even the day before I'd normally do a full change.</p>
<div class="review-helpful"><span class="helpful-label">Helpful?</span> <button class="helpful-btn">👍 Yes (31)</button> <button class="helpful-btn">No (0)</button></div>
</div>
<!-- 20 -->
<div class="review-item" data-stars="4" data-has-photos="false">
<div class="review-meta">
<div class="review-stars"><span class="s">★</span><span class="s">★</span><span class="s">★</span><span class="s">★</span><span class="s empty">★</span></div>
<div class="review-divider"> </div>
<span class="review-name">@anna_f*** 🇸🇪</span> <span class="review-date">4 June 2026 08:33</span></div>
<div class="review-verified">Verified Purchase · REPET Level-S Natural Tofu Cat Litter</div>
<p class="review-body">Fantastisk produkt. Inget damm, bra klumpning och kan spolas i toaletten. Mina katter accepterade det direkt. Jag önskar att förpackningen var lite större men annars är det perfekt — köper om utan tvekan.</p>
<div class="review-helpful"><span class="helpful-label">Helpful?</span> <button class="helpful-btn">👍 Yes (17)</button> <button class="helpful-btn">No (0)</button></div>
</div>
<!-- 21 -->
<div class="review-item" data-stars="5" data-has-photos="true">
<div class="review-meta">
<div class="review-stars"><span class="s">★</span><span class="s">★</span><span class="s">★</span><span class="s">★</span><span class="s">★</span></div>
<div class="review-divider"> </div>
<span class="review-name">@l_****9 🇦🇺</span> <span class="review-date">23 May 2026 14:50</span></div>
<div class="review-verified">Verified Purchase · REPET Level-S Natural Tofu Cat Litter</div>
<p class="review-body">Bought on a friend's recommendation and subscribed immediately. The 7L bag lasts my two cats almost exactly a month. Significantly cheaper than the clay I was using and a thousand times less guilt to dispose of. This is just better in every direction.</p>
<div class="review-photos">
<div class="review-photo-thumb"><img src="https://img-va.myshopline.com/image/store/1749217664136/photo-grey-used.jpg" alt="Litter box showing clumping after use" /></div>
</div>
<div class="review-helpful"><span class="helpful-label">Helpful?</span> <button class="helpful-btn">👍 Yes (39)</button> <button class="helpful-btn">No (0)</button></div>
</div>
<!-- 22 -->
<div class="review-item" data-stars="5" data-has-photos="true">
<div class="review-meta">
<div class="review-stars"><span class="s">★</span><span class="s">★</span><span class="s">★</span><span class="s">★</span><span class="s">★</span></div>
<div class="review-divider"> </div>
<span class="review-name">@jasmine_h**** 🇦🇺</span> <span class="review-date">7 June 2026 23:01</span></div>
<div class="review-verified">Verified Purchase · REPET Level-S Natural Tofu Cat Litter</div>
<p class="review-title">Three cats, zero smell — that's the headline</p>
<p class="review-body">Three cats, one shared box between scoops, and the smell stays completely controlled. Clumps hold together after a full day. Scooping takes seconds and nothing crumbles. I didn't think a litter could impress me anymore. This did.</p>
<div class="review-photos">
<div class="review-photo-thumb"><img src="https://img-va.myshopline.com/image/store/1749217664136/photo-cat-overhead.jpg" alt="Multiple litter trays with black cat" /></div>
<div class="review-photo-thumb"><img src="https://img-va.myshopline.com/image/store/1749217664136/photo-cat-tray.jpg" alt="Cat using tofu litter tray" /></div>
</div>
<div class="review-helpful"><span class="helpful-label">Helpful?</span> <button class="helpful-btn">👍 Yes (68)</button> <button class="helpful-btn">No (1)</button></div>
</div>
</div>
<!-- end reviews-list --></div>
<!-- end page-wrap -->
<p></p>
<!-- LIGHTBOX -->
<div id="lightbox"><button id="lightbox-close">✕</button> <img id="lightbox-img" alt="" /></div>
<footer class="page-footer"><span class="footer-brand">REPET</span>
<div class="footer-links"><a href="https://repet.store/pages/index.html">Product</a> <a href="https://repet.store/pages/why-tofu.html">Why Tofu?</a> <a href="https://repet.store/pages/brand.html">Brand Story</a> <a href="https://repet.store/pages/product.html">Shop Now</a></div>
</footer>
<script>
/* ============================================================
FILTER
============================================================ */
function filterReviews(btn, type) {
document.querySelectorAll('.filter-chip').forEach(c => c.classList.remove('active'));
btn.classList.add('active');
document.querySelectorAll('.review-item').forEach(item => {
if (type === 'all') { item.style.display = ''; return; }
if (type === '5') { item.style.display = item.dataset.stars === '5' ? '' : 'none'; return; }
if (type === '4') { item.style.display = item.dataset.stars === '4' ? '' : 'none'; return; }
if (type === 'photos') { item.style.display = item.dataset.hasPhotos === 'true' ? '' : 'none'; return; }
});
}
/* ============================================================
LIGHTBOX
============================================================ */
function openLightbox(src) {
document.getElementById('lightbox-img').src = src;
document.getElementById('lightbox').classList.add('open');
}
function closeLightbox() {
document.getElementById('lightbox').classList.remove('open');
document.getElementById('lightbox-img').src = '';
}
document.addEventListener('keydown', e => { if (e.key === 'Escape') closeLightbox(); });
/* ============================================================
HELPERS
============================================================ */
function escapeHtml(str) {
return String(str)
.replace(/&/g,'&').replace(/</g,'<')
.replace(/>/g,'>').replace(/"/g,'"');
}
function fmtDate() {
return new Date().toLocaleDateString('en-GB', { day:'numeric', month:'long', year:'numeric' });
}
/* ============================================================
WRITE A REVIEW
============================================================ */
let wrStars = 0;
function toggleWriteReview() {
const panel = document.getElementById('write-review-panel');
const open = panel.classList.toggle('open');
if (open) panel.scrollIntoView({ behavior:'smooth', block:'nearest' });
}
// Star interaction
document.getElementById('wr-stars').addEventListener('mouseover', e => {
const n = +e.target.dataset.n; if (!n) return;
lightStars(n);
});
document.getElementById('wr-stars').addEventListener('mouseout', () => lightStars(wrStars));
document.getElementById('wr-stars').addEventListener('click', e => {
const n = +e.target.dataset.n; if (!n) return;
wrStars = n; lightStars(n);
});
function lightStars(n) {
document.querySelectorAll('#wr-stars .wr-star').forEach((s, i) => {
s.classList.toggle('lit', i < n);
});
}
function submitReview(e) {
e.preventDefault();
if (!wrStars) { alert('Please select a star rating.'); return; }
const name = document.getElementById('wr-name').value.trim();
const title = document.getElementById('wr-title').value.trim();
const body = document.getElementById('wr-body').value.trim();
if (!name || !body) return;
const id = 'u' + Date.now();
const review = { id, stars: wrStars, name, title, body, date: fmtDate() };
// Persist
const saved = JSON.parse(localStorage.getItem('repet_reviews') || '[]');
saved.unshift(review);
localStorage.setItem('repet_reviews', JSON.stringify(saved));
// Inject & set up comment form
const el = buildReviewEl(review);
document.querySelector('.reviews-list').prepend(el);
wireCommentForm(el);
// Reset form
wrStars = 0; lightStars(0);
document.getElementById('wr-name').value = '';
document.getElementById('wr-title').value = '';
document.getElementById('wr-body').value = '';
document.getElementById('wr-form').style.display = 'none';
const suc = document.getElementById('wr-success');
suc.style.display = 'block';
setTimeout(() => {
suc.style.display = 'none';
document.getElementById('wr-form').style.display = '';
document.getElementById('write-review-panel').classList.remove('open');
}, 3000);
}
function buildReviewEl(r) {
const stars5 = '<span class="s">★</span>'.repeat(r.stars) +
'<span class="s empty">★</span>'.repeat(5 - r.stars);
const div = document.createElement('div');
div.className = 'review-item new-flash';
div.dataset.stars = r.stars;
div.dataset.hasPhotos = 'false';
div.dataset.reviewId = r.id;
div.innerHTML = `
<div class="review-meta">
<div class="review-stars">${stars5}</div>
<div class="review-divider"></div>
<span class="review-name">${escapeHtml(r.name)}</span>
<span class="review-date">${r.date}</span>
</div>
<div class="review-verified">
<svg viewBox="0 0 12 12" fill="currentColor"><path d="M10.5 2.5L5 8.5 2 5.5l-1 1 4 4 6.5-6.5z"/></svg>
Verified Purchase · REPET Level-S Natural Tofu Cat Litter
</div>
${r.title ? `<p class="review-title">${escapeHtml(r.title)}</p>` : ''}
<p class="review-body">${escapeHtml(r.body)}</p>
<div class="review-comments" id="comments-${r.id}"></div>
<div class="review-helpful">
<span class="helpful-label">Helpful?</span>
<button class="helpful-btn">👍 Yes (0)</button>
<button class="helpful-btn">No (0)</button>
<button class="comment-toggle-btn" onclick="toggleCommentForm('${r.id}')">💬 Comment</button>
</div>
<div class="comment-form" id="cf-${r.id}">
<form onsubmit="submitComment(event,'${r.id}')">
<div class="cf-row"><input class="cf-input" type="text" placeholder="Your name" id="cfn-${r.id}" required /></div>
<div class="cf-row"><textarea class="cf-textarea" placeholder="Write a comment…" id="cft-${r.id}" required></textarea></div>
<button type="submit" class="cf-submit">Post</button>
<button type="button" class="cf-cancel" onclick="toggleCommentForm('${r.id}')">Cancel</button>
</form>
</div>`;
return div;
}
function loadSavedReviews() {
const saved = JSON.parse(localStorage.getItem('repet_reviews') || '[]');
const list = document.querySelector('.reviews-list');
saved.forEach(r => {
const el = buildReviewEl(r);
list.prepend(el);
});
}
/* ============================================================
COMMENTS
============================================================ */
function wireCommentForm(reviewEl) {
const id = reviewEl.dataset.reviewId;
// Skip if already wired
if (reviewEl.querySelector('.comment-form')) return;
// Comments container
const commentsDiv = document.createElement('div');
commentsDiv.className = 'review-comments';
commentsDiv.id = 'comments-' + id;
// Form
const formDiv = document.createElement('div');
formDiv.className = 'comment-form';
formDiv.id = 'cf-' + id;
formDiv.innerHTML = `
<form onsubmit="submitComment(event,'${id}')">
<div class="cf-row"><input class="cf-input" type="text" placeholder="Your name" id="cfn-${id}" required /></div>
<div class="cf-row"><textarea class="cf-textarea" placeholder="Write a comment…" id="cft-${id}" required></textarea></div>
<button type="submit" class="cf-submit">Post</button>
<button type="button" class="cf-cancel" onclick="toggleCommentForm('${id}')">Cancel</button>
</form>`;
// Comment toggle button — append to helpful row
const helpful = reviewEl.querySelector('.review-helpful');
if (helpful) {
const toggleBtn = document.createElement('button');
toggleBtn.className = 'comment-toggle-btn';
toggleBtn.textContent = '💬 Comment';
toggleBtn.onclick = () => toggleCommentForm(id);
helpful.appendChild(toggleBtn);
helpful.parentNode.insertBefore(commentsDiv, helpful);
helpful.parentNode.insertBefore(formDiv, helpful.nextSibling);
}
}
function initAllCommentForms() {
// Assign stable IDs to hardcoded reviews (no data-review-id yet)
let idx = 0;
document.querySelectorAll('.review-item').forEach(item => {
if (!item.dataset.reviewId) item.dataset.reviewId = 'r' + (idx++);
});
// Wire forms for every review that doesn't have one yet
document.querySelectorAll('.review-item').forEach(item => {
if (!item.querySelector('.comment-form')) wireCommentForm(item);
});
}
function toggleCommentForm(id) {
document.getElementById('cf-' + id).classList.toggle('open');
}
function submitComment(e, reviewId) {
e.preventDefault();
const name = document.getElementById('cfn-' + reviewId).value.trim();
const text = document.getElementById('cft-' + reviewId).value.trim();
if (!name || !text) return;
const comment = { name, text, date: fmtDate() };
// Persist
const all = JSON.parse(localStorage.getItem('repet_comments') || '{}');
if (!all[reviewId]) all[reviewId] = [];
all[reviewId].push(comment);
localStorage.setItem('repet_comments', JSON.stringify(all));
renderComment(reviewId, comment, true);
document.getElementById('cfn-' + reviewId).value = '';
document.getElementById('cft-' + reviewId).value = '';
document.getElementById('cf-' + reviewId).classList.remove('open');
}
function renderComment(reviewId, c, flash) {
const container = document.getElementById('comments-' + reviewId);
if (!container) return;
const div = document.createElement('div');
div.className = 'comment-item' + (flash ? ' new-flash' : '');
div.innerHTML = `
<div class="comment-meta">
<span class="comment-name">${escapeHtml(c.name)}</span>
<span class="comment-date">${c.date}</span>
</div>
<p class="comment-body">${escapeHtml(c.text)}</p>`;
container.appendChild(div);
}
function loadAllComments() {
const all = JSON.parse(localStorage.getItem('repet_comments') || '{}');
Object.entries(all).forEach(([id, list]) => {
list.forEach(c => renderComment(id, c, false));
});
}
/* ============================================================
INIT
============================================================ */
// 1. Prepend saved user reviews
loadSavedReviews();
// 2. Wire comment forms to every review (assigns stable IDs to hardcoded ones)
initAllCommentForms();
// 3. Load persisted comments into their containers
loadAllComments();
</script>