// sections2.jsx — bottom-half sections
// =========================================================
// DATA OWNERSHIP
// =========================================================
const DataOwnership = () => {
const bars = [38, 52, 44, 68, 57, 79, 63, 85, 72, 91, 81, 97];
const customers = [
{ init: 'SR', name: 'Sari Rahayu', city: 'Jakarta', orders: 4, total: 'Rp 2,4 jt', badge: 'Loyal', col: '#5B9BFF' },
{ init: 'BP', name: 'Budi Pratama', city: 'Bandung', orders: 2, total: 'Rp 980 rb', badge: '', col: '#1FB58F' },
{ init: 'RP', name: 'Rina Putri', city: 'Surabaya', orders: 7, total: 'Rp 5,1 jt', badge: 'Top', col: '#FFC83A' },
];
const theyHide = [
'Nama & kontak customer',
'Riwayat pembelian customer',
'Sumber traffic toko kamu',
'Siapa yang repeat order',
'Analitik performa produk',
'Export data mentah',
];
const weShow = [
{ label: 'Nama & no. HP semua customer', note: 'Follow up kapan saja' },
{ label: 'Riwayat belanja per customer', note: 'Siapa pembeli setia kamu' },
{ label: 'Laporan penjualan harian', note: 'Revenue & tren tiap hari' },
{ label: 'Traffic & sumber pengunjung', note: 'Dari mana mereka datang' },
{ label: 'Performa tiap produk', note: 'Views, klik, konversi' },
{ label: 'Export ke CSV / Excel', note: 'Data mentah, 100% milikmu' },
];
const cats = [
{ Icon: IconUsers, label: 'Data Pelanggan', stat: '100%', note: 'Nama, HP, riwayat beli', col: '#5B9BFF' },
{ Icon: IconChart, label: 'Data Penjualan', stat: 'Harian', note: 'Revenue & tren real-time', col: '#1FB58F' },
{ Icon: IconBox, label: 'Data Produk', stat: 'Per-item', note: 'Views, klik, konversi', col: '#FFC83A' },
{ Icon: IconSparkles, label: 'Aktivitas Toko', stat: 'Live', note: 'Visitor, sesi, sumber', col: '#6B4CE6' },
];
return (
{/* Ambient glows */}
{/* ── Eyebrow + headline ── */}
Data Ownership
Platform lain menyembunyikan datamu. Kami tunjukkan semuanya.
Di marketplace besar, data customermu dikuasai platform — kamu tidak tahu siapa yang beli, darimana mereka datang, atau berapa kali mereka kembali. Di Market101, semua itu transparan dan sepenuhnya jadi milikmu.
{/* ── Main 2-col: dashboard + comparison ── */}
{/* Left: dashboard mockup */}
{/* Topbar */}
{/* Revenue + bar chart */}
Pendapatan bulan ini
Rp 24.380.000
+31% vs bulan lalu
312 pesanan
{/* Bars */}
{bars.map((h, i) => (
))}
1 Mei 15 Mei Hari ini
{/* Mini stats row */}
{[
{ v: '1.240', l: 'Pengunjung' },
{ v: '8,4%', l: 'Konversi' },
{ v: '312', l: 'Pesanan' },
].map((s, i) => (
))}
{/* Customer list */}
Customer Terbaru
{customers.map((c, i) => (
{c.init}
{c.name}
{c.badge ? (
{c.badge}
) : null}
{c.city} · {c.orders}x beli
))}
{/* Right: comparison cards */}
{/* They hide */}
Marketplace besar
Data seller tidak dibagikan
{theyHide.map((item, i) => (
))}
{/* We show */}
Market101
Transparan & 100% milik kamu
{weShow.map((item, i) => (
))}
{/* ── Bottom: 4 data category cards ── */}
{cats.map((cat, i) => (
{cat.stat}
{cat.label}
{cat.note}
))}
);
};
// =========================================================
// HOW IT WORKS — sticky scroll-through
// =========================================================
const HowItWorks = () => {
const [active, setActive] = React.useState(0);
const ref = React.useRef(null);
React.useEffect(() => {
const onScroll = () => {
if (!ref.current) return;
const rect = ref.current.getBoundingClientRect();
const viewH = window.innerHeight;
// Active step based on how much of the section has scrolled into view
const total = rect.height - viewH;
const scrolled = Math.max(0, -rect.top);
const pct = total > 0 ? Math.min(1, scrolled / total) : 0;
const step = Math.min(2, Math.floor(pct * 3));
setActive(step);
};
onScroll();
window.addEventListener('scroll', onScroll, { passive: true });
return () => window.removeEventListener('scroll', onScroll);
}, []);
const steps = [
{
eyebrow: 'Langkah 01',
title: 'Daftar &\nbuat toko.',
desc: 'Daftar gratis dalam 30 detik. Pilih nama toko, pilih template, dan kustomisasi sesuai brand kamu. Tanpa coding, tanpa setup ribet.',
visual: 'setup',
},
{
eyebrow: 'Langkah 02',
title: 'Upload\nproduk.',
desc: 'Tambahkan produk lengkap dengan foto, video, harga, stok, dan varian. Import massal dari CSV atau langsung satu per satu — bebas kamu pilih.',
visual: 'product',
},
{
eyebrow: 'Langkah 03',
title: 'Terima\npesanan.',
desc: 'Pembeli belanja lewat link toko kamu. Kamu kelola pesanan, cetak resi otomatis dari kurir favorit, dan dapatkan pembayaran langsung ke rekening.',
visual: 'order',
},
];
return (
{/* Left — sticky title + steps */}
Cara kerjanya
Dari nol ke toko aktif dalam 3 langkah.
Tidak butuh tim developer, tidak butuh hosting. Cukup ide dan produk — sisanya biar Market101 yang urus.
{/* Step indicators */}
{steps.map((s, i) => (
{String(i + 1).padStart(2, '0')}
{s.title.replace('\n', ' ')}
{s.desc}
))}
{/* Right — visual that swaps */}
{steps.map((s, i) => (
i ? 'translateY(-40px) scale(0.95)' : 'translateY(40px) scale(0.95)'),
transition: 'opacity .5s ease, transform .5s cubic-bezier(.2,.7,.2,1)',
pointerEvents: active === i ? 'auto' : 'none',
}}>
))}
);
};
const HiwVisual = ({ variant }) => {
if (variant === 'setup') {
return (
Buat toko baru
Atur tampilan toko kamu
{/* Form rows */}
URL toko
market101.id/ kopisenja
Tersedia
Pilih template
{[
{ bg: '#FAF7F1', accent: '#ED1B3C', active: true },
{ bg: '#0E0E10', accent: '#FFC83A' },
{ bg: '#E8F2FF', accent: '#5B9BFF' },
{ bg: '#E8F8F2', accent: '#1FB58F' },
].map((t, i) => (
))}
Buat toko sekarang
);
}
if (variant === 'product') {
return (
Produk
42 produk · 38 aktif
+ Tambah produk
{[
{ n: 'Gayo Aceh 250g', p: '85.000', stock: 24, bg: '#3B2517' },
{ n: 'Toraja Sapan 250g', p: '92.000', stock: 18, bg: '#5A3A22' },
{ n: 'Kintamani 250g', p: '78.000', stock: 31, bg: '#7C4B27' },
{ n: 'Single Cup', p: '35.000', stock: 12, bg: '#2A1B12' },
].map((p, i) => (
● Aktif
{p.n}
Rp {p.p}
Stok {p.stock}
))}
);
}
// order
return (
Pesanan masuk
3 pesanan baru
{[
{ n: 'Rina Setiawati', loc: 'Surabaya', item: 'Gayo Aceh × 2', total: '170.000', status: 'Bayar', col: 'var(--sun)' },
{ n: 'Bagas P.', loc: 'Jakarta', item: 'Toraja + Kintamani', total: '170.000', status: 'Siap kirim', col: 'var(--sky)' },
{ n: 'Dewi Arifin', loc: 'Bandung', item: 'Single Cup × 4', total: '140.000', status: 'Dikirim', col: 'var(--mint)' },
].map((o, i) => (
))}
Total hari ini
Rp 4.182.500
);
};
// =========================================================
// TEMPLATES
// =========================================================
const Templates = () => {
const cardsRef = React.useRef([]);
const handleMouseMove = (e, i) => {
const el = cardsRef.current[i];
if (!el) return;
const r = el.getBoundingClientRect();
const x = (e.clientX - r.left) / r.width - 0.5;
const y = (e.clientY - r.top) / r.height - 0.5;
el.style.transform = `perspective(1000px) rotateY(${x * 8}deg) rotateX(${-y * 8}deg) translateY(-6px)`;
};
const handleMouseLeave = (i) => {
const el = cardsRef.current[i];
if (!el) return;
el.style.transform = 'perspective(1000px) rotateY(0) rotateX(0) translateY(0)';
};
const templates = [
{ name: 'Minimal', tag: 'Editorial · Putih', palette: { bg: '#FAF7F1', fg: '#0E0E10', line: 'rgba(14,14,16,0.1)', accent: '#ED1B3C', heroBg: '#0E0E10', heroText: '#FAF7F1' }, productColors: ['#E5D9C6','#D4C4A8','#BFA987','#A88F6F','#8B7355','#6E5A40'] },
{ name: 'Bold', tag: 'Energi · Gelap', palette: { bg: '#0E0E10', fg: '#F2EFE9', line: 'rgba(255,255,255,0.08)', accent: '#FFC83A', heroBg: '#FFC83A', heroText: '#0E0E10' }, productColors: ['#FFC83A','#ED1B3C','#5B9BFF','#1FB58F','#6B4CE6','#FF7A45'] },
{ name: 'Premium', tag: 'Luxury · Krem', palette: { bg: '#F0E8DA', fg: '#2A1F18', line: 'rgba(42,31,24,0.12)', accent: '#2A1F18', heroBg: '#2A1F18', heroText: '#F0E8DA' }, productColors: ['#C9B89A','#A89478','#876F50','#5C4630','#3D2F22','#2A1F18'] },
{ name: 'Pasar', tag: 'Warung · Cerah', palette: { bg: '#E8F8F2', fg: '#0A3D2F', line: 'rgba(10,61,47,0.12)', accent: '#1FB58F', heroBg: '#1FB58F', heroText: '#FFFFFF' }, productColors: ['#FFC83A','#FF7A45','#1FB58F','#5B9BFF','#ED1B3C','#0A3D2F'] },
];
return (
Template
Empat template. Satu untuk tiap mood toko.
Lihat semua
{templates.map((t, i) => (
cardsRef.current[i] = el}
onMouseMove={e => handleMouseMove(e, i)}
onMouseLeave={() => handleMouseLeave(i)}
style={{ transition: 'transform .35s cubic-bezier(.2,.7,.2,1)' }}
>
))}
);
};
Object.assign(window, { DataOwnership, HowItWorks, HiwVisual, Templates });