/* global React */ const { useState: useStateP, useEffect: useEffectP, useMemo: useMemoP, useRef: useRefP } = React; /* ============================================================ Only One Design — Pages ============================================================ */ const MEDIA = { kaftan: "media/d3-directory-only-one-design.webp", interior: "media/bestthings-only-one-design-interior.webp", }; const STOCK = [ { src: "media/stock-tailor-measuring-suit.webp", label: "Measuring", cat: "fitting" }, { src: "media/stock-fabric-bolts-rolls.webp", label: "Fabric bolts", cat: "material" }, { src: "media/stock-tailor-at-work-hands.webp", label: "Hands at work", cat: "atelier" }, { src: "media/stock-needle-thread-handsew.webp", label: "Hand-finishing", cat: "atelier" }, { src: "media/stock-suit-jacket-detail.webp", label: "Jacket detail", cat: "garment" }, { src: "media/stock-fabric-swatch-stack.webp", label: "Swatches", cat: "material" }, { src: "media/stock-buttons-suit-cuff.webp", label: "Cuff buttons", cat: "garment" }, { src: "media/stock-folded-fabric-textures.webp", label: "Textures", cat: "material" }, { src: "media/stock-tailoring-tools-scissors.webp",label: "Shears", cat: "atelier" }, { src: "media/stock-thread-spools-color.webp", label: "Thread", cat: "material" }, { src: "media/stock-measuring-tape-detail.webp", label: "Measure", cat: "atelier" }, { src: "media/stock-sewing-machine-atelier.webp", label: "Machine", cat: "atelier" }, { src: "media/stock-mannequin-dress-form.webp", label: "Dress form", cat: "fitting" }, { src: "media/stock-bespoke-suit-fitting.webp", label: "Fitting", cat: "fitting" }, { src: "media/stock-suit-pocket-square.webp", label: "Pocket detail", cat: "garment" }, { src: "media/stock-mens-suit-rack.webp", label: "Suit rack", cat: "garment" }, { src: "media/stock-atelier-workspace.webp", label: "Workspace", cat: "atelier" }, { src: "media/stock-wool-fabric-roll.webp", label: "Wool", cat: "material" }, { src: "media/stock-luxury-shirt-folded.webp", label: "Shirt", cat: "garment" }, { src: "media/stock-wardrobe-hangers-row.webp", label: "Hangers", cat: "garment" }, ]; /* ============================================================ HOME ============================================================ */ function HomePage({ onNav, locale, callConfirmed, waConfirmed }) { const ar = locale === "ar"; return (
{ar ? "أتيليه في حي دبي للتصميم" : "Atelier · Dubai Design District"}

{ar ? <>أتيليه ملابس
وخياطة بالموعد
في حي دبي للتصميم. : <>Apparel & tailoring,
by appointment,
in Dubai Design District. }

{ar ? "استوديو هادئ بأسلوب الجاليري للملابس والخياطة في d3. كل زيارة تتم بموعد مسبق." : "A quiet, gallery-style studio for apparel and tailoring in d3. Every visit is scheduled — please request a time before arriving."}

CLIENT-FILL · sector wording No prices · No ratings published
Pleated sage-silk kaftan, directory image
d3 directory image · placeholder
{/* Studio intro */}
{ar ? "تعريف" : "Introduction"}

{ar ? "حرفة هادئة، ضوء أبيض، فضاء قصدي." : "Quiet craft, white light, considered space."}

{ar ? "نعمل بالموعد فقط، عميلًا واحدًا في كل مرة. تأخذ الجلسة وقتها — قياسات، أقمشة، رؤية — قبل أن تبدأ القطعة." : "We work by appointment, one client at a time. Sessions take their time — measurements, materials, conversation — before any garment begins."}

CLIENT-FILL · founder / philosophy
{/* Service teaser */}
{ar ? "الخدمات" : "Services"}

{ar ? "إطار قابل للملء من قِبَل العميل." : "A framework, filled in with the client."}

{/* Process teaser */}
{ar ? "المسار" : "Process"}

{ar ? "ست خطوات هادئة، من الاستفسار إلى الاستلام." : "Six quiet steps, from enquiry to collection."}

{/* Lookbook teaser */}
{ar ? "المعرض" : "Lookbook"}

{ar ? "صور توضيحية الآن — حتى يصل العميل بصوره." : "Representative now — real client work to follow."}

{[MEDIA.kaftan, ...STOCK.slice(0, 3).map(s => s.src)].map((src, i) => (
{i === 0 ? "Directory · placeholder" : "Stock · placeholder"}
))}
); } /* ============================================================ SERVICES ============================================================ */ const SERVICES = [ { num: "S/01", title: { en: "Consultation", ar: "استشارة" }, body: { en: "An unhurried first conversation. Brief, vision, references, occasion, timing — then a measured next step.", ar: "محادثة أولى دون استعجال. الموجز، الرؤية، المراجع، المناسبة، التوقيت — ثم خطوة محسوبة." }, note: "CLIENT-FILL · who attends, what to bring, length", }, { num: "S/02", title: { en: "Made-to-measure", ar: "تفصيل حسب القياس" }, body: { en: "A pattern shaped to one body, refined across fittings. Garment categories to be confirmed by the studio.", ar: "نموذج يُصاغ على جسد واحد، يُهذَّب عبر القياسات. تُحدَّد فئات القطع من قِبَل الاستوديو." }, note: "CLIENT-FILL · confirm exact garments, scope, turnaround", }, { num: "S/03", title: { en: "Occasion & Traditional", ar: "مناسبات وملابس تقليدية" }, body: { en: "Pieces for occasions and traditional dress. Specific categories — abaya, kandura, kaftan, gowns — pending client confirmation.", ar: "قطع للمناسبات والزي التقليدي. تبقى الفئات الدقيقة قيد التأكيد." }, note: "CLIENT-FILL · which traditions / occasions are offered", }, { num: "S/04", title: { en: "Alterations & Finishing", ar: "تعديلات وتشطيب" }, body: { en: "Adjustment and finishing of existing pieces — hand-set hems, balance corrections, considered repairs.", ar: "تعديل وتشطيب القطع الموجودة — حواف يدوية، تصحيح التوازن، إصلاحات مدروسة." }, note: "CLIENT-FILL · scope (own garments vs studio work)", }, ]; function ServiceGrid({ locale, compact }) { const ar = locale === "ar"; return (
{SERVICES.map((s) => (
{s.num}

{ar ? s.title.ar : s.title.en}

{ar ? s.body.ar : s.body.en}

{s.note}
))}
); } function ServicesPage({ onNav, locale }) { const ar = locale === "ar"; return (
{ar ? "خدمات" : "Services"}

{ar ? "خدمات سيُؤكِّدها العميل، لا نخترعها." : "Services the client confirms — not invented."}

{ar ? "تظهر هذه الفئات كأطر آمنة وعامة. ستُستبدَل المسميات الفعلية للقطع، الأقمشة، الأسعار، ومُهل التسليم بعد جلسة الإحاطة مع العميل." : "These cards are deliberately generic frameworks. Concrete garment names, fabrics, prices, and turnaround windows will be filled in after the client briefing — never assumed."}

{ar ? "ما لن نقوله" : "What we won't claim"}

{ar ? "بدون مبالغة في القطاع." : "No sector overstatement."}

{ar ? "حتى تأكيد العميل، لن نُعلن \"بدلات رجالية مفصّلة\"، \"عبايات\"، \"كنادير\"، \"فساتين زفاف\"، أو خياطة غربية. الأدلة العامة مختلطة، ونفضّل الصمت على الادعاء." : <>Until the client confirms, we will not advertise men's bespoke suits, abayas, kanduras, bridal, or western suiting. Public evidence is mixed — silence is better than a claim.}

CLIENT-FILL · garment mix CLIENT-FILL · turnaround CLIENT-FILL · fabric sources
); } /* ============================================================ PROCESS ============================================================ */ const STEPS = [ { en: ["Enquiry", "Request a visit — phone, form, or message. We confirm a time."], ar: ["استفسار", "اطلب زيارة — هاتفًا، أو عبر النموذج، أو رسالة. نؤكّد لك الوقت."] }, { en: ["Consultation", "An unhurried first conversation in the studio. Brief, references, occasion, timing."], ar: ["استشارة", "محادثة أولى دون استعجال داخل الاستوديو. الموجز، المراجع، المناسبة، التوقيت."] }, { en: ["Measurement", "Careful measurements taken in person."], ar: ["قياس", "تُؤخذ القياسات بدقّة وشخصيًا."] }, { en: ["Material", "Materials selected together from the studio's curation."], ar: ["الخامة", "نختار الخامات معًا من تشكيلة الاستوديو."] }, { en: ["Fitting", "One or more fittings, depending on the piece."], ar: ["القياس التجريبي", "قياس أو أكثر، بحسب القطعة."] }, { en: ["Finish & Collection", "Final hand-finishing, pressing, and collection at the studio."], ar: ["التشطيب والاستلام", "تشطيب يدوي أخير، كي، ثم الاستلام في الاستوديو."] }, ]; function ProcessSteps({ locale, short }) { const ar = locale === "ar"; const items = short ? STEPS.slice(0, 6) : STEPS; return (
{items.map((s, i) => { const [title, body] = ar ? s.ar : s.en; return (
{String(i + 1).padStart(2, "0")}

{title}

{body}

); })}
); } function ProcessPage({ onNav, locale }) { const ar = locale === "ar"; return (
{ar ? "المسار" : "Process"}

{ar ? "ست خطوات هادئة، تترك مساحة للوقت." : "Six quiet steps, with time built in."}

{ar ? "خطوات عامة ودقيقة. أعداد القياسات الفعلية، ومُهل التسليم، وقوائم الأقمشة، تبقى مفتوحة حتى يؤكدها الأستوديو." : "Generic and accurate. The exact number of fittings, the turnaround, and the fabric houses will be filled in by the studio — never guessed."}

{ar ? "تفاصيل قابلة للملء" : "Fill-in details"}
{["Turnaround window", "Number of fittings", "Fabric house list", "Pickup vs delivery", "Restoration scope"].map((k, i) => (
{k}
CLIENT-FILL
))}
); } Object.assign(window, { HomePage, ServicesPage, ProcessPage, ServiceGrid, ProcessSteps, MEDIA, STOCK });