BLONDE POINTS™ XCHANGE
WHERE POINTS MATTER
document.addEventListener("DOMContentLoaded", function(){ const trolley = document.getElementById("trolleySVG"); const lines = trolley.querySelectorAll(".trolley-stroke, .trolley-gold"); const title = document.getElementById("trolleyTitle"); const winners = document.getElementById("trolleyWinners"); const observer = new IntersectionObserver(entries=>{ entries.forEach(entry=>{ if(!entry.isIntersecting) return; lines.forEach((line, i)=>{ line.style.animation = `draw 1.6s ease forwards ${i * 0.08}s`; }); setTimeout(()=>{ title.style.opacity = 1; }, 2200); setTimeout(()=>{ winners.style.opacity = 1; }, 2500); observer.disconnect(); }); },{ threshold:0.25 }); observer.observe(trolley); });
WHAT IS SAPA HAIR®
YOU SHOULD KNOW
document.addEventListener("DOMContentLoaded",function(){ const q = document.getElementById("questionSVG"); if(!q) return; const strokes = q.querySelectorAll(".q-stroke"); strokes.forEach((el,i)=>{ el.style.opacity = 1; el.style.animation = `qDraw 2.4s ease forwards ${i*0.08}s`; }); });
document.addEventListener("DOMContentLoaded", function(){ const arch = document.getElementById("archSVG"); const lines = arch.querySelectorAll(".stroke"); const title = document.getElementById("archTitle"); const observer = new IntersectionObserver(entries => { entries.forEach(entry => { if(!entry.isIntersecting) return; lines.forEach((line, i) => { line.style.animation = `lineDraw 1.6s ease forwards ${i * 0.12}s`; line.style.opacity = 1; }); setTimeout(() => { title.style.animation = "fadeIn 1s ease forwards"; }, 2600); observer.disconnect(); }); }, { threshold: 0.2 }); observer.observe(arch); });

SAPA HAIR™ is a registered and protected trademark.It refers exclusively to hair whose bleach-lift performance fails to match its marketing claims.The term may not be used commercially without written permission.

SAPA HAIR® • A Trademarked Category
© 2025 The Bleach Test. All rights reserved.

DO YOU KNOW SAPA HAIR®?

1 winner receives N25,000 cash prize every day. Start the streak on day 1 and win up to N75,000 when you get each day’s answer correct.

ROUND 1
ROUND 2
ROUND 3
INTERMISSION
ROUND 4
ROUND 5
ROUND 6
/* ===== WINNER REGISTRY (EDIT ONLY THIS) ===== */ const ROUND_WINNERS = { 1: "—", 2: "—", 3: "—", 4: "", 5: "", 6: "" }; /* ===== LAGOS TIME ===== */ function getLagosTime(){ const parts = new Intl.DateTimeFormat("en-CA",{ timeZone:"Africa/Lagos", year:"numeric", month:"2-digit", day:"2-digit", hour:"2-digit", hour12:false }).formatToParts(new Date()); const map = {}; parts.forEach(p => map[p.type] = p.value); return { today: `${map.year}-${map.month}-${map.day}`, hour: Number(map.hour) }; } /* ===== ROUND LOGIC ===== */ function updateRounds(){ const lagos = getLagosTime(); document.querySelectorAll(".day-card").forEach(card=>{ const roundDate = card.dataset.date; const round = card.dataset.round; const face = card.querySelector(".face-label"); card.classList.remove("active-round","announced"); /* PAST DAYS */ if(lagos.today > roundDate){ card.classList.add("announced"); const winner = ROUND_WINNERS[round] || "_____"; face.innerHTML = ` Winner is ${winner}
Prize: N25,000 `; } /* TODAY AFTER 10PM */ else if(lagos.today === roundDate && lagos.hour >= 22){ card.classList.add("announced"); const winner = ROUND_WINNERS[round] || "_____"; face.innerHTML = ` Winner is ${winner}
Prize: N25,000 `; } /* TODAY LIVE */ else if(lagos.today === roundDate && lagos.hour >= 10){ card.classList.add("active-round"); face.textContent = "Round live — winner announced at 10PM"; } /* TODAY BEFORE 10AM */ else if(lagos.today === roundDate){ face.textContent = "Round opens at 10AM"; } /* FUTURE */ else{ const d = new Date(roundDate+"T12:00:00Z") .toLocaleDateString("en-US",{month:"long",day:"numeric"}); face.textContent = `Round on ${d}`; } }); } updateRounds(); setInterval(updateRounds,60000); /* ===== MODAL ===== */ const modal = document.getElementById("winnerModal"); const modalTitle = document.getElementById("modalRoundTitle"); const modalWinners = document.getElementById("modalWinners"); document.querySelectorAll(".day-card").forEach(card=>{ card.addEventListener("click",()=>{ const round = card.dataset.round; modalTitle.textContent = `ROUND ${round}`; if(card.classList.contains("announced")){ const winner = ROUND_WINNERS[round] || "_____"; modalWinners.innerHTML = `

Winner: ${winner}

Prize: N25,000

`; }else{ modalWinners.innerHTML = `

Winner will be announced at 10:00 PM (Lagos time).

`; } modal.style.display="flex"; }); }); document.querySelector(".modal-close").onclick=()=>modal.style.display="none"; window.onclick=e=>{ if(e.target===modal) modal.style.display="none"; };

What is SAPA Hair® ?

𝐬𝐚·𝐩𝐚 𝐡𝐚𝐢𝐫 /ˈ𝐬ɑː-𝐩𝐚 𝐡𝐞𝐡𝐫/ 𝐧𝐨𝐮𝐧
𝟏. 𝐇𝐚𝐢𝐫 𝐭𝐡𝐚𝐭 𝐩𝐫𝐨𝐦𝐢𝐬𝐞𝐬 𝐩𝐫𝐞𝐦𝐢𝐮𝐦… 𝐛𝐮𝐭 𝐝𝐞𝐥𝐢𝐯𝐞𝐫𝐬 𝐬𝐭𝐫𝐮𝐠𝐠𝐥𝐞. Performs inconsistently under bleach, showing uneven lift, patchiness, gummy hair and structural breakdown during The Bleach Test™.
𝟐. 𝐔𝐬𝐞𝐝 𝐭𝐨 𝐝𝐞𝐬𝐜𝐫𝐢𝐛𝐞 𝐡𝐚𝐢𝐫 𝐰𝐡𝐨𝐬𝐞 𝐦𝐚𝐫𝐤𝐞𝐭𝐢𝐧𝐠 𝐜𝐨𝐦𝐦𝐮𝐧𝐢𝐜𝐚𝐭𝐞𝐬 𝐜𝐨𝐧𝐟𝐢𝐝𝐞𝐧𝐜𝐞… 𝐛𝐮𝐭 𝐰𝐡𝐨𝐬𝐞 𝐥𝐢𝐟𝐭 𝐫𝐞𝐬𝐮𝐥𝐭𝐬 𝐜𝐨𝐦𝐦𝐮𝐧𝐢𝐜𝐚𝐭𝐞 𝐜𝐨𝐧𝐟𝐮𝐬𝐢𝐨𝐧.
𝐒𝐲𝐧𝐨𝐧𝐲𝐦: Struggle bundle, premium hair-in- spirit only

BLONDE POINTS™ BALANCE
THE XCHANGE IS OPEN
HAVE YOU BEEN SETTLED?
EARN ONLINE. SPEND IT OFFLINE.
(function(){ const lines = [ "EARN ONLINE. SPEND IT OFFLINE.", "ONLINE ATTENTION. OFFLINE RETURNS.", "WHAT’S YOUR BLONDE POINTS™ BALANCE?" ]; let i = 0; const el = document.getElementById("bpRule"); setInterval(()=>{ el.style.opacity = 0; setTimeout(()=>{ i = (i + 1) % lines.length; el.textContent = lines[i]; el.style.opacity = 1; }, 400); }, 2600); })();
₦0
SETTLED

BLONDE POINTS™ XCHANGE

Redeem BLONDE POINTS™ here.

Points are deducted after use.

Points are non transferrable.

15% OFFYOUR FAVE STOREApplicable on the first ₦50,000 of your purchase
UNLOCK WITH 5 POINTS
25% OFFYOUR FAVE STOREApplicable on the first ₦50,000 of your purchase
UNLOCK WITH 10 POINTS
40% OFFYOUR FAVE STOREApplicable on the first ₦50,000 of your purchase
UNLOCK WITH 15 POINTS
60% OFFYOUR FAVE STOREApplicable on the first ₦50,000 of your purchase
UNLOCK WITH 25 POINTS
BLONDE POINTS™ BALANCE

THE RESULTS ARE RUDE

WE JUST REPORT THEM

    PICK A CRIME SCENE.
    UNLOCK THE FILE.

    You are viewing final bleach outcomes.
    Choose the one that raises your pulse.

    No vendor names. No clues.
    Only bleach behaviour under investigation.

    Selection constitutes consent to view unfiltered test results.

    CASE FILE 01
    PROPERTY OF SAPA HAIR®
    CHAOS UNLOCKED
    CASE FILE 02
    PROPERTY OF SAPA HAIR®
    CHAOS UNLOCKED
    CASE FILE 03
    PROPERTY OF SAPA HAIR®
    CHAOS UNLOCKED
    CASE FILE 04
    PROPERTY OF SAPA HAIR®
    CHAOS UNLOCKED
    CASE FILE 05
    PROPERTY OF SAPA HAIR®
    CHAOS UNLOCKED
    CASE FILE 06
    PROPERTY OF SAPA HAIR®
    CHAOS UNLOCKED
    /* ================= DAILY ROTATION ================= */ const grid = document.getElementById('polaroidGrid'); const shells = Array.from(grid.children); const seed = new Date().toDateString(); function shuffle(arr){ let i = arr.length; while(i){ let j = Math.floor((Math.sin(seed.length + i) + 1) * i / 2); i--; [arr[i], arr[j]] = [arr[j], arr[i]]; } } shuffle(shells); shells.forEach(s => grid.appendChild(s)); /* ================= INTERACTION ================= */ const unlockBtn = document.getElementById('unlockFile'); let selected = null; shells.forEach(shell=>{ const card = shell.querySelector('.polaroid'); card.addEventListener('click', ()=>{ shells.forEach(s=>s.classList.remove('selected')); shell.classList.add('selected'); grid.classList.add('dimmed'); selected = card.dataset.report; unlockBtn.classList.add('active'); unlockBtn.disabled = false; }); }); unlockBtn.addEventListener('click', ()=>{ if(!selected) return; window.location.href = "https://instagram.com/direct/t/SAPA"; });