"use client"; import Image from "next/image"; import { type CSSProperties, useId, useRef } from "react"; import { type Device, getShowcaseAssets } from "@/lib/project-showcase"; import { BrowserFrame, displayUrl } from "./BrowserFrame"; import { PhoneFrame } from "./PhoneFrame"; import { ProjectActions } from "./ProjectActions"; import { type ShowcaseItem, useShowcaseOpen } from "./ShowcaseProvider"; import { useNearViewport } from "./useShowcaseMedia"; function ListItem({ item, device, onExpand, }: { item: ShowcaseItem; /** `null` no servidor e até montar: o item mostra só o texto e os links. */ device: Device | null; onExpand?: () => void; }) { const { config, project } = item; const ref = useRef(null); const near = useNearViewport(ref); const assets = device ? getShowcaseAssets(config.id, device) : null; // só pôster (nunca vídeo): a imagem entra quando o item chega a ~1 tela da janela const poster = assets && near ? ( {`Captura ) : null; return (
  • {device && (
    {device === "mobile" ? ( {poster} ) : (
    {poster}
    )}
    )}

    {project.category} · {project.status}

    {project.title}

    {project.subtitle &&

    {project.subtitle}

    }
  • ); } /** * Projetos em lista simples: sem rolagem presa, sem vídeo que acompanha a rolagem. No celular (abaixo de 768 px) * é um carrossel por toque (rolagem horizontal com encaixe, o próximo projeto aparece pela borda); em telas * maiores, uma grade. Serve também a quem pede menos movimento e a janelas baixas demais para a vitrine fixa. * * É o que o servidor entrega (texto e links, sem mídia): sem JavaScript os projetos continuam todos ali, e * `pending` esconde a lista por CSS só onde a vitrine fixa vai assumir o lugar (largura e altura de desktop). * Pôster e "Ampliar vídeo" entram depois que o navegador monta; vídeo, só dentro da janela ampliada. */ export function ProjectList({ items, device, pending = false, }: { items: ShowcaseItem[]; device: Device | null; pending?: boolean; }) { const open = useShowcaseOpen(); const headingId = useId(); return (

    Projetos de clientes

    ); }