/* Afrah Gifting Services — landing page React app */ const { useState, useEffect, useRef } = React; /* ─── Placeholder image component (striped + label) ─── */ function Ph({ label, variant = "", style }) { return (
{label}
); } /* ─── Header ─── */ function Header({ onOpenForm }) { const [scrolled, setScrolled] = useState(false); useEffect(() => { const onScroll = () => setScrolled(window.scrollY > 8); onScroll(); window.addEventListener("scroll", onScroll, { passive: true }); return () => window.removeEventListener("scroll", onScroll); }, []); return (
A Afrah Corporate Gifting · Bahrain
); } /* ─── Hero ─── */ function Hero({ onOpenForm }) { return (
Corporate sweets · Made in Bahrain

Corporate sweets gifting, handled end-to-end.

Afrah designs, produces, and delivers branded sweet boxes for Bahrain's leading companies — so HR, admin, and marketing teams gift on time, on brand, without juggling vendors.

See how it works
Free mockup before order Bahrain-wide delivery
Now booking · Q3 2026
Free branded mockup See your logo on the box before you place the order.
); } /* ─── Marquee strip ─── */ function Strip() { const items = [ "Trusted by Bahrain corporates", "Halal certified kitchen", "Same-week production", "Branded packaging in-house", "200+ orders fulfilled", "Bahrain-wide same-day delivery", ]; const all = [...items, ...items]; return ( ); } /* ─── Problem + Trust ─── */ function ProblemTrust() { const problems = [ { n: "01", t: "Juggling three vendors", d: "Designer, sweet shop, courier — three contacts, three invoices, three timelines." }, { n: "02", t: "Off-brand packaging", d: "Generic boxes that don't reflect the care your team took to plan the gift." }, { n: "03", t: "Last-minute scrambling", d: "Eid, Ramadan, anniversaries. The dates don't move. Vendors do." }, { n: "04", t: "No idea what you'll get", d: "You approve a quote, then hope the result matches what you imagined." }, ]; return (
The state of corporate gifting

Gifting shouldn't take three weeks and four vendors.

Most corporate gifting in Bahrain is stitched together piece by piece. We replace the whole chain with a single point of contact, fixed timelines, and a mockup before you commit.

{problems.map(p => (
{p.n}

{p.t}

{p.d}

))}
); } /* ─── Solution / 3-step ─── */ function Solution() { const steps = [ { n: "1", t: "Design", d: "We mock up your packaging — logo, colours, message card. You approve before anything is produced.", list: ["Free branded mockup", "2–3 design options", "Approval in 48h"], }, { n: "2", t: "Produce", d: "Our kitchen makes the sweets fresh. Halal-certified, batch-tested, and packed in your branded boxes.", list: ["Halal certified", "Made-to-order", "Quality-checked"], }, { n: "3", t: "Deliver", d: "We coordinate delivery across Bahrain — to one office, or split across multiple recipients.", list: ["Bahrain-wide", "Single or split delivery", "On the date you set"], }, ]; return (
How it works

Three steps. One vendor. Done.

From the first brief to the last delivery, you talk to one team. No production calls, no courier handoffs, no chasing approvals across email threads.

{steps.map(s => (
{s.n}

{s.t}

{s.d}

{s.list.map(l => {l})}
))}
); } /* ─── Use cases ─── */ function UseCases() { const cases = [ { tag: "01 / VIP gifting", t: "VIP & board gifts", d: "Curated for senior stakeholders. Discreet, refined, and never generic.", v: "accent" }, { tag: "02 / Events", t: "Corporate events", d: "Conference welcome boxes, AGM tokens, summit favours — at scale, on schedule.", v: "cream" }, { tag: "03 / Clients", t: "Client appreciation", d: "Quarterly thank-yous and renewal moments that keep your name on their desk.", v: "gold" }, { tag: "04 / Festive", t: "Festive gifting", d: "Eid, Ramadan, National Day. We plan ahead so you don't scramble at month-end.", v: "" }, ]; return (
Built for

Where teams use Afrah.

Whether you're sending one box to a board chair or two hundred to a conference hall, the process — and the standard — stays the same.

{cases.map(c => (
{c.tag}

{c.t}

{c.d}

))}
); } /* ─── Collections ─── */ function Collections() { const tiers = [ { name: "Petite", price: "From BHD 8 / box", d: "A focused selection for everyday recognition — onboarding, thank-yous, and quarterly touchpoints.", specs: [ { l: "Pieces", v: "9 sweets" }, { l: "Box", v: "Kraft + foil" }, { l: "Branding", v: "Logo + sleeve" }, { l: "MOQ", v: "25 units" }, ], v: "cream", }, { name: "Elegant", price: "From BHD 14 / box", d: "Our most-ordered tier. The right balance of presentation and value for client and event gifting.", specs: [ { l: "Pieces", v: "16 sweets" }, { l: "Box", v: "Rigid lid · matte" }, { l: "Branding", v: "Foil + insert card" }, { l: "MOQ", v: "50 units" }, ], v: "accent", }, { name: "Majestic", price: "From BHD 28 / box", d: "For board members, VIP partners, and milestone moments where the box itself is the message.", specs: [ { l: "Pieces", v: "24 sweets" }, { l: "Box", v: "Wood-look · magnetic" }, { l: "Branding", v: "Embossed + ribbon" }, { l: "MOQ", v: "20 units" }, ], v: "dark", }, ]; return (
Collections

Three tiers. Every one branded to you.

Pick a starting tier — we customise the contents, the wrap, and the message card. Mix tiers within a single order if you're gifting up and down a hierarchy.

{tiers.map(t => (
{t.name} {t.price}

{t.d}

{t.specs.map(s => (
{s.l}{s.v}
))}
))}
); } /* ─── Visual proof ─── */ function Proof() { return (
Inside the box

A closer look.

Every order is photographed before dispatch, so you have proof of presentation — useful for marketing, PR, or simply peace of mind.

); } /* ─── Branding emphasis ─── */ function Branding() { return (
Branded packaging

Your logo, your colours, on every box.

Generic packaging makes a corporate gift feel transactional. Ours doesn't. Every Afrah box is designed around your brand guidelines — and you see exactly how it will look before we print a single sleeve.

  • Free mockup — sent within 48 hours of brief.
  • Foil, emboss, print — pick the finish that fits the occasion.
  • Custom message card — printed inside, signed by you.
  • Pantone matched — your brand colour, not approximately.
); } /* ─── Offer banner ─── */ function Offer({ onOpenForm }) { return (
Risk-free start

See the box before you order it.

Send us your logo and brand colours. We'll send back a designed mockup of your box — sleeve, card, finish — within 48 hours. No commitment. No fee.

Talk to us first
No credit card · No commitment
); } /* ─── FAQ ─── */ function FAQ() { const items = [ { q: "What's the minimum order?", a: "Most collections start at 20–25 boxes. For VIP one-off orders we can go smaller — talk to us." }, { q: "How long does an order take?", a: "Average lead time is 7 working days from approved mockup. Rush orders are possible — reach out and we'll confirm." }, { q: "Do you deliver outside Manama?", a: "Yes — we deliver across all of Bahrain, including split deliveries to multiple recipients on the same date." }, { q: "Are the sweets Halal?", a: "Yes. Our kitchen is Halal-certified and we batch-test every production run." }, { q: "Can I see a sample before ordering at scale?", a: "Yes. After mockup approval we can produce a single sample box for sign-off before full production." }, ]; const [open, setOpen] = useState(0); return (
Common questions

Quick answers.

Most questions we hear from HR and admin teams before placing a first order. If yours isn't here, message us on WhatsApp.

{items.map((it, i) => (
setOpen(open === i ? -1 : i)} >
{it.q} +
{it.a}
))}
); } /* ─── Final CTA ─── */ function FinalCTA({ onOpenForm }) { return (
Let's plan your next gift

Ready when you are.

Tell us the occasion, the headcount, and the deadline. We'll come back with a mockup and a quote — usually within two working days.

Chat on WhatsApp
Manama, Bahrain hello@afrahgifting.bh +973 3300 0000
); } /* ─── Footer ─── */ function Footer() { return ( ); } /* ─── WhatsApp glyph ─── */ function WhatsAppGlyph() { return ( ); } /* ─── WhatsApp FAB ─── */ function FAB() { return ( Chat with us ); } /* ─── Mockup form modal ─── */ function MockupModal({ open, onClose }) { const [form, setForm] = useState({ name: "", company: "", email: "", phone: "", occasion: "", quantity: "", notes: "", }); const [errors, setErrors] = useState({}); const [submitted, setSubmitted] = useState(false); const firstFieldRef = useRef(null); useEffect(() => { if (open && firstFieldRef.current) { setTimeout(() => firstFieldRef.current.focus(), 100); } if (!open) { setTimeout(() => { setSubmitted(false); setForm({ name: "", company: "", email: "", phone: "", occasion: "", quantity: "", notes: "" }); setErrors({}); }, 200); } }, [open]); useEffect(() => { const onKey = (e) => { if (e.key === "Escape" && open) onClose(); }; window.addEventListener("keydown", onKey); return () => window.removeEventListener("keydown", onKey); }, [open, onClose]); if (!open) return null; const update = (k) => (e) => setForm({ ...form, [k]: e.target.value }); const submit = (e) => { e.preventDefault(); const errs = {}; if (!form.name.trim()) errs.name = "Required"; if (!form.company.trim()) errs.company = "Required"; if (!form.email.trim() || !/.+@.+\..+/.test(form.email)) errs.email = "Valid email required"; if (!form.occasion.trim()) errs.occasion = "Required"; setErrors(errs); if (Object.keys(errs).length === 0) { setSubmitted(true); } }; return (
e.stopPropagation()} role="dialog" aria-modal="true"> {submitted ? (

Got it, {form.name.split(" ")[0]}.

We'll send your branded mockup to {form.email} within two working days.

) : (

Get a free branded mockup.

Tell us about the occasion. We'll come back with a designed mockup of your box within 48 hours.

{errors.name && {errors.name}}
{errors.company && {errors.company}}
{errors.email && {errors.email}}
{errors.occasion && {errors.occasion}}
)}
); } /* ─── App ─── */ function App() { const [formOpen, setFormOpen] = useState(false); const open = () => setFormOpen(true); const close = () => setFormOpen(false); // Tweaks support const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{ "accentHue": 50, "accentChroma": 0.06, "accentLightness": 0.42, "displayFont": "Instrument Serif", "showFAB": true }/*EDITMODE-END*/; const [tweaks, setTweak] = (typeof useTweaks === "function") ? useTweaks(TWEAK_DEFAULTS) : [TWEAK_DEFAULTS, () => {}]; useEffect(() => { const root = document.documentElement; root.style.setProperty("--accent", `oklch(${tweaks.accentLightness} ${tweaks.accentChroma} ${tweaks.accentHue})`); root.style.setProperty("--accent-2", `oklch(${Math.min(tweaks.accentLightness + 0.30, 0.85)} ${Math.max(tweaks.accentChroma + 0.02, 0.04)} ${tweaks.accentHue + 25})`); const fontMap = { "Instrument Serif": '"Instrument Serif", Georgia, serif', "Cormorant Garamond": '"Cormorant Garamond", Georgia, serif', "Fraunces": '"Fraunces", Georgia, serif', "Playfair Display": '"Playfair Display", Georgia, serif', }; root.style.setProperty("--font-display", fontMap[tweaks.displayFont] || fontMap["Instrument Serif"]); }, [tweaks]); return ( <>