# CYBER HUB — SMK Yasmida Ambarawa (TKJ)

Portal pembelajaran **Cyber Security Fundamental** (offline-friendly).

## Struktur folder

```
./
├── index.html              # Portal utama
├── cyber-core.css          # Design system
├── cyber-core.js           # Utilitas bersama
├── sw.js                   # Service worker (cache semi-offline)
│
├── slide-asts-ganjil.html  # Classroom / slide
├── asts-ganjil.html        # Academy (belajar mandiri)
├── academy-data.js         # Loader soal Academy
├── academy-db.json         # Database Academy
│
├── quiz-asts-ganjil.html   # Quiz / ujian
├── quiz.css
├── quiz-data.js            # Loader soal Quiz
├── quiz-db.json            # Database Quiz (source of truth)
└── quiz-db-view.html       # Viewer database (guru)
```

## Menjalankan (disarankan)

Jangan double-klik file (`file://`) jika ingin JSON + service worker aktif.

```bash
cd folder-ini
python3 -m http.server 8080
```

Buka: <http://localhost:8080/index.html>

## Mode guru (kunci koreksi quiz)

PIN default (ganti segera di produksi):

```
HACKME
```

PIN **tidak disimpan plain-text** di kode. Yang tersimpan adalah hash SHA-256.  
Setelah berhasil, sesi browser menyimpan flag `sessionStorage` (tidak perlu PIN ulang di tab yang sama).

### Ganti PIN

1. Buat hash baru:
   ```bash
   printf '%s' 'PIN-BARU-ANDA' | sha256sum
   ```
2. Edit `TEACHER_PIN_HASH` di `quiz-asts-ganjil.html`.

## Topik kanonik

Field `topik` di `quiz-db.json` dan `academy-db.json` diselaraskan lewat daftar `meta.topik_kanonik` agar filter/laporan konsisten.

## Catatan

- Font Awesome & Google Fonts memakai CDN (butuh internet saat first load).
- Service worker hanya men-cache aset lokal same-origin.
- Untuk ulangan resmi: gunakan **Mode Ujian Resmi** di quiz.

## Export hasil quiz

Print · TXT · HTML · PNG · **PDF (jsPDF, lazy-load CDN)**. PDF memuat identitas, skor, rincian soal, dan tanda tangan digital bila ada.

