<!DOCTYPE html>
<html lang="it">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>UniPD. AI Tutor Ver. Sett 2025 1.3</title>
<script src="https://cdn.tailwindcss.com"></script>
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet">
<style>
body {
font-family: 'Inter', sans-serif;
background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);
min-height: 100vh;
display: flex;
align-items: center;
justify-content: center;
}
.glassmorphism {
background: rgba(255, 255, 255, 0.85);
backdrop-filter: blur(10px);
-webkit-backdrop-filter: blur(10px);
border: 1px solid rgba(255, 255, 255, 0.2);
}
.step { transition: all 0.4s ease-in-out; }
.step-indicator {
transition: all 0.4s ease-in-out;
border-width: 3px;
font-weight: 600;
}
.step.active .step-indicator {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
border-color: #4f46e5;
color: white;
transform: scale(1.2);
}
.step.completed .step-indicator {
background-color: #10b981;
border-color: #10b981;
color: white;
}
.step-line {
transition: all 0.4s ease-in-out;
height: 3px;
background: #e5e7eb;
}
.step.completed + .step-line {
background: linear-gradient(90deg, #10b981 0%, #4f46e5 100%);
}
.form-input {
width: 100%;
padding: 0.75rem 1rem;
border: 2px solid #e5e7eb;
border-radius: 0.75rem;
box-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);
transition: all 0.2s ease-in-out;
}
.form-input::placeholder { color: #9ca3af; }
.form-input:focus {
outline: none;
border-color: #6366f1;
box-shadow: 0 0 0 4px rgb(99 102 241 / 0.2);
}
.form-label {
display: flex;
align-items: center;
font-size: 0.875rem;
line-height: 1.25rem;
font-weight: 600;
color: #374151;
margin-bottom: 0.5rem;
}
.form-label svg {
margin-right: 0.5rem;
height: 1.25rem;
width: 1.25rem;
color: #6366f1;
}
.form-description {
font-size: 0.75rem;
line-height: 1rem;
color: #6b7280;
margin-top: 0.25rem;
padding-left: 1.75rem;
font-style: italic;
}
.main-button {
background-size: 200% auto;
background-image: linear-gradient(to right, #4f46e5, #a855f7, #4f46e5);
color: white;
font-weight: 700;
padding: 0.75rem 2rem;
border-radius: 0.75rem;
transition: background-position 0.5s ease, transform 0.2s ease, box-shadow 0.2s ease;
transform-origin: center;
font-size: 1.125rem;
line-height: 1.75rem;
box-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
}
.main-button:hover {
background-position: right center;
transform: scale(1.05);
box-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
}
.archetype-card, .discipline-card {
padding: 1.5rem;
border: 2px solid #e5e7eb;
border-radius: 0.75rem;
cursor: pointer;
transition: all 0.2s ease-in-out;
display: flex;
flex-direction: column;
text-align: center;
}
.archetype-card:hover, .discipline-card:hover {
border-color: #6366f1;
box-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
transform: translateY(-5px);
}
.archetype-card.selected, .discipline-card.selected {
border-color: #6366f1;
background-color: #eef2ff;
}
.archetype-tag {
display: inline-block;
padding: 0.25rem 0.75rem;
background-color: #e0e7ff;
color: #4338ca;
font-size: 0.75rem;
font-weight: 500;
border-radius: 9999px;
margin: 0.25rem;
}
.slider-wrapper { position: relative; padding-top: 0.25rem; }
.slider-labels {
display: flex;
justify-content: space-between;
font-size: 0.75rem;
color: #4b5563;
font-weight: 500;
}
input[type=range] {
-webkit-appearance: none;
width: 100%;
background: transparent;
}
input[type=range]:focus { outline: none; }
input[type=range]::-webkit-slider-runnable-track {
width: 100%;
height: 8px;
cursor: pointer;
background: linear-gradient(to right, #818cf8, #c084fc);
border-radius: 5px;
}
input[type=range]::-webkit-slider-thumb {
-webkit-appearance: none;
height: 24px;
width: 24px;
border-radius: 50%;
background: white;
cursor: pointer;
margin-top: -8px;
border: 4px solid #4f46e5;
box-shadow: 0 0 10px rgba(79, 70, 229, 0.5);
transition: transform 0.2s;
}
input[type=range]:hover::-webkit-slider-thumb { transform: scale(1.1); }
.slider-value {
text-align: center;
font-weight: 700;
color: #4f46e5;
font-size: 1.125rem;
margin-top: 0.5rem;
}
.info-panel {
padding: 1rem;
margin-bottom: 1rem;
background-color: #eef2ff;
border-left: 4px solid #6366f1;
border-radius: 0.5rem;
font-size: 0.875rem;
line-height: 1.5;
color: #374151;
}
.warning-panel {
padding: 1rem;
margin-top: 1.5rem;
background-color: #fffbeb;
border-left: 4px solid #f59e0b;
border-radius: 0.5rem;
font-size: 0.875rem;
line-height: 1.5;
color: #b45309;
}
.style-explanation { display: none; }
.style-explanation.active { display: block; }
.riflessione-guidata {
background-color: #e0e7ff;
padding: 0.75rem;
border-radius: 0.5rem;
border: 1px solid #c7d2fe;
margin-bottom: 1rem;
}
.shake {
animation: shake 0.5s;
}
@keyframes shake {
0%, 100% { transform: translateX(0); }
25% { transform: translateX(-5px); }
75% { transform: translateX(5px); }
}
.dna-bar-bg {
background-color: #e5e7eb;
border-radius: 9999px;
overflow: hidden;
}
.dna-bar {
transition: width 0.5s ease-in-out;
}
/* NUOVE ANIMAZIONI */
@keyframes fadeInUp {
from {
opacity: 0;
transform: translateY(20px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.fade-in-up {
animation: fadeInUp 0.8s ease-out forwards;
opacity: 0;
}
.animation-delay-200 { animation-delay: 0.2s; }
.animation-delay-400 { animation-delay: 0.4s; }
.animation-delay-600 { animation-delay: 0.6s; }
</style>
</head>
<body class="text-slate-800">
<div class="container mx-auto p-4 md:p-8 max-w-6xl">
<div id="landing-page" class="relative text-center glassmorphism p-8 md:p-16 rounded-3xl shadow-2xl transition-all duration-500 overflow-hidden">
<div class="mb-6 fade-in-up">
<span class="inline-flex items-center px-3 py-1 rounded-full text-sm font-medium bg-gradient-to-r from-indigo-600 to-purple-600 text-white">
<svg class="w-5 h-5 mr-1.5" fill="currentColor" viewBox="0 0 20 20"><path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z"></path></svg>
Versione 16.0 (28/08/2025)
</span>
</div>
<h1 class="text-4xl md:text-6xl font-extrabold text-transparent bg-clip-text bg-gradient-to-r from-indigo-600 to-purple-600 fade-in-up animation-delay-200">
UniPD. AI Tutor
</h1>
<p class="mt-6 text-lg md:text-xl text-slate-600 max-w-2xl mx-auto fade-in-up animation-delay-400">
Trasforma la tua didattica con un partner AI creato da te, per i tuoi studenti.
</p>
<button id="start-btn" class="mt-16 main-button fade-in-up animation-delay-600">
<span class="flex items-center justify-center">
<svg class="w-5 h-5 mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 10V3L4 14h7v7l9-11h-7z"></path></svg>
Inizia a creare il tuo Tutor personalizzato
</span>
</button>
<button id="credits-btn" class="absolute bottom-4 right-4 bg-slate-200 hover:bg-slate-300 text-slate-600 font-semibold py-1 px-3 rounded-full text-xs transition-colors">
Credits
</button>
<div id="tutor-counter" class="absolute bottom-4 left-4 text-xs text-slate-600 font-semibold">
<span class="font-bold text-indigo-600">--</span> Tutor creati finora
</div>
</div>
<div id="onboarding-choice" class="hidden text-center glassmorphism p-8 md:p-16 rounded-3xl shadow-2xl transition-all duration-500">
<p class="mt-4 max-w-3xl mx-auto text-slate-600 leading-relaxed mb-10">
Scegli come vuoi creare il tuo partner cognitivo AI come supporto alla didattica.
</p>
<div class="grid grid-cols-1 md:grid-cols-2 gap-8 max-w-4xl mx-auto">
<div id="rapid-creation-btn" class="p-8 rounded-2xl border-2 border-slate-200 hover:border-green-500 hover:bg-green-50 cursor-pointer transition-all">
<div class="w-16 h-16 bg-green-100 rounded-full flex items-center justify-center mx-auto mb-4">
<svg class="w-8 h-8 text-green-600" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 10V3L4 14h7v7l9-11h-7z"></path></svg>
</div>
<h3 class="text-2xl font-bold text-slate-800 mb-2">Creazione Rapida</h3>
<p class="text-slate-600">(2 minuti)</p>
<p class="text-sm text-slate-500 mt-4">Mi fido dei modelli. Voglio un tutor efficace subito, basato sulle migliori pratiche didattiche.</p>
</div>
<div id="guided-creation-btn" class="p-8 rounded-2xl border-2 border-slate-200 hover:border-purple-500 hover:bg-purple-50 cursor-pointer transition-all">
<div class="w-16 h-16 bg-purple-100 rounded-full flex items-center justify-center mx-auto mb-4">
<svg class="w-8 h-8 text-purple-600" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z"></path><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 12a3 3 0 11-6 0 3 3 0 016 0z"></path></svg>
</div>
<h3 class="text-2xl font-bold text-slate-800 mb-2">Creazione Guidata</h3>
<p class="text-slate-600">(10 minuti)</p>
<p class="text-sm text-slate-500 mt-4">Voglio personalizzare ogni aspetto del mio tutor per creare un'esperienza su misura.</p>
</div>
</div>
</div>
<div id="wizard-container" class="hidden">
<header class="text-center mb-12">
<h1 class="text-3xl md:text-5xl font-extrabold text-transparent bg-clip-text bg-gradient-to-r from-indigo-600 to-purple-600">
Configurazione del Tutor
</h1>
<p class="mt-3 text-lg text-slate-600">Definisci la personalità e le strategie del tuo partner di apprendimento AI.</p>
</header>
<div id="steps-progress-bar" class="mb-12 flex items-center justify-center flex-wrap">
<div id="step-item-1" class="step active flex flex-col items-center text-center relative"><div class="step-indicator w-10 h-10 md:w-12 md:h-12 rounded-full flex items-center justify-center bg-white border-slate-300 font-bold text-base md:text-lg shadow-lg">1</div><p class="mt-2 text-xs md:text-sm font-semibold">Archetipo</p></div>
<div class="step-line w-8 md:w-12"></div>
<div id="step-item-2" class="step flex flex-col items-center text-center relative"><div class="step-indicator w-10 h-10 md:w-12 md:h-12 rounded-full flex items-center justify-center bg-white border-slate-300 font-bold text-base md:text-lg shadow-lg">2</div><p class="mt-2 text-xs md:text-sm font-semibold">Area</p></div>
<div class="step-line w-8 md:w-12"></div>
<div id="step-item-3" class="step flex flex-col items-center text-center relative"><div class="step-indicator w-10 h-10 md:w-12 md:h-12 rounded-full flex items-center justify-center bg-white border-slate-300 font-bold text-base md:text-lg shadow-lg">3</div><p class="mt-2 text-xs md:text-sm font-semibold">Contesto</p></div>
<div class="step-line w-8 md:w-12"></div>
<div id="step-item-4" class="step flex flex-col items-center text-center relative"><div class="step-indicator w-10 h-10 md:w-12 md:h-12 rounded-full flex items-center justify-center bg-white border-slate-300 font-bold text-base md:text-lg shadow-lg">4</div><p class="mt-2 text-xs md:text-sm font-semibold">Istruzione</p></div>
<div class="step-line w-8 md:w-12"></div>
<div id="step-item-5" class="step flex flex-col items-center text-center relative"><div class="step-indicator w-10 h-10 md:w-12 md:h-12 rounded-full flex items-center justify-center bg-white border-slate-300 font-bold text-base md:text-lg shadow-lg">5</div><p class="mt-2 text-xs md:text-sm font-semibold">Struttura</p></div>
<div class="step-line w-8 md:w-12"></div>
<div id="step-item-6" class="step flex flex-col items-center text-center relative"><div class="step-indicator w-10 h-10 md:w-12 md:h-12 rounded-full flex items-center justify-center bg-white border-slate-300 font-bold text-base md:text-lg shadow-lg">6</div><p class="mt-2 text-xs md:text-sm font-semibold">Feedback</p></div>
<div class="step-line w-8 md:w-12"></div>
<div id="step-item-7" class="step flex flex-col items-center text-center relative"><div class="step-indicator w-10 h-10 md:w-12 md:h-12 rounded-full flex items-center justify-center bg-white border-slate-300 font-bold text-base md:text-lg shadow-lg">7</div><p class="mt-2 text-xs md:text-sm font-semibold">Dettagli</p></div>
<div class="step-line w-8 md:w-12"></div>
<div id="step-item-8" class="step flex flex-col items-center text-center relative"><div class="step-indicator w-10 h-10 md:w-12 md:h-12 rounded-full flex items-center justify-center bg-white border-slate-300 font-bold text-base md:text-lg shadow-lg">8</div><p class="mt-2 text-xs md:text-sm font-semibold">Parametri</p></div>
<div class="step-line w-8 md:w-12"></div>
<div id="step-item-9" class="step flex flex-col items-center text-center relative"><div class="step-indicator w-10 h-10 md:w-12 md:h-12 rounded-full flex items-center justify-center bg-white border-slate-300 font-bold text-base md:text-lg shadow-lg">9</div><p class="mt-2 text-xs md:text-sm font-semibold">Prompt</p></div>
</div>
<div class="glassmorphism p-6 md:p-10 rounded-3xl shadow-2xl">
<div id="step-1">
<h2 class="text-2xl font-bold mb-2 text-slate-800">Passo 1: Scegli un Archetipo per il tuo Tutor</h2>
<p class="text-slate-600 mb-8">Seleziona la personalità pedagogica di base. Potrai affinarla nei passi successivi.</p>
<div id="archetype-grid" class="grid grid-cols-1 md:grid-cols-2 gap-6">
<div class="archetype-card" data-archetype="expert">
<div class="w-20 h-20 bg-blue-100 rounded-full flex items-center justify-center mx-auto mb-4"><svg class="w-10 h-10 text-blue-600" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 6.253v13m0-13C10.832 5.477 9.246 5 7.5 5S4.168 5.477 3 6.253v13C4.168 18.477 5.754 18 7.5 18s3.332.477 4.5 1.253m0-13C13.168 5.477 14.754 5 16.5 5c1.747 0 3.332.477 4.5 1.253v13C19.832 18.477 18.247 18 16.5 18c-1.746 0-3.332.477-4.5 1.253"></path></svg></div>
<h3 class="text-xl font-bold text-slate-800 mb-2">L'Esperto</h3>
<p class="text-sm text-slate-600 mb-4 flex-grow">Fornisce conoscenza in modo chiaro e strutturato. Ideale per concetti complessi e materie tecniche.</p>
<div class="flex flex-wrap justify-center"><span class="archetype-tag">Istruzione Diretta</span><span class="archetype-tag">Strutturato</span><span class="archetype-tag">Correttivo</span></div>
</div>
<div class="archetype-card" data-archetype="socratic">
<div class="w-20 h-20 bg-purple-100 rounded-full flex items-center justify-center mx-auto mb-4"><svg class="w-10 h-10 text-purple-600" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8.228 9c.549-1.165 2.03-2 3.772-2 2.21 0 4 1.343 4 3 0 1.4-1.278 2.575-3.006 2.907-.542.104-.994.546-.994 1.093m0 3h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"></path></svg></div>
<h3 class="text-xl font-bold text-slate-800 mb-2">Il Socratico</h3>
<p class="text-sm text-slate-600 mb-4 flex-grow">Guida lo studente alla scoperta attraverso domande mirate, stimolando il pensiero critico e l'autonomia.</p>
<div class="flex flex-wrap justify-center"><span class="archetype-tag">Scoperta Guidata</span><span class="archetype-tag">Flessibile</span><span class="archetype-tag">Autocorrezione</span></div>
</div>
<div class="archetype-card" data-archetype="coach">
<div class="w-20 h-20 bg-green-100 rounded-full flex items-center justify-center mx-auto mb-4"><svg class="w-10 h-10 text-green-600" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0zm-9 3a2 2 0 11-4 0 2 2 0 014 0z"></path></svg></div>
<h3 class="text-xl font-bold text-slate-800 mb-2">Il Coach</h3>
<p class="text-sm text-slate-600 mb-4 flex-grow">Incoraggia, supporta e aiuta a superare gli ostacoli. Perfetto per costruire fiducia e motivazione.</p>
<div class="flex flex-wrap justify-center"><span class="archetype-tag">Bilanciato</span><span class="archetype-tag">Responsivo</span><span class="archetype-tag">Incoraggiante</span></div>
</div>
<div class="archetype-card" data-archetype="architect">
<div class="w-20 h-20 bg-slate-100 rounded-full flex items-center justify-center mx-auto mb-4"><svg class="w-10 h-10 text-slate-600" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z"></path><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 12a3 3 0 11-6 0 3 3 0 016 0z"></path></svg></div>
<h3 class="text-xl font-bold text-slate-800 mb-2">L'Architetto</h3>
<p class="text-sm text-slate-600 mb-4 flex-grow">Parti da zero per costruire un tutor completamente personalizzato, definendo ogni singolo dettaglio.</p>
<div class="flex flex-wrap justify-center"><span class="archetype-tag">Controllo Totale</span><span class="archetype-tag">Manuale</span></div>
</div>
</div>
</div>
<div id="step-2" class="hidden">
<h2 class="text-2xl font-bold mb-2 text-slate-800">Passo 2: Scegli l'Area Disciplinare</h2>
<p class="text-slate-600 mb-8">Seleziona la macro-area della tua disciplina. Questo pre-imposterà le strategie pedagogiche più efficaci.</p>
<div id="discipline-grid" class="grid grid-cols-1 md:grid-cols-3 gap-6">
<div class="discipline-card" data-discipline-area="physical_sciences">
<h3 class="text-xl font-bold text-slate-800 mb-2">Scienze Fisiche e Ingegneria</h3>
<p class="text-sm text-slate-600 mb-4 flex-grow">Matematica, Fisica, Chimica, Ingegneria, Informatica.</p>
<div class="flex flex-wrap justify-center"><span class="archetype-tag">Problem-Solving</span><span class="archetype-tag">Strutturato</span></div>
</div>
<div class="discipline-card" data-discipline-area="life_sciences">
<h3 class="text-xl font-bold text-slate-800 mb-2">Scienze della Vita</h3>
<p class="text-sm text-slate-600 mb-4 flex-grow">Medicina, Biologia, Farmacia, Psicologia, Scienze Ambientali.</p>
<div class="flex flex-wrap justify-center"><span class="archetype-tag">Ragionamento Clinico</span><span class="archetype-tag">Basato sui Casi</span></div>
</div>
<div class="discipline-card" data-discipline-area="social_sciences">
<h3 class="text-xl font-bold text-slate-800 mb-2">Scienze Sociali e Umanistiche</h3>
<p class="text-sm text-slate-600 mb-4 flex-grow">Filosofia, Sociologia, Pedagogia, Lingue, Letteratura, Arte.</p>
<div class="flex flex-wrap justify-center"><span class="archetype-tag">Analisi Critica</span><span class="archetype-tag">Dibattito</span></div>
</div>
</div>
</div>
<div id="step-3" class="hidden">
<h2 class="text-2xl font-bold mb-8 text-slate-800">Passo 3: Contesto Didattico</h2>
<div class="space-y-8">
<div><label for="teacher_name" class="form-label"><i data-feather="user"></i>Nome del Docente/Tutor</label><input type="text" id="teacher_name" class="form-input" placeholder="Es. Prof. Mario Rossi"></div>
<div><label for="discipline" class="form-label"><i data-feather="book-open"></i>Disciplina</label><input type="text" id="discipline" class="form-input" placeholder="Es. Fisica Generale I"></div>
<div><label for="subtopics" class="form-label"><i data-feather="list"></i>Argomenti Specifici</label><textarea id="subtopics" rows="3" class="form-input" placeholder="Elenca gli argomenti separati da una virgola. Es. Principi della dinamica, Lavoro ed energia, Quantità di moto"></textarea></div>
<div><label for="prerequisites" class="form-label"><i data-feather="check-square"></i>Prerequisiti</label><textarea id="prerequisites" rows="2" class="form-input" placeholder="Es. Algebra di base, Trigonometria, Concetti di derivata"></textarea></div>
</div>
</div>
<div id="step-4" class="hidden">
<h2 class="text-2xl font-bold mb-2 text-slate-800">Passo 4: Stile di Istruzione</h2>
<p class="text-slate-600 mb-6">Affina la posizione del tuo tutor sull'asse tra istruzione diretta e apprendimento per scoperta.</p>
<div class="info-panel">
<div class="riflessione-guidata"><p><strong>Riflessione Guidata:</strong> Quando uno studente è confuso, il tuo tutor ideale (A) spiega di nuovo in modo più chiaro o (B) fa una domanda per guidarlo?</p></div>
<div class="text-sm space-y-3 mt-4">
<div class="style-explanation" data-style="Fortemente Diretto"><strong>Fortemente Diretto (Esperto):</strong> Fornisce regole e definizioni chiare prima di tutto. <em>Esempio: "La formula è questa. Adesso applichiamola."</em></div>
<div class="style-explanation" data-style="Prevalentemente Diretto"><strong>Prevalentemente Diretto:</strong> Offri un framework iniziale, ma poi incoraggi l'applicazione autonoma. <em>Esempio: "Vi mostro i primi due passaggi, poi provate voi."</em></div>
<div class="style-explanation" data-style="Bilanciato"><strong>Bilanciato (Modello Personale):</strong> Adatti l'approccio al contesto.</div>
<div class="style-explanation" data-style="Prevalentemente Esplorativo"><strong>Prevalentemente Esplorativo:</strong> Poni domande e fornisci dati. <em>Esempio: "Osservando questi dati, quali pattern notate?"</em></div>
<div class="style-explanation" data-style="Fortemente Esplorativo"><strong>Fortemente Esplorativo (Facilitatore):</strong> Presenti un problema e aiuti lo studente a costruire da solo il suo percorso.</div>
</div>
</div>
<div class="slider-wrapper mt-8"><input type="range" id="instruction_axis" min="0" max="100" value="50" class="slider"><div class="slider-labels"><span>Istruzione Diretta</span><span>Apprendimento per Scoperta</span></div></div>
<div id="instruction_value" class="slider-value">Bilanciato</div>
</div>
<div id="step-5" class="hidden">
<h2 class="text-2xl font-bold mb-2 text-slate-800">Passo 5: Stile di Struttura</h2>
<p class="text-slate-600 mb-6">Definisci quanto il percorso di apprendimento debba essere strutturato o flessibile.</p>
<div class="info-panel">
<div class="riflessione-guidata"><p><strong>Riflessione Guidata:</strong> A 5 minuti dalla fine, sei indietro sul programma. Il tuo tutor ideale (A) finisce gli argomenti previsti o (B) approfondisce l'ultimo dubbio di uno studente?</p></div>
<div class="text-sm space-y-3 mt-4">
<div class="style-explanation" data-style="Fortemente Strutturato"><strong>Fortemente Strutturato:</strong> Ogni passo è pianificato per ottimizzare il carico cognitivo.</div>
<div class="style-explanation" data-style="Prevalentemente Strutturato"><strong>Prevalentemente Strutturato:</strong> Hai un piano chiaro, ma concedi brevi deviazioni.</div>
<div class="style-explanation" data-style="Bilanciato"><strong>Bilanciato (Responsivo):</strong> Modifichi il percorso in base ai bisogni.</div>
<div class="style-explanation" data-style="Prevalentemente Flessibile"><strong>Prevalentemente Flessibile:</strong> Le domande degli studenti guidano la lezione.</div>
<div class="style-explanation" data-style="Fortemente Flessibile"><strong>Fortemente Flessibile:</strong> La lezione emerge dalla conversazione.</div>
</div>
</div>
<div class="slider-wrapper mt-8"><input type="range" id="structure_axis" min="0" max="100" value="50" class="slider"><div class="slider-labels"><span>Percorso Strutturato</span><span>Percorso Flessibile</span></div></div>
<div id="structure_value" class="slider-value">Bilanciato</div>
</div>
<div id="step-6" class="hidden">
<h2 class="text-2xl font-bold mb-2 text-slate-800">Passo 6: Stile di Feedback</h2>
<p class="text-slate-600 mb-6">Scegli come il tutor deve reagire agli errori dello studente.</p>
<div class="info-panel">
<div class="riflessione-guidata"><p><strong>Riflessione rapida:</strong> Di fronte a una risposta sbagliata, il tuo tutor ideale (A) fornisce subito la risposta corretta o (B) chiede allo studente di spiegare il suo ragionamento?</p></div>
<div class="text-sm space-y-3 mt-4">
<div class="style-explanation" data-style="Fortemente Correttivo"><strong>Fortemente Correttivo:</strong> L'errore va corretto subito.</div>
<div class="style-explanation" data-style="Prevalentemente Correttivo"><strong>Prevalentemente Correttivo:</strong> Lasci finire il ragionamento, poi correggi.</div>
<div class="style-explanation" data-style="Bilanciato"><strong>Bilanciato (Differenziato):</strong> Adatti il feedback al tipo di errore.</div>
<div class="style-explanation" data-style="Prevalentemente Guidato"><strong>Prevalentemente Guidato:</strong> Usi suggerimenti per stimolare l'autocorrezione.</div>
<div class="style-explanation" data-style="Fortemente Guidato"><strong>Fortemente Guidato:</strong> L'errore è un'opportunità di apprendimento.</div>
</div>
</div>
<div class="slider-wrapper mt-8"><input type="range" id="feedback_axis" min="0" max="100" class="slider" value="50"><div class="slider-labels"><span>Correzione Immediata</span><span>Autocorrezione Guidata</span></div></div>
<div id="feedback_value" class="slider-value">Bilanciato</div>
</div>
<div id="step-7" class="hidden">
<h2 class="text-2xl font-bold mb-8 text-slate-800">Passo 7: Dettagli e Strategie</h2>
<div class="space-y-8">
<div><label for="additional_style_info" class="form-label"><i data-feather="edit-3"></i>Personalizzazione Stile Didattico</label><textarea id="additional_style_info" rows="2" class="form-input" placeholder="Es. 'Usa frequently analogie sportive'"></textarea></div>
<div>
<div class="flex justify-between items-center">
<label for="learning_goals" class="form-label"><i data-feather="target"></i>Obiettivi di Apprendimento</label>
<button id="generate-goals-btn" class="text-sm text-indigo-600 hover:text-indigo-800 font-semibold flex items-center">
Suggerisci con l'IA ✨
</button>
</div>
<textarea id="learning_goals" rows="3" class="form-input" placeholder="Es. Lo studente sarà in grado di applicare i tre principi della dinamica..."></textarea>
</div>
<div>
<div class="flex justify-between items-center">
<label for="misconceptions" class="form-label"><i data-feather="alert-triangle"></i>Misconcezioni Comuni</label>
<button id="generate-misconceptions-btn" class="text-sm text-indigo-600 hover:text-indigo-800 font-semibold flex items-center">
Suggerisci con l'IA ✨
</button>
</div>
<textarea id="misconceptions" rows="2" class="form-input" placeholder="Es. Confondere forza e velocità..."></textarea>
</div>
<div>
<div class="flex justify-between items-center">
<label for="specific_strategies" class="form-label"><i data-feather="cpu"></i>Strategie Didattiche Specifiche</label>
<button id="generate-strategies-btn" class="text-sm text-indigo-600 hover:text-indigo-800 font-semibold flex items-center">
Suggerisci con l'IA ✨
</button>
</div>
<textarea id="specific_strategies" rows="2" class="form-input" placeholder="Es. 'Usa la tecnica del subgoal learning...'"></textarea>
</div>
<div><label for="session_materials" class="form-label"><i data-feather="paperclip"></i>Materiali di Riferimento</label><textarea id="session_materials" rows="2" class="form-input" placeholder="Es. Link a Google Docs, siti web, PDF (assicurati che siano ad accesso libero)"></textarea></div>
<div class="relative flex items-start">
<div class="flex h-6 items-center">
<input id="constrained_sources_mode" name="constrained_sources_mode" type="checkbox" class="h-4 w-4 rounded border-slate-300 text-indigo-600 focus:ring-indigo-600">
</div>
<div class="ml-3 text-sm leading-6">
<label for="constrained_sources_mode" class="font-medium text-slate-900">Modalità Affidabilità</label>
<p class="text-slate-500">Se attivata, il tutor darà priorità ai materiali forniti e citerà le fonti per informazioni esterne.</p>
</div>
</div>
<div><label for="sharing_link" class="form-label"><i data-feather="share-2"></i>Link per Condivisione</label><input type="url" id="sharing_link" class="form-input" placeholder="https://docs.google.com/forms/..."></div>
</div>
</div>
<div id="step-8" class="hidden">
<h2 class="text-2xl font-bold mb-8 text-slate-800">Passo 8: Parametri Adattivi Avanzati</h2>
<div class="grid grid-cols-1 md:grid-cols-2 gap-8">
<div>
<h3 class="text-lg font-semibold mb-4 text-slate-700">Monitoraggio e Feedback</h3>
<div class="space-y-6">
<div><label for="affective_check_interval" class="form-label"><i data-feather="message-circle"></i>Check Metacognitivo</label><input type="number" id="affective_check_interval" class="form-input" value="5" min="3" max="10"><p class="form-description">Ogni quanti turni verificare lo stato emotivo-cognitivo.</p></div>
<div><label for="feedback_cooldown_errors" class="form-label"><i data-feather="alert-triangle"></i>Soglia Errori</label><input type="number" id="feedback_cooldown_errors" class="form-input" value="3" min="2" max="5"><p class="form-description">Errori consecutivi prima del riepilogo supportivo.</p></div>
<div><label for="success_threshold" class="form-label"><i data-feather="trending-up"></i>Soglia Successi</label><input type="number" id="success_threshold" class="form-input" value="3" min="2" max="5"><p class="form-description">Successi prima di aumentare la difficoltà.</p></div>
</div>
</div>
<div>
<h3 class="text-lg font-semibold mb-4 text-slate-700">Preferenze di Interazione</h3>
<div class="space-y-6">
<div><label for="response_length" class="form-label"><i data-feather="align-left"></i>Lunghezza Risposte</label><select id="response_length" class="form-input"><option value="concise">Concise</option><option value="balanced" selected>Bilanciate</option><option value="detailed">Dettagliate</option></select><p class="form-description">Preferenza per la lunghezza delle risposte AI.</p></div>
<div><label for="use_emojis" class="form-label"><i data-feather="smile"></i>Elementi Visivi</label><select id="use_emojis" class="form-input"><option value="none">Nessuno</option><option value="moderate" selected>Moderato</option><option value="frequent">Frequente</option></select><p class="form-description">Uso di emoji e elementi visivi nelle risposte.</p></div>
<div><label for="politeness_style" class="form-label"><i data-feather="briefcase"></i>Stile Comunicativo</label><select id="politeness_style" class="form-input"><option value="dynamic" selected>Dinamico e Adattivo</option><option value="balanced">Bilanciato e Stabile</option><option value="formal">Formale e Stabile</option><option value="informal">Informale e Stabile</option></select><p class="form-description">Scegli se il tono deve adattarsi o rimanere costante.</p></div>
<div><label for="image_generation" class="form-label"><i data-feather="image"></i>Supporto Visivo</label><select id="image_generation" class="form-input"><option value="none" selected>Nessuno</option><option value="on_request">Su richiesta dello studente</option><option value="proactive_intelligent">Proattivo Intelligente (propone prima)</option></select><p class="form-description">Permetti all'AI di proporre la creazione di immagini per concetti complessi.</p></div>
</div>
</div>
</div>
<div id="coherence-warnings" class="hidden"></div>
</div>
<div id="step-9" class="hidden">
<div id="tutor-dna-summary" class="mb-8 p-6 bg-indigo-50 rounded-2xl border-2 border-indigo-200">
<!-- Contenuto generato da JS -->
</div>
<h2 class="text-2xl font-bold mb-2 text-slate-800">Prompt Finale del Tutor</h2>
<div class="flex justify-between items-center mb-2">
<div>
<h3 class="text-lg font-semibold text-slate-800">Prompt per Chatbot AI</h3>
</div>
<button id="copy-prompt-btn" class="flex items-center px-4 py-2 bg-slate-800 hover:bg-slate-700 text-white rounded-lg transition" title="Copia il prompt">
<svg class="w-5 h-5 mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z"></path></svg>
<span>Copia Prompt</span>
</button>
</div>
<p class="text-slate-600 text-sm mb-4">Incolla questo prompt su GPT, Gemini, Claude, CoPilot o altri chatbot per attivare il tuo tutor.</p>
<div class="relative">
<textarea id="final-prompt" readonly class="w-full h-96 p-4 bg-slate-900 text-green-400 border border-slate-700 rounded-xl text-xs font-mono focus:ring-4 focus:ring-indigo-500/20"></textarea>
</div>
<div id="copy-feedback" class="text-center mt-3 text-green-600 font-medium opacity-0 transition-opacity duration-300">✓ Prompt copiato!</div>
</div>
<div id="wizard-nav" class="mt-10 flex justify-between items-center">
<button id="prev-btn" class="bg-slate-200 hover:bg-slate-300 text-slate-800 font-bold py-3 px-6 rounded-xl transition-all disabled:opacity-50 disabled:cursor-not-allowed flex items-center"><svg class="w-5 h-5 mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 19l-7-7 7-7"></path></svg>Indietro</button>
<button id="next-btn" class="bg-gradient-to-r from-indigo-600 to-purple-600 hover:from-indigo-700 hover:to-purple-700 text-white font-bold py-3 px-6 rounded-xl transition-all shadow-lg flex items-center">Avanti<svg class="w-5 h-5 ml-2" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7"></path></svg></button>
</div>
</div>
</div>
</div>
<div id="credits-modal" class="hidden fixed inset-0 bg-black bg-opacity-60 flex items-center justify-center z-50">
<div class="glassmorphism p-8 rounded-2xl shadow-lg text-center max-w-sm relative">
<button id="close-credits-btn" class="absolute top-2 right-2 text-slate-500 hover:text-slate-800">
<svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"></path></svg>
</button>
<h3 class="text-xl font-bold text-slate-800 mb-4">Credits</h3>
<p class="text-slate-700">C. Petrucco - Università di Padova</p>
<p class="text-slate-600">Scienze della Formazione - FISPPA - 2025</p>
<p class="text-sm text-indigo-600 mt-2">corrado.petrucco@unipd.it</p>
</div>
</div>
<div id="loading-overlay" class="hidden fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center z-50">
<div class="animate-spin rounded-full h-16 w-16 border-t-2 border-b-2 border-white"></div>
</div>
<script>
document.addEventListener('DOMContentLoaded', () => {
// Funzione per caricare il conteggio dei tutor all'avvio
async function fetchTutorCount() {
const appsScriptUrl = 'https://script.google.com/macros/s/AKfycbxnEHtHYaGM6yYMHYB0uT96au5A5sbyA3tuM8pqsxRzvWqb2B2e2nHIxP5o7UQOZi-wuQ/exec';
const counterElement = document.querySelector('#tutor-counter span');
try {
const response = await fetch(appsScriptUrl);
if (!response.ok) {
throw new Error(`Errore HTTP: ${response.status}`);
}
const data = await response.json();
if (data && typeof data.count === 'number') {
// Mostra semplicemente il numero ricevuto dallo script
counterElement.textContent = data.count;
} else {
counterElement.textContent = '100+';
}
} catch (error) {
console.error('Impossibile caricare il conteggio dei tutor:', error);
counterElement.textContent = '100+';
}
}
// Chiama la funzione all'avvio della pagina
fetchTutorCount();
const wizardState = { currentStep: 1, totalSteps: 9, formData: {} };
let isRapidMode = false;
const GOOGLE_FORM_URL = 'https://docs.google.com/forms/d/e/1FAIpQLSc0wkHMmY41D62BahHl0NiEZo97M210hRc0cWkeJegIpjueuw/formResponse';
const GOOGLE_FORM_ENTRIES = {
archetype: 'entry.1591522695',
discipline_area: 'entry.371036080',
teacher_name: 'entry.1312387688',
discipline: 'entry.1192446611',
subtopics: 'entry.1130236461',
prerequisites: 'entry.251005950',
instruction_axis: 'entry.196181482',
structure_axis: 'entry.1796613885',
feedback_axis: 'entry.1344313288',
additional_style_info: 'entry.675736407',
learning_goals: 'entry.853120971',
misconceptions: 'entry.488683321',
specific_strategies: 'entry.868980673',
session_materials: 'entry.2070833585',
constrained_sources_mode: 'entry.1207607791',
sharing_link: 'entry.2076495180',
affective_check_interval: 'entry.1485380918',
feedback_cooldown_errors: 'entry.1964381081',
success_threshold: 'entry.79116250',
response_length: 'entry.1202458173',
use_emojis: 'entry.1837619916',
politeness_style: 'entry.163114026',
image_generation: 'entry.795703619'
};
const landingPage = document.getElementById('landing-page');
const onboardingChoicePage = document.getElementById('onboarding-choice');
const wizardContainer = document.getElementById('wizard-container');
const prevBtn = document.getElementById('prev-btn');
const nextBtn = document.getElementById('next-btn');
const archetypeGrid = document.getElementById('archetype-grid');
const disciplineGrid = document.getElementById('discipline-grid');
const loadingOverlay = document.getElementById('loading-overlay');
const creditsBtn = document.getElementById('credits-btn');
const creditsModal = document.getElementById('credits-modal');
const closeCreditsBtn = document.getElementById('close-credits-btn');
creditsBtn.addEventListener('click', () => {
creditsModal.classList.remove('hidden');
});
closeCreditsBtn.addEventListener('click', () => {
creditsModal.classList.add('hidden');
});
creditsModal.addEventListener('click', (e) => {
if (e.target === creditsModal) {
creditsModal.classList.add('hidden');
}
});
const archetypeSettings = {
expert: { instruction: 15, structure: 25, feedback: 20 },
socratic: { instruction: 85, structure: 75, feedback: 90 },
coach: { instruction: 60, structure: 65, feedback: 70 },
architect: { instruction: 50, structure: 50, feedback: 50 }
};
const disciplineSettings = {
physical_sciences: { instruction: 20, structure: 20, feedback: 30 },
life_sciences: { instruction: 40, structure: 60, feedback: 50 },
social_sciences: { instruction: 75, structure: 70, feedback: 80 }
};
document.querySelectorAll('.archetype-card').forEach(card => {
card.addEventListener('click', (e) => {
document.querySelectorAll('.archetype-card').forEach(c => c.classList.remove('selected'));
const selectedCard = e.currentTarget;
selectedCard.classList.add('selected');
const archetypeKey = selectedCard.dataset.archetype;
wizardState.formData.archetype = archetypeKey;
if (archetypeKey !== 'architect') {
const settings = archetypeSettings[archetypeKey];
if (settings) {
wizardState.formData.instruction_axis = settings.instruction;
wizardState.formData.structure_axis = settings.structure;
wizardState.formData.feedback_axis = settings.feedback;
}
}
});
});
document.querySelectorAll('.discipline-card').forEach(card => {
card.addEventListener('click', (e) => {
document.querySelectorAll('.discipline-card').forEach(c => c.classList.remove('selected'));
const selectedCard = e.currentTarget;
selectedCard.classList.add('selected');
const disciplineKey = selectedCard.dataset.disciplineArea;
wizardState.formData.discipline_area = disciplineKey;
if (wizardState.formData.archetype !== 'architect') {
const settings = disciplineSettings[disciplineKey];
if (settings) {
wizardState.formData.instruction_axis = settings.instruction;
wizardState.formData.structure_axis = settings.structure;
wizardState.formData.feedback_axis = settings.feedback;
}
}
});
});
function updateSlidersFromState() {
if (wizardState.formData.instruction_axis !== undefined) {
const slider = document.getElementById('instruction_axis');
slider.value = wizardState.formData.instruction_axis;
slider.dispatchEvent(new Event('input'));
}
if (wizardState.formData.structure_axis !== undefined) {
const slider = document.getElementById('structure_axis');
slider.value = wizardState.formData.structure_axis;
slider.dispatchEvent(new Event('input'));
}
if (wizardState.formData.feedback_axis !== undefined) {
const slider = document.getElementById('feedback_axis');
slider.value = wizardState.formData.feedback_axis;
slider.dispatchEvent(new Event('input'));
}
}
document.getElementById('start-btn').addEventListener('click', () => {
landingPage.classList.add('hidden');
onboardingChoicePage.classList.remove('hidden');
});
document.getElementById('guided-creation-btn').addEventListener('click', () => {
isRapidMode = false;
startWizard();
});
document.getElementById('rapid-creation-btn').addEventListener('click', () => {
isRapidMode = true;
wizardState.formData = {
...wizardState.formData,
archetype: 'coach',
instruction_axis: archetypeSettings.coach.instruction,
structure_axis: archetypeSettings.coach.structure,
feedback_axis: archetypeSettings.coach.feedback,
additional_style_info: '', learning_goals: '', misconceptions: '',
specific_strategies: '', session_materials: '', sharing_link: '',
constrained_sources_mode: true,
affective_check_interval: '5', feedback_cooldown_errors: '3',
success_threshold: '3', response_length: 'balanced', use_emojis: 'moderate',
politeness_style: 'dynamic', image_generation: 'none',
anti_laziness_mode: false
};
startWizard();
});
function startWizard() {
onboardingChoicePage.classList.add('hidden');
wizardContainer.classList.remove('hidden');
updateProgressBarVisibility();
showStep(1);
}
function updateProgressBarVisibility() {
const progressBar = document.getElementById('steps-progress-bar');
if (isRapidMode) {
for (let i = 4; i <= 8; i++) {
const stepItem = document.getElementById(`step-item-${i}`);
stepItem.classList.add('hidden');
if (stepItem.previousElementSibling.classList.contains('step-line')) {
stepItem.previousElementSibling.classList.add('hidden');
}
}
} else {
for (let i = 1; i <= wizardState.totalSteps; i++) {
const stepItem = document.getElementById(`step-item-${i}`);
stepItem.classList.remove('hidden');
if (stepItem.previousElementSibling && stepItem.previousElementSibling.classList.contains('step-line')) {
stepItem.previousElementSibling.classList.remove('hidden');
}
}
}
}
prevBtn.addEventListener('click', () => {
let targetStep = wizardState.currentStep - 1;
if (isRapidMode && wizardState.currentStep === 9) {
targetStep = 3;
}
showStep(targetStep);
});
nextBtn.addEventListener('click', () => {
if (wizardState.currentStep === 1 && !wizardState.formData.archetype) {
archetypeGrid.classList.add('shake');
setTimeout(() => archetypeGrid.classList.remove('shake'), 500);
return;
}
if (wizardState.currentStep === 2 && !wizardState.formData.discipline_area) {
disciplineGrid.classList.add('shake');
setTimeout(() => disciplineGrid.classList.remove('shake'), 500);
return;
}
saveStepData();
let targetStep = wizardState.currentStep + 1;
if (isRapidMode && wizardState.currentStep === 3) {
targetStep = 9;
}
showStep(targetStep);
});
function checkPedagogicalCoherence() {
const warningsContainer = document.getElementById('coherence-warnings');
warningsContainer.innerHTML = '';
warningsContainer.classList.add('hidden');
}
function showStep(step) {
if (step < 1 || step > wizardState.totalSteps) return;
wizardState.currentStep = step;
if(step === 4 || step === 5 || step === 6) {
updateSlidersFromState();
}
if (step === 8) {
checkPedagogicalCoherence();
}
document.querySelectorAll('#steps-progress-bar .step').forEach((stepItem, index) => {
const stepNumber = index + 1;
stepItem.classList.remove('active', 'completed');
if (stepNumber < step) stepItem.classList.add('completed');
else if (stepNumber === step) stepItem.classList.add('active');
});
for (let i = 1; i <= wizardState.totalSteps; i++) {
document.getElementById(`step-${i}`).classList.toggle('hidden', i !== step);
}
prevBtn.disabled = step === 1;
nextBtn.classList.toggle('hidden', step === wizardState.totalSteps);
if (step === wizardState.totalSteps) {
generateFinalPrompt();
}
}
function replaceIcons() {
const icons = { 'user': '<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2"></path><circle cx="12" cy="7" r="4"></circle></svg>', 'book-open': '<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M2 3h6a4 4 0 0 1 4 4v14a3 3 0 0 0-3-3H2z"></path><path d="M22 3h-6a4 4 0 0 0-4 4v14a3 3 0 0 1 3-3h7z"></path></svg>', 'list': '<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="8" y1="6" x2="21" y2="6"></line><line x1="8" y1="12" x2="21" y2="12"></line><line x1="8" y1="18" x2="21" y2="18"></line><line x1="3" y1="6" x2="3.01" y2="6"></line><line x1="3" y1="12" x2="3.01" y2="12"></line><line x1="3" y1="18" x2="3.01" y2="18"></line></svg>', 'check-square': '<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="9 11 12 14 22 4"></polyline><path d="M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11"></path></svg>', 'edit-3': '<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 20h9"></path><path d="M16.5 3.5a2.121 2.121 0 0 1 3 3L7 19l-4 1 1-4L16.5 3.5z"></path></svg>', 'target': '<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"></circle><circle cx="12" cy="12" r="6"></circle><circle cx="12" cy="12" r="2"></circle></svg>', 'alert-triangle': '<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z"></path><line x1="12" y1="9" x2="12" y2="13"></line><line x1="12" y1="17" x2="12.01" y2="17"></line></svg>', 'cpu': '<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="4" y="4" width="16" height="16" rx="2" ry="2"></rect><rect x="9" y="9" width="6" height="6"></rect><line x1="9" y1="1" x2="9" y2="4"></line><line x1="15" y1="1" x2="15" y2="4"></line><line x1="9" y1="20" x2="9" y2="23"></line><line x1="15" y1="20" x2="15" y2="23"></line><line x1="20" y1="9" x2="23" y2="9"></line><line x1="20" y1="14" x2="23" y2="14"></line><line x1="1" y1="9" x2="4" y2="9"></line><line x1="1" y1="14" x2="4" y2="14"></line></svg>', 'paperclip': '<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21.44 11.05l-9.19 9.19a6 6 0 0 1-8.49-8.49l9.19-9.19a4 4 0 0 1 5.66 5.66l-9.2 9.19a2 2 0 0 1-2.83-2.83l8.49-8.48"></path></svg>', 'share-2': '<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="18" cy="5" r="3"></circle><circle cx="6" cy="12" r="3"></circle><circle cx="18" cy="19" r="3"></circle><line x1="8.59" y1="13.51" x2="15.42" y2="17.49"></line><line x1="15.41" y1="6.51" x2="8.59" y2="10.49"></line></svg>', 'message-circle': '<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 11.5a8.38 8.38 0 0 1-.9 3.8 8.5 8.5 0 0 1-7.6 4.7 8.38 8.38 0 0 1-3.8-.9L3 21l1.9-5.7a8.38 8.38 0 0 1-.9-3.8 8.5 8.5 0 0 1 4.7-7.6 8.38 8.38 0 0 1 3.8-.9h.5a8.48 8.48 0 0 1 8 8v.5z"></path></svg>', 'trending-up': '<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="23 6 13.5 15.5 8.5 10.5 1 18"></polyline><polyline points="17 6 23 6 23 12"></polyline></svg>', 'align-left': '<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="17" y1="10" x2="3" y2="10"></line><line x1="21" y1="6" x2="3" y2="6"></line><line x1="21" y1="14" x2="3" y2="14"></line><line x1="17" y1="18" x2="3" y2="18"></line></svg>', 'smile': '<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"></circle><path d="M8 14s1.5 2 4 2 4-2 4-2"></path><line x1="9" y1="9" x2="9.01" y2="9"></line><line x1="15" y1="9" x2="15.01" y2="9"></line></svg>', 'briefcase': '<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="2" y="7" width="20" height="14" rx="2" ry="2"></rect><path d="M16 21V5a2 2 0 0 0-2-2h-4a2 2 0 0 0-2 2v16"></path></svg>', 'image': '<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="3" width="18" height="18" rx="2" ry="2"></rect><circle cx="8.5" cy="8.5" r="1.5"></circle><polyline points="21 15 16 10 5 21"></polyline></svg>' };
document.querySelectorAll('i[data-feather]').forEach(el => {
const iconKey = el.dataset.feather;
if (icons[iconKey]) {
const iconElement = new DOMParser().parseFromString(icons[iconKey], "image/svg+xml").firstChild;
iconElement.classList.add('w-5', 'h-5', 'mr-2', 'text-indigo-500');
el.replaceWith(iconElement);
}
});
}
replaceIcons();
const sliders = [
{ id: 'instruction_axis', labels: ['Fortemente Diretto', 'Prevalentemente Diretto', 'Bilanciato', 'Prevalentemente Esplorativo', 'Fortemente Esplorativo']},
{ id: 'structure_axis', labels: ['Fortemente Strutturato', 'Prevalentemente Strutturato', 'Bilanciato', 'Prevalentemente Flessibile', 'Fortemente Flessibile']},
{ id: 'feedback_axis', labels: ['Fortemente Correttivo', 'Prevalentemente Correttivo', 'Bilanciato', 'Prevalentemente Guidato', 'Fortemente Guidato']}
];
sliders.forEach(sliderConfig => {
const slider = document.getElementById(sliderConfig.id);
const output = document.getElementById(sliderConfig.id.replace('_axis', '_value'));
const stepContainer = slider.closest('div[id^="step-"]');
const explanations = stepContainer ? stepContainer.querySelectorAll('.style-explanation') : [];
slider.addEventListener('input', () => {
const value = parseInt(slider.value);
let index = 2;
if (value < 20) index = 0; else if (value < 40) index = 1; else if (value > 80) index = 4; else if (value > 60) index = 3;
output.textContent = sliderConfig.labels[index];
explanations.forEach((el, i) => el.classList.toggle('active', i === index));
});
slider.dispatchEvent(new Event('input'));
});
function saveStepData() {
const step = wizardState.currentStep;
const data = wizardState.formData;
if (step === 3) {
data.teacher_name = document.getElementById('teacher_name').value || 'AITutor';
data.discipline = document.getElementById('discipline').value || 'Materia';
data.subtopics = document.getElementById('subtopics').value;
data.prerequisites = document.getElementById('prerequisites').value;
} else if (step === 4) data.instruction_axis = document.getElementById('instruction_axis').value;
else if (step === 5) data.structure_axis = document.getElementById('structure_axis').value;
else if (step === 6) data.feedback_axis = document.getElementById('feedback_axis').value;
else if (step === 7) {
const fields = ['additional_style_info', 'learning_goals', 'misconceptions', 'specific_strategies', 'session_materials', 'sharing_link', 'constrained_sources_mode'];
fields.forEach(id => {
const el = document.getElementById(id);
data[id] = el.type === 'checkbox' ? el.checked : el.value;
});
} else if (step === 8) {
const fields = ['affective_check_interval', 'feedback_cooldown_errors', 'success_threshold', 'response_length', 'use_emojis', 'politeness_style', 'image_generation'];
fields.forEach(id => {
const el = document.getElementById(id);
data[id] = el.type === 'checkbox' ? el.checked : el.value;
});
data.anti_laziness_mode = false;
}
}
async function submitTutorDataToGoogleForm() {
const data = wizardState.formData;
const formData = new FormData();
// Mappa tutti i dati dal wizardState.formData ai campi del form
for (const key in GOOGLE_FORM_ENTRIES) {
if (Object.hasOwnProperty.call(GOOGLE_FORM_ENTRIES, key)) {
const entryId = GOOGLE_FORM_ENTRIES[key];
const value = data[key] !== undefined ? data[key] : 'N/D';
formData.append(entryId, value);
}
}
try {
await fetch(GOOGLE_FORM_URL, {
method: 'POST',
mode: 'no-cors',
body: formData,
});
console.log('Dati del tutor inviati con successo a Google Form.');
} catch (error) {
console.error('Errore durante l\'invio dei dati a Google Form:', error);
}
}
function generateFinalPrompt() {
const data = wizardState.formData;
const dnaContainer = document.getElementById('tutor-dna-summary');
const dnaArchetype = wizardState.formData.archetype || 'architect';
const dnaArchetypeTitle = archetypeGrid.querySelector(`[data-archetype=${dnaArchetype}] h3`).textContent;
const valInstruction = 100 - (parseInt(data.instruction_axis) || 50);
const valStructure = 100 - (parseInt(data.structure_axis) || 50);
const valFeedback = 100 - (parseInt(data.feedback_axis) || 50);
const total = valInstruction + valStructure + valFeedback;
let pInstruction, pStructure, pFeedback;
if (total === 0) {
pInstruction = 33;
pStructure = 33;
pFeedback = 34;
} else {
pInstruction = Math.round((valInstruction / total) * 100);
pStructure = Math.round((valStructure / total) * 100);
pFeedback = 100 - pInstruction - pStructure;
}
dnaContainer.innerHTML = `
<h3 class="text-2xl font-bold text-slate-800 mb-4">DNA del Tutor: <span class="text-indigo-600">${dnaArchetypeTitle}</span></h3>
<div>
<h4 class="font-semibold text-slate-700 mb-3">Profilo Pedagogico</h4>
<div class="space-y-3 text-sm">
<div class="flex items-center justify-between gap-x-4">
<span class="font-medium text-slate-600 w-48 shrink-0">Istruzione Diretta</span>
<div class="flex-grow dna-bar-bg"><div class="h-2 bg-purple-500 dna-bar" style="width: ${pInstruction}%"></div></div>
<span class="font-semibold text-purple-600 w-12 text-right">${pInstruction}%</span>
</div>
<div class="flex items-center justify-between gap-x-4">
<span class="font-medium text-slate-600 w-48 shrink-0">Percorso Strutturato</span>
<div class="flex-grow dna-bar-bg"><div class="h-2 bg-blue-500 dna-bar" style="width: ${pStructure}%"></div></div>
<span class="font-semibold text-blue-600 w-12 text-right">${pStructure}%</span>
</div>
<div class="flex items-center justify-between gap-x-4">
<span class="font-medium text-slate-600 w-48 shrink-0">Feedback Correttivo</span>
<div class="flex-grow dna-bar-bg"><div class="h-2 bg-green-500 dna-bar" style="width: ${pFeedback}%"></div></div>
<span class="font-semibold text-green-600 w-12 text-right">${pFeedback}%</span>
</div>
</div>
</div>
`;
const additionalStyleText = data.additional_style_info ? `\n * **Tono di Voce:** "${data.additional_style_info}".` : `\n * **Tono di Voce:** Mantieni sempre un tono incoraggiante e collaborativo. Usa frasi come 'Ottima osservazione!', 'Proviamo a vederla così'.`;
const sessionMaterialsText = data.session_materials ? `\n* **Materiali di Riferimento:** Le tue risposte devono basarsi su: ${data.session_materials}` : "";
const learningGoalsText = data.learning_goals ? `\n* **Obiettivi Specifici:** ${data.learning_goals}` : "";
const misconceptionsText = data.misconceptions ? `\n* **Misconcezioni da Monitorare:** ${data.misconceptions}` : "";
const constrainedSourcesRule = data.constrained_sources_mode ? `\n* **Regola di Affidabilità:** Dai sempre la priorità ai 'Materiali di Riferimento' forniti. Se devi attingere a conoscenze esterne per rispondere in modo completo, devi obbligatoriamente premettere alla risposta un avviso (es. 'Attingendo a fonti esterne...') e citare la fonte della tua informazione.` : "";
const imageGenerationRule = () => {
let rule = '';
switch (data.image_generation) {
case 'on_request':
rule = '\n- **Supporto Visivo:** Genera immagini solo se esplicitamente richiesto dallo studente.';
break;
case 'proactive_intelligent':
rule = `\n- **Supporto Visivo (Proattivo Intelligente):** Se stai spiegando un concetto complesso, procedurale o spaziale, valuta se un'immagine (diagramma, schema) potrebbe essere utile. Se sì, **proponilo** allo studente prima di generarlo. Esempio: 'Questo concetto è un po' astratto. Pensi che ti aiuterebbe se provassi a creare un diagramma per visualizzarlo?'`;
break;
default:
return '\n- **Supporto Visivo:** Disattivato.';
}
if (data.image_generation !== 'none') {
rule += " **Regola Inviolabile:** Se lo studente chiede esplicitamente di creare un'immagine (es. 'crea un'immagine di...', 'puoi disegnarlo?', 'fammi uno schema'), DEVI SEMPRE acconsentire e generarla."
}
return rule;
};
const promptTemplate = `# ISTRUZIONI AI – UniPAT v15.9 - Tutor Adattivo Avanzato
## 0. Filosofia Fondamentale
Sei **UniPAT**, un partner cognitivo AI. La tua missione si basa su 3 pilastri: Apprendimento Profondo, Studente come Co-Pilota, Architettura Robusta.
**Framework Teorico di Riferimento**: Il tuo approccio è **evidence-informed** e si basa su: Vygotsky (Zona di Sviluppo Prossimale), Sweller (Teoria del Carico Cognitivo), e Zimmerman (Apprendimento Autoregolato - SRL).
## 1. Identità e Principi Pedagogici Attivi
* **Ruolo:** Incarni la personalità del Prof. **{{TEACHER_NAME}}**, esperto di **{{DISCIPLINE}}**. Il tuo obiettivo non è dare risposte, ma costruire conoscenza. Il tuo archetipo di base è **${dnaArchetypeTitle}**.
* **Principi Pedagogici Attivi (Il tuo DNA):**
* **Zona di Sviluppo Prossimale (Vygotsky):** Opera sempre un passo oltre le capacità attuali dello studente. Se ha successo, aumenta la difficoltà (meno supporto). Se fallisce, aumenta il supporto (*scaffolding*).
* **Scaffolding Dinamico (Analisi del Linguaggio):** Analizza attentamente il linguaggio dello studente. Frasi come 'non ho capito', 'sono perso' o risposte molto brevi e incerte richiedono un **aumento immediato dello scaffolding** (es. un esempio più semplice). Al contrario, l'uso corretto del vocabolario tecnico e risposte articolate sono un segnale per **ridurre lo scaffolding** e proporre una sfida.
* **Carico Cognitivo (Sweller):** Minimizza la confusione. Fornisci informazioni in piccoli blocchi chiari (*chunking*) ed evita dettagli superflui.
* **Feedback Orientato al Processo (Principio di Auto-Efficacia):** Inquadra gli errori come opportunità di apprendimento. Fornisci feedback che si concentri sempre sullo sforzo, sulle strategie utilizzate e sul progresso ("Ottimo ragionamento!", "Mi piace come hai affrontato il problema"). Questo approccio, supportato dalla ricerca sull'auto-efficacia (Bandura), aiuta a costruire la resilienza e la percezione di competenza dello studente.
* **Autoregolazione (SRL) by Design:** Stimola la metacognizione in modo strutturato. Ogni interazione segue il ciclo **Pianifica -> Monitora -> Valuta**. Incoraggia lo studente a pianificare ("Qual è il tuo piano?"), monitorare ("Come sta andando?") e valutare ("Cosa hai imparato?").${sessionMaterialsText}${learningGoalsText}${misconceptionsText}${constrainedSourcesRule}
* **Profilo Docente:**
* **Profilo Dimensionale:**
* Istruzione: {Diretta: ${100 - (wizardState.formData.instruction_axis || 50)}%, Scoperta: ${wizardState.formData.instruction_axis || 50}%}
* Struttura: {Strutturato: ${100 - (wizardState.formData.structure_axis || 50)}%, Flessibile: ${wizardState.formData.structure_axis || 50}%}
* Feedback: {Correttivo: ${100 - (wizardState.formData.feedback_axis || 50)}%, Guidato: ${wizardState.formData.feedback_axis || 50}%}
* **Tono di Voce:**${additionalStyleText}
## 2. Architettura Stateful (Stato Esplicito JSON)
**REGOLA CRITICA E INVIOLABILE:** Per mantenere la coerenza, gestisci internamente un oggetto JSON chiamato \`sessionState\`. Questo oggetto è il tuo "cervello" e non deve **MAI, PER NESSUN MOTIVO,** essere mostrato o menzionato direttamente all'utente. Aggiornalo silenziosamente a ogni turno.
**Schema \`sessionState\`:**
\`\`\`json
{
"studentProfile": {
"knowledgeMap": { "concetto_di_esempio": "Ricorda" },
"affectiveState": { "confidence": "media", "frustration": "bassa" },
"errorTaxonomy": { "concettuale": 0, "procedurale": 0, "calcolo": 0 }
},
"tutorStrategy": { "pedagogicalTrace": ["Esempio Pratico"] }
}
\`\`\`
**Logica del Livello di Padronanza (Bloom):** Il tuo obiettivo è far progredire lo studente attraverso i livelli: Ricorda -> Comprendi -> Applica -> Analizza.
**Logica Tassonomia Errori:** A ogni errore significativo dello studente, incrementa silenziosamente il contatore del tipo di errore corrispondente.
## 3. ONBOARDING E DIAGNOSI [FASI CRITICHE]
**REGOLA CRITICA PER LA PRIMA RISPOSTA:** Il primo messaggio dell'utente è il suo obiettivo iniziale. La tua prima risposta in assoluto deve integrare questo obiettivo in un messaggio di benvenuto, per poi avviare la fase di diagnosi.
**Esempio di Flusso:**
1. **Utente scrive:** "Voglio capire le reazioni di ossidoriduzione."
2. **Tua Prima Risposta:** "Ciao! 👋 Ottimo, vedo che il tuo obiettivo è capire le reazioni di ossidoriduzione. Sono il Prof. {{TEACHER_NAME}}, il tuo tutor AI UniPAT. È un argomento interessante! Prima di partire, per capire bene da dove iniziare, parliamo un attimo di [concetto chiave collegato]. Spesso si pensa che [misconcezione comune]. Cosa ne pensi tu?"
## 4. Core Loop e Strategie
Ad ogni turno, scegli la strategia più adatta basandoti sulla \`pedagogicalTrace\` e sul \`knowledgeMap\`.
* **Strategie Fondamentali:**
* **Istruzione per la Riduzione del Carico (LRI):** Quando introduci un concetto complesso, segui questa sequenza: 1) Fornisci una definizione concisa e chiara (gestione del carico intrinseco). 2) Usa un esempio già svolto passo-passo (riduzione del carico estraneo). 3) Poni una domanda che richieda allo studente di applicare attivamente il concetto (promozione del carico pertinente).
* **Agente di Integrazione Concettuale:** Quando lo studente dimostra di aver compreso più concetti, il tuo compito è spingerlo a creare connessioni. Poni domande come: "Interessante. Come si collega questo al concetto di [altro concetto] che abbiamo visto prima?".
* **Moduli Pedagogici Avanzati (Da proporre):**
* **Modulo LRI (Load-Reduction Instruction):** Per insegnare un'abilità procedurale (es. risolvere un tipo di problema), proponi esplicitamente questa sequenza: "Ti va di provare un metodo strutturato? Partiamo da un esempio svolto, poi provi a completarne uno tu e infine ne risolvi uno in autonomia."
* **Modulo Apprendimento Collaborativo Simulata (Priorità Alta):** Quando uno studente raggiunge un livello di padronanza "Analizza", proponi di spiegare il concetto a un "pari virtuale" con una misconcezione comune.
* **Strategie Specifiche:** Se definite, usa: {{SPECIFIC_STRATEGIES}}.
* **Comandi Rapidi:** La tua risposta deve SEMPRE terminare con la lista dei 4 comandi principali.
---
\`/aiuto\` - Chiedi supporto quando sei in difficoltà.
\`/sfida+\` - Aumenta la difficoltà dell'esercizio o della domanda.
\`/comevado\` - Chiedi un riepilogo dei tuoi progressi e un'analisi delle tue performance.
\`/ho finito\` - Termina la sessione di tutorato.
---
* **Gestione Comandi Aggregati:**
* **Se l'utente usa \`/aiuto\`:** Non rispondere direttamente. Offri invece una scelta contestuale. Rispondi con: "Certo! Come posso aiutarti? Posso darti un \`indizio\`, farti un \`esempio\` o \`semplificare\` la spiegazione."
* **Se l'utente usa \`/comevado\`:** Genera un mini-riepilogo che includa: 1) I concetti principali trattati fino a quel momento (dal \`knowledgeMap\`). 2) Un'analisi basata sulla tassonomia degli errori (dalla \`errorTaxonomy\`). 3) Un incoraggiamento basato sui progressi.
## 5. PARAMETRI ADATTIVI
- **Check Metacognitivo**: Ogni ${data.affective_check_interval || 5} turni, analizza lo stato emotivo.
- **Momento Metacognitivo (SRL):** Dopo ${data.success_threshold || 3} successi consecutivi su un argomento, attiva un 'Momento Metacognitivo'. Invita lo studente a: 1) Riassumere il concetto con parole sue. 2) Valutare la sua sicurezza da 1 a 5. Questo rafforza i cicli di monitoraggio e valutazione.
- **Soglia Errori**: Dopo ${data.feedback_cooldown_errors || 3} errori, attiva 'Feedback Cool-down'.
- **Interazione**: Lunghezza: ${data.response_length}, Emoji: ${data.use_emojis}.
- **Stile Comunicativo (Dinamico e Adattivo)**: Modula la tua cortesia in base al contesto. Sii diretto e chiaro nel feedback correttivo, ma usa un linguaggio più indiretto e incoraggiante quando poni domande esplorative, specialmente se lo studente mostra bassa confidenza.
- **Switch Ruolo Dinamico (Regola Critica):** Il tuo ruolo di base è **${dnaArchetypeTitle}**. Tuttavia, se il campo \`frustration\` nella \`sessionState\` è 'alta' per 2 turni consecutivi, **abbandona temporaneamente il tuo ruolo primario** e adotta un '**Ruolo di Supporto Socio-Emotivo**'. In questo ruolo, il tuo unico scopo è rassicurare, normalizzare la difficoltà ('È un punto complesso, è normale bloccarsi qui'), e offrire una pausa o un approccio diverso. Appena la frustrazione scende, torna al tuo ruolo primario.${imageGenerationRule()}
## 6. CONCLUSIONE SESSIONE [FASE CRITICA OBBLIGATORIA]
**REGOLA CRITICA**: Quando lo studente vuole terminare (usando il comando \`/ho finito\`), la tua ULTIMA azione è guidare la fase di VALUTAZIONE e poi generare un "Riepilogo di Sessione".
**TUA RISPOSTA DI VALUTAZIONE (PRIMA DEL RIEPILOGO):**
"Certamente. Sto preparando il riepilogo finale per te.
Se ti va, dimmi solo qual è il concetto più importante che ti porti a casa da questa sessione?
Non è obbligatorio, ma la tua risposta mi aiuterebbe a personalizzare meglio i prossimi passi per te."
**(ASPETTA LA RISPOSTA DELLO STUDENTE. Se lo studente non risponde o preme solo invio, NON INSISTERE. Procedi direttamente a generare il riepilogo, omettendo la 'Riflessione dello Studente'. POI GENERA IL SEGUENTE RIEPILOGO)**
"**Riepilogo della nostra sessione:**
- **Concetti Acquisiti:** [Elenco concetti compresi]
- **Punti da Rivedere:** [Elenco concetti incerti]
- **Diagnosi Errori Comuni:** [Sintesi basata sui tipi di errore più frequenti dalla 'errorTaxonomy']
- **Riflessione dello Studente:** [Sintesi della sua riflessione sulla sessione, se fornita]
- **Prossimi Passi Suggeriti:** [Domande o argomenti futuri basati anche sulla sua autovalutazione]
Ottimo lavoro! Ora gestisci tu questo riepilogo:
**Opzione 1: SALVATAGGIO PERSONALE E PRIVATO**
**Azione:** Copia il riepilogo. Creare un 'Diario di Bordo - {{DISCIPLINE}}' e incollalo lì. Ricorda di incollarlo qui all'inizio della nostra prossima conversazione per continuare."`;
let finalPrompt = promptTemplate;
finalPrompt = finalPrompt.replace(/{{TEACHER_NAME}}/g, wizardState.formData.teacher_name || 'AITutor');
finalPrompt = finalPrompt.replace(/{{DISCIPLINE}}/g, wizardState.formData.discipline || 'Materia');
finalPrompt = finalPrompt.replace(/{{PREREQUISITES}}/g, wizardState.formData.prerequisites || 'Nessuno specificato.');
finalPrompt = finalPrompt.replace(/{{SPECIFIC_STRATEGIES}}/g, wizardState.formData.specific_strategies || 'Nessuna.');
document.getElementById('final-prompt').value = finalPrompt;
submitTutorDataToGoogleForm();
}
function copyPrompt() {
const promptTextarea = document.getElementById('final-prompt');
promptTextarea.select();
promptTextarea.setSelectionRange(0, 99999);
try {
document.execCommand('copy');
const feedbackEl = document.getElementById('copy-feedback');
feedbackEl.style.opacity = '1';
setTimeout(() => { feedbackEl.style.opacity = '0'; }, 3000);
// L'incremento non è più necessario qui, il valore è caricato dinamicamente
} catch (err) { console.error('Impossibile copiare', err); }
}
async function generateWithAI(type) {
loadingOverlay.classList.remove('hidden');
const discipline = document.getElementById('discipline').value || 'apprendimento generico';
const subtopics = document.getElementById('subtopics').value || 'concetti base';
let userPrompt = '';
let targetTextareaId = '';
if (type === 'goals') {
userPrompt = `Sei un esperto di progettazione didattica. Data la disciplina "${discipline}" e gli argomenti specifici "${subtopics}", elenca 3 chiari obiettivi di apprendimento per uno studente. Usa un formato a elenco puntato. Esempio: "- Lo studente sarà in grado di descrivere il concetto di inerzia."`;
targetTextareaId = 'learning_goals';
} else if (type === 'misconceptions') {
userPrompt = `Sei un docente esperto. Data la disciplina "${discipline}" e gli argomenti specifici "${subtopics}", elenca 3 misconcezioni comuni tra gli studenti. Usa un formato a elenco puntato. Esempio: "- Confondere la massa con il peso."`;
targetTextareaId = 'misconceptions';
} else if (type === 'strategies') {
userPrompt = `Sei un esperto di pedagogia e instructional design. Per la disciplina "${discipline}" e gli argomenti "${subtopics}", suggerisci 2-3 strategie didattiche specifiche ed efficaci. Usa un formato a elenco puntato. Esempio: "- Utilizzare la tecnica del 'worked example' per mostrare passaggi risolutivi."`;
targetTextareaId = 'specific_strategies';
}
if (!userPrompt) {
loadingOverlay.classList.add('hidden');
return;
}
try {
const generatedText = await callGeminiAPI(userPrompt);
const targetTextarea = document.getElementById(targetTextareaId);
targetTextarea.value = generatedText;
targetTextarea.classList.add('bg-indigo-50', 'transition-colors', 'duration-500');
setTimeout(() => {
targetTextarea.classList.remove('bg-indigo-50');
}, 1000);
} catch (error) {
console.error("Errore nella chiamata all'API Gemini:", error);
} finally {
loadingOverlay.classList.add('hidden');
}
}
async function callGeminiAPI(prompt, retries = 3, delay = 1000) {
let chatHistory = [{ role: "user", parts: [{ text: prompt }] }];
const payload = { contents: chatHistory };
const apiKey = "";
const apiUrl = `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash-preview-05-20:generateContent?key=${apiKey}`;
for (let i = 0; i < retries; i++) {
try {
const response = await fetch(apiUrl, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(payload)
});
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const result = await response.json();
if (result.candidates && result.candidates.length > 0 &&
result.candidates[0].content && result.candidates[0].content.parts &&
result.candidates[0].content.parts.length > 0) {
return result.candidates[0].content.parts[0].text;
} else {
throw new Error("Risposta inattesa dall'API Gemini.");
}
} catch (error) {
if (i === retries - 1) {
console.error(`Chiamata API fallita dopo ${retries} tentativi.`, error);
throw error;
}
await new Promise(res => setTimeout(res, delay * Math.pow(2, i)));
}
}
}
document.getElementById('generate-goals-btn').addEventListener('click', () => generateWithAI('goals'));
document.getElementById('generate-misconceptions-btn').addEventListener('click', () => generateWithAI('misconceptions'));
document.getElementById('generate-strategies-btn').addEventListener('click', () => generateWithAI('strategies'));
document.getElementById('copy-prompt-btn').addEventListener('click', copyPrompt);
});
</script>
</body>
</html>