/* ------------------------------------------------------------------ * * Trade Gate — password-protected wholesale pricing context * Persisted to localStorage("aqua_trade") * Demo password: "trade2026" * ------------------------------------------------------------------ */ const TRADE_PASSWORD = "trade2026"; const TRADE_DISCOUNT = 0.30; // 30% off retail for trade partners const TradeContext = React.createContext({ isTrade: false, unlock: () => false, lock: () => {}, applyDiscount: (n) => n, }); function TradeProvider({ children }) { const [isTrade, setIsTrade] = React.useState(() => { try { return localStorage.getItem("aqua_trade") === "1"; } catch (e) { return false; } }); const unlock = React.useCallback((pw) => { if (pw === TRADE_PASSWORD) { setIsTrade(true); try { localStorage.setItem("aqua_trade", "1"); } catch (e) {} return true; } return false; }, []); const lock = React.useCallback(() => { setIsTrade(false); try { localStorage.removeItem("aqua_trade"); } catch (e) {} }, []); const applyDiscount = React.useCallback((retail) => { return isTrade ? Math.round(retail * (1 - TRADE_DISCOUNT)) : retail; }, [isTrade]); return ( {children} ); } function useTrade() { return React.useContext(TradeContext); } // ---------- Trade Gate Modal ---------- function TradeGate({ open, onClose }) { const { unlock } = useTrade(); const { t } = useLang(); const [pw, setPw] = React.useState(""); const [err, setErr] = React.useState(""); const inputRef = React.useRef(null); React.useEffect(() => { if (open && inputRef.current) { setTimeout(() => inputRef.current.focus(), 100); } if (!open) { setPw(""); setErr(""); } }, [open]); if (!open) return null; const submit = (e) => { e.preventDefault(); if (unlock(pw)) { setErr(""); onClose(); } else { setErr(t("trade.gate.err")); } }; return (
e.stopPropagation()}>
{t("trade.gate.eyebrow")}

{t("trade.gate.title.a")}{t("trade.gate.title.em")}

{t("trade.gate.body")}

{ setPw(e.target.value); setErr(""); }} placeholder="••••••••" autoComplete="off" /> {err && {err}}
{t("trade.gate.demo")} trade2026
{t("trade.gate.foot")}
); } // ---------- Trade banner — shown at top when unlocked ---------- function TradeBanner() { const { isTrade, lock, discount } = useTrade(); const { t } = useLang(); if (!isTrade) return null; return (
◆ {t("trade.banner.a")} {Math.round(discount * 100)}% {t("trade.banner.b")}
); } Object.assign(window, { TradeProvider, useTrade, TradeGate, TradeBanner });