/* global React, ReactDOM */ const { useState, useEffect, useMemo } = React; /* ─────────── content (real data, sourced from brief) ─────────── */ // Twelve named bridal gowns (from the live bridal feed) const BRIDAL = [ { id: "SELENA", name: "Selena", price: 16500, img: "media/bridal-01-selena.webp", note: "Off-shoulder organza, sculpted bow tail", collection: "L'Amour en Fleurs" }, { id: "LEONIE", name: "Léonie", price: 16500, img: "media/bridal-02-leonie.webp", note: "Strapless sheath, appliqué floral veil", collection: "L'Amour en Fleurs" }, { id: "CELESTINE", name: "Céléstine", price: 22000, img: "media/bridal-03-celestine.webp", note: "Strapless A-line, three-dimensional bloom", collection: "Garden Tales" }, { id: "SOPHIA", name: "Sophia", price: 23000, img: "media/bridal-04-sophia.webp", note: "Strapless ball, magnolia embroidery", collection: "L'Amour Sucré" }, { id: "DALIA", name: "Dalia", price: 24000, img: "media/bridal-05-dalia.webp", note: "Hand-beaded bodice, voluminous veil", collection: "L'Amour Sucré" }, { id: "ZOE", name: "Zoé", price: 27000, img: "media/bridal-06-zoe.webp", note: "Sheer bateau lace, slim belt detail", collection: "Garden Tales" }, { id: "SOLENE", name: "Solène", price: 29000, img: "media/bridal-07-solene.webp", note: "Strapless pearl ball, sheer gloves", collection: "L'Amour en Fleurs" }, { id: "LUNA", name: "Luna", price: 46000, img: "media/bridal-08-luna.webp", note: "Off-shoulder beaded chiffon, full skirt", collection: "L'Amour en Fleurs" }, { id: "AYLA", name: "Ayla", price: 44000, img: "media/bridal-09-ayla.webp", note: "Strapless beaded couture, tulle train", collection: "Garden Tales" }, { id: "LILLY", name: "Lilly", price: 29000, img: "media/bridal-10-lilly.webp", note: "Long-sleeve micro-bead, structured A-line", collection: "L'Amour Sucré" }, { id: "GAIA", name: "Gaia", price: 28000, img: "media/bridal-11-gaia.webp", note: "Lace ballgown, off-shoulder detailing", collection: "L'Amour en Fleurs" }, { id: "AMBER", name: "Amber", price: 32000, img: "media/bridal-12-amber.webp", note: "Floral appliqué, cascading butterfly veil", collection: "Garden Tales" }, ]; // Eveningwear (from media manifest) const EVENING = [ { id: "EV1", name: "Strapless Hand-Beaded Gown", price: 16800, img: "media/ev-01-hand-beaded-shawl.webp", note: "With organza shawl, made to order" }, { id: "EV2", name: "Pleated Beaded-Flower Gown", price: 15600, img: "media/ev-02-pleated-flowers.webp", note: "Structured plissé, hand-beaded flora" }, { id: "EV3", name: "Mermaid Lace Gown", price: 10300, img: "media/ev-03-mermaid-lace.webp", note: "Strapless lace, bow-tail detail" }, { id: "EV4", name: "Linear Off-Shoulder Beaded", price: 17900, img: "media/ev-04-linear-beaded.webp", note: "Hand-stitched linear beadwork" }, { id: "EV5", name: "Halter Beaded Top & Skirt", price: 9900, img: "media/ev-05-halter-flared.webp", note: "Halter bodice, flared crepe skirt" }, { id: "EV6", name: "Heart-Shaped Beaded Gown", price: 15400, img: "media/ev-06-heart-beaded.webp", note: "Sweetheart neck, full bead constellation" }, { id: "EV7", name: "Off-Shoulder Plissé Tulle", price: 8400, img: "media/ev-07-plisse-tulle.webp", note: "Structured plissé, voluminous skirt" }, { id: "EV8", name: "Wave-Draped Cage Gown", price: 8800, img: "media/ev-08-cage-flowers.webp", note: "Hand-draped wave, three-dimensional flowers" }, ]; // 8 featured pieces for the curated grid — mix bridal + eveningwear const FEATURED = [ { src: BRIDAL[7], type: "BRIDAL" }, // Luna { src: EVENING[3], type: "EVENING" }, // Linear Off-Shoulder { src: BRIDAL[5], type: "BRIDAL" }, // Zoé { src: EVENING[1], type: "EVENING" }, // Pleated Flowers { src: BRIDAL[2], type: "BRIDAL" }, // Céléstine { src: EVENING[5], type: "EVENING" }, // Heart Beaded { src: BRIDAL[10], type: "BRIDAL" }, // Gaia { src: EVENING[0], type: "EVENING" }, // Hand-Beaded Shawl ]; const SHOWROOMS = [ { city: "Dubai", tag: "Evening Wear · d3", addr: "Dubai Design District\nBuilding 8, Showroom 310 · 3rd Floor", rows: [ ["Phone", "+971 58 508 7555"], ["Hours", "Mon–Fri 11:00 – 19:00\nSaturday 11:00 – 18:00", "flagged"], ["By", "Appointment only"], ], schedulista: "1074577152", waText: "Hi%20Sandy%20Nour%2C%20I%27d%20like%20to%20visit%20the%20d3%20eveningwear%20showroom.", map: "https://maps.app.goo.gl/iwV9eFLQCt2dmu6h8", }, { city: "Dubai", tag: "Bridal · Jebel Ali", addr: "National Industries Park\nJebel Ali", rows: [ ["Phone", "+971 58 514 0008"], ["Hours", "Mon–Fri 11:00 – 19:00\nSaturday 11:00 – 18:00", "flagged"], ["By", "Appointment only"], ], schedulista: "1074642641", waText: "Hi%20Sandy%20Nour%2C%20I%27d%20like%20to%20visit%20the%20Jebel%20Ali%20bridal%20showroom.", map: "https://maps.app.goo.gl/", }, { city: "Beirut", tag: "Bridal & Eveningwear", addr: "Nahr el Mot, Mar Mtanios Street\nRazico Center · 2nd Floor", rows: [ ["Phone", "+961 70 885 955"], ["Hours", "Mon–Fri 10:00 – 18:00"], ["By", "Appointment only"], ], schedulista: "1074645528", waText: "Hi%20Sandy%20Nour%2C%20I%27d%20like%20to%20visit%20the%20Beirut%20atelier.", map: "https://maps.app.goo.gl/", }, ]; const TIMELINE = [ ["MILAN", "MA, Istituto Marangoni"], ["BEIRUT", "Atelier & sample-room, est. mid-2000s"], ["2017", "Eponymous bridal and eveningwear lines launched"], ["TODAY", "230+ international stockists, 50+ artisans and designers"], ]; const SCHEDULISTA = "https://www.schedulista.com/schedule/sandynour/choose_time"; const WA_BASE = "https://wa.me/971522693605"; /* ─────────── i18n ─── only a handful of strings flipped on toggle ─── */ const I18N = { en: { eyebrow: "Sandy Nour · Bridal & Eveningwear", title1: "Contemporary", title2: "fairytales", title3: "woven into timeless wardrobes.", sub: "An editorial private-showroom layer over a 306-piece live USD catalogue — hand-beaded by 50+ artisans, from a Beirut atelier with roots in the mid-2000s.", bookFitting: "Book a private fitting", whatsapp: "WhatsApp the atelier", scroll: "Scroll · Spring–Summer 26", side: "House of Sandy Nour · couture maison", featured: "Featured pieces", bridal: "Bridal", evening: "Evening Wear", bespoke: "Bespoke", designerLink:"The Designer", showrooms: "Showrooms", }, ar: { eyebrow: "ساندي نور · فساتين زفاف وسهرة", title1: "حكايات", title2: "معاصرة", title3: "تُنسج في خزائن خالدة.", sub: "طبقة صالة عرض خاصة فوق كتالوج حيّ يضمّ 306 قطعة بالدولار — مطرّزة يدوياً بأيدي أكثر من 50 حرفياً، من أتيليه بيروتي تأسس في منتصف العقد الأول من الألفية.", bookFitting: "احجزي قياساً خاصاً", whatsapp: "واتساب الأتيليه", scroll: "تمرير · ربيع–صيف ٢٦", side: "دار ساندي نور", featured: "قطع مختارة", bridal: "زفاف", evening: "سهرة", bespoke: "تفصيل", designerLink:"المصممة", showrooms: "صالات العرض", }, }; const fmtPrice = (n) => new Intl.NumberFormat("en-US", { style: "currency", currency: "USD", maximumFractionDigits: 0 }).format(n); /* ─────────── components ─────────── */ function Nav({ t, lang, setLang, tweaks }) { const links = [ ["Bridal", "#bridal"], ["Evening Wear", "#evening"], ["Bespoke", "#bespoke"], ["The Designer", "#designer"], ["Showrooms", "#showrooms"], ]; return (
Made-to-order bridal couture from the atelier — hand-beaded silks, sculpted tulle, and trains drafted to your measurements.
Enter the bridal world →Hand-beaded eveningwear from USD 6,600 — galas, weddings of the week, the kind of evening you'll want to remember.
Enter eveningwear →Twenty-eight named gowns currently in the showroom this season — every price below is the live USD figure from the catalogue, no on-request curtain, no conversion. Book a fitting to see them in person.
Every silhouette in the house is a starting point. Adjust the neckline, re-route the embroidery, change the colour, shift the train. Tailoring is finished by hand at the Beirut atelier; alterations are included on made-to-order commissions.
Each room serves a different conversation — eveningwear in d3, bridal at Jebel Ali, and the founding atelier in Beirut. Bookings flow through Schedulista, with a WhatsApp fallback per room.
"I draft a gown the way I'd draft a letter — slowly, by hand, until every line says exactly what it needs to say, and nothing more."
Private fittings are unhurried — fabric on the table, beadwork in hand, a sketchpad open between us. Pick a showroom, leave the rest to the atelier.
{s.tag}