"use client"; import { useState, useEffect } from "react"; import { motion } from "framer-motion"; import Loader from "../components/Loader"; import { usePortfolio } from "../services/portfolio"; import { assetUrl } from "../services/api"; import type { ThemeProps } from "../types"; function PortfolioInner({ isNavyBg }: ThemeProps) { const { data, isLoading } = usePortfolio(); const bg = isNavyBg ? "#080c14" : "#f0efec"; const text = isNavyBg ? "#ffffff" : "#0a0a0a"; const sub = isNavyBg ? "rgba(255,255,255,0.45)" : "#6a6866"; const border = isNavyBg ? "rgba(255,255,255,0.08)" : "rgba(0,0,0,0.08)"; const card = isNavyBg ? "rgba(255,255,255,0.03)" : "#ffffff"; const tagBg = isNavyBg ? "rgba(255,255,255,0.07)" : "rgba(0,0,0,0.05)"; const projects = data ?? []; if (isLoading) { return ( ); } if (projects.length === 0) return null; return ( Casos de éxito Construimos el sistema. Tú operas el negocio. Proyectos reales, resultados medibles. Cada implementación parte de entender la operación antes de escribir una sola línea de código. {projects.map((p, i) => { const cover = p.images.find((img) => img.isCover) ?? p.images.sort((a, b) => a.order - b.order)[0]; return ( {/* Cover image */} {cover ? ( ) : ( )} {/* Content */} {p.clientCompanyName && ( {p.clientCompanyName} )} {p.title} {p.publicSummary && ( {p.publicSummary} )} {p.technologies.length > 0 && ( {p.technologies.map((t) => ( {t.name} ))} )} ); })} ); } export const Portfolio = (props: ThemeProps) => { const [mounted, setMounted] = useState(false); useEffect(() => setMounted(true), []); if (!mounted) return null; return ; };
Proyectos reales, resultados medibles. Cada implementación parte de entender la operación antes de escribir una sola línea de código.
{p.publicSummary}