/* Bar Kiosi — section components. Exported to window for app.jsx. */ const { useState, useEffect, useRef } = React; /* tiny inline icons */ const Icon = { cal: (p) => , arrow: (p) => , msg: (p) => , mail: (p) => , }; /* reveal-on-scroll wrapper */ function Reveal({ children, as = "div", d, className = "", ...rest }) { const ref = useRef(null); useEffect(() => { const el = ref.current; if (!el) return; let done = false; const show = () => { if (!done) { done = true; el.classList.add("in"); } }; const vh = () => window.innerHeight || document.documentElement.clientHeight; const inView = () => { const r = el.getBoundingClientRect(); return r.top < vh() * 0.94 && r.bottom > 0; }; if (inView()) { show(); return; } let io; if ("IntersectionObserver" in window) { io = new IntersectionObserver((es) => { es.forEach((e) => { if (e.isIntersecting) { show(); io.disconnect(); } }); }, { threshold: 0.12, rootMargin: "0px 0px -6% 0px" }); io.observe(el); } const onScroll = () => { if (inView()) { show(); io && io.disconnect(); } }; window.addEventListener("scroll", onScroll, { passive: true }); // safety net: never leave content hidden in non-scrolling/odd contexts const fallback = setTimeout(show, 1600); return () => { io && io.disconnect(); window.removeEventListener("scroll", onScroll); clearTimeout(fallback); }; }, []); const Tag = as; return {children}; } /* labeled image placeholder */ function Placeholder({ label, className = "", style }) { return (
{label}
); } function Badge00({ className }) { return ( 0.0% ABV ); } /* ---------------- Nav ---------------- */ function Nav({ t }) { const [scrolled, setScrolled] = useState(false); useEffect(() => { const on = () => setScrolled(window.scrollY > 8); on(); window.addEventListener("scroll", on, { passive: true }); return () => window.removeEventListener("scroll", on); }, []); return ( ); } /* ---------------- Hero ---------------- */ function Hero({ t }) { return (
Mobile craft bar · Philadelphia Real cocktails.
Zero proof.
A full craft bar for your event — every drink built to bar standard, just with the alcohol left out on purpose. Nobody leaves feeling like they missed out. Check a date See the menu {t.serviceArea}
); } /* ---------------- The idea ---------------- */ const PROPS = [ { n: "01", h: "Everyone's included", p: "Pregnant guests, sober guests, designated drivers, kids — one bar, no separate table. The whole room drinks the same beautiful menu." }, { n: "02", h: "No liability", p: "A full bar experience with zero alcohol to manage, serve responsibly, or insure. Nothing to over-pour, nothing to worry about." }, { n: "03", h: "It's a moment", p: "Hand-cut clear ice, fresh and dehydrated garnishes, proper glassware. Drinks your guests actually stop to photograph." }, ]; function Idea() { return (
The idea Zero-proof isn't soda and a sad lime. It's genuine craft cocktail work — fresh juice, house syrups, proper technique, balanced builds — with the alcohol intentionally left out. Same care, same ritual, same glass in hand. The booze is the only thing missing, and no one notices.
{PROPS.map((x, i) => ( № {x.n}

{x.h}

{x.p}

))}
); } /* ---------------- Package ---------------- */ const INCLUDED = [ { h: "The full cocktail menu", p: "Every build on the menu below, mixed to order for your guests." }, { h: "A professional bartender", p: "Behind the bar for your event window — pouring, garnishing, hosting." }, { h: "Clear ice & garnish styling", p: "Hand-cut clear ice plus fresh and dehydrated garnishes and glassware styling." }, { h: "Full setup & breakdown", p: "I arrive, build the bar, run it, then pack it all out. You don't lift a thing." }, { h: "A menu tailored to you", p: "We shape the drink list around your event, theme, and guests beforehand." }, ]; function Package({ t }) { return (
The package
One flat rate
${t.price}

No per-head pricing. One bar, one price.

Everything that comes with it.
    {INCLUDED.map((x, i) => ( 0{i + 1}

    {x.h}

    {x.p}

    ))}
); } Object.assign(window, { Icon, Reveal, Placeholder, Badge00, Nav, Hero, Idea, Package });