/* TDD — page components */ const { useState: useS, useEffect: useE, useMemo, useRef: useR } = React; /* ---------------- HOME ---------------- */ function HomePage({ onNavigate, openBrand, audience, heroImage }) { useReveal(); const d = window.TDD_DATA; const featured = ["alhambra", "lizzo", "gruppo-mastrotto", "william-morris", "voyage", "kai"] .map(s => d.brands.find(b => b.slug === s)).filter(Boolean); const heroOpts = { "orange": "media/insitu-orange-cushions.webp", "greenery": "media/insitu-greenery-sofa.webp", "yellow": "media/insitu-yellow-chair.webp", "dining": "media/insitu-dining-room.webp", }; const heroSrc = heroOpts[heroImage] || heroOpts.orange; return (
{/* HERO */}
{audience === "trade" ? "Trade Studio · Dubai d3" : "By-appointment Studio · Dubai d3"}

European furnishings, made for the Middle East.

Sixteen of Europe's leading textile, leather, wallpaper and carpet houses — curated for the climate, projects and design culture of the Gulf. Specified from a studio you can actually visit.

Brands
16 houses
Materials
5 categories
Pedigree
Two decades
Interior in TDD-curated fabrics
In-situ · Dubai project
{/* PROPOSITION STRIP */}
Curation · Craft · Colour.
A textile-led, design-district resource for the people who specify interiors — where fabrics are shown applied in real spaces, brands organised as a navigable library, and material conversations happen in a studio. The Design Destination · Dubai d3 · Sharjah SAIF · Doha
{/* BRAND LIBRARY TEASER */}
Brand Library · 16 European houses

A library, not a list.

Each represented house — Spanish weaving, Italian leather, French rugs, British heritage — is given a room of its own, with the materials, applications and projects that distinguish it.

{featured.map(b => ( ))}
{/* MATERIALS IN-SITU */}
Materials, applied

Not a swatch grid.
A scene per material.

Fabrics, leather, wallpaper, carpets and accessories — shown the way they're specified: in rooms, against light, paired with the other materials of the project.

{d.materials.slice(0, 3).map((m, i) => (
{m.name}
{m.num} · {m.name}
Category {m.num}

{m.name}.

{m.lede}

From the library
{m.brands.slice(0, 5).map(b => {b})}{m.brands.length > 5 && +{m.brands.length - 5}}
))}
{/* STUDIO INVITE */}
The Studio · Office 105B, d3

A studio you can actually visit.

Hands on the materials. Design and technical advice from the team that represents the brands. Conversations that move a specification forward in an afternoon, not a fortnight.

Studio reception
Swatches
Fabric racks
Leather rail
Display wall
{/* GROUP */}
The TDD Group · Three entities, one library

Dubai. Sharjah. Doha.

Three legally distinct entities, served from one curated library — so a project specified in Dubai can be sourced through Sharjah's free zone or fulfilled to Qatar without the contract changing shape.

{d.group.map(g => (
{g.role}
{g.city}
{g.entity}
{g.address}
{g.hours}
))}
); } /* ---------------- BRANDS LIBRARY ---------------- */ function BrandsPage({ openBrand }) { useReveal(); const d = window.TDD_DATA; const [filter, setFilter] = useS("All"); const cats = ["All", "Fabrics", "Leather", "Wallpaper", "Carpets", "Accessories"]; const filtered = filter === "All" ? d.brands : d.brands.filter(b => b.categories.includes(filter)); return (
The Brand Library · {d.brands.length} houses

Sixteen European houses,
one room each.

Each house has a different reason to exist — heritage, performance, colour, leather craft. Filter the library by material category, or browse the full set below.

{cats.map(c => ( ))}
{filtered.map(b => ( ))}
); } /* ---------------- BRAND DETAIL ---------------- */ function BrandDetail({ slug, onNavigate, openBrand }) { useReveal(); const d = window.TDD_DATA; const b = d.brands.find(x => x.slug === slug); if (!b) return null; const related = d.brands.filter(x => x.slug !== b.slug && x.categories.some(c => b.categories.includes(c))).slice(0, 4); const applicationImages = [ b.hero, "media/insitu-greenery-sofa.webp", "media/insitu-orange-cushions.webp", "media/insitu-dining-room.webp", ].filter(Boolean).slice(0, 4); return (
{b.name}
Brand · {b.origin}

{b.name}

{b.tagline}

{b.blurb}

Since{b.since}
Origin{b.origin}
Materials{b.materials.join(", ")}
Applications

In rooms.

Selected installations where {b.name}'s materials carry the room. Project names withheld pending client permission; in-studio we can show you the full reference set.

{applicationImages.map((src, i) => (
Application
))}
Adjacent in the library

Houses you might pair.

{related.map(rb => ( ))}
); } /* ---------------- MATERIALS PAGE ---------------- */ function MaterialsPage({ onNavigate, openBrand }) { useReveal(); const d = window.TDD_DATA; const [activeKey, setActiveKey] = useS(null); return (
Materials

Five categories.
Always shown in rooms.

What each material is, the houses that produce it from TDD's library, and the rooms in which it's been specified. Where a material's performance matters — Aqua Clean's water-cleanable upholstery, Mastrotto's contract-grade hides — we say what the brand says, no more.

{d.materials.map((m, i) => (
{i % 2 === 0 ? ( <>
{m.name}
openBrand(slug)} d={d} /> ) : ( <> openBrand(slug)} d={d} />
{m.name}
)}
))}
Want a material brief for a specific room, palette or budget? Trade & private — by appointment
); } function MatCopy({ m, onBrand, d }) { return (
{m.num} / 05

{m.name}.

{m.lede}

From the library
{m.brands.map(name => { const b = d.brands.find(x => x.name === name); return ( ); })}
); } /* ---------------- STUDIO PAGE ---------------- */ function StudioPage({ onNavigate, onBook }) { useReveal(); const d = window.TDD_DATA; return (
The Studio · Office 105B, Building 7 · d3

The library,
in person.

A by-appointment studio in Dubai Design District where the brands TDD represents are organised, racked and ready to handle. Bring the project brief; leave with samples.

Hours
Sun – Thu
Format
By appointment
For
Trade · Private
Studio reception
Office 105B · d3 · Dubai
The visit

What happens in the room.

{[ { n: "01", t: "Brief", b: "Bring the room, the palette, the constraints. We'll start with what's fixed (light, sightlines, existing furniture) before we open swatches." }, { n: "02", t: "Hands on", b: "Pull the actual hides, the actual sheers, the actual carpets — the library is racked by application, not by brand alphabet." }, { n: "03", t: "Moodboard", b: "We can build the curation in-room or send it as a moodboard the next day. Materials shown together, with codes, references and lead times." }, { n: "04", t: "Samples", b: "Cut samples to take with you. Larger lengths sent to the project address; brochures and brand boxes by request." }, ].map(s => (
{s.n}

{s.t}

{s.b}

))}
The space

Racked, labelled, lit.

Office 105B was built around the way fabrics, leather and wallpaper need to be seen — daylight, neutral walls, racks at the right height, and a meeting room when the moodboard takes over the bench.

); } /* ---------------- ABOUT ---------------- */ function AboutPage({ onNavigate }) { useReveal(); const d = window.TDD_DATA; return (
About TDD · The Design Destination

Two decades of
interior textile
in one library.

TDD — The Design Destination — represents Europe's senior textile, leather, wallpaper and carpet houses to the design districts of the Gulf.

The studio in Dubai Design District (Office 105B, Block B, Building 7) is built around the way materials are actually specified: in-hand, in-light, against the room's other surfaces. Sixteen European brands are racked, labelled and ready to handle — Spanish weaves, Italian leather, French rugs, British heritage prints, Belgian carpets, German publishers, Scottish watercolour textiles.

The work is split across three legally distinct entities — Dubai (d3), Sharjah (SAIF) and Doha — so a project specified once can be sourced and fulfilled across the region without changing shape.

It's a trade resource first: interior designers, architects, fit-out and procurement teams account for most of the studio's diary. Private clients — discerning homeowners specifying premium furnishings — are welcomed by appointment.

16
European houses
5
Material categories
3
Group entities
~20
Years in the trade
The Group · Three entities

Dubai. Sharjah. Doha.

Each entity is contractable in its own jurisdiction. Phone numbers are direct and verified; for project-routing questions write to the studio.

{d.group.map(g => (
{g.role}
{g.city}
{g.entity}
{g.address}
{g.hours}
))}
The full roster

Brands we represent.

{d.brands.map(b => (
onNavigate("brands")}>
{b.name}
{b.origin} · {b.categories.join(" · ")}
))}
); } Object.assign(window, { HomePage, BrandsPage, BrandDetail, MaterialsPage, StudioPage, AboutPage });