/* ============================================================
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 */
{active && (
{sl.kicker}
{sl.title}{sl.emph && {sl.emph} }
{sl.sub}
onNav(sl.target)}>{sl.cta}→
)}
) : (
/* DESKTOP — split editorial, modelo 100% visível */
{active && (
{sl.kicker}
{sl.title}{sl.emph && {sl.emph} }
{sl.sub}
onNav(sl.target)}>{sl.cta}→
)}
)}
);
})}
{/* setas — só desktop */}
{!isMobile &&
go(i - 1)} style={navArrow("left")}>‹ }
{!isMobile &&
go(i + 1)} style={navArrow("right")}>› }
{/* dots */}
{HERO_SLIDES.map((_, idx) => (
go(idx)} style={{ width: idx === i ? 28 : 9, height: 9, borderRadius: 99, background: idx === i ? "var(--wine)" : "rgba(124,29,43,0.32)", border: "none", transition: "width .3s, background .3s" }} />
))}
);
}
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 (
);
}
/* ---- 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) => )}
onOpen(featured.id)}>Ver produto
)}
);
}
/* ============================================================
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.
onNav("Papelaria")}>Ver papelaria
);
}
/* ---- 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 });