// Inera People — marketing site sections (() => { const { Button, Card, Badge, Tag, Avatar, Input, Textarea, Select } = window.IneraPeopleDesignSystem_7b6830; // Lucide icon helper (see ICONOGRAPHY — Lucide substitutes for an unspecified set) function Icon({ name, size = 22, color = "currentColor", stroke = 1.6, style = {} }) { const ref = React.useRef(null); React.useEffect(() => { if (ref.current && window.lucide) { ref.current.innerHTML = ""; const el = document.createElement("i"); el.setAttribute("data-lucide", name); ref.current.appendChild(el); window.lucide.createIcons({ attrs: { width: size, height: size, stroke: color, "stroke-width": stroke }, }); } }, [name, size, color, stroke]); return ; } // Sends a form's contents to contact@inerapeople.fr through the site's own // server endpoint (send.php). Nothing opens on the visitor's device and no // third-party service is involved. If a file is given (candidate CV), it is // sent as multipart so send.php can attach it. Returns true on success. async function sendByEmail(subject, fields, file) { const emailValue = Object.values(fields).find( (v) => typeof v === "string" && /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(v.trim()) ); try { let res; if (file && file.size) { const form = new FormData(); form.append("_subject", subject); form.append("_replyto", emailValue || ""); Object.entries(fields).forEach(([k, v]) => form.append(k, v == null ? "" : v)); form.append("cv", file, file.name); // No explicit Content-Type: the browser sets the multipart boundary. res = await fetch("send.php", { method: "POST", body: form }); } else { const payload = { _subject: subject, _replyto: emailValue || "", ...fields }; res = await fetch("send.php", { method: "POST", headers: { "Content-Type": "application/json;charset=UTF-8" }, body: JSON.stringify(payload), }); } const data = await res.json().catch(() => null); return res.ok && data && data.ok === true; } catch (err) { return false; } } // Scroll-reveal wrapper — fades + slides its child in when it enters the viewport. function Reveal({ children, delay = 0, y = 26, once = true, style = {}, className }) { const ref = React.useRef(null); const [shown, setShown] = React.useState(false); React.useEffect(() => { const el = ref.current; if (!el) return; if (window.matchMedia && window.matchMedia("(prefers-reduced-motion: reduce)").matches) { setShown(true); return; } const root = el.closest("[data-scroll]") || null; const io = new IntersectionObserver((entries) => { entries.forEach((e) => { if (e.isIntersecting) { setShown(true); if (once) io.unobserve(e.target); } else if (!once) setShown(false); }); }, { root, threshold: 0.15, rootMargin: "0px 0px -6% 0px" }); io.observe(el); return () => io.disconnect(); }, [once]); return (
{children}
); } // Count-up number, runs once when `run` becomes true. function useCountUp(target, run, dur = 1300) { const [val, setVal] = React.useState(0); React.useEffect(() => { if (!run) return; if (window.matchMedia && window.matchMedia("(prefers-reduced-motion: reduce)").matches) { setVal(target); return; } let raf, start; const tick = (t) => { if (!start) start = t; const p = Math.min(1, (t - start) / dur); const eased = 1 - Math.pow(1 - p, 3); setVal(Math.round(eased * target)); if (p < 1) raf = requestAnimationFrame(tick); }; raf = requestAnimationFrame(tick); return () => cancelAnimationFrame(raf); }, [run, target, dur]); return val; } // Rotating word — swaps through a list with a fade. function WordRotator({ words, interval = 1500, style = {} }) { const [i, setI] = React.useState(0); React.useEffect(() => { if (window.matchMedia && window.matchMedia("(prefers-reduced-motion: reduce)").matches) return; const id = setInterval(() => setI((v) => (v + 1) % words.length), interval); return () => clearInterval(id); }, [words.length, interval]); return {words[i]}; } // Infinite scrolling banner — refined, premium. function Marquee({ items }) { const row = [...items, ...items]; return (
{row.map((it, idx) => ( {it} ))}
); } // Small rule + label used to open every section — a quiet, consistent signature. function Eyebrow({ children, tone = "accent", center = false, style = {} }) { const color = tone === "ink" ? "var(--metal-mid)" : "var(--accent)"; return (
{children}
); } /* ---------------- Hero ---------------- */ function Hero({ onContact }) { const [mounted, setMounted] = React.useState(false); const [scroll, setScroll] = React.useState(0); React.useEffect(() => { const t = setTimeout(() => setMounted(true), 60); return () => clearTimeout(t); }, []); React.useEffect(() => { const sc = document.querySelector("[data-scroll]"); if (!sc) return; const onScroll = () => setScroll(sc.scrollTop); sc.addEventListener("scroll", onScroll, { passive: true }); return () => sc.removeEventListener("scroll", onScroll); }, []); const fade = Math.max(0, 1 - scroll / 460); const drift = Math.min(60, scroll * 0.14); const y6 = useCountUp(6, mounted); const stats = [ { node: y6, suffix: " ans", label: "à recruter des profils clés" }, { node: "RH · Juridique · Commercial", suffix: "", label: "trois expertises" }, { node: "CDD · CDI", suffix: "", label: "tous secteurs, France" }, ]; const stagger = (i) => ({ opacity: mounted ? 1 : 0, transform: mounted ? "none" : "translateY(22px)", transition: `opacity 800ms var(--ease-out) ${i * 110}ms, transform 800ms var(--ease-out) ${i * 110}ms`, }); return (
{/* corporate photo backdrop — charcoal wash on top keeps it on-brand */}

Le recrutement de vos cadres & dirigeants

Cabinet de recrutement indépendant dédié aux fonctions RH, juridiques et commerciales. Recherche par approche directe, sélection exigeante, confidentialité absolue : chaque mandat est mené avec la rigueur qu'imposent les postes de direction.

Vous êtes{" "} {" "}? Inera People a l'expertise pour transformer votre recherche en un recrutement qui s'impose dans la durée.

{stats.map((s, i) => (
{s.node}{s.suffix} {s.label}
))}
Défiler
); } /* ---------------- Métiers ---------------- */ function Metiers() { const items = [ { icon: "users-round", title: "Ressources Humaines", photo: "https://images.unsplash.com/photo-1573497491208-6b1acb260507?auto=format&fit=crop&w=1000&q=80", lead: "Des fonctions RH stratégiques aux expertises pointues.", roles: ["DRH · RRH · HR Business Partner", "Talent Acquisition · Recrutement", "Comp & Ben · Paie & ADP", "Formation · L&D · Développement RH", "Relations sociales · QVCT", "SIRH · People Analytics"], tags: ["CDI", "CDD", "Cadres & direction"], }, { icon: "scale", title: "Juridique", photo: "https://images.unsplash.com/photo-1450101499163-c8848c66ca85?auto=format&fit=crop&w=1000&q=80", lead: "Du conseil corporate au droit social, en passant par la conformité.", roles: ["Directeur · Responsable juridique", "Corporate · M&A · Private Equity", "Contrats · Droit commercial", "Droit social · Relations collectives", "Compliance · Éthique · DPO", "Contentieux · Propriété intellectuelle"], tags: ["CDI", "CDD", "Cadres & direction"], }, { icon: "trending-up", title: "Commercial", photo: "https://images.unsplash.com/photo-1552664730-d307ca884978?auto=format&fit=crop&w=1000&q=80", lead: "Les profils qui portent la croissance, du terrain à la direction.", roles: ["Directeur commercial · Head of Sales", "Directeur du développement · Business Development", "Key Account · Grands comptes", "Direction de BU · Country Manager", "Sales Ops · Revenue Operations", "Marketing · Partenariats"], tags: ["CDI", "CDD", "Cadres & direction"], }, ]; return (
); } /* ---------------- Missions (le spectre) ---------------- */ function Missions() { const rows = [ { n: "01", icon: "sprout", title: "Founding team & premiers cadres", desc: "Structurer l'équipe dirigeante d'une entreprise qui se lance : associés opérationnels, premières directions de fonction, profils fondateurs d'un métier." }, { n: "02", icon: "rocket", title: "Scale-up & hypercroissance", desc: "Recruter les profils qui accompagnent une montée en puissance rapide, sans jamais diluer la culture ni l'exigence." }, { n: "03", icon: "shield-check", title: "Recrutement stratégique & confidentiel", desc: "Sécuriser un poste sensible, préparer une succession ou remplacer un dirigeant en place, en toute discrétion." }, { n: "04", icon: "refresh-cw", title: "Transformation & repositionnement", desc: "Accompagner un changement d'organisation, une nouvelle direction ou un virage stratégique par les bons recrutements." }, { n: "05", icon: "landmark", title: "Gouvernance · COMEX & CODIR", desc: "Recomposer un comité de direction, intégrer un membre de COMEX ou de CODIR, préparer une transition de gouvernance." }, { n: "06", icon: "building-2", title: "Grands groupes, à fort enjeu", desc: "Répondre à des recrutements cadres critiques, tous secteurs, à l'échelle nationale comme internationale." }, ]; return (
); } /* ---------------- Manifesto band (full-bleed image + signature quote) ---------------- */ function Manifesto() { return (
Le vrai enjeu
Un bon recrutement ne consiste pas à remplir un poste vacant sur les fonctions centrales de l'entreprise. C'est une décision à fort impact, qui engage la stratégie collective.

Elle se prend avec rigueur : les bonnes questions, l'exigence juste, et la discrétion d'un tiers de confiance.

); } /* ---------------- Approche (méthodologie — timeline exec) ---------------- */ function Approche() { const steps = [ { title: "Brief & cadrage stratégique", desc: "Bien plus qu'une fiche de poste. le besoin est challengé, l'organisation cartographiée et la job description co-construite avec vous : compétences clés, soft skills, package et trajectoire de carrière." }, { title: "Mapping de marché", desc: "Cartographie exhaustive des viviers : secteurs, concurrents, profils actifs et passifs. Une lecture claire du marché et des rémunérations, avant même la première approche." }, { title: "Approche directe & évaluation", desc: "Chasse ciblée et confidentielle, entretiens structurés, mises en situation, prise de références. Recouper, vérifier, ne rien tenir pour acquis." }, { title: "Conseil & accompagnement", desc: "Tiers de confiance entre l'entreprise et le candidat : positionnement, marque employeur, négociation salariale, aide à la décision. Un vrai rôle de conseil à chaque étape." }, { title: "Intégration & suivi", desc: "Un cycle de bout en bout : accompagnement jusqu'à la prise de poste, suivi de la période d'essai, garantie d'un recrutement qui s'inscrit dans la durée." }, ]; return (
); } /* ---------------- Fondatrice ---------------- */ function Fondatrice({ onContact }) { return (
); } /* ---------------- Contact ---------------- */ function Contact() { const { Tabs } = window.IneraPeopleDesignSystem_7b6830; const [audience, setAudience] = React.useState("Entreprises"); const [sent, setSent] = React.useState(false); const isClient = audience === "Entreprises"; const switchTo = (v) => { setAudience(v); setSent(false); }; return (