Homemade · Handcrafted · With Love
Freshly Baked
Happiness,
Made at Home.
Every cake, cupcake, muffin, and brownie is baked from scratch using quality ingredients and time-tested recipes — because you deserve something real.
Years Baking
Happy Orders
Homemade
Your hero photo here
Rated by our customers
About the Baker
I’m Nicole, and I’ve been baking since I could reach the counter.
Over the past decade, I’ve turned a childhood love for the kitchen into a craft — one that shows up in every layer, every crumb, and every smile from a customer. The Bake Hub was born from a simple belief: the best things are made at home, with patience and care.
— Nicole
What We Offer
Something Sweet
for Every Craving
Bestseller
Cake photo here
Homemade Cakes
Soft, moist, and made with love. Perfect for birthdays, celebrations, or any day that deserves something special.
Fan Favourite
Cupcake photo here
Cupcakes
Cute, flavorful, and fun. Ideal for parties, corporate gifts, or just treating yourself on a Tuesday.
Muffin photo here
Muffins
Light, fluffy, and comforting. A perfect morning companion or an afternoon treat with your favourite tea.
Rich & Fudgy
Brownie photo here
Brownies
Dense, fudgy, and irresistibly rich. The ultimate chocolate indulgence, baked fresh for you.
Simple Process
Ordering is Easy
Browse & Choose
Pick your favourite treat from our menu — cakes, cupcakes, muffins, or brownies.
Send a Message
Reach out via WhatsApp or fill in the form with your order details.
We Confirm & Bake
Nicole confirms your order and bakes fresh for your date.
Collect & Enjoy
Pick up your freshly baked goodies and savour every bite.
What Customers Say
Sweet Words from
Happy People
Real messages from real customers — nothing says it better than someone who’s already had a slice.
Get in Touch
Ready to
Treat Yourself?
Tell us what you’re craving and we’ll bake it into something beautiful. Custom orders, bulk requests, and event catering all welcome.
Clover 1 Resort Residence, Bandar Sri Sendayan,
70300 Siliau, Negeri Sembilan
Send an Enquiry
Fill in your details and we’ll get back to you shortly.
// Nav scroll const nav = document.getElementById('nav'); const onScroll = () => nav.classList.toggle('scrolled', scrollY > 40); window.addEventListener('scroll', onScroll, { passive: true });
// Mobile menu const toggle = document.getElementById('navToggle'); const drawer = document.getElementById('navDrawer'); toggle.addEventListener('click', () => { const open = drawer.classList.toggle('open'); toggle.classList.toggle('open', open); }); drawer.querySelectorAll('a').forEach(a => a.addEventListener('click', () => { drawer.classList.remove('open'); toggle.classList.remove('open'); }));
// Scroll reveal const observer = new IntersectionObserver( entries => entries.forEach(e => { if (e.isIntersecting) e.target.classList.add('in'); }), { threshold: 0.12, rootMargin: '0px 0px -40px 0px' } ); document.querySelectorAll('.rev').forEach(el => observer.observe(el));
// WhatsApp form function sendWA(e) { e.preventDefault(); const name = document.getElementById('f_name').value.trim(); const phone = document.getElementById('f_phone').value.trim(); const email = document.getElementById('f_email').value.trim(); const product = document.getElementById('f_product').value; const msg = document.getElementById('f_message').value.trim();
const lines = [ 'Hello Nicole! I would like to place an order. 🎂', '', `*Name:* ${name}`, phone ? `*Phone:* ${phone}` : null, email ? `*Email:* ${email}` : null, `*Interested in:* ${product}`, msg ? `*Details:* ${msg}` : null, ].filter(Boolean).join('\n');
window.open('https://wa.me/601128369746?text=' + encodeURIComponent(lines), '_blank'); }
// Smooth anchor scroll document.querySelectorAll('a[href^="#"]').forEach(a => { a.addEventListener('click', function(e) { const t = document.querySelector(this.getAttribute('href')); if (t) { e.preventDefault(); t.scrollIntoView({ behavior: 'smooth' }); } }); });
// ── Review Slideshow ─────────────────────────── (function() { const slides = Array.from(document.querySelectorAll('.rc-slide')); const dots = Array.from(document.querySelectorAll('.rc-dot')); let current = 0; let timer;
function goTo(n) { slides[current].classList.remove('active'); dots[current].classList.remove('active'); current = (n + slides.length) % slides.length; slides[current].classList.add('active'); dots[current].classList.add('active'); }
function next() { goTo(current + 1); } function prev() { goTo(current - 1); } function resetTimer() { clearInterval(timer); timer = setInterval(next, 4500); }
document.getElementById('rcNext').addEventListener('click', () => { next(); resetTimer(); }); document.getElementById('rcPrev').addEventListener('click', () => { prev(); resetTimer(); }); dots.forEach((d, i) => d.addEventListener('click', () => { goTo(i); resetTimer(); }));
// Touch / swipe support const carousel = document.getElementById('reviewCarousel'); let touchX = 0; carousel.addEventListener('touchstart', e => { touchX = e.touches[0].clientX; }, { passive: true }); carousel.addEventListener('touchend', e => { const dx = e.changedTouches[0].clientX - touchX; if (Math.abs(dx) > 50) { dx < 0 ? next() : prev(); resetTimer(); } }, { passive: true }); resetTimer(); })(); // ── Count-up animation on trust / stat numbers ─ (function() { const els = document.querySelectorAll('.trust-num, .stat-num'); const countUp = el => { const raw = el.textContent.trim(); const suffix = raw.replace(/[\d.]/g, ''); const target = parseFloat(raw); if (isNaN(target)) return; const dur = 1200; const start = performance.now(); el.classList.add('counting'); const tick = now => { const p = Math.min((now - start) / dur, 1); const ease = 1 - Math.pow(1 - p, 3); el.textContent = (target < 10 ? (target * ease).toFixed(1) : Math.round(target * ease)) + suffix; if (p < 1) requestAnimationFrame(tick); else { el.textContent = raw; setTimeout(() => el.classList.remove('counting'), 200); } }; requestAnimationFrame(tick); };
const obs = new IntersectionObserver(entries => { entries.forEach(e => { if (e.isIntersecting) { countUp(e.target); obs.unobserve(e.target); } }); }, { threshold: 0.6 }); els.forEach(el => obs.observe(el)); })();