Cases da SEV Moda Íntima e da Lavação 047; case no formato cliente, problema, entrega, mídia e contato, com detalhes técnicos recolhidos; sem GitHub, ressalvas e fontes de commit. /cases separa clientes e Laboratório. Serviços mostram o case de cliente certo e o bloco de investimento e prazo só aparece preenchido. Metadata social própria por página, not-found com noindex, sitemap com /ia.
32 lines
889 B
TypeScript
32 lines
889 B
TypeScript
import portfolioData from "@/public/portfolio-data.json";
|
|
import {
|
|
type DemoAvailability,
|
|
getDemoAvailability,
|
|
type ProjectHealthSnapshot,
|
|
} from "./project-health";
|
|
|
|
type PortfolioData = typeof portfolioData;
|
|
export type PortfolioProject = PortfolioData["projects"][number];
|
|
|
|
export type PortfolioProjectView = PortfolioProject & {
|
|
demoAvailability: DemoAvailability;
|
|
demoCheckedAt: string | null;
|
|
};
|
|
|
|
export const portfolio = portfolioData;
|
|
|
|
export function getFeaturedProjects(
|
|
snapshot: ProjectHealthSnapshot | null,
|
|
): PortfolioProjectView[] {
|
|
return portfolio.projects
|
|
.filter(({ featured }) => featured !== false)
|
|
.map((project) => {
|
|
const check = snapshot?.projects[project.id];
|
|
return {
|
|
...project,
|
|
demoAvailability: getDemoAvailability(project.demoUrl, check),
|
|
demoCheckedAt: check?.checkedAt ?? null,
|
|
};
|
|
});
|
|
}
|