Index: ADME.md
===================================================================
--- README.md	(revision bc45cb5da7c6d8482bc21838561ed96e007b138d)
+++ 	(revision )
@@ -1,44 +1,0 @@
-# SIMLAB – Виртуелна Хемиска Лабораторија
-
-Образовна веб-апликација изградена со **Flask + PostgreSQL** за симулации на хемиски реакции, управување со елементи, лабораториска опрема и активности на студенти.
-
----
-
-## Главни функционалности
-- Улоги: **Teacher** и **Student** со различни дозволи  
-- CRUD за **Elements**, **Lab Equipment**, **Reactions**  
-- Автоматско креирање на **Experiments** при додавање реакција  
-- Dashboard со статистики и извештаи (basic + advanced SQL)  
-- Bcrypt лозинки, Flask sessions, индекси и constraints за интегритет  
-
----
-
-## Технологии
-- Backend: **Python 3.10+, Flask**  
-- Database: **PostgreSQL** (`psycopg2`, `RealDictCursor`)  
-- Templates: **Jinja2**  
-- Auth: **bcrypt**  
-- Logging: Python `logging`  
-
----
-
-## Setup & Run
-
-```bash
-git clone https://github.com/MarijaIsailovska/SIMLAB.git
-cd SIMLAB
-python -m venv venv
-source venv/bin/activate   # или venv\Scripts\activate на Windows
-pip install -r requirements.txt
-```
-
-## Database Highlights
-- CHECK ограничувања за валидни атомски броеви, маса и физички својства
-- Индекси за брзо пребарување и сортирање (реакции, експерименти, учества)
-- UNIQUE constraints за идемпотентност при логирање на активности
-- DEFAULT timestamps за автоматско логирање на учества и експерименти
-
-## Author
-Изработено од Марија Исаиловска
-Факултет за информатички науки и компјутерско инженерство – ФИНКИ
-Предмет: Бази на податоци
Index: app.py
===================================================================
--- app.py	(revision bc45cb5da7c6d8482bc21838561ed96e007b138d)
+++ app.py	(revision 14fe7c26eea0eb44ab5dbcea992e11378a7f6d4e)
@@ -1,7 +1,7 @@
-from flask import Flask, render_template, jsonify, request, session, redirect, url_for, flash
-from psycopg2.errors import ForeignKeyViolation
-from functools import wraps
+from flask import Flask, render_template, jsonify, request, session
 from utils.database_manager import DatabaseManager
+import hashlib
 from utils.auth_manager import AuthManager
+from flask import Flask, render_template, jsonify, request, session, redirect
 
 app = Flask(__name__)
@@ -9,60 +9,34 @@
 app.config['JSON_AS_ASCII'] = False
 
-
-# ------------------------------
-# Helpers / Decorators
-# ------------------------------
-def require_login(role=None):
-    def decorator(f):
-        @wraps(f)
-        def wrapper(*args, **kwargs):
-            if 'user_id' not in session:
-                return redirect(url_for('login'))
-            if role and session.get('role') != role:
-                return redirect(url_for('login'))
-            return f(*args, **kwargs)
-        return wrapper
-    return decorator
-
-
-def _render_generic(title, rows):
-    headers = list(rows[0].keys()) if rows else []
-    return render_template('reports/generic_report.html', title=title, headers=headers, rows=rows)
-
-
-def _enrich_with_equipment(exp_rows):
-    enriched = []
-    for row in (exp_rows or []):
-        exp = dict(row)
-        exp['equipment'] = DatabaseManager.get_experiment_equipment(exp['experiment_id']) or []
-        enriched.append(exp)
-    return enriched
-
-
-# ------------------------------
-# Home / Auth
-# ------------------------------
 @app.route('/')
 def index():
-    # Ако сакаш логнатите веднаш да одат на Dashboard, одкоментирај ги 3-те линии подолу
-    # if 'user_id' in session:
-    #     return redirect(url_for('dashboard'))
-
-    return render_template(
-        'home.html',
-        is_logged=('user_id' in session),
-        user_name=session.get('user_name'),
-        role=session.get('role')  # 'student' или 'teacher'
-    )
+    return '''
+    <h1>🧪 SIMLAB - Виртуелна Хемиска Лабораторија</h1>
+    <h3>📊 SQL пристап за Бази на Податоци</h3>
+    <ul>
+        <li><a href="/users">👥 Прикажи корисници</a></li>
+        <li><a href="/elements">🔬 Прикажи хемиски елементи</a></li>
+        <li><a href="/equipment">🛠 Прикажи лабораториска опрема</a></li>
+        <li><a href="/reports">📈 SQL Извештаи</a></li>
+        <li><a href="/test-db">🔍 Тестирај база</a></li>
+    </ul>
+    '''
 
 @app.route('/test-db')
 def test_db():
     if DatabaseManager.test_connection():
-        return jsonify({'status': 'success', 'message': 'Успешно поврзување со факултетската база!'})
-    return jsonify({'status': 'error', 'message': 'Грешка при поврзување'})
-
+        return jsonify({
+            'status': 'success',
+            'message': 'Успешно поврзување со факултетската база!'
+        })
+    else:
+        return jsonify({
+            'status': 'error',
+            'message': 'Грешка при поврзување'
+        })
 
 @app.route('/users')
 def users():
+    """Прикажи сите корисници"""
     users = DatabaseManager.get_all_users()
     if users:
@@ -75,10 +49,57 @@
     return jsonify({'status': 'error', 'message': 'Нема корисници'})
 
-
+@app.route('/elements')
+def elements():
+    if 'user_id' not in session:
+        return redirect('/login')
+    
+    elements_data = DatabaseManager.get_all_elements()
+    
+    if elements_data:
+        return render_template('elements_list.html', elements=elements_data, user_role=session['role'])
+    else:
+        return render_template('elements_list.html', elements=[], error='Нема елементи во базата')
+
+@app.route('/equipment')
+def equipment():
+    """Прикажи лабораториска опрема"""
+    if 'user_id' not in session:
+        return redirect('/login')
+    
+    equipment_data = DatabaseManager.get_all_equipment()
+    if equipment_data:
+        return render_template('equipment_list.html', equipment=equipment_data, user_role=session['role'])
+    else:
+        return render_template('equipment_list.html', equipment=[], error='Нема опрема во базата')
+
+@app.route('/reports/equipment-usage')
+def reports():
+    """SQL Извештаи"""
+    usage_report = DatabaseManager.get_equipment_usage_report()
+    if usage_report:
+        return jsonify({
+            'status': 'success',
+            'report_name': 'Извештај за користење на лабораториска опрема',
+            'sql_query': '''
+                SELECT le.equipment_name, COUNT(ele.experiment_id) AS usage_count
+                FROM ExperimentLabEquipment ele
+                RIGHT JOIN LabEquipment le ON ele.equipment_id = le.equipment_id
+                GROUP BY le.equipment_name
+                ORDER BY usage_count DESC
+            ''',
+            'count': len(usage_report),
+            'data': usage_report
+        })
+    else:
+        return jsonify({
+            'status': 'error',
+            'message': 'Грешка при генерирање на извештај'
+        })
 @app.route('/login', methods=['GET', 'POST'])
 def login():
     if request.method == 'POST':
-        email = (request.form['email'] or '').strip().lower()  # normalize
+        email = request.form['email']
         password = request.form['password']
+        
         user = DatabaseManager.authenticate_user(email, password)
         if user and AuthManager.verify_password(password, user['password']):
@@ -86,35 +107,31 @@
             session['user_name'] = user['user_name']
             session['role'] = user['role']
-            return redirect(url_for('dashboard'))
-        return render_template('login.html', error='Погрешен email или лозинка')
+            return redirect('/dashboard')
+        else:
+            return render_template('login.html', error='Погрешен email или лозинка')
+    
     return render_template('login.html')
 
 @app.route('/register', methods=['GET', 'POST'])
 def register():
-    teachers = DatabaseManager.get_all_teachers()
-    if request.method == 'POST':
-        name     = (request.form['name'] or '').strip()
-        surname  = (request.form['surname'] or '').strip()
-        email    = (request.form['email'] or '').strip().lower()  # normalize
+    teachers = DatabaseManager.get_all_teachers()  # Земи наставници
+    
+    if request.method == 'POST':
+        name = request.form['name']
+        surname = request.form['surname']
+        email = request.form['email']
         password = request.form['password']
-        role     = request.form['role']
-        # студент мора да избере наставник (server-side валидација)
-        teacher_id = None
-        if role == 'student':
-            raw_tid = (request.form.get('teacher_id') or '').strip()
-            if not raw_tid:
-                return render_template('register.html', error='Избери наставник.', teachers=teachers)
-            try:
-                teacher_id = int(raw_tid)
-            except ValueError:
-                return render_template('register.html', error='Невалиден наставник.', teachers=teachers)
-
+        role = request.form['role']
+        teacher_id = request.form.get('teacher_id') if role == 'student' else None
+        
+        # Хеширај лозинка
         password_hash = AuthManager.hash_password(password)
+        
         user_id = DatabaseManager.register_user(name, surname, email, password_hash, role, teacher_id)
         if user_id:
-            return redirect(url_for('login'))
-        # ако паднало на UNIQUE(email) ќе врати None → прикажи френдли порака
-        return render_template('register.html', error='Овој email веќе постои.', teachers=teachers)
-
+            return redirect('/login')
+        else:
+            return render_template('register.html', error='Грешка при регистрација', teachers=teachers)
+    
     return render_template('register.html', teachers=teachers)
 
@@ -122,86 +139,23 @@
 def logout():
     session.clear()
-    return redirect(url_for('index'))
+    return redirect('/')
 
 @app.route('/dashboard')
-@require_login()
 def dashboard():
+    if 'user_id' not in session:
+        return redirect('/login')
+    
     if session['role'] == 'teacher':
-        try:
-            stats = DatabaseManager.get_teacher_dashboard_statistics(session['user_id'])
-        except Exception:
-            stats = {'student_count': 0, 'reaction_count': 0, 'experiment_count': 0, 'activity_count': 0}
-        return render_template('dashboard_teacher.html', user_name=session['user_name'], stats=stats)
-    else:
-        try:
-            stats = DatabaseManager.get_student_statistics(session['user_id'])
-        except Exception:
-            stats = {'experiment_count': 0, 'element_count': 0, 'equipment_count': 0, 'reaction_count': 0}
-        return render_template('dashboard_student.html', user_name=session['user_name'], stats=stats)
-
-
-@app.route('/api/dashboard-stats')
-@require_login()
-def dashboard_stats():
-    try:
-        if session['role'] == 'student':
-            stats = DatabaseManager.get_student_statistics(session['user_id']) or {}
-            stats = {
-                'student_count': 0,
-                'reaction_count': int(stats.get('reaction_count', 0)),
-                'experiment_count': int(stats.get('experiment_count', 0)),
-                'activity_count': 0
-            }
-        else:
-            stats = DatabaseManager.get_teacher_dashboard_statistics(session['user_id']) or {}
-            stats = {
-                'student_count': int(stats.get('student_count', 0)),
-                'reaction_count': int(stats.get('reaction_count', 0)),
-                'experiment_count': int(stats.get('experiment_count', 0)),
-                'activity_count': int(stats.get('activity_count', 0))
-            }
-        return jsonify(stats), 200
-    except Exception as e:
-        app.logger.exception("dashboard_stats failed")
-        return jsonify({'error': f'Серверска грешка: {str(e)}'}), 500
-
-
-@app.route('/api/debug-dashboard')
-@require_login()
-def api_debug_dashboard():
-    uid = session['user_id']
-    role = session.get('role')
-    if role == 'teacher':
-        stats = DatabaseManager.get_teacher_dashboard_statistics(uid)
-    else:
-        stats = DatabaseManager.get_student_statistics(uid)
-    return jsonify({'session_user_id': uid, 'session_role': role, 'stats': stats}), 200
-
-
-# ------------------------------
-# Elements
-# ------------------------------
-@app.route('/elements')
-@require_login()
-def elements():
-    elements_data = DatabaseManager.get_all_elements()
-    if elements_data:
-        return render_template('elements_list.html', elements=elements_data, user_role=session['role'])
-    return render_template('elements_list.html', elements=[], error='Нема елементи во базата')
-
-
-@app.route('/elements/<int:element_id>')
-@require_login()
-def element_detail(element_id):
-    DatabaseManager.track_element_view(session['user_id'], element_id)
-    element = DatabaseManager.get_element_by_id(element_id)
-    if element:
-        return render_template('element_detail.html', element=element, user_role=session['role'])
-    return redirect(url_for('elements'))
-
-
+        # Dashboard за наставник
+        return render_template('dashboard_teacher.html', user_name=session['user_name'])
+    else:
+        # Dashboard за студент
+        return render_template('dashboard_student.html', user_name=session['user_name'])
+    
 @app.route('/elements/add', methods=['GET', 'POST'])
-@require_login('teacher')
 def add_element():
+    if 'user_id' not in session or session['role'] != 'teacher':
+        return redirect('/login')
+    
     if request.method == 'POST':
         symbol = request.form['symbol']
@@ -214,20 +168,171 @@
         description = request.form['description']
         teacher_id = session['user_id']
-        element_id = DatabaseManager.add_element(
-            symbol, name, atomic_number, atomic_weight,
-            melting_point, boiling_point, hazard_type, description, teacher_id
-        )
+        
+        element_id = DatabaseManager.add_element(symbol, name, atomic_number, atomic_weight,melting_point,boiling_point, hazard_type, description, teacher_id)
+        
         if element_id:
-            return redirect(url_for('dashboard'))
-        return render_template('add_element.html', error='Грешка при додавање на елементот')
+            return redirect('/dashboard')
+        else:
+            return render_template('add_element.html', error='Грешка при додавање на елементот')
+    
     return render_template('add_element.html')
 
+@app.route('/reports')
+def reports_menu():
+    if 'user_id' not in session or session['role'] != 'teacher':
+        return redirect('/login')
+    
+    return render_template('reports/menu.html')
+
+@app.route('/reports/low_activity_students')
+def low_activity_students():
+    if 'user_id' not in session or session['role'] != 'teacher':
+        return redirect('/login')
+    
+    teacher_id = session['user_id']
+    students = DatabaseManager.get_students_with_few_experiments(teacher_id, 3)
+    return render_template('reports/low_activity_students.html', students=students)
+
+@app.route('/reports/teacher_statistics')
+def teacher_statistics():
+    if 'user_id' not in session or session['role'] != 'teacher':
+        return redirect('/login')
+    
+    stats = DatabaseManager.get_teacher_statistics()
+    return render_template('reports/teacher_statistics.html', statistics=stats)
+
+@app.route('/reports/inactive_students')
+def inactive_students():
+    if 'user_id' not in session or session['role'] != 'teacher':
+        return redirect('/login')
+    
+    teacher_id = session['user_id']
+    students = DatabaseManager.get_students_without_experiments(teacher_id)
+    return render_template('reports/inactive_students.html', students=students)
+
+@app.route('/reports/detailed_experiments')
+def detailed_experiments():
+    if 'user_id' not in session or session['role'] != 'teacher':
+        return redirect('/login')
+    
+    teacher_id = session['user_id']
+    experiments = DatabaseManager.get_students_experiments_detailed(teacher_id)
+    return render_template('reports/detailed_experiments.html', experiments=experiments)
+
+@app.route('/elements/<int:element_id>')
+def element_detail(element_id):
+    if 'user_id' not in session:
+        return redirect('/login')
+    
+    # Овде се случува tracking - кога корисникот кликне на "Детали"
+    DatabaseManager.track_element_view(session['user_id'], element_id)
+    
+    element = DatabaseManager.get_element_by_id(element_id)
+    if element:
+        return render_template('element_detail.html', element=element, user_role=session['role'])
+    else:
+        return redirect('/elements')
+@app.route('/my_students')
+def my_students():
+    if 'user_id' not in session or session['role'] != 'teacher':
+        return redirect('/login')
+    
+    teacher_id = session['user_id']
+    students_activity = DatabaseManager.get_my_students_activity(teacher_id)
+    
+    return render_template('my_students.html', 
+                         students=students_activity, 
+                         teacher_name=session['user_name'])
+
+@app.route('/experiments')
+def experiments():
+    if 'user_id' not in session:
+        return redirect('/login')
+    
+    experiments_data = DatabaseManager.get_all_experiments()
+    return render_template('experiments_list.html', experiments=experiments_data, user_role=session['role'])
+
+@app.route('/experiments/<int:experiment_id>')
+def experiment_detail(experiment_id):
+    if 'user_id' not in session:
+        return redirect('/login')
+    
+    # Земи детали за експериментот
+    experiments = DatabaseManager.get_all_experiments()
+    experiment = None
+    for exp in experiments:
+        if exp['experiment_id'] == experiment_id:
+            experiment = exp
+            break
+    
+    if not experiment:
+        return redirect('/experiments')
+    
+    # Земи ја опремата за експериментот
+    equipment = DatabaseManager.get_experiment_equipment(experiment_id)
+    
+    return render_template('experiment_detail.html', 
+                         experiment=experiment, 
+                         equipment=equipment, 
+                         user_role=session['role'])
+
+@app.route('/reports/element_views')
+def element_views_report():
+    if 'user_id' not in session or session['role'] != 'teacher':
+        return redirect('/login')
+    
+    views_data = DatabaseManager.get_element_views_report()
+    return render_template('reports/element_views.html', views=views_data)
+
+@app.route('/equipment/add', methods=['GET', 'POST'])
+def add_equipment():
+    if 'user_id' not in session or session['role'] != 'teacher':
+        return redirect('/login')
+    
+    if request.method == 'POST':
+        name = request.form['name']
+        equipment_type = request.form['type']
+        description = request.form['description']
+        safety_info = request.form['safety_info']
+        teacher_id = session['user_id']
+        
+        equipment_id = DatabaseManager.add_lab_equipment(name, equipment_type, description, safety_info, teacher_id)
+        
+        if equipment_id:
+            return redirect('/dashboard')
+        else:
+            return render_template('add_equipment.html', error='Грешка при додавање на опремата')
+    
+    return render_template('add_equipment.html')
+
+@app.route('/equipment/<int:equipment_id>')
+def equipment_detail(equipment_id):
+    if 'user_id' not in session:
+        return redirect('/login')
+    
+    # Track дека корисникот ја погледнал опремата
+    DatabaseManager.track_equipment_view(session['user_id'], equipment_id)
+    
+    equipment_data = DatabaseManager.get_all_equipment()
+    equipment = None
+    for item in equipment_data:
+        if item['equipment_id'] == equipment_id:
+            equipment = item
+            break
+    
+    if equipment:
+        return render_template('equipment_detail.html', equipment=equipment, user_role=session['role'])
+    else:
+        return redirect('/equipment')
 
 @app.route('/elements/<int:element_id>/edit', methods=['GET', 'POST'])
-@require_login('teacher')
 def edit_element(element_id):
+    if 'user_id' not in session or session['role'] != 'teacher':
+        return redirect('/login')
+    
     element = DatabaseManager.get_element_by_id(element_id)
     if not element:
-        return redirect(url_for('elements'))
+        return redirect('/elements')
+    
     if request.method == 'POST':
         symbol = request.form['symbol']
@@ -239,28 +344,21 @@
         hazard_type = request.form['hazard_type']
         description = request.form['description']
-        if DatabaseManager.update_element(
-            element_id, symbol, name, atomic_number, atomic_weight,
-            melting_point, boiling_point, hazard_type, description
-        ):
-            return redirect(url_for('elements'))
-        return render_template('edit_element.html', element=element, error='Грешка при ажурирање')
+        
+        if DatabaseManager.update_element(element_id, symbol, name, atomic_number, atomic_weight, melting_point, boiling_point, hazard_type, description):
+            return redirect('/elements')
+        else:
+            return render_template('edit_element.html', element=element, error='Грешка при ажурирање')
+    
     return render_template('edit_element.html', element=element)
 
-
-# ------------------------------
-# Equipment
-# ------------------------------
-@app.route('/equipment')
-@require_login()
-def equipment():
-    equipment_data = DatabaseManager.get_all_equipment()
-    if equipment_data:
-        return render_template('equipment_list.html', equipment=equipment_data, user_role=session['role'])
-    return render_template('equipment_list.html', equipment=[], error='Нема опрема во базата')
-
-
-@app.route('/equipment/add', methods=['GET', 'POST'])
-@require_login('teacher')
-def add_equipment():
+@app.route('/equipment/<int:equipment_id>/edit', methods=['GET', 'POST'])
+def edit_equipment(equipment_id):
+    if 'user_id' not in session or session['role'] != 'teacher':
+        return redirect('/login')
+    
+    equipment = DatabaseManager.get_equipment_by_id(equipment_id)
+    if not equipment:
+        return redirect('/equipment')
+    
     if request.method == 'POST':
         name = request.form['name']
@@ -268,118 +366,30 @@
         description = request.form['description']
         safety_info = request.form['safety_info']
-        teacher_id = session['user_id']
-        equipment_id = DatabaseManager.add_lab_equipment(name, equipment_type, description, safety_info, teacher_id)
-        if equipment_id:
-            return redirect(url_for('dashboard'))
-        return render_template('add_equipment.html', error='Грешка при додавање на опремата')
-    return render_template('add_equipment.html')
-
-
-@app.route('/equipment/<int:equipment_id>')
-@require_login()
-def equipment_detail(equipment_id):
-    DatabaseManager.track_equipment_view(session['user_id'], equipment_id)
-    equipment_data = DatabaseManager.get_all_equipment()
-    equipment = None
-    for item in (equipment_data or []):
-        if item['equipment_id'] == equipment_id:
-            equipment = item
-            break
-    if equipment:
-        return render_template('equipment_detail.html', equipment=equipment, user_role=session['role'])
-    return redirect(url_for('equipment'))
-
-
-@app.route('/equipment/<int:equipment_id>/edit', methods=['GET', 'POST'])
-@require_login('teacher')
-def edit_equipment(equipment_id):
-    equipment = DatabaseManager.get_equipment_by_id(equipment_id)
-    if not equipment:
-        return redirect(url_for('equipment'))
-    if request.method == 'POST':
-        name = request.form['name']
-        equipment_type = request.form['type']
-        description = request.form['description']
-        safety_info = request.form['safety_info']
+        
         if DatabaseManager.update_equipment(equipment_id, name, equipment_type, description, safety_info):
-            return redirect(url_for('equipment'))
-        return render_template('edit_equipment.html', equipment=equipment, error='Грешка при ажурирање')
+            return redirect('/equipment')
+        else:
+            return render_template('edit_equipment.html', equipment=equipment, error='Грешка при ажурирање')
+    
     return render_template('edit_equipment.html', equipment=equipment)
 
 
-# ------------------------------
-# Reactions
-# ------------------------------
 @app.route('/reactions')
-@require_login()
 def reactions():
+    """Прикажи сите реакции"""
+    if 'user_id' not in session:
+        return redirect('/login')
+    
     reactions_data = DatabaseManager.get_all_reactions()
     return render_template('reactions_list.html', reactions=reactions_data, user_role=session['role'])
 
-
 @app.route('/reactions/add', methods=['GET', 'POST'])
-@require_login('teacher')
 def add_reaction():
-    if request.method == 'POST':
-        try:
-            element1_id = int(request.form['element1_id'])
-            element2_id = int(request.form['element2_id'])
-            product     = (request.form.get('product') or '').strip() or None
-            conditions  = (request.form.get('conditions') or '').strip() or None
-            temperature = (request.form.get('temperature') or '').strip()
-            pressure    = (request.form.get('pressure') or '').strip()
-            catalyst    = (request.form.get('catalyst') or '').strip()
-
-            extra = []
-            if temperature: extra.append(f"T={temperature}")
-            if pressure:    extra.append(f"p={pressure}")
-            if catalyst:    extra.append(f"катализатор={catalyst}")
-            if extra:
-                conditions = (conditions + "; " if conditions else "") + "; ".join(extra)
-
-            experiment_result = (request.form.get('experiment_result') or '').strip() or None
-            safety_warning    = (request.form.get('safety_warning') or '').strip() or None
-            equipment_ids = [int(x) for x in request.form.getlist('equipment_ids')] or None
-
-            if element1_id == element2_id:
-                flash('Одбери два различни елементи.', 'warning')
-                return redirect(url_for('add_reaction'))
-
-            res = DatabaseManager.create_reaction_and_experiment(
-                teacher_id=session['user_id'],
-                element1_id=element1_id,
-                element2_id=element2_id,
-                product=product,
-                conditions=conditions,
-                experiment_result=experiment_result,
-                safety_warning=safety_warning,
-                equipment_ids=equipment_ids
-            )
-            if not res:
-                flash('Неуспешно креирање (провери ID вредности).', 'danger')
-                return redirect(url_for('add_reaction'))
-
-            flash('Реакцијата и експериментот се успешно креирани.', 'success')
-            return redirect(url_for('reactions'))
-
-        except ForeignKeyViolation:
-            flash('Погрешни ID вредности за елементи/наставник/опрема.', 'danger')
-            return redirect(url_for('add_reaction'))
-        except Exception as ex:
-            flash(f'Настана грешка: {ex}', 'danger')
-            return redirect(url_for('add_reaction'))
-
-    elements  = DatabaseManager.get_all_elements()
-    equipment = DatabaseManager.get_all_equipment()
-    return render_template('add_reaction.html', elements=elements, equipment=equipment)
-
-
-@app.route('/reactions/<int:reaction_id>/edit', methods=['GET', 'POST'])
-@require_login('teacher')
-def edit_reaction(reaction_id):
-    reaction = DatabaseManager.get_reaction_by_id(reaction_id)
-    if not reaction:
-        return redirect(url_for('reactions'))
+    """Додај нова реакција - само за професори"""
+    if 'user_id' not in session or session['role'] != 'teacher':
+        return redirect('/login')
+    
     elements = DatabaseManager.get_all_elements()
+    
     if request.method == 'POST':
         element1_id = int(request.form['element1_id'])
@@ -387,463 +397,170 @@
         product = request.form['product']
         conditions = request.form['conditions']
+        teacher_id = session['user_id']
+        
+        reaction_id = DatabaseManager.add_reaction(teacher_id, element1_id, element2_id, product, conditions)
+        
+        if reaction_id:
+            return redirect('/reactions')
+        else:
+            return render_template('add_reaction.html', elements=elements, error='Грешка при додавање реакција')
+    
+    return render_template('add_reaction.html', elements=elements)
+
+@app.route('/laboratory')
+def laboratory():
+    """Виртуелна лабораторија - различни темплејти според улога"""
+    if 'user_id' not in session:
+        return redirect('/login')
+    
+    elements = DatabaseManager.get_all_elements()
+    
+    # Различни темплејти според улогата
+    if session['role'] == 'teacher':
+        return render_template('laboratory.html', 
+                             elements=elements, 
+                             user_role=session['role'])
+    else:  # student
+        return render_template('virtual_laboratory.html', 
+                             elements=elements, 
+                             user_role=session['role'])
+
+@app.route('/api/simulate-reaction', methods=['POST'])
+def simulate_reaction():
+    """API за симулација на реакција"""
+    if 'user_id' not in session:
+        return jsonify({'error': 'Неавторизиран пристап'})
+    
+    data = request.get_json()
+    element1_symbol = data.get('element1')
+    element2_symbol = data.get('element2')
+    
+    # Проверка во базата за реакција
+    reactions = DatabaseManager.get_all_reactions()
+    for reaction in reactions:
+        if ((reaction['element1_symbol'] == element1_symbol and reaction['element2_symbol'] == element2_symbol) or
+            (reaction['element1_symbol'] == element2_symbol and reaction['element2_symbol'] == element1_symbol)):
+            return jsonify({
+                'success': True,
+                'product': reaction['product'],
+                'conditions': reaction['conditions'],
+                'reaction_id': reaction['reaction_id'],
+                'elements': f"{reaction['element1_name']} + {reaction['element2_name']}"
+            })
+    
+    return jsonify({
+        'success': False,
+        'message': f'Реакцијата меѓу {element1_symbol} и {element2_symbol} не е дефинирана во системот.'
+    })
+
+    
+@app.route('/api/check-reaction', methods=['POST'])
+def check_reaction():
+    """API за проверка на реакција"""
+    if 'user_id' not in session:
+        return jsonify({'error': 'Неавторизиран пристап'})
+    
+    data = request.get_json()
+    element1_symbol = data.get('element1')
+    element2_symbol = data.get('element2')
+    
+    # Најди реакција во базата
+    reactions = DatabaseManager.get_all_reactions()
+    for reaction in reactions:
+        if ((reaction['element1_symbol'] == element1_symbol and reaction['element2_symbol'] == element2_symbol) or
+            (reaction['element1_symbol'] == element2_symbol and reaction['element2_symbol'] == element1_symbol)):
+            return jsonify({
+                'success': True,
+                'product': reaction['product'],
+                'conditions': reaction['conditions'],
+                'reaction_id': reaction['reaction_id']
+            })
+    
+    return jsonify({
+        'success': False,
+        'message': 'Реакцијата не е дефинирана во системот'
+    })
+
+@app.route('/reactions/<int:reaction_id>/edit', methods=['GET', 'POST'])
+def edit_reaction(reaction_id):
+    """Едитирај реакција - само за професори"""
+    if 'user_id' not in session or session['role'] != 'teacher':
+        return redirect('/login')
+    
+    reaction = DatabaseManager.get_reaction_by_id(reaction_id)
+    if not reaction:
+        return redirect('/reactions')
+    
+    elements = DatabaseManager.get_all_elements()
+    
+    if request.method == 'POST':
+        element1_id = int(request.form['element1_id'])
+        element2_id = int(request.form['element2_id'])
+        product = request.form['product']
+        conditions = request.form['conditions']
+        
         if DatabaseManager.update_reaction(reaction_id, element1_id, element2_id, product, conditions):
-            return redirect(url_for('reactions'))
-        return render_template('edit_reaction.html', reaction=reaction, elements=elements, error='Грешка при ажурирање')
+            return redirect('/reactions')
+        else:
+            return render_template('edit_reaction.html', reaction=reaction, elements=elements, error='Грешка при ажурирање')
+    
     return render_template('edit_reaction.html', reaction=reaction, elements=elements)
 
-
 @app.route('/reactions/<int:reaction_id>/delete', methods=['POST'])
-@require_login('teacher')
 def delete_reaction(reaction_id):
+    """Избриши реакција - само за професори"""
+    if 'user_id' not in session or session['role'] != 'teacher':
+        return redirect('/login')
+    
     if DatabaseManager.delete_reaction(reaction_id):
-        return redirect(url_for('reactions'))
-    return redirect(url_for('reactions'))
-
-
-# ------------------------------
-# Laboratory + APIs
-# ------------------------------
-@app.route('/laboratory')
-@require_login()
-def laboratory():
-    elements = DatabaseManager.get_all_elements()
+        return redirect('/reactions')
+    else:
+        return redirect('/reactions')  # Со грешка, но сепак назад
+
+@app.route('/save-experiment', methods=['POST'])
+def save_experiment():
+    """Зачувај симулација како експеримент"""
+    if 'user_id' not in session:
+        return jsonify({'error': 'Неавторизиран пристап'})
+    
+    data = request.get_json()
+    reaction_id = data.get('reaction_id')
+    result_description = data.get('result', 'Успешно извршена симулација')
+    safety_warning = data.get('safety_warning', 'Симулирана реакција - без реални ризици')
+    
+    # За експерименти, teacher_id е секогаш потребен
+    # Ако е студент, користи го неговиот teacher_id
     if session['role'] == 'teacher':
-        return render_template('laboratory.html', elements=elements, user_role=session['role'])
-    return render_template('virtual_laboratory.html', elements=elements, user_role=session['role'])
-
-
-def _to_element_id(v):
-    # пробај како int
-    try:
-        return int(v)
-    except Exception:
-        pass
-    # fallback: симбол/име -> id
-    row = DatabaseManager.execute_query("""
-        SELECT element_id
-        FROM elements
-        WHERE UPPER(symbol)=UPPER(%s) OR UPPER(element_name)=UPPER(%s)
-        LIMIT 1
-    """, (v, v)) or []
-    return row[0]['element_id'] if row else None
-
-@app.route('/api/simulate-reaction', methods=['POST'])
-@require_login()
-def simulate_reaction():
-    try:
-        data = request.get_json(silent=True) or {}
-        e1 = _to_element_id(data.get('element1_id') or data.get('element1'))
-        e2 = _to_element_id(data.get('element2_id') or data.get('element2'))
-        if not e1 or not e2:
-            return jsonify({'success': False, 'message': 'Недостигаат валидни element_id вредности.'}), 400
-
-        rx = DatabaseManager.get_reaction_by_element_ids(e1, e2)
-        if not rx:
-            return jsonify({'success': False, 'message': 'Реакцијата не е дефинирана во системот.'}), 200
-
-        rx_full = DatabaseManager.get_reaction_by_id(rx['reaction_id']) or {}
-        exp     = DatabaseManager.get_experiment_by_reaction(rx['reaction_id'])
-
-        return jsonify({
-            'success': True,
-            'product': rx.get('product'),
-            'conditions': rx.get('conditions'),
-            'reaction_id': rx['reaction_id'],
-            'experiment_id': exp['experiment_id'] if exp else None,
-            'elements': f"{rx_full.get('element1_name','')} + {rx_full.get('element2_name','')}"
-        }), 200
-    except Exception as e:
-        app.logger.exception("simulate_reaction failed")
-        return jsonify({'success': False, 'message': f'Серверска грешка: {str(e)}'}), 500
-
-@app.route('/api/check-reaction', methods=['POST'])
-@require_login()
-def check_reaction():
-    try:
-        data = request.get_json(silent=True) or {}
-        e1 = _to_element_id(data.get('element1_id') or data.get('element1'))
-        e2 = _to_element_id(data.get('element2_id') or data.get('element2'))
-        if not e1 or not e2:
-            return jsonify({'success': False, 'message': 'Недостигаат валидни element_id вредности.'}), 400
-
-        rx = DatabaseManager.get_reaction_by_element_ids(e1, e2)
-        if not rx:
-            return jsonify({'success': False, 'message': 'Реакцијата не е дефинирана во системот.'}), 200
-
-        return jsonify({
-            'success': True,
-            'product': rx['product'],
-            'conditions': rx['conditions'],
-            'reaction_id': rx['reaction_id']
-        }), 200
-    except Exception as e:
-        app.logger.exception("check_reaction failed")
-        return jsonify({'success': False, 'message': f'Серверска грешка: {str(e)}'}), 500
-
-@app.route('/save-experiment', methods=['POST'])
-@require_login()
-def save_experiment():
-    data = request.get_json() or {}
-    reaction_id = data.get('reaction_id')
-    experiment = DatabaseManager.get_experiment_by_reaction(reaction_id)
-
-    if not experiment:
-        if session['role'] != 'teacher':
-            return jsonify({'success': False, 'message': 'Не постои експеримент за оваа реакција. Контактирајте го вашиот професор.'})
-
-        result_description = data.get('result', 'Експериментална симулација')
-        # важно: ако нема вредност, испрати None → тригерот ќе пополни
-        safety_warning = (data.get('safety_warning') or '').strip() or None
-
-        experiment_id = DatabaseManager.insert_experiment(
-            session['user_id'], reaction_id, result_description, safety_warning
-        )
-    else:
-        experiment_id = experiment['experiment_id']
-
+        teacher_id = session['user_id']
+    else:
+        # Земи го teacher_id на студентот
+        student_info = DatabaseManager.get_user_by_id(session['user_id'])
+        teacher_id = student_info.get('teacher_id') if student_info else None
+        
+        if not teacher_id:
+            return jsonify({'success': False, 'message': 'Не може да се пронајде професор'})
+    
+    # Зачувај експеримент
+    experiment_id = DatabaseManager.insert_experiment(teacher_id, reaction_id, result_description, safety_warning)
+    
     if experiment_id:
+        # Додај учество на корисникот
         DatabaseManager.track_experiment_participation(session['user_id'], experiment_id)
         return jsonify({'success': True, 'experiment_id': experiment_id})
-    return jsonify({'success': False, 'message': 'Грешка при зачувување'})
-
-
-# ------------------------------
-# Experiments
-# ------------------------------
-@app.route('/experiments')
-@require_login()
-def experiments():
-    base = DatabaseManager.get_all_experiments()
-    experiments = _enrich_with_equipment(base)
-    return render_template('experiments_list.html', experiments=experiments, user_role=session['role'])
-
-
-@app.route('/experiments/<int:experiment_id>')
-@require_login()
-def experiment_detail(experiment_id):
-    experiments_list = DatabaseManager.get_all_experiments()
-    experiment = None
-    for exp in (experiments_list or []):
-        if exp['experiment_id'] == experiment_id:
-            experiment = exp
-            break
-    if not experiment:
-        return redirect(url_for('experiments'))
-    equipment = DatabaseManager.get_experiment_equipment(experiment_id)
-    return render_template('experiment_detail.html', experiment=experiment, equipment=equipment, user_role=session['role'])
-
-
-# ------------------------------
-# Students (teacher view)
-# ------------------------------
-@app.route('/my_students')
-@require_login('teacher')
-def my_students():
-    teacher_id = session['user_id']
-    students_activity = DatabaseManager.get_my_students_activity(teacher_id)
-    return render_template('my_students.html', students=students_activity, teacher_name=session['user_name'])
-
-
-# ------------------------------
-# My experiments (by role)
-# ------------------------------
+    else:
+        return jsonify({'success': False, 'message': 'Грешка при зачувување'})
+
 @app.route('/my-experiments')
-@require_login()
 def my_experiments():
-    if session['role'] == 'student':
-        base = DatabaseManager.get_student_participation_experiments(session['user_id'])
-    else:
-        base = DatabaseManager.get_user_experiments(session['user_id'])
-    experiments = _enrich_with_equipment(base)
-    return render_template('my_experiments.html', experiments=experiments, user_name=session['user_name'], user_role=session['role'])
-
-
-# ------------------------------
-# Reports (menu + basic)
-# ------------------------------
-@app.route('/reports')
-@require_login('teacher')
-def reports_menu():
-    return render_template('reports/menu.html')
-
-
-@app.route('/reports/equipment-usage')
-@require_login('teacher')
-def reports_equipment_usage():
-    usage_report = DatabaseManager.get_equipment_usage_report()
-    if usage_report:
-        return jsonify({
-            'status': 'success',
-            'report_name': 'Извештај за користење на лабораториска опрема',
-            'sql_query': '''
-                SELECT le.equipment_name, COUNT(ele.experiment_id) AS usage_count
-                FROM experimentlabequipment ele
-                RIGHT JOIN labequipment le ON ele.equipment_id = le.equipment_id
-                GROUP BY le.equipment_name
-                ORDER BY usage_count DESC
-            ''',
-            'count': len(usage_report),
-            'data': usage_report
-        })
-    return jsonify({'status': 'error', 'message': 'Грешка при генерирање на извештај'})
-
-
-@app.route('/reports/teacher_statistics')
-@require_login('teacher')
-def reports_teacher_statistics():
-    stats = DatabaseManager.get_teacher_statistics()
-    return render_template('reports/teacher_statistics.html', statistics=stats)
-
-
-@app.route('/reports/inactive_students')
-@require_login('teacher')
-def reports_inactive_students():
-    teacher_id = session['user_id']
-    students = DatabaseManager.get_students_without_experiments(teacher_id)
-    return render_template('reports/inactive_students.html', students=students)
-
-
-@app.route('/reports/element_views')
-@require_login('teacher')
-def reports_element_views():
-    views_data = DatabaseManager.get_element_views_report()
-    return render_template('reports/element_views.html', views=views_data)
-
-
-@app.route('/reports/detailed_experiments')
-@require_login('teacher')
-def reports_detailed_experiments():
-    teacher_id = session['user_id']
-    experiments = DatabaseManager.get_students_experiments_detailed(teacher_id)
-    return render_template('reports/detailed_experiments.html', experiments=experiments)
-
-
-@app.route('/reports/low_activity_students')
-@require_login('teacher')
-def reports_low_activity_students():
-    teacher_id = session['user_id']
-    students = DatabaseManager.get_students_with_few_experiments(teacher_id, 3)
-    return render_template('reports/low_activity_students.html', students=students)
-
-
-@app.route('/reports/student_experiments')
-@require_login('teacher')
-def reports_student_experiments():
-    teacher_id = session['user_id']
-    experiments = DatabaseManager.get_students_experiments_for_teacher(teacher_id)
-    return render_template('reports/student_experiments.html', student_experiments=experiments)
-
-
-@app.route('/reports/user_activity')
-@require_login('teacher')
-def reports_user_activity():
-    summary = DatabaseManager.get_user_activity_summary()
-    return render_template('reports/user_activity.html', summary=summary)
-
-
-# ------------------------------
-# Advanced Reports (SQL)
-# ------------------------------
-@app.route('/reports/adv/student_experiment_counts')
-@require_login('teacher')
-def reports_adv_student_experiment_counts():
-    sql = """
-        SELECT 
-            s.student_id,
-            u.user_name || ' ' || u.user_surname AS full_name,
-            COUNT(up.experiment_id) AS total_experiments
-        FROM student s
-        JOIN "User" u ON s.student_id = u.user_id
-        LEFT JOIN userparticipatesinexperiment up ON s.student_id = up.user_id
-        LEFT JOIN experiment e ON up.experiment_id = e.experiment_id
-        WHERE s.teacher_id = %s
-        GROUP BY s.student_id, full_name
-        ORDER BY total_experiments DESC, full_name
-    """
-    rows = DatabaseManager.execute_query(sql, (session['user_id'],)) or []
-    return _render_generic("Студенти и број на извршени експерименти", rows)
-
-
-@app.route('/reports/adv/equipment_usage')
-@require_login('teacher')
-def reports_adv_equipment_usage():
-    sql = """
-        SELECT 
-            le.equipment_name,
-            COUNT(ele.experiment_id) AS usage_count
-        FROM experimentlabequipment ele
-        JOIN labequipment le ON ele.equipment_id = le.equipment_id
-        GROUP BY le.equipment_name
-        ORDER BY usage_count DESC, le.equipment_name
-    """
-    rows = DatabaseManager.execute_query(sql) or []
-    return _render_generic("Користеност на лабораториска опрема", rows)
-
-
-@app.route('/reports/adv/students_experiments_detailed')
-@require_login('teacher')
-def reports_adv_students_experiments_detailed():
-    sql = """
-        SELECT 
-            s.student_id,
-            u.user_name || ' ' || u.user_surname AS full_name,
-            e.experiment_id,
-            e.result,
-            up.participation_timestamp AS participation_time
-        FROM student s
-        JOIN "User" u ON s.student_id = u.user_id
-        JOIN userparticipatesinexperiment up ON s.student_id = up.user_id
-        JOIN experiment e ON up.experiment_id = e.experiment_id
-        WHERE s.teacher_id = %s
-        ORDER BY u.user_name, up.participation_timestamp DESC
-    """
-    rows = DatabaseManager.execute_query(sql, (session['user_id'],)) or []
-    return _render_generic("Детален извештај: студенти и експерименти", rows)
-
-
-@app.route('/reports/adv/experiment_participants')
-@require_login('teacher')
-def reports_adv_experiment_participants():
-    experiment_id = request.args.get('experiment_id', type=int)
-    if not experiment_id:
-        exps = DatabaseManager.execute_query(
-            "SELECT experiment_id, result FROM experiment ORDER BY experiment_id DESC"
-        ) or []
-        return render_template('reports/experiment_participants.html', experiments=exps)
-
-    sql = """
-        SELECT 
-            s.student_id,
-            u.user_name || ' ' || u.user_surname AS full_name,
-            e.experiment_id,
-            e.result
-        FROM student s
-        JOIN "User" u ON s.student_id = u.user_id
-        JOIN userparticipatesinexperiment up ON s.student_id = up.user_id
-        JOIN experiment e ON up.experiment_id = e.experiment_id
-        WHERE s.teacher_id = %s AND e.experiment_id = %s
-        ORDER BY u.user_name
-    """
-    rows = DatabaseManager.execute_query(sql, (session['user_id'], experiment_id)) or []
-    return _render_generic(f"Студенти кои го извршиле експеримент #{experiment_id}", rows)
-
-
-@app.route('/reports/adv/avg_equipment_per_experiment')
-@require_login('teacher')
-def reports_adv_avg_equipment_per_experiment():
-    sql = """
-        SELECT 
-            COALESCE(AVG(instrument_count), 0) AS average_lab_equipment_per_experiment
-        FROM (
-            SELECT e.experiment_id, COUNT(ele.equipment_id) AS instrument_count
-            FROM experiment e
-            LEFT JOIN experimentlabequipment ele ON e.experiment_id = ele.experiment_id
-            GROUP BY e.experiment_id
-        ) subquery
-    """
-    rows = DatabaseManager.execute_query(sql) or []
-    return _render_generic("Просечен број инструменти по експеримент", rows)
-
-
-@app.route('/reports/adv/most_used_elements')
-@require_login('teacher')
-def reports_adv_most_used_elements():
-    sql = """
-        SELECT 
-            el.element_name,
-            COUNT(r.reaction_id) AS total_uses
-        FROM elements el
-        JOIN reaction r 
-          ON el.element_id = r.element1_id 
-          OR el.element_id = r.element2_id
-        GROUP BY el.element_name
-        ORDER BY total_uses DESC, el.element_name
-    """
-    rows = DatabaseManager.execute_query(sql) or []
-    return _render_generic("Најчесто користени елементи во експерименти", rows)
-
-
-@app.route('/reports/adv/most_performed_experiments')
-@require_login('teacher')
-def reports_adv_most_performed_experiments():
-    sql = """
-        SELECT 
-            e.experiment_id,
-            e.result,
-            COUNT(up.user_id) AS student_participation
-        FROM experiment e
-        LEFT JOIN userparticipatesinexperiment up 
-               ON e.experiment_id = up.experiment_id
-        GROUP BY e.experiment_id, e.result
-        ORDER BY student_participination DESC, e.experiment_id
-    """
-    sql = sql.replace("student_participination", "student_participation")
-    rows = DatabaseManager.execute_query(sql) or []
-    return _render_generic("Најчесто реализирани експерименти", rows)
-
-
-@app.route('/reports/adv/never_participated_students')
-@require_login('teacher')
-def reports_adv_never_participated_students():
-    sql = """
-        SELECT 
-            s.student_id,
-            u.user_name || ' ' || u.user_surname AS full_name
-        FROM student s
-        JOIN "User" u ON s.student_id = u.user_id
-        LEFT JOIN userparticipatesinexperiment up ON s.student_id = up.user_id
-        WHERE s.teacher_id = %s
-          AND up.user_id IS NULL
-        ORDER BY full_name
-    """
-    rows = DatabaseManager.execute_query(sql, (session['user_id'],)) or []
-    return _render_generic("Студенти кои никогаш не учествувале во експерименти", rows)
-
-
-@app.route('/reports/adv/students_below_threshold')
-@require_login('teacher')
-def reports_adv_students_below_threshold():
-    max_exp = request.args.get('max', default=3, type=int)
-    sql = """
-        SELECT 
-            s.student_id,
-            u.user_name || ' ' || u.user_surname AS full_name,
-            COUNT(up.experiment_id) AS total_experiments
-        FROM student s
-        JOIN "User" u ON s.student_id = u.user_id
-        LEFT JOIN userparticipatesinexperiment up ON s.student_id = up.user_id
-        WHERE s.teacher_id = %s
-        GROUP BY s.student_id, full_name
-        HAVING COUNT(up.experiment_id) < %s
-        ORDER BY total_experiments ASC, full_name
-    """
-    rows = DatabaseManager.execute_query(sql, (session['user_id'], max_exp)) or []
-    return _render_generic(f"Студенти со помалку од {max_exp} експерименти", rows)
-
-
-@app.route('/reports/adv/student_views')
-@require_login('teacher')
-def reports_adv_student_views():
-    sql = """
-        SELECT 
-            s.student_id,
-            u.user_name || ' ' || u.user_surname AS full_name,
-            COUNT(DISTINCT ue.element_id)  AS total_elements_viewed,
-            COUNT(DISTINCT ul.equipment_id) AS total_lab_equipment_viewed
-        FROM student s
-        JOIN "User" u ON s.student_id = u.user_id
-        LEFT JOIN userviewselement     ue ON s.student_id = ue.user_id
-        LEFT JOIN userviewslabequipment ul ON s.student_id = ul.user_id
-        WHERE s.teacher_id = %s
-        GROUP BY s.student_id, full_name
-        ORDER BY total_elements_viewed DESC, total_lab_equipment_viewed DESC
-    """
-    rows = DatabaseManager.execute_query(sql, (session['user_id'],)) or []
-    return _render_generic("Прегледи на елементи и опрема по студент", rows)
-
-
-# ------------------------------
-# Run
-# ------------------------------
+    """Мои експерименти - за тековен корисник"""
+    if 'user_id' not in session:
+        return redirect('/login')
+    
+    experiments = DatabaseManager.get_user_experiments(session['user_id'])
+    return render_template('my_experiments.html', 
+                         experiments=experiments, 
+                         user_name=session['user_name'],
+                         user_role=session['role'])
+
 if __name__ == '__main__':
     app.run(debug=True)
Index: utes/api.py
===================================================================
--- routes/api.py	(revision bc45cb5da7c6d8482bc21838561ed96e007b138d)
+++ 	(revision )
@@ -1,35 +1,0 @@
-from flask import Blueprint, request, jsonify
-from utils.database_manager import DatabaseManager
-import logging
-
-log = logging.getLogger(__name__)
-api_bp = Blueprint("api_bp", __name__)
-
-@api_bp.post("/api/simulate-reaction")
-def simulate_reaction():
-    try:
-        payload = request.get_json(silent=True) or {}
-        sym1 = (payload.get("element1") or "").strip()
-        sym2 = (payload.get("element2") or "").strip()
-
-        if not sym1 or not sym2:
-            return jsonify(success=False, message="Недостасуваат елементи."), 400
-        if sym1.upper() == sym2.upper():
-            return jsonify(success=False, message="Ист елемент од двете страни не е дозволено."), 200
-
-        rxn = DatabaseManager.get_reaction_by_symbols(sym1, sym2)
-        if not rxn:
-            return jsonify(success=False, message="Нема дефинирана реакција за оваа комбинација."), 200
-
-        return jsonify(
-            success=True,
-            reaction_id=rxn["reaction_id"],
-            product=rxn["product"],
-            conditions=rxn.get("conditions"),
-            elements=f"{sym1}+{sym2}",
-        ), 200
-
-    except Exception:
-        log.exception("/api/simulate-reaction failed")
-        # важно: враќаме JSON дури и на грешка, не HTML
-        return jsonify(success=False, message="Внатрешна серверска грешка."), 500
Index: utes/reaction_experiment.py
===================================================================
--- routes/reaction_experiment.py	(revision bc45cb5da7c6d8482bc21838561ed96e007b138d)
+++ 	(revision )
@@ -1,48 +1,0 @@
-# SIMLAB/routes/reaction_experiment.py
-import logging
-from flask import Blueprint, request, jsonify
-from utils.database_manager import DatabaseManager
-
-
-bp = Blueprint("reaction_experiment", __name__, url_prefix="/api")
-log = logging.getLogger(__name__)
-
-@bp.post("/reaction-experiment")
-def create_rxn_exp():
-    data = request.get_json(silent=True) or {}
-
-    # задолжителни полиња
-    required = ["teacher_id", "element1_id", "element2_id"]
-    missing = [k for k in required if data.get(k) in (None, "", [])]
-    if missing:
-        return jsonify({"ok": False, "error": f"Недостасува: {', '.join(missing)}"}), 400
-
-    # нормализирај листа од equipment_ids ако ја има
-    equipment_ids = data.get("equipment_ids")
-    if equipment_ids is not None:
-        if not isinstance(equipment_ids, list):
-            return jsonify({"ok": False, "error": "equipment_ids мора да е листа од цели броеви"}), 400
-        try:
-            equipment_ids = [int(x) for x in equipment_ids]
-        except Exception:
-            return jsonify({"ok": False, "error": "equipment_ids содржи невалидни вредности"}), 400
-
-    try:
-        res = DatabaseManager.create_reaction_and_experiment(
-            teacher_id=int(data["teacher_id"]),
-            element1_id=int(data["element1_id"]),
-            element2_id=int(data["element2_id"]),
-            product=data.get("product"),
-            conditions=data.get("conditions"),
-            experiment_result=data.get("experiment_result"),
-            safety_warning=data.get("safety_warning"),
-            equipment_ids=equipment_ids,
-        )
-        if not res:
-            return jsonify({"ok": False, "error": "Креирањето не успеа"}), 500
-
-        return jsonify({"ok": True, **res}), 201
-
-    except Exception:
-        log.exception("create_rxn_exp failed")
-        return jsonify({"ok": False, "error": "Внатрешна грешка"}), 500
Index: utes/virtual_lab.py
===================================================================
--- routes/virtual_lab.py	(revision bc45cb5da7c6d8482bc21838561ed96e007b138d)
+++ 	(revision )
@@ -1,121 +1,0 @@
-# routes/virtual_lab.py
-from flask import Blueprint, render_template, request, jsonify, session
-from utils.database_manager import DatabaseManager  # <-- ако е на друго место, прилагоди
-
-bp = Blueprint("virtual_lab", __name__)
-
-# Паге со симулацијата
-@bp.get("/virtual-lab")
-def virtual_lab_page():
-    elements = DatabaseManager.get_all_elements() or []
-    return render_template("virtual_labaratory.html", elements=elements)
-
-# Хелпери
-def _find_reaction(e1_id: int, e2_id: int):
-    sql = """
-      SELECT r.*,
-             e1.symbol AS e1_symbol, e1.element_name AS e1_name, e1.hazard_type AS e1_hz,
-             e2.symbol AS e2_symbol, e2.element_name AS e2_name, e2.hazard_type AS e2_hz
-        FROM reaction r
-        JOIN elements e1 ON r.element1_id = e1.element_id
-        JOIN elements e2 ON r.element2_id = e2.element_id
-       WHERE (r.element1_id = %s AND r.element2_id = %s)
-          OR (r.element1_id = %s AND r.element2_id = %s)
-       LIMIT 1
-    """
-    rows = DatabaseManager.execute_query(sql, (e1_id, e2_id, e2_id, e1_id)) or []
-    return rows[0] if rows else None
-
-def _get_element(el_id: int):
-    return DatabaseManager.get_element_by_id(el_id) or {}
-
-def _hz_factor(hz: str | None) -> float:
-    if not hz:
-        return 1.0
-    hz = hz.lower()
-    if "flamm" in hz or "оган" in hz:
-        return 1.4
-    if "corros" in hz or "кисел" in hz or "короз" in hz:
-        return 1.25
-    if "toxic" in hz or "токс" in hz:
-        return 1.2
-    return 1.0
-
-def _simulate_curve(reactivity: float, duration_sec=60):
-    amb, k, cool = 25.0, 0.9, 0.05
-    t, T = 0, amb
-    times, temps = [], []
-    while t <= duration_sec:
-        times.append(t); temps.append(T)
-        dT = k*reactivity - cool*(T - amb)
-        T = T + dT
-        t += 1
-    return times, temps
-
-# API: симулација
-@bp.post("/api/simulate-reaction")
-def simulate_reaction():
-    data = request.get_json(force=True)
-    e1 = int(data.get("element1_id"))
-    e2 = int(data.get("element2_id"))
-    amount = float(data.get("amount") or 1.0)
-
-    rxn = _find_reaction(e1, e2)
-    el1 = _get_element(e1)
-    el2 = _get_element(e2)
-
-    # едноставен (дидактички) модел за реактивност
-    an1 = el1.get("atomic_number") or 10
-    an2 = el2.get("atomic_number") or 10
-    hz = _hz_factor(el1.get("hazard_type")) * _hz_factor(el2.get("hazard_type")) * (1.1 if rxn else 1.0)
-    reactivity = (an1 + an2) / 5.0 * hz * amount
-
-    times, temps = _simulate_curve(reactivity, duration_sec=60)
-
-    return jsonify({
-        "ok": True,
-        "reaction": {
-            "found": bool(rxn),
-            "reaction_id": rxn.get("reaction_id") if rxn else None,
-            "product": rxn.get("product") if rxn else None,
-            "conditions": rxn.get("conditions") if rxn else None,
-            "e1": {"id": e1, "symbol": el1.get("symbol"), "name": el1.get("element_name")},
-            "e2": {"id": e2, "symbol": el2.get("symbol"), "name": el2.get("element_name")},
-        },
-        "series": {"time": times, "temperature": temps}
-    })
-
-# API: зачувување експеримент + учество
-@bp.post("/save-experiment")
-def save_experiment():
-    """
-    Очекува JSON: reaction_id, result, safety_warning
-    Креира ред во experiment и логира во userparticipatesinexperiment за тековниот user.
-    """
-    data = request.get_json(force=True)
-    reaction_id = int(data.get("reaction_id"))
-    result = data.get("result") or "Виртуелна симулација"
-    safety = data.get("safety_warning") or None
-
-    # user од сесија (прилагоди на твојата апликација)
-    user = session.get("user") or {}
-    user_id = user.get("user_id")
-
-    if not user_id:
-        return jsonify({"success": False, "message": "Немаш активна сесија."}), 401
-
-    me = DatabaseManager.get_user_by_id(user_id)  # дава role и teacher_id ако е студент
-    if not me:
-        return jsonify({"success": False, "message": "Корисникот не е најден."}), 400
-
-    # teacher_id за experiment: ако си teacher -> самиот, ако си student -> неговиот teacher
-    teacher_id = me.get("user_id") if me.get("role") == "teacher" else me.get("teacher_id")
-    if not teacher_id:
-        return jsonify({"success": False, "message": "Недостасува teacher_id за експеримент."}), 400
-
-    exp_id = DatabaseManager.insert_experiment(teacher_id, reaction_id, result, safety)
-    if not exp_id:
-        return jsonify({"success": False, "message": "Креирањето експеримент не успеа."}), 500
-
-    DatabaseManager.track_experiment_participation(user_id, exp_id)
-    return jsonify({"success": True, "experiment_id": exp_id})
Index: templates/add_element.html
===================================================================
--- templates/add_element.html	(revision bc45cb5da7c6d8482bc21838561ed96e007b138d)
+++ templates/add_element.html	(revision 14fe7c26eea0eb44ab5dbcea992e11378a7f6d4e)
@@ -3,141 +3,74 @@
 
 {% block content %}
-<style>
-  .hero{background:linear-gradient(135deg,#6a11cb,#2575fc);color:#fff;border-radius:18px;padding:18px 22px;display:flex;align-items:center;justify-content:space-between;gap:12px}
-  .pill{width:54px;height:54px;border-radius:14px;background:#ffffff22;display:flex;align-items:center;justify-content:center;font-weight:900;font-size:20px}
-  .type-badge{background:#ffffff22;color:#fff;border-radius:999px;padding:6px 12px;font-weight:600;letter-spacing:.2px}
-  .wrap{display:grid;grid-template-columns:1.35fr .85fr;gap:18px;margin-top:16px}
-  @media (max-width: 992px){.wrap{grid-template-columns:1fr}}
-  .card.block{border:0;border-radius:16px;box-shadow:0 12px 28px rgba(0,0,0,.08)}
-  .section-title{font-weight:800;margin-bottom:.35rem}
-  .muted{color:#6c757d}
-  .chip{display:inline-flex;align-items:center;gap:6px;padding:6px 10px;margin:4px;border-radius:999px;background:#eef2ff;color:#3f51b5;font-weight:600;cursor:pointer;border:1px solid rgba(63,81,181,.25);user-select:none;font-size:.9rem}
-  .sticky-actions{position:sticky;bottom:0;background:#fff;border-top:1px solid #eef1f4;padding:12px 0;margin-top:8px}
-</style>
-
-<div class="hero">
-  <div class="d-flex align-items-center gap-3">
-    <div class="pill" id="sym-pill">—</div>
-    <div>
-      <h2 class="mb-0 text-truncate">Додај нов хемиски елемент</h2>
-      <div class="small opacity-75">Внеси основни податоци и безбедност</div>
+<div class="row justify-content-center">
+    <div class="col-md-8">
+        <div class="card">
+            <div class="card-header">
+                <h3>Додај нов хемиски елемент</h3>
+            </div>
+            <div class="card-body">
+                {% if error %}
+                    <div class="alert alert-danger">{{ error }}</div>
+                {% endif %}
+                
+                <form method="POST">
+                    <div class="row">
+                        <div class="col-md-6">
+                            <div class="mb-3">
+                                <label for="symbol" class="form-label">Симбол</label>
+                                <input type="text" class="form-control" name="symbol" maxlength="2" required>
+                            </div>
+                        </div>
+                        <div class="col-md-6">
+                            <div class="mb-3">
+                                <label for="name" class="form-label">Име на елемент</label>
+                                <input type="text" class="form-control" name="name" required>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="row">
+                        <div class="col-md-6">
+                            <div class="mb-3">
+                                <label for="atomic_number" class="form-label">Атомски број</label>
+                                <input type="number" class="form-control" name="atomic_number" min="1" max="118" required>
+                            </div>
+                        </div>
+                        <div class="col-md-6">
+                            <div class="mb-3">
+                                <label for="atomic_weight" class="form-label">Атомска маса</label>
+                                <input type="number" step="0.001" class="form-control" name="atomic_weight" required>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="row">
+                        <div class="col-md-6">
+                            <div class="mb-3">
+                                <label for="melting_point" class="form-label">Точка на топење (°C)</label>
+                                <input type="number" step="0.1" class="form-control" name="melting_point">
+                            </div>
+                        </div>
+                        <div class="col-md-6">
+                            <div class="mb-3">
+                                <label for="boiling_point" class="form-label">Точка на вриење (°C)</label>
+                                <input type="number" step="0.1" class="form-control" name="boiling_point">
+                            </div>
+                        </div>
+                    </div>
+                    <div class="mb-3">
+                        <label for="hazard_type" class="form-label">Тип на опасност</label>
+                        <input type="text" class="form-control" name="hazard_type" maxlength="50" placeholder="Корозивен, Токсичен, Експлозивен...">
+                        <small class="form-text text-muted">Kраток опис на ризикот</small>
+                    </div>
+                    <div class="mb-3">
+                        <label for="description" class="form-label">Опис</label>
+                        <textarea class="form-control" name="description" rows="3"></textarea>
+                    </div>
+                    
+                    <button type="submit" class="btn btn-success">Додај елемент</button>
+                    <a href="/dashboard" class="btn btn-secondary">Откажи</a>
+                </form>
+            </div>
+        </div>
     </div>
-  </div>
-  <div class="d-flex align-items-center gap-2 flex-wrap">
-    <span class="type-badge">Полиња со <b>*</b> се задолжителни</span>
-    <a href="/elements" class="btn btn-light btn-sm fw-semibold"><i class="bi bi-list"></i> Листа</a>
-  </div>
 </div>
-
-<div class="wrap">
-  <!-- Лево: форма -->
-  <div class="card block">
-    <div class="card-body">
-      <h5 class="section-title"><i class="bi bi-plus-circle"></i> Податоци за елемент</h5>
-      {% if error %}<div class="alert alert-danger">{{ error }}</div>{% endif %}
-
-      <form method="POST" id="element-form" novalidate>
-        <div class="row g-3">
-          <div class="col-md-4">
-            <label class="form-label">Симбол *</label>
-            <input type="text" class="form-control" name="symbol" id="symbol"
-                   maxlength="3" required pattern="^[A-Za-z]{1,3}$" placeholder="Na, Cl, Al...">
-            <div class="form-text">1–3 букви, ќе се запише како големи.</div>
-          </div>
-          <div class="col-md-8">
-            <label class="form-label">Име на елемент *</label>
-            <input type="text" class="form-control" name="name" id="el-name" required placeholder="Натриум">
-          </div>
-
-          <div class="col-md-4">
-            <label class="form-label">Атомски број *</label>
-            <input type="number" class="form-control" name="atomic_number" id="el-num" min="1" max="118" required>
-          </div>
-          <div class="col-md-4">
-            <label class="form-label">Атомска маса *</label>
-            <div class="input-group">
-              <input type="number" step="0.0001" class="form-control" name="atomic_weight" id="el-weight" required>
-              <span class="input-group-text">u</span>
-            </div>
-          </div>
-          <div class="col-md-4"></div>
-
-          <div class="col-md-6">
-            <label class="form-label">Точка на топење (°C)</label>
-            <input type="number" step="0.1" class="form-control" name="melting_point" placeholder="опц.">
-          </div>
-          <div class="col-md-6">
-            <label class="form-label">Точка на вриење (°C)</label>
-            <input type="number" step="0.1" class="form-control" name="boiling_point" placeholder="опц.">
-          </div>
-
-          <div class="col-12">
-            <label class="form-label">Тип на опасност</label>
-            <input type="text" class="form-control" name="hazard_type" id="hazard" maxlength="50" placeholder="Нема опасност / Корозивно / Токсично ...">
-            <div class="form-text">Брз избор:</div>
-            <div>
-              <span class="chip" onclick="pickHazard('Нема опасност')">✔ Нема опасност</span>
-              <span class="chip" onclick="pickHazard('Корозивно')">⚠ Корозивно</span>
-              <span class="chip" onclick="pickHazard('Токсично')">☠ Токсично</span>
-              <span class="chip" onclick="pickHazard('Запалливо')">🔥 Запалливо</span>
-              <span class="chip" onclick="pickHazard('Иритант')">❗ Иритант</span>
-            </div>
-          </div>
-
-          <div class="col-12">
-            <label class="form-label">Опис</label>
-            <textarea class="form-control" name="description" rows="4" placeholder="Краток опис, својства, забелешки..."></textarea>
-          </div>
-        </div>
-
-        <div class="sticky-actions d-flex justify-content-between align-items-center">
-          <a href="/elements" class="btn btn-outline-secondary"><i class="bi bi-arrow-left"></i> Откажи</a>
-          <button type="submit" class="btn btn-success"><i class="bi bi-check2-circle"></i> Додај елемент</button>
-        </div>
-      </form>
-    </div>
-  </div>
-
-  <!-- Десно: жив преглед -->
-  <div class="card block">
-    <div class="card-body">
-      <h6 class="section-title"><i class="bi bi-magic"></i> Жив преглед</h6>
-      <div class="d-flex align-items-center gap-3 mb-3">
-        <div class="pill" id="preview-pill">—</div>
-        <div>
-          <div class="fw-bold" id="preview-name">Име на елемент</div>
-          <div class="small muted">№ <span id="preview-atomic">—</span> • <span id="preview-weight">—</span> u</div>
-        </div>
-      </div>
-      <hr class="my-3"/>
-      <h6 class="section-title"><i class="bi bi-lightbulb"></i> Совети</h6>
-      <ul class="small mb-0">
-        <li>Провери уникатност на симболот (Na ≠ N).</li>
-        <li>Атомската маса запиши со децимали (на пр. 22.9898).</li>
-      </ul>
-    </div>
-  </div>
-</div>
-
-<script>
-  const sym = document.getElementById('symbol');
-  const nameEl = document.getElementById('el-name');
-  const numEl = document.getElementById('el-num');
-  const wEl   = document.getElementById('el-weight');
-
-  function updatePreview(){
-    const s = sym.value || '—';
-    document.getElementById('sym-pill').textContent = s;
-    document.getElementById('preview-pill').textContent = s;
-    document.getElementById('preview-name').textContent = nameEl.value || 'Име на елемент';
-    document.getElementById('preview-atomic').textContent = numEl.value || '—';
-    document.getElementById('preview-weight').textContent = wEl.value || '—';
-  }
-  function pickHazard(txt){ const hz=document.getElementById('hazard'); hz.value=txt; hz.focus(); }
-  sym.addEventListener('input', ()=>{ sym.value = sym.value.toUpperCase(); updatePreview(); });
-  nameEl.addEventListener('input', updatePreview);
-  numEl.addEventListener('input', updatePreview);
-  wEl.addEventListener('input', updatePreview);
-  updatePreview();
-</script>
 {% endblock %}
Index: templates/add_equipment.html
===================================================================
--- templates/add_equipment.html	(revision bc45cb5da7c6d8482bc21838561ed96e007b138d)
+++ templates/add_equipment.html	(revision 14fe7c26eea0eb44ab5dbcea992e11378a7f6d4e)
@@ -3,98 +3,43 @@
 
 {% block content %}
-<style>
-  .hero{background:linear-gradient(135deg,#6a11cb,#2575fc);color:#fff;border-radius:18px;padding:18px 22px;display:flex;align-items:center;justify-content:space-between;gap:12px}
-  .pill{width:42px;height:42px;border-radius:12px;background:#ffffff22;display:flex;align-items:center;justify-content:center;font-size:20px}
-  .type-badge{background:#ffffff22;color:#fff;border-radius:999px;padding:6px 12px;font-weight:600;letter-spacing:.2px}
-  .wrap{display:grid;grid-template-columns:1.35fr .85fr;gap:18px;margin-top:16px}
-  @media (max-width: 992px){.wrap{grid-template-columns:1fr}}
-  .card.block{border:0;border-radius:16px;box-shadow:0 12px 28px rgba(0,0,0,.08)}
-  .section-title{font-weight:800;margin-bottom:.35rem}
-  .muted{color:#6c757d}
-  .chip{display:inline-flex;align-items:center;gap:6px;padding:6px 10px;margin:4px;border-radius:999px;background:#eef2ff;color:#3f51b5;font-weight:600;cursor:pointer;border:1px solid rgba(63,81,181,.25);user-select:none;font-size:.9rem}
-  .sticky-actions{position:sticky;bottom:0;background:#fff;border-top:1px solid #eef1f4;padding:12px 0;margin-top:8px}
-</style>
-
-<div class="hero">
-  <div class="d-flex align-items-center gap-3">
-    <div class="pill"><i class="bi bi-tools"></i></div>
-    <div>
-      <h2 class="mb-0 text-truncate">Додај нова лабораториска опрема</h2>
-      <div class="small opacity-75">Име, тип, опис и безбедност</div>
+<div class="row justify-content-center">
+    <div class="col-md-8">
+        <div class="card">
+            <div class="card-header">
+                <h3>Додај нова лабораториска опрема</h3>
+            </div>
+            <div class="card-body">
+                {% if error %}
+                    <div class="alert alert-danger">{{ error }}</div>
+                {% endif %}
+                
+                <form method="POST">
+                    <div class="mb-3">
+                        <label for="name" class="form-label">Име на опремата</label>
+                        <input type="text" class="form-control" name="name" maxlength="50" required>
+                        <small class="form-text text-muted">Максимум 50 карактери</small>
+                    </div>
+                    
+                    <div class="mb-3">
+                        <label for="type" class="form-label">Тип на опрема</label>
+                        <input type="text" class="form-control" name="type" maxlength="50" placeholder="Стаклена опрема, Мерни инструменти...">
+                    </div>
+                    
+                    <div class="mb-3">
+                        <label for="description" class="form-label">Опис</label>
+                        <textarea class="form-control" name="description" rows="3" placeholder="Детален опис за употребата на опремата..."></textarea>
+                    </div>
+                    
+                    <div class="mb-3">
+                        <label for="safety_info" class="form-label">Безбедносни информации</label>
+                        <textarea class="form-control" name="safety_info" rows="2" placeholder="Безбедносни мерки при користење..."></textarea>
+                    </div>
+                    
+                    <button type="submit" class="btn btn-success">Додај опрема</button>
+                    <a href="/dashboard" class="btn btn-secondary">Откажи</a>
+                </form>
+            </div>
+        </div>
     </div>
-  </div>
-  <div class="d-flex align-items-center gap-2">
-    <span class="type-badge">Полиња со <b>*</b> се задолжителни</span>
-    <a href="/equipment" class="btn btn-light btn-sm fw-semibold"><i class="bi bi-list"></i> Листа</a>
-  </div>
 </div>
-
-<div class="wrap">
-  <!-- Лево: форма -->
-  <div class="card block">
-    <div class="card-body">
-      <h5 class="section-title"><i class="bi bi-plus-circle"></i> Податоци за опрема</h5>
-      {% if error %}<div class="alert alert-danger">{{ error }}</div>{% endif %}
-
-      <form method="POST" id="equip-form" novalidate>
-        <div class="mb-3">
-          <label class="form-label">Име на опремата *</label>
-          <input type="text" class="form-control" name="name" id="eq-name" maxlength="50" required placeholder="Пипета, Термометар...">
-          <small class="form-text text-muted">Максимум 50 карактери.</small>
-        </div>
-
-        <div class="mb-2">
-          <label class="form-label">Тип на опрема</label>
-          <input type="text" class="form-control" name="type" id="eq-type" maxlength="50" placeholder="Стакларија, Мерење, Загревање...">
-          <div class="form-text">Брз избор:</div>
-          <div>
-            <span class="chip" onclick="pickType('Стакларија')">Стакларија</span>
-            <span class="chip" onclick="pickType('Мерење')">Мерење</span>
-            <span class="chip" onclick="pickType('Загревање')">Загревање</span>
-            <span class="chip" onclick="pickType('Безбедност')">Безбедност</span>
-            <span class="chip" onclick="pickType('Општа')">Општа</span>
-          </div>
-        </div>
-
-        <div class="mb-3">
-          <label class="form-label">Опис</label>
-          <textarea class="form-control" name="description" id="eq-desc" rows="4" placeholder="Краток опис, употреба, напомени..."></textarea>
-        </div>
-
-        <div class="mb-1">
-          <label class="form-label">Безбедносни информации</label>
-          <textarea class="form-control" name="safety_info" id="eq-safe" rows="3" placeholder="ППЕ, чистење, складирање..."></textarea>
-        </div>
-
-        <div class="sticky-actions d-flex justify-content-between align-items-center">
-          <a href="/equipment" class="btn btn-outline-secondary"><i class="bi bi-arrow-left"></i> Откажи</a>
-          <button type="submit" class="btn btn-success"><i class="bi bi-check2-circle"></i> Додај опрема</button>
-        </div>
-      </form>
-    </div>
-  </div>
-
-  <!-- Десно: жив преглед / брзи факти -->
-  <div class="card block">
-    <div class="card-body">
-      <h6 class="section-title"><i class="bi bi-magic"></i> Жив преглед</h6>
-      <div class="mb-2"><b>Име:</b> <span id="prev-name" class="fw-semibold">—</span></div>
-      <div class="mb-2"><b>Тип:</b> <span id="prev-type" class="fw-semibold">—</span></div>
-
-      <hr class="my-3"/>
-      <h6 class="section-title"><i class="bi bi-lightbulb"></i> Совети</h6>
-      <ul class="small mb-0">
-        <li>Конзистентен тип (за филтри и извештаи).</li>
-        <li>Во опис: употреба + специфични напомени.</li>
-        <li>Безбедност: кратко и применливо (ППЕ, чистење, складирање).</li>
-      </ul>
-    </div>
-  </div>
-</div>
-
-<script>
-  function pickType(txt){ const t=document.getElementById('eq-type'); t.value=txt; t.focus(); document.getElementById('prev-type').textContent=txt; }
-  document.getElementById('eq-name').addEventListener('input', e=>{ document.getElementById('prev-name').textContent=e.target.value||'—'; });
-  document.getElementById('eq-type').addEventListener('input', e=>{ document.getElementById('prev-type').textContent=e.target.value||'—'; });
-</script>
 {% endblock %}
Index: templates/add_reaction.html
===================================================================
--- templates/add_reaction.html	(revision bc45cb5da7c6d8482bc21838561ed96e007b138d)
+++ templates/add_reaction.html	(revision 14fe7c26eea0eb44ab5dbcea992e11378a7f6d4e)
@@ -1,193 +1,67 @@
 {% extends "base.html" %}
-{% block title %}Додај нова реакција{% endblock %}
+{% block title %}Додај реакција{% endblock %}
 
 {% block content %}
-<style>
-  .hero{background:linear-gradient(135deg,#6a11cb,#2575fc);color:#fff;border-radius:18px;padding:18px 22px;display:flex;align-items:center;justify-content:space-between;gap:12px}
-  .pill{width:48px;height:48px;border-radius:12px;background:#ffffff22;display:flex;align-items:center;justify-content:center;font-size:20px}
-  .type-badge{background:#ffffff22;color:#fff;border-radius:999px;padding:6px 12px;font-weight:600}
-  .wrap{display:grid;grid-template-columns:1.2fr .8fr;gap:18px;margin-top:16px}
-  @media (max-width: 992px){.wrap{grid-template-columns:1fr}}
-  .card.block{border:0;border-radius:16px;box-shadow:0 12px 28px rgba(0,0,0,.08)}
-  .section-title{font-weight:800;margin-bottom:.35rem}
-  .chip{display:inline-flex;align-items:center;gap:6px;padding:6px 10px;margin:4px;border-radius:999px;background:#eef2ff;color:#3f51b5;font-weight:600;cursor:pointer;border:1px solid rgba(63,81,181,.25);user-select:none;font-size:.9rem}
-  .eq-preview{font-weight:800;font-size:18px;background:#f8f9fa;border:1px solid #edf0f4;border-radius:12px;padding:10px 12px}
-  .sticky-actions{position:sticky;bottom:0;background:#fff;border-top:1px solid #eef1f4;padding:12px 0;margin-top:8px}
-  .equip-grid{max-height:340px;overflow:auto;border:1px solid #eef1f4;border-radius:12px;padding:10px}
-</style>
-
-<!-- HERO -->
-<div class="hero">
-  <div class="d-flex align-items-center gap-3">
-    <div class="pill"><i class="bi bi-diagram-3"></i></div>
-    <div>
-      <h2 class="mb-0 text-truncate">Додај нова реакција</h2>
-      <div class="small opacity-75">Реактанти, услови и поврзан експеримент</div>
+<div class="row justify-content-center">
+    <div class="col-md-8">
+        <div class="card">
+            <div class="card-header">
+                <h3>Додај нова хемиска реакција</h3>
+            </div>
+            <div class="card-body">
+                {% if error %}
+                    <div class="alert alert-danger">{{ error }}</div>
+                {% endif %}
+                
+                <form method="POST">
+                    <div class="row">
+                        <div class="col-md-6">
+                            <div class="mb-3">
+                                <label for="element1_id" class="form-label">Првин елемент</label>
+                                <select class="form-select" name="element1_id" required>
+                                    <option value="">Избери првин елемент</option>
+                                    {% for element in elements %}
+                                    <option value="{{ element.element_id }}">{{ element.symbol }} - {{ element.element_name }}</option>
+                                    {% endfor %}
+                                </select>
+                            </div>
+                        </div>
+                        <div class="col-md-6">
+                            <div class="mb-3">
+                                <label for="element2_id" class="form-label">Втор елемент</label>
+                                <select class="form-select" name="element2_id" required>
+                                    <option value="">Избери втор елемент</option>
+                                    {% for element in elements %}
+                                    <option value="{{ element.element_id }}">{{ element.symbol }} - {{ element.element_name }}</option>
+                                    {% endfor %}
+                                </select>
+                            </div>
+                        </div>
+                    </div>
+                    
+                    <div class="mb-3">
+                        <label for="product" class="form-label">Продукт на реакцијата</label>
+                        <input type="text" class="form-control" name="product" maxlength="50" 
+                               placeholder="H2O, NaCl, CO2..." required>
+                        <small class="form-text text-muted">Пример: H2O (Вода), NaCl (Сол)</small>
+                    </div>
+                    
+                    <div class="mb-3">
+                        <label for="conditions" class="form-label">Услови за реакцијата</label>
+                        <textarea class="form-control" name="conditions" rows="3" 
+                                  placeholder="Опишете ги условите потребни за реакцијата (температура, притисок, катализатор...)"></textarea>
+                        <small class="form-text text-muted">Пример: Нормална температура, присуство на катализатор</small>
+                    </div>
+                    
+                    <div class="alert alert-info">
+                        <strong>Напомена:</strong> Оваа реакција ќе биде достапна за сите студенти во виртуелната лабораторија.
+                    </div>
+                    
+                    <button type="submit" class="btn btn-success">Додај реакција</button>
+                    <a href="/reactions" class="btn btn-secondary">Откажи</a>
+                </form>
+            </div>
+        </div>
     </div>
-  </div>
-  <div class="d-flex align-items-center gap-2">
-    <span class="type-badge">Полиња со <b>*</b> се задолжителни</span>
-    <a href="/reactions" class="btn btn-light btn-sm fw-semibold"><i class="bi bi-list"></i> Сите реакции</a>
-  </div>
 </div>
-
-<div class="wrap">
-  <!-- ЛЕВО: Реактанти + Реакција -->
-  <div class="card block">
-    <div class="card-body">
-      {% if error %}<div class="alert alert-danger">{{ error }}</div>{% endif %}
-      <h5 class="section-title"><i class="bi bi-flask"></i> Реактанти</h5>
-
-      <form method="POST" id="add-reaction-form" novalidate>
-        <div class="row g-3">
-          <div class="col-md-6">
-            <label class="form-label">Прв елемент *</label>
-            <select class="form-select" name="element1_id" id="element1_id" required>
-              <option value="">-- Избери елемент --</option>
-              {% for element in elements %}
-              <option value="{{ element.element_id }}"
-                      data-symbol="{{ element.symbol }}"
-                      data-name="{{ element.element_name }}">
-                {{ element.symbol }} — {{ element.element_name }}
-              </option>
-              {% endfor %}
-            </select>
-          </div>
-          <div class="col-md-6">
-            <label class="form-label">Втор елемент *</label>
-            <select class="form-select" name="element2_id" id="element2_id" required>
-              <option value="">-- Избери елемент --</option>
-              {% for element in elements %}
-              <option value="{{ element.element_id }}"
-                      data-symbol="{{ element.symbol }}"
-                      data-name="{{ element.element_name }}">
-                {{ element.symbol }} — {{ element.element_name }}
-              </option>
-              {% endfor %}
-            </select>
-          </div>
-
-          <div class="col-12">
-            <label class="form-label">Преглед на равенка</label>
-            <div class="eq-preview" id="eqPreview">A + B → ___</div>
-          </div>
-
-          <div class="col-md-6">
-            <label class="form-label">Продукт (формула)</label>
-            <input type="text" class="form-control" name="product" id="product" placeholder="H2O, NaCl, CO2">
-          </div>
-          <div class="col-md-6">
-            <label class="form-label">Услови</label>
-            <textarea class="form-control" name="conditions" id="conditions" rows="1" placeholder="Стандардни услови">Стандардни услови</textarea>
-            <div class="form-text">Дополнителни параметри подолу ќе се додадат автоматски.</div>
-          </div>
-
-          <div class="col-md-4">
-            <input type="text" class="form-control" name="temperature" id="temperature" placeholder="Темп. °C">
-          </div>
-          <div class="col-md-4">
-            <input type="text" class="form-control" name="pressure" id="pressure" placeholder="Притисок (atm)">
-          </div>
-          <div class="col-md-4">
-            <input type="text" class="form-control" name="catalyst" id="catalyst" placeholder="Катализатор">
-          </div>
-
-          <div class="col-12">
-            <div class="form-text">Брзи услови:</div>
-            <div>
-              <span class="chip" onclick="addCond('Собна температура')">Собна температура</span>
-              <span class="chip" onclick="addCond('Суви услови')">Суви услови</span>
-              <span class="chip" onclick="addCond('Инертна атмосфера (Ar)')">Инертна атмосфера (Ar)</span>
-              <span class="chip" onclick="addCond('Светлина')">Светлина</span>
-              <span class="chip" onclick="addCond('Без катализатор')">Без катализатор</span>
-            </div>
-          </div>
-        </div>
-
-        <hr class="my-4"/>
-
-        <h5 class="section-title"><i class="bi bi-journal-text"></i> Експеримент</h5>
-        <div class="mb-3">
-          <label class="form-label">Опис на експериментот</label>
-          <textarea class="form-control" name="experiment_result" id="experiment_result" rows="3"
-                    placeholder="Чекори, забелешки, очекуван тек..."></textarea>
-        </div>
-
-        <h5 class="section-title mt-3"><i class="bi bi-shield-exclamation"></i> Безбедност</h5>
-        <div class="mb-3">
-          <label class="form-label">Безбедносни предупредувања</label>
-          <textarea class="form-control" name="safety_warning" id="safety_warning" rows="2">Стандардни безбедносни мерки</textarea>
-        </div>
-
-        <h5 class="section-title mt-3"><i class="bi bi-tools"></i> Лабораториска опрема</h5>
-        <div class="equip-grid">
-          {% for item in equipment %}
-          <div class="form-check">
-            <input class="form-check-input" type="checkbox" name="equipment_ids" id="eq{{ item.equipment_id }}" value="{{ item.equipment_id }}">
-            <label class="form-check-label" for="eq{{ item.equipment_id }}">
-              {{ item.equipment_name }}{% if item.type %} ({{ item.type }}){% endif %}
-            </label>
-          </div>
-          {% endfor %}
-        </div>
-
-        <div class="alert alert-info mt-3">
-          <strong>Напомена:</strong> Со креирање на реакција, автоматски се додава и експеримент кој студентите можат да го извршуваат во виртуелната лабораторија.
-        </div>
-
-        <div class="sticky-actions d-flex justify-content-between align-items-center">
-          <a href="/reactions" class="btn btn-outline-secondary"><i class="bi bi-arrow-left"></i> Откажи</a>
-          <button type="submit" class="btn btn-success"><i class="bi bi-plus-circle"></i> Креирај</button>
-        </div>
-      </form>
-    </div>
-  </div>
-
-  <!-- ДЕСНО: Помош и брз преглед -->
-  <div class="card block">
-    <div class="card-body">
-      <h6 class="section-title"><i class="bi bi-magic"></i> Брз преглед</h6>
-      <div class="eq-preview" id="eqPreviewSide">A + B → ___</div>
-
-      <hr class="my-3"/>
-      <h6 class="section-title"><i class="bi bi-lightbulb"></i> Совети</h6>
-      <ul class="small mb-0">
-        <li>Елементите мора да бидат различни.</li>
-        <li>„Темп./Притисок/Катализатор“ ќе се додадат кон <em>Услови</em> на backend (не дуплирај рачно).</li>
-        <li>Продуктот може да остане празен ако е непознат.</li>
-      </ul>
-    </div>
-  </div>
-</div>
-
-<script>
-  function getSelText(sel){ const o=sel.options[sel.selectedIndex]; return o? (o.dataset.symbol||''):''; }
-  function updateEq(){
-    const a = getSelText(document.getElementById('element1_id')) || 'A';
-    const b = getSelText(document.getElementById('element2_id')) || 'B';
-    const p = (document.getElementById('product').value||'___').trim() || '___';
-    const eq = `${a} + ${b} → ${p}`;
-    document.getElementById('eqPreview').textContent = eq;
-    document.getElementById('eqPreviewSide').textContent = eq;
-  }
-  function addCond(txt){
-    const ta = document.getElementById('conditions');
-    const val = ta.value.trim();
-    ta.value = val ? (val + '; ' + txt) : txt;
-    ta.focus();
-  }
-  function validateDiff(){
-    const e1=document.getElementById('element1_id'), e2=document.getElementById('element2_id');
-    if(e1.value && e2.value && e1.value===e2.value){
-      alert('Мора да изберете два различни елементи!');
-      e2.value=''; updateEq(); return false;
-    }
-    return true;
-  }
-  ['element1_id','element2_id','product'].forEach(id=>{
-    document.getElementById(id).addEventListener('change', ()=>{ validateDiff(); updateEq(); });
-    document.getElementById(id).addEventListener('input',  ()=>{ updateEq(); });
-  });
-  updateEq();
-</script>
 {% endblock %}
Index: templates/base.html
===================================================================
--- templates/base.html	(revision bc45cb5da7c6d8482bc21838561ed96e007b138d)
+++ templates/base.html	(revision 14fe7c26eea0eb44ab5dbcea992e11378a7f6d4e)
@@ -8,38 +8,18 @@
 </head>
 <body>
-    <nav class="navbar navbar-expand-lg navbar-dark bg-dark mb-3 shadow-sm">
-  <div class="container">
-    <a class="navbar-brand fw-bold" href="/">🧪 SIMLAB</a>
-    <button class="navbar-toggler" data-bs-toggle="collapse" data-bs-target="#navMain">
-      <span class="navbar-toggler-icon"></span>
-    </button>
-    <div id="navMain" class="collapse navbar-collapse">
-      <ul class="navbar-nav me-auto">
-        <li class="nav-item"><a class="nav-link" href="/dashboard">Dashboard</a></li>
-        <li class="nav-item"><a class="nav-link" href="/elements">Елементи</a></li>
-        <li class="nav-item"><a class="nav-link" href="/equipment">Опрема</a></li>
-        <li class="nav-item"><a class="nav-link" href="/laboratory">Лабораторија</a></li>
-      </ul>
-      <!-- base.html (во body, веднаш под navbar) -->
-{% with messages = get_flashed_messages(with_categories=true) %}
-  {% if messages %}
-    <div class="container mt-3">
-      {% for category, msg in messages %}
-        <div class="alert alert-{{ category }} alert-dismissible fade show" role="alert">
-          {{ msg }}
-          <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
+    <nav class="navbar navbar-expand-lg navbar-dark bg-primary">
+        <div class="container">
+            <a class="navbar-brand" href="/">🧪 SIMLAB</a>
+            <div class="navbar-nav ms-auto">
+                {% if session.user_id %}
+                    <span class="navbar-text me-3">Добредојде, {{ session.user_name }}</span>
+                    <a class="nav-link" href="/logout">Одјави се</a>
+                {% else %}
+                    <a class="nav-link" href="/login">Најави се</a>
+                    <a class="nav-link" href="/register">Регистрирај се</a>
+                {% endif %}
+            </div>
         </div>
-      {% endfor %}
-    </div>
-  {% endif %}
-{% endwith %}
-
-      <div class="d-flex align-items-center gap-2">
-        <span class="text-white-50 small d-none d-md-inline">{{ session.user_name }}</span>
-        <a class="btn btn-outline-light btn-sm" href="/logout">Одјава</a>
-      </div>
-    </div>
-  </div>
-</nav>
+    </nav>
 
     <div class="container mt-4">
Index: templates/dashboard_student.html
===================================================================
--- templates/dashboard_student.html	(revision bc45cb5da7c6d8482bc21838561ed96e007b138d)
+++ templates/dashboard_student.html	(revision 14fe7c26eea0eb44ab5dbcea992e11378a7f6d4e)
@@ -1,148 +1,86 @@
 {% extends "base.html" %}
-{% block title %}Dashboard · Студент{% endblock %}
+{% block title %}Dashboard - Студент{% endblock %}
 
 {% block content %}
-<style>
-  :root{
-    --grad-1: linear-gradient(135deg,#6a11cb 0%,#2575fc 100%);
-    --grad-2: linear-gradient(135deg,#00c6ff 0%,#0072ff 100%);
-    --grad-3: linear-gradient(135deg,#f7971e 0%,#ffd200 100%);
-    --grad-4: linear-gradient(135deg,#11998e 0%,#38ef7d 100%);
-  }
-  .hero{
-    background: var(--grad-1); color:#fff; border-radius:18px; padding:24px 28px;
-    box-shadow:0 14px 30px rgba(37,117,252,.25);
-  }
-  .stat-card{
-    border:0; border-radius:16px; color:#fff; overflow:hidden;
-    box-shadow:0 12px 28px rgba(0,0,0,.12);
-  }
-  .stat-card .card-body{padding:18px 18px 16px}
-  .stat-card h2{font-weight:800; margin:0}
-  .hover-lift{transition:transform .15s ease, box-shadow .15s ease}
-  .hover-lift:hover{transform:translateY(-2px); box-shadow:0 16px 34px rgba(0,0,0,.12)}
-  .list-clean .list-group-item{border:0; padding:.6rem .75rem}
-</style>
-
-<div class="hero mb-4">
-  <div class="d-flex flex-wrap align-items-center justify-content-between gap-2">
-    <div>
-      <h2 class="mb-1">Добредојде, {{ user_name }} 👋</h2>
-      <div class="opacity-75">Студентска контролна табла · брз пристап до лабораторија, елементи и твои активности</div>
+<div class="row">
+    <div class="col-12">
+        <h2>Добредојде, {{ user_name }}!</h2>
+        <p class="lead">Студентска контролна табла</p>
     </div>
-    <div>
-      <a href="/laboratory" class="btn btn-light btn-lg fw-semibold shadow-sm">
-        ⚗️ Отвори виртуелна лабораторија
-      </a>
-    </div>
-  </div>
 </div>
 
-<!-- STAT cards -->
-<div class="row g-3 mb-4">
-  <div class="col-6 col-lg-3">
-    <div class="card stat-card hover-lift" style="background:var(--grad-2)">
-      <div class="card-body">
-        <div class="small opacity-75">Мои експерименти</div>
-        <h2 class="count-up" data-target="{{ stats.experiment_count or 0 }}">0</h2>
-      </div>
+<div class="row mt-4">
+    <div class="col-md-4">
+        <div class="card mb-3">
+            <div class="card-header bg-primary text-white">
+                <h5>Хемиски елементи</h5>
+            </div>
+            <div class="card-body">
+                <p>Истражете ги достапните хемиски елементи</p>
+                <a href="/elements" class="btn btn-primary">Прегледај елементи</a>
+            </div>
+        </div>
     </div>
-  </div>
-  <div class="col-6 col-lg-3">
-    <div class="card stat-card hover-lift" style="background:var(--grad-4)">
-      <div class="card-body">
-        <div class="small opacity-75">Различни реакции</div>
-        <h2 class="count-up" data-target="{{ stats.reaction_count or 0 }}">0</h2>
-      </div>
+    
+    <div class="col-md-4">
+        <div class="card mb-3">
+            <div class="card-header bg-success text-white">
+                <h5>Лабораториска опрема</h5>
+            </div>
+            <div class="card-body">
+                <p>Погледнете ја достапната опрема</p>
+                <a href="/equipment" class="btn btn-success">Прегледај опрема</a>
+            </div>
+        </div>
     </div>
-  </div>
-  <div class="col-6 col-lg-3">
-    <div class="card stat-card hover-lift" style="background:var(--grad-3)">
-      <div class="card-body">
-        <div class="small opacity-75">Прегледани елементи</div>
-        <h2 class="count-up" data-target="{{ stats.element_count or 0 }}">0</h2>
-      </div>
+    
+    <div class="col-md-4">
+        <div class="card mb-3">
+            <div class="card-header bg-danger text-white">
+                <h5>Виртуелна лабораторија</h5>
+            </div>
+            <div class="card-body">
+                <p>Извршете хемиски експерименти</p>
+                <a href="/laboratory" class="btn btn-danger">Отвори лабораторија</a>
+            </div>
+        </div>
     </div>
-  </div>
-  <div class="col-6 col-lg-3">
-    <div class="card stat-card hover-lift" style="background:linear-gradient(135deg,#ff512f,#dd2476)">
-      <div class="card-body">
-        <div class="small opacity-75">Прегледана опрема</div>
-        <h2 class="count-up" data-target="{{ stats.equipment_count or 0 }}">0</h2>
-      </div>
+    <div class="col-md-4">
+    <div class="card">
+        <div class="card-header bg-warning text-dark">
+            <h5>Мои експерименти</h5>
+        </div>
+        <div class="card-body">
+            <p>Прегледајте ги вашите експерименти</p>
+            <a href="/my-experiments" class="btn btn-warning">Види експерименти</a>
+        </div>
     </div>
-  </div>
 </div>
-<br>
-<br>
-<!-- Quick sections -->
-<div class="row g-3">
-  <div class="col-lg-4">
-    <div class="card h-100 hover-lift">
-      <div class="card-header bg-primary text-white"><i class="bi bi-flask"></i> Хемиски елементи</div>
-      <div class="card-body">
-        <p>Истражи својства и безбедносни информации.</p>
-        <a href="/elements" class="btn btn-primary">Прегледај елементи</a>
-      </div>
-    </div>
-  </div>
-  <div class="col-lg-4">
-    <div class="card h-100 hover-lift">
-      <div class="card-header bg-success text-white"><i class="bi bi-tools"></i> Лабораториска опрема</div>
-      <div class="card-body">
-        <p>Провери упатства и безбедносни препораки.</p>
-        <a href="/equipment" class="btn btn-success">Прегледај опрема</a>
-      </div>
-    </div>
-  </div>
-  <div class="col-lg-4">
-    <div class="card h-100 hover-lift">
-      <div class="card-header bg-danger text-white"><i class="bi bi-radioactive"></i> Виртуелна лабораторија</div>
-      <div class="card-body">
-        <p>Влечи 2 елементи и симулирај реакција.</p>
-        <a href="/laboratory" class="btn btn-danger">Отвори лабораторија</a>
-      </div>
-    </div>
-  </div>
-</div>
-<br>
-<br>
-<div class="row g-3 mt-1">
-  <div class="col-lg-6">
-    <div class="card h-100 hover-lift">
-      <div class="card-header bg-warning text-dark"><i class="bi bi-journal-text"></i> Мои експерименти</div>
-      <div class="card-body">
-        <p>Историја на учества и резултати од експерименти.</p>
-        <a href="/my-experiments" class="btn btn-warning">Отвори листа</a>
-      </div>
-    </div>
-  </div>
-  <div class="col-lg-6">
-    <div class="card h-100 hover-lift">
-      <div class="card-header text-white" style="background:linear-gradient(135deg,#667eea,#764ba2)"><i class="bi bi-graph-up"></i> Мој напредок</div>
-      <div class="card-body">
-        <ul class="list-group list-clean">
-          <li class="list-group-item"><i class="bi bi-check-circle text-success me-1"></i> Експерименти: <b>{{ stats.experiment_count or 0 }}</b></li>
-          <li class="list-group-item"><i class="bi bi-check-circle text-success me-1"></i> Реакции: <b>{{ stats.reaction_count or 0 }}</b></li>
-          <li class="list-group-item"><i class="bi bi-check-circle text-success me-1"></i> Елементи видени: <b>{{ stats.element_count or 0 }}</b></li>
-        </ul>
-        <a href="/my-experiments" class="btn btn-outline-light mt-2">Види детално</a>
-      </div>
-    </div>
-  </div>
 </div>
 
-<script>
-// мал „count-up“ ефект за бројките
-document.querySelectorAll('.count-up').forEach(el=>{
-  const target = Number(el.dataset.target||0);
-  const dur = 600; const start = performance.now();
-  const step = t=>{
-    const p = Math.min(1,(t-start)/dur);
-    el.textContent = Math.round(target * p);
-    if(p<1) requestAnimationFrame(step);
-  };
-  requestAnimationFrame(step);
-});
-</script>
+<div class="row mt-3">
+    <div class="col-md-6">
+        <div class="card">
+            <div class="card-header bg-warning text-dark">
+                <h5>Мои експерименти</h5>
+            </div>
+            <div class="card-body">
+                <p>Прегледајте ги вашите експерименти</p>
+                <a href="/my-experiments" class="btn btn-warning">Види експерименти</a>
+            </div>
+        </div>
+    </div>
+    
+    <div class="col-md-6">
+        <div class="card">
+            <div class="card-header bg-info text-white">
+                <h5>Напредок</h5>
+            </div>
+            <div class="card-body">
+                <p>Следете го вашиот напредок</p>
+                <a href="/my-progress" class="btn btn-info">Види напредок</a>
+            </div>
+        </div>
+    </div>
+</div>
 {% endblock %}
Index: templates/dashboard_teacher.html
===================================================================
--- templates/dashboard_teacher.html	(revision bc45cb5da7c6d8482bc21838561ed96e007b138d)
+++ templates/dashboard_teacher.html	(revision 14fe7c26eea0eb44ab5dbcea992e11378a7f6d4e)
@@ -1,154 +1,101 @@
 {% extends "base.html" %}
-{% block title %}Dashboard · Професор{% endblock %}
+{% block title %}Dashboard - Наставник{% endblock %}
 
 {% block content %}
-<style>
-  :root{
-    --grad-a: linear-gradient(135deg,#00b09b,#96c93d);
-    --grad-b: linear-gradient(135deg,#f7971e,#ffd200);
-    --grad-c: linear-gradient(135deg,#36d1dc,#5b86e5);
-    --grad-d: linear-gradient(135deg,#ff512f,#dd2476);
-  }
-  .hero{background:linear-gradient(135deg,#232526,#414345); color:#fff; border-radius:18px; padding:24px 28px}
-  .stat-card{border:0;border-radius:16px;color:#fff;overflow:hidden;box-shadow:0 12px 28px rgba(0,0,0,.12)}
-  .stat-card .card-body{padding:18px}
-  .stat-card h2{font-weight:800;margin:0}
-  .hover-lift{transition:transform .15s ease, box-shadow .15s ease}
-  .hover-lift:hover{transform:translateY(-2px); box-shadow:0 16px 34px rgba(0,0,0,.12)}
-</style>
-
-<div class="hero mb-4 d-flex flex-wrap align-items-center justify-content-between gap-2">
-  <div>
-    <h2 class="mb-1">Добредојде, {{ user_name }}</h2>
-    <div class="opacity-75">Професорска контролна табла · управување со содржини и следење активности</div>
-  </div>
-  <div class="d-flex gap-2">
-    <a href="/reactions/add" class="btn btn-light fw-semibold"> Нова реакција</a>
-    <a href="/laboratory" class="btn btn-outline-light">Лабораторија</a>
-  </div>
+<div class="row">
+    <div class="col-12">
+        <h2>Добредојде, {{ user_name }}!</h2>
+        <p class="lead">Наставничка контролна табла</p>
+    </div>
 </div>
 
-<!-- STAT cards -->
-<div class="row g-3 mb-4">
-  <div class="col-6 col-lg-3">
-    <div class="card stat-card hover-lift" style="background:var(--grad-a)">
-      <div class="card-body">
-        <div class="small opacity-75">Студенти</div>
-        <h2 class="count-up" data-target="{{ stats.student_count or 0 }}">0</h2>
-      </div>
+<div class="row mt-4">
+    <div class="col-md-4">
+        <div class="card mb-3">
+            <div class="card-header bg-primary text-white">
+                <h5>Хемиски елементи</h5>
+            </div>
+            <div class="card-body">
+                <p>Управување со хемиски елементи</p>
+                <a href="/elements" class="btn btn-outline-primary btn-sm">Прегледај</a>
+                <a href="/elements/add" class="btn btn-primary btn-sm">Додај нов</a>
+            </div>
+        </div>
     </div>
-  </div>
-  <div class="col-6 col-lg-3">
-    <div class="card stat-card hover-lift" style="background:var(--grad-b)">
-      <div class="card-body">
-        <div class="small opacity-75">Реакции</div>
-        <h2 class="count-up" data-target="{{ stats.reaction_count or 0 }}">0</h2>
-      </div>
+
+    <div class="col-md-4">
+        <div class="card mb-3">
+            <div class="card-header bg-success text-white">
+                <h5>Лабораториска опрема</h5>
+            </div>
+            <div class="card-body">
+                <p>Управување со лабораториска опрема</p>
+                <a href="/equipment" class="btn btn-outline-success btn-sm">Прегледај</a>
+                <a href="/equipment/add" class="btn btn-success btn-sm">Додај нова</a>
+            </div>
+        </div>
     </div>
-  </div>
-  <div class="col-6 col-lg-3">
-    <div class="card stat-card hover-lift" style="background:var(--grad-c)">
-      <div class="card-body">
-        <div class="small opacity-75">Експерименти</div>
-        <h2 class="count-up" data-target="{{ stats.experiment_count or 0 }}">0</h2>
-      </div>
+
+    <div class="col-md-4">
+        <div class="card mb-3">
+            <div class="card-header bg-warning text-dark">
+                <h5>Реакции</h5>
+            </div>
+            <div class="card-body">
+                <p>Креирање на хемиски реакции</p>
+                <a href="/reactions" class="btn btn-outline-warning btn-sm">Прегледај</a>
+                <a href="/reactions/add" class="btn btn-warning btn-sm">Додај нова</a>
+            </div>
+        </div>
     </div>
-  </div>
-  <div class="col-6 col-lg-3">
-    <div class="card stat-card hover-lift" style="background:var(--grad-d)">
-      <div class="card-body">
-        <div class="small opacity-75">Активности денес</div>
-        <h2 class="count-up" data-target="{{ stats.activity_count or 0 }}">0</h2>
-      </div>
+    <div class="col-md-3">
+        <div class="card mb-3">
+            <div class="card-header bg-danger text-white">
+                <h5>Експерименти</h5>
+            </div>
+            <div class="card-body">
+                <p>Преглед на сите експерименти</p>
+                <a href="/experiments" class="btn btn-outline-danger btn-sm">Сите експерименти</a>
+                <a href="/my-experiments" class="btn btn-danger btn-sm">Мои експерименти</a>
+            </div>
+        </div>
     </div>
-  </div>
+    <div class="col-md-4">
+        <div class="card">
+            <div class="card-header bg-purple text-white"
+                style="background: linear-gradient(45deg, #6f42c1, #007bff) !important;">
+                <h5>Виртуелна лабораторија</h5>
+            </div>
+            <div class="card-body">
+                <p>Интерактивни симулации на реакции</p>
+                <a href="/laboratory" class="btn btn-primary">Отвори лабораторија</a>
+            </div>
+        </div>
+    </div>
 </div>
-<br>
-<br>
+<div class="row mt-3">
+    <div class="col-md-6">
+        <div class="card">
+            <div class="card-header bg-info text-white">
+                <h5>Студенти</h5>
+            </div>
+            <div class="card-body">
+                <p>Следете го напредокот на вашите студенти</p>
+                <a href="/my_students" class="btn btn-info">Види студенти</a>
+            </div>
+        </div>
+    </div>
 
-<!-- Управување со содржина -->
-<div class="row g-3">
-  <div class="col-lg-3">
-    <div class="card h-100 hover-lift">
-      <div class="card-header bg-primary text-white"><i class="bi bi-flask"></i> Хемиски елементи</div>
-      <div class="card-body d-grid gap-2">
-        <a href="/elements" class="btn btn-outline-primary btn-sm">Прегледај</a>
-        <a href="/elements/add" class="btn btn-primary btn-sm">Додај нов</a>
-      </div>
+    <div class="col-md-6">
+        <div class="card">
+            <div class="card-header bg-secondary text-white">
+                <h5>Извештаи</h5>
+            </div>
+            <div class="card-body">
+                <p>Детални статистики и извештаи</p>
+                <a href="/reports" class="btn btn-secondary">Види извештаи</a>
+            </div>
+        </div>
     </div>
-  </div>
-  <div class="col-lg-3">
-    <div class="card h-100 hover-lift">
-      <div class="card-header bg-success text-white"><i class="bi bi-tools"></i> Лаб. опрема</div>
-      <div class="card-body d-grid gap-2">
-        <a href="/equipment" class="btn btn-outline-success btn-sm">Прегледај</a>
-        <a href="/equipment/add" class="btn btn-success btn-sm">Додај нова</a>
-      </div>
-    </div>
-  </div>
-  <div class="col-lg-3">
-    <div class="card h-100 hover-lift">
-      <div class="card-header bg-warning text-dark"><i class="bi bi-diagram-3"></i> Реакции</div>
-      <div class="card-body d-grid gap-2">
-        <a href="/reactions" class="btn btn-outline-warning btn-sm">Прегледај</a>
-        <a href="/reactions/add" class="btn btn-warning btn-sm">Додај нова</a>
-      </div>
-    </div>
-  </div>
-  <div class="col-lg-3">
-    <div class="card h-100 hover-lift">
-      <div class="card-header bg-danger text-white"><i class="bi bi-radioactive"></i> Лабораторија</div>
-      <div class="card-body">
-        <p>Тестирај комбинации и услови.</p>
-        <a href="/laboratory" class="btn btn-danger w-100">Отвори</a>
-      </div>
-    </div>
-  </div>
 </div>
-<br>
-<br>
-
-<!-- Извештаи и студенти -->
-<div class="row g-3 mt-1">
-  <div class="col-lg-4">
-    <div class="card h-100 hover-lift">
-      <div class="card-header text-white" style="background:linear-gradient(135deg,#FF6B6B,#4ECDC4)"><i class="bi bi-journal-check"></i> Експерименти</div>
-      <div class="card-body d-grid gap-2">
-        <a href="/experiments" class="btn btn-outline-info btn-sm">Сите експерименти</a>
-        <a href="/reports/detailed_experiments" class="btn btn-outline-info btn-sm">Експерименти на студенти</a>
-      </div>
-    </div>
-  </div>
-  <div class="col-lg-4">
-    <div class="card h-100 hover-lift">
-      <div class="card-header bg-info text-white"><i class="bi bi-people"></i> Студенти</div>
-      <div class="card-body d-grid gap-2">
-        <a href="/my_students" class="btn btn-info">Мои студенти</a>
-        <a href="/reports/low_activity_students" class="btn btn-outline-dark">Ниска активност</a>
-      </div>
-    </div>
-  </div>
-  <div class="col-lg-4">
-    <div class="card h-100 hover-lift">
-      <div class="card-header bg-secondary text-white"><i class="bi bi-file-earmark-bar-graph"></i> Извештаи</div>
-      <div class="card-body d-grid gap-2">
-        <a href="/reports" class="btn btn-secondary">Мени за извештаи</a>
-        <a href="/reports/element_views" class="btn btn-outline-secondary">Прегледи на елементи</a>
-      </div>
-    </div>
-  </div>
-</div>
-
-<script>
-document.querySelectorAll('.count-up').forEach(el=>{
-  const target = Number(el.dataset.target||0);
-  const dur = 600; const start = performance.now();
-  const step = t=>{
-    const p = Math.min(1,(t-start)/dur);
-    el.textContent = Math.round(target * p);
-    if(p<1) requestAnimationFrame(step);
-  };
-  requestAnimationFrame(step);
-});
-</script>
 {% endblock %}
Index: templates/edit_element.html
===================================================================
--- templates/edit_element.html	(revision bc45cb5da7c6d8482bc21838561ed96e007b138d)
+++ templates/edit_element.html	(revision 14fe7c26eea0eb44ab5dbcea992e11378a7f6d4e)
@@ -3,149 +3,77 @@
 
 {% block content %}
-<style>
-  .hero{background:linear-gradient(135deg,#6a11cb,#2575fc);color:#fff;border-radius:18px;padding:18px 22px;display:flex;align-items:center;justify-content:space-between;gap:12px}
-  .pill{width:54px;height:54px;border-radius:14px;background:#ffffff22;display:flex;align-items:center;justify-content:center;font-weight:900;font-size:20px}
-  .type-badge{background:#ffffff22;color:#fff;border-radius:999px;padding:6px 12px;font-weight:600;letter-spacing:.2px}
-  .wrap{display:grid;grid-template-columns:1.35fr .85fr;gap:18px;margin-top:16px}
-  @media (max-width: 992px){.wrap{grid-template-columns:1fr}}
-  .card.block{border:0;border-radius:16px;box-shadow:0 12px 28px rgba(0,0,0,.08)}
-  .section-title{font-weight:800;margin-bottom:.35rem}
-  .muted{color:#6c757d}
-  .chip{display:inline-flex;align-items:center;gap:6px;padding:6px 10px;margin:4px;border-radius:999px;background:#eef2ff;color:#3f51b5;font-weight:600;cursor:pointer;border:1px solid rgba(63,81,181,.25);user-select:none;font-size:.9rem}
-  .sticky-actions{position:sticky;bottom:0;background:#fff;border-top:1px solid #eef1f4;padding:12px 0;margin-top:8px}
-</style>
-
-<div class="hero">
-  <div class="d-flex align-items-center gap-3">
-    <div class="pill" id="sym-pill">{{ element.symbol }}</div>
-    <div>
-      <h2 class="mb-0 text-truncate">Едитирај: {{ element.element_name }}</h2>
-      <div class="small opacity-75">Хемиски елемент • ID #{{ element.element_id }}</div>
+<div class="row justify-content-center">
+    <div class="col-md-8">
+        <div class="card">
+            <div class="card-header">
+                <h3>Едитирај хемиски елемент</h3>
+            </div>
+            <div class="card-body">
+                {% if error %}
+                    <div class="alert alert-danger">{{ error }}</div>
+                {% endif %}
+                
+                <form method="POST">
+                    <div class="row">
+                        <div class="col-md-6">
+                            <div class="mb-3">
+                                <label for="symbol" class="form-label">Симбол</label>
+                                <input type="text" class="form-control" name="symbol" maxlength="2" value="{{ element.symbol }}" required>
+                            </div>
+                        </div>
+                        <div class="col-md-6">
+                            <div class="mb-3">
+                                <label for="name" class="form-label">Име на елемент</label>
+                                <input type="text" class="form-control" name="name" value="{{ element.element_name }}" required>
+                            </div>
+                        </div>
+                    </div>
+                    
+                    <div class="row">
+                        <div class="col-md-6">
+                            <div class="mb-3">
+                                <label for="atomic_number" class="form-label">Атомски број</label>
+                                <input type="number" class="form-control" name="atomic_number" value="{{ element.atomic_number }}" required>
+                            </div>
+                        </div>
+                        <div class="col-md-6">
+                            <div class="mb-3">
+                                <label for="atomic_weight" class="form-label">Атомска маса</label>
+                                <input type="number" step="0.001" class="form-control" name="atomic_weight" value="{{ element.atomic_weight }}" required>
+                            </div>
+                        </div>
+                    </div>
+                    
+                    <div class="row">
+                        <div class="col-md-6">
+                            <div class="mb-3">
+                                <label for="melting_point" class="form-label">Точка на топење (°C)</label>
+                                <input type="number" step="0.1" class="form-control" name="melting_point" value="{{ element.melting_point or '' }}">
+                            </div>
+                        </div>
+                        <div class="col-md-6">
+                            <div class="mb-3">
+                                <label for="boiling_point" class="form-label">Точка на вриење (°C)</label>
+                                <input type="number" step="0.1" class="form-control" name="boiling_point" value="{{ element.boiling_point or '' }}">
+                            </div>
+                        </div>
+                    </div>
+                    
+                    <div class="mb-3">
+                        <label for="hazard_type" class="form-label">Тип на опасност</label>
+                        <input type="text" class="form-control" name="hazard_type" maxlength="50" value="{{ element.hazard_type or '' }}">
+                    </div>
+                    
+                    <div class="mb-3">
+                        <label for="description" class="form-label">Опис</label>
+                        <textarea class="form-control" name="description" rows="3">{{ element.description_element or '' }}</textarea>
+                    </div>
+                    
+                    <button type="submit" class="btn btn-success">Ажурирај елемент</button>
+                    <a href="/elements" class="btn btn-secondary">Откажи</a>
+                </form>
+            </div>
+        </div>
     </div>
-  </div>
-  <div class="d-flex align-items-center gap-2 flex-wrap">
-    <span class="type-badge">№ {{ element.atomic_number }}</span>
-    <span class="type-badge">
-      {{ "%.2f"|format(element.atomic_weight) if element.atomic_weight is not none else "—" }} u
-    </span>
-    <a href="/elements/{{ element.element_id }}" class="btn btn-light btn-sm fw-semibold">
-      <i class="bi bi-eye"></i> Преглед
-    </a>
-  </div>
 </div>
-
-<div class="wrap">
-  <!-- Лево: форма -->
-  <div class="card block">
-    <div class="card-body">
-      <h5 class="section-title"><i class="bi bi-pencil-square"></i> Податоци за елемент</h5>
-      {% if error %}<div class="alert alert-danger">{{ error }}</div>{% endif %}
-
-      <form method="POST" id="element-form" novalidate>
-        <div class="row g-3">
-          <div class="col-md-4">
-            <label class="form-label">Симбол</label>
-            <input type="text" class="form-control" name="symbol" id="symbol"
-                   value="{{ element.symbol }}" maxlength="3" required pattern="^[A-Za-z]{1,3}$"
-                   placeholder="Na, Cl, Al...">
-            <div class="form-text">1–3 букви, авто-големи.</div>
-          </div>
-          <div class="col-md-8">
-            <label class="form-label">Име на елемент</label>
-            <input type="text" class="form-control" name="name" value="{{ element.element_name }}" required>
-          </div>
-
-          <div class="col-md-4">
-            <label class="form-label">Атомски број</label>
-            <input type="number" class="form-control" name="atomic_number" value="{{ element.atomic_number }}" min="1" required>
-          </div>
-          <div class="col-md-4">
-            <label class="form-label">Атомска маса</label>
-            <div class="input-group">
-              <input type="number" step="0.0001" class="form-control" name="atomic_weight" value="{{ element.atomic_weight }}" required>
-              <span class="input-group-text">u</span>
-            </div>
-          </div>
-          <div class="col-md-4"></div>
-
-          <div class="col-md-6">
-            <label class="form-label">Точка на топење (°C)</label>
-            <input type="number" step="0.1" class="form-control" name="melting_point" value="{{ element.melting_point or '' }}">
-          </div>
-          <div class="col-md-6">
-            <label class="form-label">Точка на вриење (°C)</label>
-            <input type="number" step="0.1" class="form-control" name="boiling_point" value="{{ element.boiling_point or '' }}">
-          </div>
-
-          <div class="col-12">
-            <label class="form-label">Тип на опасност</label>
-            <input type="text" class="form-control" name="hazard_type" id="hazard" maxlength="50" value="{{ element.hazard_type or '' }}">
-            <div class="form-text">Брз избор:</div>
-            <div>
-              <span class="chip" onclick="pickHazard('Нема опасност')">✔ Нема опасност</span>
-              <span class="chip" onclick="pickHazard('Корозивно')">⚠ Корозивно</span>
-              <span class="chip" onclick="pickHazard('Токсично')">☠ Токсично</span>
-              <span class="chip" onclick="pickHazard('Запалливо')">🔥 Запалливо</span>
-              <span class="chip" onclick="pickHazard('Иритант')">❗ Иритант</span>
-            </div>
-          </div>
-
-          <div class="col-12">
-            <label class="form-label">Опис</label>
-            <textarea class="form-control" name="description" rows="4" placeholder="Краток опис...">{{ element.description_element or '' }}</textarea>
-          </div>
-        </div>
-
-        <div class="sticky-actions d-flex justify-content-between align-items-center">
-          <a href="/elements" class="btn btn-outline-secondary"><i class="bi bi-arrow-left"></i> Откажи</a>
-          <button type="submit" class="btn btn-success"><i class="bi bi-check2-circle"></i> Ажурирај елемент</button>
-        </div>
-      </form>
-    </div>
-  </div>
-
-  <!-- Десно: жив преглед -->
-  <div class="card block">
-    <div class="card-body">
-      <h6 class="section-title"><i class="bi bi-magic"></i> Жив преглед</h6>
-      <div class="d-flex align-items-center gap-3 mb-3">
-        <div class="pill" id="preview-pill">{{ element.symbol }}</div>
-        <div>
-          <div class="fw-bold" id="preview-name">{{ element.element_name }}</div>
-          <div class="small muted">№ <span id="preview-atomic">{{ element.atomic_number }}</span> •
-            <span id="preview-weight">{{ element.atomic_weight }}</span> u
-          </div>
-        </div>
-      </div>
-      <hr class="my-3"/>
-      <h6 class="section-title"><i class="bi bi-lightbulb"></i> Совет</h6>
-      <ul class="small mb-0">
-        <li>Симбол: 1–3 букви (Na, Cl, Al).</li>
-        <li>Атомска маса со децимали (на пр. 22.9898).</li>
-      </ul>
-    </div>
-  </div>
-</div>
-
-<script>
-  const sym = document.getElementById('symbol');
-  const nameEl = document.querySelector('input[name="name"]');
-  const numEl = document.querySelector('input[name="atomic_number"]');
-  const wEl = document.querySelector('input[name="atomic_weight"]');
-
-  function updatePreview(){
-    const s = sym.value || '—';
-    document.getElementById('sym-pill').textContent = s;
-    document.getElementById('preview-pill').textContent = s;
-    document.getElementById('preview-name').textContent = nameEl.value || 'Име на елемент';
-    document.getElementById('preview-atomic').textContent = numEl.value || '—';
-    document.getElementById('preview-weight').textContent = wEl.value || '—';
-  }
-  function pickHazard(txt){ const hz=document.getElementById('hazard'); hz.value=txt; hz.focus(); }
-  sym.addEventListener('input', ()=>{ sym.value = sym.value.toUpperCase(); updatePreview(); });
-  nameEl.addEventListener('input', updatePreview);
-  numEl.addEventListener('input', updatePreview);
-  wEl.addEventListener('input', updatePreview);
-  updatePreview();
-</script>
 {% endblock %}
Index: templates/edit_equipment.html
===================================================================
--- templates/edit_equipment.html	(revision bc45cb5da7c6d8482bc21838561ed96e007b138d)
+++ templates/edit_equipment.html	(revision 14fe7c26eea0eb44ab5dbcea992e11378a7f6d4e)
@@ -3,108 +3,42 @@
 
 {% block content %}
-<style>
-  .hero{background:linear-gradient(135deg,#6a11cb,#2575fc);color:#fff;border-radius:18px;padding:18px 22px;display:flex;align-items:center;justify-content:space-between;gap:12px}
-  .pill{width:42px;height:42px;border-radius:12px;background:#ffffff22;display:flex;align-items:center;justify-content:center;font-size:20px}
-  .type-badge{background:#ffffff22;color:#fff;border-radius:999px;padding:6px 12px;font-weight:600;letter-spacing:.2px}
-  .wrap{display:grid;grid-template-columns:1.35fr .85fr;gap:18px;margin-top:16px}
-  @media (max-width: 992px){.wrap{grid-template-columns:1fr}}
-  .card.block{border:0;border-radius:16px;box-shadow:0 12px 28px rgba(0,0,0,.08)}
-  .section-title{font-weight:800;margin-bottom:.35rem}
-  .muted{color:#6c757d}
-  .chip{display:inline-flex;align-items:center;gap:6px;padding:6px 10px;margin:4px;border-radius:999px;background:#eef2ff;color:#3f51b5;font-weight:600;cursor:pointer;border:1px solid rgba(63,81,181,.25);user-select:none;font-size:.9rem}
-  .sticky-actions{position:sticky;bottom:0;background:#fff;border-top:1px solid #eef1f4;padding:12px 0;margin-top:8px}
-</style>
-
-<div class="hero">
-  <div class="d-flex align-items-center gap-3">
-    <div class="pill"><i class="bi bi-tools"></i></div>
-    <div>
-      <h2 class="mb-0 text-truncate">Едитирај: {{ equipment.equipment_name }}</h2>
-      <div class="small opacity-75">Лабораториска опрема • ID #{{ equipment.equipment_id }}</div>
+<div class="row justify-content-center">
+    <div class="col-md-8">
+        <div class="card">
+            <div class="card-header">
+                <h3>Едитирај лабораториска опрема</h3>
+            </div>
+            <div class="card-body">
+                {% if error %}
+                    <div class="alert alert-danger">{{ error }}</div>
+                {% endif %}
+                
+                <form method="POST">
+                    <div class="mb-3">
+                        <label for="name" class="form-label">Име на опремата</label>
+                        <input type="text" class="form-control" name="name" maxlength="50" value="{{ equipment.equipment_name }}" required>
+                    </div>
+                    
+                    <div class="mb-3">
+                        <label for="type" class="form-label">Тип на опрема</label>
+                        <input type="text" class="form-control" name="type" maxlength="50" value="{{ equipment.type or '' }}">
+                    </div>
+                    
+                    <div class="mb-3">
+                        <label for="description" class="form-label">Опис</label>
+                        <textarea class="form-control" name="description" rows="3">{{ equipment.description or '' }}</textarea>
+                    </div>
+                    
+                    <div class="mb-3">
+                        <label for="safety_info" class="form-label">Безбедносни информации</label>
+                        <textarea class="form-control" name="safety_info" rows="2">{{ equipment.safety_info or '' }}</textarea>
+                    </div>
+                    
+                    <button type="submit" class="btn btn-success">Ажурирај опрема</button>
+                    <a href="/equipment" class="btn btn-secondary">Откажи</a>
+                </form>
+            </div>
+        </div>
     </div>
-  </div>
-  <div class="d-flex align-items-center gap-2">
-    <span class="type-badge"><i class="bi bi-tag me-1"></i>{{ equipment.type or 'Не е специфициран' }}</span>
-    <a href="/equipment/{{ equipment.equipment_id }}" class="btn btn-light btn-sm fw-semibold"><i class="bi bi-eye"></i> Преглед</a>
-  </div>
 </div>
-
-<div class="wrap">
-  <!-- Лево: форма -->
-  <div class="card block">
-    <div class="card-body">
-      <h5 class="section-title"><i class="bi bi-pencil-square"></i> Податоци за опрема</h5>
-      {% if error %}<div class="alert alert-danger">{{ error }}</div>{% endif %}
-
-      <form method="POST" id="equip-form" novalidate>
-        <div class="mb-3">
-          <label class="form-label">Име на опремата</label>
-          <input type="text" class="form-control" name="name" maxlength="50" value="{{ equipment.equipment_name }}" required placeholder="Пипета, Термометар...">
-        </div>
-
-        <div class="mb-2">
-          <label class="form-label">Тип на опрема</label>
-          <input type="text" class="form-control" name="type" maxlength="50" value="{{ equipment.type or '' }}" placeholder="Стакларија, Мерење, Загревање...">
-          <div class="form-text">Брз избор:</div>
-          <div>
-            <span class="chip" onclick="pickType('Стакларија')">Стакларија</span>
-            <span class="chip" onclick="pickType('Мерење')">Мерење</span>
-            <span class="chip" onclick="pickType('Загревање')">Загревање</span>
-            <span class="chip" onclick="pickType('Безбедност')">Безбедност</span>
-            <span class="chip" onclick="pickType('Општа')">Општа</span>
-          </div>
-        </div>
-
-        <div class="mb-3">
-          <label class="form-label">Опис</label>
-          <textarea class="form-control" name="description" rows="4" placeholder="Краток опис, употреба, напомени...">{{ equipment.description or '' }}</textarea>
-        </div>
-
-        <div class="mb-1">
-          <label class="form-label">Безбедносни информации</label>
-          <textarea class="form-control" name="safety_info" rows="3" placeholder="ППЕ, чистење, складирање...">{{ equipment.safety_info or '' }}</textarea>
-        </div>
-
-        <div class="sticky-actions d-flex justify-content-between align-items-center">
-          <a href="/equipment" class="btn btn-outline-secondary"><i class="bi bi-arrow-left"></i> Откажи</a>
-          <button type="submit" class="btn btn-success"><i class="bi bi-check2-circle"></i> Ажурирај опрема</button>
-        </div>
-      </form>
-    </div>
-  </div>
-
-  <!-- Десно: брзи факти / помош -->
-  <div class="card block">
-    <div class="card-body">
-      <h6 class="section-title"><i class="bi bi-list-ul"></i> Брзи факти</h6>
-      <div class="row">
-        <div class="col-5 muted">Име</div>
-        <div class="col-7 fw-semibold" id="prev-name">{{ equipment.equipment_name }}</div>
-      </div>
-      <div class="row">
-        <div class="col-5 muted">Тип</div>
-        <div class="col-7 fw-semibold" id="prev-type">{{ equipment.type or '—' }}</div>
-      </div>
-      <div class="row">
-        <div class="col-5 muted">ID</div>
-        <div class="col-7 fw-semibold">#{{ equipment.equipment_id }}</div>
-      </div>
-
-      <hr class="my-3"/>
-
-      <h6 class="section-title"><i class="bi bi-lightbulb"></i> Совети</h6>
-      <ul class="small mb-0">
-        <li>Типот држи го конзистентно за полесни филтри и извештаи.</li>
-        <li>Во опис: употреба + специфични напомени.</li>
-        <li>Безбедност: кратко, јасно и применливо.</li>
-      </ul>
-    </div>
-  </div>
-</div>
-
-<script>
-  function pickType(txt){ const t=document.querySelector('input[name="type"]'); t.value=txt; t.focus(); document.getElementById('prev-type').textContent=txt; }
-  document.querySelector('input[name="name"]').addEventListener('input', e=>{ document.getElementById('prev-name').textContent=e.target.value||'—'; });
-  document.querySelector('input[name="type"]').addEventListener('input', e=>{ document.getElementById('prev-type').textContent=e.target.value||'—'; });
-</script>
 {% endblock %}
Index: templates/edit_reaction.html
===================================================================
--- templates/edit_reaction.html	(revision bc45cb5da7c6d8482bc21838561ed96e007b138d)
+++ templates/edit_reaction.html	(revision 14fe7c26eea0eb44ab5dbcea992e11378a7f6d4e)
@@ -3,120 +3,62 @@
 
 {% block content %}
-<style>
-  .hero{background:linear-gradient(135deg,#6a11cb,#2575fc);color:#fff;border-radius:18px;padding:18px 22px;display:flex;align-items:center;justify-content:space-between;gap:12px}
-  .pill{width:48px;height:48px;border-radius:12px;background:#ffffff22;display:flex;align-items:center;justify-content:center;font-size:20px}
-  .wrap{display:grid;grid-template-columns:1fr .7fr;gap:18px;margin-top:16px}
-  @media (max-width: 992px){.wrap{grid-template-columns:1fr}}
-  .card.block{border:0;border-radius:16px;box-shadow:0 12px 28px rgba(0,0,0,.08)}
-  .section-title{font-weight:800;margin-bottom:.35rem}
-  .eq-preview{font-weight:800;font-size:18px;background:#f8f9fa;border:1px solid #edf0f4;border-radius:12px;padding:10px 12px}
-  .sticky-actions{position:sticky;bottom:0;background:#fff;border-top:1px solid #eef1f4;padding:12px 0;margin-top:8px}
-</style>
-
-<div class="hero">
-  <div class="d-flex align-items-center gap-3">
-    <div class="pill"><i class="bi bi-pencil-square"></i></div>
-    <div>
-      <h2 class="mb-0">Едитирај реакција #{{ reaction.reaction_id }}</h2>
-      <div class="small opacity-75">Ажурирај реактанти, продукт и услови</div>
+<div class="row justify-content-center">
+    <div class="col-md-8">
+        <div class="card">
+            <div class="card-header">
+                <h3>Едитирај реакција #{{ reaction.reaction_id }}</h3>
+            </div>
+            <div class="card-body">
+                {% if error %}
+                    <div class="alert alert-danger">{{ error }}</div>
+                {% endif %}
+                
+                <form method="POST">
+                    <div class="row">
+                        <div class="col-md-6">
+                            <div class="mb-3">
+                                <label for="element1_id" class="form-label">Првин елемент</label>
+                                <select class="form-select" name="element1_id" required>
+                                    {% for element in elements %}
+                                    <option value="{{ element.element_id }}" 
+                                            {% if element.element_id == reaction.element1_id %}selected{% endif %}>
+                                        {{ element.symbol }} - {{ element.element_name }}
+                                    </option>
+                                    {% endfor %}
+                                </select>
+                            </div>
+                        </div>
+                        <div class="col-md-6">
+                            <div class="mb-3">
+                                <label for="element2_id" class="form-label">Втор елемент</label>
+                                <select class="form-select" name="element2_id" required>
+                                    {% for element in elements %}
+                                    <option value="{{ element.element_id }}" 
+                                            {% if element.element_id == reaction.element2_id %}selected{% endif %}>
+                                        {{ element.symbol }} - {{ element.element_name }}
+                                    </option>
+                                    {% endfor %}
+                                </select>
+                            </div>
+                        </div>
+                    </div>
+                    
+                    <div class="mb-3">
+                        <label for="product" class="form-label">Продукт на реакцијата</label>
+                        <input type="text" class="form-control" name="product" maxlength="50" 
+                               value="{{ reaction.product }}" required>
+                    </div>
+                    
+                    <div class="mb-3">
+                        <label for="conditions" class="form-label">Услови за реакцијата</label>
+                        <textarea class="form-control" name="conditions" rows="3">{{ reaction.conditions or '' }}</textarea>
+                    </div>
+                    
+                    <button type="submit" class="btn btn-success">Ажурирај реакција</button>
+                    <a href="/reactions" class="btn btn-secondary">Откажи</a>
+                </form>
+            </div>
+        </div>
     </div>
-  </div>
-  <a href="/reactions" class="btn btn-light btn-sm fw-semibold"><i class="bi bi-list"></i> Сите реакции</a>
 </div>
-
-<div class="wrap">
-  <div class="card block">
-    <div class="card-body">
-      {% if error %}<div class="alert alert-danger">{{ error }}</div>{% endif %}
-
-      <form method="POST" id="edit-reaction-form" novalidate>
-        <h5 class="section-title"><i class="bi bi-flask"></i> Реактанти</h5>
-        <div class="row g-3">
-          <div class="col-md-6">
-            <label class="form-label">Прв елемент</label>
-            <select class="form-select" name="element1_id" id="element1_id" required>
-              {% for element in elements %}
-              <option value="{{ element.element_id }}"
-                      data-symbol="{{ element.symbol }}"
-                      {% if element.element_id == reaction.element1_id %}selected{% endif %}>
-                {{ element.symbol }} — {{ element.element_name }}
-              </option>
-              {% endfor %}
-            </select>
-          </div>
-          <div class="col-md-6">
-            <label class="form-label">Втор елемент</label>
-            <select class="form-select" name="element2_id" id="element2_id" required>
-              {% for element in elements %}
-              <option value="{{ element.element_id }}"
-                      data-symbol="{{ element.symbol }}"
-                      {% if element.element_id == reaction.element2_id %}selected{% endif %}>
-                {{ element.symbol }} — {{ element.element_name }}
-              </option>
-              {% endfor %}
-            </select>
-          </div>
-
-          <div class="col-12">
-            <label class="form-label">Преглед на равенка</label>
-            <div class="eq-preview" id="eqPreview">—</div>
-          </div>
-
-          <div class="col-12">
-            <label class="form-label">Продукт *</label>
-            <input type="text" class="form-control" name="product" id="product"
-                   value="{{ reaction.product }}" maxlength="50" required>
-          </div>
-
-          <div class="col-12">
-            <label class="form-label">Услови</label>
-            <textarea class="form-control" name="conditions" id="conditions" rows="3">{{ reaction.conditions or '' }}</textarea>
-          </div>
-        </div>
-
-        <div class="sticky-actions d-flex justify-content-between align-items-center">
-          <a href="/reactions" class="btn btn-outline-secondary"><i class="bi bi-arrow-left"></i> Откажи</a>
-          <button type="submit" class="btn btn-success"><i class="bi bi-check2-circle"></i> Ажурирај реакција</button>
-        </div>
-      </form>
-    </div>
-  </div>
-
-  <div class="card block">
-    <div class="card-body">
-      <h6 class="section-title"><i class="bi bi-lightbulb"></i> Совети</h6>
-      <ul class="small mb-0">
-        <li>Елементите мора да бидат различни.</li>
-        <li>Не внесувај „Темп./Притисок/Катализатор“ ако веќе се системски додадени во описот.</li>
-      </ul>
-    </div>
-  </div>
-</div>
-
-<script>
-  function getSym(id){
-    const sel=document.getElementById(id);
-    const opt=sel.options[sel.selectedIndex];
-    return opt ? (opt.dataset.symbol||'') : '';
-  }
-  function updateEq(){
-    const a=getSym('element1_id')||'A';
-    const b=getSym('element2_id')||'B';
-    const p=(document.getElementById('product').value||'___').trim()||'___';
-    document.getElementById('eqPreview').textContent = `${a} + ${b} → ${p}`;
-  }
-  function validateDiff(){
-    const e1=document.getElementById('element1_id'), e2=document.getElementById('element2_id');
-    if(e1.value && e2.value && e1.value===e2.value){
-      alert('Мора да изберете два различни елементи!');
-      e2.value=''; updateEq(); return false;
-    }
-    return true;
-  }
-  ['element1_id','element2_id','product'].forEach(id=>{
-    document.getElementById(id).addEventListener('change', ()=>{ validateDiff(); updateEq(); });
-    document.getElementById(id).addEventListener('input',  updateEq);
-  });
-  updateEq();
-</script>
 {% endblock %}
Index: templates/element_detail.html
===================================================================
--- templates/element_detail.html	(revision bc45cb5da7c6d8482bc21838561ed96e007b138d)
+++ templates/element_detail.html	(revision 14fe7c26eea0eb44ab5dbcea992e11378a7f6d4e)
@@ -3,188 +3,54 @@
 
 {% block content %}
-<style>
-  .hero{
-    background: linear-gradient(135deg,#6a11cb,#2575fc);
-    color:#fff;border-radius:18px;padding:18px 22px;
-    display:flex;align-items:center;justify-content:space-between;gap:12px
-  }
-  .type-badge{
-    background:#ffffff22;color:#fff;border-radius:999px;padding:6px 12px;
-    font-weight:600; letter-spacing:.2px
-  }
-  .wrap{display:grid;grid-template-columns:1.4fr .8fr;gap:18px;margin-top:16px}
-  @media (max-width: 992px){ .wrap{grid-template-columns:1fr} }
-  .card.block{border:0;border-radius:16px;box-shadow:0 12px 28px rgba(0,0,0,.08)}
-  .section-title{font-weight:800;margin-bottom:.35rem}
-  .muted{color:#6c757d}
-  .line-clamp-8{
-    display:-webkit-box;-webkit-line-clamp:8;-webkit-box-orient:vertical;overflow:hidden
-  }
-  .fact-row .row + .row{margin-top:10px}
-  .badge-soft-success{
-    background:#e6f4ea;color:#166534;border:1px solid #cfead7;font-weight:600;
-  }
-  .badge-soft-danger{
-    background:#fde8e8;color:#b91c1c;border:1px solid #f5c2c7;font-weight:600;
-  }
-  .pill{
-    width:54px;height:54px;border-radius:14px;background:#ffffff22;
-    display:flex;align-items:center;justify-content:center;font-weight:900;font-size:20px
-  }
-  .btn-ghost{background:#00000008;border:1px solid #ffffff55;color:#fff}
-</style>
-
-{# нормализација на hazard за значка/филтер #}
-{% set hazard_txt  = (element.hazard_type or '') %}
-{% set _hz_norm    = hazard_txt|lower|trim %}
-{% set hazard_clean = _hz_norm if _hz_norm not in ['','нема','нема опасност','безбедно','safe','none'] else 'без опасност' %}
-
-<!-- HERO -->
-<div class="hero">
-  <div class="d-flex align-items-center gap-3">
-    <div class="pill">{{ element.symbol }}</div>
-    <div>
-      <h2 class="mb-0 text-truncate">{{ element.element_name }}</h2>
-      <div class="small opacity-75">Хемиски елемент</div>
+<div class="row">
+    <div class="col-md-8 mx-auto">
+        <div class="card">
+            <div class="card-header d-flex justify-content-between">
+                <h3>{{ element.symbol }} - {{ element.element_name }}</h3>
+                {% if user_role == 'teacher' %}
+                    <a href="/elements/{{ element.element_id }}/edit" class="btn btn-warning btn-sm">Едитирај</a>
+                {% endif %}
+            </div>
+            <div class="card-body">
+                <div class="row">
+                    <div class="col-md-6">
+                        <h5>Основни информации</h5>
+                        <p><strong>Атомски број:</strong> {{ element.atomic_number }}</p>
+                        <p><strong>Атомска маса:</strong> {{ element.atomic_weight }}</p>
+                        {% if element.melting_point %}
+                            <p><strong>Точка на топење:</strong> {{ element.melting_point }}°C</p>
+                        {% endif %}
+                        {% if element.boiling_point %}
+                            <p><strong>Точка на вриење:</strong> {{ element.boiling_point }}°C</p>
+                        {% endif %}
+                    </div>
+                    <div class="col-md-6">
+                        <h5>Безбедносни информации</h5>
+                        {% if element.hazard_type %}
+                            <div class="alert alert-warning">
+                                <strong>Опасност:</strong> {{ element.hazard_type }}
+                            </div>
+                        {% else %}
+                            <p class="text-muted">Нема специфични предупредувања</p>
+                        {% endif %}
+                    </div>
+                </div>
+                
+                {% if element.description_element %}
+                    <hr>
+                    <h5>Опис</h5>
+                    <p>{{ element.description_element }}</p>
+                {% endif %}
+                
+                <hr>
+                <p class="text-muted"><small>Создадено од: {{ element.created_by }}</small></p>
+            </div>
+        </div>
+        
+        <div class="mt-3">
+            <a href="/elements" class="btn btn-secondary">Назад до листа</a>
+            <a href="/dashboard" class="btn btn-primary">Dashboard</a>
+        </div>
     </div>
-  </div>
-
-  <div class="d-flex align-items-center gap-2 flex-wrap">
-    <span class="type-badge" title="Атомски број">№ {{ element.atomic_number }}</span>
-    <span class="type-badge" title="Атомска маса">
-      {{ "%.2f"|format(element.atomic_weight) if element.atomic_weight is not none else "—" }}
-    </span>
-    {% if hazard_clean != 'без опасност' %}
-      <span class="type-badge"><i class="bi bi-exclamation-triangle"></i> {{ element.hazard_type }}</span>
-    {% else %}
-      <span class="type-badge"><i class="bi bi-shield-check"></i> Без опасност</span>
-    {% endif %}
-    {% if user_role == 'teacher' %}
-      <a href="/elements/{{ element.element_id }}/edit" class="btn btn-light btn-sm fw-semibold">
-        <i class="bi bi-pencil-square"></i> Едитирај
-      </a>
-    {% endif %}
-    <button class="btn btn-ghost btn-sm" onclick="window.print()"><i class="bi bi-printer"></i></button>
-  </div>
 </div>
-
-<div class="wrap">
-  <!-- ЛЕВО: опис + својства + безбедност -->
-  <div class="card block">
-    <div class="card-body">
-      <h5 class="section-title"><i class="bi bi-info-circle"></i> Основни информации</h5>
-
-      <div class="row g-3">
-        <div class="col-md-6">
-          <ul class="list-unstyled mb-0">
-            <li><span class="muted">Симбол</span>: <b>{{ element.symbol }}</b></li>
-            <li><span class="muted">Атомски број</span>: <b>{{ element.atomic_number }}</b></li>
-            <li><span class="muted">Атомска маса</span>:
-              <b>{{ "%.4f"|format(element.atomic_weight) if element.atomic_weight is not none else "—" }}</b>
-            </li>
-          </ul>
-        </div>
-        <div class="col-md-6">
-          <ul class="list-unstyled mb-0">
-            <li>
-              <span class="muted">Точка на топење</span>:
-              <b>{{ element.melting_point }}°C</b>{% if not element.melting_point %}<span class="muted"> —</span>{% endif %}
-            </li>
-            <li>
-              <span class="muted">Точка на вриење</span>:
-              <b>{{ element.boiling_point }}°C</b>{% if not element.boiling_point %}<span class="muted"> —</span>{% endif %}
-            </li>
-          </ul>
-        </div>
-      </div>
-
-      {% if element.description_element %}
-        <hr class="my-4"/>
-        <h5 class="section-title"><i class="bi bi-journal-text"></i> Опис</h5>
-        <p class="line-clamp-8" id="desc">{{ element.description_element }}</p>
-        <button class="btn btn-outline-secondary btn-sm" onclick="copyText('#desc')">
-          <i class="bi bi-clipboard"></i> Копирај опис
-        </button>
-      {% endif %}
-
-      <hr class="my-4"/>
-
-      <h5 class="section-title"><i class="bi bi-shield-exclamation"></i> Безбедносни информации</h5>
-      {% if hazard_clean != 'без опасност' %}
-        <div class="badge badge-soft-danger mb-2">⚠ {{ element.hazard_type }}</div>
-        <div class="alert alert-warning mb-2" id="haz">
-          При ракување користи PPE (ракавици, очила, мантила) и следи протоколи за складирање и отстранување.
-        </div>
-        <button class="btn btn-outline-warning btn-sm" onclick="copyText('#haz')">
-          <i class="bi bi-clipboard-check"></i> Копирај препораки
-        </button>
-      {% else %}
-        <span class="badge badge-soft-success">✔ Без опасност</span>
-        <p class="muted mt-2">Нема специфични предупредувања.</p>
-      {% endif %}
-
-      <hr class="my-4"/>
-      <p class="text-muted mb-0"><small>Создадено од: {{ element.created_by }}</small></p>
-    </div>
-  </div>
-
-  <!-- ДЕСНО: брзи факти + навигација -->
-  <div class="card block">
-    <div class="card-body fact-row">
-      <h6 class="section-title"><i class="bi bi-list-ul"></i> Брзи факти</h6>
-      <div class="row">
-        <div class="col-5 muted">ID</div>
-        <div class="col-7 fw-semibold">#{{ element.element_id }}</div>
-      </div>
-      <div class="row">
-        <div class="col-5 muted">Симбол</div>
-        <div class="col-7 fw-semibold">{{ element.symbol }}</div>
-      </div>
-      <div class="row">
-        <div class="col-5 muted">Атомски број</div>
-        <div class="col-7 fw-semibold">{{ element.atomic_number }}</div>
-      </div>
-      <div class="row">
-        <div class="col-5 muted">Маса</div>
-        <div class="col-7 fw-semibold">
-          {{ "%.4f"|format(element.atomic_weight) if element.atomic_weight is not none else "—" }}
-        </div>
-      </div>
-      <div class="row">
-        <div class="col-5 muted">Опасност</div>
-        <div class="col-7 fw-semibold">
-          {% if hazard_clean != 'без опасност' %}{{ element.hazard_type }}{% else %}Без опасност{% endif %}
-        </div>
-      </div>
-
-      <hr class="my-3"/>
-
-      <h6 class="section-title"><i class="bi bi-compass"></i> Навигација</h6>
-      <div class="d-grid gap-2">
-        <a href="/elements" class="btn btn-outline-primary btn-sm">
-          <i class="bi bi-arrow-left"></i> Назад до листа
-        </a>
-        <a href="/dashboard" class="btn btn-outline-secondary btn-sm">
-          <i class="bi bi-speedometer2"></i> Dashboard
-        </a>
-        <a href="/laboratory" class="btn btn-outline-dark btn-sm">
-          <i class="bi bi-flask"></i> Виртуелна лабораторија
-        </a>
-      </div>
-    </div>
-  </div>
-</div>
-
-<script>
-  function copyText(selector){
-    const el = document.querySelector(selector);
-    if(!el) return;
-    const text = el.innerText.trim();
-    if(!text) return;
-    navigator.clipboard.writeText(text).then(()=>{
-      const btn = document.activeElement;
-      if(btn) { const old = btn.innerHTML; btn.innerHTML='✔ Копирано'; setTimeout(()=>btn.innerHTML=old,1200); }
-    });
-  }
-</script>
 {% endblock %}
Index: templates/elements_list.html
===================================================================
--- templates/elements_list.html	(revision bc45cb5da7c6d8482bc21838561ed96e007b138d)
+++ templates/elements_list.html	(revision 14fe7c26eea0eb44ab5dbcea992e11378a7f6d4e)
@@ -3,216 +3,92 @@
 
 {% block content %}
-<style>
-  .page-hero{
-    background: linear-gradient(135deg,#232526,#414345);
-    color:#fff;border-radius:18px;padding:18px 22px;
-    display:flex;align-items:center;justify-content:space-between;gap:12px
-  }
-  .toolbar{
-    display:flex;flex-wrap:wrap;gap:10px;align-items:center;margin:14px 0
-  }
-  .search-input{min-width:260px}
+<div class="container mt-4">
 
-  .chip{
-    display:inline-flex;align-items:center;gap:8px;padding:6px 12px;margin:4px;
-    border-radius:999px;background:#eef2ff;color:#3f51b5;font-weight:600;cursor:pointer;
-    border:1px solid rgba(63,81,181,.25); user-select:none
-  }
-  .chip.active{background:#3f51b5;color:#fff}
+    <div class="d-flex justify-content-between align-items-center mb-4">
+        <h2 class="fw-bold text-primary"><i class="bi bi-flask"></i> Хемиски елементи</h2>
+        {% if user_role == 'teacher' %}
+            <a href="/elements/add" class="btn btn-success">
+                <i class="bi bi-plus-circle"></i> Додај нов елемент
+            </a>
+        {% endif %}
+    </div>
 
-  .elem-card{border:0;border-radius:16px;overflow:hidden;box-shadow:0 12px 28px rgba(0,0,0,.08)}
-  .elem-card .card-header{
-    background:linear-gradient(135deg,#6a11cb,#2575fc);
-    color:#fff;display:flex;justify-content:space-between;align-items:center
-  }
-  .type-badge{
-    background:#ffffff22;color:#fff;border-radius:999px;padding:2px 10px;font-size:.8rem
-  }
-  .line-clamp-3{
-    display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden
-  }
-  .empty{
-    border:2px dashed #e9ecef;border-radius:16px;padding:24px;text-align:center;color:#6c757d
-  }
-  .badge-soft-success{
-    background:#e6f4ea;color:#166534;border:1px solid #cfead7;font-weight:600;
-  }
-  .badge-soft-danger{
-    background:#fde8e8;color:#b91c1c;border:1px solid #f5c2c7;font-weight:600;
-  }
-</style>
+    {% if error %}
+        <div class="alert alert-warning">{{ error }}</div>
+    {% else %}
+        <div class="row g-4">
+            {% for element in elements %}
+            <div class="col-sm-6 col-md-4 col-lg-3">
+                <div class="card element-card shadow-lg border-0 h-100 
+                    {% if element.hazard_type and (element.hazard_type != 'Нема опасност' and element.hazard_type != 'Нема') %} element-hazard {% endif %}">
+                    
+                    <div class="card-body text-center">
+                        <div class="element-symbol mb-2">{{ element.symbol }}</div>
+                        <h6 class="text-muted">{{ element.element_name }}</h6>
 
-<div class="page-hero">
-  <div>
-    <h2 class="mb-1"><i class="bi bi-flask me-1"></i> Хемиски елементи</h2>
-    <div class="opacity-75">Вкупно: <b>{{ elements|length if elements else 0 }}</b> записи</div>
-  </div>
-  {% if user_role == 'teacher' %}
-    <a href="/elements/add" class="btn btn-light fw-semibold">
-      <i class="bi bi-plus-circle"></i> Додај нов елемент
-    </a>
-  {% endif %}
+                        <ul class="list-unstyled small mt-3">
+                            <li><strong>№:</strong> {{ element.atomic_number }}</li>
+                            <li><strong>Маса:</strong> {{ element.atomic_weight }}</li>
+                            {% if element.melting_point %}
+                                <li>Топење: {{ element.melting_point }}°C</li>
+                            {% endif %}
+                            {% if element.boiling_point %}
+                                <li>Вриење: {{ element.boiling_point }}°C</li>
+                            {% endif %}
+                        </ul>
+
+                        {% if element.hazard_type and element.hazard_type != 'Нема опасност' %}
+                        <span class="badge bg-danger mt-2">⚠ {{ element.hazard_type }}</span>
+                        {% else %}
+                        <span class="badge bg-success mt-2">✔ Безбедно</span>
+                        {% endif %}
+                        
+                        <div class="d-flex justify-content-center gap-2 mt-3">
+                            <a href="/elements/{{ element.element_id }}" class="btn btn-outline-primary btn-sm">
+                                <i class="bi bi-search"></i> Детали
+                            </a>
+                            {% if user_role == 'teacher' %}
+                                <a href="/elements/{{ element.element_id }}/edit" class="btn btn-outline-warning btn-sm">
+                                    <i class="bi bi-pencil"></i> Едитирај
+                                </a>
+                            {% endif %}
+                        </div>
+                    </div>
+                </div>
+            </div>
+            {% endfor %}
+        </div>
+    {% endif %}
+
+    <div class="mt-4">
+        <a href="/dashboard" class="btn btn-secondary">
+            <i class="bi bi-arrow-left"></i> Назад до Dashboard
+        </a>
+    </div>
 </div>
 
-<div class="toolbar">
-  <div class="input-group search-input">
-    <span class="input-group-text"><i class="bi bi-search"></i></span>
-    <input id="search" class="form-control" placeholder="Пребарај по симбол/име/опис…">
-  </div>
-
-  <select id="sort" class="form-select" style="max-width:260px">
-    <option value="name_az">Сортирај: Име (A–Z)</option>
-    <option value="name_za">Име (Z–A)</option>
-    <option value="symbol_az">Симбол (A–Z)</option>
-    <option value="symbol_za">Симбол (Z–A)</option>
-    <option value="atomic_asc">Атомски број ↑</option>
-    <option value="atomic_desc">Атомски број ↓</option>
-    <option value="weight_asc">Атомска маса ↑</option>
-    <option value="weight_desc">Атомска маса ↓</option>
-  </select>
-
-  <div class="ms-auto d-flex align-items-center gap-2 flex-wrap">
-    <small class="text-muted">Филтер по опасност:</small>
-    <div id="hazard-chips"></div>
-  </div>
-</div>
-
-{% if not elements %}
-  <div class="empty">
-    <div style="font-size:36px">🧪</div>
-    <div class="mt-2">Нема внесени елементи.</div>
-    {% if user_role == 'teacher' %}
-      <a href="/elements/add" class="btn btn-primary btn-sm mt-2">Додај прв елемент</a>
-    {% endif %}
-  </div>
-{% else %}
-  <div id="elem-grid" class="row">
-    {% for el in elements %}
-    {% set hazard_txt = (el.hazard_type or '') %}
-    {% set hazard_norm = hazard_txt|lower|trim %}
-    {% set hazard_clean =
-         hazard_norm if hazard_norm not in ['','нема','нема опасност','безбедно','safe','none'] else 'без опасност' %}
-    <div class="col-md-6 col-lg-4 mb-3 elem-item"
-         data-id="{{ el.element_id }}"
-         data-symbol="{{ el.symbol|lower }}"
-         data-name="{{ el.element_name|lower }}"
-         data-atomic="{{ el.atomic_number or 0 }}"
-         data-weight="{{ el.atomic_weight or 0 }}"
-         data-hazard="{{ hazard_clean }}"
-         data-text="{{ (el.symbol ~ ' ' ~ el.element_name ~ ' ' ~ hazard_txt ~ ' ' ~ (el.description_element or ''))|lower }}">
-      <div class="card elem-card h-100">
-        <div class="card-header">
-          <h5 class="mb-0 text-truncate">{{ el.element_name }}</h5>
-          <span class="type-badge" title="Атомски број">№ {{ el.atomic_number }}</span>
-        </div>
-        <div class="card-body d-flex flex-column">
-          <div class="d-flex justify-content-center align-items-center mb-2" style="gap:10px">
-            <div class="display-6 fw-bold">{{ el.symbol }}</div>
-            <span class="text-muted">({{ "%.2f"|format(el.atomic_weight) if el.atomic_weight is not none else "—" }})</span>
-          </div>
-
-          <ul class="list-unstyled small text-muted mb-2">
-            {% if el.melting_point %}<li>Топење: {{ el.melting_point }}°C</li>{% endif %}
-            {% if el.boiling_point %}<li>Вриење: {{ el.boiling_point }}°C</li>{% endif %}
-          </ul>
-
-          {% if hazard_clean != 'без опасност' %}
-            <span class="badge badge-soft-danger">⚠ {{ el.hazard_type }}</span>
-          {% else %}
-            <span class="badge badge-soft-success">✔ Безбедно</span>
-          {% endif %}
-
-          {% if el.description_element %}
-            <p class="mt-2 line-clamp-3">{{ el.description_element }}</p>
-          {% endif %}
-
-          <div class="mt-auto d-flex gap-2">
-            <a href="/elements/{{ el.element_id }}" class="btn btn-outline-primary btn-sm">
-              <i class="bi bi-eye"></i> Детали
-            </a>
-            {% if user_role == 'teacher' %}
-            <a href="/elements/{{ el.element_id }}/edit" class="btn btn-outline-warning btn-sm">
-              <i class="bi bi-pencil-square"></i> Едитирај
-            </a>
-            {% endif %}
-          </div>
-        </div>
-      </div>
-    </div>
-    {% endfor %}
-  </div>
-{% endif %}
-
-<div class="mt-3">
-  <a href="/dashboard" class="btn btn-secondary"><i class="bi bi-arrow-left"></i> Назад до Dashboard</a>
-</div>
-
-<script>
-  // Клиентска логика (ист „feeling“ како кај опрема)
-  const items   = [...document.querySelectorAll('.elem-item')];
-  const grid    = document.getElementById('elem-grid');
-  const search  = document.getElementById('search');
-  const sortSel = document.getElementById('sort');
-  const chipsWrap = document.getElementById('hazard-chips');
-
-  // 1) генерирај чипови по hazard (вкл. „без опасност“)
-  const HAZ = [...new Set(items.map(i => i.dataset.hazard))].sort((a,b)=>{
-    if(a==='без опасност') return -1;
-    if(b==='без опасност') return 1;
-    return a.localeCompare(b,'mk');
-  });
-  let activeHaz = null;
-  HAZ.forEach(h=>{
-    const chip = document.createElement('button');
-    chip.type='button'; chip.className='chip'; chip.textContent=h;
-    chip.addEventListener('click', ()=>{
-      if(activeHaz===h){ activeHaz=null; chip.classList.remove('active'); }
-      else{
-        activeHaz=h;
-        [...chipsWrap.children].forEach(c=>c.classList.remove('active'));
-        chip.classList.add('active');
-      }
-      applyFilters();
-    });
-    chipsWrap.appendChild(chip);
-  });
-
-  // 2) пребарување
-  search.addEventListener('input', applyFilters);
-
-  // 3) сортирање
-  sortSel.addEventListener('change', applySort);
-  function applySort(){
-    const val = sortSel.value;
-    const sorted = [...items].sort((a,b)=>{
-      const an=a.dataset.name, bn=b.dataset.name;
-      const as=a.dataset.symbol, bs=b.dataset.symbol;
-      const aZ=parseFloat(a.dataset.atomic)||0, bZ=parseFloat(b.dataset.atomic)||0;
-      const aW=parseFloat(a.dataset.weight)||0, bW=parseFloat(b.dataset.weight)||0;
-      if(val==='name_az')     return an.localeCompare(bn,'mk');
-      if(val==='name_za')     return bn.localeCompare(an,'mk');
-      if(val==='symbol_az')   return as.localeCompare(bs,'mk');
-      if(val==='symbol_za')   return bs.localeCompare(as,'mk');
-      if(val==='atomic_asc')  return aZ-bZ;
-      if(val==='atomic_desc') return bZ-aZ;
-      if(val==='weight_asc')  return aW-bW;
-      if(val==='weight_desc') return bW-aW;
-      return 0;
-    });
-    sorted.forEach(el=>grid.appendChild(el));
-  }
-
-  // 4) комбиниран филтер (search + hazard chip)
-  function applyFilters(){
-    const q = (search.value||'').toLowerCase().trim();
-    items.forEach(it=>{
-      const okText = it.dataset.text.includes(q);
-      const okHaz  = !activeHaz || it.dataset.hazard === activeHaz;
-      it.style.display = (okText && okHaz) ? '' : 'none';
-    });
-  }
-
-  // иницијално
-  applySort(); // default: name A–Z
-</script>
+<style>
+.element-card {
+    transition: transform 0.25s ease, box-shadow 0.25s ease;
+    border-radius: 15px;
+    background: linear-gradient(145deg, #ffffff, #f1f5f9);
+}
+.element-card:hover {
+    transform: translateY(-6px) scale(1.03);
+    box-shadow: 0 12px 24px rgba(0,0,0,0.15);
+}
+.element-symbol {
+    font-size: 2.8rem;
+    font-weight: bold;
+    color: #0d6efd; /* сина за нормални */
+}
+/* Ако е опасен елемент */
+.element-hazard {
+    background: linear-gradient(145deg, #fff5f5, #ffecec);
+    border: 1px solid #f5c2c7;
+}
+.element-hazard .element-symbol {
+    color: #dc3545; /* црвена боја за опасни */
+}
+</style>
 {% endblock %}
Index: templates/equipment_detail.html
===================================================================
--- templates/equipment_detail.html	(revision bc45cb5da7c6d8482bc21838561ed96e007b138d)
+++ templates/equipment_detail.html	(revision 14fe7c26eea0eb44ab5dbcea992e11378a7f6d4e)
@@ -3,133 +3,40 @@
 
 {% block content %}
-<style>
-  .hero{
-    background: linear-gradient(135deg,#6a11cb,#2575fc);
-    color:#fff;border-radius:18px;padding:18px 22px;
-    display:flex;align-items:center;justify-content:space-between;gap:12px
-  }
-  .type-badge{
-    background:#ffffff22;color:#fff;border-radius:999px;padding:6px 12px;
-    font-weight:600; letter-spacing:.2px
-  }
-  .wrap{display:grid;grid-template-columns:1.4fr .8fr;gap:18px;margin-top:16px}
-  @media (max-width: 992px){ .wrap{grid-template-columns:1fr} }
-  .card.block{border:0;border-radius:16px;box-shadow:0 12px 28px rgba(0,0,0,.08)}
-  .section-title{font-weight:800;margin-bottom:.35rem}
-  .muted{color:#6c757d}
-  .line-clamp-6{
-    display:-webkit-box;-webkit-line-clamp:6;-webkit-box-orient:vertical;overflow:hidden
-  }
-  .fact-row .row + .row{margin-top:10px}
-  .btn-ghost{background:#00000008;border:1px solid #ffffff55;color:#fff}
-</style>
-
-<!-- HERO -->
-<div class="hero">
-  <div class="d-flex align-items-center gap-3">
-    <div style="width:42px;height:42px;border-radius:12px;background:#ffffff22;display:flex;align-items:center;justify-content:center">
-      <i class="bi bi-tools" style="font-size:20px"></i>
+<div class="row">
+    <div class="col-md-8 mx-auto">
+        <div class="card">
+            <div class="card-header d-flex justify-content-between">
+                <h3>{{ equipment.equipment_name }}</h3>
+                {% if user_role == 'teacher' %}
+                    <a href="/equipment/{{ equipment.equipment_id }}/edit" class="btn btn-warning btn-sm">Едитирај</a>
+                {% endif %}
+            </div>
+            <div class="card-body">
+                <div class="row">
+                    <div class="col-md-6">
+                        <h5>Основни информации</h5>
+                        <p><strong>Тип:</strong> {{ equipment.type or 'Не е специфициран' }}</p>
+                        <p><strong>Опис:</strong></p>
+                        <p>{{ equipment.description or 'Нема достапен опис' }}</p>
+                    </div>
+                    <div class="col-md-6">
+                        <h5>Безбедносни информации</h5>
+                        {% if equipment.safety_info %}
+                            <div class="alert alert-warning">
+                                {{ equipment.safety_info }}
+                            </div>
+                        {% else %}
+                            <p class="text-muted">Нема специфични безбедносни барања</p>
+                        {% endif %}
+                    </div>
+                </div>
+            </div>
+        </div>
+        
+        <div class="mt-3">
+            <a href="/equipment" class="btn btn-secondary">Назад до листа</a>
+            <a href="/dashboard" class="btn btn-primary">Dashboard</a>
+        </div>
     </div>
-    <div>
-      <h2 class="mb-0 text-truncate">{{ equipment.equipment_name }}</h2>
-      <div class="small opacity-75">Лабораториска опрема</div>
-    </div>
-  </div>
-
-  <div class="d-flex align-items-center gap-2">
-    <span class="type-badge" title="Тип на опрема">
-      <i class="bi bi-tag me-1"></i>{{ equipment.type or 'Не е специфициран' }}
-    </span>
-    {% if user_role == 'teacher' %}
-      <a href="/equipment/{{ equipment.equipment_id }}/edit" class="btn btn-light btn-sm fw-semibold">
-        <i class="bi bi-pencil-square"></i> Едитирај
-      </a>
-    {% endif %}
-    <button class="btn btn-ghost btn-sm" onclick="window.print()"><i class="bi bi-printer"></i></button>
-  </div>
 </div>
-
-<div class="wrap">
-  <!-- ЛЕВО -->
-  <div class="card block">
-    <div class="card-body">
-      <h5 class="section-title"><i class="bi bi-info-circle"></i> Основни информации</h5>
-      {% if equipment.description %}
-        <p class="mb-3 line-clamp-6" id="desc">{{ equipment.description }}</p>
-        <button class="btn btn-outline-secondary btn-sm" onclick="copyText('#desc')">
-          <i class="bi bi-clipboard"></i> Копирај опис
-        </button>
-      {% else %}
-        <p class="muted">Нема достапен опис.</p>
-      {% endif %}
-
-      <hr class="my-4"/>
-
-      <h5 class="section-title"><i class="bi bi-shield-exclamation"></i> Безбедносни информации</h5>
-      {% if equipment.safety_info %}
-        <div class="alert alert-warning mb-2" id="safety">{{ equipment.safety_info }}</div>
-        <div class="d-flex gap-2">
-          <button class="btn btn-outline-warning btn-sm" onclick="copyText('#safety')">
-            <i class="bi bi-clipboard-check"></i> Копирај безбедност
-          </button>
-          <button class="btn btn-outline-dark btn-sm" data-bs-toggle="collapse" data-bs-target="#safetyTips">
-            <i class="bi bi-chevron-down"></i> Совети
-          </button>
-        </div>
-        <div id="safetyTips" class="collapse mt-2">
-          <ul class="small mb-0">
-            <li>Провери PPE (ракавици/очила/мантила) пред употреба.</li>
-            <li>Почитувај процедури за чистење и складирање.</li>
-            <li>Пријави оштетувања и неисправности веднаш.</li>
-          </ul>
-        </div>
-      {% else %}
-        <p class="muted">Нема специфични безбедносни барања.</p>
-      {% endif %}
-    </div>
-  </div>
-
-  <!-- ДЕСНО -->
-  <div class="card block">
-    <div class="card-body fact-row">
-      <h6 class="section-title"><i class="bi bi-list-ul"></i> Брзи факти</h6>
-      <div class="row">
-        <div class="col-5 muted">Тип</div>
-        <div class="col-7 fw-semibold">{{ equipment.type or '—' }}</div>
-      </div>
-      <div class="row">
-        <div class="col-5 muted">ID</div>
-        <div class="col-7 fw-semibold">#{{ equipment.equipment_id }}</div>
-      </div>
-
-      <hr class="my-3"/>
-
-      <h6 class="section-title"><i class="bi bi-compass"></i> Навигација</h6>
-      <div class="d-grid gap-2">
-        <a href="/equipment" class="btn btn-outline-primary btn-sm">
-          <i class="bi bi-arrow-left"></i> Назад до листа
-        </a>
-        <a href="/dashboard" class="btn btn-outline-secondary btn-sm">
-          <i class="bi bi-speedometer2"></i> Dashboard
-        </a>
-        <a href="/laboratory" class="btn btn-outline-dark btn-sm">
-          <i class="bi bi-flask"></i> Виртуелна лабораторија
-        </a>
-      </div>
-    </div>
-  </div>
-</div>
-
-<script>
-  function copyText(selector){
-    const el = document.querySelector(selector);
-    if(!el) return;
-    const text = el.innerText.trim();
-    if(!text) return;
-    navigator.clipboard.writeText(text).then(()=>{
-      const btn = document.activeElement;
-      if(btn) { const old = btn.innerHTML; btn.innerHTML='✔ Копирано'; setTimeout(()=>btn.innerHTML=old,1200); }
-    });
-  }
-</script>
 {% endblock %}
Index: templates/equipment_list.html
===================================================================
--- templates/equipment_list.html	(revision bc45cb5da7c6d8482bc21838561ed96e007b138d)
+++ templates/equipment_list.html	(revision 14fe7c26eea0eb44ab5dbcea992e11378a7f6d4e)
@@ -3,178 +3,50 @@
 
 {% block content %}
-<style>
-  .page-hero{
-    background: linear-gradient(135deg,#232526,#414345);
-    color:#fff;border-radius:18px;padding:18px 22px;
-    display:flex;align-items:center;justify-content:space-between;gap:12px
-  }
-  .toolbar{
-    display:flex;flex-wrap:wrap;gap:10px;align-items:center;margin:14px 0
-  }
-  .search-input{min-width:260px}
-  .chip{
-    display:inline-flex;align-items:center;gap:8px;padding:6px 12px;margin:4px;
-    border-radius:999px;background:#eef2ff;color:#3f51b5;font-weight:600;cursor:pointer;
-    border:1px solid rgba(63,81,181,.25); user-select:none
-  }
-  .chip.active{background:#3f51b5;color:#fff}
-  .equip-card{border:0;border-radius:16px;overflow:hidden;box-shadow:0 12px 28px rgba(0,0,0,.08)}
-  .equip-card .card-header{
-    background:linear-gradient(135deg,#6a11cb,#2575fc);
-    color:#fff;display:flex;justify-content:space-between;align-items:center
-  }
-  .type-badge{
-    background:#ffffff22;color:#fff;border-radius:999px;padding:2px 10px;font-size:.8rem
-  }
-  .line-clamp-3{
-    display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden
-  }
-  .empty{
-    border:2px dashed #e9ecef;border-radius:16px;padding:24px;text-align:center;color:#6c757d
-  }
-</style>
-
-<div class="page-hero">
-  <div>
-    <h2 class="mb-1">Лабораториска опрема</h2>
-    <div class="opacity-75">Вкупно: <b>{{ equipment|length if equipment else 0 }}</b> записи</div>
-  </div>
-  {% if user_role == 'teacher' %}
-    <a href="/equipment/add" class="btn btn-light fw-semibold"><i class="bi bi-plus-circle"></i> Додај нова опрема</a>
-  {% endif %}
+<div class="row">
+    <div class="col-12">
+        <div class="d-flex justify-content-between align-items-center mb-3">
+            <h2>Лабораториска опрема</h2>
+            {% if user_role == 'teacher' %}
+                <a href="/equipment/add" class="btn btn-success">Додај нова опрема</a>
+            {% endif %}
+        </div>
+    </div>
 </div>
 
-<div class="toolbar">
-  <div class="input-group search-input">
-    <span class="input-group-text"><i class="bi bi-search"></i></span>
-    <input id="search" class="form-control" placeholder="Пребарај по име/тип/опис...">
-  </div>
-  <select id="sort" class="form-select" style="max-width:220px">
-    <option value="name_az">Сортирај: Име (A–Z)</option>
-    <option value="name_za">Име (Z–A)</option>
-    <option value="type_az">Тип (A–Z)</option>
-    <option value="newest">Најново (ID ↓)</option>
-    <option value="oldest">Најстаро (ID ↑)</option>
-  </select>
-  <div id="type-chips" class="ms-auto"></div>
-</div>
-
-{% if not equipment %}
-  <div class="empty">
-    <div style="font-size:36px">🧰</div>
-    <div class="mt-2">Нема внесена опрема.</div>
-    {% if user_role == 'teacher' %}
-      <a href="/equipment/add" class="btn btn-primary btn-sm mt-2">Додај прва ставка</a>
-    {% endif %}
-  </div>
+{% if error %}
+    <div class="alert alert-warning">{{ error }}</div>
 {% else %}
-  <div id="equip-grid" class="row">
-    {% for item in equipment %}
-    <div class="col-md-6 col-lg-4 mb-3 equip-item"
-         data-id="{{ item.equipment_id }}"
-         data-name="{{ item.equipment_name|lower }}"
-         data-type="{{ (item.type or '')|lower }}"
-         data-text="{{ (item.equipment_name ~ ' ' ~ (item.type or '') ~ ' ' ~ (item.description or ''))|lower }}">
-      <div class="card equip-card h-100">
-        <div class="card-header">
-          <h5 class="mb-0 text-truncate"><i class="bi bi-tools me-1"></i>{{ item.equipment_name }}</h5>
-          <span class="type-badge text-truncate" title="Тип">{{ item.type or '—' }}</span>
+    <div class="row">
+        {% for item in equipment %}
+        <div class="col-md-6 col-lg-4 mb-3">
+            <div class="card">
+                <div class="card-header d-flex justify-content-between">
+                    <h5 class="mb-0">{{ item.equipment_name }}</h5>
+                    <small class="text-muted">{{ item.type }}</small>
+                </div>
+                <div class="card-body">
+                    <p class="card-text">{{ item.description }}</p>
+                    
+                    {% if item.safety_info %}
+                        <div class="alert alert-warning alert-sm p-2">
+                            <strong>Безбедност:</strong> {{ item.safety_info }}
+                        </div>
+                    {% endif %}
+                    
+                    <div class="mt-2">
+                        <a href="/equipment/{{ item.equipment_id }}" class="btn btn-info btn-sm">Детали</a>
+                        {% if user_role == 'teacher' %}
+                            <a href="/equipment/{{ item.equipment_id }}/edit" class="btn btn-warning btn-sm">Едитирај</a>
+                        {% endif %}
+                    </div>
+                </div>
+            </div>
         </div>
-        <div class="card-body d-flex flex-column">
-          {% if item.description %}
-          <p class="card-text line-clamp-3">{{ item.description }}</p>
-          {% else %}
-          <p class="text-muted">Нема опис.</p>
-          {% endif %}
-
-          {% if item.safety_info %}
-          <div class="alert alert-warning py-2 px-3 mt-auto">
-            <strong><i class="bi bi-shield-exclamation"></i> Безбедност:</strong>
-            <span class="d-block mt-1">{{ item.safety_info }}</span>
-          </div>
-          {% endif %}
-
-          <div class="mt-3 d-flex gap-2">
-            <a href="/equipment/{{ item.equipment_id }}" class="btn btn-outline-primary btn-sm">
-              <i class="bi bi-eye"></i> Детали
-            </a>
-            {% if user_role == 'teacher' %}
-            <a href="/equipment/{{ item.equipment_id }}/edit" class="btn btn-outline-warning btn-sm">
-              <i class="bi bi-pencil-square"></i> Едитирај
-            </a>
-            {% endif %}
-          </div>
-        </div>
-      </div>
+        {% endfor %}
     </div>
-    {% endfor %}
-  </div>
 {% endif %}
 
 <div class="mt-3">
-  <a href="/dashboard" class="btn btn-secondary"><i class="bi bi-arrow-left"></i> Назад до Dashboard</a>
+    <a href="/dashboard" class="btn btn-secondary">Назад до Dashboard</a>
 </div>
-
-<script>
-  // Клиентски филтер/сортирање/чипови – без бекенд промени
-  const items = [...document.querySelectorAll('.equip-item')];
-  const search = document.getElementById('search');
-  const sortSel = document.getElementById('sort');
-  const chipsWrap = document.getElementById('type-chips');
-
-  // 1) генерирај филтер по тип (чипови)
-  const TYPES = [...new Set(items.map(i => i.dataset.type).filter(Boolean))].sort();
-  let activeType = null;
-  TYPES.forEach(t=>{
-    const chip = document.createElement('button');
-    chip.type='button';
-    chip.className='chip';
-    chip.textContent = t || '—';
-    chip.addEventListener('click', ()=>{
-      if(activeType===t){ activeType=null; chip.classList.remove('active'); }
-      else{
-        activeType=t;
-        [...chipsWrap.children].forEach(c=>c.classList.remove('active'));
-        chip.classList.add('active');
-      }
-      applyFilters();
-    });
-    chipsWrap.appendChild(chip);
-  });
-
-  // 2) пребарување
-  search.addEventListener('input', applyFilters);
-
-  // 3) сортирање
-  sortSel.addEventListener('change', applySort);
-  function applySort(){
-    const val = sortSel.value;
-    const grid = document.getElementById('equip-grid');
-    const sorted = [...items].sort((a,b)=>{
-      const an=a.dataset.name, bn=b.dataset.name;
-      const at=a.dataset.type, bt=b.dataset.type;
-      const ai=+a.dataset.id, bi=+b.dataset.id;
-      if(val==='name_az')   return an.localeCompare(bn,'mk');
-      if(val==='name_za')   return bn.localeCompare(an,'mk');
-      if(val==='type_az'){  const c=at.localeCompare(bt,'mk'); return c||an.localeCompare(bn,'mk'); }
-      if(val==='newest')    return bi-ai;
-      if(val==='oldest')    return ai-bi;
-      return 0;
-    });
-    sorted.forEach(el=>grid.appendChild(el));
-  }
-
-  // 4) комбиниран филтер
-  function applyFilters(){
-    const q = (search.value||'').toLowerCase().trim();
-    items.forEach(it=>{
-      const matchText = it.dataset.text.includes(q);
-      const matchType = !activeType || it.dataset.type===activeType;
-      it.style.display = (matchText && matchType) ? '' : 'none';
-    });
-  }
-
-  // иницијално сортирај (A–Z)
-  applySort();
-</script>
 {% endblock %}
Index: templates/experiments_list.html
===================================================================
--- templates/experiments_list.html	(revision bc45cb5da7c6d8482bc21838561ed96e007b138d)
+++ templates/experiments_list.html	(revision 14fe7c26eea0eb44ab5dbcea992e11378a7f6d4e)
@@ -1,201 +1,53 @@
 {% extends "base.html" %}
-{% block title %}Сите експерименти{% endblock %}
+{% block title %}Експерименти{% endblock %}
 
 {% block content %}
-<style>
-  .page-hero{background:linear-gradient(135deg,#232526,#414345);color:#fff;border-radius:18px;padding:18px 22px;display:flex;align-items:center;justify-content:space-between;gap:12px}
-  .toolbar{display:flex;flex-wrap:wrap;gap:10px;align-items:center;margin:14px 0}
-  .search-input{min-width:260px}
-  .chip{display:inline-flex;align-items:center;gap:8px;padding:6px 12px;margin:4px;border-radius:999px;background:#eef2ff;color:#3f51b5;font-weight:600;border:1px solid rgba(63,81,181,.25);user-select:none;font-size:.9rem;cursor:pointer}
-  .chip.active{background:#3f51b5;color:#fff}
-  .exp-card{border:0;border-radius:16px;overflow:hidden;box-shadow:0 12px 28px rgba(0,0,0,.08)}
-  .exp-card .card-header{background:linear-gradient(135deg,#6a11cb,#2575fc);color:#fff;display:flex;justify-content:space-between;align-items:center}
-  .eq{font-weight:800;font-size:18px;background:#f8f9fa;border:1px solid #edf0f4;border-radius:12px;padding:10px 12px}
-  .empty{border:2px dashed #e9ecef;border-radius:16px;padding:24px;text-align:center;color:#6c757d}
-  .meta-badges{display:flex;gap:6px;flex-wrap:wrap}
-  .meta-badges .badge{border-radius:999px}
-  .showmore{border:0;background:#eef2ff;border-radius:10px;padding:6px 10px;font-weight:600}
-</style>
-
-<div class="page-hero">
-  <div>
-    <h2 class="mb-1">🧪 Сите експерименти</h2>
-    <div class="opacity-75">
-      {% if user_role == 'teacher' %}Професорски преглед{% else %}Јавно достапни{% endif %}
-      · Вкупно: <b>{{ experiments|length if experiments else 0 }}</b>
+<div class="row">
+    <div class="col-12">
+        <h2>Сите експерименти</h2>
+        <p class="text-muted">Листа на изведени експерименти во системот</p>
     </div>
-  </div>
-  <div class="d-flex gap-2">
-    <a href="/dashboard" class="btn btn-light btn-sm"><i class="bi bi-speedometer2"></i> Dashboard</a>
-    <a href="/laboratory" class="btn btn-outline-light btn-sm"><i class="bi bi-flask"></i> Лабораторија</a>
-  </div>
 </div>
 
-{% if not experiments %}
-  <div class="empty mt-3">
-    Нема експерименти во системот.
-    {% if user_role == 'teacher' %}<div class="mt-2"><a href="/reactions/add" class="btn btn-primary btn-sm">Додај реакција</a></div>{% else %}
-    <div class="mt-2"><a href="/laboratory" class="btn btn-primary btn-sm">Отвори лабораторија</a></div>{% endif %}
-  </div>
-{% else %}
-  <!-- Toolbar -->
-  <div class="toolbar">
-    <div class="input-group search-input">
-      <span class="input-group-text"><i class="bi bi-search"></i></span>
-      <input id="search" class="form-control" placeholder="Пребарај по елемент/продукт/услов/опис...">
+<div class="row mt-3">
+    {% for experiment in experiments %}
+    <div class="col-md-6 mb-4">
+        <div class="card">
+            <div class="card-header d-flex justify-content-between">
+                <h5>Експеримент #{{ experiment.experiment_id }}</h5>
+                <small class="text-muted">{{ experiment.time_stamp.strftime('%d.%m.%Y %H:%M') if experiment.time_stamp }}</small>
+            </div>
+            <div class="card-body">
+                <h6 class="card-title text-primary">
+                    {{ experiment.element1_symbol }} + {{ experiment.element2_symbol }} → {{ experiment.product }}
+                </h6>
+                
+                <p><strong>Реакција:</strong> {{ experiment.element1_name }} + {{ experiment.element2_name }}</p>
+                
+                <p><strong>Услови:</strong> {{ experiment.conditions or 'Стандардни услови' }}</p>
+                
+                <p><strong>Резултат:</strong> {{ experiment.result }}</p>
+                
+                {% if experiment.safety_warning %}
+                <div class="alert alert-warning alert-sm p-2">
+                    <strong>Безбедност:</strong> {{ experiment.safety_warning }}
+                </div>
+                {% endif %}
+                
+                <p class="text-muted"><small>Креиран од: {{ experiment.created_by }}</small></p>
+                
+                <a href="/experiments/{{ experiment.experiment_id }}" class="btn btn-info btn-sm">Детали</a>
+            </div>
+        </div>
     </div>
-    <select id="sort" class="form-select" style="max-width:220px">
-      <option value="id_desc">Најново (ID ↓)</option>
-      <option value="id_asc">Најстаро (ID ↑)</option>
-      <option value="prod_az">Продукт (A–Z)</option>
-      <option value="elem_az">Елементи (A–Z)</option>
-    </select>
-    <div class="ms-auto d-flex align-items-center flex-wrap" id="chips">
-      <!-- ќе се полни од JS -->
-    </div>
-  </div>
-
-  <!-- Grid -->
-  <div id="exp-grid" class="row">
-    {% for e in experiments %}
-    {% set has_eq = (e.equipment and e.equipment|length>0) %}
-    {% set has_warn = (e.safety_warning and e.safety_warning|length>0) %}
-    <div class="col-md-6 col-lg-4 mb-3 exp-item"
-         data-id="{{ e.experiment_id }}"
-         data-prod="{{ (e.product or '')|lower }}"
-         data-elems="{{ (e.element1_symbol ~ ' ' ~ e.element2_symbol ~ ' ' ~ e.element1_name ~ ' ' ~ e.element2_name)|lower }}"
-         data-conds="{{ (e.conditions or '')|lower }}"
-         data-text="{{ (e.result or '')|lower }}"
-         data-has-eq="{{ 1 if has_eq else 0 }}"
-         data-has-warn="{{ 1 if has_warn else 0 }}">
-      <div class="card exp-card h-100">
-        <div class="card-header">
-          <h5 class="mb-0 text-truncate">
-            <span class="badge bg-dark">#{{ e.experiment_id }}</span>
-            {{ e.element1_symbol }} + {{ e.element2_symbol }}
-          </h5>
-          <small class="text-truncate">
-            {% if e.time_stamp %}{{ e.time_stamp.strftime('%d.%m.%Y') }}{% endif %}
-          </small>
-        </div>
-        <div class="card-body d-flex flex-column">
-          <div class="eq mb-3 text-center">
-            {{ e.element1_symbol }} + {{ e.element2_symbol }} → {{ e.product or '—' }}
-          </div>
-
-          <div class="meta-badges mb-2">
-            {% if has_eq %}<span class="badge text-bg-primary"><i class="bi bi-tools"></i> Опрема</span>{% endif %}
-            {% if has_warn %}<span class="badge text-bg-warning"><i class="bi bi-exclamation-triangle"></i> Предупредување</span>{% endif %}
-          </div>
-
-          <ul class="small list-unstyled mb-2">
-            <li><b>Реакција:</b> {{ e.element1_name }} + {{ e.element2_name }}</li>
-            <li><b>Услови:</b> {{ e.conditions or 'Стандардни услови' }}</li>
-          </ul>
-
-          {% if e.result %}
-          <div class="mb-2">
-            <b>Резултат:</b>
-            <div class="text-muted" id="res-{{e.experiment_id}}">
-              {{ e.result[:140] }}{% if e.result|length>140 %}…{% endif %}
-            </div>
-          </div>
-          {% endif %}
-
-          {% if has_eq %}
-          <div class="mt-2">
-            <b>Опрема:</b>
-            <ul class="small text-muted mb-0">
-              {% for q in e.equipment %}
-              <li>{{ q.equipment_name }}{% if q.type %} <span class="text-secondary">({{ q.type }})</span>{% endif %}</li>
-              {% endfor %}
-            </ul>
-          </div>
-          {% endif %}
-
-          {% if has_warn %}
-          <div class="alert alert-warning py-2 px-3 mt-2">
-            <small><b>⚠ Безбедност:</b> {{ e.safety_warning }}</small>
-          </div>
-          {% endif %}
-
-          <div class="mt-auto d-flex justify-content-between align-items-center">
-            <small class="text-muted"><b>Креирано од:</b> {{ e.created_by }}</small>
-            {% if e.result and e.result|length>140 %}
-              <button class="showmore" onclick="toggleMore({{e.experiment_id}})">Повеќе</button>
-            {% endif %}
-          </div>
-        </div>
-      </div>
+    {% else %}
+    <div class="col-12">
+        <div class="alert alert-info">Нема изведени експерименти во системот.</div>
     </div>
     {% endfor %}
-  </div>
-{% endif %}
-
-<div class="mt-3 text-center">
-  <a href="/dashboard" class="btn btn-secondary">🏠 Dashboard</a>
-  <a href="/laboratory" class="btn btn-success">🔬 Лабораторија</a>
-  {% if user_role == 'teacher' %}<a href="/reactions" class="btn btn-info">⚗️ Реакции</a>{% endif %}
 </div>
 
-<script>
-  // Toggle long result text
-  function toggleMore(id){
-    const el=document.getElementById('res-'+id);
-    if(!el) return;
-    el.classList.toggle('expanded');
-    // прост toggle – ако сакаш, можеш да чуваш full текст во data-attr и да го заменаваш
-  }
-
-  const items=[...document.querySelectorAll('.exp-item')];
-  const search=document.getElementById('search');
-  const sortSel=document.getElementById('sort');
-  const chips=document.getElementById('chips');
-
-  // Чипови: Има опрема / Со предупредување
-  const filters = { eq:null, warn:null }; // null=all, 1=only yes, 0=only no
-  function addChip(label,key,val){
-    const c=document.createElement('button'); c.type='button'; c.className='chip'; c.textContent=label;
-    c.addEventListener('click', ()=>{
-      // циклус: null -> 1 -> 0 -> null
-      if(filters[key]===null) { filters[key]=1; c.classList.add('active'); c.textContent=label+' ✓'; }
-      else if(filters[key]===1){ filters[key]=0; c.classList.remove('active'); c.textContent=label+' ✕'; }
-      else { filters[key]=null; c.textContent=label; }
-      applyFilters();
-    });
-    chips.appendChild(c);
-  }
-  addChip('Има опрема','eq');
-  addChip('Предупредување','warn');
-
-  function applyFilters(){
-    const q=(search?.value||'').toLowerCase().trim();
-    items.forEach(it=>{
-      const text = [it.dataset.prod,it.dataset.elems,it.dataset.conds,it.dataset.text].join(' ');
-      const okText = text.includes(q);
-      const okEq   = (filters.eq===null)   || (+it.dataset.hasEq===filters.eq);
-      const okWarn = (filters.warn===null) || (+it.dataset.hasWarn===filters.warn);
-      it.style.display = (okText && okEq && okWarn) ? '' : 'none';
-    });
-  }
-  function applySort(){
-    const val=sortSel.value;
-    const grid=document.getElementById('exp-grid');
-    const sorted=[...items].sort((a,b)=>{
-      const ai=+a.dataset.id, bi=+b.dataset.id;
-      const ap=a.dataset.prod, bp=b.dataset.prod;
-      const ae=a.dataset.elems, be=b.dataset.elems;
-      if(val==='id_desc') return bi-ai;
-      if(val==='id_asc')  return ai-bi;
-      if(val==='prod_az') return ap.localeCompare(bp,'mk');
-      if(val==='elem_az') return ae.localeCompare(be,'mk');
-      return 0;
-    });
-    sorted.forEach(el=>grid.appendChild(el));
-  }
-
-  search?.addEventListener('input', applyFilters);
-  sortSel?.addEventListener('change', applySort);
-  applySort();
-</script>
+<div class="mt-3">
+    <a href="/dashboard" class="btn btn-primary">Назад до Dashboard</a>
+</div>
 {% endblock %}
Index: mplates/home.html
===================================================================
--- templates/home.html	(revision bc45cb5da7c6d8482bc21838561ed96e007b138d)
+++ 	(revision )
@@ -1,203 +1,0 @@
-{% extends "base.html" %}
-{% block title %}SIMLAB — Виртуелна лабораторија{% endblock %}
-
-{% block content %}
-<style>
-  .hero{
-    background: linear-gradient(135deg,#232526,#414345);
-    color:#fff;border-radius:18px;padding:22px 24px;margin-bottom:18px;
-    display:flex;align-items:center;justify-content:space-between;gap:14px
-  }
-  .hero .kicker{opacity:.85;font-size:.95rem}
-  .hero .cta-wrap{display:flex;gap:10px;flex-wrap:wrap}
-  .soft{
-    background:#ffffff;border-radius:16px;box-shadow:0 10px 24px rgba(0,0,0,.06);
-    border:0
-  }
-  .feature-card .card-header{
-    background:linear-gradient(135deg,#6a11cb,#2575fc);color:#fff;border:0
-  }
-  .feature-card .iconbox{
-    width:42px;height:42px;border-radius:12px;background:#ffffff22;
-    display:flex;align-items:center;justify-content:center
-  }
-  .muted{color:#6c757d}
-  .quick{
-    display:grid;grid-template-columns:repeat(3,1fr);gap:14px
-  }
-  @media (max-width: 992px){ .quick{grid-template-columns:1fr} }
-  .pill-link{
-    display:flex;align-items:center;gap:10px;padding:10px 12px;border-radius:999px;
-    border:1px solid #e9ecef;background:#f8fafc;font-weight:600;text-decoration:none
-  }
-  .pill-link:hover{background:#eef2ff;border-color:#dfe4ff}
-</style>
-
-<!-- HERO -->
-<div class="hero">
-  <div>
-    <div class="kicker">🧪 SIMLAB — Виртуелна хемиска лабораторија</div>
-    <h2 class="mb-1">Учете, симулирајте и анализирајте реакции</h2>
-    <div class="opacity-75">Безбедно окружење за студенти и професори со реални податоци и извештаи</div>
-  </div>
-
-  <div class="cta-wrap">
-    {% if is_logged %}
-      <a href="/dashboard" class="btn btn-light fw-semibold">
-        <i class="bi bi-speedometer2"></i> Оди на Dashboard
-      </a>
-    {% else %}
-      <a href="/login" class="btn btn-light fw-semibold">
-        <i class="bi bi-box-arrow-in-right"></i> Најава
-      </a>
-      <a href="/register" class="btn btn-outline-light">
-        <i class="bi bi-person-plus"></i> Регистрација
-      </a>
-    {% endif %}
-    <button id="db-check" class="btn btn-ghost btn-sm" style="border:1px solid #ffffff55;color:#fff">
-      <i class="bi bi-activity"></i> Провери база
-    </button>
-  </div>
-</div>
-
-<!-- КЛУЧНИ ПАТЕКИ -->
-<div class="row g-3">
-  <!-- Елементи -->
-  <div class="col-md-4">
-    <div class="card soft feature-card h-100">
-      <div class="card-header d-flex align-items-center justify-content-between">
-        <div class="d-flex align-items-center gap-2">
-          <div class="iconbox"><i class="bi bi-flask"></i></div>
-          <h5 class="mb-0">Хемиски елементи</h5>
-        </div>
-        {% if role == 'teacher' %}
-          <a href="/elements/add" class="btn btn-light btn-sm fw-semibold"><i class="bi bi-plus-circle"></i></a>
-        {% endif %}
-      </div>
-      <div class="card-body">
-        <p class="muted">Прелистајте ги елементите и нивните својства.</p>
-        <a href="/elements" class="btn btn-outline-primary">
-          <i class="bi bi-search"></i> Прегледај елементи
-        </a>
-      </div>
-    </div>
-  </div>
-
-  <!-- Опрема -->
-  <div class="col-md-4">
-    <div class="card soft feature-card h-100">
-      <div class="card-header d-flex align-items-center justify-content-between" style="background:linear-gradient(135deg,#11998e,#38ef7d)">
-        <div class="d-flex align-items-center gap-2">
-          <div class="iconbox"><i class="bi bi-tools"></i></div>
-          <h5 class="mb-0">Лабораториска опрема</h5>
-        </div>
-        {% if role == 'teacher' %}
-          <a href="/equipment/add" class="btn btn-light btn-sm fw-semibold"><i class="bi bi-plus-circle"></i></a>
-        {% endif %}
-      </div>
-      <div class="card-body">
-        <p class="muted">Каталог на опрема со безбедносни насоки.</p>
-        <a href="/equipment" class="btn btn-outline-success">
-          <i class="bi bi-wrench"></i> Прегледај опрема
-        </a>
-      </div>
-    </div>
-  </div>
-
-  <!-- Лабораторија -->
-  <div class="col-md-4">
-    <div class="card soft feature-card h-100">
-      <div class="card-header d-flex align-items-center justify-content-between" style="background:linear-gradient(135deg,#ee0979,#ff6a00)">
-        <div class="d-flex align-items-center gap-2">
-          <div class="iconbox"><i class="bi bi-radioactive"></i></div>
-          <h5 class="mb-0">Виртуелна лабораторија</h5>
-        </div>
-      </div>
-      <div class="card-body">
-        <p class="muted">Симулирај реакции со drag-and-drop и евидентирај експерименти.</p>
-        <a href="/laboratory" class="btn btn-outline-danger">
-          <i class="bi bi-flask"></i> Отвори лабораторија
-        </a>
-      </div>
-    </div>
-  </div>
-</div>
-
-<!-- Брзи врски / контекст по улога -->
-<div class="card soft mt-3">
-  <div class="card-body">
-    <div class="d-flex align-items-center justify-content-between flex-wrap gap-2">
-      <div class="fw-bold"><i class="bi bi-lightning"></i> Брзи врски</div>
-      <div class="quick">
-        {% if role == 'teacher' %}
-          <a class="pill-link" href="/reactions"><i class="bi bi-diagram-3"></i> Реакции</a>
-          <a class="pill-link" href="/reports"><i class="bi bi-bar-chart"></i> Извештаи</a>
-          <a class="pill-link" href="/my_students"><i class="bi bi-people"></i> Мои студенти</a>
-        {% elif role == 'student' %}
-          <a class="pill-link" href="/my-experiments"><i class="bi bi-journal-text"></i> Мои експерименти</a>
-          <a class="pill-link" href="/elements"><i class="bi bi-flask"></i> Елементи</a>
-          <a class="pill-link" href="/laboratory"><i class="bi bi-radioactive"></i> Лабораторија</a>
-        {% else %}
-          <a class="pill-link" href="/elements"><i class="bi bi-flask"></i> Елементи</a>
-          <a class="pill-link" href="/equipment"><i class="bi bi-tools"></i> Опрема</a>
-          <a class="pill-link" href="/reports"><i class="bi bi-bar-chart"></i> Извештаи</a>
-        {% endif %}
-      </div>
-    </div>
-  </div>
-</div>
-
-<!-- Инфо секција -->
-<div class="row g-3 mt-3">
-  <div class="col-lg-7">
-    <div class="card soft">
-      <div class="card-body">
-        <h5 class="mb-2"><i class="bi bi-info-circle"></i> Што нуди SIMLAB?</h5>
-        <ul class="mb-0 muted">
-          <li>Каталог на елементи и лабораториска опрема.</li>
-          <li>Визуелна симулација на реакции со евиденција на експерименти.</li>
-          <li>Извештаи за активност/опрема/популарност на елементи.</li>
-          <li>Различни улоги: професор/студент со прилагодени алатки.</li>
-        </ul>
-      </div>
-    </div>
-  </div>
-  <div class="col-lg-5">
-    <div class="card soft">
-      <div class="card-body">
-        <h6 class="mb-2"><i class="bi bi-broadcast-pin"></i> Состојба на систем</h6>
-        <div id="db-status" class="small muted">Базата: <em>непроверено</em></div>
-        <div id="db-msg" class="mt-2"></div>
-      </div>
-    </div>
-  </div>
-</div>
-
-<script>
-  // Лесен health-check кон /test-db (истиот што веќе го имаш)
-  const btn = document.getElementById('db-check');
-  const status = document.getElementById('db-status');
-  const msg = document.getElementById('db-msg');
-  if(btn){
-    btn.addEventListener('click', async () => {
-      btn.disabled = true; btn.innerHTML = '<i class="bi bi-hourglass-split"></i> Проверувам...';
-      try{
-        const res = await fetch('/test-db');
-        const data = await res.json();
-        if(data.status === 'success'){
-          status.innerHTML = 'Базата: <span class="text-success fw-semibold">онлајн</span>';
-          msg.innerHTML = '<div class="alert alert-success py-2 my-2"><i class="bi bi-check-circle"></i> ' + (data.message||'') + '</div>';
-        }else{
-          status.innerHTML = 'Базата: <span class="text-danger fw-semibold">проблем</span>';
-          msg.innerHTML = '<div class="alert alert-danger py-2 my-2"><i class="bi bi-x-octagon"></i> ' + (data.message||'') + '</div>';
-        }
-      }catch(e){
-        status.innerHTML = 'Базата: <span class="text-danger fw-semibold">недостапна</span>';
-        msg.innerHTML = '<div class="alert alert-danger py-2 my-2">Исклучок: ' + e + '</div>';
-      }finally{
-        btn.disabled = false; btn.innerHTML = '<i class="bi bi-activity"></i> Провери база';
-      }
-    });
-  }
-</script>
-{% endblock %}
Index: templates/laboratory.html
===================================================================
--- templates/laboratory.html	(revision bc45cb5da7c6d8482bc21838561ed96e007b138d)
+++ templates/laboratory.html	(revision 14fe7c26eea0eb44ab5dbcea992e11378a7f6d4e)
@@ -1,102 +1,84 @@
 {% extends "base.html" %}
-{% block title %}Лабораторија - Професор{% endblock %}
+{% block title %}Виртуелна лабораторија{% endblock %}
 
 {% block content %}
 <div class="container-fluid">
-  <div class="row">
-    <div class="col-12 text-center mb-4">
-      <h2>🧬 Професорска лабораторија</h2>
-      <p class="lead">Тестирајте реакции и креирајте експерименти</p>
+    <div class="row">
+        <div class="col-12 text-center mb-4">
+            <h2>Виртуелна хемиска лабораторија</h2>
+            <p class="lead">Изберете два елементи за да видите дали можат да реагираат</p>
+        </div>
     </div>
-  </div>
-
-  <div class="row justify-content-center">
-    <div class="col-md-10">
-      <div class="card shadow-lg">
-        <div class="card-body p-4">
-          <div style="display:grid;grid-template-columns:1fr 150px 1fr;gap:40px;align-items:center;margin-bottom:40px;">
-            <div class="text-center">
-              <div id="element1-display" style="width:130px;height:130px;border:3px dashed #6f42c1;border-radius:50%;display:flex;flex-direction:column;align-items:center;justify-content:center;margin:0 auto;background:#f8f9fa;transition:.3s">
-                <span style="color:#666;">Избери<br>Елемент 1</span>
-              </div>
-              <select class="form-select mt-3" id="element1-select" style="max-width:200px;margin:15px auto;">
-                <option value="">-- Избери прв елемент --</option>
-                {% for element in elements %}
-                <option value="{{ element.element_id }}" data-symbol="{{ element.symbol }}" data-name="{{ element.element_name }}">
-                  {{ element.symbol }} - {{ element.element_name }}
-                </option>
-                {% endfor %}
-              </select>
-            </div>
-
-            <div class="text-center">
-              <div style="font-size:24px;color:#6f42c1;font-weight:bold;margin-bottom:15px;">+</div>
-              <button type="button" class="btn btn-primary btn-lg" id="react-btn" disabled onclick="testReaction()" style="border-radius:20px;padding:12px 25px;background:linear-gradient(45deg,#6f42c1,#007bff);">
-                🔬 Тестирај
-              </button>
-              <div style="font-size:24px;color:#6f42c1;font-weight:bold;margin-top:15px;">→</div>
-            </div>
-
-            <div class="text-center">
-              <div id="element2-display" style="width:130px;height:130px;border:3px dashed #6f42c1;border-radius:50%;display:flex;flex-direction:column;align-items:center;justify-content:center;margin:0 auto;background:#f8f9fa;transition:.3s">
-                <span style="color:#666;">Избери<br>Елемент 2</span>
-              </div>
-              <select class="form-select mt-3" id="element2-select" style="max-width:200px;margin:15px auto;">
-                <option value="">-- Избери втор елемент --</option>
-                {% for element in elements %}
-                <option value="{{ element.element_id }}" data-symbol="{{ element.symbol }}" data-name="{{ element.element_name }}">
-                  {{ element.symbol }} - {{ element.element_name }}
-                </option>
-                {% endfor %}
-              </select>
-            </div>
-          </div>
-
-          <div id="result-area" style="display:none;margin-top:30px;">
-            <div class="card" id="result-card">
-              <div class="card-body">
-                <div id="result-content"></div>
-
-                <div id="teacher-actions" class="mt-4 text-center" style="display:none;">
-                  <button class="btn btn-success" type="button" onclick="createNewReaction()">➕ Креирај нова реакција</button>
-                  <button class="btn btn-warning" type="button" onclick="testAsStudent()">👨‍🎓 Тестирај како студент</button>
+
+    <div class="row justify-content-center">
+        <div class="col-md-10">
+            <div class="card shadow-lg">
+                <div class="card-body p-4">
+                    <!-- Симулациска област -->
+                    <div style="display: grid; grid-template-columns: 1fr 150px 1fr; gap: 40px; align-items: center; margin-bottom: 40px;">
+                        
+                        <!-- Првин елемент -->
+                        <div class="text-center">
+                            <div id="element1-display" style="width: 130px; height: 130px; border: 3px dashed #007bff; border-radius: 50%; display: flex; flex-direction: column; align-items: center; justify-content: center; margin: 0 auto; background: #f8f9fa; transition: all 0.3s ease;">
+                                <span style="color: #666;">Избери<br>Елемент 1</span>
+                            </div>
+                            <select class="form-select mt-3" id="element1-select" style="max-width: 200px; margin: 15px auto;">
+                                <option value="">-- Избери првин елемент --</option>
+                                {% for element in elements %}
+                                <option value="{{ element.symbol }}" data-name="{{ element.element_name }}">
+                                    {{ element.symbol }} - {{ element.element_name }}
+                                </option>
+                                {% endfor %}
+                            </select>
+                        </div>
+                        
+                        <!-- Центар со копче -->
+                        <div class="text-center">
+                            <div style="font-size: 24px; color: #28a745; font-weight: bold; margin-bottom: 15px;">+</div>
+                            <button class="btn btn-success btn-lg" id="react-btn" disabled onclick="simulateReaction()" style="border-radius: 20px; padding: 12px 25px;">
+                                Реагирај
+                            </button>
+                            <div style="font-size: 24px; color: #007bff; font-weight: bold; margin-top: 15px;">→</div>
+                        </div>
+                        
+                        <!-- Втор елемент -->
+                        <div class="text-center">
+                            <div id="element2-display" style="width: 130px; height: 130px; border: 3px dashed #007bff; border-radius: 50%; display: flex; flex-direction: column; align-items: center; justify-content: center; margin: 0 auto; background: #f8f9fa; transition: all 0.3s ease;">
+                                <span style="color: #666;">Избери<br>Елемент 2</span>
+                            </div>
+                            <select class="form-select mt-3" id="element2-select" style="max-width: 200px; margin: 15px auto;">
+                                <option value="">-- Избери втор елемент --</option>
+                                {% for element in elements %}
+                                <option value="{{ element.symbol }}" data-name="{{ element.element_name }}">
+                                    {{ element.symbol }} - {{ element.element_name }}
+                                </option>
+                                {% endfor %}
+                            </select>
+                        </div>
+                    </div>
+                    
+                    <!-- Резултат област -->
+                    <div id="result-area" style="display: none; margin-top: 30px;">
+                        <div class="card" id="result-card">
+                            <div class="card-body text-center">
+                                <div id="result-content"></div>
+                                <button class="btn btn-primary mt-3" id="save-experiment-btn" onclick="saveAsExperiment()" style="display: none;">
+                                    Зачувај како експеримент
+                                </button>
+                            </div>
+                        </div>
+                    </div>
                 </div>
-
-                <div id="new-reaction-form" style="display:none;" class="mt-4">
-                  <h5>Креирај нова реакција и експеримент</h5>
-                  <div class="form-group mb-2">
-                    <label>Продукт:</label>
-                    <input type="text" id="product-input" class="form-control" placeholder="Внеси продукт на реакцијата">
-                  </div>
-                  <div class="form-group mb-2">
-                    <label>Услови:</label>
-                    <textarea id="conditions-input" class="form-control" rows="2" placeholder="Опиши услови за реакцијата"></textarea>
-                  </div>
-                  <div class="form-group mb-2">
-                    <label>Опис на експеримент:</label>
-                    <textarea id="expres-input" class="form-control" rows="3" placeholder="Краток опис на постапката/исходот"></textarea>
-                  </div>
-                  <div class="form-group mb-3">
-                    <label>Безбедносни предупредувања:</label>
-                    <textarea id="safety-input" class="form-control" rows="2" placeholder="Стандардни безбедносни мерки"></textarea>
-                  </div>
-                  <button class="btn btn-primary" type="button" onclick="saveNewReaction()">💾 Зачувај реакција и експеримент</button>
-                  <button class="btn btn-secondary" type="button" onclick="cancelNewReaction()">❌ Откажи</button>
-                </div>
-              </div>
-            </div>
-          </div>
-
-        </div> <!-- card-body -->
-      </div>
+            </div>
+        </div>
     </div>
-  </div>
 </div>
 
 <div class="mt-4 text-center">
-  <a href="/dashboard" class="btn btn-secondary">Назад до Dashboard</a>
-  <a href="/reactions" class="btn btn-info">📋 Управувај реакции</a>
-  <a href="/experiments" class="btn btn-warning">📊 Сите експерименти</a>
-  <a href="/my-experiments" class="btn btn-success">📝 Мои експерименти</a>
+    <a href="/dashboard" class="btn btn-secondary">Назад до Dashboard</a>
+    {% if user_role == 'teacher' %}
+        <a href="/reactions" class="btn btn-info">Управувај реакции</a>
+    {% endif %}
+    <a href="/experiments" class="btn btn-warning">Види експерименти</a>
 </div>
 
@@ -106,183 +88,151 @@
 
 document.addEventListener('DOMContentLoaded', function() {
-  document.getElementById('element1-select').addEventListener('change', function() {
-    updateElementDisplay(this, 'element1-display', 'element1');
-    checkReactionReady();
-  });
-  document.getElementById('element2-select').addEventListener('change', function() {
-    updateElementDisplay(this, 'element2-display', 'element2');
-    checkReactionReady();
-  });
+    document.getElementById('element1-select').addEventListener('change', function() {
+        updateElementDisplay(this, 'element1-display', 'element1');
+        checkReactionReady();
+    });
+    
+    document.getElementById('element2-select').addEventListener('change', function() {
+        updateElementDisplay(this, 'element2-display', 'element2');
+        checkReactionReady();
+    });
 });
 
-function updateElementDisplay(select, displayId, key) {
-  const display = document.getElementById(displayId);
-  const id = select.value;
-  const symbol = select.options[select.selectedIndex]?.dataset?.symbol || '';
-  const name = select.options[select.selectedIndex]?.dataset?.name || '';
-
-  if (id) {
-    display.innerHTML = `
-      <div style="font-size:36px;font-weight:bold;color:#fff;">${symbol}</div>
-      <div style="font-size:12px;margin-top:5px;color:#fff;">${name}</div>`;
-    display.style.borderColor = '#6f42c1';
-    display.style.background = 'linear-gradient(45deg,#6f42c1,#007bff)';
-    selectedElements[key] = { id: parseInt(id), symbol, name };
-  } else {
-    display.innerHTML = displayId === 'element1-display'
-      ? '<span style="color:#666;">Избери<br>Елемент 1</span>'
-      : '<span style="color:#666;">Избери<br>Елемент 2</span>';
-    display.style.borderColor = '#6f42c1';
-    display.style.background = '#f8f9fa';
-    delete selectedElements[key];
-  }
+function updateElementDisplay(select, displayId, elementKey) {
+    const display = document.getElementById(displayId);
+    const value = select.value;
+    const name = select.options[select.selectedIndex]?.dataset?.name || '';
+    
+    if (value) {
+        display.innerHTML = `
+            <div style="font-size: 36px; font-weight: bold; color: white;">${value}</div>
+            <div style="font-size: 12px; margin-top: 5px; color: white;">${name}</div>
+        `;
+        display.style.borderColor = '#28a745';
+        display.style.background = 'linear-gradient(45deg, #28a745, #20c997)';
+        
+        selectedElements[elementKey] = { symbol: value, name: name };
+    } else {
+        display.innerHTML = displayId === 'element1-display' ? 
+            '<span style="color: #666;">Избери<br>Елемент 1</span>' : 
+            '<span style="color: #666;">Избери<br>Елемент 2</span>';
+        display.style.borderColor = '#007bff';
+        display.style.background = '#f8f9fa';
+        
+        delete selectedElements[elementKey];
+    }
 }
 
 function checkReactionReady() {
-  document.getElementById('react-btn').disabled = !(selectedElements.element1 && selectedElements.element2);
-}
-
-function testReaction() {
-  if (!selectedElements.element1 || !selectedElements.element2) return;
-
-  const btn = document.getElementById('react-btn');
-  btn.innerHTML = '⏳ Проверувам...';
-  btn.disabled = true;
-
-  fetch('/api/simulate-reaction', {
-    method: 'POST',
-    headers: { 'Content-Type': 'application/json' },
-    body: JSON.stringify({
-      element1: selectedElements.element1.symbol,
-      element2: selectedElements.element2.symbol
+    const reactBtn = document.getElementById('react-btn');
+    reactBtn.disabled = !(selectedElements.element1 && selectedElements.element2);
+}
+
+function simulateReaction() {
+    if (!selectedElements.element1 || !selectedElements.element2) return;
+    
+    // Анимација на копчето
+    const btn = document.getElementById('react-btn');
+    btn.innerHTML = 'Проверувам...';
+    btn.disabled = true;
+    
+    fetch('/api/simulate-reaction', {
+        method: 'POST',
+        headers: {
+            'Content-Type': 'application/json',
+        },
+        body: JSON.stringify({
+            element1: selectedElements.element1.symbol,
+            element2: selectedElements.element2.symbol
+        })
     })
-  })
-  .then(async (resp) => {
-    const text = await resp.text();
-    let data;
-    try {
-      data = JSON.parse(text);
-    } catch (e) {
-      throw new Error(`Неочекуван одговор од серверот: ${text.substring(0, 200)}`);
+    .then(response => response.json())
+    .then(data => {
+        showResult(data);
+        btn.innerHTML = 'Реагирај';
+        btn.disabled = false;
+    })
+    .catch(error => {
+        console.error('Грешка:', error);
+        btn.innerHTML = 'Реагирај';
+        btn.disabled = false;
+    });
+}
+
+function showResult(data) {
+    const resultArea = document.getElementById('result-area');
+    const resultCard = document.getElementById('result-card');
+    const resultContent = document.getElementById('result-content');
+    const saveBtn = document.getElementById('save-experiment-btn');
+    
+    resultArea.style.display = 'block';
+    
+    if (data.success) {
+        currentReactionData = data;
+        resultCard.className = 'card border-success';
+        resultContent.innerHTML = `
+            <h4 class="text-success">Успешна реакција!</h4>
+            <div style="font-size: 24px; font-weight: bold; margin: 20px 0; color: #28a745;">
+                ${selectedElements.element1.symbol} + ${selectedElements.element2.symbol} → ${data.product}
+            </div>
+            <div class="row">
+                <div class="col-md-6">
+                    <strong>Продукт:</strong> ${data.product}
+                </div>
+                <div class="col-md-6">
+                    <strong>Услови:</strong> ${data.conditions || 'Стандардни услови'}
+                </div>
+            </div>
+        `;
+        saveBtn.style.display = 'inline-block';
+    } else {
+        currentReactionData = null;
+        resultCard.className = 'card border-warning';
+        resultContent.innerHTML = `
+            <h4 class="text-warning">Реакцијата не е пронајдена</h4>
+            <p class="mb-3">${data.message}</p>
+            <div style="font-size: 18px; color: #856404; margin: 15px 0;">
+                ${selectedElements.element1.symbol} + ${selectedElements.element2.symbol} → ?
+            </div>
+            {% if user_role == 'teacher' %}
+            <div class="mt-3">
+                <a href="/reactions/add" class="btn btn-primary btn-sm">Додај ја оваа реакција</a>
+            </div>
+            {% endif %}
+        `;
+        saveBtn.style.display = 'none';
     }
-    if (!resp.ok) {
-      throw new Error(data.message || `HTTP ${resp.status}`);
-    }
-    return data;
-  })
-  .then((data) => {
-    showTeacherResult(data);
-    btn.innerHTML = '🔬 Тестирај';
-    btn.disabled = false;
-  })
-  .catch((err) => {
-    console.error(err);
-    alert(err.message);
-    btn.innerHTML = '🔬 Тестирај';
-    btn.disabled = false;
-  });
-}
-
-
-function showTeacherResult(data) {
-  const resultArea = document.getElementById('result-area');
-  const resultCard = document.getElementById('result-card');
-  const resultContent = document.getElementById('result-content');
-  const teacherActions = document.getElementById('teacher-actions');
-
-  resultArea.style.display = 'block';
-  document.getElementById('new-reaction-form').style.display = 'none';
-
-  if (data.success) {
-    currentReactionData = data;
-    resultCard.className = 'card border-success';
-    resultContent.innerHTML = `
-      <h4 class="text-success">✅ Постои реакција!</h4>
-      <div style="font-size:24px;font-weight:bold;margin:20px 0;color:#28a745;text-align:center;">
-        ${selectedElements.element1.symbol} + ${selectedElements.element2.symbol} → ${data.product}
-      </div>
-      <div class="row">
-        <div class="col-md-6"><strong>Продукт:</strong> ${data.product}</div>
-        <div class="col-md-6"><strong>Услови:</strong> ${data.conditions || 'Стандардни услови'}</div>
-      </div>
-      <div class="alert alert-info mt-3">
-        <strong>Reaction ID:</strong> ${data.reaction_id}<br>
-        <small>Реакцијата постои и студентите можат да ја користат.</small>
-      </div>`;
-    teacherActions.style.display = 'block';
-  } else {
-    currentReactionData = null;
-    resultCard.className = 'card border-warning';
-    resultContent.innerHTML = `
-      <h4 class="text-warning">⚠️ Реакцијата не постои</h4>
-      <div style="font-size:18px;color:#856404;margin:15px 0;text-align:center;">
-        ${selectedElements.element1.symbol} + ${selectedElements.element2.symbol} → ?
-      </div>
-      <div class="alert alert-warning">
-        <strong>Оваа реакција не е дефинирана.</strong> Креирај ја сега и автоматски ќе се додаде експеримент.
-      </div>`;
-    teacherActions.style.display = 'block';
-  }
-}
-
-function createNewReaction() {
-  document.getElementById('new-reaction-form').style.display = 'block';
-  document.getElementById('teacher-actions').style.display = 'none';
-}
-
-function cancelNewReaction() {
-  document.getElementById('new-reaction-form').style.display = 'none';
-  document.getElementById('teacher-actions').style.display = 'block';
-}
-
-function saveNewReaction() {
-  const product = document.getElementById('product-input').value.trim();
-  const conditions = document.getElementById('conditions-input').value.trim();
-  const safety = document.getElementById('safety-input').value.trim() || 'Стандардни безбедносни мерки';
-  const expRes = document.getElementById('expres-input').value.trim();
-
-  if (!selectedElements.element1 || !selectedElements.element2) {
-    alert('Изберете два елементи.');
-    return;
-  }
-  if (!product) {
-    alert('Внесете продукт на реакцијата!');
-    return;
-  }
-
-  const params = new URLSearchParams({
-    element1_id: selectedElements.element1.id,
-    element2_id: selectedElements.element2.id,
-    product: product,
-    conditions: conditions,
-    experiment_result: expRes,
-    safety_warning: safety
-  });
-
-  fetch('/reactions/add', {
-    method: 'POST',
-    headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
-    body: params.toString()
-  })
-  .then(resp => {
-    if (resp.redirected) {
-      window.location.href = resp.url;
-      return;
-    }
-    if (resp.ok) {
-      alert('Реакцијата и експериментот се успешно креирани!');
-      window.location.href = '/reactions';
-    } else {
-      alert('Грешка при креирање на реакцијата.');
-    }
-  })
-  .catch(err => {
-    console.error(err);
-    alert('Грешка при креирање.');
-  });
-}
-
-function testAsStudent() {
-  window.location.href = '/laboratory';
+}
+
+function saveAsExperiment() {
+    if (!currentReactionData) return;
+    
+    const saveBtn = document.getElementById('save-experiment-btn');
+    saveBtn.innerHTML = 'Зачувувам...';
+    saveBtn.disabled = true;
+    
+    fetch('/save-experiment', {
+        method: 'POST',
+        headers: {
+            'Content-Type': 'application/json',
+        },
+        body: JSON.stringify({
+            reaction_id: currentReactionData.reaction_id,
+            result: `Симулирана реакција: ${currentReactionData.elements} → ${currentReactionData.product}`,
+            safety_warning: 'Симулирана реакција - без реални ризици'
+        })
+    })
+    .then(response => response.json())
+    .then(data => {
+        if (data.success) {
+            alert('Експериментот е успешно зачуван!');
+            saveBtn.innerHTML = 'Зачувано!';
+            saveBtn.className = 'btn btn-success mt-3';
+        } else {
+            alert('Грешка при зачувување: ' + data.message);
+            saveBtn.innerHTML = 'Зачувај како експеримент';
+            saveBtn.disabled = false;
+        }
+    });
 }
 </script>
Index: templates/my_experiments.html
===================================================================
--- templates/my_experiments.html	(revision bc45cb5da7c6d8482bc21838561ed96e007b138d)
+++ templates/my_experiments.html	(revision 14fe7c26eea0eb44ab5dbcea992e11378a7f6d4e)
@@ -3,190 +3,106 @@
 
 {% block content %}
-<style>
-  .hero{background:linear-gradient(135deg,#6a11cb,#2575fc);color:#fff;border-radius:18px;padding:18px 22px;display:flex;align-items:center;justify-content:space-between;gap:12px}
-  .role-badge{background:#ffffff22;color:#fff;border-radius:999px;padding:6px 12px;font-weight:700}
-  .stat-card{border:0;border-radius:16px;box-shadow:0 12px 28px rgba(0,0,0,.08)}
-  .toolbar{display:flex;flex-wrap:wrap;gap:10px;align-items:center;margin:14px 0}
-  .search-input{min-width:260px}
-  .exp-card{border:0;border-radius:16px;overflow:hidden;box-shadow:0 12px 28px rgba(0,0,0,.08)}
-  .exp-card .card-header{background:linear-gradient(135deg,#667eea,#764ba2);color:#fff}
-  .eq{font-weight:800;font-size:18px;background:#f8f9fa;border:1px solid #edf0f4;border-radius:12px;padding:10px 12px}
-  .empty{border:2px dashed #e9ecef;border-radius:16px;padding:24px;text-align:center;color:#6c757d}
-</style>
-
-<!-- HERO -->
-<div class="hero">
-  <div>
-    <h2 class="mb-0">📊 Мои експерименти</h2>
-    <div class="small opacity-75">{{ user_name }}</div>
-  </div>
-  <div class="d-flex align-items-center gap-2">
-    <span class="role-badge"><i class="bi bi-person-badge"></i> {{ 'Професор' if user_role=='teacher' else 'Студент' }}</span>
-    <a href="/dashboard" class="btn btn-light btn-sm"><i class="bi bi-speedometer2"></i> Dashboard</a>
-    <a href="/laboratory" class="btn btn-outline-light btn-sm"><i class="bi bi-flask"></i> Нов експеримент</a>
-  </div>
+<div class="row">
+    <div class="col-12">
+        <h2>Мои експерименти</h2>
+        <p class="text-muted">{{ user_name }} ({{ user_role }})</p>
+    </div>
 </div>
 
-{% if not experiments %}
-  <div class="empty mt-3">
-    📚 Немате извршено експерименти.
-    <div class="mt-2"><a href="/laboratory" class="btn btn-primary btn-sm">🔬 Отвори лабораторија</a></div>
-  </div>
-{% else %}
-
-  <!-- Mini-статистики -->
-  <div class="row mt-3">
-    <div class="col-md-4 mb-3">
-      <div class="card stat-card text-center">
-        <div class="card-body">
-          <h3 class="text-success">{{ experiments|map(attribute='product')|unique|list|length }}</h3>
-          <div class="text-muted mb-0">Различни продукти</div>
+<div class="row mt-3">
+    {% for experiment in experiments %}
+    <div class="col-md-6 col-lg-4 mb-4">
+        <div class="card shadow-sm">
+            <div class="card-header d-flex justify-content-between align-items-center">
+                <span class="badge bg-primary">Експеримент #{{ experiment.experiment_id }}</span>
+                <small class="text-muted">{{ experiment.participation_timestamp.strftime('%d.%m.%Y %H:%M') if experiment.participation_timestamp }}</small>
+            </div>
+            <div class="card-body">
+                <div class="reaction-equation text-center mb-3 p-3 bg-light rounded">
+                    <strong style="font-size: 18px;">
+                        {{ experiment.element1_symbol }} + {{ experiment.element2_symbol }} → {{ experiment.product.split('(')[0].strip() }}
+                    </strong>
+                </div>
+                
+                <div class="mb-2">
+                    <strong>Реактанти:</strong> {{ experiment.element1_name }} + {{ experiment.element2_name }}
+                </div>
+                
+                <div class="mb-2">
+                    <strong>Продукт:</strong> {{ experiment.product }}
+                </div>
+                
+                <div class="mb-2">
+                    <strong>Услови:</strong> {{ experiment.conditions or 'Стандардни услови' }}
+                </div>
+                
+                <div class="mb-3">
+                    <strong>Резултат:</strong> {{ experiment.result[:100] }}{% if experiment.result|length > 100 %}...{% endif %}
+                </div>
+                
+                {% if experiment.safety_warning %}
+                <div class="alert alert-warning alert-sm p-2">
+                    <small><strong>Безбедност:</strong> {{ experiment.safety_warning }}</small>
+                </div>
+                {% endif %}
+                
+                <div class="text-center">
+                    <button class="btn btn-info btn-sm" onclick="showExperimentDetails({ experiment,experiment_id })">
+                        Детални информации
+                    </button>
+                </div>
+            </div>
         </div>
-      </div>
     </div>
-    <div class="col-md-4 mb-3">
-      <div class="card stat-card text-center">
-        <div class="card-body">
-          <h3 class="text-warning">{{ experiments|selectattr('safety_warning')|list|length }}</h3>
-          <div class="text-muted mb-0">Со предупредувања</div>
+    {% else %}
+    <div class="col-12">
+        <div class="alert alert-info text-center">
+            <h4>Нема извршени експерименти</h4>
+            <p>Започнете со користење на виртуелната лабораторија за да создадете експерименти.</p>
+            <a href="/laboratory" class="btn btn-primary">Отвори лабораторија</a>
         </div>
-      </div>
-    </div>
-    <div class="col-md-4 mb-3">
-      <div class="card stat-card text-center">
-        <div class="card-body">
-          <h3 class="text-info">
-            {% if experiments[0].participation_timestamp %}
-              {{ experiments[0].participation_timestamp.strftime('%d.%m') }}
-            {% elif experiments[0].time_stamp %}
-              {{ experiments[0].time_stamp.strftime('%d.%m') }}
-            {% endif %}
-          </h3>
-          <div class="text-muted mb-0">Последен експеримент</div>
-        </div>
-      </div>
-    </div>
-  </div>
-
-  <!-- Toolbar (client-side filter/sort) -->
-  <div class="toolbar">
-    <div class="input-group search-input">
-      <span class="input-group-text"><i class="bi bi-search"></i></span>
-      <input id="search" class="form-control" placeholder="Пребарај по елемент/продукт/услов...">
-    </div>
-    <select id="sort" class="form-select" style="max-width:220px">
-      <option value="date_desc">Најново</option>
-      <option value="date_asc">Најстаро</option>
-      <option value="prod_az">Продукт (A–Z)</option>
-      <option value="elem_az">Елементи (A–Z)</option>
-    </select>
-  </div>
-
-  <!-- Grid -->
-  <div id="myexp-grid" class="row mt-1">
-    {% for x in experiments %}
-    <div class="col-md-6 col-lg-4 mb-4 myexp-item"
-         data-id="{{ x.experiment_id }}"
-         data-prod="{{ (x.product or '')|lower }}"
-         data-elems="{{ (x.element1_symbol ~ ' ' ~ x.element2_symbol ~ ' ' ~ x.element1_name ~ ' ' ~ x.element2_name)|lower }}"
-         data-conds="{{ (x.conditions or '')|lower }}"
-         data-date="{% if x.participation_timestamp %}{{ x.participation_timestamp.strftime('%Y%m%d%H%M%S') }}{% elif x.time_stamp %}{{ x.time_stamp.strftime('%Y%m%d%H%M%S') }}{% else %}0000{% endif %}">
-      <div class="card exp-card h-100">
-        <div class="card-header">
-          <div class="d-flex justify-content-between align-items-center text-white">
-            <span><i class="bi bi-flask"></i> Експеримент #{{ x.experiment_id }}</span>
-            <small>
-              {% if x.participation_timestamp %}{{ x.participation_timestamp.strftime('%d.%m.%Y') }}
-              {% elif x.time_stamp %}{{ x.time_stamp.strftime('%d.%m.%Y') }}{% endif %}
-            </small>
-          </div>
-        </div>
-        <div class="card-body">
-          <div class="reaction-equation text-center mb-3 p-3 bg-light rounded">
-            <strong class="d-block eq">{{ x.element1_symbol }} + {{ x.element2_symbol }} → {{ x.product }}</strong>
-          </div>
-
-          <div class="experiment-details">
-            <p class="mb-2"><strong>Реактанти:</strong><br>
-              <span class="text-muted">{{ x.element1_name }} + {{ x.element2_name }}</span></p>
-
-            <p class="mb-2"><strong>Услови:</strong><br>
-              <span class="text-muted">{{ x.conditions or 'Стандардни услови' }}</span></p>
-
-            {% if x.result %}
-            <p class="mb-2"><strong>Резултат:</strong><br>
-              <span class="text-muted">{{ x.result[:100] }}{% if x.result|length>100 %}…{% endif %}</span></p>
-            {% endif %}
-
-            {% if x.safety_warning %}
-            <div class="alert alert-warning py-2 px-2 mb-2">
-              <small><strong>⚠️ Безбедност:</strong> {{ x.safety_warning }}</small>
-            </div>
-            {% endif %}
-
-            {% if x.equipment and x.equipment|length>0 %}
-            <p class="mb-2"><strong>Опрема:</strong></p>
-            <ul class="small text-muted mb-0">
-              {% for eq in x.equipment %}
-              <li>{{ eq.equipment_name }}{% if eq.type %} <span class="text-secondary">({{ eq.type }})</span>{% endif %}</li>
-              {% endfor %}
-            </ul>
-            {% else %}
-            <p class="mb-2"><strong>Опрема:</strong> <span class="text-muted">Нема евидентирана опрема</span></p>
-            {% endif %}
-          </div>
-
-          {% if x.participation_timestamp or x.time_stamp %}
-          <p class="text-muted text-center mt-3 mb-0">
-            <small><i class="bi bi-clock"></i>
-              {% if x.participation_timestamp %}{{ x.participation_timestamp.strftime('%H:%M:%S') }}
-              {% elif x.time_stamp %}{{ x.time_stamp.strftime('%H:%M:%S') }}{% endif %}
-            </small>
-          </p>
-          {% endif %}
-        </div>
-      </div>
     </div>
     {% endfor %}
-  </div>
+</div>
 
+{% if experiments %}
+<div class="row mt-4">
+    <div class="col-12">
+        <div class="card bg-light">
+            <div class="card-body">
+                <div class="row text-center">
+                    <div class="col-md-3">
+                        <h4>{{ experiments|length }}</h4>
+                        <p class="text-muted">Вкупно експерименти</p>
+                    </div>
+                    <div class="col-md-3">
+                        <h4>{{ experiments|map(attribute='product')|unique|list|length }}</h4>
+                        <p class="text-muted">Различни продукти</p>
+                    </div>
+                    <div class="col-md-3">
+                        <h4>{{ experiments|selectattr('safety_warning')|list|length }}</h4>
+                        <p class="text-muted">Со безбедносни предупредувања</p>
+                    </div>
+                    <div class="col-md-3">
+                        <h4>{{ experiments[0].participation_timestamp.strftime('%B %Y') if experiments }}</h4>
+                        <p class="text-muted">Последна активност</p>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
 {% endif %}
 
-<div class="mt-3 text-center">
-  <a href="/dashboard" class="btn btn-secondary">🏠 Dashboard</a>
-  <a href="/laboratory" class="btn btn-success">➕ Нов експеримент</a>
-  {% if user_role == 'teacher' %}<a href="/experiments" class="btn btn-info">📋 Сите експерименти</a>{% endif %}
+<div class="mt-4">
+    <a href="/dashboard" class="btn btn-secondary">Назад до Dashboard</a>
+    <a href="/laboratory" class="btn btn-success">Нов експеримент</a>
 </div>
 
 <script>
-  const items=[...document.querySelectorAll('.myexp-item')];
-  const search=document.getElementById('search');
-  const sortSel=document.getElementById('sort');
-
-  function applyFilters(){
-    const q=(search?.value||'').toLowerCase().trim();
-    items.forEach(it=>{
-      const hay=[it.dataset.prod,it.dataset.elems,it.dataset.conds].join(' ');
-      it.style.display = hay.includes(q) ? '' : 'none';
-    });
-  }
-  function applySort(){
-    const v=sortSel?.value||'date_desc';
-    const grid=document.getElementById('myexp-grid');
-    const sorted=[...items].sort((a,b)=>{
-      const ad=+a.dataset.date, bd=+b.dataset.date;
-      const ap=a.dataset.prod, bp=b.dataset.prod;
-      const ae=a.dataset.elems, be=b.dataset.elems;
-      if(v==='date_desc') return bd-ad;
-      if(v==='date_asc')  return ad-bd;
-      if(v==='prod_az')   return ap.localeCompare(bp,'mk');
-      if(v==='elem_az')   return ae.localeCompare(be,'mk');
-      return 0;
-    });
-    sorted.forEach(el=>grid.appendChild(el));
-  }
-  search?.addEventListener('input', applyFilters);
-  sortSel?.addEventListener('change', applySort);
-  applySort();
+function showExperimentDetails(experimentId) {
+    // Ова може да се прошири со modal или redirect
+    alert('Експеримент #' + experimentId + '\nДетални информации ќе бидат додадени во иднина.');
+}
 </script>
 {% endblock %}
Index: templates/my_students.html
===================================================================
--- templates/my_students.html	(revision bc45cb5da7c6d8482bc21838561ed96e007b138d)
+++ templates/my_students.html	(revision 14fe7c26eea0eb44ab5dbcea992e11378a7f6d4e)
@@ -76,5 +76,5 @@
         <div class="card text-center">
             <div class="card-body">
-                {% set total_views = students|sum(attribute='total_elements_viewed')+ students|sum(attribute='total_lab_equipment_viewed') %}
+                {% set total_views = students|sum(attribute='total_elements_viewed') %}
                 <h5 class="card-title">{{ total_views }}</h5>
                 <p class="card-text">Вкупно прегледи</p>
Index: templates/reactions_list.html
===================================================================
--- templates/reactions_list.html	(revision bc45cb5da7c6d8482bc21838561ed96e007b138d)
+++ templates/reactions_list.html	(revision 14fe7c26eea0eb44ab5dbcea992e11378a7f6d4e)
@@ -3,143 +3,64 @@
 
 {% block content %}
-<style>
-  .page-hero{background:linear-gradient(135deg,#232526,#414345);color:#fff;border-radius:18px;padding:18px 22px;display:flex;align-items:center;justify-content:space-between;gap:12px}
-  .toolbar{display:flex;flex-wrap:wrap;gap:10px;align-items:center;margin:14px 0}
-  .search-input{min-width:260px}
-  .chip{display:inline-flex;align-items:center;gap:8px;padding:6px 12px;margin:4px;border-radius:999px;background:#eef2ff;color:#3f51b5;font-weight:600;border:1px solid rgba(63,81,181,.25);user-select:none;font-size:.9rem;cursor:pointer}
-  .chip.active{background:#3f51b5;color:#fff}
-  .rx-card{border:0;border-radius:16px;overflow:hidden;box-shadow:0 12px 28px rgba(0,0,0,.08)}
-  .rx-card .card-header{background:linear-gradient(135deg,#6a11cb,#2575fc);color:#fff;display:flex;justify-content:space-between;align-items:center}
-  .eq{font-weight:800;font-size:18px;background:#f8f9fa;border:1px solid #edf0f4;border-radius:12px;padding:10px 12px}
-  .empty{border:2px dashed #e9ecef;border-radius:16px;padding:24px;text-align:center;color:#6c757d}
-</style>
-
-<div class="page-hero">
-  <div>
-    <h2 class="mb-1">Хемиски реакции</h2>
-    <div class="opacity-75">Вкупно: <b>{{ reactions|length if reactions else 0 }}</b></div>
-  </div>
-  {% if user_role == 'teacher' %}
-    <a href="/reactions/add" class="btn btn-light fw-semibold"><i class="bi bi-plus-circle"></i> Додај нова</a>
-  {% endif %}
+<div class="row">
+    <div class="col-12">
+        <div class="d-flex justify-content-between align-items-center mb-3">
+            <h2>Хемиски реакции</h2>
+            {% if user_role == 'teacher' %}
+                <a href="/reactions/add" class="btn btn-success">Додај нова реакција</a>
+            {% endif %}
+        </div>
+    </div>
 </div>
 
-<div class="toolbar">
-  <div class="input-group search-input">
-    <span class="input-group-text"><i class="bi bi-search"></i></span>
-    <input id="search" class="form-control" placeholder="Пребарај по симбол/име/услов...">
-  </div>
-  <select id="sort" class="form-select" style="max-width:220px">
-    <option value="id_desc">Најново (ID ↓)</option>
-    <option value="id_asc">Најстаро (ID ↑)</option>
-    <option value="sym_az">Симболи (A–Z)</option>
-    <option value="prod_az">Продукт (A–Z)</option>
-  </select>
-  <div id="chips" class="ms-auto"></div>
+<div class="row">
+    {% for reaction in reactions %}
+    <div class="col-md-6 col-lg-4 mb-3">
+        <div class="card">
+            <div class="card-header">
+                <h5 class="mb-0">Реакција #{{ reaction.reaction_id }}</h5>
+                <small class="text-muted">{{ reaction.created_by }}</small>
+            </div>
+            <div class="card-body">
+                <div class="reaction-equation text-center mb-3" style="font-size: 18px; font-weight: bold; background: #f8f9fa; padding: 15px; border-radius: 10px;">
+                    {{ reaction.element1_symbol }} + {{ reaction.element2_symbol }} → {{ reaction.product }}
+                </div>
+                
+                <p><strong>Елементи:</strong> {{ reaction.element1_name }} + {{ reaction.element2_name }}</p>
+                <p><strong>Продукт:</strong> {{ reaction.product }}</p>
+                <p><strong>Услови:</strong> {{ reaction.conditions or 'Стандардни услови' }}</p>
+                
+                <div class="mt-3">
+                    {% if user_role == 'teacher' %}
+                        <a href="/reactions/{{ reaction.reaction_id }}/edit" class="btn btn-warning btn-sm">Едитирај</a>
+                        <form method="POST" action="/reactions/{{ reaction.reaction_id }}/delete" style="display: inline;" 
+                              onsubmit="return confirm('Дали сте сигурни дека сакате да ја избришете реакцијата?')">
+                            <button type="submit" class="btn btn-danger btn-sm">Избриши</button>
+                        </form>
+                    {% endif %}
+                </div>
+            </div>
+        </div>
+    </div>
+    {% else %}
+    <div class="col-12">
+        <div class="alert alert-info text-center">
+            <h4>Нема дефинирани реакции</h4>
+            {% if user_role == 'teacher' %}
+                <p>Започнете со додавање на нови реакции за вашите студенти.</p>
+                <a href="/reactions/add" class="btn btn-primary">Додај прва реакција</a>
+            {% else %}
+                <p>Вашиот професор сè уште не додал реакции во системот.</p>
+            {% endif %}
+        </div>
+    </div>
+    {% endfor %}
 </div>
 
-{% if not reactions %}
-  <div class="empty">
-    <div style="font-size:36px">🧪</div>
-    <div class="mt-2">Нема дефинирани реакции.</div>
-    {% if user_role == 'teacher' %}
-      <a href="/reactions/add" class="btn btn-primary btn-sm mt-2">Додај прва реакција</a>
+<div class="mt-3">
+    <a href="/dashboard" class="btn btn-secondary">Назад до Dashboard</a>
+    {% if user_role == 'student' %}
+        <a href="/laboratory" class="btn btn-primary">Отвори лабораторија</a>
     {% endif %}
-  </div>
-{% else %}
-  <div id="rx-grid" class="row">
-    {% for r in reactions %}
-    <div class="col-md-6 col-lg-4 mb-3 rx-item"
-         data-id="{{ r.reaction_id }}"
-         data-sym="{{ (r.element1_symbol ~ r.element2_symbol)|lower }}"
-         data-prod="{{ (r.product or '')|lower }}"
-         data-text="{{ (r.element1_symbol ~ ' ' ~ r.element2_symbol ~ ' ' ~ (r.product or '') ~ ' ' ~ (r.conditions or '') ~ ' ' ~ (r.element1_name or '') ~ ' ' ~ (r.element2_name or ''))|lower }}">
-      <div class="card rx-card h-100">
-        <div class="card-header">
-          <h5 class="mb-0 text-truncate">Реакција #{{ r.reaction_id }}</h5>
-          <small class="text-truncate">{{ r.created_by }}</small>
-        </div>
-        <div class="card-body d-flex flex-column">
-          <div class="eq mb-3 text-center">
-            {{ r.element1_symbol }} + {{ r.element2_symbol }} → {{ r.product or '—' }}
-          </div>
-
-          <ul class="small list-unstyled mb-2">
-            <li><b>Елементи:</b> {{ r.element1_name }} + {{ r.element2_name }}</li>
-            <li><b>Продукт:</b> {{ r.product or '—' }}</li>
-            <li><b>Услови:</b> {{ r.conditions or 'Стандардни услови' }}</li>
-          </ul>
-
-          <div class="mt-auto d-flex gap-2">
-            {% if user_role == 'teacher' %}
-              <a href="/reactions/{{ r.reaction_id }}/edit" class="btn btn-outline-warning btn-sm">
-                <i class="bi bi-pencil-square"></i> Едитирај
-              </a>
-              <form method="POST" action="/reactions/{{ r.reaction_id }}/delete" onsubmit="return confirm('Да ја избришам реакцијата?')">
-                <button type="submit" class="btn btn-outline-danger btn-sm"><i class="bi bi-trash"></i> Избриши</button>
-              </form>
-            {% endif %}
-          </div>
-        </div>
-      </div>
-    </div>
-    {% endfor %}
-  </div>
-{% endif %}
-
-<div class="mt-3">
-  <a href="/dashboard" class="btn btn-secondary"><i class="bi bi-arrow-left"></i> Назад до Dashboard</a>
-  {% if user_role == 'student' %}
-    <a href="/laboratory" class="btn btn-primary"><i class="bi bi-flask"></i> Виртуелна лабораторија</a>
-  {% endif %}
 </div>
-
-<script>
-  const items=[...document.querySelectorAll('.rx-item')];
-  const search=document.getElementById('search');
-  const sortSel=document.getElementById('sort');
-  const chipsWrap=document.getElementById('chips');
-
-  // генерирај чипови за брз филтер по прва буква на продукт
-  const PROD_LETTERS=[...new Set(items.map(i=>(i.dataset.prod||'').charAt(0)).filter(Boolean))].sort();
-  let activeLetter=null;
-  PROD_LETTERS.forEach(l=>{
-    const c=document.createElement('button');
-    c.type='button'; c.className='chip'; c.textContent=l.toUpperCase();
-    c.addEventListener('click', ()=>{
-      if(activeLetter===l){ activeLetter=null; c.classList.remove('active'); }
-      else { activeLetter=l; [...chipsWrap.children].forEach(x=>x.classList.remove('active')); c.classList.add('active'); }
-      applyFilters();
-    });
-    chipsWrap.appendChild(c);
-  });
-
-  search.addEventListener('input', applyFilters);
-  sortSel.addEventListener('change', applySort);
-
-  function applyFilters(){
-    const q=(search.value||'').toLowerCase().trim();
-    items.forEach(it=>{
-      const matchText=it.dataset.text.includes(q);
-      const matchLetter=!activeLetter || (it.dataset.prod||'').startsWith(activeLetter);
-      it.style.display=(matchText && matchLetter) ? '' : 'none';
-    });
-  }
-  function applySort(){
-    const val=sortSel.value;
-    const grid=document.getElementById('rx-grid');
-    const sorted=[...items].sort((a,b)=>{
-      const ai=+a.dataset.id, bi=+b.dataset.id;
-      const as=a.dataset.sym, bs=b.dataset.sym;
-      const ap=a.dataset.prod, bp=b.dataset.prod;
-      if(val==='id_desc') return bi-ai;
-      if(val==='id_asc')  return ai-bi;
-      if(val==='sym_az')  return as.localeCompare(bs,'mk');
-      if(val==='prod_az') return ap.localeCompare(bp,'mk');
-      return 0;
-    });
-    sorted.forEach(el=>grid.appendChild(el));
-  }
-  applySort();
-</script>
 {% endblock %}
Index: templates/reports/detailed_experiments.html
===================================================================
--- templates/reports/detailed_experiments.html	(revision bc45cb5da7c6d8482bc21838561ed96e007b138d)
+++ templates/reports/detailed_experiments.html	(revision 14fe7c26eea0eb44ab5dbcea992e11378a7f6d4e)
@@ -25,23 +25,10 @@
             {% for experiment in experiments %}
             <tr>
-                <td>
-                    {{ experiment.get('full_name')
-                    or experiment.get('student_name')
-                    or ('#' ~ (experiment.get('student_id')|string)) }}
-                </td>
-
+                <td>{{ experiment.full_name }}</td>
                 <td>
                     <span class="badge bg-primary">#{{ experiment.experiment_id }}</span>
                 </td>
                 <td>{{ experiment.result[:50] }}{% if experiment.result|length > 50 %}...{% endif %}</td>
-                {% set ts = experiment.participation_date or expperiment.participation_time or experiment.time_stamp %}
-                <td>
-                    {% if ts %}
-                    {{ ts.strftime('%Y-%m-%d %H:%M') }}
-                    {% else %}
-                    —
-                    {% endif %}
-                </td>
-
+                <td>{{ experiment.participation_time.strftime('%d.%m.%Y %H:%M') if experiment.participation_time }}</td>
                 <td><span class="badge bg-success">Завршен</span></td>
             </tr>
@@ -78,6 +65,5 @@
         <div class="card text-center">
             <div class="card-body">
-                {% set avg = (experiments|length / experiments|map(attribute='full_name')|unique|list|length)|round(1)
-                if experiments %}
+                {% set avg = (experiments|length / experiments|map(attribute='full_name')|unique|list|length)|round(1) if experiments %}
                 <h5 class="card-title">{{ avg if avg else 0 }}</h5>
                 <p class="card-text">Просечно по студент</p>
Index: mplates/reports/experiment_participants.html
===================================================================
--- templates/reports/experiment_participants.html	(revision bc45cb5da7c6d8482bc21838561ed96e007b138d)
+++ 	(revision )
@@ -1,25 +1,0 @@
-{% extends "base.html" %}
-{% block title %}Студенти по експеримент{% endblock %}
-
-{% block content %}
-<h2>Студенти кои го извршиле одбран експеримент</h2>
-<p class="text-muted">Одберете експеримент:</p>
-
-<form method="get" action="/reports/adv/experiment_participants" class="row g-2">
-  <div class="col-md-6">
-    <select class="form-select" name="experiment_id" required>
-      <option value="">-- одберете експеримент --</option>
-      {% for e in experiments %}
-        <option value="{{ e.experiment_id }}">#{{ e.experiment_id }} — {{ e.result[:60] }}</option>
-      {% endfor %}
-    </select>
-  </div>
-  <div class="col-md-2">
-    <button type="submit" class="btn btn-primary">Прикажи</button>
-  </div>
-</form>
-
-<div class="mt-3">
-  <a href="/reports" class="btn btn-secondary">◀ Назад кон извештаи</a>
-</div>
-{% endblock %}
Index: mplates/reports/generic_report.html
===================================================================
--- templates/reports/generic_report.html	(revision bc45cb5da7c6d8482bc21838561ed96e007b138d)
+++ 	(revision )
@@ -1,117 +1,0 @@
-{% extends "base.html" %}
-{% block title %}{{ title }}{% endblock %}
-
-{% block content %}
-<div class="row">
-  <div class="col-12">
-    <h2 class="mb-1">{{ title }}</h2>
-    <p class="text-muted">{{ subtitle or "Преглед на податоци" }}</p>
-  </div>
-</div>
-
-{% if rows and headers %}
-  <!-- Toolbar -->
-  <div class="row align-items-center mb-3 g-2">
-    <div class="col-md-6">
-      <div class="input-group">
-        <span class="input-group-text"><i class="bi bi-search"></i></span>
-        <input id="rep-search" class="form-control" placeholder="Пребарај во табелата...">
-      </div>
-    </div>
-    <div class="col-md-6 text-md-end">
-      <button id="rep-export" class="btn btn-outline-secondary btn-sm">
-        <i class="bi bi-download"></i> CSV
-      </button>
-    </div>
-  </div>
-
-  <!-- Table -->
-  <div class="table-responsive">
-    <table class="table table-striped table-hover" id="rep-table">
-      <thead class="table-info">
-        <tr>
-          {% for h in headers %}
-            <th>{{ h.replace('_',' ')|title }}</th>
-          {% endfor %}
-        </tr>
-      </thead>
-      <tbody>
-        {% for r in rows %}
-          <tr>
-            {% for h in headers %}
-              {% set v = r[h] %}
-              {% set key = h|lower %}
-              <td>
-                {# badge за ID полиња #}
-                {% if key.endswith('id') and v is not none %}
-                  <span class="badge bg-primary">#{{ v }}</span>
-                {% elif 'status' in key and v %}
-                  {% set vs = v|string|lower %}
-                  {% set cls = 'secondary' %}
-                  {% if 'успеш' in vs or 'done' in vs or 'complete' in vs %}{% set cls = 'success' %}{% endif %}
-                  {% if 'warn' in vs or 'pending' in vs or 'очек' in vs %}{% set cls = 'warning' %}{% endif %}
-                  {% if 'fail' in vs or 'error' in vs or 'греш' in vs %}{% set cls = 'danger' %}{% endif %}
-                  <span class="badge bg-{{ cls }}">{{ v }}</span>
-                {% else %}
-                  {% if v is string and v|length > 80 %}
-                    <span title="{{ v }}">{{ v[:80] }}…</span>
-                  {% else %}
-                    {{ v if v is not none and v != '' else '—' }}
-                  {% endif %}
-                {% endif %}
-              </td>
-            {% endfor %}
-          </tr>
-        {% endfor %}
-      </tbody>
-    </table>
-  </div>
-
-  <!-- Мали статистики (генерички) -->
-{% else %}
-  <div class="alert alert-info mt-3">Нема податоци за прикажување.</div>
-{% endif %}
-
-<div class="mt-3">
-  <a href="/reports" class="btn btn-secondary"><i class="bi bi-arrow-left"></i> Назад кон извештаи</a>
-</div>
-
-<script>
-(() => {
-  const table = document.getElementById('rep-table');
-  if(!table) return;
-
-  // Live search
-  const search = document.getElementById('rep-search');
-  search.addEventListener('input', () => {
-    const q = (search.value || '').toLowerCase().trim();
-    [...table.tBodies[0].rows].forEach(tr => {
-      tr.style.display = tr.innerText.toLowerCase().includes(q) ? '' : 'none';
-    });
-  });
-
-  // CSV export (почитува активен филтер)
-  document.getElementById('rep-export').addEventListener('click', () => {
-    const head = [...table.tHead.rows[0].cells].map(th => th.innerText.trim());
-    const lines = [];
-    lines.push(head.map(csvEscape).join(','));
-    [...table.tBodies[0].rows].forEach(tr => {
-      if(tr.style.display==='none') return;
-      const row = [...tr.cells].map(td => csvEscape(td.innerText.trim()));
-      lines.push(row.join(','));
-    });
-    const blob = new Blob([lines.join('\n')], {type: 'text/csv;charset=utf-8;'});
-    const a = document.createElement('a');
-    a.href = URL.createObjectURL(blob);
-    a.download = (('{{ title|replace(" ", "_") }}' || 'report') + '.csv').toLowerCase();
-    a.click();
-  });
-
-  function csvEscape(s){
-    s = (s||'').replace(/\r?\n|\r/g,' ');
-    if (s.includes(',') || s.includes('"')) s = '"' + s.replace(/"/g,'""') + '"';
-    return s;
-  }
-})();
-</script>
-{% endblock %}
Index: templates/reports/menu.html
===================================================================
--- templates/reports/menu.html	(revision bc45cb5da7c6d8482bc21838561ed96e007b138d)
+++ templates/reports/menu.html	(revision 14fe7c26eea0eb44ab5dbcea992e11378a7f6d4e)
@@ -3,217 +3,51 @@
 
 {% block content %}
-<style>
-  .page-hero{
-    background: linear-gradient(135deg,#232526,#414345);
-    color:#fff;border-radius:18px;padding:18px 22px;
-    display:flex;align-items:center;justify-content:space-between;gap:12px
-  }
-  .page-hero .sub{opacity:.85}
-  .hero-actions .btn-ghost{
-    background:#00000010;border:1px solid #ffffff55;color:#fff
-  }
-
-  .toolbar{display:flex;flex-wrap:wrap;gap:10px;align-items:center;margin:14px 0}
-  .search-input{min-width:300px}
-
-  .panel{border:0;border-radius:16px;box-shadow:0 12px 28px rgba(0,0,0,.08)}
-  .panel h6{font-weight:800;letter-spacing:.2px}
-
-  .tile{
-    display:flex;gap:12px;align-items:flex-start;
-    padding:12px 14px;margin-bottom:10px;border-radius:12px;
-    background:#fff;border:0;text-decoration:none;color:inherit;
-    box-shadow:0 6px 16px rgba(0,0,0,.06); transition:transform .12s ease, box-shadow .12s ease
-  }
-  .tile:hover{transform:translateY(-2px);box-shadow:0 10px 22px rgba(0,0,0,.10)}
-  .tile i{font-size:1.2rem;opacity:.9;margin-top:.2rem}
-  .tile strong{display:block}
-  .tile small{color:#6c757d}
-  .pill{
-    background:#eef2ff;color:#3f51b5;border:1px solid rgba(63,81,181,.25);
-    border-radius:999px;padding:6px 10px;font-weight:600
-  }
-
-  .grp-title{display:flex;align-items:center;gap:8px;margin-bottom:.5rem}
-  .grp-title i{opacity:.85}
-</style>
-
-<!-- HERO -->
-<div class="page-hero">
-  <div>
-    <h2 class="mb-0">Извештаи и статистики</h2>
-    <div class="sub">Изберете извештај за преглед или пребарајте по наслов/опис</div>
-  </div>
-  <div class="hero-actions d-flex align-items-center gap-2">
-    <span class="pill d-none d-md-inline"><i class="bi bi-graph-up-arrow"></i> аналитика</span>
-    <a href="/dashboard" class="btn btn-light btn-sm fw-semibold"><i class="bi bi-speedometer2"></i> Dashboard</a>
-  </div>
+<div class="row">
+    <div class="col-12">
+        <h2>Извештаи и статистики</h2>
+        <p class="text-muted">Изберете извештај за преглед</p>
+    </div>
 </div>
 
-<!-- TOOLBAR -->
-<div class="toolbar">
-  <div class="input-group search-input">
-    <span class="input-group-text"><i class="bi bi-search"></i></span>
-    <input id="rep-search" class="form-control" placeholder="Пребарај: студент, опрема, најчесто, учество...">
-  </div>
-  <div class="ms-auto d-flex align-items-center gap-2">
-    <span class="pill"><i class="bi bi-funnel"></i> групирано по тема</span>
-  </div>
+<div class="row mt-4">
+    <div class="col-md-6">
+        <div class="list-group">
+            <h5>Активност на студенти</h5>
+            <a href="/my_students" class="list-group-item list-group-item-action">
+                <strong>Мои студенти</strong><br>
+                <small>Преглед на активностите на вашите студенти</small>
+            </a>
+            <a href="/reports/inactive_students" class="list-group-item list-group-item-action">
+                <strong>Неактивни студенти</strong><br>
+                <small>Студенти кои не учествувале во експерименти</small>
+            </a>
+            <a href="/reports/low_activity_students" class="list-group-item list-group-item-action">
+                <strong>Слабо активни студенти</strong><br>
+                <small>Студенти со помалку од 3 експерименти</small>
+            </a>
+        </div>
+    </div>
+    
+    <div class="col-md-6">
+        <div class="list-group">
+            <h5>Детални извештаи</h5>
+            <a href="/reports/detailed_experiments" class="list-group-item list-group-item-action">
+                <strong>Детални експерименти</strong><br>
+                <small>Сите експерименти по студент</small>
+            </a>
+            <a href="/reports/element_views" class="list-group-item list-group-item-action">
+                <strong>Прегледи на елементи</strong><br>
+                <small>Кој студент кои елементи ги прегледал</small>
+            </a>
+            <a href="/reports/teacher_statistics" class="list-group-item list-group-item-action">
+                <strong>Статистики по професор</strong><br>
+                <small>Споредба помеѓу професори</small>
+            </a>
+        </div>
+    </div>
 </div>
 
-<!-- GRID -->
-<div id="reports-grid" class="row">
-  <!-- ГРУПА: Активност на студенти -->
-  <div class="col-lg-4 mb-4">
-    <div class="panel card h-100">
-      <div class="card-body">
-        <div class="grp-title"><i class="bi bi-people"></i><h6 class="mb-0">Активност на студенти</h6></div>
-
-        <a href="/my_students" class="tile" data-text="мои студенти активност учество напредок">
-          <i class="bi bi-person-check text-primary"></i>
-          <div>
-            <strong>Мои студенти</strong>
-            <small>Преглед на активностите на вашите студенти</small>
-          </div>
-        </a>
-
-        <a href="/reports/inactive_students" class="tile" data-text="неактивни без учество студенти">
-          <i class="bi bi-emoji-frown text-primary"></i>
-          <div>
-            <strong>Неактивни студенти</strong>
-            <small>Студенти кои не учествувале во експерименти</small>
-          </div>
-        </a>
-
-        <a href="/reports/low_activity_students" class="tile" data-text="слабо активни малку експерименти под 3">
-          <i class="bi bi-thermometer-low text-primary"></i>
-          <div>
-            <strong>Слабо активни студенти</strong>
-            <small>Студенти со помалку од 3 експерименти</small>
-          </div>
-        </a>
-
-        <a href="/reports/adv/students_below_threshold?max=3" class="tile" data-text="под праг threshold параметар max">
-          <i class="bi bi-arrow-bar-down text-primary"></i>
-          <div>
-            <strong>Под праг на учество</strong>
-            <small>Флексибилно: под дефиниран праг на учества (параметар <code>max</code>)</small>
-          </div>
-        </a>
-
-      </div>
-    </div>
-  </div>
-
-  <!-- ГРУПА: Детални извештаи -->
-  <div class="col-lg-4 mb-4">
-    <div class="panel card h-100">
-      <div class="card-body">
-        <div class="grp-title"><i class="bi bi-journal-text"></i><h6 class="mb-0">Детални извештаи</h6></div>
-
-        <a href="/reports/detailed_experiments" class="tile" data-text="детални експерименти студенти временска линија">
-          <i class="bi bi-journal-richtext text-success"></i>
-          <div>
-            <strong>Детални експерименти</strong>
-            <small>Сите експерименти по студент, со временска линија</small>
-          </div>
-        </a>
-
-        <a href="/reports/element_views" class="tile" data-text="прегледи елементи кој ги гледал popularnost">
-          <i class="bi bi-eye text-success"></i>
-          <div>
-            <strong>Прегледи на елементи</strong>
-            <small>Кој корисник кои елементи ги прегледал</small>
-          </div>
-        </a>
-
-        <a href="/reports/teacher_statistics" class="tile" data-text="статистики професор споредба наставници">
-          <i class="bi bi-bar-chart text-success"></i>
-          <div>
-            <strong>Статистики по професор</strong>
-            <small>Агрегати и споредба по професор</small>
-          </div>
-        </a>
-
-        <a href="/reports/adv/experiment_participants" class="tile" data-text="учесници по експеримент листа селекција">
-          <i class="bi bi-people-fill text-success"></i>
-          <div>
-            <strong>Учесници по експеримент</strong>
-            <small>Изберете експеримент и видете ги учесниците</small>
-          </div>
-        </a>
-      </div>
-    </div>
-  </div>
-
-  <!-- ГРУПА: Напредни (SQL) -->
-  <div class="col-lg-4 mb-4">
-    <div class="panel card h-100">
-      <div class="card-body">
-        <div class="grp-title"><i class="bi bi-bar-chart-steps"></i><h6 class="mb-0">Напредни извештаи (SQL)</h6></div>
-
-        <a href="/reports/adv/student_experiment_counts" class="tile" data-text="студенти број експерименти count">
-          <i class="bi bi-list-ol text-warning"></i>
-          <div>
-            <strong>Студенти и број на експерименти</strong>
-            <small>Колку експерименти има извршено секој студент</small>
-          </div>
-        </a>
-
-        <a href="/reports/adv/equipment_usage" class="tile" data-text="користеност опрема инструмент колку пати">
-          <i class="bi bi-hammer text-warning"></i>
-          <div>
-            <strong>Користеност на опрема</strong>
-            <small>Број на употреби по инструмент</small>
-          </div>
-        </a>
-
-        <a href="/reports/adv/avg_equipment_per_experiment" class="tile" data-text="просек опрема по експеримент average">
-          <i class="bi bi-diagram-3 text-warning"></i>
-          <div>
-            <strong>Просечен број инструменти</strong>
-            <small>Просек на опрема по експеримент</small>
-          </div>
-        </a>
-
-        <a href="/reports/adv/most_used_elements" class="tile" data-text="најчесто користени елементи реакции">
-          <i class="bi bi-stars text-warning"></i>
-          <div>
-            <strong>Најчесто користени елементи</strong>
-            <small>Елементи кои најмногу се појавуваат во реакции</small>
-          </div>
-        </a>
-
-        <a href="/reports/adv/most_performed_experiments" class="tile" data-text="најреализирани експерименти најмногу учесници">
-          <i class="bi bi-trophy text-warning"></i>
-          <div>
-            <strong>Најреализирани експерименти</strong>
-            <small>Експерименти со најмногу учесници</small>
-          </div>
-        </a>
-
-      </div>
-    </div>
-  </div>
+<div class="mt-4">
+    <a href="/dashboard" class="btn btn-primary">Назад до Dashboard</a>
 </div>
-
-<div class="mt-2 text-center">
-  <a href="/dashboard" class="btn btn-secondary"><i class="bi bi-arrow-left"></i> Назад до Dashboard</a>
-</div>
-
-<script>
-  // Едноставно пребарување низ сите плочки (tile)
-  (function(){
-    const q = document.getElementById('rep-search');
-    if(!q) return;
-    const tiles = [...document.querySelectorAll('#reports-grid a.tile')];
-    q.addEventListener('input', ()=>{
-      const s = (q.value||'').toLowerCase().trim();
-      tiles.forEach(a=>{
-        const hay = (a.textContent + ' ' + (a.dataset.text||'')).toLowerCase();
-        a.style.display = hay.includes(s) ? '' : 'none';
-      });
-    });
-  })();
-</script>
 {% endblock %}
Index: mplates/reports/student_experiments.html
===================================================================
--- templates/reports/student_experiments.html	(revision bc45cb5da7c6d8482bc21838561ed96e007b138d)
+++ 	(revision )
@@ -1,66 +1,0 @@
-{% extends "base.html" %}
-{% block title %}Експерименти на студенти{% endblock %}
-
-{% block content %}
-<div class="row">
-    <div class="col-12">
-        <h2>📊 Експерименти на моите студенти</h2>
-        <p class="text-muted">Детален преглед на активности</p>
-    </div>
-</div>
-
-<div class="row mt-4">
-    <div class="col-12">
-        <div class="table-responsive">
-            <table class="table table-hover">
-                <thead>
-                    <tr>
-                        <th>Студент</th>
-                        <th>Експеримент</th>
-                        <th>Реакција</th>
-                        <th>Продукт</th>
-                        <th>Датум</th>
-                        <th>Резултат</th>
-                    </tr>
-                </thead>
-                <tbody>
-                    {% for exp in student_experiments %}
-                    <tr>
-                        <td>
-                            <strong>{{ exp.student_name }}</strong><br>
-                            <small class="text-muted">ID: {{ exp.student_id }}</small>
-                        </td>
-                        <td>
-                            <span class="badge bg-primary">#{{ exp.experiment_id }}</span>
-                        </td>
-                        <td>
-                            {{ exp.element1_symbol }} + {{ exp.element2_symbol }}
-                        </td>
-                        <td>
-                            <span class="text-success">{{ exp.product }}</span>
-                        </td>
-                        <td>
-                            {{ exp.participation_date.strftime('%d.%m.%Y %H:%M') if exp.participation_date }}
-                        </td>
-                        <td>
-                            <small>{{ exp.result[:50] }}...</small>
-                        </td>
-                    </tr>
-                    {% else %}
-                    <tr>
-                        <td colspan="6" class="text-center text-muted">
-                            Нема експерименти од студенти
-                        </td>
-                    </tr>
-                    {% endfor %}
-                </tbody>
-            </table>
-        </div>
-    </div>
-</div>
-
-<div class="mt-4 text-center">
-    <a href="/reports" class="btn btn-secondary">Назад кон извештаи</a>
-    <a href="/my_students" class="btn btn-info">Види студенти</a>
-</div>
-{% endblock %}
Index: templates/virtual_laboratory.html
===================================================================
--- templates/virtual_laboratory.html	(revision bc45cb5da7c6d8482bc21838561ed96e007b138d)
+++ templates/virtual_laboratory.html	(revision 14fe7c26eea0eb44ab5dbcea992e11378a7f6d4e)
@@ -1,410 +1,197 @@
 {% extends "base.html" %}
-{% block title %}Виртуелна лабораторија - Студент{% endblock %}
+{% block title %}Виртуелна лабораторија{% endblock %}
 
 {% block content %}
-<style>
-  :root{
-    --bg:#f7f9fc; --card:#ffffff;
-    --border:#e6ebf2; --muted:#6c7a8a;
-    --primary:#2c7be5; --success:#2bb673; --warning:#f59f00; --danger:#e03131;
-  }
-  body{background:var(--bg)}
-  .lab-grid{display:grid;grid-template-columns:1fr 520px 1fr;gap:28px;align-items:start}
-  @media (max-width: 1200px){.lab-grid{grid-template-columns:1fr}}
-  .panel{background:var(--card);border:1px solid var(--border);border-radius:16px;box-shadow:0 10px 25px rgba(0,0,0,.05)}
-  .panel-head{padding:14px 16px;border-bottom:1px solid var(--border);display:flex;justify-content:space-between;align-items:center}
-  .panel-title{margin:0;font-weight:700}
-  .panel-body{padding:12px 12px 6px}
-  .filter-input{width:100%;border-radius:12px;border:1px solid var(--border);padding:10px 12px;margin-bottom:10px}
-  .chips{min-height:46px}
-  .chip{
-    display:inline-flex;align-items:center;gap:8px;padding:8px 12px;margin:6px;border-radius:999px;color:#fff;
-    font-weight:700;cursor:grab;user-select:none;border:1px solid rgba(255,255,255,.25);
-    box-shadow:0 6px 14px rgba(0,0,0,.12);transition:transform .15s ease, box-shadow .15s ease, opacity .15s ease
-  }
-  .chip small{opacity:.95;font-weight:600}
-  .chip:active{transform:scale(.97)}
-  .chip[data-disabled="1"]{opacity:.35;cursor:not-allowed;box-shadow:none}
+<div class="row">
+    <div class="col-12 text-center mb-4">
+        <h2>Виртуелна хемиска лабораторија</h2>
+        <p class="lead">Изберете елементи за да видите дали постои реакција</p>
+    </div>
+</div>
 
-  .bench.panel-body{padding:18px}
-  .drop-wrap{display:grid;grid-template-columns:1fr 100px 1fr;gap:16px;align-items:center}
-  .drop-zone{
-    height:160px;border:2px dashed var(--primary);border-radius:18px;background:#f3f7ff;
-    display:flex;align-items:center;justify-content:center;flex-direction:column;transition:all .2s ease
-  }
-  .drop-zone.hover{background:#eaf2ff;border-color:#4c9dff;box-shadow:0 10px 20px rgba(76,157,255,.2)}
-  .placeholder{color:var(--muted);font-weight:700;text-align:center;line-height:1.25}
-  .pill{
-    display:flex;flex-direction:column;align-items:center;justify-content:center;
-    width:126px;height:126px;border-radius:999px;color:#fff;font-weight:900;font-size:34px;
-    letter-spacing:.3px;box-shadow:0 16px 30px rgba(0,0,0,.18);border:1px solid rgba(255,255,255,.25)
-  }
-  .pill span{font-size:12px;font-weight:700;opacity:.95;margin-top:3px}
+<div class="row justify-content-center">
+    <div class="col-md-10">
+        <div class="card">
+            <div class="card-body">
+                <div class="reaction-workspace" style="display: grid; grid-template-columns: 1fr 200px 1fr; gap: 30px; align-items: center; margin-bottom: 40px;">
+                    <!-- Првин елемент -->
+                    <div class="element-selector text-center">
+                        <div class="element-display" id="element1-display" style="width: 120px; height: 120px; border: 3px dashed #ccc; border-radius: 50%; display: flex; flex-direction: column; align-items: center; justify-content: center; margin: 0 auto; background: white;">
+                            <span>Избери<br>Елемент 1</span>
+                        </div>
+                        <select class="form-select mt-3" id="element1-select">
+                            <option value="">-- Избери елемент --</option>
+                            {% for element in elements %}
+                            <option value="{{ element.symbol }}" data-name="{{ element.element_name }}" data-id="{{ element.element_id }}">
+                                {{ element.symbol }} - {{ element.element_name }}
+                            </option>
+                            {% endfor %}
+                        </select>
+                    </div>
+                    
+                    <!-- Стрелка и копче -->
+                    <div class="reaction-arrow text-center">
+                        <div style="font-size: 30px; color: #666; margin-bottom: 10px;">+</div>
+                        <button class="btn btn-primary" id="react-btn" disabled onclick="performReaction()">Реагирај</button>
+                        <div style="font-size: 30px; color: #666; margin-top: 10px;">→</div>
+                    </div>
+                    
+                    <!-- Втор елемент -->
+                    <div class="element-selector text-center">
+                        <div class="element-display" id="element2-display" style="width: 120px; height: 120px; border: 3px dashed #ccc; border-radius: 50%; display: flex; flex-direction: column; align-items: center; justify-content: center; margin: 0 auto; background: white;">
+                            <span>Избери<br>Елемент 2</span>
+                        </div>
+                        <select class="form-select mt-3" id="element2-select">
+                            <option value="">-- Избери елемент --</option>
+                            {% for element in elements %}
+                            <option value="{{ element.symbol }}" data-name="{{ element.element_name }}" data-id="{{ element.element_id }}">
+                                {{ element.symbol }} - {{ element.element_name }}
+                            </option>
+                            {% endfor %}
+                        </select>
+                    </div>
+                </div>
+                
+                <!-- Резултат -->
+                <div class="result-area" id="result-area" style="display: none;">
+                    <div class="alert" id="result-content"></div>
+                    {% if user_role == 'teacher' %}
+                    <div class="text-center">
+                        <button class="btn btn-warning" onclick="createExperiment()" id="create-experiment-btn" style="display: none;">
+                            Создај експеримент од оваа реакција
+                        </button>
+                    </div>
+                    {% endif %}
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
 
-  .center-controls{display:flex;flex-direction:column;align-items:center;gap:8px}
-  .btn-round{border-radius:999px;padding:10px 16px}
-
-  #result-card{border-radius:14px}
-  .result-eq{font-size:24px;font-weight:800;margin:10px 0}
-  .pop{animation:pop .28s ease}
-  @keyframes pop{0%{transform:scale(.94);opacity:0}100%{transform:scale(1);opacity:1}}
-
-  .info-grid{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin-top:10px}
-  .badge-soft{border:1px solid var(--border);background:#f7fbff;color:#264b7f;border-radius:10px;padding:8px 10px}
-</style>
-
-<div class="container-fluid">
-  <div class="row mb-3">
-    <div class="col-12 text-center">
-      <h2 class="mb-1">🧪 Виртуелна хемиска лабораторија</h2>
-      <p class="lead mb-1">Влечи-и-пушти два елементи на „работната маса“, па кликни <b>Реагирај</b>.</p>
-      <small class="text-muted">* Боја по hazard (или атомски број) — можеш да смениш подолу.</small>
-    </div>
-  </div>
-
-  <div class="lab-grid">
-    <!-- ЛЕВО -->
-    <div class="panel">
-      <div class="panel-head">
-        <h6 class="panel-title">Елементи (лево)</h6>
-        <div class="btn-group btn-group-sm" role="group" aria-label="color-mode">
-          <input type="radio" class="btn-check" name="colorMode" id="cm-hazard" checked>
-          <label class="btn btn-outline-secondary" for="cm-hazard">Hazard</label>
-          <input type="radio" class="btn-check" name="colorMode" id="cm-atomic">
-          <label class="btn btn-outline-secondary" for="cm-atomic">Atomic</label>
-        </div>
-      </div>
-      <div class="panel-body">
-        <input class="filter-input" id="filter-left" placeholder="🔎 филтрирај по симбол/име..."/>
-        <div id="list-left" class="chips"></div>
-      </div>
-    </div>
-
-    <!-- СРЕДИНА (работна маса) -->
-    <div class="panel">
-      <div class="panel-head">
-        <h6 class="panel-title mb-0">Работна маса</h6>
-        <div class="text-muted small" id="selection-hint">Нема избрани елементи</div>
-      </div>
-      <div class="panel-body bench">
-        <div class="drop-wrap mb-2">
-          <div id="drop1" class="drop-zone">
-            <div class="placeholder">Влечи тука<br><b>Елемент 1</b></div>
-          </div>
-
-          <div class="center-controls">
-            <button class="btn btn-outline-secondary btn-round" id="swap-btn" title="Замени" disabled>⇄</button>
-            <button class="btn btn-success btn-round" id="react-btn" disabled>⚗️ Реагирај</button>
-            <button class="btn btn-outline-danger btn-round" id="clear-btn" disabled>✖</button>
-          </div>
-
-          <div id="drop2" class="drop-zone">
-            <div class="placeholder">Влечи тука<br><b>Елемент 2</b></div>
-          </div>
-        </div>
-
-        <div class="info-grid" id="selected-info" style="display:none">
-          <div class="badge-soft" id="info-e1"></div>
-          <div class="badge-soft" id="info-e2"></div>
-        </div>
-
-        <div id="result-area" style="display:none">
-          <div class="card border-success mt-3" id="result-card">
-            <div class="card-body text-center">
-              <div id="result-content"></div>
-              <button class="btn btn-primary mt-3" id="participate-btn" style="display:none">
-                📝 Запиши учество во експеримент
-              </button>
-              <div id="experiment-details" style="display:none;margin-top:16px"></div>
-            </div>
-          </div>
-        </div>
-      </div>
-    </div>
-
-    <!-- ДЕСНО -->
-    <div class="panel">
-      <div class="panel-head">
-        <h6 class="panel-title">Елементи (десно)</h6>
-        <span class="small text-muted" id="count-right"></span>
-      </div>
-      <div class="panel-body">
-        <input class="filter-input" id="filter-right" placeholder="🔎 филтрирај по симбол/име..."/>
-        <div id="list-right" class="chips"></div>
-      </div>
-    </div>
-  </div>
-
-  <div class="mt-4 text-center">
+<div class="mt-4 text-center">
     <a href="/dashboard" class="btn btn-secondary">Назад до Dashboard</a>
-    <a href="/my-experiments" class="btn btn-warning">📊 Мои Експерименти</a>
-  </div>
+    <a href="/reactions" class="btn btn-info">Види сите реакции</a>
 </div>
 
 <script>
-/* ---------- Податоци од сервер ---------- */
-const ELEMENTS = {{ elements|tojson|safe }};
+let selectedElements = {};
+let currentReaction = null;
 
-/* ---------- Состојба ---------- */
-let selected = { e1:null, e2:null };
-let currentReactionData = null;
-let colorMode = 'hazard'; // 'hazard' | 'atomic'
+document.addEventListener('DOMContentLoaded', function() {
+    const element1Select = document.getElementById('element1-select');
+    const element2Select = document.getElementById('element2-select');
+    
+    element1Select.addEventListener('change', function() {
+        updateElementDisplay(this, 'element1-display', 'element1');
+        checkReactionReady();
+    });
+    
+    element2Select.addEventListener('change', function() {
+        updateElementDisplay(this, 'element2-display', 'element2');
+        checkReactionReady();
+    });
+});
 
-/* ---------- Палета по hazard (флексибилна и со македонски клучни зборови) ---------- */
-const HAZARD_PALETTE = [
-  {k:['flammable','запал'], base:'#e85d04'},
-  {k:['toxic','токс'],      base:'#6a040f'},
-  {k:['corros','короз'],    base:'#2a9d8f'},
-  {k:['radio','радио'],     base:'#ffd60a'},
-  {k:['inert','инерт','неутрал'], base:'#6c757d'},
-];
-function pickHazardBase(el){
-  const t = (el.hazard_type || '').toLowerCase();
-  for(const h of HAZARD_PALETTE){
-    if(h.k.some(x => t.includes(x))) return h.base;
-  }
-  return '#2c7be5'; // default
+function updateElementDisplay(select, displayId, elementKey) {
+    const display = document.getElementById(displayId);
+    const value = select.value;
+    const name = select.options[select.selectedIndex]?.dataset?.name || '';
+    const id = select.options[select.selectedIndex]?.dataset?.id || '';
+    
+    if (value) {
+        display.innerHTML = `
+            <div style="font-size: 36px; font-weight: bold;">${value}</div>
+            <div style="font-size: 12px; margin-top: 5px;">${name}</div>
+        `;
+        display.style.borderColor = '#4ECDC4';
+        display.style.background = 'linear-gradient(45deg, #4ECDC4, #44A08D)';
+        display.style.color = 'white';
+        
+        selectedElements[elementKey] = { symbol: value, name: name, id: id };
+    } else {
+        display.innerHTML = displayId === 'element1-display' ? 
+            '<span>Избери<br>Елемент 1</span>' : 
+            '<span>Избери<br>Елемент 2</span>';
+        display.style.borderColor = '#ccc';
+        display.style.background = 'white';
+        display.style.color = 'black';
+        
+        delete selectedElements[elementKey];
+    }
 }
 
-/* ---------- Бои ---------- */
-function shade(hex, pct){
-  // hex -> darker/lighter
-  let c = hex.replace('#','');
-  if(c.length===3){ c = c.split('').map(x=>x+x).join(''); }
-  const num = parseInt(c,16);
-  let r = (num>>16) + Math.round(255*pct);
-  let g = ((num>>8)&0x00FF) + Math.round(255*pct);
-  let b = (num&0x0000FF) + Math.round(255*pct);
-  r = Math.max(0,Math.min(255,r)); g = Math.max(0,Math.min(255,g)); b = Math.max(0,Math.min(255,b));
-  return '#' + (r<<16 | g<<8 | b).toString(16).padStart(6,'0');
-}
-function gradFromHex(hex){ return `linear-gradient(135deg, ${hex}, ${shade(hex,-0.18)})`; }
-function gradFromAtomic(n){
-  const h = (Number(n||0)*29)%360;
-  return `linear-gradient(135deg, hsl(${h} 80% 48%), hsl(${(h+28)%360} 82% 44%))`;
-}
-function chipBackground(el){
-  return colorMode==='hazard' ? gradFromHex(pickHazardBase(el)) : gradFromAtomic(el.atomic_number);
+function checkReactionReady() {
+    const reactBtn = document.getElementById('react-btn');
+    reactBtn.disabled = !(selectedElements.element1 && selectedElements.element2);
 }
 
-/* ---------- Chips / Pills / Info ---------- */
-function chipHTML(el){
-  const bg = chipBackground(el);
-  return `
-    <div class="chip" draggable="true"
-         data-symbol="${el.symbol}" data-name="${el.element_name}"
-         data-atomic="${el.atomic_number||0}" data-hazard="${el.hazard_type||''}"
-         style="background:${bg}">
-      <div style="display:flex;gap:8px;align-items:center">
-        <span style="font-size:16px;font-weight:900">${el.symbol}</span>
-        <small>${el.element_name}</small>
-      </div>
-    </div>`;
-}
-function pillHTML(el){
-  const bg = chipBackground(el);
-  return `<div class="pill pop" style="background:${bg}">${el.symbol}<span>${el.element_name}</span></div>`;
-}
-function infoHTML(el){
-  const mp = (el.melting_point ?? '') === '' ? '—' : el.melting_point;
-  const bp = (el.boiling_point ?? '') === '' ? '—' : el.boiling_point;
-  const hz = el.hazard_type || '—';
-  return `<b>${el.symbol}</b> · ${el.element_name}<br/>
-          <small>№ ${el.atomic_number} · MP: ${mp} · BP: ${bp} · Hazard: ${hz}</small>`;
+function performReaction() {
+    if (!selectedElements.element1 || !selectedElements.element2) return;
+    
+    fetch('/api/check-reaction', {
+        method: 'POST',
+        headers: {
+            'Content-Type': 'application/json',
+        },
+        body: JSON.stringify({
+            element1: selectedElements.element1.symbol,
+            element2: selectedElements.element2.symbol
+        })
+    })
+    .then(response => response.json())
+    .then(data => {
+        showResult(data);
+    })
+    .catch(error => {
+        console.error('Error:', error);
+        showResult({success: false, message: 'Грешка при проверката'});
+    });
 }
 
-/* ---------- Рендер листи + филтри ---------- */
-function renderLists(){
-  const html = ELEMENTS.map(chipHTML).join('');
-  const L = document.getElementById('list-left');
-  const R = document.getElementById('list-right');
-  L.innerHTML = html; R.innerHTML = html;
-  document.getElementById('count-right').innerText = `${ELEMENTS.length} елементи`;
-  bindChips(L); bindChips(R);
-  updateControls(); // за „disabled“ визуелно
-}
-function bindChips(container){
-  container.querySelectorAll('.chip').forEach(ch=>{
-    ch.addEventListener('dragstart', ev=>{
-      ev.dataTransfer.setData('text/plain', JSON.stringify({
-        symbol: ch.dataset.symbol, name: ch.dataset.name,
-        atomic: ch.dataset.atomic, hazard: ch.dataset.hazard
-      }));
-    });
-    ch.addEventListener('click', ()=>{
-      const el = ELEMENTS.find(e=>e.symbol===ch.dataset.symbol) || {
-        symbol: ch.dataset.symbol, element_name: ch.dataset.name, atomic_number: ch.dataset.atomic, hazard_type: ch.dataset.hazard
-      };
-      const target = !selected.e1 ? 'e1' : (!selected.e2 ? 'e2' : 'e1');
-      setSelected(target, el);
-    });
-  });
-}
-function applyFilter(inputId, listId){
-  const q = document.getElementById(inputId).value.trim().toLowerCase();
-  document.getElementById(listId).querySelectorAll('.chip').forEach(ch=>{
-    const hay = (ch.dataset.symbol+' '+ch.dataset.name).toLowerCase();
-    ch.style.display = hay.includes(q) ? 'inline-flex' : 'none';
-  });
+function showResult(data) {
+    const resultArea = document.getElementById('result-area');
+    const resultContent = document.getElementById('result-content');
+    const createBtn = document.getElementById('create-experiment-btn');
+    
+    resultArea.style.display = 'block';
+    
+    if (data.success) {
+        currentReaction = data;
+        resultContent.className = 'alert alert-success';
+        resultContent.innerHTML = `
+            <h4>Успешна реакција!</h4>
+            <div style="font-size: 20px; font-weight: bold; margin: 15px 0; text-align: center;">
+                ${selectedElements.element1.symbol} + ${selectedElements.element2.symbol} → ${data.product}
+            </div>
+            <p><strong>Продукт:</strong> ${data.product}</p>
+            <p><strong>Услови:</strong> ${data.conditions || 'Стандардни услови'}</p>
+        `;
+        
+        if (createBtn) {
+            createBtn.style.display = 'inline-block';
+        }
+    } else {
+        currentReaction = null;
+        resultContent.className = 'alert alert-warning';
+        resultContent.innerHTML = `
+            <h4>Реакцијата не е дефинирана</h4>
+            <p>${data.message}</p>
+            {% if user_role == 'teacher' %}
+            <p><a href="/reactions/add" class="btn btn-sm btn-primary">Додај ја оваа реакција</a></p>
+            {% endif %}
+        `;
+        
+        if (createBtn) {
+            createBtn.style.display = 'none';
+        }
+    }
 }
 
-/* ---------- Drop-зони ---------- */
-function bindDropZone(zoneId, key){
-  const dz = document.getElementById(zoneId);
-  dz.addEventListener('dragover', ev=>{ ev.preventDefault(); dz.classList.add('hover'); });
-  dz.addEventListener('dragleave', ()=> dz.classList.remove('hover'));
-  dz.addEventListener('drop', ev=>{
-    ev.preventDefault(); dz.classList.remove('hover');
-    try{
-      const d = JSON.parse(ev.dataTransfer.getData('text/plain'));
-      const el = ELEMENTS.find(e=>e.symbol===d.symbol) || {
-        symbol:d.symbol, element_name:d.name, atomic_number:d.atomic, hazard_type:d.hazard
-      };
-      setSelected(key, el);
-    }catch(_){}
-  });
+function createExperiment() {
+    if (!currentReaction) return;
+    
+    // Тука би се отворил modal или форма за креирање експеримент
+    alert('Функцијата за креирање експеримент ќе биде имплементирана во следната фаза.');
 }
-function setSelected(key, el){
-  const other = key==='e1'?'e2':'e1';
-  if(selected[other] && selected[other].symbol===el.symbol){
-    alert('Не може ист елемент во двете полиња.'); return;
-  }
-  selected[key] = el;
-  document.getElementById(key==='e1'?'drop1':'drop2').innerHTML = pillHTML(el);
-  document.getElementById('selected-info').style.display = 'grid';
-  document.getElementById('info-e1').innerHTML = selected.e1 ? infoHTML(selected.e1) : '';
-  document.getElementById('info-e2').innerHTML = selected.e2 ? infoHTML(selected.e2) : '';
-  document.getElementById('selection-hint').innerText =
-    (selected.e1?selected.e1.symbol:'—') + ' + ' + (selected.e2?selected.e2.symbol:'—');
-  document.getElementById('result-area').style.display = 'none';
-  updateControls();
-}
-
-/* ---------- Контроли ---------- */
-function updateControls(){
-  const react = document.getElementById('react-btn');
-  const swap  = document.getElementById('swap-btn');
-  const clr   = document.getElementById('clear-btn');
-  const ready = !!(selected.e1 && selected.e2);
-  react.disabled = !ready; swap.disabled = !(selected.e1 || selected.e2); clr.disabled = !(selected.e1 || selected.e2);
-
-  document.querySelectorAll('.chip').forEach(ch=>{
-    const sym = ch.dataset.symbol;
-    const used = (selected.e1 && selected.e1.symbol===sym) || (selected.e2 && selected.e2.symbol===sym);
-    ch.dataset.disabled = used ? "1" : "0";
-  });
-}
-function swapSelected(){
-  const t = selected.e1; selected.e1 = selected.e2; selected.e2 = t;
-  document.getElementById('drop1').innerHTML = selected.e1 ? pillHTML(selected.e1) : `<div class="placeholder">Влечи тука<br><b>Елемент 1</b></div>`;
-  document.getElementById('drop2').innerHTML = selected.e2 ? pillHTML(selected.e2) : `<div class="placeholder">Влечи тука<br><b>Елемент 2</b></div>`;
-  document.getElementById('info-e1').innerHTML = selected.e1 ? infoHTML(selected.e1) : '';
-  document.getElementById('info-e2').innerHTML = selected.e2 ? infoHTML(selected.e2) : '';
-  document.getElementById('selection-hint').innerText =
-    (selected.e1?selected.e1.symbol:'—') + ' + ' + (selected.e2?selected.e2.symbol:'—');
-  document.getElementById('result-area').style.display = 'none';
-  updateControls();
-}
-function clearSelected(){
-  selected = {e1:null,e2:null};
-  document.getElementById('drop1').innerHTML = `<div class="placeholder">Влечи тука<br><b>Елемент 1</b></div>`;
-  document.getElementById('drop2').innerHTML = `<div class="placeholder">Влечи тука<br><b>Елемент 2</b></div>`;
-  document.getElementById('selected-info').style.display='none';
-  document.getElementById('selection-hint').innerText = 'Нема избрани елементи';
-  document.getElementById('result-area').style.display = 'none';
-  updateControls();
-}
-
-/* ---------- API ---------- */
-async function simulateReaction(){
-  if(!(selected.e1 && selected.e2)) return;
-  const btn = document.getElementById('react-btn');
-  btn.disabled = true; btn.innerText = '⏳ Проверувам...';
-  try{
-    const res = await fetch('/api/simulate-reaction',{
-      method:'POST', headers:{'Content-Type':'application/json'},
-      body: JSON.stringify({ element1:selected.e1.symbol, element2:selected.e2.symbol })
-    });
-    const data = await res.json();
-    showResult(data);
-  }catch(e){ console.error(e); alert('Грешка при симулација.'); }
-  finally{ btn.disabled=false; btn.innerText='⚗️ Реагирај'; }
-}
-function showResult(data){
-  const area = document.getElementById('result-area');
-  const content = document.getElementById('result-content');
-  const participateBtn = document.getElementById('participate-btn');
-  area.style.display='block';
-  if(data.success){
-    currentReactionData = data;
-    content.innerHTML = `
-      <h4 class="text-success">✅ Успешна реакција!</h4>
-      <div class="result-eq pop">${selected.e1.symbol} + ${selected.e2.symbol} → <span>${data.product}</span></div>
-      <div class="row g-2 justify-content-center">
-        <div class="col-md-5"><div class="alert alert-success py-2 mb-2"><b>Продукт:</b> ${data.product}</div></div>
-        <div class="col-md-5"><div class="alert alert-info py-2 mb-2"><b>Услови:</b> ${data.conditions || 'Стандардни'}</div></div>
-      </div>
-      <small class="text-muted">ℹ️ За да се евидентира како активност, кликни „Запиши учество“.</small>`;
-    participateBtn.style.display='inline-block';
-  }else{
-    currentReactionData = null;
-    content.innerHTML = `
-      <h4 class="text-warning">⚠️ Реакцијата не е дефинирана</h4>
-      <div class="result-eq pop">${selected.e1.symbol} + ${selected.e2.symbol} → ?</div>
-      <div class="alert alert-warning">Оваа комбинација не е додадена. Контактирај професор.</div>`;
-    participateBtn.style.display='none';
-  }
-  document.getElementById('experiment-details').style.display='none';
-  document.getElementById('experiment-details').innerHTML='';
-}
-async function participate(){
-  if(!currentReactionData) return;
-  const btn = document.getElementById('participate-btn');
-  btn.disabled=true; btn.innerText='⏳ Запишувам...';
-  try{
-    const res = await fetch('/save-experiment',{
-      method:'POST', headers:{'Content-Type':'application/json'},
-      body: JSON.stringify({
-        reaction_id: currentReactionData.reaction_id,
-        result:`Симулирана реакција: ${selected.e1.symbol}+${selected.e2.symbol} → ${currentReactionData.product}`,
-        safety_warning:'Виртуелна симулација - безбедно извршено'
-      })
-    });
-    const data = await res.json();
-    if(data.success){
-      btn.classList.replace('btn-primary','btn-success');
-      btn.innerText='✅ Запишано!';
-      const det = document.getElementById('experiment-details');
-      det.style.display='block';
-      det.innerHTML = `<div class="alert alert-success">
-        <b>Експеримент ID:</b> #${data.experiment_id}<br/>
-        Гледај во <a href="/my-experiments">Мои Експерименти</a>.
-      </div>`;
-    }else{
-      alert('Грешка при запишување: '+(data.message||'Непозната грешка'));
-      btn.disabled=false; btn.innerText='📝 Запиши учество во експеримент';
-    }
-  }catch(e){
-    console.error(e); alert('Грешка при запишување.');
-    btn.disabled=false; btn.innerText='📝 Запиши учество во експеримент';
-  }
-}
-
-/* ---------- Init ---------- */
-document.addEventListener('DOMContentLoaded', ()=>{
-  renderLists();
-  bindDropZone('drop1','e1'); bindDropZone('drop2','e2');
-
-  document.getElementById('filter-left').addEventListener('input', ()=>applyFilter('filter-left','list-left'));
-  document.getElementById('filter-right').addEventListener('input',()=>applyFilter('filter-right','list-right'));
-
-  document.getElementById('swap-btn').addEventListener('click', swapSelected);
-  document.getElementById('clear-btn').addEventListener('click', clearSelected);
-  document.getElementById('react-btn').addEventListener('click', simulateReaction);
-  document.getElementById('participate-btn').addEventListener('click', participate);
-
-  document.getElementById('cm-hazard').addEventListener('change', e=>{ if(e.target.checked){ colorMode='hazard'; renderLists(); }});
-  document.getElementById('cm-atomic').addEventListener('change', e=>{ if(e.target.checked){ colorMode='atomic'; renderLists(); }});
-});
 </script>
 {% endblock %}
Index: utils/database_manager.py
===================================================================
--- utils/database_manager.py	(revision bc45cb5da7c6d8482bc21838561ed96e007b138d)
+++ utils/database_manager.py	(revision 14fe7c26eea0eb44ab5dbcea992e11378a7f6d4e)
@@ -1,1082 +1,926 @@
-# database_manager.py
-import os, logging
-from contextlib import contextmanager
 import psycopg2
-from psycopg2.extras import RealDictCursor, execute_values
-from psycopg2 import errors as pg_errors
-
-
-def _norm_symbol(s: str) -> str:
-    return (s or "").strip().upper()
-
-def _null_if_blank(s: str | None):
-    return None if s is None or (isinstance(s, str) and s.strip() == "") else s
-
-log = logging.getLogger("simlab.db")
+from psycopg2.extras import RealDictCursor
+
 class DatabaseManager:
-    # ---------- CONNECTION ----------
-    @staticmethod
-    def get_connection():
-        return psycopg2.connect(
-            host=os.getenv('DB_HOST', 'localhost'),
-            port=int(os.getenv('DB_PORT', '9999')),
-            database=os.getenv('DB_NAME', 'db_202425z_va_prj_simlab25'),
-            user=os.getenv('DB_USER', 'db_202425z_va_prj_simlab25_owner'),
-            password=os.getenv('DB_PASS', 'c9e5ebb7d332'),
-            cursor_factory=RealDictCursor
-        )
+    @staticmethod
+    def test_connection():
+        try:
+            conn = psycopg2.connect(
+                host='localhost',
+                port=9999,
+                database='db_202425z_va_prj_simlab25',
+                user='db_202425z_va_prj_simlab25_owner',
+                password='c9e5ebb7d332',
+                cursor_factory=RealDictCursor
+            )
+            cursor = conn.cursor()
+            cursor.execute("SELECT 1")
+            cursor.close()
+            conn.close()
+            return True
+        except:
+            return False
     
-@contextmanager
-def _conn_cur():
-    conn = DatabaseManager.get_connection()
-    try:
-        with conn:
-            with conn.cursor() as cur:
-                yield cur
-    finally:
-        conn.close()
-
-class DatabaseManager(DatabaseManager):  # extend class with methods
-    # ---------- GENERIC EXEC ----------
-    @staticmethod
-    def execute_query(query, params=None):
-        try:
-            with _conn_cur() as cur:
-                cur.execute(query, params or ())
-                return cur.fetchall()
-        except Exception:
-            log.exception("execute_query failed: %s | params=%s", query, params)
-            return None
-
-
-
-    @staticmethod
-    def test_connection():
-        try:
-            with _conn_cur() as cur:
-                cur.execute("SELECT 1")
+    @staticmethod
+    def get_all_users():
+        try:
+            conn = psycopg2.connect(
+                host='localhost',
+                port=9999,
+                database='db_202425z_va_prj_simlab25',
+                user='db_202425z_va_prj_simlab25_owner',
+                password='c9e5ebb7d332',
+                cursor_factory=RealDictCursor
+            )
+            cursor = conn.cursor()
+            cursor.execute('SELECT user_id, user_name, user_surname, email, role FROM "User" ORDER BY user_name')
+            result = cursor.fetchall()
+            cursor.close()
+            conn.close()
+            return result
+        except Exception as e:
+            print(f"Грешка: {e}")
+            return None
+        
+    @staticmethod
+    def get_all_elements():
+        try:
+            conn = psycopg2.connect(
+                host='localhost',
+                port=9999,
+                database='db_202425z_va_prj_simlab25',
+                user='db_202425z_va_prj_simlab25_owner',
+                password='c9e5ebb7d332',
+                cursor_factory=RealDictCursor
+            )
+            cursor = conn.cursor()
+            cursor.execute('''
+                SELECT element_id, symbol, element_name, atomic_number, 
+                    atomic_weight, melting_point, boiling_point,  hazard_type, description_element
+                FROM elements
+                ORDER BY atomic_number
+            ''')
+            result = cursor.fetchall()
+            cursor.close()
+            conn.close()
+            return result
+        except Exception as e:
+            print(f"Грешка: {e}")
+            return None
+
+    @staticmethod
+    def get_all_equipment():
+        try:
+            conn = psycopg2.connect(
+                host='localhost',
+                port=9999,
+                database='db_202425z_va_prj_simlab25',
+                user='db_202425z_va_prj_simlab25_owner',
+                password='c9e5ebb7d332',
+                cursor_factory=RealDictCursor
+            )
+            cursor = conn.cursor()
+            cursor.execute('''
+                SELECT equipment_id, equipment_name, type, description, safety_info
+                FROM labequipment
+                ORDER BY equipment_name
+            ''')
+            result = cursor.fetchall()
+            cursor.close()
+            conn.close()
+            return result
+        except Exception as e:
+            print(f"Грешка: {e}")
+            return None
+
+    @staticmethod
+    def get_equipment_usage_report():
+        try:
+            conn = psycopg2.connect(
+                host='localhost',
+                port=9999,
+                database='db_202425z_va_prj_simlab25',
+                user='db_202425z_va_prj_simlab25_owner',
+                password='c9e5ebb7d332',
+                cursor_factory=RealDictCursor
+            )
+            cursor = conn.cursor()
+            cursor.execute('''
+                SELECT 
+                    le.equipment_name,
+                    COUNT(ele.experiment_id) AS usage_count
+                FROM ExperimentLabEquipment ele
+                RIGHT JOIN LabEquipment le ON ele.equipment_id = le.equipment_id
+                GROUP BY le.equipment_name, le.equipment_id
+                ORDER BY usage_count DESC, le.equipment_name
+            ''')
+            result = cursor.fetchall()
+            cursor.close()
+            conn.close()
+            return result
+        except Exception as e:
+            print(f"Грешка: {e}")
+            return []
+    @staticmethod
+    def authenticate_user(email, password):
+        """Автентикација на корисник"""
+        try:
+            conn = psycopg2.connect(
+                host='localhost',
+                port=9999,
+                database='db_202425z_va_prj_simlab25',
+                user='db_202425z_va_prj_simlab25_owner',
+                password='c9e5ebb7d332',
+                cursor_factory=RealDictCursor
+            )
+            cursor = conn.cursor()
+            cursor.execute('SELECT user_id, user_name, user_surname, email, role, password FROM "User" WHERE email = %s', (email,))
+            user = cursor.fetchone()
+            cursor.close()
+            conn.close()
+            return dict(user) if user else None
+        except Exception as e:
+            print(f"Грешка при автентикација: {e}")
+            return None
+
+    @staticmethod
+    def register_user(name, surname, email, password_hash, role, teacher_id=None):
+        """Регистрирај нов корисник"""
+        try:
+            conn = psycopg2.connect(
+                host='localhost',
+                port=9999,
+                database='db_202425z_va_prj_simlab25',
+                user='db_202425z_va_prj_simlab25_owner',
+                password='c9e5ebb7d332'
+            )
+            cursor = conn.cursor()
+            
+            # Вметни во User табела
+            cursor.execute(
+                'INSERT INTO "User" (user_name, user_surname, email, password, role) VALUES (%s, %s, %s, %s, %s) RETURNING user_id',
+                (name, surname, email, password_hash, role)
+            )
+            user_id = cursor.fetchone()[0]
+            
+            # Ако е студент, вметни во Student табела
+            if role == 'student' and teacher_id:
+                cursor.execute('INSERT INTO Student (student_id, teacher_id) VALUES (%s, %s)', (user_id, teacher_id))
+            # Ако е наставник, вметни во Teacher табела
+            elif role == 'teacher':
+                cursor.execute('INSERT INTO Teacher (teacher_id) VALUES (%s)', (user_id,))
+            
+            conn.commit()
+            cursor.close()
+            conn.close()
+            return user_id
+        except Exception as e:
+            print(f"Грешка при регистрација: {e}")
+            return None
+    @staticmethod
+    def get_all_teachers():
+        """Земи ги сите наставници"""
+        try:
+            conn = psycopg2.connect(
+                host='localhost', port=9999,
+                database='db_202425z_va_prj_simlab25',
+                user='db_202425z_va_prj_simlab25_owner',
+                password='c9e5ebb7d332',
+                cursor_factory=RealDictCursor
+            )
+            cursor = conn.cursor()
+            cursor.execute('''
+                SELECT t.teacher_id, u.user_name, u.user_surname 
+                FROM Teacher t
+                JOIN "User" u ON t.teacher_id = u.user_id
+                ORDER BY u.user_name
+            ''')
+            result = cursor.fetchall()
+            cursor.close()
+            conn.close()
+            return result
+        except Exception as e:
+            print(f"Грешка: {e}")
+            return []
+    @staticmethod
+    def add_element(symbol, name, atomic_number, atomic_weight, melting_point, boiling_point, hazard_type, description, teacher_id):
+        try:
+            conn = psycopg2.connect(
+                host='localhost', port=9999,
+                database='db_202425z_va_prj_simlab25',
+                user='db_202425z_va_prj_simlab25_owner',
+                password='c9e5ebb7d332'
+            )
+            cursor = conn.cursor()
+            cursor.execute('''
+                INSERT INTO elements (symbol, element_name, atomic_number, atomic_weight, melting_point, boiling_point, hazard_type, description_element, teacher_id)
+                VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s)
+                RETURNING element_id
+            ''', (symbol, name, atomic_number, atomic_weight, melting_point, boiling_point, hazard_type, description, teacher_id))
+            
+            element_id = cursor.fetchone()[0]
+            conn.commit()
+            cursor.close()
+            conn.close()
+            return element_id
+        except Exception as e:
+            print(f"Грешка при додавање елемент: {e}")
+            return None
+        
+    @staticmethod
+    def track_element_view(user_id, element_id):
+        """Track дека корисникот го погледнал елементот"""
+        try:
+            conn = psycopg2.connect(
+                host='localhost', port=9999,
+                database='db_202425z_va_prj_simlab25',
+                user='db_202425z_va_prj_simlab25_owner',
+                password='c9e5ebb7d332'
+            )
+            cursor = conn.cursor()
+            # Провери дали веќе постои запис
+            cursor.execute('SELECT 1 FROM userviewselement WHERE user_id = %s AND element_id = %s', (user_id, element_id))
+            if not cursor.fetchone():
+                cursor.execute('INSERT INTO userviewselement (user_id, element_id) VALUES (%s, %s)', (user_id, element_id))
+                conn.commit()
+            cursor.close()
+            conn.close()
+        except Exception as e:
+            print(f"Грешка при tracking: {e}")
+
+    @staticmethod
+    def get_element_views_report():
+        """Извештај за кој корисник кои елементи ги прегледал"""
+        try:
+            conn = psycopg2.connect(
+                host='localhost', port=9999,
+                database='db_202425z_va_prj_simlab25',
+                user='db_202425z_va_prj_simlab25_owner',
+                password='c9e5ebb7d332',
+                cursor_factory=RealDictCursor
+            )
+            cursor = conn.cursor()
+            cursor.execute('''
+                SELECT 
+                    u.user_name || ' ' || u.user_surname AS full_name,
+                    u.role,
+                    e.symbol,
+                    e.element_name,
+                    COUNT(*) as view_count
+                FROM userviewselement uve
+                JOIN "User" u ON uve.user_id = u.user_id
+                JOIN elements e ON uve.element_id = e.element_id
+                GROUP BY u.user_id, u.user_name, u.user_surname, u.role, e.element_id, e.symbol, e.element_name
+                ORDER BY u.user_name, e.symbol
+            ''')
+            result = cursor.fetchall()
+            cursor.close()
+            conn.close()
+            return result
+        except Exception as e:
+            print(f"Грешка: {e}")
+            return []
+
+    @staticmethod
+    def get_user_activity_summary():
+        """Сумарен извештај за активности по корисник"""
+        try:
+            conn = psycopg2.connect(
+                host='localhost', port=9999,
+                database='db_202425z_va_prj_simlab25',
+                user='db_202425z_va_prj_simlab25_owner',
+                password='c9e5ebb7d332',
+                cursor_factory=RealDictCursor
+            )
+            cursor = conn.cursor()
+            cursor.execute('''
+                SELECT 
+                    u.user_id,
+                    u.user_name || ' ' || u.user_surname AS full_name,
+                    u.role,
+                    COUNT(DISTINCT uve.element_id) AS elements_viewed,
+                    COUNT(DISTINCT uvl.equipment_id) AS equipment_viewed,
+                    COUNT(DISTINCT upe.experiment_id) AS experiments_participated
+                FROM "User" u
+                LEFT JOIN userviewselement uve ON u.user_id = uve.user_id
+                LEFT JOIN userviewslabequipment uvl ON u.user_id = uvl.user_id
+                LEFT JOIN userparticipatesinexperiment upe ON u.user_id = upe.user_id
+                GROUP BY u.user_id, u.user_name, u.user_surname, u.role
+                ORDER BY u.user_name
+            ''')
+            result = cursor.fetchall()
+            cursor.close()
+            conn.close()
+            return result
+        except Exception as e:
+            print(f"Грешка: {e}")
+            return []
+        
+    @staticmethod
+    def get_element_by_id(element_id):
+        """Земи конкретен елемент по ID"""
+        try:
+            conn = psycopg2.connect(
+                host='localhost', port=9999,
+                database='db_202425z_va_prj_simlab25',
+                user='db_202425z_va_prj_simlab25_owner',
+                password='c9e5ebb7d332',
+                cursor_factory=RealDictCursor
+            )
+            cursor = conn.cursor()
+            cursor.execute('''
+                SELECT e.*, u.user_name || ' ' || u.user_surname AS created_by
+                FROM elements e
+                JOIN "User" u ON e.teacher_id = u.user_id
+                WHERE e.element_id = %s
+            ''', (element_id,))
+            result = cursor.fetchone()
+            cursor.close()
+            conn.close()
+            return dict(result) if result else None
+        except Exception as e:
+            print(f"Грешка: {e}")
+            return None
+    @staticmethod
+    def get_my_students_activity(teacher_id):
+        """Извештај за активности на студентите на конкретен професор"""
+        try:
+            conn = psycopg2.connect(
+                host='localhost', port=9999,
+                database='db_202425z_va_prj_simlab25',
+                user='db_202425z_va_prj_simlab25_owner',
+                password='c9e5ebb7d332',
+                cursor_factory=RealDictCursor
+            )
+            cursor = conn.cursor()
+            cursor.execute('''
+                SELECT 
+                    s.student_id,
+                    u.user_name || ' ' || u.user_surname AS full_name,
+                    COUNT(DISTINCT ue.element_id) AS total_elements_viewed,
+                    COUNT(DISTINCT ul.equipment_id) AS total_lab_equipment_viewed
+                FROM Student s
+                JOIN "User" u ON s.student_id = u.user_id
+                LEFT JOIN UserViewsElement ue ON s.student_id = ue.user_id
+                LEFT JOIN UserViewsLabEquipment ul ON s.student_id = ul.user_id
+                WHERE s.teacher_id = %s
+                GROUP BY s.student_id, full_name
+                ORDER BY total_elements_viewed DESC, total_lab_equipment_viewed DESC
+            ''', (teacher_id,))
+            result = cursor.fetchall()
+            cursor.close()
+            conn.close()
+            return result
+        except Exception as e:
+            print(f"Грешка: {e}")
+            return []
+    @staticmethod
+    def get_students_with_few_experiments(teacher_id, max_experiments=3):
+        """Студенти со помалку од одреден број експерименти"""
+        try:
+            conn = psycopg2.connect(
+                host='localhost', port=9999,
+                database='db_202425z_va_prj_simlab25',
+                user='db_202425z_va_prj_simlab25_owner',
+                password='c9e5ebb7d332',
+                cursor_factory=RealDictCursor
+            )
+            cursor = conn.cursor()
+            cursor.execute('''
+                SELECT 
+                    s.student_id,
+                    u.user_name || ' ' || u.user_surname AS full_name,
+                    COUNT(up.experiment_id) AS total_experiments
+                FROM Student s
+                JOIN "User" u ON s.student_id = u.user_id
+                LEFT JOIN UserParticipatesInExperiment up ON s.student_id = up.user_id
+                WHERE s.teacher_id = %s
+                GROUP BY s.student_id, full_name
+                HAVING COUNT(up.experiment_id) < %s 
+                ORDER BY total_experiments ASC
+            ''', (teacher_id, max_experiments))
+            result = cursor.fetchall()
+            cursor.close()
+            conn.close()
+            return result
+        except Exception as e:
+            print(f"Грешка: {e}")
+            return []
+
+    @staticmethod
+    def get_teacher_statistics():
+        """Статистики по професор"""
+        try:
+            conn = psycopg2.connect(
+                host='localhost', port=9999,
+                database='db_202425z_va_prj_simlab25',
+                user='db_202425z_va_prj_simlab25_owner',
+                password='c9e5ebb7d332',
+                cursor_factory=RealDictCursor
+            )
+            cursor = conn.cursor()
+            cursor.execute('''
+                SELECT 
+                    t.teacher_id,
+                    u.user_name || ' ' || u.user_surname AS full_name,
+                    COUNT(DISTINCT s.student_id) AS total_students,
+                    COUNT(up.experiment_id) AS total_experiments,
+                    ROUND(
+                        COUNT(up.experiment_id) * 1.0 / NULLIF(COUNT(DISTINCT s.student_id), 0), 2
+                    ) AS avg_experiments_per_student
+                FROM Teacher t
+                JOIN "User" u ON t.teacher_id = u.user_id
+                LEFT JOIN Student s ON t.teacher_id = s.teacher_id
+                LEFT JOIN UserParticipatesInExperiment up ON s.student_id = up.user_id
+                GROUP BY t.teacher_id, full_name
+                ORDER BY avg_experiments_per_student DESC
+            ''')
+            result = cursor.fetchall()
+            cursor.close()
+            conn.close()
+            return result
+        except Exception as e:
+            print(f"Грешка: {e}")
+            return []
+
+    @staticmethod
+    def get_students_without_experiments(teacher_id):
+        """Студенти без експерименти"""
+        try:
+            conn = psycopg2.connect(
+                host='localhost', port=9999,
+                database='db_202425z_va_prj_simlab25',
+                user='db_202425z_va_prj_simlab25_owner',
+                password='c9e5ebb7d332',
+                cursor_factory=RealDictCursor
+            )
+            cursor = conn.cursor()
+            cursor.execute('''
+                SELECT 
+                    s.student_id,
+                    u.user_name || ' ' || u.user_surname AS full_name
+                FROM Student s
+                JOIN "User" u ON s.student_id = u.user_id
+                LEFT JOIN UserParticipatesInExperiment up ON s.student_id = up.user_id
+                WHERE s.teacher_id = %s
+                AND up.user_id IS NULL
+            ''', (teacher_id,))
+            result = cursor.fetchall()
+            cursor.close()
+            conn.close()
+            return result
+        except Exception as e:
+            print(f"Грешка: {e}")
+            return []
+
+    @staticmethod
+    def get_students_experiments_detailed(teacher_id):
+        """Детален извештај за студенти и експерименти"""
+        try:
+            conn = psycopg2.connect(
+                host='localhost', port=9999,
+                database='db_202425z_va_prj_simlab25',
+                user='db_202425z_va_prj_simlab25_owner',
+                password='c9e5ebb7d332',
+                cursor_factory=RealDictCursor
+            )
+            cursor = conn.cursor()
+            cursor.execute('''
+                SELECT 
+                    s.student_id,
+                    u.user_name || ' ' || u.user_surname AS full_name,
+                    e.experiment_id,
+                    e.result,
+                    e.time_stamp AS participation_time
+                FROM Student s
+                JOIN "User" u ON s.student_id = u.user_id
+                JOIN UserParticipatesInExperiment up ON s.student_id = up.user_id
+                JOIN Experiment e ON up.experiment_id = e.experiment_id
+                WHERE s.teacher_id = %s
+                ORDER BY u.user_name, e.time_stamp DESC
+            ''', (teacher_id,))
+            result = cursor.fetchall()
+            cursor.close()
+            conn.close()
+            return result
+        except Exception as e:
+            print(f"Грешка: {e}")
+            return []
+            
+    @staticmethod
+    def get_all_experiments():
+        """Земи сите експерименти"""
+        try:
+            conn = psycopg2.connect(
+                host='localhost', port=9999,
+                database='db_202425z_va_prj_simlab25',
+                user='db_202425z_va_prj_simlab25_owner',
+                password='c9e5ebb7d332',
+                cursor_factory=RealDictCursor
+            )
+            cursor = conn.cursor()
+            cursor.execute('''
+                SELECT 
+                    e.experiment_id,
+                    e.result,
+                    e.time_stamp,
+                    e.safety_warning,
+                    r.product,
+                    r.conditions,
+                    el1.symbol AS element1_symbol,
+                    el1.element_name AS element1_name,
+                    el2.symbol AS element2_symbol,
+                    el2.element_name AS element2_name,
+                    u.user_name || ' ' || u.user_surname AS created_by
+                FROM experiment e
+                JOIN reaction r ON e.reaction_id = r.reaction_id
+                JOIN elements el1 ON r.element1_id = el1.element_id
+                JOIN elements el2 ON r.element2_id = el2.element_id
+                JOIN "User" u ON e.teacher_id = u.user_id
+                ORDER BY e.time_stamp DESC
+            ''')
+            result = cursor.fetchall()
+            cursor.close()
+            conn.close()
+            return result
+        except Exception as e:
+            print(f"Грешка: {e}")
+            return []
+
+    @staticmethod
+    def get_experiment_equipment(experiment_id):
+        """Земи ја опремата за конкретен експеримент"""
+        try:
+            conn = psycopg2.connect(
+                host='localhost', port=9999,
+                database='db_202425z_va_prj_simlab25',
+                user='db_202425z_va_prj_simlab25_owner',
+                password='c9e5ebb7d332',
+                cursor_factory=RealDictCursor
+            )
+            cursor = conn.cursor()
+            cursor.execute('''
+                SELECT le.equipment_name, le.type, le.safety_info
+                FROM experimentlabequipment ele
+                JOIN labequipment le ON ele.equipment_id = le.equipment_id
+                WHERE ele.experiment_id = %s
+            ''', (experiment_id,))
+            result = cursor.fetchall()
+            cursor.close()
+            conn.close()
+            return result
+        except Exception as e:
+            print(f"Грешка: {e}")
+            return []
+    @staticmethod
+    def get_element_views_report():
+        """Извештај за кој корисник кои елементи ги прегледал"""
+        try:
+            conn = psycopg2.connect(
+                host='localhost', port=9999,
+                database='db_202425z_va_prj_simlab25',
+                user='db_202425z_va_prj_simlab25_owner',
+                password='c9e5ebb7d332',
+                cursor_factory=RealDictCursor
+            )
+            cursor = conn.cursor()
+            cursor.execute('''
+                SELECT 
+                    u.user_name || ' ' || u.user_surname AS full_name,
+                    u.role,
+                    e.symbol,
+                    e.element_name,
+                    COUNT(*) as view_count
+                FROM userviewselement uve
+                JOIN "User" u ON uve.user_id = u.user_id
+                JOIN elements e ON uve.element_id = e.element_id
+                GROUP BY u.user_id, u.user_name, u.user_surname, u.role, e.element_id, e.symbol, e.element_name
+                ORDER BY u.user_name, e.symbol
+            ''')
+            result = cursor.fetchall()
+            cursor.close()
+            conn.close()
+            return result
+        except Exception as e:
+            print(f"Грешка: {e}")
+            return []
+    
+    @staticmethod
+    def add_lab_equipment(name, equipment_type, description, safety_info, teacher_id):
+        """Додај нова лабораториска опрема"""
+        try:
+            conn = psycopg2.connect(
+                host='localhost', port=9999,
+                database='db_202425z_va_prj_simlab25',
+                user='db_202425z_va_prj_simlab25_owner',
+                password='c9e5ebb7d332'
+            )
+            cursor = conn.cursor()
+            cursor.execute('''
+                INSERT INTO labequipment (equipment_name, type, description, safety_info, teacher_id)
+                VALUES (%s, %s, %s, %s, %s)
+                RETURNING equipment_id
+            ''', (name, equipment_type, description, safety_info, teacher_id))
+            
+            equipment_id = cursor.fetchone()[0]
+            conn.commit()
+            cursor.close()
+            conn.close()
+            return equipment_id
+        except Exception as e:
+            print(f"Грешка при додавање опрема: {e}")
+            return None
+
+    @staticmethod
+    def track_equipment_view(user_id, equipment_id):
+        """Track дека корисникот ја погледнал опремата"""
+        try:
+            conn = psycopg2.connect(
+                host='localhost', port=9999,
+                database='db_202425z_va_prj_simlab25',
+                user='db_202425z_va_prj_simlab25_owner',
+                password='c9e5ebb7d332'
+            )
+            cursor = conn.cursor()
+            cursor.execute('SELECT 1 FROM userviewslabequipment WHERE user_id = %s AND equipment_id = %s', (user_id, equipment_id))
+            if not cursor.fetchone():
+                cursor.execute('INSERT INTO userviewslabequipment (user_id, equipment_id) VALUES (%s, %s)', (user_id, equipment_id))
+                conn.commit()
+            cursor.close()
+            conn.close()
+        except Exception as e:
+            print(f"Грешка при tracking: {e}")
+    
+    @staticmethod
+    def update_element(element_id, symbol, name, atomic_number, atomic_weight, melting_point, boiling_point, hazard_type, description):
+        try:
+            conn = psycopg2.connect(
+                host='localhost', port=9999,
+                database='db_202425z_va_prj_simlab25',
+                user='db_202425z_va_prj_simlab25_owner',
+                password='c9e5ebb7d332'
+            )
+            cursor = conn.cursor()
+            cursor.execute('''
+                UPDATE elements 
+                SET symbol = %s, element_name = %s, atomic_number = %s, atomic_weight = %s, 
+                    melting_point = %s, boiling_point = %s, hazard_type = %s, description_element = %s
+                WHERE element_id = %s
+            ''', (symbol, name, atomic_number, atomic_weight, melting_point, boiling_point, hazard_type, description, element_id))
+            conn.commit()
+            cursor.close()
+            conn.close()
             return True
-        except Exception:
-            log.exception("test_connection failed")
+        except Exception as e:
+            print(f"Грешка: {e}")
             return False
 
-    # ---------- USERS / AUTH ----------
-    @staticmethod
-    def authenticate_user(email, password):
-        """Fetch user row by email. Password check is done in service layer."""
-        try:
-            with _conn_cur() as cur:
-                cur.execute(
-                    'SELECT user_id, user_name, user_surname, email, role, password '
-                    'FROM "User" WHERE email = %s',
-                    (email,)
-                )
-                row = cur.fetchone()
-                return dict(row) if row else None
-        except Exception:
-            log.exception("authenticate_user failed (email=%s)", email)
-            return None
-
-    @staticmethod
-    def register_user(name, surname, email, password_hash, role, teacher_id=None):
-        try:
-            with _conn_cur() as cur:
-                # норма: сними email каков што е внесен (ако сакаш – .lower())
-                cur.execute(
-                    'INSERT INTO "User" (user_name, user_surname, email, password, role) '
-                    'VALUES (%s, %s, %s, %s, %s) RETURNING user_id',
-                    (name, surname, email, password_hash, role)
-                )
-                user_id = cur.fetchone()['user_id']
-
-                if role == 'student' and teacher_id:
-                    cur.execute(
-                        'INSERT INTO student (student_id, teacher_id) VALUES (%s, %s)',
-                        (user_id, teacher_id)
-                    )
-                elif role == 'teacher':
-                    cur.execute('INSERT INTO teacher (teacher_id) VALUES (%s)', (user_id,))
-
-                return user_id
-        except pg_errors.UniqueViolation:
-            log.warning("register_user: email already exists (%s)", email)
-            return None
-        except Exception:
-            log.exception("register_user failed (email=%s, role=%s)", email, role)
-            return None
-
-
+    @staticmethod
+    def get_equipment_by_id(equipment_id):
+        equipment_data = DatabaseManager.get_all_equipment()
+        for item in equipment_data:
+            if item['equipment_id'] == equipment_id:
+                return item
+        return None
+
+    @staticmethod
+    def update_equipment(equipment_id, name, equipment_type, description, safety_info):
+        try:
+            conn = psycopg2.connect(
+                host='localhost', port=9999,
+                database='db_202425z_va_prj_simlab25',
+                user='db_202425z_va_prj_simlab25_owner',
+                password='c9e5ebb7d332'
+            )
+            cursor = conn.cursor()
+            cursor.execute('''
+                UPDATE labequipment 
+                SET equipment_name = %s, type = %s, description = %s, safety_info = %s
+                WHERE equipment_id = %s
+            ''', (name, equipment_type, description, safety_info, equipment_id))
+            conn.commit()
+            cursor.close()
+            conn.close()
+            return True
+        except Exception as e:
+            print(f"Грешка: {e}")
+            return False
+    
+    @staticmethod
+    def add_reaction(teacher_id, element1_id, element2_id, product, conditions):
+        """Додај нова реакција"""
+        try:
+            conn = psycopg2.connect(
+                host='localhost', port=9999,
+                database='db_202425z_va_prj_simlab25',
+                user='db_202425z_va_prj_simlab25_owner',
+                password='c9e5ebb7d332'
+            )
+            cursor = conn.cursor()
+            cursor.execute('''
+                INSERT INTO reaction (teacher_id, element1_id, element2_id, product, conditions)
+                VALUES (%s, %s, %s, %s, %s)
+                RETURNING reaction_id
+            ''', (teacher_id, element1_id, element2_id, product, conditions))
+            
+            reaction_id = cursor.fetchone()[0]
+            conn.commit()
+            cursor.close()
+            conn.close()
+            return reaction_id
+        except Exception as e:
+            print(f"Грешка: {e}")
+            return None
+
+    @staticmethod
+    def get_all_reactions():
+        """Земи ги сите реакции"""
+        try:
+            conn = psycopg2.connect(
+                host='localhost', port=9999,
+                database='db_202425z_va_prj_simlab25',
+                user='db_202425z_va_prj_simlab25_owner',
+                password='c9e5ebb7d332',
+                cursor_factory=RealDictCursor
+            )
+            cursor = conn.cursor()
+            cursor.execute('''
+                SELECT r.*, 
+                    e1.symbol as element1_symbol, e1.element_name as element1_name,
+                    e2.symbol as element2_symbol, e2.element_name as element2_name,
+                    u.user_name || ' ' || u.user_surname as created_by
+                FROM reaction r
+                JOIN elements e1 ON r.element1_id = e1.element_id
+                JOIN elements e2 ON r.element2_id = e2.element_id
+                JOIN "User" u ON r.teacher_id = u.user_id
+                ORDER BY r.reaction_id DESC
+            ''')
+            result = cursor.fetchall()
+            cursor.close()
+            conn.close()
+            return result
+        except Exception as e:
+            print(f"Грешка: {e}")
+            return []
+
+    @staticmethod
+    def get_reaction_by_id(reaction_id):
+        """Земи реакција по ID"""
+        reactions = DatabaseManager.get_all_reactions()
+        for reaction in reactions:
+            if reaction['reaction_id'] == reaction_id:
+                return reaction
+        return None
+
+    @staticmethod
+    def update_reaction(reaction_id, element1_id, element2_id, product, conditions):
+        """Ажурирај реакција"""
+        try:
+            conn = psycopg2.connect(
+                host='localhost', port=9999,
+                database='db_202425z_va_prj_simlab25',
+                user='db_202425z_va_prj_simlab25_owner',
+                password='c9e5ebb7d332'
+            )
+            cursor = conn.cursor()
+            cursor.execute('''
+                UPDATE reaction 
+                SET element1_id = %s, element2_id = %s, product = %s, conditions = %s
+                WHERE reaction_id = %s
+            ''', (element1_id, element2_id, product, conditions, reaction_id))
+            conn.commit()
+            cursor.close()
+            conn.close()
+            return True
+        except Exception as e:
+            print(f"Грешка: {e}")
+            return False
+
+    @staticmethod
+    def delete_reaction(reaction_id):
+        """Избриши реакција"""
+        try:
+            conn = psycopg2.connect(
+                host='localhost', port=9999,
+                database='db_202425z_va_prj_simlab25',
+                user='db_202425z_va_prj_simlab25_owner',
+                password='c9e5ebb7d332'
+            )
+            cursor = conn.cursor()
+            cursor.execute('DELETE FROM reaction WHERE reaction_id = %s', (reaction_id,))
+            conn.commit()
+            cursor.close()
+            conn.close()
+            return True
+        except Exception as e:
+            print(f"Грешка: {e}")
+            return False
+
+    @staticmethod
+    def insert_experiment(teacher_id, reaction_id, result, safety_warning):
+        """Додај нов експеримент"""
+        try:
+            conn = psycopg2.connect(
+                host='localhost', port=9999,
+                database='db_202425z_va_prj_simlab25',
+                user='db_202425z_va_prj_simlab25_owner',
+                password='c9e5ebb7d332'
+            )
+            cursor = conn.cursor()
+            cursor.execute('''
+                INSERT INTO experiment (teacher_id, reaction_id, result, safety_warning, time_stamp)
+                VALUES (%s, %s, %s, %s, CURRENT_TIMESTAMP)
+                RETURNING experiment_id
+            ''', (teacher_id, reaction_id, result, safety_warning))
+            
+            experiment_id = cursor.fetchone()[0]
+            conn.commit()
+            cursor.close()
+            conn.close()
+            return experiment_id
+        except Exception as e:
+            print(f"Грешка: {e}")
+            return None
+
+    @staticmethod
+    def track_experiment_participation(user_id, experiment_id):
+        try:
+            conn = psycopg2.connect(
+                host='localhost', port=9999,
+                database='db_202425z_va_prj_simlab25',
+                user='db_202425z_va_prj_simlab25_owner',
+                password='c9e5ebb7d332'
+            )
+            cursor = conn.cursor()
+            print(f"DEBUG: Додавам user_id={user_id}, experiment_id={experiment_id}")
+            cursor.execute('''
+                INSERT INTO userparticipatesinexperiment (user_id, experiment_id)
+                VALUES (%s, %s)
+            ''', (user_id, experiment_id))
+            conn.commit()
+            cursor.close()
+            conn.close()
+            print("DEBUG: Успешно додадено учество")
+        except Exception as e:
+            print(f"DEBUG Грешка при додавање учество: {e}")
+
+    @staticmethod
+    def get_user_experiments(user_id):
+        """Земи експерименти на корисник"""
+        try:
+            conn = psycopg2.connect(
+                host='localhost', port=9999,
+                database='db_202425z_va_prj_simlab25',
+                user='db_202425z_va_prj_simlab25_owner',
+                password='c9e5ebb7d332',
+                cursor_factory=RealDictCursor
+            )
+            cursor = conn.cursor()
+            cursor.execute('''
+                SELECT e.*, 
+                    r.product,
+                    r.conditions,
+                    el1.symbol as element1_symbol, el1.element_name as element1_name,
+                    el2.symbol as element2_symbol, el2.element_name as element2_name,
+                    up.participation_timestamp
+                FROM experiment e
+                JOIN userparticipatesinexperiment up ON e.experiment_id = up.experiment_id
+                JOIN reaction r ON e.reaction_id = r.reaction_id
+                JOIN elements el1 ON r.element1_id = el1.element_id
+                JOIN elements el2 ON r.element2_id = el2.element_id
+                WHERE up.user_id = %s
+                ORDER BY up.participation_timestamp DESC
+            ''', (user_id,))
+            result = cursor.fetchall()
+            cursor.close()
+            conn.close()
+            return result
+        except Exception as e:
+            print(f"Грешка: {e}")
+            return []
     @staticmethod
     def get_user_by_id(user_id):
-        try:
-            with _conn_cur() as cur:
-                cur.execute('''
-                    SELECT u.*, s.teacher_id
-                    FROM "User" u
-                    LEFT JOIN student s ON u.user_id = s.student_id
-                    WHERE u.user_id = %s
-                ''', (user_id,))
-                row = cur.fetchone()
-                return dict(row) if row else None
-        except Exception:
-            log.exception("get_user_by_id failed (%s)", user_id)
-            return None
-
-    @staticmethod
-    def get_all_teachers():
-        try:
-            with _conn_cur() as cur:
-                cur.execute('''
-                    SELECT t.teacher_id, u.user_name, u.user_surname
-                    FROM teacher t
-                    JOIN "User" u ON t.teacher_id = u.user_id
-                    ORDER BY u.user_name
-                ''')
-                return cur.fetchall()
-        except Exception:
-            log.exception("get_all_teachers failed")
-            return []
-
-    @staticmethod
-    def get_all_users():
-        try:
-            with _conn_cur() as cur:
-                cur.execute('SELECT user_id, user_name, user_surname, email, role FROM "User" ORDER BY user_name')
-                return cur.fetchall()
-        except Exception:
-            log.exception("get_all_users failed")
-            return None
-
-    # ---------- ELEMENTS ----------
-    @staticmethod
-    def get_all_elements():
-        try:
-            with _conn_cur() as cur:
-                cur.execute('''
-                    SELECT element_id, symbol, element_name, atomic_number, 
-                           atomic_weight, melting_point, boiling_point, hazard_type, description_element
-                    FROM elements
-                    ORDER BY atomic_number
-                ''')
-                return cur.fetchall()
-        except Exception:
-            log.exception("get_all_elements failed")
-            return None
-        
-
-    @staticmethod
-    def add_element(symbol, name, atomic_number, atomic_weight, melting_point, boiling_point, hazard_type, description, teacher_id):
-        try:
-            with _conn_cur() as cur:
-                symbol = _norm_symbol(symbol)
-                cur.execute('''
-                    INSERT INTO elements (symbol, element_name, atomic_number, atomic_weight, 
-                                        melting_point, boiling_point, hazard_type, description_element, teacher_id)
-                    VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s)
-                    RETURNING element_id
-                ''', (symbol, name, atomic_number, atomic_weight, melting_point, boiling_point, hazard_type, description, teacher_id))
-                return cur.fetchone()['element_id']
-        except pg_errors.UniqueViolation:
-            log.warning("add_element: symbol already exists (%s)", symbol)
-            return None
-        except pg_errors.CheckViolation:
-            log.warning("add_element: physical constraint violation (Z>0, mass>0, melting<boiling)")
-            return None
-        except Exception:
-            log.exception("add_element failed (symbol=%s, name=%s)", symbol, name)
-            return None
-
-    @staticmethod
-    def update_element(element_id, symbol, name, atomic_number, atomic_weight, melting_point, boiling_point, hazard_type, description):
-        try:
-            with _conn_cur() as cur:
-                symbol = _norm_symbol(symbol)
-                cur.execute('''
-                    UPDATE elements 
-                    SET symbol = %s, element_name = %s, atomic_number = %s, atomic_weight = %s, 
-                        melting_point = %s, boiling_point = %s, hazard_type = %s, description_element = %s
-                    WHERE element_id = %s
-                ''', (symbol, name, atomic_number, atomic_weight, melting_point, boiling_point, hazard_type, description, element_id))
-                return True
-        except pg_errors.UniqueViolation:
-            log.warning("update_element: symbol already exists (%s)", symbol)
-            return False
-        except pg_errors.CheckViolation:
-            log.warning("update_element: physical constraint violation")
-            return False
-        except Exception:
-            log.exception("update_element failed (element_id=%s)", element_id)
-            return False
-
-    @staticmethod
-    def get_element_by_id(element_id):
-        try:
-            with _conn_cur() as cur:
-                cur.execute('''
-                    SELECT e.*, u.user_name || ' ' || u.user_surname AS created_by
-                    FROM elements e
-                    JOIN "User" u ON e.teacher_id = u.user_id
-                    WHERE e.element_id = %s
-                ''', (element_id,))
-                row = cur.fetchone()
-                return dict(row) if row else None
-        except Exception:
-            log.exception("get_element_by_id failed (%s)", element_id)
-            return None
-
-    # ---------- LAB EQUIPMENT ----------
-    @staticmethod
-    def get_all_equipment():
-        try:
-            with _conn_cur() as cur:
-                cur.execute('''
-                    SELECT equipment_id, equipment_name, type, description, safety_info
-                    FROM labequipment
-                    ORDER BY equipment_name
-                ''')
-                return cur.fetchall()
-        except Exception:
-            log.exception("get_all_equipment failed")
-            return None
-
-    @staticmethod
-    def add_lab_equipment(name, equipment_type, description, safety_info, teacher_id):
-        try:
-            with _conn_cur() as cur:
-                cur.execute('''
-                    INSERT INTO labequipment (equipment_name, type, description, safety_info, teacher_id)
-                    VALUES (%s, %s, %s, %s, %s)
-                    RETURNING equipment_id
-                ''', (name, equipment_type, description, safety_info, teacher_id))
-                return cur.fetchone()['equipment_id']
-        except pg_errors.UniqueViolation:
-            log.warning("add_lab_equipment: equipment_name already exists (%s)", name)
-            return None
-        except Exception:
-            log.exception("add_lab_equipment failed (name=%s, type=%s)", name, equipment_type)
-            return None
-
-    @staticmethod
-    def update_equipment(equipment_id, name, equipment_type, description, safety_info):
-        try:
-            with _conn_cur() as cur:
-                cur.execute('''
-                    UPDATE labequipment 
-                    SET equipment_name = %s, type = %s, description = %s, safety_info = %s
-                    WHERE equipment_id = %s
-                ''', (name, equipment_type, description, safety_info, equipment_id))
-                return True
-        except Exception:
-            log.exception("update_equipment failed (equipment_id=%s)", equipment_id)
-            return False
-
-    @staticmethod
-    def get_equipment_by_id(equipment_id):
-        try:
-            with _conn_cur() as cur:
-                cur.execute("""
-                    SELECT equipment_id, equipment_name, type, description, safety_info
-                    FROM labequipment WHERE equipment_id = %s
-                """, (equipment_id,))
-                row = cur.fetchone()
-                return dict(row) if row else None
-        except Exception:
-            log.exception("get_equipment_by_id failed (%s)", equipment_id)
-            return None
-
-
-    # ---------- REACTIONS ----------
-    @staticmethod
-    def add_reaction(teacher_id, element1_id, element2_id, product, conditions):
-        if element1_id == element2_id:
-            log.warning("add_reaction blocked: element1_id == element2_id")
-            return None
-        try:
-            with _conn_cur() as cur:
-                cur.execute('''
-                    INSERT INTO reaction (teacher_id, element1_id, element2_id, product, conditions)
-                    VALUES (%s, %s, %s, %s, %s)
-                    RETURNING reaction_id
-                ''', (teacher_id, element1_id, element2_id, product, conditions))
-                return cur.fetchone()['reaction_id']
-        except pg_errors.UniqueViolation:
-            log.warning("add_reaction: duplicate (element1, element2, conditions)")
-            return None
-        except pg_errors.CheckViolation:
-            log.warning("add_reaction: check violation (element1_id <> element2_id)")
-            return None
-        except Exception:
-            log.exception("add_reaction failed")
-            return None
-
-    @staticmethod
-    def update_reaction(reaction_id, element1_id, element2_id, product, conditions):
-        if element1_id == element2_id:
-            log.warning("update_reaction blocked: element1_id == element2_id")
-            return False
-        try:
-            with _conn_cur() as cur:
-                cur.execute('''
-                    UPDATE reaction 
-                    SET element1_id = %s, element2_id = %s, product = %s, conditions = %s
-                    WHERE reaction_id = %s
-                ''', (element1_id, element2_id, product, conditions, reaction_id))
-                return True
-        except pg_errors.UniqueViolation:
-            log.warning("update_reaction: duplicate (element1, element2, conditions)")
-            return False
-        except pg_errors.CheckViolation:
-            log.warning("update_reaction: check violation (element1_id <> element2_id)")
-            return False
-        except Exception:
-            log.exception("update_reaction failed (reaction_id=%s)", reaction_id)
-            return False
-
-    @staticmethod
-    def delete_reaction(reaction_id):
-        try:
-            with _conn_cur() as cur:
-                cur.execute('DELETE FROM reaction WHERE reaction_id = %s', (reaction_id,))
-                return True
-        except pg_errors.ForeignKeyViolation:
-            log.warning("delete_reaction blocked: Reaction %s has Experiments", reaction_id)
-            return False
-        except Exception:
-            log.exception("delete_reaction failed (reaction_id=%s)", reaction_id)
-            return False
-
-
-    @staticmethod
-    def get_all_reactions():
-        try:
-            with _conn_cur() as cur:
-                cur.execute('''
-                    SELECT r.*,
-                           e1.symbol  AS element1_symbol, e1.element_name AS element1_name,
-                           e2.symbol  AS element2_symbol, e2.element_name AS element2_name,
-                           u.user_name || ' ' || u.user_surname AS created_by
-                    FROM reaction r
-                    JOIN elements e1 ON r.element1_id = e1.element_id
-                    JOIN elements e2 ON r.element2_id = e2.element_id
-                    JOIN "User"  u   ON r.teacher_id = u.user_id
-                    ORDER BY r.reaction_id DESC
-                ''')
-                return cur.fetchall()
-        except Exception:
-            log.exception("get_all_reactions failed")
-            return []
-
-    @staticmethod
-    def get_reaction_by_id(reaction_id):
-        try:
-            with _conn_cur() as cur:
-                cur.execute("""
-                    SELECT r.*,
-                           e1.symbol  AS element1_symbol, e1.element_name AS element1_name,
-                           e2.symbol  AS element2_symbol, e2.element_name AS element2_name,
-                           u.user_name || ' ' || u.user_surname AS created_by
-                    FROM reaction r
-                    JOIN elements e1 ON r.element1_id = e1.element_id
-                    JOIN elements e2 ON r.element2_id = e2.element_id
-                    JOIN "User"  u   ON r.teacher_id = u.user_id
-                    WHERE r.reaction_id = %s
-                """, (reaction_id,))
-                row = cur.fetchone()
-                return dict(row) if row else None
-        except Exception:
-            log.exception("get_reaction_by_id failed (%s)", reaction_id)
-            return None
-        
-
-    # ---------- EXPERIMENTS ----------
-    @staticmethod
-    def insert_experiment(teacher_id, reaction_id, result, safety_warning):
-        try:
-            with _conn_cur() as cur:
-                cur.execute('''
-                    INSERT INTO experiment (teacher_id, reaction_id, result, safety_warning, time_stamp)
-                    VALUES (%s, %s, %s, %s, CURRENT_TIMESTAMP)
-                    RETURNING experiment_id
-                ''', (teacher_id, reaction_id, result, _null_if_blank(safety_warning)))
-                return cur.fetchone()['experiment_id']
-        except Exception:
-            log.exception("insert_experiment failed")
-            return None
-
-
-    @staticmethod
-    def get_all_experiments():
-        try:
-            with _conn_cur() as cur:
-                cur.execute('''
-                    SELECT e.experiment_id,
-                           e.result,
-                           e.time_stamp,
-                           e.safety_warning,
-                           r.product,
-                           r.conditions,
-                           el1.symbol AS element1_symbol,
-                           el1.element_name AS element1_name,
-                           el2.symbol AS element2_symbol,
-                           el2.element_name AS element2_name,
-                           u.user_name || ' ' || u.user_surname AS created_by
-                    FROM experiment e
-                    JOIN reaction r ON e.reaction_id = r.reaction_id
-                    JOIN elements el1 ON r.element1_id = el1.element_id
-                    JOIN elements el2 ON r.element2_id = el2.element_id
-                    JOIN "User" u ON e.teacher_id = u.user_id
-                    ORDER BY e.time_stamp DESC
-                ''')
-                return cur.fetchall()
-        except Exception:
-            log.exception("get_all_experiments failed")
-            return []
-
-    @staticmethod
-    def get_experiment_by_id(experiment_id):
-        try:
-            with _conn_cur() as cur:
-                cur.execute('''
-                    SELECT e.experiment_id,
-                           e.result,
-                           e.time_stamp,
-                           e.safety_warning,
-                           r.product,
-                           r.conditions,
-                           el1.symbol AS element1_symbol,
-                           el1.element_name AS element1_name,
-                           el2.symbol AS element2_symbol,
-                           el2.element_name AS element2_name,
-                           u.user_name || ' ' || u.user_surname AS created_by
-                    FROM experiment e
-                    JOIN reaction r ON e.reaction_id = r.reaction_id
-                    JOIN elements el1 ON r.element1_id = el1.element_id
-                    JOIN elements el2 ON r.element2_id = el2.element_id
-                    JOIN "User" u ON e.teacher_id = u.user_id
-                    WHERE e.experiment_id = %s
-                ''', (experiment_id,))
-                row = cur.fetchone()
-                return dict(row) if row else None
-        except Exception:
-            log.exception("get_experiment_by_id failed (%s)", experiment_id)
-            return None
-
-    @staticmethod
-    def get_experiment_equipment(experiment_id):
-        try:
-            with _conn_cur() as cur:
-                cur.execute('''
-                    SELECT le.equipment_name, le.type, le.safety_info
-                    FROM experimentlabequipment ele
-                    JOIN labequipment le ON ele.equipment_id = le.equipment_id
-                    WHERE ele.experiment_id = %s
-                ''', (experiment_id,))
-                return cur.fetchall()
-        except Exception:
-            log.exception("get_experiment_equipment failed (%s)", experiment_id)
-            return []
-
-
-    # ---------- PARTICIPATION / VIEWS ----------
-    @staticmethod
-    def track_experiment_participation(user_id, experiment_id):
-        try:
-            with _conn_cur() as cur:
-                cur.execute('''
-                    INSERT INTO userparticipatesinexperiment (user_id, experiment_id)
-                    VALUES (%s, %s)
-                    ON CONFLICT (user_id, experiment_id) DO NOTHING
-                ''', (user_id, experiment_id))
-                return True
-        except Exception:
-            log.exception("track_experiment_participation failed")
-            return False
-
-
-    @staticmethod
-    def get_user_experiments(user_id):
-        try:
-            with _conn_cur() as cur:
-                cur.execute('''
-                    SELECT e.*,
-                           r.product,
-                           r.conditions,
-                           el1.symbol AS element1_symbol, el1.element_name AS element1_name,
-                           el2.symbol AS element2_symbol, el2.element_name AS element2_name,
-                           up.participation_timestamp
-                    FROM experiment e
-                    JOIN userparticipatesinexperiment up ON e.experiment_id = up.experiment_id
-                    JOIN reaction r ON e.reaction_id = r.reaction_id
-                    JOIN elements el1 ON r.element1_id = el1.element_id
-                    JOIN elements el2 ON r.element2_id = el2.element_id
-                    WHERE up.user_id = %s
-                    ORDER BY up.participation_timestamp DESC
-                ''', (user_id,))
-                return cur.fetchall()
-        except Exception:
-            log.exception("get_user_experiments failed (%s)", user_id)
-            return []
-
-    @staticmethod
-    def track_element_view(user_id, element_id):
-        try:
-            with _conn_cur() as cur:
-                cur.execute('''
-                    INSERT INTO userviewselement(user_id, element_id)
-                    VALUES (%s, %s) ON CONFLICT DO NOTHING
-                ''', (user_id, element_id))
-        except Exception:
-            log.exception("track_element_view failed")
-
-    @staticmethod
-    def track_equipment_view(user_id, equipment_id):
-        try:
-            with _conn_cur() as cur:
-                cur.execute('''
-                    INSERT INTO userviewslabequipment(user_id, equipment_id)
-                    VALUES (%s, %s) ON CONFLICT DO NOTHING
-                ''', (user_id, equipment_id))
-        except Exception:
-            log.exception("track_equipment_view failed")
-
-
-    # ---------- REPORT EXAMPLES ----------
-    @staticmethod
-    def get_equipment_usage_report():
-        try:
-            with _conn_cur() as cur:
-                cur.execute('''
-                    SELECT le.equipment_name,
-                           COUNT(ele.experiment_id) AS usage_count
-                    FROM labequipment le
-                    LEFT JOIN experimentlabequipment ele ON ele.equipment_id = le.equipment_id
-                    GROUP BY le.equipment_name, le.equipment_id
-                    ORDER BY usage_count DESC, le.equipment_name
-                ''')
-                return cur.fetchall()
-        except Exception:
-            log.exception("get_equipment_usage_report failed")
-            return []
-
-
-    # ---------- NEW: N:M helper ----------
-    @staticmethod
-    def add_experiment_equipment(experiment_id, equipment_ids, conn=None, cur=None):
-        """Bulk insert into experimentlabequipment; idempotent via ON CONFLICT DO NOTHING."""
-        if not equipment_ids:
-            return
-        rows = [(experiment_id, eq_id) for eq_id in equipment_ids]
-        try:
-            if conn and cur:
-                execute_values(cur, """
-                    INSERT INTO experimentlabequipment (experiment_id, equipment_id)
-                    VALUES %s ON CONFLICT DO NOTHING
-                """, rows)
-            else:
-                with DatabaseManager.get_connection() as c:
-                    with c.cursor() as k:
-                        execute_values(k, """
-                            INSERT INTO experimentlabequipment (experiment_id, equipment_id)
-                            VALUES %s ON CONFLICT DO NOTHING
-                        """, rows)
-        except Exception:
-            log.exception("add_experiment_equipment failed (exp=%s)", experiment_id)
-
-    @staticmethod
-    def _create_reaction_and_experiment_python(
-        teacher_id,
-        element1_id,
-        element2_id,
-        product,
-        conditions,
-        experiment_result,         # prose description (NOT product)
-        safety_warning=None,
-        equipment_ids=None
-    ):
-        """Create Reaction → Experiment (+equipment) in ONE transaction."""
-        conn = None
-        try:
-            conn = DatabaseManager.get_connection()
-            with conn:
-                with conn.cursor() as cur:
-                    # 1) Reaction
-                    cur.execute('''
-                        INSERT INTO reaction (teacher_id, element1_id, element2_id, product, conditions)
-                        VALUES (%s, %s, %s, %s, %s)
-                        RETURNING reaction_id
-                    ''', (teacher_id, element1_id, element2_id, product, conditions))
-                    reaction_id = cur.fetchone()['reaction_id']
-
-                    # 2) fallback experiment_result if missing
-                    if not experiment_result:
-                        cur.execute('SELECT symbol FROM elements WHERE element_id = %s', (element1_id,))
-                        s1 = cur.fetchone()['symbol']
-                        cur.execute('SELECT symbol FROM elements WHERE element_id = %s', (element2_id,))
-                        s2 = cur.fetchone()['symbol']
-                        experiment_result = (
-                            f"Експеримент со {s1} и {s2} под услови: {conditions or 'стандардни'}. "
-                            f"Очекуван производ: {product or 'непознат'}."
-                        )
-
-                    # 3) Experiment
-                    cur.execute('''
-                        INSERT INTO experiment (teacher_id, reaction_id, result, safety_warning, time_stamp)
-                        VALUES (%s, %s, %s, %s, CURRENT_TIMESTAMP)
-                        RETURNING experiment_id
-                    ''', (teacher_id, reaction_id, experiment_result, safety_warning))
-                    experiment_id = cur.fetchone()['experiment_id']
-
-                    # 4) Equipment links
-                    if equipment_ids:
-                        DatabaseManager.add_experiment_equipment(
-                            experiment_id=experiment_id,
-                            equipment_ids=equipment_ids,
-                            conn=conn, cur=cur
-                        )
-
-            return {"reaction_id": reaction_id, "experiment_id": experiment_id}
-
-        except Exception:
-            if conn:
-                try:
-                    conn.rollback()
-                except Exception:
-                    pass
-                try:
-                    conn.close()
-                except Exception:
-                    pass
-            log.exception("_create_reaction_and_experiment_python failed")
-            return None
-
-    # ---------- helpers / views / stats ----------
-    @staticmethod
-    def get_experiment_by_reaction(reaction_id):
-        try:
-            with _conn_cur() as cur:
-                cur.execute("""
-                    SELECT *
-                    FROM experiment
-                    WHERE reaction_id = %s
-                    ORDER BY time_stamp DESC
-                    LIMIT 1
-                """, (reaction_id,))
-                row = cur.fetchone()
-                return dict(row) if row else None
-        except Exception:
-            log.exception("get_experiment_by_reaction failed (%s)", reaction_id)
-            return None
-
-    @staticmethod
-    def get_student_participation_experiments(student_id):
-        try:
-            with _conn_cur() as cur:
-                cur.execute("""
-                    SELECT
-                        e.experiment_id,
-                        e.result,
-                        e.safety_warning,
-                        e.time_stamp,
-                        r.product,
-                        r.conditions,
-                        el1.symbol AS element1_symbol,
-                        el1.element_name AS element1_name,
-                        el2.symbol AS element2_symbol,
-                        el2.element_name AS element2_name
-                    FROM userparticipatesinexperiment up
-                    JOIN experiment e ON up.experiment_id = e.experiment_id
-                    JOIN reaction  r  ON e.reaction_id = r.reaction_id
-                    JOIN elements el1 ON r.element1_id = el1.element_id
-                    JOIN elements el2 ON r.element2_id = el2.element_id
-                    WHERE up.user_id = %s
-                    ORDER BY up.participation_timestamp DESC
-                """, (student_id,))
-                return cur.fetchall()
-        except Exception:
-            log.exception("get_student_participation_experiments failed (%s)", student_id)
-            return []
-
-    @staticmethod
-    def get_student_statistics(student_id):
-        try:
-            with _conn_cur() as cur:
-                cur.execute("""
-                    SELECT 
-                        (SELECT COUNT(*) FROM userparticipatesinexperiment WHERE user_id = %s) AS experiment_count,
-                        (SELECT COUNT(*) FROM userviewselement             WHERE user_id = %s) AS element_count,
-                        (SELECT COUNT(*) FROM userviewslabequipment        WHERE user_id = %s) AS equipment_count,
-                        (
-                            SELECT COUNT(DISTINCT e.reaction_id)
-                            FROM userparticipatesinexperiment up
-                            JOIN experiment e ON up.experiment_id = e.experiment_id
-                            WHERE up.user_id = %s
-                        ) AS reaction_count
-                """, (student_id, student_id, student_id, student_id))
-                row = cur.fetchone()
-                return dict(row) if row else {
-                    'experiment_count': 0, 'element_count': 0, 'equipment_count': 0, 'reaction_count': 0
-                }
-        except Exception:
-            log.exception("get_student_statistics failed (%s)", student_id)
-            return {'experiment_count': 0, 'element_count': 0, 'equipment_count': 0, 'reaction_count': 0}
-
-    @staticmethod
-    def get_teacher_dashboard_statistics(teacher_id):
-        try:
-            with _conn_cur() as cur:
-                def get_c():
-                    row = cur.fetchone()
-                    if row is None:
-                        return 0
-                    try:
-                        return int(row['c'])
-                    except Exception:
-                        return int(row[0])
-
-                cur.execute("""
-                    SELECT COUNT(*) AS c
-                    FROM student
-                    WHERE teacher_id = %s
-                """, (teacher_id,))
-                student_count = get_c()
-
-                cur.execute("""
-                    SELECT COUNT(*) AS c
-                    FROM reaction
-                    WHERE teacher_id = %s
-                """, (teacher_id,))
-                reaction_count = get_c()
-
-                cur.execute("""
-                    SELECT COUNT(*) AS c
-                    FROM experiment
-                    WHERE teacher_id = %s
-                """, (teacher_id,))
-                experiment_count = get_c()
-
-                try:
-                    cur.execute("""
-                        SELECT COUNT(*) AS c
-                        FROM userparticipatesinexperiment up
-                        JOIN student s ON up.user_id = s.student_id
-                        WHERE s.teacher_id = %s
-                        AND up.participation_timestamp::date = CURRENT_DATE
-                    """, (teacher_id,))
-                    activity_count = get_c()
-                except Exception:
-                    cur.execute("""
-                        SELECT COUNT(*) AS c
-                        FROM userparticipatesinexperiment up
-                        JOIN student   s ON up.user_id       = s.student_id
-                        JOIN experiment e ON up.experiment_id = e.experiment_id
-                        WHERE s.teacher_id = %s
-                        AND e.time_stamp::date = CURRENT_DATE
-                    """, (teacher_id,))
-                    activity_count = get_c()
-
-                return {
-                    'student_count': student_count,
-                    'reaction_count': reaction_count,
-                    'experiment_count': experiment_count,
-                    'activity_count': activity_count
-                }
-        except Exception:
-            log.exception("get_teacher_dashboard_statistics failed (teacher_id=%s)", teacher_id)
-            return {'student_count': 0, 'reaction_count': 0, 'experiment_count': 0, 'activity_count': 0}
-
-    @staticmethod
-    def get_my_students_activity(teacher_id):
-        try:
-            with _conn_cur() as cur:
-                cur.execute("""
-                    SELECT 
-                        s.student_id,
-                        (u.user_name || ' ' || u.user_surname) AS full_name,
-                        COALESCE(COUNT(DISTINCT uve.element_id), 0)      AS total_elements_viewed,
-                        COALESCE(COUNT(DISTINCT uvl.equipment_id), 0)    AS total_lab_equipment_viewed
-                    FROM student s
-                    JOIN "User" u ON s.student_id = u.user_id
-                    LEFT JOIN userviewselement      uve ON s.student_id = uve.user_id
-                    LEFT JOIN userviewslabequipment uvl ON s.student_id = uvl.user_id
-                    WHERE s.teacher_id = %s
-                    GROUP BY s.student_id, full_name
-                    ORDER BY total_elements_viewed DESC, total_lab_equipment_viewed DESC
-                """, (teacher_id,))
-                return cur.fetchall()
-        except Exception:
-            log.exception("get_my_students_activity failed")
-            return []
-
-    @staticmethod
-    def get_students_without_experiments(teacher_id):
-        try:
-            with _conn_cur() as cur:
-                cur.execute("""
-                    SELECT 
-                        s.student_id,
-                        (u.user_name || ' ' || u.user_surname) AS full_name
-                    FROM student s
-                    JOIN "User" u ON s.student_id = u.user_id
-                    LEFT JOIN userparticipatesinexperiment up ON s.student_id = up.user_id
-                    WHERE s.teacher_id = %s
-                      AND up.user_id IS NULL
-                    ORDER BY full_name
-                """, (teacher_id,))
-                return cur.fetchall()
-        except Exception:
-            log.exception("get_students_without_experiments failed")
-            return []
-
-    @staticmethod
-    def get_students_with_few_experiments(teacher_id, max_experiments=3):
-        try:
-            with _conn_cur() as cur:
-                cur.execute("""
-                    SELECT 
-                        s.student_id,
-                        (u.user_name || ' ' || u.user_surname) AS full_name,
-                        COUNT(up.experiment_id) AS total_experiments
-                    FROM student s
-                    JOIN "User" u ON s.student_id = u.user_id
-                    LEFT JOIN userparticipatesinexperiment up ON s.student_id = up.user_id
-                    WHERE s.teacher_id = %s
-                    GROUP BY s.student_id, full_name
-                    HAVING COUNT(up.experiment_id) < %s
-                    ORDER BY total_experiments ASC, full_name
-                """, (teacher_id, max_experiments))
-                return cur.fetchall()
-        except Exception:
-            log.exception("get_students_with_few_experiments failed")
-            return []
-
-    @staticmethod
-    def get_element_views_report():
-        try:
-            with _conn_cur() as cur:
-                cur.execute("""
-                    SELECT 
-                        (u.user_name || ' ' || u.user_surname) AS full_name,
-                        u.role,
-                        e.symbol,
-                        e.element_name,
-                        COUNT(*) AS view_count
-                    FROM userviewselement uve
-                    JOIN "User" u ON uve.user_id = u.user_id
-                    JOIN elements e ON uve.element_id = e.element_id
-                    GROUP BY u.user_id, u.user_name, u.user_surname, u.role, 
-                            e.element_id, e.symbol, e.element_name
-                    ORDER BY u.user_name, e.symbol
-                """)
-                return cur.fetchall()
-        except Exception:
-            log.exception("get_element_views_report failed")
-            return []
-
-    @staticmethod
-    def get_teacher_statistics():
-        try:
-            with _conn_cur() as cur:
-                cur.execute("""
-                    SELECT 
-                        t.teacher_id,
-                        (u.user_name || ' ' || u.user_surname) AS full_name,
-                        COUNT(DISTINCT s.student_id) AS total_students,
-                        COUNT(up.experiment_id)      AS total_experiments,
-                        ROUND(
-                            COUNT(up.experiment_id) * 1.0 / NULLIF(COUNT(DISTINCT s.student_id), 0), 2
-                        ) AS avg_experiments_per_student
-                    FROM teacher t
-                    JOIN "User" u ON t.teacher_id = u.user_id
-                    LEFT JOIN student s ON t.teacher_id = s.teacher_id
-                    LEFT JOIN userparticipatesinexperiment up ON s.student_id = up.user_id
-                    GROUP BY t.teacher_id, full_name
-                    ORDER BY avg_experiments_per_student DESC, full_name
-                """)
-                return cur.fetchall()
-        except Exception:
-            log.exception("get_teacher_statistics failed")
-            return []
-
-    @staticmethod
-    def get_students_experiments_for_teacher(teacher_id):
-        try:
-            with _conn_cur() as cur:
-                cur.execute("""
-                    SELECT 
-                        (u.user_name || ' ' || u.user_surname) AS student_name,
-                        s.student_id,
-                        e.experiment_id,
-                        e.result,
-                        e.time_stamp,
-                        r.product,
-                        el1.symbol AS element1_symbol,
-                        el2.symbol AS element2_symbol,
-                        up.participation_timestamp AS participation_date
-                    FROM student s
-                    JOIN "User" u ON s.student_id = u.user_id
-                    JOIN userparticipatesinexperiment up ON s.student_id = up.user_id
-                    JOIN experiment e ON up.experiment_id = e.experiment_id
-                    JOIN reaction  r ON e.reaction_id   = r.reaction_id
-                    JOIN elements el1 ON r.element1_id = el1.element_id
-                    JOIN elements el2 ON r.element2_id = el2.element_id
-                    WHERE s.teacher_id = %s
-                    ORDER BY up.participation_timestamp DESC, student_name
-                """, (teacher_id,))
-                return cur.fetchall()
-        except Exception:
-            log.exception("get_students_experiments_for_teacher failed")
-            return []
-
-    # Views
-    @staticmethod
-    def vw_students_experiments_detailed():
-        try:
-            with _conn_cur() as cur:
-                cur.execute('SELECT * FROM vw_students_experiments_detailed')
-                return cur.fetchall()
-        except Exception:
-            log.exception("vw_students_experiments_detailed failed")
-            return []
-
-    @staticmethod
-    def vw_students_experiments_for_teacher(teacher_id):
-        try:
-            with _conn_cur() as cur:
-                cur.execute('SELECT * FROM vw_students_experiments_for_teacher WHERE teacher_id = %s',
-                            (teacher_id,))
-                return cur.fetchall()
-        except Exception:
-            log.exception("vw_students_experiments_for_teacher failed (teacher_id=%s)", teacher_id)
-            return []
-
-    # DB function wrapper + fallback
-    @staticmethod
-    def create_reaction_and_experiment_dbfn(
-        teacher_id,
-        element1_id,
-        element2_id,
-        product,
-        conditions,
-        experiment_result=None,
-        safety_warning=None,
-        equipment_ids=None
-    ):
-        try:
-            with _conn_cur() as cur:
-                cur.execute(
-                    '''
-                    SELECT * FROM create_reaction_and_experiment_fn(
-                        %s, %s, %s, %s, %s, %s, %s, %s::int[]
-                    )
-                    ''',
-                    (
-                        teacher_id,
-                        element1_id,
-                        element2_id,
-                        product,
-                        conditions,
-                        experiment_result,
-                        safety_warning,
-                        equipment_ids
-                    )
-                )
-                row = cur.fetchone()
-                return dict(row) if row else None
-        except Exception:
-            log.exception("create_reaction_and_experiment_dbfn failed")
-            return None
-
-    @staticmethod
-    def create_reaction_and_experiment(
-        teacher_id,
-        element1_id,
-        element2_id,
-        product,
-        conditions,
-        experiment_result,
-        safety_warning=None,
-        equipment_ids=None
-    ):
-        # Try DB function first
-        res = DatabaseManager.create_reaction_and_experiment_dbfn(
-            teacher_id, element1_id, element2_id, product, conditions,
-            experiment_result, safety_warning, equipment_ids
-        )
-        if res:
-            return res
-        # Fallback to Python transaction
-        try:
-            return DatabaseManager._create_reaction_and_experiment_python(
-                teacher_id, element1_id, element2_id, product, conditions,
-                experiment_result, safety_warning, equipment_ids
-            )
-        except Exception:
-            log.exception("fallback _create_reaction_and_experiment_python failed")
-            return None
-
-    @staticmethod
-    def get_students_experiments_detailed(teacher_id: int):
-        return DatabaseManager.vw_students_experiments_for_teacher(teacher_id)
-
-    @staticmethod
-    def get_user_activity_summary():
-        try:
-            with _conn_cur() as cur:
-                cur.execute('SELECT * FROM vw_user_activity_summary ORDER BY full_name')
-                return cur.fetchall()
-        except Exception:
-            log.exception("get_user_activity_summary view failed; falling back to raw SELECT")
-            try:
-                with _conn_cur() as cur:
-                    cur.execute("""
-                        SELECT 
-                            u.user_id,
-                            (u.user_name || ' ' || u.user_surname) AS full_name,
-                            u.role,
-                            COUNT(DISTINCT uve.element_id)     AS elements_viewed,
-                            COUNT(DISTINCT uvl.equipment_id)   AS equipment_viewed,
-                            COUNT(DISTINCT upe.experiment_id)  AS experiments_participated
-                        FROM "User" u
-                        LEFT JOIN userviewselement           uve ON u.user_id = uve.user_id
-                        LEFT JOIN userviewslabequipment      uvl ON u.user_id = uvl.user_id
-                        LEFT JOIN userparticipatesinexperiment upe ON u.user_id = upe.user_id
-                        GROUP BY u.user_id, full_name, u.role
-                        ORDER BY full_name
-                    """)
-                    return cur.fetchall()
-            except Exception:
-                log.exception("get_user_activity_summary fallback failed")
-                return []
-
-    @staticmethod
-    def get_reaction_by_element_ids(e1: int, e2: int):
-        try:
-            with _conn_cur() as cur:
-                cur.execute("""
-                    SELECT r.reaction_id, r.product, r.conditions
-                    FROM reaction r
-                    WHERE (r.element1_id = %s AND r.element2_id = %s)
-                    OR (r.element1_id = %s AND r.element2_id = %s)
-                    LIMIT 1
-                """, (e1, e2, e2, e1))
-                row = cur.fetchone()
-                return dict(row) if row else None
-        except Exception:
-            log.exception("get_reaction_by_element_ids failed (%s, %s)", e1, e2)
-            return None
-
-    @staticmethod
-    def get_experiments_by_reaction(reaction_id: int, limit: int = 50):
-        try:
-            with _conn_cur() as cur:
-                cur.execute("""
-                    SELECT e.experiment_id, e.result, e.time_stamp
-                    FROM experiment e
-                    WHERE e.reaction_id = %s
-                    ORDER BY e.time_stamp DESC
-                    LIMIT %s
-                """, (reaction_id, limit))
-                return cur.fetchall()
-        except Exception:
-            log.exception("get_experiments_by_reaction failed (%s)", reaction_id)
-            return []
+        """Земи корисник по ID"""
+        try:
+            conn = psycopg2.connect(
+                host='localhost', port=9999,
+                database='db_202425z_va_prj_simlab25',
+                user='db_202425z_va_prj_simlab25_owner',
+                password='c9e5ebb7d332',
+                cursor_factory=RealDictCursor
+            )
+            cursor = conn.cursor()
+            cursor.execute('''
+                SELECT u.*, s.teacher_id
+                FROM "User" u
+                LEFT JOIN Student s ON u.user_id = s.student_id
+                WHERE u.user_id = %s
+            ''', (user_id,))
+            result = cursor.fetchone()
+            cursor.close()
+            conn.close()
+            return dict(result) if result else None
+        except Exception as e:
+            print(f"Грешка: {e}")
+            return None
+                            
