/* ============================================================ UVD CLUB — Home (3 direções: Atelier · Club · Library) ============================================================ */ /* ---- slides do hero ---- */ const HERO_SLIDES = [ { kicker: "Bem-vinda ao clube", title: "Hot Girls\nStudy ", emph: "Hard.", sub: "Moda, papelaria e acessórios para a sua era mais inteligente.", cta: "Explorar a coleção", src: "assets/hero-welcome.jpg", pos: "right center", mpos: "74% 14%", panel: "cream", target: "Moletons & Roupas" }, { kicker: "Acessórios", title: "Reading\nis sexy.", sub: "A tote que virou ícone. Cabe livro, notebook e personalidade.", cta: "Ver a tote bag", src: "assets/tote-reading.jpg", pos: "center top", mpos: "58% 12%", panel: "cream", target: "Acessórios" }, { kicker: "Best-seller", title: "Aconchego\npra estudar", sub: "O moletom-hino do clube, em bordado vinho.", cta: "Comprar moletom", src: "assets/moletom-hoodie.jpg", pos: "center top", mpos: "center 8%", panel: "cream", target: "Moletons & Roupas" }, ]; /* ---- carrossel hero ---- */ function HeroCarousel({ framed, onNav }) { const isMobile = useIsMobile(); const [i, setI] = useState(0); const n = HERO_SLIDES.length; const timer = useRef(null); const start = () => { stop(); timer.current = setInterval(() => setI((x) => (x + 1) % n), 6000); }; const stop = () => timer.current && clearInterval(timer.current); useEffect(() => { start(); return stop; }, []); const go = (x) => { setI((x + n) % n); start(); }; /* swipe (mobile) */ const touch = useRef(null); const onTouchStart = (e) => { touch.current = e.touches[0].clientX; }; const onTouchEnd = (e) => { if (touch.current == null) return; const dx = e.changedTouches[0].clientX - touch.current; if (Math.abs(dx) > 44) go(dx < 0 ? i + 1 : i - 1); touch.current = null; }; return (
{HERO_SLIDES.map((sl, idx) => { const active = idx === i; return (
{isMobile ? ( /* MOBILE — foto contida no topo (menos zoom = nítida) + painel creme com o texto embaixo */
{sl.kicker}
{active && (
{sl.kicker}

{sl.title}{sl.emph && {sl.emph}}

{sl.sub}

)}
) : ( /* DESKTOP — split editorial, modelo 100% visível */
{active && (
{sl.kicker}

{sl.title}{sl.emph && {sl.emph}}

{sl.sub}

)}
{sl.kicker}
)}
); })} {/* setas — só desktop */} {!isMobile && } {!isMobile && } {/* dots */}
{HERO_SLIDES.map((_, idx) => (
); } const navArrow = (side) => ({ position: "absolute", top: "50%", [side]: 18, transform: "translateY(-50%)", zIndex: 6, width: 48, height: 48, borderRadius: "50%", background: "rgba(250,245,236,0.9)", border: "none", color: "var(--wine)", fontSize: 26, lineHeight: 1, display: "flex", alignItems: "center", justifyContent: "center", boxShadow: "0 4px 16px rgba(43,35,30,0.15)", }); /* ---- grid de produtos ---- */ function ProductGrid({ products, onOpen, onAdd, variant, title, kicker, cols = 4, limit }) { const isMobile = useIsMobile(); const list = limit ? products.slice(0, limit) : products; const effCols = isMobile ? 2 : cols; return (
{title && (
{kicker && {kicker}}

{title}

Ver tudo →
)}
{list.map((p) => )}
); } /* ---- trio de categorias ---- */ function CategoryTrio({ onNav }) { const isMobile = useIsMobile(); const cats = [ { name: "Moletons & Roupas", ph: "FOTO — peça vestida", src: "assets/moletom-hoodie.jpg", pos: "center 18%" }, { name: "Acessórios", ph: "FOTO — bolsa / óculos", src: "assets/tote-reading.jpg", pos: "75% center" }, { name: "Papelaria", ph: "FOTO — cadernos / agenda", src: "assets/caderno-smart-girl.jpg", pos: "center" }, ]; return (
{cats.map((c) => (
onNav && onNav(c.name)} style={{ position: "relative", cursor: "pointer", overflow: "hidden" }}>
{c.name}
))}
); } /* ---- marquee grande (club) ---- */ function BigMarquee({ phrases }) { const isMobile = useIsMobile(); const row = [...phrases, ...phrases]; return (
{row.map((p, i) => ( {p} ))}
); } /* ============================================================ DIREÇÃO A — ATELIER (editorial elegante) ============================================================ */ function HomeAtelier({ products, phrases, onOpen, onAdd, onNav }) { const isMobile = useIsMobile(); const featured = products.find((p) => p.id === "moletom-hot-girls"); return (
{/* manifesto linha */}
O clube

Peças pensadas para garotas que transformam a rotina de estudos em estilo de vida. Inteligência é o novo charme.

{/* feature editorial assimétrico */} {featured && (
Destaque

{featured.name}

{featured.blurb}

{fmtBRL(featured.price)}
{featured.colors.map((c) => )}
)}
); } /* ============================================================ DIREÇÃO B — CLUB (jovem, comunidade, frases) ============================================================ */ function HomeClub({ products, phrases, onOpen, onAdd, onNav }) { const isMobile = useIsMobile(); return (
{/* hero = mesmo carrossel do Atelier (pedido do cliente) */} {/* faixa frases-chips */}
{phrases.map((p) => ( {p} ))}
{/* trio de categorias (igual ao fim do Atelier) */} {/* comunidade / instagram */}
Comunidade

@uvdclub

Marque suas fotos e apareça aqui ✶

{Array.from({ length: isMobile ? 9 : 10 }).map((_, i) => ( ))}
); } /* ============================================================ DIREÇÃO C — LIBRARY (híbrido aconchegante / editorial cozy) ============================================================ */ function HomeLibrary({ products, phrases, onOpen, onAdd, onNav }) { const isMobile = useIsMobile(); return (
{/* título acima do carrossel emoldurado */}
UVD Club · Coleção 2026

Horas de biblioteca,
vestidas com carinho.

{/* manifesto com capitular */}

O UVD Club nasceu da ideia de que estudar pode ser bonito. Cada peça — do moletom aconchegante ao caderno de capa dura — é feita para acompanhar suas madrugadas, manhãs de café e tardes de leitura. Coisas simples, bem-feitas, em tons quentes de creme e vinho.


{/* categorias editoriais empilhadas */}
{/* lifestyle row */}
O ritual

Monte sua mesa perfeita

Caderno, caneca, moletom favorito e foco. A combinação que faz a diferença na sua era de estudos.

); } /* ---- wrapper que escolhe a direção ---- */ function Home({ dir, ...props }) { if (dir === "club") return ; if (dir === "library") return ; return ; } Object.assign(window, { Home, HomeAtelier, HomeClub, HomeLibrary, HeroCarousel, ProductGrid, CategoryTrio, BigMarquee });