// 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 (
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 (
Les métiers
Trois expertises, une même exigence
Une spécialisation forte sur trois familles de métiers, et une connaissance fine de chaque fonction, de son marché et de ses grilles de rémunération.
{items.map((it, i) => (
{it.title}
{it.lead}
{it.roles.map((r) => (
{r}
))}
{it.tags.map((t) => {t})}
))}
);
}
/* ---------------- 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 (
Le spectre des missions
De la première embauche à la gouvernance d'un groupe
Chaque contexte a ses enjeux. Le même soin, la même exigence, que vous structuriez une équipe naissante ou que vous recomposiez une direction.
{rows.map((r, i) => (
{r.title}
{r.desc}
))}
);
}
/* ---------------- 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 (
La méthode
Un accompagnement sur mesure, à chaque étape du cycle
Un interlocuteur unique, du premier brief à l'intégration. Une exigence de grand cabinet, la proximité d'un partenaire de confiance.
« Faire les choses avec soin, sans jamais brader la qualité au profit de la vitesse. »
6 ans d'expérience dans le recrutement par approche directe et une expertise forte sur les métiers RH, juridiques et commerciaux, auprès d'entreprises très variées. Comprendre vite un métier, un marché, une culture, et prendre le temps des bonnes questions avant de présenter un profil : c'est là que se joue un recrutement réussi.
L'objectif reste le même à chaque mission : des recrutements justes, qui tiennent dans le temps, et des relations de confiance qui durent, côté entreprises comme côté candidats.
{[
{ icon: "search", title: "Le fond avant la forme", desc: "La bonne personne coche rarement le plus de cases sur le papier. Au-delà du CV, le fond, la trajectoire et l'adéquation réelle priment." },
{ icon: "zap", title: "Chaque semaine compte", desc: "Sur un poste clé, tout avance vite, avec la même exigence, du premier échange à l'intégration." },
{ icon: "scale", title: "Des faits, pas des impressions", desc: "Recouper, vérifier, ne rien tenir pour acquis. Une décision d'embauche se prend sur des faits, pas sur une impression." },
{ icon: "handshake", title: "Le lien avant la transaction", desc: "La relation compte bien au-delà de la signature. C'est ce qui construit des partenariats durables." },
].map((c, i) => (