/* Adhérent flow v2 — Questionnaire FESPA × BoostYourIA */ const { useState: useStateA, useMemo: useMemoA } = React; /* ============================================================ Landing ============================================================ */ function AdherentWelcome({ tweaks, onStart }) { return (
FESPA France × BoostYourIA · 2026
Commission Intelligence Artificielle · FESPA France

Usage de l'IA
dans la filière
Communication Visuelle

FESPA France souhaite mieux comprendre comment l'IA s'intègre dans les entreprises de la filière, et identifier vos besoins concrets en formation. Vos réponses orienteront les actions de la Commission IA.

4 minutes
chrono
5 blocs
17 questions
100% anonyme
au partage
Lien personnalisé · {tweaks.invitedCompany}
); } /* ============================================================ Steps definition ============================================================ */ const STEPS = [ { id: "profil", title: "Profil & entreprise", bloc: "Bloc 1" }, { id: "niveau", title: "Niveau & usage de l'IA", bloc: "Bloc 2" }, { id: "gouvernance",title: "Gouvernance & freins", bloc: "Bloc 3" }, { id: "formation", title: "Besoins en formation", bloc: "Bloc 4" }, { id: "cloture", title: "Clôture", bloc: "Bloc 5" } ]; /* ============================================================ Questionnaire shell ============================================================ */ function AdherentQuestionnaire({ tweaks, onSubmit, onBackHome }) { const data = window.FESPA_DATA; const [step, setStep] = useStateA(0); const [a, setA] = useStateA(() => initialAnswers(tweaks, data)); const set = (k, v) => setA(s => ({ ...s, [k]: v })); const toggle = (k, v) => setA(s => { const arr = s[k] || []; return { ...s, [k]: arr.includes(v) ? arr.filter(x => x !== v) : [...arr, v] }; }); const setNested = (k, sub, v) => setA(s => ({ ...s, [k]: { ...(s[k] || {}), [sub]: v } })); // Conditional logic — derive flags const isNonUser = a.usage === "Non, mais nous y réfléchissons" || a.usage === "Non, pas du tout"; const noPaidNeeded = a.paidStatus === "Non, nous utilisons uniquement les versions gratuites" || a.paidStatus === "En cours de réflexion"; const skipFormation = a.wantsFormation === "Non, pas pour l'instant"; const progress = ((step + 1) / STEPS.length) * 100; const stepDef = STEPS[step]; const next = () => step < STEPS.length - 1 ? setStep(step + 1) : onSubmit(a); const prev = () => step > 0 ? setStep(step - 1) : onBackHome(); return (
Étape {step + 1} / {STEPS.length}
{stepDef.bloc} — Section {String(step + 1).padStart(2, "0")}

{stepDef.title}

{step === 0 && } {step === 1 && } {step === 2 && } {step === 3 && } {step === 4 && }
Sauvegarde auto · à l'instant
); } function initialAnswers(tweaks, data) { return { // Q1 firstName: "Camille", lastName: "Rousseau", company: tweaks.invitedCompany, email: "camille.rousseau@" + tweaks.invitedCompany.toLowerCase().replace(/[^a-z]/g, "").slice(0, 14) + ".fr", // Q2 role: "", roleOther: "", // Q3 headcount: "", // Q4 sectors: [], sectorOther: "", // Q4bis opcoSalaries: [], opcoSalariesOther: "", opcoDirigeant: [], opcoDirigeantOther: "", // Q5 skill: 5, // Q6 usage: "", // Q7 tools: [], toolsOther: {}, // {groupName: text} toolMetier: "", toolOther: "", // Q7bis paidStatus: "", licences: {}, // {tool: count} licencesOther: "", // free text for "Autre" // Q8 domains: [], domainOther: "", // Q10 benefits: [], timeSavedHours: "", // Q10 policy: "", // Q11 barriers: [], barrierOther: "", // Q11bis pastTrainingStatus: "", pastTraining: { title: "", organism: "", headcount: "", year: "" }, pastTrainingSubjects: [], // Q12 wantsFormation: "", // Q12bis & Q13 — per-service training plan trainingPlan: data.catalog.SERVICES.reduce((o, s) => { o[s] = { headcount: "", themes: [] }; return o; }, {}), // Q17 — budget budget: "", // Q18 — right contact rightContact: "", contactFirstName: "", contactLastName: "", contactEmail: "", contactPhone: "", // Q19 — willing to share willingToShare: "", // Q17 comment: "" }; } /* ============================================================ Sub-fields ============================================================ */ function QLabel({ num, children, required, optional, sub }) { return (
{num} {children} {required && *} {optional && facultatif}
{sub &&
{sub}
}
); } function RadioRow({ name, options, value, onChange, layout = "stack" }) { return (
{options.map(opt => { const val = typeof opt === "string" ? opt : opt.value; const label = typeof opt === "string" ? opt : opt.label; return ( ); })}
); } function CheckGrid({ options, values, onToggle, cols = 2 }) { return (
{options.map(opt => ( ))}
); } function CheckGroup({ groups, values, onToggle, otherValues, onOtherChange }) { // groups: [{group, tools: []}] // Each group has its own "Autre" — keyed by group name in otherValues return (
{groups.map((g, gi) => { const otherKey = g.group; const otherChecked = values.includes(`Autre (${otherKey})`); return (
{g.group}
{g.tools.map(opt => { // For "Autre", we tag it with the group name to make it unique const value = opt === "Autre" ? `Autre (${otherKey})` : opt; const on = values.includes(value); return ( ); })}
{otherChecked && ( onOtherChange(otherKey, e.target.value)} /> )}
); })}
); } function SkipNote({ children }) { return (
{children}
); } /* ============================================================ BLOC 1 — Profil & entreprise ============================================================ */ function Bloc1({ a, set, toggle, data }) { return (
Vos coordonnées

Optionnel — ces informations resteront confidentielles.

Nombre de collaborateurs au sein de votre entreprise
set("headcount", e.target.value)} className="qf-headcount__input" /> collaborateurs
Quels sont vos secteurs d'activité ? toggle("sectors", v)} /> {a.sectors.includes("Autre") && ( set("sectorOther", e.target.value)} /> )}
Quel est votre OPCO ?
Pour vos salariés
toggle("opcoSalaries", v)} cols={1} /> {a.opcoSalaries.includes("Autre") && ( set("opcoSalariesOther", e.target.value)} /> )}
Pour le dirigeant
toggle("opcoDirigeant", v)} cols={1} /> {a.opcoDirigeant.includes("Autre") && ( set("opcoDirigeantOther", e.target.value)} /> )}
); } /* ============================================================ BLOC 2 — Niveau & usage actuel ============================================================ */ function Bloc2({ a, set, toggle, setNested, data, isNonUser, noPaidNeeded }) { return (
Comment évaluez-vous votre niveau personnel sur l'IA ?
set("skill", Number(e.target.value))} />
{Array.from({ length: 10 }, (_, i) => ( {i + 1} ))}
Niveau : {a.skill}/10
Votre entreprise utilise-t-elle des outils d'IA ? set("usage", v)} /> {isNonUser && ( Réponse « non » : nous passerons directement au Bloc 4 — Besoins en formation. Les questions Q7 à Q9 ne sont pas pertinentes pour vous. )}
{!isNonUser && ( <>
Quels outils d'IA utilisez-vous actuellement ? toggle("tools", v)} otherValues={a.toolsOther} onOtherChange={(k, v) => setNested("toolsOther", k, v)} />
Pour les outils que vous utilisez, avez-vous souscrit des licences payantes ? set("paidStatus", v)} />
Pour quels outils avez-vous souscrit, et combien de licences ?
{data.catalog.PAID_TOOLS.map(t => { const isOn = a.licences[t] != null && a.licences[t] !== ""; const isOther = t === "Autre"; return ( ); })}
Outil Souscrit ? Nb licences
{isOther ? (
Autre : set("licencesOther", e.target.value)} />
) : t}
setNested("licences", t, e.target.value)} />
Dans quels domaines utilisez-vous concrètement l'IA ? toggle("domains", v)} /> {a.domains.includes("Autre") && ( set("domainOther", e.target.value)} /> )}
Quels bénéfices concrets avez-vous observés ? toggle("benefits", v)} /> {a.benefits.includes("Estimation gain de temps par collaborateur par semaine") && (
Estimation gain de temps : set("timeSavedHours", e.target.value)} /> heures par collaborateur et par semaine
)}
)}
); } /* ============================================================ BLOC 3 — Gouvernance & freins ============================================================ */ function Bloc3({ a, set, toggle, data, isNonUser }) { return (
{isNonUser && ( Vous avez indiqué ne pas utiliser l'IA. Ces deux questions restent pertinentes. )}
Avez-vous mis en place des règles d'usage de l'IA dans votre entreprise ? set("policy", v)} />
Quels sont les principaux freins à une utilisation plus large de l'IA ? toggle("barriers", v)} /> {a.barriers.includes("Autre") && ( set("barrierOther", e.target.value)} /> )}
); } /* ============================================================ BLOC 4 — Besoins en formation ============================================================ */ function Bloc4({ a, set, toggle, setNested, data, skipFormation }) { const trainTotal = Object.values(a.trainingPlan || {}) .reduce((s, v) => s + (Number(v.headcount) || 0), 0); return (
Avez-vous déjà suivi une formation sur l'intelligence artificielle ? set("pastTrainingStatus", v)} />
{a.pastTrainingStatus === "Oui" && (
Si oui, sur quel sujet avez-vous suivi une formation sur l'IA ? toggle("pastTrainingSubjects", v)} cols={1} />
)}
Seriez-vous intéressé(e) par une formation IA pour vous-même ou vos équipes ? set("wantsFormation", v)} /> {skipFormation && ( Pas d'intérêt formation pour l'instant — les questions Q16 à Q18 ne s'appliquent pas, on passe au Bloc 5. )}
{!skipFormation && ( <>
Quel plan de formation par service ?
{data.catalog.SERVICES.map(svc => { const plan = a.trainingPlan[svc] || { headcount: "", themes: [] }; const isActive = (Number(plan.headcount) > 0) || (plan.themes && plan.themes.length > 0); return (
{svc}
Modules suivis par ce service
{data.catalog.TRAINING_THEMES.map(t => { const on = (plan.themes || []).includes(t); return ( ); })}
); })}
TOTAL apprenants tous services confondus
{trainTotal}
Quel budget seriez-vous prêt(e) à allouer à une formation IA par personne ? ({ value: b.id, label: b.label }))} value={a.budget} onChange={v => set("budget", v)} />
Êtes-vous le bon interlocuteur ? set("rightContact", v)} /> {a.rightContact === "Non" && (
Si non, qui est le bon interlocuteur ?
)}
)}
); } /* ============================================================ BLOC 5 — Clôture ============================================================ */ function Bloc5({ a, set, data }) { const plan = a.trainingPlan || {}; const trainTotal = Object.values(plan).reduce((s, v) => s + (Number(v.headcount) || 0), 0); const activeServices = Object.entries(plan).filter(([, v]) => Number(v.headcount) > 0 || (v.themes||[]).length > 0).length; const allModules = new Set(); Object.values(plan).forEach(v => (v.themes||[]).forEach(t => allModules.add(t))); return (
Souhaitez-vous partager votre retour d'expérience lors d'un futur atelier FESPA France ? set("willingToShare", v)} />
Un commentaire libre ?
Récapitulatif avant envoi

Vos réponses seront analysées globalement et partagées de manière anonyme.

); } /* ============================================================ Thank you ============================================================ */ function AdherentThankYou({ onBackHome, answers }) { return (
Réponses enregistrées · merci !

Votre contribution alimentera la Commission IA.

Les résultats seront partagés anonymement avec l'ensemble des adhérents. Vous serez informé(e) des prochaines actions de la Commission IA de FESPA France.

RéférenceFESPA-2026-A{(answers?.email||"x").length.toString().padStart(3,"0")}
Envoyé le23 mai 2026 — 14:32
Visiter fespa-france.fr →
); } Object.assign(window, { AdherentWelcome, AdherentQuestionnaire, AdherentThankYou });