);
}
const CLIENT_LOGOS = [
{ name: "Super U", file: "super-u.png" },
{ name: "Peugeot", file: "peugeot.png" },
{ name: "Arkéa", file: "arkea.png" },
{ name: "Deepreach", file: "deepreach.png" },
{ name: "Sup de Pub", file: "sup-de-pub.png" },
{ name: "OhMyDiode", file: "ohmydiode.svg" },
{ name: "Dessine-moi un Hôtel", file: "dessine-moi-un-hotel.jpg" },
{ name: "Catella", file: "catella.webp" },
{ name: "Pan Paon", file: "pan-paon.webp" },
];
function ClientLogos() {
const COUNT = 6;
const [slots, setSlots] = useState([0, 1, 2, 3, 4, 5]);
const [fading, setFading] = useState(-1);
const slotsRef = useRef(slots);
slotsRef.current = slots;
const turn = useRef(0);
const pendingSlot = useRef(-1);
useEffect(() => {
let alive = true;
let loop = null, tSwap = null, tFallback = null;
const cycle = () => {
if (!alive) return;
loop = setTimeout(cycle, 4200);
const cur = slotsRef.current;
const slot = turn.current % COUNT;
turn.current += 1;
const used = new Set(cur);
const pool = CLIENT_LOGOS.map((_, i) => i).filter((i) => !used.has(i));
if (pool.length === 0) return;
const next = pool[Math.floor(Math.random() * pool.length)];
// Preload + decode the next logo BEFORE any visual change — no blank flash.
const img = new Image();
img.src = "assets/clients/" + CLIENT_LOGOS[next].file;
const start = () => {
if (!alive) return;
setFading(slot); // fade current out
tSwap = setTimeout(() => {
if (!alive) return;
pendingSlot.current = slot; // unfade only once the real has the new logo painted
setSlots((c) => { const o = c.slice(); o[slot] = next; return o; }); // swap while invisible
// fallback: cached swaps can skip the element's load event
tFallback = setTimeout(() => { if (alive && pendingSlot.current === slot) { pendingSlot.current = -1; setFading(-1); } }, 240);
}, 520);
};
const ready = img.decode ? img.decode().then(start).catch(start) : null;
if (!ready) { if (img.complete && img.naturalWidth) start(); else { img.onload = start; img.onerror = start; } }
};
loop = setTimeout(cycle, 4200);
return () => { alive = false; clearTimeout(loop); clearTimeout(tSwap); clearTimeout(tFallback); };
}, []);
const onSlotLoad = (s) => { if (pendingSlot.current === s) { pendingSlot.current = -1; setFading(-1); } };
return (
{slots.map((logoIdx, s) => {
const logo = CLIENT_LOGOS[logoIdx];
return (
onSlotLoad(s)} />
);
})}
);
}
function Hero() {
return (
L'agence produit, IA & growth
On conçoit vos produits, on les rend intelligents et on les fait grandir.
Studio produit, IA et growth avec une vraie logique d'agence. On développe vos applications et vos SaaS, on y branche les agents IA et l'automatisation, puis on construit les tunnels d'acquisition qui font venir vos clients.
);
}
function Approach() {
const nodes = [
{ no: "01", label: "Trigger", t: "Cadrage", icon: "target", delay: "0s", p: "On clarifie le problème, les usages et la valeur avant la moindre ligne de code." },
{ no: "02", label: "Action", t: "Build", icon: "code", delay: "1.6s", p: "On conçoit, on développe et on intègre l'IA. Démos régulières, vous voyez le produit grandir." },
{ no: "03", label: "Action", t: "Run", icon: "pulse", delay: "3.2s", p: "On maintient, on fait évoluer et on forme vos équipes. Le produit continue de vivre." },
];
return (
Notre façon de faire
Une équipe, pas une chaîne de sous-traitance.
On reste avec vous de l'idée à la production. Les mêmes personnes cadrent, codent et font vivre votre produit.
On déploie les outils. On forme vos équipes à les piloter.
Node it est un organisme de formation certifié Qualiopi. Au-delà des produits et des automatisations qu'on met en place, on forme vos équipes pour qu'elles s'approprient leurs nouveaux outils en toute autonomie. Nos formations sont finançables.
);
}
/* ============================================================
FAQ
============================================================ */
function Faq() {
const items = [
{ q: "Vous faites du produit ou de l'IA ?", a: "Les deux, et c'est tout l'intérêt. On conçoit le produit puis on y intègre l'IA là où elle crée vraiment de la valeur." },
{ q: "Combien de temps pour un premier livrable ?", a: "Un MVP utile sort généralement en un à quatre mois. On livre en continu, pas en big bang." },
{ q: "Pouvez-vous reprendre un projet existant ?", a: "Oui. On audite, on stabilise et on fait évoluer une base de code déjà en place." },
{ q: "Travaillez-vous avec des outils no-code ?", a: "Quand c'est pertinent. On combine code sur mesure et outils comme n8n pour aller vite sans dette inutile." },
];
const [open, setOpen] = useState(0);
const refs = useRef([]);
return (
Questions fréquentes
Ce qu'on nous demande souvent.
Une autre question ? Prenez rendez-vous, on y répond de vive voix.