/* --- SCOPED CSS FOR WORDPRESS --- */
#riasec-wp-app {
--r-primary: #4f46e5;
--r-primary-dark: #3730a3;
--r-secondary: #10b981;
--r-surface: #ffffff;
--r-background: #f1f5f9;
--r-text-main: #1e293b;
--r-text-muted: #64748b;
--r-border: #e2e8f0;
--r-danger: #ef4444;
--r-radius: 12px;
--r-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1);
font-family: 'Inter', system-ui, sans-serif;
color: var(--r-text-main);
line-height: 1.5;
background-color: var(--r-background);
padding: 20px;
border-radius: 8px;
max-width: 1000px;
margin: 20px auto;
}
#riasec-wp-app * { box-sizing: border-box; }
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;600;800&display=swap');
/* --- UI ELEMENTS --- */
#riasec-wp-app h1 { font-size: 2rem; margin: 0 0 1rem 0; line-height: 1.2; color: var(--r-text-main); }
#riasec-wp-app h2 { font-size: 1.5rem; margin: 0 0 1rem 0; color: var(--r-primary-dark); }
#riasec-wp-app h3 { margin: 0 0 0.5rem 0; color: var(--r-text-main); }
#riasec-wp-app p { margin-bottom: 1em; }
#riasec-wp-app .r-card {
background: var(--r-surface);
border-radius: var(--r-radius);
border: 1px solid var(--r-border);
padding: 1.5rem;
box-shadow: var(--r-shadow);
margin-bottom: 1.5rem;
}
#riasec-wp-app .r-grid-2 { display: grid; grid-template-columns: 1fr; gap: 1.5rem; }
@media(min-width: 768px) { #riasec-wp-app .r-grid-2 { grid-template-columns: 1fr 1fr; } }
#riasec-wp-app .r-btn {
display: inline-flex; align-items: center; justify-content: center;
padding: 0.75rem 1.5rem; border-radius: 8px; font-weight: 600; cursor: pointer;
transition: all 0.2s; border: none; font-size: 0.95rem; gap: 8px;
text-decoration: none; line-height: 1; margin-bottom: 5px;
}
#riasec-wp-app .r-btn-primary { background: var(--r-primary); color: white !important; }
#riasec-wp-app .r-btn-secondary { background: var(--r-surface); border: 1px solid var(--r-border); color: var(--r-text-main) !important; }
/* Forms & Items */
#riasec-wp-app input[type="text"], #riasec-wp-app textarea {
width: 100%; padding: 10px; border: 1px solid var(--r-border); border-radius: 8px;
font-family: inherit; margin-bottom: 10px;
}
#riasec-wp-app .r-item-row {
display: flex; align-items: flex-start; gap: 12px;
background: #f8fafc; border: 1px solid var(--r-border);
padding: 10px; border-radius: 8px; margin-bottom: 6px;
}
#riasec-wp-app .r-item-row:has(input:checked) { background: #eff6ff; border-color: var(--r-primary); }
#riasec-wp-app .r-item-row input[type="checkbox"] { width: 18px; height: 18px; margin-top: 3px; flex-shrink: 0; }
#riasec-wp-app .r-item-row label { cursor: pointer; font-size: 0.95rem; line-height: 1.4; }
/* Aptitudes */
#riasec-wp-app .r-apt-scale { display: flex; gap: 8px; margin-left: auto; flex-shrink: 0; }
#riasec-wp-app .r-radio-btn {
display: flex; flex-direction: column; align-items: center; cursor: pointer;
background: white; border: 1px solid var(--r-border); padding: 4px 8px; border-radius: 6px;
}
#riasec-wp-app .r-radio-btn:has(input:checked) { background: var(--r-primary); color: white; border-color: var(--r-primary); }
/* Results */
#riasec-wp-app .r-radar-container { display: flex; justify-content: center; margin: 1rem 0; }
#riasec-wp-app .r-profile-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 1rem; margin-top: 2rem; }
#riasec-wp-app .r-letter-card {
background: white; border: 1px solid var(--r-border); border-radius: var(--r-radius);
padding: 1rem; border-left: 5px solid var(--r-primary);
}
#riasec-wp-app .r-job-tag {
background: #f1f5f9; font-size: 0.8rem; padding: 2px 6px; border-radius: 4px;
color: var(--r-text-muted); border: 1px solid var(--r-border); display: inline-block; margin: 2px;
}
/* Utils */
#riasec-wp-app .r-hidden { display: none !important; }
#riasec-wp-app .r-sticky-bar { position: sticky; top: 20px; z-index: 40; background: rgba(255,255,255,0.95); padding: 10px; margin-bottom: 1.5rem; border-radius: 8px; border: 1px solid var(--r-border); display: flex; align-items: center; gap: 15px; }
#riasec-wp-app .r-progress-track { flex: 1; height: 8px; background: #e2e8f0; border-radius: 99px; overflow: hidden; }
#riasec-wp-app .r-progress-fill { height: 100%; background: var(--r-secondary); width: 0%; transition: width 0.4s ease; }
/* --- MODE IMPRESSION OPTIMISÉ (2 PAGES MAX) --- */
/* Cette classe est ajoutée au BODY par le JS lors de l'impression */
body.riasec-printing > *:not(#riasec-wp-app) {
display: none !important;
}
body.riasec-printing #riasec-wp-app {
display: block !important;
position: relative !important;
top: 0 !important; left: 0 !important;
width: 100% !important; margin: 0 !important; padding: 0 !important;
background: white !important;
border: none !important;
max-width: none !important;
}
@media print {
@page { margin: 1cm; size: A4; }
/* Cache l'interface inutile */
.r-no-print, .r-actions, .r-sticky-bar, #r-intro-section { display: none !important; }
/* Header Impression */
#r-print-header { display: block !important; border-bottom: 2px solid var(--r-primary); padding-bottom: 10px; margin-bottom: 15px; }
/* Optimisation Espace */
#riasec-wp-app h2 { font-size: 1.4rem; margin-bottom: 5px; }
.r-card { border: 1px solid #ddd !important; box-shadow: none !important; padding: 10px !important; margin-bottom: 10px !important; break-inside: avoid; }
/* Radar plus petit */
.r-radar-container svg { max-height: 280px; width: auto; }
/* Profils en grille compacte sur 2 colonnes */
.r-profile-grid {
display: grid !important;
grid-template-columns: 1fr 1fr !important;
gap: 10px !important;
}
.r-letter-card {
font-size: 0.9rem; padding: 8px; margin: 0;
break-inside: avoid;
}
.r-job-tag { font-size: 0.75rem; padding: 1px 4px; }
/* Notes */
#cipNotes { border: none !important; resize: none; font-family: monospace; height: auto; min-height: 50px; }
}
#r-print-header { display: none; }
Le Labo des CIP
Pro v2.2
Diagnostic RIASEC
Bienvenue 👋
Outil d'identification des intérêts professionnels selon la typologie de Holland (RIASEC).
💡 Pour le Conseiller
Données locales (RGPD Friendly). Aucune donnée envoyée au serveur.
Configuration
Candidat (Optionnel)
Mélanger les questions
Sauvegarde auto
Lancer le diagnostic 🚀
Reprendre session ↺
⚠️ Répondez à toutes les questions obligatoires (Aptitudes).
← Retour
Suivant →
Code : ---
Profil Dominant
🖨️ Imprimer le Rapport
Nouveau Test
📝 Notes du Conseiller
Détail des profils
(function(){
const DATA = {
letters: ["R","I","A","S","E","C"],
labels: { R:"Réaliste", I:"Investigateur", A:"Artistique", S:"Social", E:"Entreprenant", C:"Conventionnel" },
icons: { R:"🛠️", I:"🔬", A:"🎨", S:"🤝", E:"🚀", C:"🗂️" },
descriptions: {
R: "Pragmatique, aime le concret, les outils, le terrain.",
I: "Curieux, analytique, aime comprendre et résoudre.",
A: "Créatif, intuitif, besoin d'expression et d'innovation.",
S: "Empathique, aime aider, soigner, enseigner.",
E: "Ambitieux, aime convaincre, diriger et les défis.",
C: "Méthodique, aime l'ordre, les chiffres et la précision."
},
activities: {
R: ["Planter, entretenir des arbres","Réparations électriques","Couture","Réparer autos","Bois/Menuiserie","Conduire camion","Déménagements","Plomberie","Soin animaux","Travail extérieur","Machinerie","Préparer banquets","Outils précision","Peinture bâtiment","Dessin mécanique"],
I: ["Lire revues scientifiques","Expériences animaux","Analyses labo","Cours sciences","Diagnostic médical","Cultures végétales","Énergie nouvelle","Conception ponts/barrages","Problèmes maths","Recherche scientifique","Rapport éco","Reboisement","Planifier soins","Archéologie","Programmation"],
A: ["Écrire romans","Dessin plans/décors","Théâtre","Orchestre","Artisanat","Innovation","Embellir env.","Coiffure/Mode","Photo art","Fleurs","BD","Peindre tableaux","Vitrines","Critique art","Langues"],
S: ["Bénévolat","Aide psychologique","Garderie","Enseignement","Coaching","Animation groupe","Hôte/Hôtesse","Kiosque info","Aide tél.","Sondages","Aide handicap","Soigner malade","Réhabilitation","Loisirs","Débat idées"],
E: ["Vendre","Commerce propre","Conférences","Achats pro","Marchander","Management","Défendre cause","Recrutement","Activités sociales","Finance","Nouveau produit","Protection env.","Gestion projet","Politique","Pub"],
C: ["Comptes dépenses","PV réunions","Tenir caisse","Inventaire","Traitement texte","Classement","Ordre bureau","Calculs rapports","Routine","Classement lettres","Téléphone","Vérif finance","Machines bureau","Tâches définies","Saisie données"]
},
professions: {
R: ["Mécanicien","Éleveur","Tech dentaire","Menuisier","Couturier","Aménagement faune","Horloger","Ébéniste","Plombier","Méca bâtiment","Chauffeur bus","Tech aéronefs","Réparateur TV","Ingénieur civil","Cuisinier"],
I: ["Ingénieur chim/phys","Tech labo","Chercheur","Tech radio","Biologiste","Tech info","Médecin/Vétérinaire","Transformation bois","Météorologue","Astronome","Dessin indus.","Économiste","Métallurgie","Botaniste","Chimiste"],
A: ["Musicien","Écrivain","Fleuriste","Journaliste","Décorateur","Compositeur","Mannequin","Photographe","Graphiste","Pub","Architecte","Interprète","Chanteur","Comédien","Prof dessin"],
S: ["Infirmier aux.","Aide sociale","Travailleur social","Barman","Instituteur","Anim loisirs","Tech garderie","Orthophoniste","Esthéticienne","Policier","Généraliste","RH","Bibliothécaire","Hygiène dentaire","Kiné"],
E: ["Marketing","Avocat","Steward/Hôtesse","Chef rayon","Vendeur","Directeur","Politicien","Dir. Ventes","Assureur","Gérant hôtel","Tourisme","Commerçant","Immobilier","Acheteur","Agent voyage"],
C: ["Comptable","Tech finance","Opérateur saisie","Secrétaire médical","Archiviste","Accueil","Bibliotechnicien","Fiscaliste","Caissier","Réception","Paie","Crédit","Employé bureau","Sténo","Greffier"]
},
aptitudes: {
R: ["Soulever poids","Outils précision","Conduire gros véhicule","Lire plans","Coordination œil-main","Mécanique base","Réflexes","Réparations","Élevage","Installer machines"],
I: ["Maths","Sciences","Concentration","Analyse","Synthèse","Rédaction claire","Comprendre directives","Apprendre vite","Problèmes abstraits","Travail labo"],
A: ["Formes 2D/3D","Langues","Arts plastiques","Arts scène","Inventer/Créer","Accepter critique","Autonomie","Exprimer idées","Tolérer insécurité","Nuances"],
S: ["Travail équipe","Organisation","Intuition","Animation","Relations","Empathie","Équilibre émotif","Écoute","Expliquer","Communiquer"],
E: ["Parler public","Vendre","Affaires","Diriger","Décider seul","Se faire valoir","Défendre cause","Proposer","Persuader","Énergie"],
C: ["Règles","Précision","Ordre","Français","Chiffres","Détails","Routine","Tenue dossiers","Exécuter","Administratif"]
},
personality: {
R: ["Conformiste","Discret","Matérialiste","Persistant","Pratique","Réservé","Soin biens","Stable","Naturel","Franc"],
I: ["Analytique","Critique","Curieux","Indépendant","Intellectuel","Inventif","Méthodique","Précis","Réservé","Informé"],
A: ["Compliqué","Désordonné","Original","Impulsif","Émotif","Idéaliste","Non-conformiste","Expressif","Confiant","Besoin liberté"],
S: ["Diplomate","Souple","Bienveillant","Coopératif","Sociable","Serviable","Responsable","Généreux","Perspicace","Délicat"],
E: ["Ambitieux","Optimiste","Populaire","Argumentateur","Autoritaire","Aventureux","Sûr de soi","Impulsif","Responsable","Initiative"],
C: ["Calme","Obéissant","Consciencieux","Compétent","Concret","Méthodique","Soigneux","Routinier","Timide","Discipliné"]
}
};
window.riasecApp = {
state: { step: 0, answers: { act:{}, prof:{}, apt:{}, pers:{} }, selections: [], user: "", order: null },
init: function() {
const saved = localStorage.getItem("riasec_wp_v1");
if(saved) document.getElementById('btnRestore').style.display = 'inline-flex';
DATA.letters.forEach(L => {
this.state.answers.act[L] = 0; this.state.answers.prof[L] = 0;
this.state.answers.apt[L] = {}; this.state.answers.pers[L] = 0;
});
},
start: function() {
this.state.user = document.getElementById('userName').value;
const doShuffle = document.getElementById('shuffleItems').checked;
this.state.order = {
act: this.genOrder(DATA.activities, doShuffle),
prof: this.genOrder(DATA.professions, doShuffle),
pers: this.genOrder(DATA.personality, doShuffle)
};
this.state.step = 1;
this.render();
},
restore: function() {
const saved = JSON.parse(localStorage.getItem("riasec_wp_v1"));
if(saved) { this.state = saved; document.getElementById('userName').value = this.state.user;
if(this.state.step === 5) this.showRes(); else this.render(); }
},
save: function() {
if(document.getElementById('consentSave').checked) localStorage.setItem("riasec_wp_v1", JSON.stringify(this.state));
},
reset: function(hard) {
if(hard && confirm("Tout effacer ?")) { localStorage.removeItem("riasec_wp_v1"); location.reload(); }
},
genOrder: function(src, shuf) {
let items = []; DATA.letters.forEach(L => src[L].forEach((txt, i) => items.push({L,txt,i})));
if(shuf) for(let i=items.length-1; i>0; i--) { const j=Math.floor(Math.random()*(i+1)); [items[i],items[j]]=[items[j],items[i]]; }
return items;
},
render: function() {
const UI = document.getElementById('r-quiz-ui'), Intro = document.getElementById('r-intro-section'), Res = document.getElementById('r-results');
Intro.classList.add('r-hidden'); Res.classList.add('r-hidden'); UI.classList.remove('r-hidden');
document.getElementById('stepError').classList.add('r-hidden');
const cont = document.getElementById('r-quiz-content'); cont.innerHTML = "";
const s = this.state.step;
let title="", desc="", pct="0%";
if(s===1) { title="Activités"; desc="Ce que vous aimez faire (peu importe la compétence)."; pct="25%";
this.state.order.act.forEach(item => cont.appendChild(this.mkCheck(`act_${item.L}_${item.i}`, item.txt, item.L, 'act')));
} else if(s===2) { title="Professions"; desc="Les métiers qui vous attirent."; pct="50%";
this.state.order.prof.forEach(item => cont.appendChild(this.mkCheck(`prof_${item.L}_${item.i}`, item.txt, item.L, 'prof')));
} else if(s===3) { title="Aptitudes"; desc="Notez vos capacités (1=Faible, 3=Fort). Obligatoire."; pct="75%";
DATA.letters.forEach(L => {
const card = document.createElement('div'); card.className="r-card";
card.innerHTML=`
${L} - ${DATA.labels[L]} `;
DATA.aptitudes[L].forEach((txt,i) => {
const v = (this.state.answers.apt[L] && this.state.answers.apt[L][i]) || 0;
const row = document.createElement('div'); row.className="r-item-row"; row.style.alignItems="center";
row.innerHTML=`
${txt} ${[1,2,3].map(n=>`
${n}
`).join('')}
`;
card.appendChild(row);
});
cont.appendChild(card);
});
} else if(s===4) { title="Personnalité"; desc="Ce qui vous décrit le mieux."; pct="95%";
this.state.order.pers.forEach(item => cont.appendChild(this.mkCheck(`pers_${item.L}_${item.i}`, item.txt, item.L, 'pers')));
document.getElementById('btnNext').textContent = "Voir Résultats ✨";
} else { document.getElementById('btnNext').textContent = "Suivant →"; }
const h = document.createElement('div'); h.style.marginBottom="1rem"; h.innerHTML=`
${title} ${desc}
`;
if(s!==3) cont.insertBefore(h, cont.firstChild); else cont.insertBefore(h, cont.querySelector('.r-card'));
document.getElementById('progressBar').style.width = pct;
document.getElementById('stepIndicator').textContent = `Étape ${s}/4`;
window.scrollTo({ top: document.getElementById('riasec-wp-app').offsetTop - 50, behavior: 'smooth' });
},
mkCheck: function(id, txt, L, cat) {
const d = document.createElement('div'); d.className="r-item-row";
const chk = this.state.selections.includes(id);
d.innerHTML=`
${txt} `;
return d;
},
check: function(el, L, cat) {
if(el.checked) { this.state.answers[cat][L]++; this.state.selections.push(el.id); }
else { this.state.answers[cat][L]--; this.state.selections = this.state.selections.filter(x=>x!==el.id); }
this.save();
},
rate: function(L, i, n) {
if(!this.state.answers.apt[L]) this.state.answers.apt[L]={};
this.state.answers.apt[L][i] = n; this.save();
},
next: function() {
if(this.state.step===3) {
let miss=false; DATA.letters.forEach(L => DATA.aptitudes[L].forEach((_,i)=>{ if(!this.state.answers.apt[L] || !this.state.answers.apt[L][i]) miss=true; }));
if(miss) { document.getElementById('stepError').classList.remove('r-hidden'); return; }
}
if(this.state.step1) { this.state.step--; this.render(); }
else { document.getElementById('r-intro-section').classList.remove('r-hidden'); document.getElementById('r-quiz-ui').classList.add('r-hidden'); }
},
showRes: function() {
this.state.step=5; this.save();
document.getElementById('r-quiz-ui').classList.add('r-hidden'); document.getElementById('r-results').classList.remove('r-hidden');
let sc = {R:0,I:0,A:0,S:0,E:0,C:0};
DATA.letters.forEach(L => {
sc[L] += (this.state.answers.act[L]||0) + (this.state.answers.prof[L]||0) + (this.state.answers.pers[L]||0);
if(this.state.answers.apt[L]) Object.values(this.state.answers.apt[L]).forEach(v=>sc[L]+=v);
});
const sorted = Object.entries(sc).sort((a,b)=>b[1]-a[1]);
const code = sorted.slice(0,3).map(x=>x[0]).join("");
document.getElementById('finalCode').textContent = code;
document.getElementById('printUser').textContent = this.state.user || "Anonyme";
document.getElementById('printDate').textContent = new Date().toLocaleDateString();
this.drawRadar(sc);
const grid = document.getElementById('r-profiles-detail'); grid.innerHTML="";
sorted.slice(0,3).forEach(([L, pts]) => {
const div = document.createElement('div'); div.className="r-letter-card";
div.innerHTML=`
${DATA.icons[L]}
${L} - ${DATA.labels[L]}
${pts} pts
${DATA.descriptions[L]}
${DATA.professions[L].slice(0,8).map(j=>`${j} `).join('')}
`;
grid.appendChild(div);
});
window.scrollTo({ top: document.getElementById('riasec-wp-app').offsetTop - 50, behavior: 'smooth' });
},
drawRadar: function(sc) {
const cx=200, cy=200, rad=150, max=60; let svg="";
for(let i=1; i<=5; i++) svg+=``;
let pts=[];
DATA.letters.forEach((L,i) => {
const rot = (i*(Math.PI*2)/6)-(Math.PI/2);
const x = cx+Math.cos(rot)*rad, y = cy+Math.sin(rot)*rad;
svg+=``;
const lx = cx+Math.cos(rot)*(rad+25), ly = cy+Math.sin(rot)*(rad+25);
svg+=`${L}`;
let v = sc[L]; if(v>max) v=max;
pts.push(`${cx+Math.cos(rot)*((v/max)*rad)},${cy+Math.sin(rot)*((v/max)*rad)}`);
});
svg+=``;
pts.forEach(p => { const[px,py]=p.split(','); svg+=``; });
document.getElementById('radarSvg').innerHTML = svg;
},
printReport: function() {
// TECHNIQUE AVANCÉE : Exfiltration du DOM pour impression propre
const appNode = document.getElementById('riasec-wp-app');
const originalParent = appNode.parentNode;
const nextSibling = appNode.nextSibling;
// 1. Déplacer l'app à la racine du body pour sortir du "piège" WordPress
document.body.appendChild(appNode);
document.body.classList.add('riasec-printing');
// 2. Imprimer
window.print();
// 3. Remettre tout en place immédiatement après
// Note : window.print() est bloquant sur la plupart des navigateurs,
// donc ceci s'exécute après la fermeture de la boîte de dialogue.
if(nextSibling) originalParent.insertBefore(appNode, nextSibling);
else originalParent.appendChild(appNode);
document.body.classList.remove('riasec-printing');
}
};
document.addEventListener('DOMContentLoaded', function() { riasecApp.init(); });
})();