/* @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 (
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."
/>
-.