/* @jsx React.createElement */ // Domain Picker for INDIE Labs. // Markup: ~12.5% above Qwords base (mid of 10-15%). Prices = indicative. // Edit QWORDS_BASE freely; markup logic stays the same. const { useState: useStateD, useMemo: useMemoD } = React; // Indicative Qwords reseller pricing (IDR / year, before PPN). // Update these when Qwords changes — markup auto-recalculates. const QWORDS_BASE = { ".com": 165000, ".id": 275000, ".co.id": 395000, ".my.id": 55000, ".web.id": 50000, ".xyz": 250000, }; const TLD_META = [ { ext: ".com", tag: "Standard", note: "Pilih kalau brand-mu mau main di pasar global." }, { ext: ".id", tag: "Premium ID", note: "Identitas lokal yang dipercaya. Wajib KTP." }, { ext: ".co.id", tag: "Korporat", note: "Buat brand dengan NPWP + dokumen perusahaan." }, { ext: ".my.id", tag: "Personal / UKM", note: "Ringan di kantong, KTP cukup." }, { ext: ".web.id", tag: "Affordable", note: "Murah meriah buat micro-site & landing." }, { ext: ".xyz", tag: "Startup vibe", note: "Anak-anak founder & tech project." }, ]; const DOMAIN_MARKUP = 0.125; // 12.5% const PPN = 0.11; function markupPrice(base) { // Round up to nearest 1000 for clean display const raw = base * (1 + DOMAIN_MARKUP); return Math.ceil(raw / 1000) * 1000; } function fmtIDR(n) { return "Rp " + n.toLocaleString("id-ID"); } // Bad-name heuristic: domains < 3 chars or banned words → "Taken" const TAKEN = new Set(["google", "facebook", "apple", "amazon", "microsoft", "youtube", "tokopedia", "shopee", "gojek", "bca"]); function checkAvailability(name) { const n = name.toLowerCase().trim(); if (!n) return "empty"; if (n.length < 3) return "tooshort"; if (TAKEN.has(n)) return "taken"; if (/[^a-z0-9-]/.test(n)) return "invalid"; return "available"; } function DomainPicker() { const [q, setQ] = useStateD(""); const [cart, setCart] = useStateD([]); // [{ ext, year }] const status = useMemoD(() => checkAvailability(q), [q]); const clean = q.toLowerCase().replace(/[^a-z0-9-]/g, "").trim(); const toggle = (ext) => { if (cart.find((c) => c.ext === ext)) { setCart(cart.filter((c) => c.ext !== ext)); } else { setCart([...cart, { ext, year: 1 }]); } }; const setYear = (ext, year) => { setCart(cart.map((c) => c.ext === ext ? { ...c, year } : c)); }; const total = cart.reduce((sum, c) => sum + markupPrice(QWORDS_BASE[c.ext]) * c.year, 0); const order = () => { if (!cart.length || !clean) return; const lines = cart.map((c) => { const price = markupPrice(QWORDS_BASE[c.ext]) * c.year; return `• ${clean}${c.ext} · ${c.year} thn · ${fmtIDR(price)}`; }); const msg = [ `Halo INDIE Labs, saya mau pesan domain:`, ``, ...lines, ``, `Subtotal: ${fmtIDR(total)}`, `PPN 11%: ${fmtIDR(Math.round(total * PPN))}`, `*Total: ${fmtIDR(Math.round(total * (1 + PPN)))}*`, ``, `Mohon dibantu cek availability + langkah berikutnya. Terima kasih!`, ].join("\n"); window.open(WA_LINK(msg), "_blank"); }; return (
Sekalian punya
alamat sendiri.} desc="Brand baru selalu butuh satu hal sebelum bisa hadir: nama yang bisa diketik orang. Cek ketersediaan domain di sini — kami yang urusin pendaftaran, perpanjangan, dan setup ke web kamu." />
setQ(e.target.value)} placeholder="brandkamu" style={{ fontSize: 18, padding: "16px 14px", fontFamily: "var(--font-mono)", letterSpacing: "-0.01em" }} /> {clean && ( .com .id .co.id … )}
{status === "tooshort" && q.length > 0 && (
Min. 3 karakter ya.
)} {status === "invalid" && (
Cuma boleh huruf, angka, dan tanda -.
)} {status === "available" && ( <>
Hasil pencarian
harga indikatif · final dikonfirmasi sebelum bayar
{TLD_META.map((t) => { const selected = !!cart.find((c) => c.ext === t.ext); const taken = TAKEN.has(clean) && t.ext === ".com"; // demo flavor const price = markupPrice(QWORDS_BASE[t.ext]); return ( ); })}
{cart.length > 0 && (
Keranjang · {cart.length} domain
{cart.map((c) => { const price = markupPrice(QWORDS_BASE[c.ext]); return (
{clean}{c.ext}
{fmtIDR(price * c.year)}
); })}
Subtotal{fmtIDR(total)}
PPN 11%{fmtIDR(Math.round(total * PPN))}
Total{fmtIDR(Math.round(total * (1 + PPN)))}
)} )} {status === "taken" && (
{clean}.com & varian populer kemungkinan besar sudah dipakai.
Coba variasi nama (tambah prefix/suffix), atau ngobrol sama kami — kami bantu brainstorm nama yang masih available.
)}
Harga 12.5% di atas registrar Qwords · belum termasuk PPN 11% · dikonfirmasi final sebelum pembayaran
); } function DomainIncl({ icon, text }) { const icons = { user: , dns: , bell: , cart: , }; return (
{icons[icon]} {text}
); } Object.assign(window, { DomainPicker, QWORDS_BASE, TLD_META, DOMAIN_MARKUP, markupPrice, fmtIDR });