kode
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Simulator FTTH Pro - SMK TJKT</title>
<!-- Tailwind CSS -->
<script src="https://cdn.tailwindcss.com"></script>
<!-- Lucide Icons -->
<script src="https://unpkg.com/lucide@latest"></script>
<style>
@import url('https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@300;400;500;600;700;800&display=swap');
body {
font-family: 'Plus Jakarta Sans', sans-serif;
}
/* Efek Denyut Aliran Cahaya Laser */
@keyframes laser-flow {
to {
stroke-dashoffset: -40;
}
}
.laser-active {
stroke-dasharray: 8, 4;
animation: laser-flow 1s linear infinite;
}
/* Shimmer Effect untuk tombol aktif */
.btn-shimmer {
background-size: 200% auto;
animation: shimmer 2s linear infinite;
}
@keyframes shimmer {
0% { background-position: 0% 50%; }
50% { background-position: 100% 50%; }
100% { background-position: 0% 50%; }
}
</style>
</head>
<body class="bg-slate-50 text-slate-800 min-h-screen flex flex-col selection:bg-blue-100">
<!-- Header / Navbar Premium -->
<header class="bg-white/85 backdrop-blur-md border-b border-slate-100 sticky top-0 z-40 shadow-sm">
<div class="max-w-6xl mx-auto px-4 py-3 flex flex-wrap items-center justify-between gap-3">
<div class="flex items-center space-x-3">
<div class="p-2.5 bg-gradient-to-tr from-blue-600 to-indigo-600 text-white rounded-2xl shadow-lg shadow-blue-200">
<i data-lucide="zap" class="w-6 h-6 animate-pulse"></i>
</div>
<div>
<h1 class="font-extrabold text-xl text-slate-950 tracking-tight flex items-center gap-1.5">
SimFTTH <span class="text-xs bg-blue-100 text-blue-700 px-2 py-0.5 rounded-full font-bold">PRO v2.0</span>
</h1>
<p class="text-xs text-slate-500 font-semibold">TJKT SMK Kelas XI — Teknologi Serat Optik</p>
</div>
</div>
<!-- Tab Navigation -->
<nav class="flex space-x-1 bg-slate-100 p-1.5 rounded-xl w-full md:w-auto overflow-x-auto">
<button onclick="switchTab('belajar')" id="tab-belajar" class="tab-btn px-4 py-2.5 text-xs md:text-sm font-bold rounded-lg flex items-center gap-2 transition-all duration-300 bg-white text-blue-600 shadow-sm">
<i data-lucide="book-open" class="w-4 h-4"></i>
Belajar Alat
</button>
<button onclick="switchTab('simulator')" id="tab-simulator" class="tab-btn px-4 py-2.5 text-xs md:text-sm font-bold rounded-lg flex items-center gap-2 transition-all duration-300 text-slate-600 hover:text-slate-900">
<i data-lucide="cpu" class="w-4 h-4"></i>
Simulator Rakit
</button>
<button onclick="switchTab('kuis')" id="tab-kuis" class="tab-btn px-4 py-2.5 text-xs md:text-sm font-bold rounded-lg flex items-center gap-2 transition-all duration-300 text-slate-600 hover:text-slate-900">
<i data-lucide="award" class="w-4 h-4"></i>
Evaluasi Kuis
</button>
</nav>
</div>
</header>
<!-- Main Content Area -->
<main class="flex-grow max-w-6xl w-full mx-auto px-4 py-6">
<!-- SECTION 1: MODE BELAJAR INTERAKTIF -->
<section id="section-belajar" class="tab-content block space-y-6">
<div class="bg-gradient-to-br from-blue-600 to-indigo-700 text-white rounded-3xl p-6 md:p-8 shadow-xl shadow-blue-100 relative overflow-hidden">
<div class="absolute right-0 top-0 opacity-10 transform translate-x-12 -translate-y-12 pointer-events-none">
<i data-lucide="network" class="w-96 h-96"></i>
</div>
<div class="relative z-10 max-w-3xl space-y-3">
<span class="px-3 py-1 bg-white/20 backdrop-blur-md rounded-full text-xs font-bold tracking-wider uppercase">Dasar Kompetensi Keahlian</span>
<h2 class="text-2xl md:text-4xl font-extrabold tracking-tight">Sistem Distribusi Serat Optik (FTTH)</h2>
<p class="text-blue-100 text-sm md:text-base leading-relaxed">
Sebelum melakukan penyambungan fisik di lapangan, pahami alur distribusi cahaya laser dari Sentral Telkom (*Central Office*) hingga dikonversi menjadi jaringan internet di rumah pelanggan.
</p>
</div>
</div>
<!-- Interaktif Klik Detil Alat -->
<div class="space-y-4">
<div class="flex items-center justify-between">
<h3 class="font-extrabold text-lg text-slate-900 flex items-center gap-2">
<i data-lucide="info" class="text-blue-600"></i>
Eksplorasi Komponen Aktif & Pasif
</h3>
<span class="text-xs text-slate-500 font-semibold">Klik kartu untuk detail fungsi teknik & gambar alat</span>
</div>
<div class="grid grid-cols-1 md:grid-cols-3 gap-6">
<!-- Komponen 1: OLT -->
<div onclick="showDetailAlat('olt')" class="cursor-pointer group bg-white border border-slate-200/80 hover:border-blue-500 hover:shadow-xl hover:-translate-y-1 rounded-2xl p-5 transition-all duration-300 flex flex-col justify-between">
<div class="space-y-4">
<div class="flex justify-between items-center">
<span class="text-xs font-bold px-2.5 py-1 bg-red-50 text-red-600 rounded-lg">Level 1 - Central Office</span>
<span class="text-xs text-slate-400 font-bold">OLT</span>
</div>
<!-- Ilustrasi OLT RACK -->
<div class="w-full h-36 bg-slate-50 rounded-xl flex items-center justify-center border border-slate-100 p-2 overflow-hidden">
<svg viewBox="0 0 120 80" class="w-auto h-full text-slate-700">
<rect x="10" y="5" width="100" height="70" rx="3" fill="#1e293b" />
<!-- Card unit 1 -->
<rect x="15" y="12" width="90" height="15" rx="1" fill="#334155" />
<circle cx="23" cy="19.5" r="2" fill="#22c55e" class="animate-pulse" />
<circle cx="29" cy="19.5" r="2" fill="#eab308" />
<rect x="38" y="16" width="10" height="7" rx="0.5" fill="#0f172a" />
<rect x="52" y="16" width="10" height="7" rx="0.5" fill="#0f172a" />
<rect x="66" y="16" width="10" height="7" rx="0.5" fill="#0f172a" />
<!-- Card unit 2 (GPON ports) -->
<rect x="15" y="32" width="90" height="15" rx="1" fill="#475569" />
<circle cx="23" cy="39.5" r="2" fill="#22c55e" />
<!-- Fiber laser patch cords -->
<rect x="38" y="36" width="8" height="7" rx="0.5" fill="#1e293b" />
<rect x="48" y="36" width="8" height="7" rx="0.5" fill="#1e293b" />
<path d="M 42,39.5 Q 48,65 15,65" stroke="#ef4444" stroke-width="1.5" fill="none" />
<path d="M 52,39.5 Q 58,68 18,68" stroke="#ef4444" stroke-width="1.5" fill="none" />
<!-- Rack rails -->
<line x1="12" y1="5" x2="12" y2="75" stroke="#94a3b8" stroke-width="1.5" />
<line x1="108" y1="5" x2="108" y2="75" stroke="#94a3b8" stroke-width="1.5" />
</svg>
</div>
<div>
<h4 class="font-bold text-slate-900 text-base group-hover:text-blue-600 transition-colors">Optical Line Terminal (OLT)</h4>
<p class="text-slate-500 text-xs mt-1.5 leading-relaxed line-clamp-2">Mengubah data internet elektrik dari server menjadi gelombang cahaya laser infra merah berkecepatan tinggi.</p>
</div>
</div>
<div class="mt-4 pt-4 border-t border-slate-100 flex items-center justify-between text-xs text-blue-600 font-bold">
<span>Buka Spesifikasi Gambar & Detail</span>
<i data-lucide="arrow-right" class="w-4 h-4 group-hover:translate-x-1 transition-transform"></i>
</div>
</div>
<!-- Komponen 2: ODF -->
<div onclick="showDetailAlat('odf')" class="cursor-pointer group bg-white border border-slate-200/80 hover:border-blue-500 hover:shadow-xl hover:-translate-y-1 rounded-2xl p-5 transition-all duration-300 flex flex-col justify-between">
<div class="space-y-4">
<div class="flex justify-between items-center">
<span class="text-xs font-bold px-2.5 py-1 bg-orange-50 text-orange-600 rounded-lg">Level 2 - Ruang Transmisi</span>
<span class="text-xs text-slate-400 font-bold">ODF</span>
</div>
<!-- Ilustrasi ODF RACK -->
<div class="w-full h-36 bg-slate-50 rounded-xl flex items-center justify-center border border-slate-100 p-2 overflow-hidden">
<svg viewBox="0 0 120 80" class="w-auto h-full text-slate-700">
<rect x="15" y="5" width="90" height="70" rx="2" fill="#334155" />
<!-- Patch Panel Tray 1 -->
<rect x="20" y="12" width="80" height="12" rx="1" fill="#1e293b" />
<circle cx="25" cy="18" r="1.5" fill="#f97316" />
<circle cx="30" cy="18" r="1.5" fill="#f97316" />
<circle cx="35" cy="18" r="1.5" fill="#f97316" />
<circle cx="40" cy="18" r="1.5" fill="#f97316" />
<!-- SC Adapters Blue -->
<rect x="52" y="15" width="4" height="6" fill="#3b82f6" />
<rect x="58" y="15" width="4" height="6" fill="#3b82f6" />
<rect x="64" y="15" width="4" height="6" fill="#3b82f6" />
<rect x="70" y="15" width="4" height="6" fill="#3b82f6" />
<!-- Patch Panel Tray 2 -->
<rect x="20" y="28" width="80" height="12" rx="1" fill="#1e293b" />
<!-- Patch cord jumper fibers -->
<path d="M 54,18 Q 40,45 54,34" stroke="#eab308" stroke-width="1" fill="none" />
<path d="M 60,18 Q 44,42 60,34" stroke="#3b82f6" stroke-width="1" fill="none" />
<!-- Cable Bundles -->
<path d="M 85,18 L 85,68" stroke="#10b981" stroke-width="2" />
</svg>
</div>
<div>
<h4 class="font-bold text-slate-900 text-base group-hover:text-blue-600 transition-colors">Optical Distribution Frame</h4>
<p class="text-slate-500 text-xs mt-1.5 leading-relaxed line-clamp-2">Rak tempat terminasi kabel optik outdoor berukuran besar. Berfungsi untuk cross-connect dan patch panel.</p>
</div>
</div>
<div class="mt-4 pt-4 border-t border-slate-100 flex items-center justify-between text-xs text-blue-600 font-bold">
<span>Buka Spesifikasi Gambar & Detail</span>
<i data-lucide="arrow-right" class="w-4 h-4 group-hover:translate-x-1 transition-transform"></i>
</div>
</div>
<!-- Komponen 3: ODC -->
<div onclick="showDetailAlat('odc')" class="cursor-pointer group bg-white border border-slate-200/80 hover:border-blue-500 hover:shadow-xl hover:-translate-y-1 rounded-2xl p-5 transition-all duration-300 flex flex-col justify-between">
<div class="space-y-4">
<div class="flex justify-between items-center">
<span class="text-xs font-bold px-2.5 py-1 bg-yellow-50 text-yellow-700 rounded-lg">Level 3 - Feeder Node</span>
<span class="text-xs text-slate-400 font-bold">ODC</span>
</div>
<!-- Ilustrasi ODC CABINET -->
<div class="w-full h-36 bg-slate-50 rounded-xl flex items-center justify-center border border-slate-100 p-2 overflow-hidden">
<svg viewBox="0 0 120 80" class="w-auto h-full">
<!-- Cabinet Body grey -->
<rect x="35" y="10" width="50" height="65" rx="3" fill="#cbd5e1" stroke="#94a3b8" stroke-width="1.5" />
<line x1="60" y1="10" x2="60" y2="75" stroke="#94a3b8" stroke-width="1" />
<!-- Handle locks -->
<rect x="55" y="40" width="3" height="8" rx="0.5" fill="#475569" />
<rect x="62" y="40" width="3" height="8" rx="0.5" fill="#475569" />
<!-- Pedestal base -->
<rect x="30" y="70" width="60" height="6" fill="#475569" />
<!-- Warning logo sticker yellow -->
<polygon points="60,20 65,28 55,28" fill="#eab308" />
<circle cx="60" cy="26" r="0.5" fill="#000" />
<!-- Open door preview details inside right -->
<path d="M 60,10 L 95,15 L 95,70 L 60,75 Z" fill="#e2e8f0" stroke="#94a3b8" opacity="0.9" />
<rect x="65" y="18" width="22" height="40" fill="#1e293b" />
<!-- Splitter modules inside cabinet -->
<rect x="68" y="22" width="16" height="5" rx="0.5" fill="#f97316" />
<rect x="68" y="30" width="16" height="5" rx="0.5" fill="#3b82f6" />
<circle cx="71" cy="24.5" r="0.8" fill="#fff" />
<circle cx="75" cy="24.5" r="0.8" fill="#fff" />
<!-- colorful fiber fiber wires inside -->
<path d="M 78,24 Q 90,35 84,48" stroke="#ef4444" stroke-width="0.7" fill="none" />
<path d="M 78,32 Q 92,42 86,52" stroke="#10b981" stroke-width="0.7" fill="none" />
</svg>
</div>
<div>
<h4 class="font-bold text-slate-900 text-base group-hover:text-blue-600 transition-colors">Optical Distribution Cabinet</h4>
<p class="text-slate-500 text-xs mt-1.5 leading-relaxed line-clamp-2">Rumah kabel outdoor (kabinet pinggir jalan) tempat disimpannya Splitter Tahap Pertama (biasanya rasio 1:4 atau 1:8).</p>
</div>
</div>
<div class="mt-4 pt-4 border-t border-slate-100 flex items-center justify-between text-xs text-blue-600 font-bold">
<span>Buka Spesifikasi Gambar & Detail</span>
<i data-lucide="arrow-right" class="w-4 h-4 group-hover:translate-x-1 transition-transform"></i>
</div>
</div>
<!-- Komponen 4: ODP -->
<div onclick="showDetailAlat('odp')" class="cursor-pointer group bg-white border border-slate-200/80 hover:border-blue-500 hover:shadow-xl hover:-translate-y-1 rounded-2xl p-5 transition-all duration-300 flex flex-col justify-between">
<div class="space-y-4">
<div class="flex justify-between items-center">
<span class="text-xs font-bold px-2.5 py-1 bg-green-50 text-green-600 rounded-lg">Level 4 - Tiang Distribusi</span>
<span class="text-xs text-slate-400 font-bold">ODP</span>
</div>
<!-- Ilustrasi ODP BOX & POLE -->
<div class="w-full h-36 bg-slate-50 rounded-xl flex items-center justify-center border border-slate-100 p-2 overflow-hidden">
<svg viewBox="0 0 120 80" class="w-auto h-full">
<!-- Pole grey -->
<rect x="25" y="0" width="6" height="80" fill="#64748b" />
<rect x="24" y="25" width="8" height="2" fill="#475569" />
<rect x="24" y="55" width="8" height="2" fill="#475569" />
<!-- ODP Box black/grey -->
<rect x="40" y="15" width="35" height="45" rx="5" fill="#1e293b" stroke="#0f172a" stroke-width="1" />
<!-- Ribbed back style on ODP -->
<line x1="40" y1="25" x2="75" y2="25" stroke="#334155" />
<line x1="40" y1="35" x2="75" y2="35" stroke="#334155" />
<line x1="40" y1="45" x2="75" y2="45" stroke="#334155" />
<!-- Cable inputs glands at bottom -->
<rect x="45" y="58" width="5" height="5" fill="#475569" />
<rect x="65" y="58" width="5" height="5" fill="#475569" />
<!-- Drop core cable hanging output -->
<path d="M 47,62 Q 40,85 10,75" stroke="#334155" stroke-width="1.5" fill="none" />
<path d="M 67,62 Q 80,82 100,75" stroke="#10b981" stroke-width="1.2" fill="none" />
<!-- Brand text mock-up -->
<text x="48" y="52" fill="#94a3b8" font-size="4" font-weight="bold">ODP-PL</text>
<circle cx="58" cy="20" r="1.5" fill="#eab308" />
</svg>
</div>
<div>
<h4 class="font-bold text-slate-900 text-base group-hover:text-blue-600 transition-colors">Optical Distribution Point</h4>
<p class="text-slate-500 text-xs mt-1.5 leading-relaxed line-clamp-2">Kotak hitam kecil yang terpasang di atas tiang listrik. Berisi splitter tahap dua untuk menghubungkan kabel drop ke pelanggan.</p>
</div>
</div>
<div class="mt-4 pt-4 border-t border-slate-100 flex items-center justify-between text-xs text-blue-600 font-bold">
<span>Buka Spesifikasi Gambar & Detail</span>
<i data-lucide="arrow-right" class="w-4 h-4 group-hover:translate-x-1 transition-transform"></i>
</div>
</div>
<!-- Komponen 5: ROSET -->
<div onclick="showDetailAlat('roset')" class="cursor-pointer group bg-white border border-slate-200/80 hover:border-blue-500 hover:shadow-xl hover:-translate-y-1 rounded-2xl p-5 transition-all duration-300 flex flex-col justify-between">
<div class="space-y-4">
<div class="flex justify-between items-center">
<span class="text-xs font-bold px-2.5 py-1 bg-teal-50 text-teal-600 rounded-lg">Level 5 - Dinding Pelanggan</span>
<span class="text-xs text-slate-400 font-bold">Roset</span>
</div>
<!-- Ilustrasi ROSET OPTIK -->
<div class="w-full h-36 bg-slate-50 rounded-xl flex items-center justify-center border border-slate-100 p-2 overflow-hidden">
<svg viewBox="0 0 120 80" class="w-auto h-full">
<!-- Roset Wall Box white -->
<rect x="35" y="15" width="50" height="50" rx="4" fill="#ffffff" stroke="#cbd5e1" stroke-width="2" />
<!-- Internal coil tray circles -->
<circle cx="60" cy="40" r="15" stroke="#f1f5f9" stroke-width="2" fill="none" />
<circle cx="60" cy="40" r="10" stroke="#cbd5e1" stroke-width="1" stroke-dasharray="2 2" fill="none" />
<!-- Fiber Splice protector sleeve inside -->
<rect x="50" y="38" width="20" height="4" rx="1" fill="#475569" />
<!-- SC/UPC Blue Coupling Port -->
<rect x="73" y="47" width="10" height="12" fill="#3b82f6" />
<rect x="75" y="59" width="6" height="3" fill="#0f172a" />
<!-- Drop core input fiber -->
<path d="M 35,45 L 50,45" stroke="#64748b" stroke-width="1.5" fill="none" />
<path d="M 50,45 C 55,35 65,30 65,38" stroke="#10b981" stroke-width="1" fill="none" />
<!-- Jumper pigtail out to SC Adapter -->
<path d="M 65,38 C 65,45 70,52 75,52" stroke="#3b82f6" stroke-width="1.2" fill="none" />
</svg>
</div>
<div>
<h4 class="font-bold text-slate-900 text-base group-hover:text-blue-600 transition-colors">Roset Optik (OTP)</h4>
<p class="text-slate-500 text-xs mt-1.5 leading-relaxed line-clamp-2">Kotak terminasi akhir di dalam ruangan pelanggan tempat penyambungan fiber drop core dengan patch cord lentur.</p>
</div>
</div>
<div class="mt-4 pt-4 border-t border-slate-100 flex items-center justify-between text-xs text-blue-600 font-bold">
<span>Buka Spesifikasi Gambar & Detail</span>
<i data-lucide="arrow-right" class="w-4 h-4 group-hover:translate-x-1 transition-transform"></i>
</div>
</div>
<!-- Komponen 6: ONT -->
<div onclick="showDetailAlat('ont')" class="cursor-pointer group bg-white border border-slate-200/80 hover:border-blue-500 hover:shadow-xl hover:-translate-y-1 rounded-2xl p-5 transition-all duration-300 flex flex-col justify-between">
<div class="space-y-4">
<div class="flex justify-between items-center">
<span class="text-xs font-bold px-2.5 py-1 bg-indigo-50 text-indigo-600 rounded-lg">Level 6 - Rumah Pelanggan</span>
<span class="text-xs text-slate-400 font-bold">ONT</span>
</div>
<!-- Ilustrasi ONT/MODEM -->
<div class="w-full h-36 bg-slate-50 rounded-xl flex items-center justify-center border border-slate-100 p-2 overflow-hidden">
<svg viewBox="0 0 120 80" class="w-auto h-full">
<!-- Router Body white/silver -->
<rect x="25" y="35" width="70" height="30" rx="4" fill="#ffffff" stroke="#cbd5e1" stroke-width="1.5" />
<!-- Dual Antennas standing up -->
<line x1="35" y1="35" x2="35" y2="10" stroke="#cbd5e1" stroke-width="3" stroke-linecap="round" />
<line x1="85" y1="35" x2="85" y2="10" stroke="#cbd5e1" stroke-width="3" stroke-linecap="round" />
<!-- LED panel indicators green -->
<circle cx="35" cy="45" r="1.5" fill="#22c55e" class="animate-pulse" />
<circle cx="43" cy="45" r="1.5" fill="#22c55e" />
<circle cx="51" cy="45" r="1.5" fill="#22c55e" />
<circle cx="59" cy="45" r="1.5" fill="#eab308" />
<!-- vents decorative lines -->
<line x1="32" y1="55" x2="88" y2="55" stroke="#f1f5f9" stroke-width="2" />
<line x1="32" y1="59" x2="88" y2="59" stroke="#f1f5f9" stroke-width="2" />
<!-- Brand text -->
<text x="75" y="48" fill="#cbd5e1" font-size="4" font-weight="bold">FIBER_ONT</text>
<!-- Yellow Patch Cord connected underneath/side -->
<path d="M 68,65 Q 68,75 88,72" stroke="#eab308" stroke-width="2" fill="none" />
</svg>
</div>
<div>
<h4 class="font-bold text-slate-900 text-base group-hover:text-blue-600 transition-colors">Optical Network Terminal</h4>
<p class="text-slate-500 text-xs mt-1.5 leading-relaxed line-clamp-2">Modem akhir di rumah pelanggan yang mengubah cahaya kembali menjadi sinyal elektrik (Ethernet/Wifi) siap pakai.</p>
</div>
</div>
<div class="mt-4 pt-4 border-t border-slate-100 flex items-center justify-between text-xs text-blue-600 font-bold">
<span>Buka Spesifikasi Gambar & Detail</span>
<i data-lucide="arrow-right" class="w-4 h-4 group-hover:translate-x-1 transition-transform"></i>
</div>
</div>
</div>
</div>
<!-- Modal Pop-Up Detil Komponen Teknik -->
<div id="modal-alat" class="fixed inset-0 bg-slate-900/60 backdrop-blur-sm z-50 flex items-center justify-center hidden p-4">
<div class="bg-white rounded-3xl max-w-lg w-full p-6 shadow-2xl space-y-4 animate-in fade-in zoom-in-95 duration-200">
<div class="flex justify-between items-start">
<div id="modal-alat-tag"></div>
<button onclick="closeModalAlat()" class="p-1.5 bg-slate-100 text-slate-500 hover:bg-slate-200 rounded-full transition-colors">
<i data-lucide="x" class="w-4 h-4"></i>
</button>
</div>
<!-- Dynamic Graphic Container in Modal -->
<div id="modal-alat-graphic" class="w-full h-40 bg-slate-50 rounded-2xl flex items-center justify-center border border-slate-100 p-4">
<!-- SVG dynamically replaced by JS -->
</div>
<div class="flex items-center gap-3">
<div id="modal-alat-icon" class="w-12 h-12 rounded-2xl flex items-center justify-center text-white"></div>
<div>
<h3 id="modal-alat-title" class="font-extrabold text-lg text-slate-900"></h3>
<p id="modal-alat-sub" class="text-xs text-slate-500 font-semibold"></p>
</div>
</div>
<div class="border-y border-slate-100 py-3.5 space-y-2">
<h5 class="text-xs font-bold text-slate-400 uppercase tracking-wider">Peran & Fungsi Teknik:</h5>
<p id="modal-alat-desc" class="text-slate-600 text-xs md:text-sm leading-relaxed"></p>
</div>
<div class="space-y-2">
<h5 class="text-xs font-bold text-slate-400 uppercase tracking-wider">Parameter Standar Redaman:</h5>
<div id="modal-alat-specs" class="grid grid-cols-2 gap-2 text-xs"></div>
</div>
</div>
</div>
</section>
<!-- SECTION 2: SIMULATOR PERAKITAN FTTH PRO -->
<section id="section-simulator" class="tab-content hidden space-y-6">
<!-- Header Panel Sim Pro -->
<div class="flex flex-col md:flex-row md:items-center justify-between gap-4 bg-white p-5 rounded-3xl border border-slate-100 shadow-sm">
<div>
<h2 class="text-xl font-extrabold text-slate-950 flex items-center gap-2">
<span class="p-1.5 bg-blue-100 text-blue-700 rounded-xl"><i data-lucide="cable" class="w-5 h-5 animate-bounce"></i></span>
Splicing & Connection Workspace
</h2>
<p class="text-xs text-slate-500 mt-1">Selesaikan instalasi core fiber secara runtut untuk menyalakan internet pelanggan.</p>
</div>
<div class="flex flex-wrap items-center gap-2">
<!-- Audio Mute/Unmute -->
<button onclick="toggleAudio()" id="btn-audio" class="p-2 border border-slate-200 hover:bg-slate-50 rounded-xl text-slate-600 flex items-center justify-center" title="Beralih Suara">
<i data-lucide="volume-2" class="w-5 h-5"></i>
</button>
<!-- Reset -->
<button onclick="resetSimulator()" class="px-3.5 py-2 text-xs font-bold bg-slate-100 hover:bg-slate-200 text-slate-700 rounded-xl transition-all duration-200 inline-flex items-center gap-1.5">
<i data-lucide="rotate-ccw" class="w-4 h-4"></i> Reset Progress
</button>
<!-- Score -->
<div class="bg-gradient-to-tr from-blue-600 to-indigo-600 text-white rounded-xl px-4 py-2 flex items-center gap-2 font-bold text-xs shadow-md">
<i data-lucide="check-circle" class="w-4 h-4"></i>
PROGRES: <span id="sim-score">0</span> / 5
</div>
</div>
</div>
<!-- Petunjuk Langkah Interaktif (Banner Bergaya Pemberitahuan) -->
<div id="instruction-banner" class="bg-gradient-to-r from-amber-50 to-orange-50 border border-amber-100 text-amber-950 rounded-2xl p-5 flex items-start gap-4 shadow-sm">
<div class="p-2.5 bg-amber-500 text-white rounded-xl animate-bounce shrink-0">
<i data-lucide="lightbulb" class="w-5 h-5"></i>
</div>
<div class="space-y-1">
<h4 class="font-extrabold text-sm text-slate-950">
Langkah <span id="current-step-num">1</span> dari 5:
<span id="current-step-title" class="text-blue-700 underline font-extrabold ml-1">Pemasangan Kabel Feeder</span>
</h4>
<p id="current-step-desc" class="text-xs md:text-sm text-slate-600 leading-relaxed font-medium">
Hubungkan OLT (Sentral) ke ODC (Kabinet Distribusi) menggunakan Kabel Feeder! Klik tombol hubungkan di bawah gambar.
</p>
</div>
</div>
<!-- Visualizer Aliran Sinyal Fiber Menggunakan SVG Dinamis -->
<div class="bg-white border border-slate-100 rounded-3xl p-6 relative shadow-sm overflow-hidden min-h-[320px]">
<!-- Background Grid Modern -->
<div class="absolute inset-0 bg-[radial-gradient(#e2e8f0_1px,transparent_1px)] [background-size:16px_16px] opacity-70 pointer-events-none"></div>
<!-- SVG Aliran Sinyal (Cahaya Laser) -->
<svg class="absolute inset-0 w-full h-full pointer-events-none z-10 hidden md:block">
<!-- Path OLT -> ODC -->
<path id="path-olt-odc" d="M 125,120 L 295,120" stroke="#cbd5e1" stroke-width="4" stroke-linecap="round" fill="none" />
<!-- Path ODC -> ODP -->
<path id="path-odc-odp" d="M 335,120 L 505,120" stroke="#cbd5e1" stroke-width="4" stroke-linecap="round" fill="none" />
<!-- Path ODP -> Roset -->
<path id="path-odp-roset" d="M 545,120 L 715,120" stroke="#cbd5e1" stroke-width="4" stroke-linecap="round" fill="none" />
<!-- Path Roset -> ONT -->
<path id="path-roset-ont" d="M 755,120 L 925,120" stroke="#cbd5e1" stroke-width="4" stroke-linecap="round" fill="none" />
</svg>
<!-- Grid Komponen Jaringan -->
<div class="relative z-20 grid grid-cols-1 md:grid-cols-5 gap-8 md:gap-4 items-start pt-4">
<!-- Node 1: OLT -->
<div id="node-olt" class="sim-node flex flex-col items-center p-4 border-2 border-dashed border-blue-500 bg-blue-50/40 rounded-2xl transition-all duration-300">
<div class="relative">
<span class="absolute -top-2.5 -right-2.5 w-6 h-6 bg-red-600 text-white rounded-full flex items-center justify-center text-xs font-bold shadow-md">1</span>
<!-- OLT Graphic Node -->
<div class="w-20 h-20 bg-white border border-slate-100 rounded-2xl p-1 shadow-sm flex items-center justify-center">
<svg viewBox="0 0 100 80" class="w-full h-full text-slate-700">
<rect x="5" y="5" width="90" height="70" rx="2" fill="#1e293b" />
<rect x="10" y="15" width="80" height="10" rx="0.5" fill="#334155" />
<rect x="10" y="32" width="80" height="10" rx="0.5" fill="#334155" />
<circle cx="16" cy="20" r="1.5" fill="#22c55e" class="animate-pulse" />
<rect x="35" y="35" width="8" height="5" rx="0.5" fill="#0f172a" />
<rect x="45" y="35" width="8" height="5" rx="0.5" fill="#0f172a" />
<path d="M 39,37.5 Q 45,65 15,65" stroke="#ef4444" stroke-width="1.5" fill="none" />
</svg>
</div>
</div>
<h4 class="font-extrabold text-xs mt-3 text-slate-900">OLT (Sentral)</h4>
<p class="text-[10px] text-slate-400 font-bold mt-0.5">Laser TX: +3 dBm</p>
</div>
<!-- Node 2: ODC -->
<div id="node-odc" class="sim-node opacity-40 flex flex-col items-center p-4 border-2 border-transparent bg-slate-100 rounded-2xl transition-all duration-300">
<div class="relative">
<span class="absolute -top-2.5 -right-2.5 w-6 h-6 bg-orange-500 text-white rounded-full flex items-center justify-center text-xs font-bold shadow-md">2</span>
<!-- ODC Graphic Node -->
<div class="w-20 h-20 bg-white border border-slate-100 rounded-2xl p-1 shadow-sm flex items-center justify-center">
<svg viewBox="0 0 100 80" class="w-full h-full">
<rect x="25" y="5" width="50" height="70" rx="3" fill="#cbd5e1" stroke="#94a3b8" />
<line x1="50" y1="5" x2="50" y2="75" stroke="#94a3b8" />
<polygon points="50,15 55,23 45,23" fill="#eab308" />
</svg>
</div>
</div>
<h4 class="font-extrabold text-xs mt-3 text-slate-900">ODC (Kabinet)</h4>
<p class="text-[10px] text-slate-400 font-bold mt-0.5">Splitter 1:4</p>
</div>
<!-- Node 3: ODP -->
<div id="node-odp" class="sim-node opacity-40 flex flex-col items-center p-4 border-2 border-transparent bg-slate-100 rounded-2xl transition-all duration-300">
<div class="relative">
<span class="absolute -top-2.5 -right-2.5 w-6 h-6 bg-yellow-500 text-white rounded-full flex items-center justify-center text-xs font-bold shadow-md">3</span>
<!-- ODP Graphic Node -->
<div class="w-20 h-20 bg-white border border-slate-100 rounded-2xl p-1 shadow-sm flex items-center justify-center">
<svg viewBox="0 0 100 80" class="w-full h-full">
<rect x="15" y="0" width="4" height="80" fill="#64748b" />
<rect x="30" y="15" width="45" height="50" rx="5" fill="#1e293b" />
<circle cx="52" cy="25" r="1.5" fill="#eab308" />
<path d="M 37,55 Q 50,75 80,70" stroke="#10b981" stroke-width="1.2" fill="none" />
</svg>
</div>
</div>
<h4 class="font-extrabold text-xs mt-3 text-slate-900">ODP (Tiang)</h4>
<p class="text-[10px] text-slate-400 font-bold mt-0.5">Splitter 1:8</p>
</div>
<!-- Node 4: ROSET -->
<div id="node-roset" class="sim-node opacity-40 flex flex-col items-center p-4 border-2 border-transparent bg-slate-100 rounded-2xl transition-all duration-300">
<div class="relative">
<span class="absolute -top-2.5 -right-2.5 w-6 h-6 bg-teal-500 text-white rounded-full flex items-center justify-center text-xs font-bold shadow-md">4</span>
<!-- Roset Graphic Node -->
<div class="w-20 h-20 bg-white border border-slate-100 rounded-2xl p-1 shadow-sm flex items-center justify-center">
<svg viewBox="0 0 100 80" class="w-full h-full">
<rect x="25" y="15" width="50" height="50" rx="4" fill="#ffffff" stroke="#cbd5e1" stroke-width="2" />
<circle cx="50" cy="40" r="12" stroke="#f1f5f9" stroke-width="1.5" fill="none" />
<rect x="63" y="45" width="8" height="10" fill="#3b82f6" />
</svg>
</div>
</div>
<h4 class="font-extrabold text-xs mt-3 text-slate-900">Roset Dinding</h4>
<p class="text-[10px] text-slate-400 font-bold mt-0.5">Terminasi OTP</p>
</div>
<!-- Node 5: ONT (Modem) -->
<div id="node-ont" class="sim-node opacity-40 flex flex-col items-center p-4 border-2 border-transparent bg-slate-100 rounded-2xl transition-all duration-300">
<div class="relative">
<span class="absolute -top-2.5 -right-2.5 w-6 h-6 bg-indigo-500 text-white rounded-full flex items-center justify-center text-xs font-bold shadow-md">5</span>
<!-- ONT Graphic Node -->
<div class="w-20 h-20 bg-white border border-slate-100 rounded-2xl p-1 shadow-sm flex items-center justify-center">
<svg viewBox="0 0 100 80" class="w-full h-full">
<rect x="15" y="30" width="70" height="30" rx="3" fill="#ffffff" stroke="#cbd5e1" stroke-width="1.5" />
<line x1="25" y1="30" x2="25" y2="10" stroke="#cbd5e1" stroke-width="3" stroke-linecap="round" />
<line x1="75" y1="30" x2="75" y2="10" stroke="#cbd5e1" stroke-width="3" stroke-linecap="round" />
<circle cx="25" cy="40" r="1.5" fill="#22c55e" class="animate-pulse" />
<circle cx="33" cy="40" r="1.5" fill="#22c55e" />
</svg>
</div>
</div>
<h4 class="font-extrabold text-xs mt-3 text-slate-900">ONT (Modem)</h4>
<p id="txt-rx-power" class="text-[10px] text-slate-400 font-bold mt-0.5">RX Power: -- dBm</p>
</div>
</div>
<!-- Panel Informasi Alat Ukur OPM & Redaman -->
<div class="mt-8 pt-6 border-t border-slate-100 grid grid-cols-1 sm:grid-cols-3 gap-4">
<div class="bg-blue-50/50 rounded-2xl p-4 border border-blue-100 flex items-center gap-3">
<div class="p-2.5 bg-blue-100 text-blue-700 rounded-xl">
<i data-lucide="activity" class="w-5 h-5"></i>
</div>
<div>
<span class="block text-[10px] text-slate-400 font-bold uppercase">Hasil Splicing Loss</span>
<span id="txt-splicing-loss" class="text-sm font-extrabold text-slate-900">-- dB (Belum di-Splice)</span>
</div>
</div>
<div class="bg-indigo-50/50 rounded-2xl p-4 border border-indigo-100 flex items-center gap-3">
<div class="p-2.5 bg-indigo-100 text-indigo-700 rounded-xl">
<i data-lucide="calculator" class="w-5 h-5"></i>
</div>
<div>
<span class="block text-[10px] text-slate-400 font-bold uppercase">Total Redaman Link</span>
<span id="txt-total-loss" class="text-sm font-extrabold text-slate-900">-- dB</span>
</div>
</div>
<div class="bg-emerald-50/50 rounded-2xl p-4 border border-emerald-100 flex items-center gap-3">
<div class="p-2.5 bg-emerald-100 text-emerald-700 rounded-xl">
<i data-lucide="shield-check" class="w-5 h-5"></i>
</div>
<div>
<span class="block text-[10px] text-slate-400 font-bold uppercase">Status Sinyal Laser</span>
<span id="txt-laser-status" class="text-sm font-extrabold text-emerald-700">Offline / Gelap</span>
</div>
</div>
</div>
</div>
<!-- MODAL MINI GAME: FUSION SPLICER JIG -->
<div id="modal-splicer" class="fixed inset-0 bg-slate-900/70 backdrop-blur-md z-50 flex items-center justify-center hidden p-4">
<div class="bg-white rounded-3xl max-w-lg w-full p-6 shadow-2xl space-y-6 animate-in zoom-in-95 duration-200">
<div class="flex justify-between items-center">
<span class="px-3 py-1 bg-blue-100 text-blue-700 rounded-full text-xs font-bold flex items-center gap-1.5">
<i data-lucide="cpu" class="w-3.5 h-3.5 animate-spin"></i> Splicing Mode Active
</span>
<h3 class="font-extrabold text-slate-950 text-base">FIBER CORE ALIGNMENT</h3>
</div>
<p class="text-xs text-slate-500 leading-relaxed">
Geser tombol slider di bawah untuk menyelaraskan core serat optik kiri dan kanan hingga sejajar sempurna! Core yang tidak selaras akan menyebabkan redaman tinggi (*loss* besar).
</p>
<!-- Area Kamera Monitor Splicer -->
<div class="bg-slate-950 p-4 rounded-2xl border border-slate-800 space-y-3 relative overflow-hidden">
<div class="absolute top-2 left-2 text-[10px] font-mono text-emerald-400 animate-pulse flex items-center gap-1">
<span class="w-1.5 h-1.5 bg-emerald-500 rounded-full"></span> CAM X & Y (100x)
</div>
<!-- Visualisasi Sumbu Alignment -->
<div class="h-32 bg-slate-900 rounded-xl relative flex items-center justify-center overflow-hidden border border-slate-800">
<!-- Kiri Core -->
<div class="absolute left-0 w-24 h-4 bg-amber-500/80 rounded-r flex items-center justify-end">
<div class="w-full h-1 bg-white"></div> <!-- Core Inti -->
</div>
<!-- Kanan Core (Yang Bisa Digerakkan) -->
<div id="movable-core" class="absolute left-28 w-24 h-4 bg-amber-500/80 rounded-l flex items-center transition-all duration-150" style="transform: translateY(-15px);">
<div class="w-full h-1 bg-white"></div> <!-- Core Inti -->
</div>
<!-- Target Center Guide Line -->
<div class="absolute inset-x-0 h-0.5 border-t border-dashed border-emerald-500/50 pointer-events-none"></div>
</div>
<!-- Panel Parameter Splicer Real-time -->
<div class="flex justify-between text-[11px] font-mono text-emerald-400/90">
<span>SPLICING LOSS: <span id="val-splice-loss" class="font-extrabold text-white text-xs">0.45</span> dB</span>
<span>OFFSET: <span id="val-offset" class="font-extrabold text-white text-xs">3.2</span> µm</span>
</div>
</div>
<!-- Slider Control -->
<div class="space-y-2">
<label class="text-xs font-bold text-slate-700 flex justify-between">
<span>Mikro Alignment Motor (Penyelarasan Core):</span>
<span class="text-blue-600 font-extrabold">Geser ke Tengah</span>
</label>
<input type="range" min="-25" max="25" value="-15" class="w-full h-2 bg-slate-100 rounded-lg appearance-none cursor-pointer accent-blue-600" id="slider-alignment" oninput="onAlignCore(this.value)">
</div>
<!-- Tombol Kerjakan Splicing -->
<div class="flex gap-2">
<button onclick="executeSplicing()" class="flex-1 py-3 bg-blue-600 hover:bg-blue-700 text-white font-bold rounded-xl shadow-lg shadow-blue-100 transition-colors text-xs md:text-sm">
Splicing & Arc Discharge
</button>
</div>
</div>
</div>
<!-- Panel Tombol Kabel & Connection Controller -->
<div class="bg-white border border-slate-100 rounded-3xl p-5 shadow-sm">
<h3 class="font-extrabold text-slate-900 mb-4 flex items-center gap-2 text-sm md:text-base">
<i data-lucide="link-2" class="text-blue-600"></i>
Kotak Pilihan Kabel & Daya Optik
</h3>
<div class="grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 gap-3">
<!-- Kabel A -->
<button onclick="pilihKabel('feeder')" id="btn-kabel-feeder" class="cable-btn p-4 border border-slate-200/80 hover:border-blue-500 hover:bg-blue-50/20 rounded-2xl flex items-center gap-3.5 transition-all duration-300 text-left">
<div class="p-3 bg-red-50 text-red-600 rounded-xl">
<i data-lucide="chevrons-right" class="w-5 h-5"></i>
</div>
<div>
<span class="block text-[10px] text-slate-400 font-bold uppercase tracking-wider">KABEL A</span>
<span class="block font-bold text-slate-900 text-sm">Kabel Feeder (G.652)</span>
<span class="block text-xs text-slate-500">Core besar dari Sentral OLT</span>
</div>
</button>
<!-- Splicer Mode Trigger -->
<button onclick="pilihKabel('distribusi')" id="btn-kabel-distribusi" class="cable-btn p-4 border border-slate-200/80 hover:border-orange-500 hover:bg-orange-50/20 rounded-2xl flex items-center gap-3.5 transition-all duration-300 text-left">
<div class="p-3 bg-orange-50 text-orange-600 rounded-xl">
<i data-lucide="git-branch" class="w-5 h-5"></i>
</div>
<div>
<span class="block text-[10px] text-slate-400 font-bold uppercase tracking-wider">KABEL B</span>
<span class="block font-bold text-slate-900 text-sm">Kabel Distribusi</span>
<span class="block text-xs text-slate-500">Koneksi ODC ke Tiang ODP</span>
</div>
</button>
<!-- Kabel C -->
<button onclick="pilihKabel('dropcore')" id="btn-kabel-dropcore" class="cable-btn p-4 border border-slate-200/80 hover:border-yellow-500 hover:bg-yellow-50/20 rounded-2xl flex items-center gap-3.5 transition-all duration-300 text-left">
<div class="p-3 bg-yellow-50 text-yellow-600 rounded-xl">
<i data-lucide="trending-down" class="w-5 h-5"></i>
</div>
<div>
<span class="block text-[10px] text-slate-400 font-bold uppercase tracking-wider">KABEL C</span>
<span class="block font-bold text-slate-900 text-sm">Drop Core (G.657.A)</span>
<span class="block text-xs text-slate-500">Kabel tahan lekukan ke rumah</span>
</div>
</button>
<!-- Kabel D -->
<button onclick="pilihKabel('patchcord')" id="btn-kabel-patchcord" class="cable-btn p-4 border border-slate-200/80 hover:border-green-500 hover:bg-green-50/20 rounded-2xl flex items-center gap-3.5 transition-all duration-300 text-left">
<div class="p-3 bg-green-50 text-green-600 rounded-xl">
<i data-lucide="cable" class="w-5 h-5"></i>
</div>
<div>
<span class="block text-[10px] text-slate-400 font-bold uppercase tracking-wider">KABEL D</span>
<span class="block font-bold text-slate-900 text-sm">Patch Cord SC/UPC</span>
<span class="block text-xs text-slate-500">Kabel lentur biru/kuning</span>
</div>
</button>
<!-- Alat Tester Daya -->
<button onclick="pilihKabel('tester')" id="btn-kabel-tester" class="cable-btn p-4 border border-slate-200/80 hover:border-indigo-500 hover:bg-indigo-50/20 rounded-2xl flex items-center gap-3.5 transition-all duration-300 text-left">
<div class="p-3 bg-indigo-50 text-indigo-600 rounded-xl">
<i data-lucide="zap" class="w-5 h-5"></i>
</div>
<div>
<span class="block text-[10px] text-slate-400 font-bold uppercase tracking-wider">OPM TEST</span>
<span class="block font-bold text-slate-900 text-sm">Power & Light Activation</span>
<span class="block text-xs text-slate-500">Nyalakan laser untuk tes rugi-rugi</span>
</div>
</button>
<!-- Reset Manual Action -->
<button onclick="resetSimulator()" class="p-4 border border-dashed border-red-200 hover:border-red-500 hover:bg-red-50/30 rounded-2xl flex items-center justify-center gap-3 transition-all duration-300 text-left">
<i data-lucide="refresh-cw" class="w-6 h-6 text-red-500"></i>
<div>
<span class="block font-bold text-red-600 text-sm">Hapus Semua Sambungan</span>
<span class="block text-xs text-slate-400">Kembalikan ke status awal</span>
</div>
</button>
</div>
</div>
<!-- Log Konsol Aktivitas Serat Optik -->
<div class="bg-slate-900 text-slate-300 p-5 rounded-3xl font-mono text-xs md:text-sm space-y-2.5 shadow-inner">
<div class="text-blue-400 font-bold border-b border-slate-800 pb-2.5 flex justify-between items-center">
<span class="flex items-center gap-2"><span class="w-2.5 h-2.5 bg-green-500 rounded-full animate-ping"></span> LOG MONITOR FIBER OPTIK</span>
<span class="text-[10px] text-slate-500">SMK TJKT WORKSTATION</span>
</div>
<div class="max-h-[150px] overflow-y-auto space-y-1.5" id="log-container">
<p class="text-slate-500">[System]: Konsol diaktifkan. Harap pasang Kabel Feeder sebagai langkah awal.</p>
</div>
</div>
</section>
<!-- SECTION 3: KUIS EVALUASI & SERTIFIKAT KELULUSAN -->
<section id="section-kuis" class="tab-content hidden space-y-6">
<div class="bg-white border border-slate-100 rounded-3xl p-6 md:p-8 shadow-sm space-y-6">
<div class="flex flex-col md:flex-row md:items-center justify-between gap-4">
<div>
<h2 class="text-2xl font-extrabold text-slate-950 flex items-center gap-2">
<span class="p-1.5 bg-yellow-100 text-yellow-700 rounded-xl"><i data-lucide="award" class="w-6 h-6"></i></span>
Evaluasi Kompetensi Teoretis FTTH
</h2>
<p class="text-xs text-slate-500 mt-1">Selesaikan kuis untuk mengukur pemahaman teori redaman dan fungsi link.</p>
</div>
<div class="bg-yellow-50 border border-yellow-100 text-yellow-800 rounded-2xl px-5 py-3 flex items-center gap-2 font-bold text-sm shrink-0">
Skor Ujian: <span id="quiz-score" class="text-lg text-yellow-950 font-black">0</span>%
</div>
</div>
<!-- Progress Bar Kuis -->
<div class="w-full bg-slate-100 h-2.5 rounded-full overflow-hidden">
<div id="quiz-progress" class="bg-yellow-500 h-2.5 rounded-full w-0 transition-all duration-300"></div>
</div>
<!-- Box Soal -->
<div id="quiz-box" class="space-y-6"></div>
<!-- Hasil Akhir & Sertifikat Digital (Sangat Menarik!) -->
<div id="quiz-result" class="hidden space-y-6">
<div class="bg-emerald-50 border border-emerald-100 rounded-2xl p-6 text-center space-y-4">
<div class="w-16 h-16 bg-emerald-100 text-emerald-600 rounded-full flex items-center justify-center mx-auto">
<i data-lucide="party-popper" class="w-10 h-10 animate-bounce"></i>
</div>
<div>
<h3 class="text-xl font-extrabold text-slate-950">Luar Biasa, Anda Berhasil Lulus!</h3>
<p class="text-slate-600 text-xs md:text-sm mt-1">Anda terbukti menguasai dasar perancangan link jaringan serat optik FTTH.</p>
</div>
</div>
<!-- SERTIFIKAT PRINTABLE INTERAKTIF -->
<div class="bg-white border-8 border-double border-indigo-100 rounded-2xl p-6 md:p-10 relative overflow-hidden text-center space-y-6 shadow-md max-w-2xl mx-auto">
<!-- Ornamen Sertifikat -->
<div class="absolute -top-12 -left-12 w-24 h-24 bg-indigo-50 rounded-full opacity-50"></div>
<div class="absolute -bottom-12 -right-12 w-24 h-24 bg-indigo-50 rounded-full opacity-50"></div>
<div class="space-y-2">
<span class="text-xs font-bold text-indigo-600 tracking-widest uppercase block">Sertifikat Kelulusan Belajar Mandiri</span>
<h4 class="text-2xl font-black text-slate-900 uppercase">Jaringan Komputer dan Telekomunikasi</h4>
<p class="text-xs text-slate-400">Sertifikat ini secara sah diberikan kepada siswa berprestasi:</p>
</div>
<!-- Form Nama Siswa -->
<div class="max-w-xs mx-auto border-b-2 border-slate-800 py-2">
<input type="text" id="cert-name" value="Siswa XI TJKT" class="text-center font-extrabold text-xl text-slate-950 w-full focus:outline-none bg-transparent" placeholder="Ketik Nama Anda Di Sini">
</div>
<div class="max-w-md mx-auto">
<p class="text-xs md:text-sm text-slate-600 leading-relaxed font-medium">
Dinyatakan **LULUS** pada modul simulasi instalasi & analisis redaman jaringan FTTH (*Fiber To The Home*) dengan nilai ujian teori sebesar <span id="cert-score" class="font-bold text-indigo-600 text-base">100%</span>.
</p>
</div>
<!-- Tanda Tangan Virtual -->
<div class="flex justify-between items-end pt-6 text-left max-w-sm mx-auto text-xs">
<div>
<p class="text-slate-400">Pembimbing TJKT,</p>
<div class="h-8"></div>
<p class="font-bold text-slate-800">Sistem Guru Virtual</p>
</div>
<div class="text-right">
<p class="text-slate-400">Tanggal Selesai,</p>
<p id="cert-date" class="font-bold text-slate-800">10 Juli 2026</p>
</div>
</div>
<!-- Instruksi Ambil Gambar -->
<p class="text-[10px] text-slate-400">Silakan cetak halaman ini (Ctrl + P) untuk mendapatkan salinan sertifikat Anda.</p>
</div>
<div class="text-center">
<button onclick="restartQuiz()" class="px-5 py-2.5 bg-slate-900 hover:bg-slate-800 text-white font-semibold text-xs rounded-xl transition-colors">
Coba Evaluasi Ulang
</button>
</div>
</div>
</div>
</section>
</main>
<!-- Footer -->
<footer class="bg-white border-t border-slate-100 py-6 mt-auto">
<div class="max-w-6xl mx-auto px-4 text-center space-y-2">
<p class="text-xs md:text-sm text-slate-500 font-bold">Bahan Ajar TJKT SMK Kelas XI - FTTH Simulator v2.0</p>
<p class="text-[10px] text-slate-400">Dirancang khusus untuk pembelajaran interaktif berbasis web mobile-first dengan simulasi splicer.</p>
</div>
</footer>
<!-- Script Logika Aplikasi -->
<script>
// Inisialisasi ikon Lucide
lucide.createIcons();
// --- SISTEM EFEK SUARA SINTETIS (Web Audio API) ---
let audioEnabled = true;
let audioCtx = null;
function initAudio() {
if (!audioCtx) {
audioCtx = new (window.AudioContext || window.webkitAudioContext)();
}
}
function playSound(type) {
if (!audioEnabled) return;
initAudio();
if (!audioCtx) return;
const osc = audioCtx.createOscillator();
const gain = audioCtx.createGain();
osc.connect(gain);
gain.connect(audioCtx.destination);
if (type === 'click') {
osc.type = 'sine';
osc.frequency.setValueAtTime(800, audioCtx.currentTime);
gain.gain.setValueAtTime(0.1, audioCtx.currentTime);
gain.gain.exponentialRampToValueAtTime(0.01, audioCtx.currentTime + 0.1);
osc.start();
osc.stop(audioCtx.currentTime + 0.1);
} else if (type === 'success') {
// Chord C Mayor C5-E5-G5
osc.type = 'triangle';
osc.frequency.setValueAtTime(523.25, audioCtx.currentTime); // C5
osc.frequency.setValueAtTime(659.25, audioCtx.currentTime + 0.1); // E5
osc.frequency.setValueAtTime(783.99, audioCtx.currentTime + 0.2); // G5
gain.gain.setValueAtTime(0.15, audioCtx.currentTime);
gain.gain.exponentialRampToValueAtTime(0.01, audioCtx.currentTime + 0.4);
osc.start();
osc.stop(audioCtx.currentTime + 0.4);
} else if (type === 'error') {
// Low Buzz
osc.type = 'sawtooth';
osc.frequency.setValueAtTime(120, audioCtx.currentTime);
gain.gain.setValueAtTime(0.15, audioCtx.currentTime);
gain.gain.exponentialRampToValueAtTime(0.01, audioCtx.currentTime + 0.3);
osc.start();
osc.stop(audioCtx.currentTime + 0.3);
} else if (type === 'splicing') {
// Suara mesin laser / busur
osc.type = 'sawtooth';
osc.frequency.setValueAtTime(200, audioCtx.currentTime);
osc.frequency.linearRampToValueAtTime(1200, audioCtx.currentTime + 0.5);
gain.gain.setValueAtTime(0.05, audioCtx.currentTime);
gain.gain.exponentialRampToValueAtTime(0.01, audioCtx.currentTime + 0.6);
osc.start();
osc.stop(audioCtx.currentTime + 0.6);
} else if (type === 'activation') {
// Hum laser aktif
osc.type = 'sine';
osc.frequency.setValueAtTime(440, audioCtx.currentTime);
gain.gain.setValueAtTime(0.1, audioCtx.currentTime);
gain.gain.linearRampToValueAtTime(0.02, audioCtx.currentTime + 1.0);
osc.start();
osc.stop(audioCtx.currentTime + 1.2);
}
}
function toggleAudio() {
audioEnabled = !audioEnabled;
const btn = document.getElementById('btn-audio');
if (audioEnabled) {
btn.innerHTML = `<i data-lucide="volume-2" class="w-5 h-5"></i>`;
btn.className = "p-2 border border-slate-200 hover:bg-slate-50 rounded-xl text-slate-600 flex items-center justify-center";
} else {
btn.innerHTML = `<i data-lucide="volume-x" class="w-5 h-5"></i>`;
btn.className = "p-2 border border-red-200 bg-red-50 rounded-xl text-red-600 flex items-center justify-center";
}
lucide.createIcons();
}
// --- STATE SIMULATOR ---
let currentStep = 1;
const maxStep = 5;
let scoreSim = 0;
let activeAlignVal = -15; // Nilai alignment awal mini-game
let finalSpliceLoss = 0.45; // Nilai loss awal sebelum displicing
// Parameter Standar Redaman FTTH Pro
const standardLoss = {
feeder: 0.5, // Loss kabel feeder (dB)
splitterOdc: 6.5, // Splitter 1:4 (dB)
splitterOdp: 10.5, // Splitter 1:8 (dB)
dropcore: 0.4, // Kabel drop core (dB)
connectors: 1.2, // 4 buah connector @0.3dB
patchcord: 0.2 // Patch cord (dB)
};
const steps = {
1: {
title: "Pemasangan Kabel Feeder",
desc: "Hubungkan OLT (Sentral) ke ODC (Kabinet Distribusi) menggunakan Kabel Feeder! Kabel feeder berfungsi mengalirkan gelombang cahaya utama dari server CO.",
correctCable: "feeder",
connectNode: "odc",
pathId: "path-olt-odc",
logMsg: "Koneksi kabel feeder selesai dari OLT ke ODC. Sinyal optik siap diteruskan."
},
2: {
title: "Splicing Kabel Distribusi di ODC",
desc: "Gunakan kabel distribusi untuk menyambung ODC ke ODP. Tahap ini memerlukan penyelarasan core serat optik (*core alignment*) menggunakan Fusion Splicer agar loss sambungan minimal!",
correctCable: "distribusi",
connectNode: "odp",
pathId: "path-odc-odp",
logMsg: "Splicing di ODC selesai. Kabel Distribusi sukses mentransmisikan sinyal ke tiang ODP."
},
3: {
title: "Menarik Kabel Drop Core Pelanggan",
desc: "Pasang kabel Drop Core dari tiang ODP ke Roset dinding rumah pelanggan. Kabel drop core memiliki bahan kawat baja pelindung ekstra kuat.",
correctCable: "dropcore",
connectNode: "roset",
pathId: "path-odp-roset",
logMsg: "Kabel drop core berhasil ditarik dan dipasang secara rapi ke Roset dinding."
},
4: {
title: "Menyambung Patch Cord ke ONT",
desc: "Sambungkan Roset ke perangkat ONT (Modem) menggunakan Patch Cord SC/UPC berwarna kuning lentur. Pastikan konektor terpasang dengan erat.",
correctCable: "patchcord",
connectNode: "ont",
pathId: "path-roset-ont",
logMsg: "Patch cord terkoneksi secara solid ke port PON pada ONT pelanggan."
},
5: {
title: "Aktivasi Laser & Pengujian Redaman",
desc: "Nyalakan daya optik dari Sentral OLT untuk menguji stabilitas daya terima (RX Power) di ONT pelanggan menggunakan Optical Power Meter!",
correctCable: "tester",
connectNode: "test",
pathId: "path-roset-ont",
logMsg: "Daya optik diaktifkan. Melakukan penghitungan redaman komparatif..."
}
};
// Switch Tab Page
function switchTab(tabId) {
playSound('click');
document.querySelectorAll('.tab-content').forEach(section => {
section.classList.add('hidden');
section.classList.remove('block');
});
const targetSection = document.getElementById(`section-${tabId}`);
targetSection.classList.remove('hidden');
targetSection.classList.add('block');
document.querySelectorAll('.tab-btn').forEach(btn => {
btn.classList.remove('bg-white', 'text-blue-600', 'shadow-sm');
btn.classList.add('text-slate-600', 'hover:text-slate-900');
});
const activeBtn = document.getElementById(`tab-${tabId}`);
activeBtn.classList.remove('text-slate-600', 'hover:text-slate-900');
activeBtn.classList.add('bg-white', 'text-blue-600', 'shadow-sm');
}
// Jalankan Log Simulator
function addLog(text, type = "normal") {
const container = document.getElementById('log-container');
const p = document.createElement('p');
if (type === "success") {
p.className = "text-emerald-400";
} else if (type === "error") {
p.className = "text-rose-400";
} else {
p.className = "text-slate-300";
}
p.innerHTML = `[${new Date().toLocaleTimeString()}]: ${text}`;
container.appendChild(p);
container.scrollTop = container.scrollHeight;
}
// --- ALIGNMENT MINI-GAME LOGIC ---
function onAlignCore(val) {
activeAlignVal = parseInt(val);
const movable = document.getElementById('movable-core');
movable.style.transform = `translateY(${activeAlignVal}px)`;
// Hitung rugi sambungan (Loss) berdasarkan deviasi sumbu core (0 adalah sempurna)
const deviation = Math.abs(activeAlignVal);
finalSpliceLoss = 0.01 + (deviation * 0.03); // Min 0.01 dB, meningkat 0.03 dB tiap deviasi
document.getElementById('val-splice-loss').innerText = finalSpliceLoss.toFixed(2);
document.getElementById('val-offset').innerText = (deviation * 0.25).toFixed(1);
}
function executeSplicing() {
playSound('splicing');
addLog(`Arc discharge dilepaskan. Serat kaca disatukan dengan rugi sambungan: ${finalSpliceLoss.toFixed(2)} dB.`, "success");
// Tutup modal splicer dan selesaikan step simulator
document.getElementById('modal-splicer').classList.add('hidden');
completeStepSuccess();
}
// Jalankan Pilihan Kabel
function pilihKabel(tipeKabel) {
if (currentStep > maxStep) {
playSound('error');
addLog("Semua langkah perakitan selesai! Silakan reset untuk mencoba lagi.", "error");
return;
}
const stepInfo = steps[currentStep];
if (tipeKabel === stepInfo.correctCable) {
// Spesifik untuk tahap 2 yang butuh splicer
if (currentStep === 2) {
playSound('click');
// Tampilkan Mini Game Splicer
document.getElementById('modal-splicer').classList.remove('hidden');
onAlignCore(-15); // reset slider
document.getElementById('slider-alignment').value = -15;
return;
}
playSound('success');
completeStepSuccess();
} else {
playSound('error');
addLog(`Salah memilih kabel! Langkah ini membutuhkan kabel tipe: ${stepInfo.correctCable.toUpperCase()}.`, "error");
}
}
// Lakukan Penyelesaian Langkah Sukses
function completeStepSuccess() {
const stepInfo = steps[currentStep];
scoreSim++;
document.getElementById('sim-score').innerText = scoreSim;
// Warnai Node Visualizer
const nodeElement = document.getElementById(`node-${stepInfo.connectNode}`);
nodeElement.classList.remove('opacity-40');
nodeElement.classList.add('border-blue-500', 'bg-blue-50/20');
// Aktifkan Aliran Cahaya SVG Path
const pathSvg = document.getElementById(stepInfo.pathId);
if (pathSvg) {
// Atur warna laser menyala
if (stepInfo.correctCable === 'feeder') pathSvg.setAttribute('stroke', '#ef4444');
if (stepInfo.correctCable === 'distribusi') pathSvg.setAttribute('stroke', '#f97316');
if (stepInfo.correctCable === 'dropcore') pathSvg.setAttribute('stroke', '#eab308');
if (stepInfo.correctCable === 'patchcord') pathSvg.setAttribute('stroke', '#10b981');
pathSvg.classList.add('laser-active');
}
addLog(stepInfo.logMsg, "success");
// Update parameters redaman secara bertahap
updateRedamanParameters();
currentStep++;
if (currentStep <= maxStep) {
updateSimulatorStep();
} else {
// Semua langkah sukses
playSound('activation');
// Nyalakan ONT & OPM Tester
document.getElementById('instruction-banner').className = "bg-gradient-to-r from-emerald-50 to-green-50 border border-emerald-100 text-emerald-950 rounded-2xl p-5 flex items-start gap-4 shadow-sm";
document.getElementById('instruction-banner').innerHTML = `
<div class="p-2.5 bg-emerald-500 text-white rounded-xl shrink-0">
<i data-lucide="shield-check" class="w-5 h-5"></i>
</div>
<div>
<h4 class="font-extrabold text-sm text-emerald-900">Perakitan Selesai! Link Jaringan FTTH Aktif</h4>
<p class="text-xs md:text-sm text-emerald-800 mt-1">
Sinyal optik OLT telah didistribusikan sempurna hingga ke modem ONT pelanggan. Selamat, pekerjaan Anda dinilai sangat profesional!
</p>
</div>
`;
// Update Status OPM Terakhir
document.getElementById('txt-laser-status').innerText = "Online (Daya Optik Stabil)";
document.getElementById('txt-laser-status').className = "text-sm font-extrabold text-emerald-600";
lucide.createIcons();
}
}
// Kalkulasi Redaman Optik Real-time
function updateRedamanParameters() {
if (scoreSim >= 1) {
document.getElementById('txt-total-loss').innerText = `${standardLoss.feeder} dB`;
}
if (scoreSim >= 2) {
const total = standardLoss.feeder + standardLoss.splitterOdc + finalSpliceLoss;
document.getElementById('txt-splicing-loss').innerText = `${finalSpliceLoss.toFixed(2)} dB`;
document.getElementById('txt-total-loss').innerText = `${total.toFixed(2)} dB`;
}
if (scoreSim >= 3) {
const total = standardLoss.feeder + standardLoss.splitterOdc + finalSpliceLoss + standardLoss.splitterOdp + standardLoss.dropcore;
document.getElementById('txt-total-loss').innerText = `${total.toFixed(2)} dB`;
}
if (scoreSim >= 4) {
const total = standardLoss.feeder + standardLoss.splitterOdc + finalSpliceLoss + standardLoss.splitterOdp + standardLoss.dropcore + standardLoss.patchcord + standardLoss.connectors;
document.getElementById('txt-total-loss').innerText = `${total.toFixed(2)} dB`;
}
if (scoreSim >= 5) {
const totalLoss = standardLoss.feeder + standardLoss.splitterOdc + finalSpliceLoss + standardLoss.splitterOdp + standardLoss.dropcore + standardLoss.patchcord + standardLoss.connectors;
// OLT Power output standard is +3.0 dBm
const rxPower = 3.0 - totalLoss;
document.getElementById('txt-rx-power').innerText = `RX Power: ${rxPower.toFixed(2)} dBm`;
// Beri warna sesuai rentang ideal (-15 dBm s.d -25 dBm)
if (rxPower >= -25 && rxPower <= -15) {
document.getElementById('txt-rx-power').className = "text-[10px] text-emerald-500 font-extrabold mt-0.5";
} else {
document.getElementById('txt-rx-power').className = "text-[10px] text-red-500 font-extrabold mt-0.5";
}
}
}
// Perbarui Instruksi UI
function updateSimulatorStep() {
const stepInfo = steps[currentStep];
document.getElementById('current-step-num').innerText = currentStep;
document.getElementById('current-step-title').innerText = stepInfo.title;
document.getElementById('current-step-desc').innerText = stepInfo.desc;
}
// Reset Simulator
function resetSimulator() {
playSound('click');
currentStep = 1;
scoreSim = 0;
finalSpliceLoss = 0.45;
document.getElementById('sim-score').innerText = scoreSim;
// Reset OPM meter
document.getElementById('txt-splicing-loss').innerText = "-- dB (Belum di-Splice)";
document.getElementById('txt-total-loss').innerText = "-- dB";
document.getElementById('txt-laser-status').innerText = "Offline / Gelap";
document.getElementById('txt-laser-status').className = "text-sm font-extrabold text-slate-500";
document.getElementById('txt-rx-power').innerText = "RX Power: -- dBm";
document.getElementById('txt-rx-power').className = "text-[10px] text-slate-400 font-bold mt-0.5";
// Atur kembali kelas CSS node
document.querySelectorAll('.sim-node').forEach((node, index) => {
if (index > 0) {
node.classList.add('opacity-40');
node.classList.remove('border-blue-500', 'bg-blue-50/20');
}
});
// Matikan SVG Path laser
const paths = ['path-olt-odc', 'path-odc-odp', 'path-odp-roset', 'path-roset-ont'];
paths.forEach(p => {
const el = document.getElementById(p);
if (el) {
el.setAttribute('stroke', '#cbd5e1');
el.classList.remove('laser-active');
}
});
// Reset Banner
document.getElementById('instruction-banner').className = "bg-gradient-to-r from-amber-50 to-orange-50 border border-amber-100 text-amber-950 rounded-2xl p-5 flex items-start gap-4 shadow-sm";
document.getElementById('instruction-banner').innerHTML = `
<div class="p-2.5 bg-amber-500 text-white rounded-xl animate-bounce shrink-0">
<i data-lucide="lightbulb" class="w-5 h-5"></i>
</div>
<div class="space-y-1">
<h4 class="font-extrabold text-sm text-slate-950">
Langkah <span id="current-step-num">1</span> dari 5:
<span id="current-step-title" class="text-blue-700 underline font-extrabold ml-1">Pemasangan Kabel Feeder</span>
</h4>
<p id="current-step-desc" class="text-xs md:text-sm text-slate-600 leading-relaxed font-medium">
Hubungkan OLT (Sentral) ke ODC (Kabinet Distribusi) menggunakan Kabel Feeder! Kabel feeder berfungsi mengalirkan gelombang cahaya utama dari server CO.
</p>
</div>
`;
// Reset Log
document.getElementById('log-container').innerHTML = `<p class="text-slate-500">[System]: Konsol diaktifkan. Harap pasang Kabel Feeder sebagai langkah awal.</p>`;
updateSimulatorStep();
lucide.createIcons();
addLog("Papan simulator dibersihkan.", "normal");
}
// --- SPEK ALAT & GRAFIS MODAL DATA ---
// Penulisan kode ilustrasi visual (gambar teknik) berbasis raw SVG untuk dimuat ke dalam pop-up
const detailAlat = {
olt: {
tag: "Level 1 - Central Office (CO)",
icon: "server",
color: "bg-red-500",
title: "Optical Line Terminal",
sub: "Transmitter Utama Provider",
desc: "Perangkat ini dipasang pada ruang Sentral Telepon milik operator telekomunikasi. Memiliki peran vital sebagai pembangkit laser optik tunggal berkapasitas ultra besar, mengonversi data elektrik (IP Packet) ke bentuk pulsa cahaya, serta mengontrol waktu transmisi hilir dan hulu pelanggan.",
specs: [
["Tipe Laser", "DFB-LD 1490nm / 1310nm"],
["Standard Daya Keluar", "+3.0 dBm s.d +7.0 dBm"],
["Maksimal Splitter", "1:128 Pelanggan"],
["Teknologi Utama", "GPON / EPON / XG-PON"]
],
// Gambar SVG besar untuk detail alat
svg: `
<svg viewBox="0 0 160 100" class="w-auto h-full text-slate-800">
<rect x="10" y="10" width="140" height="80" rx="4" fill="#0f172a" />
<!-- Rak Grid bars -->
<line x1="8" y1="10" x2="8" y2="90" stroke="#64748b" stroke-width="2" />
<line x1="152" y1="10" x2="152" y2="90" stroke="#64748b" stroke-width="2" />
<!-- Card Slot 1 (Power & Controller) -->
<rect x="15" y="18" width="130" height="15" rx="1" fill="#1e293b" />
<circle cx="22" cy="25.5" r="2.5" fill="#22c55e" class="animate-pulse" />
<circle cx="30" cy="25.5" r="2.5" fill="#3b82f6" />
<!-- Card Slot 2 (GPON ports) -->
<rect x="15" y="38" width="130" height="20" rx="1" fill="#334155" />
<!-- Ports -->
<rect x="40" y="44" width="8" height="8" rx="0.5" fill="#0f172a" stroke="#475569" />
<rect x="52" y="44" width="8" height="8" rx="0.5" fill="#0f172a" stroke="#475569" />
<rect x="64" y="44" width="8" height="8" rx="0.5" fill="#0f172a" stroke="#475569" />
<rect x="76" y="44" width="8" height="8" rx="0.5" fill="#0f172a" stroke="#475569" />
<!-- Blinking lasers light effects -->
<circle cx="44" cy="48" r="1" fill="#ef4444" class="animate-ping" />
<circle cx="56" cy="48" r="1" fill="#ef4444" class="animate-ping" />
<!-- Vent holes -->
<rect x="100" y="42" width="35" height="12" rx="1" fill="#0f172a" />
<!-- Jumper optik merah terhubung keluar -->
<path d="M 44,48 Q 50,85 10,80" stroke="#ef4444" stroke-width="2" fill="none" />
</svg>
`
},
odf: {
tag: "Level 2 - Ruang Transmisi (CO)",
icon: "grid",
color: "bg-orange-500",
title: "Optical Distribution Frame",
sub: "Jumper & Patch Panel Distribusi",
desc: "ODF merupakan panel tempat terminasi awal kabel fiber optik outdoor yang keluar dari OLT. ODF memudahkan operator melakukan uji coba link, jumper antar-core, serta melindungi ujung serat kaca sensitif dari kerusakan mekanis.",
specs: [
["Kapasitas Slot", "12, 24, hingga 96 Port"],
["Jenis Konektor", "SC / FC / LC UPC-APC"],
["Lokasi Pemasangan", "Indoor Rackmount CO"],
["Jenis Cable Organiser", "Cassette Tray Splicing"]
],
svg: `
<svg viewBox="0 0 160 100" class="w-auto h-full">
<rect x="10" y="10" width="140" height="80" rx="3" fill="#1e293b" />
<!-- Panel Splice Cassette Tray mock-up -->
<rect x="15" y="18" width="130" height="28" rx="1" fill="#0f172a" />
<!-- SC Coupler Blue Ports Row -->
<rect x="25" y="24" width="6" height="10" fill="#3b82f6" />
<rect x="35" y="24" width="6" height="10" fill="#3b82f6" />
<rect x="45" y="24" width="6" height="10" fill="#3b82f6" />
<rect x="55" y="24" width="6" height="10" fill="#3b82f6" />
<rect x="65" y="24" width="6" height="10" fill="#3b82f6" />
<!-- Patch cord pigtail yellow wires -->
<path d="M 28,34 Q 45,75 80,75" stroke="#eab308" stroke-width="1.5" fill="none" />
<path d="M 38,34 Q 55,70 85,75" stroke="#eab308" stroke-width="1.5" fill="none" />
<path d="M 48,34 Q 65,65 90,75" stroke="#3b82f6" stroke-width="1" fill="none" />
<!-- Organised Fiber Trays on bottom shelf -->
<rect x="15" y="54" width="130" height="28" rx="1" fill="#334155" />
<circle cx="80" cy="68" r="10" stroke="#475569" stroke-width="1" fill="none" stroke-dasharray="2 2" />
</svg>
`
},
odc: {
tag: "Level 3 - Feeder Node",
icon: "archive",
color: "bg-yellow-500",
title: "Optical Distribution Cabinet",
sub: "Kabinet Pembagi Feeder Utama",
desc: "Kabinet outdoor berpelindung cuaca yang biasanya ditempatkan di pinggir jalan umum. Di dalam ODC, kabel optik feeder primer berkapasitas besar akan didistribusikan ke splitter optik pasif tahap pertama guna digandakan ke beberapa kabel distribusi sekunder.",
specs: [
["Rasio Splitter Pasif", "Passive Splitter 1:4 / 1:8"],
["Redaman Maks Splitter", "6.5 dB (1:4) s.d 10.5 dB (1:8)"],
["Material Kabinet", "Double-wall Anti-Karat IP65"],
["Kapasitas Distribusi", "Biasanya hingga 288 Core"]
],
svg: `
<svg viewBox="0 0 160 100" class="w-auto h-full">
<!-- Background Road environment -->
<rect x="0" y="80" width="160" height="20" fill="#94a3b8" />
<!-- Cabinet Frame Grey -->
<rect x="45" y="5" width="70" height="80" rx="4" fill="#e2e8f0" stroke="#cbd5e1" stroke-width="2" />
<rect x="40" y="80" width="80" height="5" fill="#475569" />
<!-- Cabinet Doors open -->
<path d="M 45,5 L 10,12 L 10,75 L 45,80 Z" fill="#f1f5f9" stroke="#cbd5e1" />
<path d="M 115,5 L 150,12 L 150,75 L 115,80 Z" fill="#f1f5f9" stroke="#cbd5e1" />
<!-- Internal Patch Panel Splitter -->
<rect x="52" y="15" width="56" height="55" rx="2" fill="#1e293b" />
<!-- Splitter Box Yellow -->
<rect x="60" y="22" width="40" height="12" rx="1" fill="#f97316" />
<circle cx="65" cy="28" r="2" fill="#fff" />
<!-- Output fibers cascading down -->
<path d="M 65,28 Q 45,55 70,62" stroke="#eab308" stroke-width="1.2" fill="none" />
<path d="M 65,28 Q 50,58 75,62" stroke="#ef4444" stroke-width="1.2" fill="none" />
<path d="M 65,28 Q 55,61 80,62" stroke="#3b82f6" stroke-width="1.2" fill="none" />
</svg>
`
},
odp: {
tag: "Level 4 - Tiang Distribusi",
icon: "building",
color: "bg-green-500",
title: "Optical Distribution Point",
sub: "Titik Akses Drop Core Pelanggan",
desc: "Kotak terminasi yang menempel di tiang listrik atau dinding luar perumahan. ODP menyimpan splitter pasif tahap kedua untuk mendistribusikan berkas cahaya langsung ke rumah-rumah pelanggan melalui konektor drop optik yang kuat menghadapi cuaca panas hujan.",
specs: [
["Rasio Splitter Pasif", "Passive Splitter 1:8 / 1:16"],
["Redaman Maks Splitter", "10.5 dB (1:8) s.d 13.8 dB (1:16)"],
["Jenis Port Drop", "SC Fast Connector"],
["Metode Gantung", "Aerial / Tiang / Pedestal"]
],
svg: `
<svg viewBox="0 0 160 100" class="w-auto h-full">
<!-- Pole -->
<rect x="20" y="0" width="10" height="100" fill="#64748b" />
<!-- Metal Mounting brackets -->
<rect x="18" y="25" width="14" height="4" fill="#475569" />
<rect x="18" y="75" width="14" height="4" fill="#475569" />
<!-- ODP box closed with latch -->
<rect x="40" y="15" width="55" height="70" rx="8" fill="#1e293b" stroke="#0f172a" stroke-width="1.5" />
<rect x="45" y="25" width="45" height="4" rx="1" fill="#334155" />
<rect x="45" y="45" width="45" height="4" rx="1" fill="#334155" />
<!-- Output glands at bottom -->
<circle cx="50" cy="85" r="3" fill="#475569" />
<circle cx="62" cy="85" r="3" fill="#475569" />
<circle cx="74" cy="85" r="3" fill="#475569" />
<circle cx="86" cy="85" r="3" fill="#475569" />
<!-- Black drop cables feeding out -->
<path d="M 50,85 Q 35,110 5,95" stroke="#334155" stroke-width="2" fill="none" />
<path d="M 62,85 Q 55,115 15,98" stroke="#334155" stroke-width="2" fill="none" />
</svg>
`
},
roset: {
tag: "Level 5 - Dinding Pelanggan",
icon: "home",
color: "bg-teal-500",
title: "Roset Optik (OTP)",
sub: "Titik Terminasi Akhir Rumah",
desc: "Kotak plastik kecil yang diletakkan di dinding dalam rumah pelanggan. Fungsinya adalah sebagai titik temu aman dan tempat penyambungan (splicing) antara kabel drop core outdoor dengan kabel patch cord indoor yang jauh lebih lentur guna meminimalisasi bending loss.",
specs: [
["Kapasitas Sambung", "1 s.d 2 Core"],
["Jenis Konektor", "SC Adapter"],
["Splicing Tray", "Built-in Protection Sleeves Slot"],
["Pemasangan", "Dinding Dalam Ruangan (Indoor)"]
],
svg: `
<svg viewBox="0 0 160 100" class="w-auto h-full">
<!-- Wall surface decoration -->
<rect x="0" y="0" width="160" height="100" fill="#f8fafc" />
<!-- Roset White box -->
<rect x="40" y="15" width="80" height="70" rx="6" fill="#ffffff" stroke="#e2e8f0" stroke-width="3" />
<!-- Internal Fiber management ring -->
<circle cx="80" cy="50" r="22" stroke="#f1f5f9" stroke-width="4" fill="none" />
<circle cx="80" cy="50" r="16" stroke="#cbd5e1" stroke-width="1.5" stroke-dasharray="3 3" fill="none" />
<!-- Splice protector sleeve bracket -->
<rect x="68" y="47" width="24" height="6" rx="1.5" fill="#475569" />
<!-- SC blue adapter -->
<rect x="100" y="58" width="12" height="18" fill="#3b82f6" />
<rect x="103" y="76" width="6" height="4" fill="#0f172a" />
<!-- Fiber Core Red/Green tracing inside -->
<path d="M 40,55 C 60,55 70,30 80,30" stroke="#10b981" stroke-width="1.5" fill="none" />
<path d="M 80,30 C 95,30 105,45 106,58" stroke="#3b82f6" stroke-width="1.5" fill="none" />
</svg>
`
},
ont: {
tag: "Level 6 - Rumah Pelanggan",
icon: "wifi",
color: "bg-indigo-500",
title: "Optical Network Terminal",
sub: "Modem Konversi Cahaya ke IP",
desc: "Perangkat elektronik aktif di sisi pelanggan yang mengubah kembali sinyal modulasI optikal (cahaya) menjadi sinyal elektrik siap pakai. ONT menyediakan interface LAN, Wi-Fi, dan Port Telepon RJ-11 untuk diakses oleh HP, Laptop, dan komputer pelanggan.",
specs: [
["Sensitivitas Daya RX", "-8.0 dBm s.d -27.0 dBm"],
["Standar Wireless", "802.11 b/g/n/ac Dual Band"],
["Port Fisik", "GE (Gigabit) / FE (Fast Ethernet)"],
["Protokol PON", "GPON ITU-T G.984 Compliant"]
],
svg: `
<svg viewBox="0 0 160 100" class="w-auto h-full">
<!-- Table line -->
<line x1="0" y1="85" x2="160" y2="85" stroke="#cbd5e1" stroke-width="3" />
<!-- ONT Body sleek router -->
<rect x="30" y="40" width="100" height="40" rx="6" fill="#ffffff" stroke="#cbd5e1" stroke-width="2" />
<rect x="30" y="70" width="100" height="10" fill="#f8fafc" />
<!-- Quad Antenna Setup -->
<line x1="40" y1="40" x2="40" y2="10" stroke="#cbd5e1" stroke-width="4" stroke-linecap="round" />
<line x1="60" y1="40" x2="60" y2="15" stroke="#cbd5e1" stroke-width="4" stroke-linecap="round" />
<line x1="100" y1="40" x2="100" y2="15" stroke="#cbd5e1" stroke-width="4" stroke-linecap="round" />
<line x1="120" y1="40" x2="120" y2="10" stroke="#cbd5e1" stroke-width="4" stroke-linecap="round" />
<!-- LED Indicators glowing green -->
<circle cx="45" cy="55" r="2.5" fill="#22c55e" class="animate-pulse" />
<circle cx="55" cy="55" r="2.5" fill="#22c55e" />
<circle cx="65" cy="55" r="2.5" fill="#22c55e" />
<circle cx="75" cy="55" r="2.5" fill="#eab308" />
<!-- Lan ports & PON indicators back view perspective -->
<text x="95" y="58" fill="#94a3b8" font-size="5" font-weight="bold">GPON ONT</text>
<path d="M 85,80 Q 85,95 110,95" stroke="#eab308" stroke-width="2.5" fill="none" />
</svg>
`
}
};
// Modifikasi showDetailAlat untuk merender SVG secara dinamis ke dalam box modal pop-up
function showDetailAlat(id) {
playSound('click');
const data = detailAlat[id];
// Set tag dan ikon
document.getElementById('modal-alat-tag').innerHTML = `<span class="text-[10px] font-black px-2.5 py-1 ${data.color} text-white rounded-lg">${data.tag}</span>`;
document.getElementById('modal-alat-icon').className = `w-12 h-12 rounded-2xl flex items-center justify-center text-white ${data.color}`;
document.getElementById('modal-alat-icon').innerHTML = `<i data-lucide="${data.icon}" class="w-6 h-6"></i>`;
// Masukkan SVG gambar teknik yang bersesuaian
document.getElementById('modal-alat-graphic').innerHTML = data.svg;
document.getElementById('modal-alat-title').innerText = data.title;
document.getElementById('modal-alat-sub').innerText = data.sub;
document.getElementById('modal-alat-desc').innerText = data.desc;
// Masukkan parameter teknik standar
const specsBox = document.getElementById('modal-alat-specs');
specsBox.innerHTML = '';
data.specs.forEach(spec => {
const div = document.createElement('div');
div.className = "bg-slate-50 p-2 rounded-xl border border-slate-100";
div.innerHTML = `
<span class="block text-[9px] text-slate-400 font-bold uppercase">${spec[0]}</span>
<span class="font-extrabold text-slate-800 text-xs">${spec[1]}</span>
`;
specsBox.appendChild(div);
});
document.getElementById('modal-alat').classList.remove('hidden');
lucide.createIcons();
}
function closeModalAlat() {
playSound('click');
document.getElementById('modal-alat').classList.add('hidden');
}
// ================= KUIS SYSTEM =================
const quizData = [
{
id: 1,
question: "Alat pengukur kekuatan sinyal cahaya (daya optik) yang mengalir pada kabel serat optik di lapangan dinamakan...",
options: [
"OTDR (Optical Time Domain Reflectometer)",
"OPM (Optical Power Meter)",
"Optical Fiber Cleaver",
"Visual Fault Locator"
],
correct: 1,
explanation: "OPM digunakan khusus untuk mengukur rugi-rugi (redaman) sinyal cahaya optik secara kuantitatif (dalam dBm)."
},
{
id: 2,
question: "Berapakah nilai redaman (loss) sinyal optik yang dianggap ideal dan aman untuk mencegah status LOS (Loss of Signal) pada modem pelanggan?",
options: [
"-5 dBm s.d -10 dBm",
"-32 dBm s.d -40 dBm",
"-15 dBm s.d -24 dBm",
"+5 dBm s.d +10 dBm"
],
correct: 2,
explanation: "Standar daya terima (RX Power) yang direkomendasikan ITU-T di sisi pelanggan berkisar antara -15 dBm s.d -24 dBm."
},
{
id: 3,
question: "Mengapa teknologi splitter pasif (Passive Splitter) sangat efisien digunakan dalam perancangan jaringan kabel FTTH?",
options: [
"Karena splitter tidak memerlukan pasokan daya listrik aktif untuk membagi berkas cahaya",
"Sebab splitter dapat memperkuat sinyal optik yang mulai lemah di tengah jalan",
"Karena splitter dapat menyatukan kabel optik dengan kabel tembaga",
"Mampu membelokkan cahaya fiber hingga 180 derajat tanpa redaman"
],
correct: 0,
explanation: "Passive Splitter murni menggunakan elemen kaca pembias cahaya tanpa komponen elektronik aktif, menghemat pengeluaran daya listrik luar ruangan."
},
{
id: 4,
question: "Tipe serat optik manakah yang dirancang khusus tahan lekukan tajam (bending insensitive) sehingga sangat ideal diaplasikan di dalam rumah?",
options: [
"Kabel Feeder G.652",
"Patch Cord Single Mode G.655",
"Kabel Drop Core G.657.A",
"Kabel Multimode OM4"
],
correct: 2,
explanation: "Kabel G.657.A memiliki resistansi tinggi terhadap bending loss (kebocoran cahaya akibat kabel tertekuk/terlipat di sudut tembok)."
},
{
id: 5,
question: "Penyambungan core serat kaca secara permanen dengan menggunakan metode peleburan busur api elektrode kelistrikan tinggi dinamakan...",
options: [
"Splicing Mechanical Joint",
"Wrapping Core Cable",
"Fusion Splicing",
"Direct Connector Termination"
],
correct: 2,
explanation: "Fusion Splicing meleburkan serat kaca menggunakan panas tinggi (arc discharge) pada Fusion Splicer agar loss sambungan sangat kecil (< 0.03 dB)."
}
];
let answers = Array(quizData.length).fill(null);
function renderQuiz() {
const container = document.getElementById('quiz-box');
container.innerHTML = '';
quizData.forEach((q, qIdx) => {
const card = document.createElement('div');
card.className = "bg-slate-50 border border-slate-200/80 rounded-2xl p-5 space-y-4 shadow-sm";
const qTitle = document.createElement('h3');
qTitle.className = "font-extrabold text-slate-900 text-sm md:text-base leading-relaxed";
qTitle.innerHTML = `<span class="inline-block px-2.5 py-1 bg-blue-100 text-blue-700 rounded-lg text-xs mr-2 font-bold">SOAL ${qIdx + 1}</span> ${q.question}`;
card.appendChild(qTitle);
const optionsList = document.createElement('div');
optionsList.className = "grid grid-cols-1 gap-2.5";
q.options.forEach((opt, optIdx) => {
const btn = document.createElement('button');
btn.type = "button";
btn.className = `option-btn w-full p-4 text-left text-xs md:text-sm rounded-xl border transition-all duration-300 flex items-center gap-3 font-semibold`;
if (answers[qIdx] === null) {
btn.className += " border-slate-200 hover:border-slate-300 bg-white text-slate-700 hover:bg-slate-50";
} else {
if (optIdx === q.correct) {
btn.className += " border-emerald-500 bg-emerald-50 text-emerald-800 font-extrabold";
} else if (answers[qIdx] === optIdx) {
btn.className += " border-rose-300 bg-rose-50 text-rose-700";
} else {
btn.className += " border-slate-100 bg-slate-50/50 text-slate-400 cursor-not-allowed";
}
}
btn.onclick = () => {
if (answers[qIdx] !== null) return;
selectOption(qIdx, optIdx);
};
const labelLetter = String.fromCharCode(65 + optIdx);
btn.innerHTML = `<span class="w-6 h-6 rounded-full flex items-center justify-center font-bold shrink-0 text-xs ${answers[qIdx] !== null && optIdx === q.correct ? 'bg-emerald-500 text-white' : 'bg-slate-100 text-slate-600'}">${labelLetter}</span> ${opt}`;
optionsList.appendChild(btn);
});
card.appendChild(optionsList);
if (answers[qIdx] !== null) {
const explainBox = document.createElement('div');
const isCorrect = answers[qIdx] === q.correct;
explainBox.className = `p-4 rounded-xl text-xs md:text-sm ${isCorrect ? 'bg-emerald-100/40 text-emerald-900 border border-emerald-200' : 'bg-amber-100/40 text-amber-900 border border-amber-200'}`;
explainBox.innerHTML = `
<div class="flex items-center gap-1.5 font-extrabold mb-1">
<i data-lucide="${isCorrect ? 'check-circle' : 'help-circle'}" class="w-4 h-4 ${isCorrect ? 'text-emerald-600' : 'text-amber-600'}"></i>
${isCorrect ? 'Jawaban Anda Benar!' : 'Jawaban Kurang Tepat!'}
</div>
<p class="mt-1 leading-relaxed">${q.explanation}</p>
`;
card.appendChild(explainBox);
}
container.appendChild(card);
});
updateQuizMetrics();
lucide.createIcons();
}
function selectOption(qIdx, optIdx) {
answers[qIdx] = optIdx;
if (optIdx === quizData[qIdx].correct) {
playSound('success');
} else {
playSound('error');
}
renderQuiz();
}
function updateQuizMetrics() {
const answeredCount = answers.filter(a => a !== null).length;
const percentage = (answeredCount / quizData.length) * 100;
document.getElementById('quiz-progress').style.width = `${percentage}%`;
let correctCount = 0;
answers.forEach((ans, idx) => {
if (ans === quizData[idx].correct) correctCount++;
});
const currentScore = Math.round((correctCount / quizData.length) * 100);
document.getElementById('quiz-score').innerText = currentScore;
if (answeredCount === quizData.length) {
document.getElementById('quiz-result').classList.remove('hidden');
// Update Sertifikat
document.getElementById('cert-score').innerText = `${currentScore}%`;
document.getElementById('cert-date').innerText = new Date().toLocaleDateString('id-ID', { day: 'numeric', month: 'long', year: 'numeric' });
} else {
document.getElementById('quiz-result').classList.add('hidden');
}
}
function restartQuiz() {
playSound('click');
answers = Array(quizData.length).fill(null);
document.getElementById('quiz-result').classList.add('hidden');
renderQuiz();
}
window.onload = function() {
renderQuiz();
}
</script>
</body>
</html>
Komentar
Posting Komentar