/* @jsx React.createElement */ // Shared Nav + Footer + small atoms for INDIE Labs. const WA_NUMBER = "628976046500"; // wa.me uses no leading 0 — user: 08976046500 const WA_DISPLAY = "0897 6046 500"; const EMAIL = "info@indielabs.id"; const WA_LINK = (msg = "Halo INDIE Labs, saya tertarik diskusi proyek.") => `https://wa.me/${WA_NUMBER}?text=${encodeURIComponent(msg)}`; const INDIELABS_SUPABASE_URL = "https://indie.supabase.co"; const INDIELABS_SUPABASE_ANON_KEY = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6Indsc3pqdnZveXltd2dwbXRnd2V4Iiwicm9sZSI6ImFub24iLCJpYXQiOjE3NzQ1ODg5OTcsImV4cCI6MjA5MDE2NDk5N30.5emUfc2jlLxutLhtGZFD0Rq3MOUl4JAcU3Fd5RydjRU"; // Lightweight, non-blocking auth state hook for navbar. // Returns: { state: "unknown" | "anon" | "user" } function useLabsAuth() { const [state, setState] = React.useState("unknown"); React.useEffect(() => { let cancelled = false; function check() { if (cancelled) return; if (!window.supabase || !window.supabase.createClient) { // Supabase UMD belum siap — coba lagi sebentar, kalau gagal anggap anon. setTimeout(check, 400); return; } try { const c = window.supabase.createClient(INDIELABS_SUPABASE_URL, INDIELABS_SUPABASE_ANON_KEY); c.auth.getSession().then((res) => { if (cancelled) return; setState(res && res.data && res.data.session ? "user" : "anon"); }).catch(() => { if (!cancelled) setState("anon"); }); } catch (_) { if (!cancelled) setState("anon"); } } check(); return () => { cancelled = true; }; }, []); return state; } function NavAuthLink() { const state = useLabsAuth(); if (state === "unknown") { // Reserve space tanpa flicker return ; } if (state === "user") { return ( Dashboard → ); } return ( Login ); } function LabsMark({ size = 32 }) { return ( INDIE Labs. ); } function Nav({ current = "home" }) { const [scrolled, setScrolled] = React.useState(false); React.useEffect(() => { const onScroll = () => setScrolled(window.scrollY > 8); onScroll(); window.addEventListener("scroll", onScroll); return () => window.removeEventListener("scroll", onScroll); }, []); const links = [ { id: "home", label: "Home", href: "index.html" }, { id: "services", label: "Services", href: "services.html" }, { id: "portfolio", label: "Portfolio", href: "portfolio.html" }, { id: "contact", label: "Contact", href: "contact.html" }, ]; return (
INDIE Labs. R&D · Software
Diskusi proyek
); } function Footer() { const SUBS = [ "indiebrand","indiepreneur","indiespace","ims", "indieruma","indiekost","indiecafe","indielabs", "indiepack","indiepaper","pixelindie","yappari", ]; return ( ); } function FooterCol({ title, items }) { return (
{title}
); } Object.assign(window, { Nav, Footer, LabsMark, WA_NUMBER, WA_DISPLAY, EMAIL, WA_LINK });