// Queen of Spades — editorial demo // Multi-view SPA: home, /collections, four lookbooks, /designer, /recognition, /contact const { useState, useEffect, useRef, useCallback } = React; /* ───────────────────────────────────────── data ───────────────────────────── */ const MEDIA = "media/"; // Recovered archive images are small (570–1155px). We've upscaled each to 2x // with high-quality smoothing so they display crisp on retina/large screens. const img2x = (file) => MEDIA + file.replace(/\.webp$/, "-2x.webp"); const T = { en: { nav: { collections: "Collections", designer: "The Designer", recognition: "Recognition", contact: "Visit", enquire: "Enquire" }, }, ar: { nav: { collections: "المجموعات", designer: "المصممة", recognition: "تكريم", contact: "زيارة", enquire: "استفسر" }, }, }; const LINES = [ { id: "abayas", num: "01", name: "Signature Abayas", ar: "عبايات التوقيع", img: "cover-abayas.webp", desc: "Jumpsuit · high-low · belted · reversible — the abaya, reinvented." }, { id: "eveningwear", num: "02", name: "Eveningwear", ar: "فساتين السهرة", img: "gala-01.webp", desc: "Kaftans, gowns and statement cover-ups for the occasion." }, { id: "bridal", num: "03", name: "Bridal", ar: "العرائس", img: "cover-weddings.webp", desc: "The bride, in colour — made-to-order, by private consultation." }, { id: "baby-spades", num: "04", name: "Baby Spades", ar: "بيبي سبيدز", img: "cover-baby-spades.webp", desc: "Little queens — the Queen of Spades spirit, made for girls." }, ]; const ABAYA_LOOKS = [ { id: "AB-01", name: "Picnic Basket — Polka", img: "abaya-colour-02.webp", tag: "Colour SS" }, { id: "AB-02", name: "Picnic Basket — Floral", img: "cover-abayas.webp", tag: "Colour SS" }, { id: "AB-03", name: "Picnic Basket — Black", img: "abaya-colour-03.webp", tag: "Colour SS" }, { id: "AB-04", name: "Garden Stripe", img: "abaya-colour-01.webp", tag: "Colour SS" }, { id: "AB-05", name: "Frost Cape", img: "collection-snow-01.webp", tag: "Snow FW" }, { id: "AB-06", name: "Frost Embroidered", img: "collection-snow-02.webp", tag: "Snow FW" }, { id: "AB-07", name: "Lemons & Lace", img: "feathers-01.webp", tag: "Atelier" }, { id: "AB-08", name: "Runway 01 — Cape", img: "runway-01.webp", tag: "Runway" }, { id: "AB-09", name: "Runway 02 — Mustard", img: "runway-02.webp", tag: "Runway" }, { id: "AB-10", name: "Runway 03 — Gold Trim", img: "runway-03.webp", tag: "Runway" }, { id: "AB-11", name: "Runway 04 — Sage", img: "runway-04.webp", tag: "Runway" }, { id: "AB-12", name: "Pearl & Fringe", img: "princess-01.webp", tag: "Vintage" }, ]; const EVE_LOOKS = [ { id: "EV-01", name: "Vamp — Couture Gown", img: "gala-01.webp", tag: "Eveningwear" }, { id: "EV-02", name: "Vamp — Editorial", img: "gala-02.webp", tag: "Eveningwear" }, { id: "EV-03", name: "Velvet & Gold", img: "cover-feathers.webp", tag: "Eveningwear" }, { id: "EV-04", name: "Lace Cocktail", img: "feathers-01.webp", tag: "Eveningwear" }, ]; const BRIDAL_LOOKS = [ { id: "BR-01", name: "Cathedral Veil", img: "cover-weddings.webp", tag: "Bridal" }, { id: "BR-02", name: "Mother & Daughter", img: "wedding-01.webp", tag: "Bridal" }, { id: "BR-03", name: "Blush Ribbon", img: "wedding-02.webp", tag: "Bridal" }, ]; const BABY_LOOKS = [ { id: "BS-01", name: "Little Queen — Ivory", img: "cover-baby-spades.webp", tag: "Baby Spades" }, { id: "BS-02", name: "Letter Print", img: "princess-01.webp", tag: "Baby Spades" }, ]; const RECOGNITION = [ { label: "Documentary", title: "Featured in a National Geographic documentary on old vs modern UAE", date: "~ June 2015", src: "Per Khaleej Times — confirm exact title/date" }, { label: "Publication", title: "Profiled in the book \u201CEmirati Women Achievers\u201D", date: "Xponent Media, 2015", src: "Per Khaleej Times" }, { label: "Stockist", title: "Galeries Lafayette, The Dubai Mall — stockist since February 2010", date: "2010 — among first Emirati designers", src: "Per Haute Arabia · Khaleej Times" }, { label: "Collaboration", title: "Rolls-Royce — limited-edition couture collection", date: "Year TBC", src: "Per brand PR — specifics + image rights to confirm", gated: true }, { label: "Collaboration", title: "Cadillac \u201CMasterpieces\u201D — exterior artwork", date: "Year TBC", src: "Per brand PR — specifics + image rights to confirm", gated: true }, { label: "Press", title: "Khaleej Times — \u201CLamya Abedin, reigning Queen of Spades\u201D", date: "July 2015", src: "Khaleej Times" }, ]; const TIMELINE = [ { year: "2008", what: "Lamya Abedin founds Queen of Spades — born from a search for a one-of-a-kind abaya. The brand name nods to the playing card: black spade, colourful inside." }, { year: "Feb 2010", what: "Boutique launch at Galeries Lafayette, The Dubai Mall — among the first Emirati designers stocked there." }, { year: "2014–15", what: "Shows at Arab Fashion Week, Dubai. Stocked across the UAE, Saudi Arabia, Qatar and South Africa." }, { year: "June 2015", what: "Featured in a National Geographic documentary comparing old and modern UAE; profiled in the book \u201CEmirati Women Achievers.\u201D" }, { year: "Collaborations", what: "Limited-edition couture collection with Rolls-Royce; \u201CMasterpieces\u201D exterior artwork with Cadillac. Specifics + imagery rights TBC." }, { year: "Today", what: "Atelier at Dubai Design District (d3), Building 06, 1st floor, B102. By appointment for bridal & made-to-order." }, ]; /* ───────────────────────────────────────── primitives ─────────────────────── */ function SpadePip({ size = 12, color = "#0C0B0A", accent = "#9E2B25" }) { return ( ); } function Logo({ size = 22, dark }) { return ( window.navigate && window.navigate("home")}> Queen of Spades ); } /* ───────────────────────────────────────── Navbar ─────────────────────────── */ function Navbar({ route, navigate, lang, setLang, openEnquiry }) { const [solid, setSolid] = useState(false); useEffect(() => { const on = () => setSolid(window.scrollY > 80); window.addEventListener("scroll", on); on(); return () => window.removeEventListener("scroll", on); }, []); useEffect(() => { setSolid(route !== "home"); }, [route]); const t = T[lang].nav; const isActive = (r) => route === r || (r === "collections" && route.startsWith("collections")); return ( ); } /* ───────────────────────────────────────── Footer ────────────────────────── */ function Footer({ navigate, openEnquiry }) { return ( ); } /* ───────────────────────────────────────── Hero (home) ───────────────────── */ // Editorial magazine-cover layout. Image is CONTAINED (not full-bleed) so the // recovered archive photos (570–1155px wide) display at near-native resolution. const HERO_FRAMES = [ { img: "cover-abayas.webp", sig: "N° I", tag: "PICNIC BASKET · S/S", caption: "Florals, breaking the black" }, { img: "abaya-colour-02.webp", sig: "N° II", tag: "POLKA · GARDEN", caption: "Black canvas, polka through" }, { img: "cover-feathers.webp", sig: "N° III", tag: "FEATHERS · ATELIER", caption: "Texture, breaking the black" }, { img: "cover-weddings.webp", sig: "N° IV", tag: "BRIDAL · ARCHIVE", caption: "The bride, in colour" }, ]; function Hero({ openEnquiry, navigate }) { const [active, setActive] = useState(0); useEffect(() => { const id = setInterval(() => setActive(a => (a + 1) % HERO_FRAMES.length), 5200); return () => clearInterval(id); }, []); const frame = HERO_FRAMES[active]; return (
Edition 01 · Lookbook 2025 House of Lamya Abedin · since 2008

Breaking
through
the black.

The reinvented abaya — in colour, in motion, in your wardrobe. Designed in Dubai by Lamya Abedin since 2008.

N° 048 / DubaiAtelier · d3 Bldg 06
Lookbook 202504 lines · 21 looks
Index — scroll01 of 06 ↓
Atelier · open by appointment
{HERO_FRAMES.map((f, i) => (
setActive(i)} /> ))}
{frame.sig}
{frame.tag}{frame.caption}
); } /* ───────────────────────────────────────── Marquee ───────────────────────── */ function Marquee() { const items = ["Jumpsuit Abaya", "High-Low", "Belted", "Reversible", "Pocketed", "Eveningwear", "Bridal · By Appointment", "Baby Spades"]; const seg = ( {items.map((it, i) => ( {it} ))} ); return (
{seg}{seg}
); } /* ───────────────────────────────────────── Concept ───────────────────────── */ function Concept() { return (
§ 01 / The Concept
"The spade is black,
but the card is colourful.
We're trying to revolutionise the abaya."
— Lamya Abedin · Founder · per Khaleej Times
The premise

For two decades the abaya was framed as one thing: black, full-length, uniform. Queen of Spades was founded in 2008 to break through that — to reimagine the silhouette in red, blue and grey; in jumpsuit, high-low, belted, pocketed and reversible cuts.

The result is an abaya that keeps its grace and dissent — a black canvas with colour breaking through. The line has since expanded into eveningwear, bridal, and a children's edit called Baby Spades.

{["Jumpsuit", "High-Low", "Belted", "Pocketed", "Reversible"].map(s => ( {s} ))}
); } /* ───────────────────────────────────────── Collections grid ──────────────── */ function CollectionsBlock({ navigate }) { return (
§ 02 / Four Worlds

The Collections.

One signature, four worlds
Colour, breaking the black
{LINES.map(l => (
navigate("collections/" + l.id)}>
N° {l.num}
Index / {l.num}
{l.name}
{l.desc}
))}
); } /* ───────────────────────────────────────── Editorial stripe ──────────────── */ function EditorialStripe() { return (
§ 03 / In Colour
03

Picnic Basket,
in three colours.

An exhibit of the house's central idea — print, polka, stripe and embroidery, mounted against the brand's signature noir. Spring/Summer edit.

); } /* ───────────────────────────────────────── Designer teaser ──────────────── */ function DesignerTeaser({ navigate }) { return (
§ 04 / The Designer

Lamya
Abedin.

"If abayas are meant to be completely black, then you will see me doing the opposite."

Self-taught Emirati designer, mother of three, former government research officer. Founded Queen of Spades in 2008 after a search for a one-of-a-kind abaya turned into a brand. Inspirations drawn from Japanese kimono and Malaysian batik.

2008
Founded
04
Lines
15+
Years
); } /* ───────────────────────────────────────── Recognition strip (home) ─────── */ function RecognitionHome({ navigate }) { const items = RECOGNITION.slice(0, 5); return (
§ 05 / Recognition

As told elsewhere.

Public record — attributed, dated. No invented ratings or follower counts; the house's story has been told by other people, on the record.

{items.map((r, i) => (
{r.label}
{r.title}
{r.date}
))}
); } /* ───────────────────────────────────────── Contact band (home) ─────────── */ function ContactBand({ navigate, openEnquiry }) { return (
§ 06 / Visit

Every woman,
a queen.

The atelier is open by appointment at Dubai Design District. For bridal and made-to-order, book a private consultation — we'll meet you with fabrics in hand.

Atelier
Dubai Design District (d3)
Building 06, 1st floor, B102
Hours
Mon–Sat · 10:00 — 22:00 [CLIENT TO CONFIRM]
Channels
); } /* ───────────────────────────────────────── Enquiry modal ─────────────────── */ function EnquiryModal({ open, onClose, prefill, onSubmit }) { const [interest, setInterest] = useState(prefill?.interest || "Signature Abayas"); const [piece, setPiece] = useState(prefill?.piece || ""); const [date, setDate] = useState(""); const [name, setName] = useState(""); const [email, setEmail] = useState(""); const [phone, setPhone] = useState(""); const [msg, setMsg] = useState(""); useEffect(() => { if (prefill) { setInterest(prefill.interest || "Signature Abayas"); setPiece(prefill.piece || ""); } }, [prefill, open]); useEffect(() => { if (!open) return; const k = (e) => e.key === "Escape" && onClose(); document.addEventListener("keydown", k); return () => document.removeEventListener("keydown", k); }, [open, onClose]); if (!open) return null; const heroImg = interest === "Bridal" ? "wedding-02.webp" : interest === "Eveningwear" ? "gala-01.webp" : interest === "Baby Spades" ? "cover-baby-spades.webp" : "abaya-colour-02.webp"; const handle = (e) => { e.preventDefault(); onSubmit({ interest, piece, date, name, email, phone, msg }); }; return (
e.stopPropagation()}>
§ Enquiry

Make an Enquiry.

A short note — the atelier will reach out within two working days.

{["Signature Abayas", "Eveningwear", "Bridal", "Baby Spades"].map(c => ( ))}
{piece && (
setPiece(e.target.value)} />
)}
setName(e.target.value)} required />
setEmail(e.target.value)} required />
setPhone(e.target.value)} placeholder="+971…" />
{interest === "Bridal" && (
setDate(e.target.value)} />
)}