<?xml version="1.0" encoding="UTF-8" standalone="no"?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:gd="http://schemas.google.com/g/2005" xmlns:georss="http://www.georss.org/georss" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:thr="http://purl.org/syndication/thread/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-9000860041661554971</atom:id><lastBuildDate>Fri, 04 Sep 2026 06:11:10 +0000</lastBuildDate><category>herbal</category><category>download</category><category>ebook</category><category>islami</category><category>Forex</category><category>Marketiva</category><category>converter</category><category>Cinta</category><category>El-shirazy</category><category>Habiburahman</category><category>Investasi Menurut Hukum Islam</category><category>Kang Abik</category><category>Novel</category><category>Online</category><category>Trading</category><category>VALUTA</category><category>doa</category><category>#pemimpinmerdekabelajar #refleksimerdekabelajar</category><category>18 Cara Merawat Komputer/Laptop Agar Tetap Awet Dan Tidak Rusak</category><category>ASING</category><category>Apa</category><category>Ayat</category><category>BATASAN RIBA DALAM SYARIAH</category><category>Bank konvensional vs Bank Syariah</category><category>Basic</category><category>Batasan Mengambil Keuntungan dalam Islam</category><category>Bertasbih</category><category>Bertasbih II</category><category>CARI</category><category>COMMODITIES</category><category>Cara</category><category>Cara Daftar Google Adsense Indonesia untuk menghasilkan uang dari internet</category><category>Cara Download Video Di YouTube Tanpa Software</category><category>Cara Investasi yang benar dan aman</category><category>Cara Memasang Iklan Adsense di Tengah Posting Secara Otomatis</category><category>Cara Memperbaiki Harddisk Tidak Terbaca Komputer</category><category>Cara Mendapatkan Uang dari Internet  seo</category><category>Cara Mendapatkan Uang dari Internet Bagi Anda yang Suka Bermain Game</category><category>Cara Mendapatkan Uang dari Internet Jika Anda Memahami Teknik SEO</category><category>Cara Mendapatkan Uang dari Internet Jika Anda Memiliki Modal Memadai</category><category>Cara Mendapatkan Uang dari Internet Jika Anda Punya Waktu Memadai</category><category>Cara Mendapatkan Uang dari Internet dengan Membuat Program/Software</category><category>Cara Mendapatkan Uang dari Internet dengan Toko Online</category><category>Cara Meningkatkan lalu lintas Pengunjung Blog / Website Dengan Cepat</category><category>Cara Mudah Membuat Akun PayPal Tanpa Kartu Kredit</category><category>Cara atasi Bluetooth Laptop tidak bekerja</category><category>Cara mengetahui spesifikasi komputer di linux</category><category>Cara mudah Download Video Di YouTube</category><category>DI INTERNET</category><category>DOWNLOAD SOAL-SOAL LATIHAN PRAKTEK EXCEL</category><category>Deposit</category><category>Deposito Syariah</category><category>Download ebook islami bagian 5</category><category>Download internet download accelator IrfanView</category><category>Dunia</category><category>Edensor</category><category>FUND</category><category>Forex dalam hukum Islam</category><category>HOBI YANG MENGHASILKAN UANG</category><category>Hukum Investasi  Menurut Syariat Islam</category><category>Hukum Tansaksi Valas dan Spekulasi Kurs Mata Uang</category><category>INDEXES</category><category>INVESTASI SYARIAH MENGUNTUNGKAN DUNIA DAN AKHIRAT</category><category>Instrumen Pasar Modal Syariah</category><category>Investasi dalam pandangan islam (syariah)</category><category>Jenis Investasi Berdasarkan Syariah</category><category>Join</category><category>Jual Beli dalam Syariah</category><category>KAMUS ISTILAH FOREX</category><category>Kenapa Kamu Harus Punya PayPal</category><category>Kumpulan Perintah Linux di Terminal Lengkap</category><category>MARKETIVA AGEA MUDAHNYA BERTRANSAKSI FOREX</category><category>MATA UANG</category><category>MENGENAL SAHAM (1)</category><category>MENGENAL SAHAM (2)</category><category>MENGUMPULKAM MODAL</category><category>MENYIAPKAN DANA HAJI</category><category>MONEY GAME</category><category>Materi</category><category>Membuat blog jadi 3 kolom</category><category>Mengetahui Kapasitas Memory</category><category>Menghasilkan Uang dari Internet dengan ClixSense</category><category>Menghasilkan Uang dari Internet dengan WHAFF!</category><category>Modul penyelesain masalah akuntansi dengan excel</category><category>Musik Klasik Bagi Bayi 1</category><category>Musik Klasik Bagi Bayi 2</category><category>Musik Klasik Bagi Bayi 3</category><category>Nama</category><category>Novel Ayat-Ayat Cinta</category><category>PELATIHAN PEMANFAATAN TIK DAN LITERASASI DIGITAL DI SMK N 8 SOLO KERJASAMA PUSTEKOM KEMDIKBUD DAN KOGTIK</category><category>PRODUK SIMPANAN DI BANK</category><category>Pasar Modal Syariah</category><category>Penyebab Blue Screen Windows dan Solusi Cara Mengatasinya</category><category>Processor</category><category>REKSA DANA (1)</category><category>REKSA DANA (2)</category><category>Resiko dalam Investasi</category><category>SAW</category><category>SENI BACA ALQURAN</category><category>SIKLUS FINANSIAL ANDA</category><category>STRATEGI FOREX</category><category>Secara</category><category>Singkat</category><category>Soal</category><category>Spekulasi di Pasar Modal</category><category>Strategy</category><category>TEMPAT</category><category>Tantangan Investasi Syariah di Pasar Modal</category><category>Tata Cara Jual Beli dalam Islam</category><category>Tinjauan Syariat Terhadap Jual-Beli Kredit</category><category>Tips Jitu Trading</category><category>Tips Memperbaiki Komputer Yang Macet Hang</category><category>Tradding</category><category>Transaksi</category><category>Tutorial</category><category>Tutorial Cara</category><category>UANG</category><category>Witdrawl</category><category>ahmed</category><category>aisyah</category><category>akm</category><category>alam</category><category>alquran</category><category>andrea</category><category>andrea hirata</category><category>ansav</category><category>antivirus</category><category>aqiqah</category><category>audio</category><category>avi</category><category>bagian</category><category>bepergian</category><category>berhijab</category><category>berjilbab</category><category>dan</category><category>dan Hardisk pada PC</category><category>dan Hardisk pada PC Mengetahui Kapasitas Memory</category><category>dan Referensi Jawaban</category><category>deedat</category><category>dogma</category><category>download converter</category><category>download lagu Letto - Lethologica (2009)</category><category>download laskar pelangi karya andrea hirata</category><category>download modul praktek SPSS</category><category>download setup alqur'an in word</category><category>download soal-soal pilihan Ganda TKJ (teknik Jaringan dan Komputer)</category><category>engkau</category><category>fiqih</category><category>flv</category><category>hamil</category><category>hirata</category><category>ilmu</category><category>iman</category><category>injil</category><category>islam</category><category>jual beli kredit dalam islam</category><category>karpov</category><category>karya andrea hirata</category><category>keajaiban</category><category>kristen</category><category>kristus</category><category>laskar pelangi 3</category><category>laut</category><category>lintas</category><category>maryamah</category><category>matematika</category><category>mati</category><category>menghalangi</category><category>menghasilkan uang dari internet dengan ProBux</category><category>misteri</category><category>mpeg</category><category>muallaf</category><category>muhammmad</category><category>nabawiyah</category><category>naskah</category><category>nusantar</category><category>orientasi</category><category>pcmav</category><category>pemuda</category><category>pendeta</category><category>penduduk</category><category>perdebatan</category><category>perjalanan</category><category>quran</category><category>rahasia</category><category>sang pemimpi</category><category>sedang</category><category>sejarah</category><category>semesta</category><category>sirah</category><category>smadav</category><category>surga</category><category>swaramuslim</category><category>tawakal</category><category>wanita</category><category>wav</category><category>wma</category><title>INVESTASI DEMI HIDUP YANG LEBIH BAIK</title><description>"Berbuat BAIK adalah investasi"-
"Kesehatan adalah investasi"-
"Ilmu adalah investasi"--

"BerInvestasilah yang bisa Menjamin Kebahagian Kehidupan Dunia Akhirat"</description><link>http://kitab-investasi.blogspot.com/</link><managingEditor>noreply@blogger.com (Unknown)</managingEditor><generator>Blogger</generator><openSearch:totalResults>749</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><language>en-us</language><itunes:explicit>yes</itunes:explicit><copyright>Bussines for you</copyright><itunes:keywords>reksadana,saham,forex,Bank,Tabungan,Forex,Pulsa,Elektronik,HP,Bisnis,Bussine</itunes:keywords><itunes:summary>Islamic canon law investment for calm old age, happy, Very Rich, Barokah if died entered heaven Reksadana , Saham, Bank, Tabungan, Forex, Pulsa Elektronik</itunes:summary><itunes:subtitle>Investasi syariah</itunes:subtitle><itunes:category text="Business"><itunes:category text="Investing"/></itunes:category><itunes:author>abang_cool</itunes:author><itunes:owner><itunes:email>nof_rizal07@yahoo.co.id</itunes:email><itunes:name>abang_cool</itunes:name></itunes:owner><item><guid isPermaLink="false">tag:blogger.com,1999:blog-9000860041661554971.post-4680929617969456386</guid><pubDate>Fri, 04 Sep 2026 06:09:31 +0000</pubDate><atom:updated>2026-09-04T13:11:10.859+07:00</atom:updated><title>SERTIFIKAT KOMBEL</title><description>&lt;!DOCTYPE html&gt;
&lt;html lang="id"&gt;
&lt;head&gt;
&lt;meta charset="UTF-8"&gt;
&lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&gt;
&lt;title&gt;Generator Sertifikat&lt;/title&gt;

&lt;link href="https://fonts.googleapis.com/css2?family=Montserrat:wght@700&amp;display=swap" rel="stylesheet"&gt;

&lt;script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/2.5.1/jspdf.umd.min.js"&gt;&lt;/script&gt;

&lt;style&gt;

body{
    font-family:Arial,sans-serif;
    background:#eef2f7;
    padding:20px;
    max-width:700px;
    margin:auto;
}

.card{
    background:white;
    padding:24px;
    border-radius:20px;
    box-shadow:0 10px 20px rgba(0,0,0,.1);
}

h2{
    text-align:center;
    color:#1e4668;
}

.confirm-box{
    background:#f0f6ff;
    border-left:5px solid #2c7da0;
    padding:16px;
    border-radius:16px;
    margin-bottom:20px;
    text-align:center;
}

.confirm-box p{
    margin-top:0;
    font-weight:bold;
    color:#1e4668;
}

.confirm-buttons{
    display:flex;
    gap:10px;
    margin-top:10px;
}

.confirm-buttons button{
    flex:1;
}

.yes-btn{
    background:#1f8a4c;
}

.yes-btn:hover{
    background:#166638;
}

.no-btn{
    background:#c0392b;
}

.no-btn:hover{
    background:#962d22;
}

input,select,button{
    width:100%;
    padding:12px;
    margin-top:10px;
    border-radius:12px;
    border:1px solid #ccc;
    font-size:16px;
}

button{
    background:#2c7da0;
    color:white;
    border:none;
    cursor:pointer;
    font-weight:bold;
}

button:hover{
    background:#1f5e7a;
}

button:disabled{
    background:#94a3b8;
    cursor:not-allowed;
}

input:disabled,
select:disabled{
    background:#f1f5f9;
}

#preview{
    width:100%;
    border-radius:12px;
    margin-top:10px;
}

.loading{
    display:none;
    margin-top:15px;
    color:#1e4668;
    font-weight:bold;
    text-align:center;
}

.status{
    margin-top:12px;
    font-weight:bold;
}

.success{
    color:#1f8a4c;
}

.error{
    color:#c0392b;
}

&lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;

&lt;div class="card"&gt;

&lt;h2&gt;&#128220; Generator Sertifikat&lt;/h2&gt;

&lt;!-- ================= KONFIRMASI ================= --&gt;

&lt;div class="confirm-box"&gt;

&lt;p&gt;&#128269; Apakah Anda mengikuti pelatihan?&lt;/p&gt;

&lt;div class="confirm-buttons"&gt;

&lt;button class="yes-btn" onclick="confirmIkut()"&gt;
✅ YA, IKUT
&lt;/button&gt;

&lt;button class="no-btn" onclick="confirmTidakIkut()"&gt;
❌ TIDAK
&lt;/button&gt;

&lt;/div&gt;

&lt;div id="statusKonfirmasi" class="status"&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;!-- ================= FORM ================= --&gt;

&lt;label&gt;Nama Lengkap&lt;/label&gt;

&lt;input
type="text"
id="nama"
placeholder="Contoh: Ahmad Fauzi"
disabled&gt;

&lt;label&gt;Peran&lt;/label&gt;

&lt;select id="peran" disabled&gt;
    &lt;option&gt;Peserta&lt;/option&gt;
    &lt;option&gt;Narasumber&lt;/option&gt;
&lt;/select&gt;

&lt;img
id="preview"
src="https://lh3.googleusercontent.com/d/1Hu72T5j34moAaJG9Xnr1rGH3POtJ-Pug"
alt="Template"&gt;

&lt;button
id="downloadBtn"
onclick="generatePDF()"
disabled&gt;

⬇️ UNDUH PDF

&lt;/button&gt;

&lt;div class="loading" id="loading"&gt;
Memproses PDF...
&lt;/div&gt;

&lt;/div&gt;

&lt;script&gt;

// ================= TEMPLATE (DIUBAH) =================

const FILE_ID =
'1Hu72T5j34moAaJG9Xnr1rGH3POtJ-Pug';  // &lt;-- ID baru

const TEMPLATE_URL =
`https://lh3.googleusercontent.com/d/${FILE_ID}`;

// ================= UTIL =================

function showLoading(show){

    document.getElementById('loading').style.display =
        show ? 'block' : 'none';

}

function getRomanMonth(monthIndex){

    const romawi = [
        "I","II","III","IV","V","VI",
        "VII","VIII","IX","X","XI","XII"
    ];

    return romawi[monthIndex];

}

function capitalizeEachWord(text){

    return text
        .toLowerCase()
        .replace(/\b\w/g,c=&gt;c.toUpperCase());

}

// ================= KONFIRMASI =================

function confirmIkut(){

    document.getElementById('nama').disabled = false;

    document.getElementById('peran').disabled = false;

    document.getElementById('downloadBtn').disabled = false;

    document.getElementById('statusKonfirmasi').innerHTML =
        '&lt;span class="success"&gt;✅ Konfirmasi diterima. Anda dapat mengunduh sertifikat.&lt;/span&gt;';

}

function confirmTidakIkut(){

    document.getElementById('nama').disabled = true;

    document.getElementById('peran').disabled = true;

    document.getElementById('downloadBtn').disabled = true;

    document.getElementById('statusKonfirmasi').innerHTML =
        '&lt;span class="error"&gt;❌ Anda tidak dapat mengunduh sertifikat.&lt;/span&gt;';

}

// ================= LOAD IMAGE =================

function loadImage(url){

    return new Promise((resolve,reject)=&gt;{

        const img = new Image();

        img.crossOrigin = "anonymous";

        img.onload = ()=&gt;resolve(img);

        img.onerror = ()=&gt;{

            reject(
                new Error(
                    'Template Google Drive gagal dimuat'
                )
            );

        };

        img.src = url + '?t=' + Date.now();

    });

}

// ================= NOMOR =================

async function generateNomor(){

    const now = new Date();

    const bulan =
        getRomanMonth(now.getMonth());

    const tahun =
        now.getFullYear();

    const nomor =
        Math.floor(Math.random()*900)+100;

    return `${nomor}/K/${bulan}/${tahun}`;

}

// ================= PDF =================

async function generatePDF(){

    const namaInput =
        document.getElementById('nama');

    const peranSelect =
        document.getElementById('peran');

    let nama =
        namaInput.value.trim();

    const peran =
        peranSelect.value;

    if(!nama){

        alert('Nama wajib diisi');

        return;

    }

    nama =
        capitalizeEachWord(nama);

    showLoading(true);

    try{

        await document.fonts.ready;

        const img =
            await loadImage(TEMPLATE_URL);

        const canvas =
            document.createElement('canvas');

        canvas.width = img.width;
        canvas.height = img.height;

        const ctx =
            canvas.getContext('2d');

        ctx.drawImage(
            img,
            0,
            0,
            canvas.width,
            canvas.height
        );

        // ================= POSISI =================

        const nomorY =
            canvas.height * 0.235;

        const namaY =
            canvas.height * 0.3990;

        const peranY =
            canvas.height * 0.5420;

        // ================= STYLE =================

        ctx.textAlign = 'center';

        ctx.textBaseline = 'middle';

        ctx.fillStyle = '#000';

        // nomor
        const nomorSertifikat =
            await generateNomor();

        ctx.font =
            `bold ${canvas.width*0.0125}px Montserrat`;

        ctx.fillText(
            nomorSertifikat,
            canvas.width/2,
            nomorY
        );

        // nama auto shrink
        let fontSize =
            canvas.width * 0.031;

        ctx.font =
            `700 ${fontSize}px Montserrat`;

        let textWidth =
            ctx.measureText(nama).width;

        const maxWidth =
            canvas.width - 180;

        while(
            textWidth &gt; maxWidth &amp;&amp;
            fontSize &gt; 20
        ){

            fontSize -= 2;

            ctx.font =
                `700 ${fontSize}px Montserrat`;

            textWidth =
                ctx.measureText(nama).width;

        }

        ctx.fillText(
            nama,
            canvas.width/2,
            namaY
        );

        // peran
        ctx.font =
            `bold ${canvas.width*0.024}px Montserrat`;

        ctx.fillText(
            peran,
            canvas.width/2,
            peranY
        );

        // ================= PDF =================

        const imageData =
            canvas.toDataURL(
                'image/jpeg',
                1.0
            );

        const { jsPDF } =
            window.jspdf;

        const pdf =
            new jsPDF({

                orientation:
                    canvas.width &gt; canvas.height
                    ? 'landscape'
                    : 'portrait',

                unit:'px',

                format:[
                    canvas.width,
                    canvas.height
                ]

            });

        pdf.addImage(
            imageData,
            'JPEG',
            0,
            0,
            canvas.width,
            canvas.height
        );

        const safeName =
            nama.replace(/[^a-z0-9]/gi,'_');

        pdf.save(
            `Sertifikat_${safeName}.pdf`
        );

    }catch(error){

        console.error(error);

        alert(
            '❌ Gagal membuat PDF\n\n' +
            error.message +
            '\n\nPastikan file Google Drive bersifat PUBLIC.'
        );

    }finally{

        showLoading(false);

    }

}

&lt;/script&gt;

&lt;/body&gt;
&lt;/html&gt;</description><link>http://kitab-investasi.blogspot.com/2026/09/sertifikat-kombel.html</link><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://lh3.googleusercontent.com/d/1Hu72T5j34moAaJG9Xnr1rGH3POtJ-Pug=s72-c" width="72"/><thr:total>0</thr:total><author>nof_rizal07@yahoo.co.id (abang_cool)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-9000860041661554971.post-7228811827870023901</guid><pubDate>Fri, 04 Sep 2026 03:08:01 +0000</pubDate><atom:updated>2026-09-04T10:08:25.781+07:00</atom:updated><title>Ulangan Harian 1 — Petunjuk Kerja BAHASA INDONESIA KELAS XI SMK</title><description>&lt;!DOCTYPE html&gt;
&lt;html lang="id"&gt;
&lt;head&gt;
&lt;meta charset="UTF-8"&gt;
&lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&gt;
&lt;title&gt;Ulangan Harian 1 — Petunjuk Kerja — Kelas XI SMK&lt;/title&gt;
&lt;style&gt;
  :root{
    --ink:#1B2430;
    --ink-soft:#4A5568;
    --paper:#F7F5F0;
    --card:#FFFFFF;
    --line:#D8D2C4;
    --amber:#E8A33D;
    --amber-dark:#8A5A12;
    --green:#3F7D58;
    --green-bg:#E7F2EB;
    --red:#C1443B;
    --red-bg:#FBEAE8;
  }
  *{box-sizing:border-box;}
  body{
    margin:0;
    background:var(--paper);
    color:var(--ink);
    font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Helvetica,Arial,sans-serif;
    line-height:1.55;
  }
  .wrap{max-width:760px;margin:0 auto;padding:28px 20px 80px;}
  header.top{border-bottom:3px solid var(--ink);padding-bottom:16px;margin-bottom:22px;}
  .kode{font-size:12px;letter-spacing:.04em;color:var(--ink-soft);}
  h1{font-size:22px;margin:6px 0 4px;font-weight:800;}
  .sub{font-size:14px;color:var(--ink-soft);margin:0;}
  .meta-row{display:flex;flex-wrap:wrap;gap:10px;margin-top:14px;}
  .meta-chip{background:var(--card);border:1px solid var(--line);border-radius:6px;padding:8px 12px;font-size:13px;min-width:130px;}
  .meta-chip b{display:block;font-size:16px;}
  .card{background:var(--card);border:1px solid var(--line);border-radius:8px;padding:20px;margin-bottom:18px;}
  .card h2{font-size:16px;margin:0 0 10px;}
  label{display:block;font-size:13px;color:var(--ink-soft);margin:12px 0 4px;}
  input[type=text],input[type=number]{
    width:100%;padding:10px 12px;border:1px solid var(--line);border-radius:6px;
    font-size:15px;background:#fff;color:var(--ink);
  }
  input:focus{outline:2px solid var(--amber);outline-offset:1px;}
  .btn{
    display:inline-block;border:none;border-radius:6px;padding:12px 20px;
    font-size:15px;font-weight:700;cursor:pointer;margin-top:16px;
  }
  .btn-primary{background:var(--ink);color:#fff;}
  .btn-primary:hover{background:#000;}
  .btn-secondary{background:var(--amber);color:#3A2400;}
  .btn-secondary:hover{background:#d6912e;}
  .btn:disabled{opacity:.5;cursor:not-allowed;}
  .err{color:var(--red);font-size:13px;margin-top:8px;display:none;}
  .stimulus{
    background:#FBF9F2;border:1px solid var(--line);border-left:4px solid var(--amber);
    padding:14px 16px;border-radius:4px;margin-bottom:14px;font-size:14.5px;white-space:pre-line;
  }
  .stimulus .st-title{font-weight:800;font-size:14px;margin-bottom:6px;color:var(--amber-dark);}
  .qgroup{margin-bottom:26px;}
  .q{margin-bottom:20px;padding-bottom:18px;border-bottom:1px solid var(--line);}
  .q:last-child{border-bottom:none;}
  .q-num{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px;color:var(--ink-soft);}
  .q-text{font-size:15px;font-weight:600;margin:4px 0 10px;}
  .opt{
    display:flex;gap:10px;align-items:flex-start;padding:8px 10px;border-radius:6px;
    cursor:pointer;border:1px solid transparent;font-size:14.5px;
  }
  .opt:hover{background:#F1EFE7;}
  .opt input{margin-top:3px;}
  .opt.selected{background:#FCEFDA;border-color:var(--amber);}
  #progressWrap{position:sticky;top:0;background:var(--paper);padding:10px 0;z-index:5;border-bottom:1px solid var(--line);margin-bottom:16px;}
  #progressBar{height:8px;background:var(--line);border-radius:4px;overflow:hidden;}
  #progressFill{height:100%;background:var(--amber);width:0%;transition:width .2s;}
  #progressText{font-size:12px;color:var(--ink-soft);margin-top:4px;}
  .result-score{font-size:48px;font-weight:800;margin:6px 0;}
  .pass{color:var(--green);}
  .fail{color:var(--red);}
  .result-box{border-radius:8px;padding:20px;text-align:center;}
  .result-box.pass-bg{background:var(--green-bg);border:1px solid var(--green);}
  .result-box.fail-bg{background:var(--red-bg);border:1px solid var(--red);}
  .attempt-log{margin-top:14px;font-size:13px;}
  .attempt-log div{display:flex;justify-content:space-between;padding:6px 0;border-bottom:1px dashed var(--line);}
  .hidden{display:none;}
  footer{margin-top:30px;font-size:12px;color:var(--ink-soft);text-align:center;}
&lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;div class="wrap"&gt;

  &lt;header class="top"&gt;
    &lt;div class="kode"&gt;DOK/B.INDO/XI/PROSEDUR-UH1&lt;/div&gt;
    &lt;h1&gt;Ulangan Harian 1 — Petunjuk Kerja&lt;/h1&gt;
    &lt;p class="sub"&gt;Bahasa Indonesia · Kelas XI SMK · Materi: teks prosedur / petunjuk kerja (evaluasi informasi, perbandingan teks, kaidah kebahasaan, penyusunan &amp;amp; penyajian)&lt;/p&gt;
    &lt;div class="meta-row"&gt;
      &lt;div class="meta-chip"&gt;Jumlah soal&lt;b&gt;50 butir&lt;/b&gt;&lt;/div&gt;
      &lt;div class="meta-chip"&gt;Opsi jawaban&lt;b&gt;5 (A–E)&lt;/b&gt;&lt;/div&gt;
      &lt;div class="meta-chip"&gt;KKM&lt;b&gt;75&lt;/b&gt;&lt;/div&gt;
      &lt;div class="meta-chip"&gt;Kesempatan&lt;b&gt;3 kali&lt;/b&gt;&lt;/div&gt;
    &lt;/div&gt;
  &lt;/header&gt;

  &lt;div id="screen-intro" class="card"&gt;
    &lt;h2&gt;Sebelum mengerjakan&lt;/h2&gt;
    &lt;p style="font-size:14px;"&gt;Setiap peserta mendapat susunan soal dan urutan opsi jawaban yang berbeda-beda, jadi jangan heran jika berbeda dengan teman sebangku. Kamu punya &lt;b&gt;3 kali kesempatan&lt;/b&gt;. Begitu skor mencapai atau melebihi KKM (75), nilai itu langsung tersimpan sebagai nilai akhir. Jika sampai percobaan ke-3 belum mencapai KKM, sistem otomatis menyimpan &lt;b&gt;nilai tertinggi&lt;/b&gt; dari ketiga percobaanmu.&lt;/p&gt;
    &lt;p style="font-size:14px;"&gt;Isi No. Absen yang sama setiap kali mencoba, supaya sistem bisa menghitung sisa kesempatanmu dengan benar.&lt;/p&gt;

    &lt;label for="absen"&gt;No. Absen&lt;/label&gt;
    &lt;input type="number" id="absen" placeholder="Contoh: 14" min="1"&gt;
    &lt;label for="nama"&gt;Nama Lengkap&lt;/label&gt;
    &lt;input type="text" id="nama" placeholder="Tulis nama lengkapmu"&gt;
    &lt;div class="err" id="introErr"&gt;Isi No. Absen dan Nama Lengkap terlebih dahulu.&lt;/div&gt;
    &lt;button class="btn btn-primary" id="btnCekStatus"&gt;Lanjutkan&lt;/button&gt;
  &lt;/div&gt;

  &lt;div id="screen-status" class="card hidden"&gt;
    &lt;h2 id="statusGreeting"&gt;&lt;/h2&gt;
    &lt;div id="statusBody"&gt;&lt;/div&gt;
    &lt;button class="btn btn-secondary" id="btnMulai"&gt;Mulai Mengerjakan&lt;/button&gt;
    &lt;button class="btn" id="btnGanti" style="background:transparent;border:1px solid var(--line);"&gt;Ganti No. Absen&lt;/button&gt;
  &lt;/div&gt;

  &lt;div id="screen-quiz" class="hidden"&gt;
    &lt;div id="progressWrap"&gt;
      &lt;div id="progressBar"&gt;&lt;div id="progressFill"&gt;&lt;/div&gt;&lt;/div&gt;
      &lt;div id="progressText"&gt;0 dari 50 soal terjawab&lt;/div&gt;
    &lt;/div&gt;
    &lt;div id="quizBody"&gt;&lt;/div&gt;
    &lt;div class="err" id="quizErr"&gt;Masih ada soal yang belum dijawab. Lengkapi seluruh soal sebelum mengirim.&lt;/div&gt;
    &lt;button class="btn btn-primary" id="btnKirim"&gt;Kirim Jawaban&lt;/button&gt;
  &lt;/div&gt;

  &lt;div id="screen-result" class="card hidden"&gt;
    &lt;div id="resultBoxOuter"&gt;&lt;/div&gt;
    &lt;div class="attempt-log" id="attemptLog"&gt;&lt;/div&gt;
    &lt;button class="btn btn-secondary hidden" id="btnCobaLagi"&gt;Coba Lagi&lt;/button&gt;
    &lt;button class="btn" id="btnSelesai" style="background:transparent;border:1px solid var(--line);"&gt;Kembali ke Awal&lt;/button&gt;
  &lt;/div&gt;

  &lt;footer&gt;DOK/B.INDO/XI/PROSEDUR-UH1 — Ulangan Harian 1, 50 Butir, Pokok Bahasan Petunjuk Kerja&lt;/footer&gt;
&lt;/div&gt;

&lt;script&gt;
const GROUPS = [
{
  title: "Teks 1 — Cara Mengganti Oli Sepeda Motor",
  stimulus: "Mengganti oli mesin secara berkala menjaga performa sepeda motor tetap optimal. Berikut langkah mengganti oli mesin sepeda motor jenis matic.\n\nAlat dan bahan: kunci pas 17, wadah penampung oli bekas, oli mesin baru sesuai spesifikasi pabrikan, corong, kain lap.\n\nLangkah-langkah:\n1) Panaskan mesin selama tiga menit agar oli lama lebih mudah mengalir, lalu matikan mesin.\n2) Letakkan wadah penampung tepat di bawah baut pembuangan oli.\n3) Buka baut pembuangan oli menggunakan kunci pas 17 secara perlahan agar oli tidak tumpah ke luar wadah.\n4) Biarkan oli lama mengalir habis selama kurang lebih lima menit.\n5) Pasang kembali baut pembuangan oli dan kencangkan hingga rapat, tetapi jangan berlebihan agar ulir baut tidak rusak.\n6) Buka tutup pengisian oli, lalu tuangkan oli baru menggunakan corong sesuai takaran yang tertera pada buku manual.\n7) Pasang kembali tutup pengisian oli, nyalakan mesin, dan periksa ketinggian oli menggunakan dipstick.",
  questions: [
    {q:"Alat yang digunakan untuk membuka baut pembuangan oli adalah...", opts:["Obeng plus","Kunci pas 17","Tang kombinasi","Kunci inggris","Kunci L"], correct:1},
    {q:"Berdasarkan teks, mesin perlu dipanaskan sebelum oli dikuras dengan tujuan...", opts:["Mempercepat proses pemasangan baut","Membuat oli lama lebih mudah mengalir","Mendinginkan komponen mesin","Mengurangi tekanan pada karburator","Menstabilkan putaran mesin"], correct:1},
    {q:"Jika langkah ke-3 dan ke-5 pada teks tersebut ditukar urutannya, akibat yang paling mungkin terjadi adalah...", opts:["Oli baru akan tercampur dengan oli lama","Baut pembuangan tidak dapat dibuka sama sekali","Oli lama tidak dapat dikeluarkan karena baut belum dibuka saat wadah sudah terpasang","Proses penggantian oli menjadi lebih cepat","Tidak ada perbedaan hasil karena urutan bebas"], correct:2},
    {q:"Kalimat \"kencangkan hingga rapat, tetapi jangan berlebihan agar ulir baut tidak rusak\" berfungsi sebagai...", opts:["Latar belakang masalah","Peringatan sekaligus alasan tindakan","Kesimpulan prosedur","Tujuan utama teks","Definisi istilah teknis"], correct:1},
    {q:"Informasi yang TIDAK termuat secara eksplisit dalam teks tersebut adalah...", opts:["Jenis kunci yang digunakan","Lama waktu memanaskan mesin","Interval jarak tempuh ideal untuk mengganti oli","Alat untuk mengecek ketinggian oli","Tujuan memasang wadah penampung"], correct:2}
  ]
},
{
  title: "Teks 2 — Petunjuk Penggunaan Alat Pemadam Api Ringan (APAR)",
  stimulus: "Alat Pemadam Api Ringan (APAR) jenis serbuk kimia kering merupakan alat pertolongan pertama saat terjadi kebakaran skala kecil. Ikuti langkah berikut saat menggunakan APAR, yang dikenal dengan istilah PASS.\n\n1) Pull (tarik): Tarik pin pengaman yang terdapat pada bagian atas tabung.\n2) Aim (arahkan): Arahkan corong atau selang ke titik api, bukan ke kobaran asap.\n3) Squeeze (tekan): Tekan tuas atau pemicu secara mantap agar media pemadam keluar.\n4) Sweep (ayunkan): Ayunkan corong ke kiri dan ke kanan menyapu dasar api hingga api benar-benar padam.\n\nSebelum menggunakan APAR, pastikan posisi tubuh membelakangi arah angin agar asap dan media pemadam tidak mengenai wajah. Setelah kebakaran padam, jangan langsung meninggalkan lokasi; tunggu beberapa saat untuk memastikan tidak ada bara api yang menyala kembali.",
  questions: [
    {q:"Singkatan PASS pada teks tersebut merujuk pada...", opts:["Empat jenis APAR","Empat tahapan menggunakan APAR","Empat bahan pemadam api","Empat lokasi penyimpanan APAR","Empat ukuran tabung"], correct:1},
    {q:"Bagian tabung yang pertama kali harus ditarik adalah...", opts:["Selang","Corong","Pin pengaman","Tuas pemicu","Label tabung"], correct:2},
    {q:"Tujuan mengarahkan corong ke titik api, bukan ke kobaran asap adalah...", opts:["Agar media pemadam lebih hemat","Karena asap tidak mengandung oksigen","Agar sumber api langsung padam, bukan hanya menghilangkan asapnya","Supaya pengguna tidak terlihat panik","Karena asap dapat merusak tabung APAR"], correct:2},
    {q:"Posisi tubuh membelakangi arah angin saat memadamkan api bertujuan untuk...", opts:["Mempercepat proses penyemprotan","Menghindari asap dan media pemadam mengenai wajah pengguna","Membuat api lebih cepat menyebar","Mengurangi tekanan dalam tabung","Memudahkan pengambilan tabung cadangan"], correct:1},
    {q:"Simpulan yang paling tepat berdasarkan seluruh isi teks tersebut adalah...", opts:["APAR hanya dapat digunakan oleh petugas pemadam kebakaran profesional","Penggunaan APAR memerlukan urutan tindakan dan kewaspadaan hingga api benar-benar padam","APAR jenis serbuk kimia kering tidak boleh digunakan untuk kebakaran skala kecil","Kobaran asap lebih berbahaya daripada api itu sendiri","Tuas pemicu hanya berfungsi jika pin belum dilepas"], correct:1}
  ]
},
{
  title: "Teks 3 — Dua Metode Menyeduh Kopi (Perbandingan)",
  stimulus: "Teks A — Menyeduh Kopi Metode V60\nAlat: dripper V60, kertas filter, kopi bubuk giling sedang-halus 15 gram, air panas suhu 92-96°C, timbangan, kettle leher angsa.\nLangkah: 1) Basahi kertas filter dengan air panas untuk menghilangkan aroma kertas. 2) Masukkan kopi bubuk ke dalam filter, ratakan permukaannya. 3) Tuang air panas sedikit demi sedikit membentuk gerakan memutar selama 30 detik untuk proses blooming. 4) Lanjutkan menuang air secara bertahap hingga total air mencapai 250 ml dalam waktu sekitar tiga menit. 5) Biarkan air menetes habis sebelum dripper diangkat.\n\nTeks B — Menyeduh Kopi Metode Tubruk\nAlat: cangkir atau gelas tahan panas, kopi bubuk kasar 10 gram, air panas suhu 90°C, sendok.\nLangkah: 1) Masukkan kopi bubuk langsung ke dalam cangkir. 2) Tuangkan air panas hingga cangkir hampir penuh. 3) Aduk sebentar agar bubuk kopi tercampur rata dengan air. 4) Diamkan selama tiga hingga empat menit hingga ampas kopi mengendap di dasar cangkir. 5) Kopi siap dinikmati tanpa perlu disaring.",
  questions: [
    {q:"Perbedaan utama alat yang digunakan pada kedua metode tersebut adalah...", opts:["Metode V60 tidak memerlukan air panas","Metode V60 menggunakan dripper dan kertas filter, sedangkan metode tubruk tidak","Metode tubruk memerlukan timbangan, metode V60 tidak","Kedua metode sama-sama tidak menggunakan air panas","Metode tubruk memerlukan kettle leher angsa"], correct:1},
    {q:"Persamaan dari kedua prosedur penyeduhan kopi tersebut adalah...", opts:["Keduanya menggunakan kertas filter","Keduanya memerlukan proses penyaringan","Keduanya menggunakan air panas dan kopi bubuk sebagai bahan utama","Keduanya menghasilkan volume kopi yang sama persis","Keduanya membutuhkan waktu penyeduhan yang identik"], correct:2},
    {q:"Ukuran gilingan kopi pada metode V60 lebih halus dibandingkan metode tubruk. Hal ini kemungkinan besar berkaitan dengan...", opts:["Warna kopi yang dihasilkan","Adanya proses penyaringan menggunakan kertas filter pada metode V60","Suhu air yang digunakan","Jenis cangkir yang dipakai","Lama waktu penyimpanan kopi bubuk"], correct:1},
    {q:"Jika seseorang tidak memiliki kertas filter maupun dripper tetapi ingin menikmati kopi dengan cepat tanpa proses penuangan bertahap, metode yang paling sesuai untuk direkomendasikan adalah...", opts:["Metode V60, karena hasilnya lebih jernih","Metode tubruk, karena alat yang dibutuhkan lebih sederhana dan langkahnya lebih singkat","Kedua metode sama-sama tidak dapat dilakukan","Metode V60, karena prosesnya lebih cepat daripada tubruk","Tidak dapat ditentukan karena teks tidak membahas kecepatan penyeduhan"], correct:1},
    {q:"Lama waktu penuangan air pada metode V60 hingga mencapai 250 ml adalah sekitar...", opts:["30 detik","1 menit","3 menit","5 menit","10 menit"], correct:2}
  ]
},
{
  title: "Teks 4 — Langkah Mendaftar Akun SIAKAD Sekolah",
  stimulus: "Berikut langkah pendaftaran akun SIAKAD bagi peserta didik baru.\n1) Buka peramban (browser) lalu ketik alamat siakad.sekolah.sch.id pada bilah alamat.\n2) Klik tombol \"Daftar Akun Baru\" yang terletak di pojok kanan atas laman.\n3) Isi formulir menggunakan Nomor Induk Siswa (NIS) dan tanggal lahir sesuai data yang tercatat di tata usaha.\n4) Buat kata sandi yang terdiri atas kombinasi huruf, angka, dan simbol, minimal delapan karakter.\n5) Klik tombol \"Kirim\", kemudian periksa surel (email) untuk menemukan tautan aktivasi akun.\n6) Klik tautan aktivasi tersebut dalam waktu 24 jam agar akun tidak perlu didaftarkan ulang.\n7) Masuk (login) ke SIAKAD menggunakan NIS dan kata sandi yang telah dibuat.",
  questions: [
    {q:"Data yang digunakan untuk mengisi formulir pendaftaran adalah...", opts:["Nomor telepon dan alamat rumah","NIS dan tanggal lahir","Nama orang tua dan pekerjaan","Alamat surel dan nomor rekening","Nomor induk kependudukan dan agama"], correct:1},
    {q:"Tautan aktivasi akun dikirimkan melalui...", opts:["Pesan singkat (SMS)","Aplikasi SIAKAD langsung","Surel (email)","Media sosial sekolah","Surat resmi dari tata usaha"], correct:2},
    {q:"Batas waktu mengklik tautan aktivasi sebagaimana disebutkan dalam teks adalah...", opts:["1 jam","12 jam","24 jam","48 jam","7 hari"], correct:2},
    {q:"Apabila siswa tidak mengklik tautan aktivasi dalam batas waktu yang ditentukan, konsekuensi yang paling mungkin terjadi berdasarkan teks adalah...", opts:["Akun otomatis aktif dengan sendirinya","Siswa harus mendaftarkan akun dari awal","Kata sandi akan direset otomatis oleh sistem","Data NIS akan terhapus dari sistem sekolah","Tidak ada konsekuensi apa pun"], correct:1},
    {q:"Kalimat \"Buat kata sandi yang terdiri atas kombinasi huruf, angka, dan simbol, minimal delapan karakter\" termasuk ke dalam unsur kebahasaan teks prosedur berupa...", opts:["Kalimat tanya","Kalimat larangan","Kalimat perintah (imperatif) yang memuat syarat/batasan","Kalimat pengandaian","Kalimat pasif"], correct:2}
  ]
},
{
  title: "Teks 5 — Kaidah Kebahasaan Teks Prosedur",
  stimulus: "Teks prosedur memiliki ciri kebahasaan yang khas agar pembaca dapat melaksanakan langkah-langkah dengan tepat. Beberapa ciri tersebut antara lain: penggunaan kalimat imperatif (perintah) seperti \"potong\", \"aduk\", atau \"tekan\"; penggunaan konjungsi temporal seperti \"kemudian\", \"setelah itu\", dan \"selanjutnya\" untuk menunjukkan urutan langkah; penggunaan kata kerja aktif yang menyatakan tindakan konkret; penggunaan kalimat larangan yang biasanya ditandai kata \"jangan\" atau \"hindari\" untuk memberi peringatan; serta penggunaan keterangan alat, bahan, ukuran, atau waktu secara spesifik dan terukur.",
  questions: [
    {q:"Kata yang termasuk konjungsi temporal dalam teks prosedur adalah...", opts:["Karena","Kemudian","Meskipun","Walaupun","Namun"], correct:1},
    {q:"Kalimat \"Jangan menyentuh permukaan wajan yang masih panas\" merupakan contoh kalimat...", opts:["Kalimat tanya","Kalimat larangan","Kalimat berita","Kalimat pengandaian","Kalimat majemuk setara"], correct:1},
    {q:"Fungsi utama konjungsi temporal dalam teks prosedur adalah...", opts:["Menghubungkan dua kalimat yang bertentangan","Menunjukkan urutan atau tahapan pelaksanaan langkah","Menyatakan sebab akibat suatu tindakan","Menyatakan syarat sebuah tindakan","Menyatakan tujuan akhir prosedur"], correct:1},
    {q:"Manakah kalimat berikut yang menggunakan kata kerja imperatif dengan tepat?", opts:["Adonan itu diaduk oleh koki","Adonan akan diaduk hingga rata","Aduklah adonan hingga rata","Adonan telah diaduk hingga rata","Adonan sedang diaduk oleh asisten koki"], correct:2},
    {q:"Perhatikan kalimat berikut: \"Panaskan oven pada suhu 180°C selama sepuluh menit sebelum adonan dimasukkan.\" Unsur kebahasaan yang paling menonjol pada kalimat tersebut, selain kalimat imperatif, adalah...", opts:["Konjungsi pertentangan","Keterangan ukuran/suhu dan waktu yang spesifik dan terukur","Kalimat tanya retoris","Kata kerja pasif","Kalimat majemuk bertingkat sebab-akibat"], correct:1}
  ]
},
{
  title: "Teks 6 — Cara Membuat Pot Bunga dari Botol Plastik Bekas",
  stimulus: "Pot bunga dari botol plastik bekas dapat menjadi solusi ramah lingkungan sekaligus mempercantik halaman rumah.\n\nBahan: botol plastik bekas ukuran 1,5 liter, cutter, spidol, tali rafia, cat akrilik, kuas.\n\nLangkah:\n1) Gambar pola potongan pada botol menggunakan spidol sesuai bentuk pot yang diinginkan.\n2) Potong botol mengikuti pola menggunakan cutter dengan hati-hati.\n3) Buang bagian atas botol yang tidak digunakan.\n4) Warnai permukaan botol menggunakan cat akrilik sesuai selera, lalu keringkan selama satu jam.\n5) Lubangi bagian bawah pot menggunakan cutter untuk saluran pembuangan air.\n6) Pot siap diisi dengan tanah dan tanaman hias.",
  questions: [
    {q:"Alat yang digunakan untuk memotong botol plastik adalah...", opts:["Gunting kertas","Cutter","Spidol","Kuas","Tali rafia"], correct:1},
    {q:"Teks prosedur tersebut kurang lengkap dalam hal...", opts:["Bahan yang diperlukan","Aspek keselamatan kerja saat menggunakan cutter, misalnya penggunaan alas potong atau sarung tangan","Warna cat yang harus digunakan","Jenis tanaman yang cocok","Urutan langkah pembuatan pot"], correct:1},
    {q:"Tujuan melubangi bagian bawah pot pada langkah kelima adalah...", opts:["Memperindah tampilan pot","Membuat saluran pembuangan air agar tanaman tidak tergenang","Mengurangi berat pot","Memudahkan proses pengecatan","Menambah kekuatan struktur pot"], correct:1},
    {q:"Jika langkah keempat (mewarnai) dilakukan sebelum langkah kedua (memotong botol), akibat yang paling mungkin terjadi adalah...", opts:["Hasil akhir pot akan lebih rapi","Proses pengecatan menjadi kurang efisien karena bagian yang akan dibuang ikut diwarnai","Warna cat tidak akan menempel sama sekali","Botol akan lebih mudah dipotong","Tidak ada perbedaan hasil akhir"], correct:1},
    {q:"Simpulan paling tepat mengenai kualitas penyajian teks prosedur tersebut adalah...", opts:["Teks sudah sangat lengkap tanpa kekurangan","Teks cukup runtut dan jelas, tetapi perlu ditambahkan informasi terkait keselamatan kerja","Teks tidak dapat dipahami karena tidak memuat bahan","Urutan langkah pada teks tersebut tidak logis","Teks tidak memenuhi struktur teks prosedur sama sekali"], correct:1}
  ]
},
{
  title: "Teks 7 — Petunjuk Mengoperasikan Mesin Bubut Sederhana",
  stimulus: "Sebelum mengoperasikan mesin bubut, operator wajib memahami langkah keselamatan dan pengoperasian berikut.\n1) Kenakan alat pelindung diri berupa kacamata safety dan pakaian kerja yang pas di badan, hindari pakaian longgar yang dapat tersangkut komponen berputar.\n2) Periksa benda kerja dan pastikan tercekam kuat pada chuck sebelum mesin dinyalakan.\n3) Atur kecepatan putar (rpm) sesuai jenis material yang akan dibubut; gunakan kecepatan rendah untuk material keras dan kecepatan tinggi untuk material lunak.\n4) Nyalakan mesin dan dekatkan pahat secara perlahan ke benda kerja.\n5) Lakukan pemakanan (feeding) secara bertahap, jangan terlalu dalam agar pahat tidak patah.\n6) Setelah selesai, matikan mesin terlebih dahulu sebelum melepas benda kerja dari chuck.",
  questions: [
    {q:"Alat pelindung diri yang disebutkan dalam teks adalah...", opts:["Helm proyek","Kacamata safety","Sarung tangan karet","Masker respirator","Sepatu boots"], correct:1},
    {q:"Sebelum mesin dinyalakan, hal yang harus dipastikan operator adalah...", opts:["Kecepatan rpm sudah maksimal","Benda kerja tercekam kuat pada chuck","Pahat sudah patah","Mesin dalam keadaan mati total","Ruangan dalam keadaan gelap"], correct:1},
    {q:"Alasan pakaian longgar dilarang dikenakan saat mengoperasikan mesin bubut adalah...", opts:["Membuat operator terlihat kurang rapi","Dapat tersangkut pada komponen mesin yang berputar dan membahayakan keselamatan","Mengurangi kenyamanan gerak operator","Tidak sesuai dengan standar seragam sekolah","Menghambat proses pemakanan benda kerja"], correct:1},
    {q:"Pengaturan kecepatan putar (rpm) pada langkah ketiga bergantung pada...", opts:["Ukuran ruangan bengkel","Jenis material benda kerja","Warna benda kerja","Berat badan operator","Waktu pengerjaan yang tersedia"], correct:1},
    {q:"Mengapa mesin harus dimatikan terlebih dahulu sebelum benda kerja dilepas dari chuck?", opts:["Agar proses pelepasan lebih cepat","Untuk menghindari cedera akibat komponen mesin yang masih berputar","Karena chuck tidak dapat dibuka saat mesin menyala","Agar rpm dapat diatur ulang","Karena benda kerja akan otomatis terlepas saat mesin mati"], correct:1}
  ]
},
{
  title: "Teks 8 — Cara Mengisi Baterai Ponsel dengan Aman",
  stimulus: "Pengisian daya baterai yang tidak tepat dapat memperpendek usia baterai ponsel. Berikut langkah pengisian daya yang disarankan.\n1) Gunakan kepala charger dan kabel asli atau yang sesuai standar keluaran daya ponsel.\n2) Hindari mengisi daya di tempat yang lembap atau terkena sinar matahari langsung.\n3) Colokkan kabel ke ponsel terlebih dahulu, kemudian sambungkan ke sumber listrik.\n4) Jangan gunakan ponsel untuk bermain gim atau menonton video secara intensif saat sedang diisi daya karena dapat meningkatkan suhu perangkat.\n5) Cabut charger setelah baterai mencapai kapasitas penuh; membiarkan ponsel terus terhubung dalam waktu lama secara berulang dapat mengurangi umur baterai.",
  questions: [
    {q:"Sumber listrik disambungkan pada urutan langkah ke berapa?", opts:["Pertama","Kedua","Ketiga","Keempat","Kelima"], correct:2},
    {q:"Larangan menggunakan ponsel untuk bermain gim saat pengisian daya bertujuan untuk...", opts:["Menghemat kuota internet","Mencegah kenaikan suhu perangkat yang berlebihan","Mempercepat proses pengisian daya","Menghindari kerusakan layar sentuh","Menjaga kecerahan layar tetap stabil"], correct:1},
    {q:"Pernyataan yang sesuai dengan isi teks tersebut adalah...", opts:["Ponsel boleh diisi daya di tempat lembap asalkan menggunakan charger asli","Membiarkan ponsel terhubung ke charger dalam waktu lama secara berulang tidak berpengaruh pada baterai","Kepala charger dan kabel sebaiknya sesuai standar keluaran daya ponsel","Bermain gim saat pengisian daya justru dianjurkan agar baterai lebih awet","Sinar matahari langsung dianjurkan agar pengisian daya lebih cepat"], correct:2},
    {q:"Simpulan yang dapat ditarik dari keseluruhan teks tersebut adalah...", opts:["Usia baterai ponsel tidak dipengaruhi oleh cara pengisian daya","Kebiasaan pengisian daya yang tepat dapat membantu menjaga usia baterai ponsel tetap optimal","Ponsel sebaiknya selalu terhubung dengan charger sepanjang waktu","Charger tidak asli lebih baik digunakan karena lebih murah","Suhu perangkat tidak berkaitan dengan usia baterai"], correct:1},
    {q:"Hal yang harus dihindari saat mengisi daya ponsel menurut teks adalah tempat yang...", opts:["Sejuk dan kering","Lembap dan terkena sinar matahari langsung","Gelap dan sepi","Dekat dengan jendela","Jauh dari sumber listrik"], correct:1}
  ]
},
{
  title: "Teks 9 — Menyusun Teks Prosedur yang Baik",
  stimulus: "Sebuah teks prosedur yang baik disusun dengan struktur yang jelas, yaitu: (1) judul yang menggambarkan tujuan prosedur secara ringkas, (2) tujuan atau pengantar yang menjelaskan hasil akhir yang ingin dicapai, (3) daftar alat dan bahan (jika diperlukan), dan (4) langkah-langkah yang disusun secara runtut dan bernomor. Setiap langkah sebaiknya ditulis dengan kalimat yang singkat, jelas, dan tidak menimbulkan makna ganda. Penulis juga perlu memastikan bahwa tidak ada langkah penting yang terlewat, karena satu langkah yang hilang dapat menyebabkan pembaca gagal melaksanakan prosedur dengan benar.",
  questions: [
    {q:"Struktur teks prosedur yang disebutkan dalam teks tersebut terdiri atas empat bagian, salah satunya adalah...", opts:["Orientasi","Daftar alat dan bahan","Resolusi","Koda","Abstrak"], correct:1},
    {q:"Alasan setiap langkah dalam teks prosedur harus ditulis dengan kalimat yang tidak menimbulkan makna ganda adalah...", opts:["Agar teks terlihat lebih panjang","Supaya pembaca dapat melaksanakan langkah dengan tepat sesuai maksud penulis","Agar teks memenuhi syarat jumlah kata minimal","Supaya pembaca merasa terhibur","Agar teks dapat dikategorikan sebagai karya sastra"], correct:1},
    {q:"Akibat yang paling mungkin terjadi apabila satu langkah penting dalam teks prosedur terlewat adalah...", opts:["Pembaca akan lebih cepat menyelesaikan prosedur","Pembaca berpotensi gagal melaksanakan prosedur dengan benar","Teks menjadi lebih ringkas dan efektif","Tidak berpengaruh apa pun terhadap hasil akhir","Pembaca akan otomatis menambahkan langkah yang hilang"], correct:1},
    {q:"Seorang siswa menulis teks prosedur \"Cara Membuat Nasi Goreng\" namun langsung menuliskan langkah-langkah tanpa mencantumkan bahan yang diperlukan. Berdasarkan teks di atas, kekurangan tulisan siswa tersebut adalah...", opts:["Tidak memiliki judul","Tidak mencantumkan daftar alat dan bahan yang diperlukan sebelum langkah-langkah","Menggunakan kalimat imperatif","Langkah-langkah tidak diberi nomor","Menggunakan konjungsi temporal"], correct:1},
    {q:"Bagian yang menjelaskan hasil akhir yang ingin dicapai dalam teks prosedur disebut...", opts:["Daftar bahan","Tujuan/pengantar","Penutup","Judul","Simpulan"], correct:1}
  ]
},
{
  title: "Teks 10 — Dua Contoh Petunjuk Merakit Rak Buku (Perbandingan)",
  stimulus: "Teks A — Cara Merakit Rak Buku Knock-Down\nAlat dan bahan: obeng plus, papan rak (5 bagian), sekrup (20 buah), dowel kayu (8 buah).\nLangkah:\n1) Susun papan alas dan dua papan samping membentuk huruf U, lalu satukan menggunakan dowel kayu.\n2) Kencangkan sambungan menggunakan sekrup dan obeng plus.\n3) Pasang papan tengah sebagai sekat rak sesuai jarak yang diinginkan.\n4) Pasang papan atas sebagai penutup rak, lalu kencangkan seluruh sekrup hingga rak kokoh berdiri.\n\nTeks B — Cara Merakit Rak Buku\nSiapkan bahan-bahannya. Lalu pasang semua bagian. Kencangkan bagian yang perlu dikencangkan. Setelah itu rak sudah jadi dan siap digunakan.",
  questions: [
    {q:"Perbedaan mencolok antara Teks A dan Teks B adalah...", opts:["Teks A tidak memiliki langkah, Teks B memiliki langkah rinci","Teks A memuat langkah yang rinci dan terukur, sedangkan Teks B ditulis secara umum dan kurang jelas","Teks B mencantumkan alat dan bahan, Teks A tidak","Kedua teks sama-sama rinci dan mudah diikuti","Teks A lebih pendek daripada Teks B"], correct:1},
    {q:"Kalimat \"pasang semua bagian\" pada Teks B dinilai kurang efektif sebagai kalimat prosedur karena...", opts:["Menggunakan kalimat imperatif","Tidak menjelaskan bagian mana yang dipasang dan bagaimana cara memasangnya secara spesifik","Menggunakan konjungsi temporal","Terlalu panjang untuk dipahami","Tidak menggunakan huruf kapital di awal kalimat"], correct:1},
    {q:"Jika seseorang yang belum pernah merakit rak buku hanya diberikan Teks B, kemungkinan besar yang akan terjadi adalah...", opts:["Ia dapat merakit rak dengan sangat mudah karena instruksinya sudah lengkap","Ia akan kesulitan karena teks tidak menjelaskan alat, bahan, dan langkah secara rinci","Ia akan merakit rak lebih cepat dibandingkan menggunakan Teks A","Tidak ada perbedaan hasil rakitan antara menggunakan Teks A atau Teks B","Teks B lebih mudah dipahami karena lebih singkat"], correct:1},
    {q:"Berdasarkan perbandingan kedua teks tersebut, kesimpulan yang paling tepat mengenai kualitas sebuah teks prosedur adalah...", opts:["Semakin singkat sebuah teks prosedur, semakin baik kualitasnya","Kualitas teks prosedur ditentukan oleh kelengkapan alat/bahan serta kejelasan dan keterukuran setiap langkahnya","Teks prosedur tidak memerlukan daftar alat dan bahan","Teks prosedur yang baik tidak perlu menggunakan angka atau ukuran","Panjang pendeknya teks tidak berpengaruh pada pemahaman pembaca"], correct:1},
    {q:"Apabila Teks B ingin diperbaiki agar setara dengan kualitas Teks A, revisi yang paling tepat dilakukan adalah...", opts:["Menghapus seluruh langkah yang ada","Mengganti judul teks menjadi lebih panjang","Menambahkan daftar alat dan bahan serta merincikan setiap langkah secara spesifik dan berurutan","Mengubah seluruh kalimat menjadi kalimat tanya","Menghilangkan tanda baca pada setiap kalimat"], correct:2}
  ]
}
];

const LETTERS = ["A","B","C","D","E"];
const KKM = 75;
const MAX_ATTEMPT = 3;
let currentAbsen = null, currentNama = null, currentRecord = null;
let quizGroups = null;
let answers = {};

function shuffle(arr){
  const a = arr.slice();
  for(let i=a.length-1;i&gt;0;i--){
    const j = Math.floor(Math.random()*(i+1));
    [a[i],a[j]] = [a[j],a[i]];
  }
  return a;
}

function buildShuffledQuiz(){
  const groupOrder = shuffle(GROUPS);
  return groupOrder.map(g =&gt; ({
    title: g.title,
    stimulus: g.stimulus,
    questions: shuffle(g.questions).map(q =&gt; {
      const optIdx = shuffle(q.opts.map((_,i)=&gt;i));
      return {
        q: q.q,
        opts: optIdx.map(i =&gt; q.opts[i]),
        correctLetter: LETTERS[optIdx.indexOf(q.correct)]
      };
    })
  }));
}

async function loadRecord(absen){
  try{
    const r = await window.storage.get('siswa:'+absen, true);
    return r ? JSON.parse(r.value) : null;
  }catch(e){
    return null;
  }
}
async function saveRecord(absen, record){
  try{
    await window.storage.set('siswa:'+absen, JSON.stringify(record), true);
  }catch(e){
    console.error('Gagal menyimpan data', e);
  }
}

document.getElementById('btnCekStatus').addEventListener('click', async () =&gt; {
  const absenEl = document.getElementById('absen');
  const namaEl = document.getElementById('nama');
  const absen = absenEl.value.trim();
  const nama = namaEl.value.trim();
  const err = document.getElementById('introErr');
  if(!absen || !nama){
    err.style.display = 'block';
    return;
  }
  err.style.display = 'none';
  currentAbsen = absen;
  currentNama = nama;
  currentRecord = await loadRecord(absen);
  if(!currentRecord){
    currentRecord = {absen, nama, attempts: [], final: null};
  } else {
    currentRecord.nama = nama;
  }
  showStatusScreen();
});

document.getElementById('btnGanti').addEventListener('click', () =&gt; {
  document.getElementById('screen-status').classList.add('hidden');
  document.getElementById('screen-intro').classList.remove('hidden');
});

function showStatusScreen(){
  document.getElementById('screen-intro').classList.add('hidden');
  const statusScreen = document.getElementById('screen-status');
  statusScreen.classList.remove('hidden');
  document.getElementById('statusGreeting').textContent = 'Halo, ' + currentNama + ' (No. Absen ' + currentAbsen + ')';
  const body = document.getElementById('statusBody');
  const btnMulai = document.getElementById('btnMulai');
  const usedAttempts = currentRecord.attempts.length;
  const sisa = MAX_ATTEMPT - usedAttempts;

  if(currentRecord.final){
    const f = currentRecord.final;
    body.innerHTML =
      '&lt;p style="font-size:14px;"&gt;Nilai kamu sudah tersimpan sebagai nilai akhir.&lt;/p&gt;' +
      '&lt;div class="result-box ' + (f.score &gt;= KKM ? 'pass-bg' : 'fail-bg') + '" style="margin-top:10px;"&gt;' +
        '&lt;div style="font-size:13px;color:var(--ink-soft);"&gt;Nilai akhir tersimpan&lt;/div&gt;' +
        '&lt;div class="result-score ' + (f.score &gt;= KKM ? 'pass' : 'fail') + '"&gt;' + f.score + '&lt;/div&gt;' +
        '&lt;div style="font-size:13px;"&gt;' + (f.score &gt;= KKM ? 'Mencapai KKM (75)' : 'Nilai tertinggi dari 3 percobaan (belum mencapai KKM)') + '&lt;/div&gt;' +
      '&lt;/div&gt;' +
      renderAttemptListHTML(currentRecord.attempts);
    btnMulai.classList.add('hidden');
  } else if(sisa &lt;= 0){
    body.innerHTML = '&lt;p style="font-size:14px;"&gt;Kesempatanmu sudah habis. Sistem akan segera mencatat nilai tertinggimu.&lt;/p&gt;';
    btnMulai.classList.add('hidden');
  } else {
    body.innerHTML =
      '&lt;p style="font-size:14px;"&gt;Sisa kesempatan mengerjakan: &lt;b&gt;' + sisa + ' dari ' + MAX_ATTEMPT + '&lt;/b&gt;.&lt;/p&gt;' +
      (usedAttempts &gt; 0 ? renderAttemptListHTML(currentRecord.attempts) : '');
    btnMulai.classList.remove('hidden');
    btnMulai.textContent = usedAttempts === 0 ? 'Mulai Mengerjakan' : 'Coba Lagi (Percobaan ke-' + (usedAttempts+1) + ')';
  }
}

function renderAttemptListHTML(attempts){
  if(!attempts.length) return '';
  let html = '&lt;div class="attempt-log"&gt;&lt;b style="font-size:13px;"&gt;Riwayat percobaan:&lt;/b&gt;';
  attempts.forEach((a,i) =&gt; {
    html += '&lt;div&gt;&lt;span&gt;Percobaan ' + (i+1) + '&lt;/span&gt;&lt;span&gt;' + a.score + ' poin&lt;/span&gt;&lt;/div&gt;';
  });
  html += '&lt;/div&gt;';
  return html;
}

document.getElementById('btnMulai').addEventListener('click', startQuiz);

function startQuiz(){
  answers = {};
  quizGroups = buildShuffledQuiz();
  document.getElementById('screen-status').classList.add('hidden');
  document.getElementById('screen-result').classList.add('hidden');
  document.getElementById('screen-quiz').classList.remove('hidden');
  renderQuiz();
  window.scrollTo({top:0, behavior:'smooth'});
}

function renderQuiz(){
  const body = document.getElementById('quizBody');
  let html = '';
  let counter = 0;
  quizGroups.forEach((g, gi) =&gt; {
    html += '&lt;div class="qgroup"&gt;&lt;div class="stimulus"&gt;&lt;div class="st-title"&gt;' + esc(g.title) + '&lt;/div&gt;' + esc(g.stimulus) + '&lt;/div&gt;';
    g.questions.forEach((q, qi) =&gt; {
      counter++;
      const qKey = gi + '-' + qi;
      html += '&lt;div class="q" data-qkey="' + qKey + '"&gt;';
      html += '&lt;div class="q-num"&gt;Soal ' + counter + '&lt;/div&gt;';
      html += '&lt;div class="q-text"&gt;' + esc(q.q) + '&lt;/div&gt;';
      q.opts.forEach((opt, oi) =&gt; {
        const letter = LETTERS[oi];
        html += '&lt;label class="opt" data-qkey="' + qKey + '" data-letter="' + letter + '"&gt;' +
          '&lt;input type="radio" name="q-' + qKey + '" value="' + letter + '"&gt;' +
          '&lt;span&gt;&lt;b&gt;' + letter + '.&lt;/b&gt; ' + esc(opt) + '&lt;/span&gt;&lt;/label&gt;';
      });
      html += '&lt;/div&gt;';
    });
    html += '&lt;/div&gt;';
  });
  body.innerHTML = html;

  body.querySelectorAll('.opt').forEach(optEl =&gt; {
    optEl.addEventListener('click', () =&gt; {
      const qKey = optEl.getAttribute('data-qkey');
      const letter = optEl.getAttribute('data-letter');
      answers[qKey] = letter;
      document.querySelectorAll('.opt[data-qkey="' + qKey + '"]').forEach(o =&gt; o.classList.remove('selected'));
      optEl.classList.add('selected');
      optEl.querySelector('input').checked = true;
      updateProgress();
    });
  });
  updateProgress();
}

function esc(s){
  const d = document.createElement('div');
  d.textContent = s;
  return d.innerHTML;
}

function totalQuestions(){
  return quizGroups.reduce((sum,g) =&gt; sum + g.questions.length, 0);
}

function updateProgress(){
  const total = totalQuestions();
  const answered = Object.keys(answers).length;
  document.getElementById('progressFill').style.width = (answered/total*100) + '%';
  document.getElementById('progressText').textContent = answered + ' dari ' + total + ' soal terjawab';
}

document.getElementById('btnKirim').addEventListener('click', async () =&gt; {
  const total = totalQuestions();
  const answered = Object.keys(answers).length;
  const errEl = document.getElementById('quizErr');
  if(answered &lt; total){
    errEl.style.display = 'block';
    const firstUnanswered = document.querySelectorAll('.q')[
      (() =&gt; { for(let i=0;i&lt;document.querySelectorAll('.q').length;i++){
          const qk = document.querySelectorAll('.q')[i].getAttribute('data-qkey');
          if(!answers[qk]) return i;
        } return 0; })()
    ];
    if(firstUnanswered) firstUnanswered.scrollIntoView({behavior:'smooth', block:'center'});
    return;
  }
  errEl.style.display = 'none';

  let correctCount = 0;
  quizGroups.forEach((g, gi) =&gt; {
    g.questions.forEach((q, qi) =&gt; {
      const qKey = gi + '-' + qi;
      if(answers[qKey] === q.correctLetter) correctCount++;
    });
  });
  const score = correctCount * 2;

  currentRecord.attempts.push({score: score, timestamp: new Date().toISOString()});
  const usedAttempts = currentRecord.attempts.length;

  if(score &gt;= KKM){
    currentRecord.final = {score: score, source: 'kkm', attemptsUsed: usedAttempts};
  } else if(usedAttempts &gt;= MAX_ATTEMPT){
    const maxScore = Math.max(...currentRecord.attempts.map(a =&gt; a.score));
    currentRecord.final = {score: maxScore, source: 'tertinggi', attemptsUsed: usedAttempts};
  }

  await saveRecord(currentAbsen, currentRecord);
  showResult(score);
});

function showResult(score){
  document.getElementById('screen-quiz').classList.add('hidden');
  const resultScreen = document.getElementById('screen-result');
  resultScreen.classList.remove('hidden');

  const passedNow = score &gt;= KKM;
  const outer = document.getElementById('resultBoxOuter');
  const usedAttempts = currentRecord.attempts.length;
  const sisa = MAX_ATTEMPT - usedAttempts;

  let statusLine;
  if(currentRecord.final &amp;&amp; currentRecord.final.source === 'kkm'){
    statusLine = 'Selamat! Nilai ini sudah mencapai KKM dan tersimpan sebagai nilai akhir.';
  } else if(currentRecord.final &amp;&amp; currentRecord.final.source === 'tertinggi'){
    statusLine = 'Kesempatan sudah habis. Nilai tertinggi dari 3 percobaanmu (' + currentRecord.final.score + ') tersimpan sebagai nilai akhir.';
  } else {
    statusLine = 'Nilai belum mencapai KKM (75). Sisa kesempatan: ' + sisa + '.';
  }

  outer.innerHTML =
    '&lt;div class="result-box ' + (passedNow ? 'pass-bg' : 'fail-bg') + '"&gt;' +
      '&lt;div style="font-size:13px;color:var(--ink-soft);"&gt;Skor percobaan ini&lt;/div&gt;' +
      '&lt;div class="result-score ' + (passedNow ? 'pass' : 'fail') + '"&gt;' + score + ' / 100&lt;/div&gt;' +
      '&lt;div style="font-size:14px;"&gt;' + statusLine + '&lt;/div&gt;' +
    '&lt;/div&gt;';

  document.getElementById('attemptLog').innerHTML = renderAttemptListHTML(currentRecord.attempts);

  const btnCoba = document.getElementById('btnCobaLagi');
  if(!currentRecord.final &amp;&amp; sisa &gt; 0){
    btnCoba.classList.remove('hidden');
  } else {
    btnCoba.classList.add('hidden');
  }
  window.scrollTo({top:0, behavior:'smooth'});
}

document.getElementById('btnCobaLagi').addEventListener('click', startQuiz);

document.getElementById('btnSelesai').addEventListener('click', () =&gt; {
  document.getElementById('screen-result').classList.add('hidden');
  document.getElementById('screen-intro').classList.remove('hidden');
  document.getElementById('absen').value = '';
  document.getElementById('nama').value = '';
});
&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</description><link>http://kitab-investasi.blogspot.com/2026/09/ulangan-harian-1-petunjuk-kerja.html</link><thr:total>0</thr:total><author>nof_rizal07@yahoo.co.id (abang_cool)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-9000860041661554971.post-5290013737713810938</guid><pubDate>Fri, 04 Sep 2026 01:41:45 +0000</pubDate><atom:updated>2026-09-04T08:46:30.437+07:00</atom:updated><title>Latihan Soal Tipe AKM: Pokok Bahasan Petunjuk Kerja</title><description>&lt;style&gt;
@import url('https://fonts.googleapis.com/css2?family=Oswald:wght@400;500;600;700&amp;family=Source+Sans+3:wght@400;500;600;700&amp;family=IBM+Plex+Mono:wght@400;500;600&amp;display=swap');
.epb{
  --blueprint:#0F2A3D;
  --blueprint-deep:#0A1E2C;
  --panel:#4A2E12;
  --paper:#F3F0E6;
  --ink:#132029;
  --amber:#F5A623;
  --amber-deep:#C97F12;
  --mint:#6EC6CA;
  --line:rgba(234,242,245,0.16);
  --off-white:#EAF2F5;
  --muted:#9FB4C2;
}
.epb *{box-sizing:border-box;}
.epb{scroll-behavior:smooth; background:#0A1F2E;}
.epb{
  margin:0;
  position:relative;
  overflow:hidden;
  background:var(--blueprint);
  color:var(--off-white);
  font-family:'Source Sans 3',sans-serif;
  line-height:1.65;
  background-image:
    linear-gradient(var(--line) 1px, transparent 1px),
    linear-gradient(90deg, var(--line) 1px, transparent 1px);
  background-size: 34px 34px;
}
.epb h1, .epb h2, .epb h3, .epb h4{font-family:'Oswald',sans-serif; text-transform:uppercase; letter-spacing:0.02em; margin:0 0 0.5em;}
.epb .mono{font-family:'IBM Plex Mono',monospace;}
.epb a{color:var(--amber);}
.epb .crop{position:absolute; width:22px; height:22px; z-index:5; opacity:.55; pointer-events:none;}
.epb .crop::before, .epb .crop::after{content:"";position:absolute;background:var(--mint);}
.epb .crop::before{width:100%;height:1px;top:50%;left:0;}
.epb .crop::after{width:1px;height:100%;left:50%;top:0;}
.epb .crop.tl{top:14px;left:14px;}
.epb .crop.tr{top:14px;right:14px;}
.epb .crop.bl{bottom:14px;left:14px;}
.epb .crop.br{bottom:14px;right:14px;}
.epb header.cover{
  position:relative;
  padding:40px 24px 36px;
  border-bottom:1px solid var(--line);
  overflow:hidden;
}
.epb .doc-code{font-family:'IBM Plex Mono',monospace; color:var(--amber); letter-spacing:0.15em; font-size:0.78rem; text-transform:uppercase; margin-bottom:18px; display:flex; gap:10px; align-items:center;}
.epb .doc-code::before{content:"◆"; color:var(--amber);}
.epb .cover h1{font-size:clamp(1.6rem,7vw,2.5rem); color:var(--off-white); max-width:16ch; line-height:1.05;}
.epb .cover .subtitle{color:var(--muted); font-size:1.05rem; max-width:60ch; margin-top:14px;}
.epb .meta-strip{
  margin-top:38px; display:grid; grid-template-columns:repeat(auto-fit,minmax(150px,1fr));
  border-top:1px dashed var(--line); border-bottom:1px dashed var(--line);
}
.epb .meta-strip div{padding:14px 16px; border-right:1px dashed var(--line);}
.epb .meta-strip div:last-child{border-right:none;}
.epb .meta-strip .k{font-family:'IBM Plex Mono',monospace; font-size:0.68rem; color:var(--amber); text-transform:uppercase; letter-spacing:0.1em;}
.epb .meta-strip .v{font-size:0.98rem; color:var(--off-white); margin-top:4px; font-weight:600;}
.epb .stamp{
  position:absolute; top:40px; right:20px; width:104px; height:104px;
  border:2.5px solid var(--amber); border-radius:50%;
  display:flex; align-items:center; justify-content:center;
  transform:rotate(-11deg);
  color:var(--amber); font-family:'IBM Plex Mono',monospace;
  text-align:center; font-size:0.62rem; letter-spacing:0.08em; text-transform:uppercase;
  opacity:0.9;
}
.epb .stamp .ring{position:absolute; inset:8px; border:1px dashed var(--amber); border-radius:50%;}
.epb .stamp b{display:block; font-family:'Oswald',sans-serif; font-size:1.05rem; letter-spacing:0.06em; margin-top:4px;}

@media (max-width:760px){.epb .stamp{display:none;}
.epb }


.epb main{max-width:920px; margin:0 auto; padding:0 20px 60px;}
.epb .section{padding-top:64px;}
.epb .eyebrow{font-family:'IBM Plex Mono',monospace; color:var(--amber); font-size:0.78rem; letter-spacing:0.14em; text-transform:uppercase; margin-bottom:10px; display:flex; align-items:center; gap:10px;}
.epb .eyebrow::after{content:""; flex:1; height:1px; background:var(--line);}
.epb h2.section-title{font-size:1.7rem; color:var(--off-white);}
.epb p{color:#DDE7EC;}
.epb .lead{color:var(--muted); font-size:1.02rem; max-width:72ch;}
.epb .panel{
  background:var(--panel); border:1px solid var(--line); border-radius:2px;
  padding:26px 28px; margin:22px 0;
}
.epb .panel.tp{border-left:4px solid var(--mint);}
.epb .panel.warn{border-left:4px solid var(--amber);}
.epb .tp-box{display:grid; gap:14px; margin-top:18px;}
.epb .tp-item{display:flex; gap:14px; align-items:flex-start;}
.epb .tp-item .idx{font-family:'IBM Plex Mono',monospace; color:var(--amber); font-weight:600; min-width:34px;}
.epb .flow{display:grid; grid-template-columns:repeat(auto-fit,minmax(220px,1fr)); gap:14px; margin-top:20px;}
.epb .flow .step{background:var(--blueprint-deep); border:1px solid var(--line); padding:18px; position:relative;}
.epb .flow .step .tag{font-family:'IBM Plex Mono',monospace; color:var(--amber); font-size:0.7rem; letter-spacing:0.1em; text-transform:uppercase;}
.epb .flow .step h4{font-size:1rem; margin-top:8px; color:var(--off-white);}
.epb .flow .step .time{position:absolute; top:16px; right:16px; font-family:'IBM Plex Mono',monospace; font-size:0.7rem; color:var(--amber);}
.epb .grid-3{display:grid; grid-template-columns:repeat(auto-fit,minmax(200px,1fr)); gap:14px; margin-top:16px;}
.epb .card{background:var(--blueprint-deep); border:1px solid var(--line); padding:18px;}
.epb .card h4{color:var(--amber); font-size:0.95rem;}
.epb .criteria{display:grid; gap:16px; margin-top:20px;}
.epb .crit{
  background:var(--blueprint-deep); border:1px solid var(--line);
  display:grid; grid-template-columns:64px 1fr; gap:0;
}
.epb .crit .num{
  background:var(--amber); color:var(--blueprint-deep); font-family:'IBM Plex Mono',monospace;
  font-weight:700; display:flex; align-items:center; justify-content:center; font-size:1.05rem;
}
.epb .crit .body{padding:18px 20px;}
.epb .crit h4{color:var(--off-white); font-size:1.02rem; margin-bottom:6px;}
.epb .crit .q{margin-top:10px; padding-top:10px; border-top:1px dashed var(--line); font-family:'IBM Plex Mono',monospace; font-size:0.86rem; color:var(--amber);}
.epb .timeline{margin-top:24px; position:relative; padding-left:34px;}
.epb .timeline::before{content:""; position:absolute; left:11px; top:6px; bottom:6px; width:2px; background:var(--line);}
.epb .tl-item{position:relative; padding-bottom:26px;}
.epb .tl-item:last-child{padding-bottom:0;}
.epb .tl-item::before{content:""; position:absolute; left:-34px; top:2px; width:22px; height:22px; border-radius:50%; background:var(--blueprint); border:2px solid var(--amber);}
.epb .tl-item h4{color:var(--off-white); font-size:1rem; margin-bottom:4px;}
.epb .doc-sample{
  background:var(--paper); color:var(--ink); border-radius:2px; padding:0; margin-top:22px;
  box-shadow:0 20px 45px rgba(0,0,0,0.35);
}
.epb .doc-sample .doc-head{background:var(--ink); color:var(--paper); padding:12px 22px; font-family:'IBM Plex Mono',monospace; font-size:0.75rem; letter-spacing:0.1em; text-transform:uppercase; display:flex; justify-content:space-between;}
.epb .doc-sample .doc-body{padding:26px 28px 30px;}
.epb .doc-sample h3{font-family:'Oswald',sans-serif; color:var(--ink); font-size:1.25rem; text-transform:none; letter-spacing:0;}
.epb .doc-sample ol{padding-left:22px;}
.epb .doc-sample li{margin-bottom:9px;}
.epb .flag{
  display:inline-block; font-family:'IBM Plex Mono',monospace; font-size:0.7rem; font-weight:600;
  background:#D94E2A; color:#fff; padding:1px 7px; border-radius:2px; margin-left:6px; vertical-align:middle;
}
.epb .doc-sample .note-margin{margin-top:6px; font-family:'IBM Plex Mono',monospace; font-size:0.78rem; color:#8A3A1F; padding-left:8px; border-left:2px solid #D94E2A;}
.epb .legend{display:flex; flex-wrap:wrap; gap:10px 20px; margin-top:16px;}
.epb .legend span{font-family:'IBM Plex Mono',monospace; font-size:0.78rem; color:var(--muted); display:flex; align-items:center; gap:8px;}
.epb .legend .dot{width:10px; height:10px; border-radius:50%; display:inline-block;}
.epb table{width:100%; border-collapse:collapse; margin-top:18px; font-size:0.94rem;}
.epb th, .epb td{border:1px solid var(--line); padding:10px 12px; text-align:left; vertical-align:top;}
.epb th{background:var(--blueprint-deep); font-family:'IBM Plex Mono',monospace; font-size:0.75rem; text-transform:uppercase; letter-spacing:0.06em; color:var(--amber);}
.epb .summary-box{
  border:1px solid var(--amber); background:linear-gradient(180deg, rgba(245,166,35,0.08), transparent);
  padding:24px 26px; margin-top:24px;
}
.epb .summary-box ul{margin:10px 0 0; padding-left:20px;}
.epb .summary-box li{margin-bottom:8px;}
.epb .task-header{
  background:var(--amber); color:var(--blueprint-deep); padding:22px 26px; margin-top:20px;
  display:flex; justify-content:space-between; align-items:center; flex-wrap:wrap; gap:10px;
}
.epb .task-header h2{color:var(--blueprint-deep); font-size:1.4rem; margin:0;}
.epb .task-header .badge{font-family:'IBM Plex Mono',monospace; font-size:0.8rem; background:var(--blueprint-deep); color:var(--amber); padding:6px 12px; border-radius:2px;}
.epb .steps-num{counter-reset:step; margin-top:18px; list-style:none; padding:0;}
.epb .steps-num li{counter-increment:step; position:relative; padding-left:44px; margin-bottom:16px;}
.epb .steps-num li::before{content:counter(step,decimal-leading-zero); position:absolute; left:0; top:0; font-family:'IBM Plex Mono',monospace; color:var(--amber); font-weight:600; font-size:0.95rem; border:1px solid var(--amber); width:30px; height:26px; display:flex; align-items:center; justify-content:center;}
.epb .rubric-scale{display:grid; grid-template-columns:repeat(4,1fr); gap:10px; margin-top:16px;}
.epb .rubric-scale div{background:var(--blueprint-deep); border:1px solid var(--line); padding:12px; text-align:center;}
.epb .rubric-scale .n{font-family:'IBM Plex Mono',monospace; color:var(--amber); font-size:1.3rem; font-weight:700;}
.epb .rubric-scale .l{font-size:0.78rem; color:var(--muted); text-transform:uppercase; letter-spacing:0.05em;}
.epb .notebook{
  background:repeating-linear-gradient(var(--paper), var(--paper) 33px, #D8D3C2 34px);
  color:var(--ink); border-radius:2px; padding:28px 30px; margin-top:20px; position:relative;
  box-shadow:0 20px 45px rgba(0,0,0,0.35);
}
.epb .notebook::before{content:""; position:absolute; left:46px; top:0; bottom:0; width:1.5px; background:#C0453A; opacity:0.5;}
.epb .notebook .content{padding-left:24px;}
.epb .notebook h3{color:var(--ink); font-family:'Oswald',sans-serif; letter-spacing:0.02em; margin-bottom:10px;}
.epb .notebook ul{padding-left:20px;}
.epb footer{border-top:1px solid var(--line); padding:24px 20px 40px; color:var(--muted); font-size:0.86rem;}
.epb footer .doc-code{margin-bottom:10px;}
.epb .divider-dash{border:none; border-top:1px dashed var(--line); margin:44px 0 0;}
.epb::selection{background:var(--amber); color:var(--blueprint-deep);}

&lt;/style&gt;
&lt;div class="epb"&gt;
&lt;div class="crop tl"&gt;&lt;/div&gt;&lt;div class="crop tr"&gt;&lt;/div&gt;&lt;div class="crop bl"&gt;&lt;/div&gt;&lt;div class="crop br"&gt;&lt;/div&gt;

&lt;header class="cover"&gt;
  &lt;div class="stamp"&gt;&lt;div class="ring"&gt;&lt;/div&gt;&lt;span&gt;Latihan Soal&lt;b&gt;Tipe AKM&lt;/b&gt;Fase F&lt;/span&gt;&lt;/div&gt;
  &lt;div class="doc-code"&gt;DOK/B.INDO/XI/PROSEDUR-AKM — Latihan Soal · 50 Butir&lt;/div&gt;
  &lt;h1&gt;Latihan Soal Tipe AKM: Pokok Bahasan Petunjuk Kerja&lt;/h1&gt;
  &lt;p class="subtitle"&gt;Latihan soal literasi membaca bertipe Asesmen Kompetensi Minimum (AKM) untuk Bahasa Indonesia Kelas XI SMK/MAK, mencakup seluruh materi pokok bahasan Petunjuk Kerja: evaluasi informasi, perbandingan teks, kaidah kebahasaan, serta penyusunan dan penyajian teks prosedur.&lt;/p&gt;

  &lt;div class="meta-strip"&gt;
    &lt;div&gt;&lt;div class="k"&gt;Mata Pelajaran&lt;/div&gt;&lt;div class="v"&gt;Bahasa Indonesia&lt;/div&gt;&lt;/div&gt;
    &lt;div&gt;&lt;div class="k"&gt;Jenjang&lt;/div&gt;&lt;div class="v"&gt;SMK/MAK — Kelas XI&lt;/div&gt;&lt;/div&gt;
    &lt;div&gt;&lt;div class="k"&gt;Jumlah Soal&lt;/div&gt;&lt;div class="v"&gt;50 Butir · 5 Opsi&lt;/div&gt;&lt;/div&gt;
    &lt;div&gt;&lt;div class="k"&gt;KKM&lt;/div&gt;&lt;div class="v"&gt;75 · 3 Kali Kesempatan&lt;/div&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/header&gt;

&lt;main&gt;

  &lt;section class="section" id="petunjuk"&gt;
    &lt;div class="eyebrow"&gt;01 — Petunjuk Pengerjaan&lt;/div&gt;
    &lt;h2 class="section-title"&gt;Sebelum Mengerjakan, Baca Dahulu&lt;/h2&gt;

    &lt;div class="panel tp"&gt;
      &lt;p style="margin:0;"&gt;Soal berikut disusun mengikuti pola &lt;b style="color:var(--off-white);"&gt;Asesmen Kompetensi Minimum (AKM)&lt;/b&gt;: setiap kelompok soal diawali sebuah &lt;b style="color:var(--off-white);"&gt;teks stimulus&lt;/b&gt; (teks prosedur atau teks eksplanasi), lalu diikuti beberapa pertanyaan yang menguji kemampuan &lt;b style="color:var(--off-white);"&gt;menemukan informasi, menginterpretasi, membandingkan, dan mengevaluasi&lt;/b&gt; isi teks tersebut — bukan sekadar menghafal definisi.&lt;/p&gt;
    &lt;/div&gt;

    &lt;div class="grid-3"&gt;
      &lt;div class="card"&gt;&lt;h4&gt;50 Soal &amp;amp; 5 Opsi&lt;/h4&gt;&lt;p style="font-size:0.9rem;"&gt;20 soal mudah, 21 soal sedang, 9 soal sulit — pilihan jawaban A sampai E.&lt;/p&gt;&lt;/div&gt;
      &lt;div class="card"&gt;&lt;h4&gt;KKM = 75&lt;/h4&gt;&lt;p style="font-size:0.9rem;"&gt;Skor dihitung otomatis dari 50 soal (setiap soal bernilai 2 poin, maksimal 100).&lt;/p&gt;&lt;/div&gt;
      &lt;div class="card"&gt;&lt;h4&gt;3 Kali Kesempatan&lt;/h4&gt;&lt;p style="font-size:0.9rem;"&gt;Jika belum mencapai KKM, kamu dapat mencoba lagi hingga maksimal 3 kali percobaan.&lt;/p&gt;&lt;/div&gt;
    &lt;/div&gt;

    &lt;div class="panel warn" style="margin-top:20px;"&gt;
      &lt;p style="margin:0;"&gt;&lt;b style="color:var(--off-white);"&gt;Aturan pengiriman nilai:&lt;/b&gt; Begitu skor kamu mencapai atau melebihi KKM (75), nilai tersebut langsung dikirim dan tercatat. Jika hingga percobaan ke-3 belum ada yang mencapai KKM, sistem akan otomatis mengirim &lt;b style="color:var(--off-white);"&gt;nilai tertinggi&lt;/b&gt; dari ketiga percobaanmu. Isi No. Absen dengan angka yang sama di setiap percobaan agar sistem dapat menghitung kesempatanmu dengan benar.&lt;/p&gt;
    &lt;/div&gt;
  &lt;/section&gt;

  &lt;hr class="divider-dash"&gt;

  &lt;!-- ============ PETUNJUK MENGERJAKAN ============ --&gt;
  &lt;section class="section" id="cara-mengerjakan"&gt;
    &lt;div class="eyebrow"&gt;02 — Langkah Pengerjaan&lt;/div&gt;
    &lt;h2 class="section-title"&gt;Cara Mengerjakan Latihan Ini&lt;/h2&gt;

    &lt;ol class="steps-num"&gt;
      &lt;li&gt;&lt;b&gt;Isi No. Absen dan Nama Lengkap&lt;/b&gt; pada kolom yang tersedia sebelum mulai menjawab. Gunakan No. Absen yang sama setiap kali mencoba, karena sistem memakainya untuk menghitung sisa kesempatan.&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Baca teks stimulus&lt;/b&gt; (teks prosedur atau teks eksplanasi) yang muncul sebelum setiap kelompok soal dengan saksama, sebelum menjawab pertanyaan di bawahnya.&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Jawab seluruh 50 soal&lt;/b&gt; dengan memilih salah satu opsi A–E. Perhatikan label tingkat kesulitan (Mudah/Sedang/Sulit) pada tiap soal sebagai gambaran bobotnya.&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Tekan tombol "Kirim Jawaban"&lt;/b&gt; setelah semua soal terjawab. Jika masih ada yang kosong, sistem akan menunjukkan nomor yang belum dijawab.&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Lihat skor yang muncul.&lt;/b&gt; Jika skor sudah mencapai KKM (75), nilai otomatis terkirim dan latihan selesai.&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Jika skor belum mencapai KKM&lt;/b&gt;, tekan tombol "Coba Lagi" untuk mengulang (maksimal 3 kali percobaan). Jawaban akan direset, tetapi teks stimulus dan soal tetap sama.&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Setelah selesai&lt;/b&gt; (baik karena sudah mencapai KKM maupun kesempatan sudah habis), tunjukkan skor yang tertera di layar kepada guru sebagai bukti pengerjaan.&lt;/li&gt;
    &lt;/ol&gt;
  &lt;/section&gt;

  &lt;hr class="divider-dash"&gt;

  &lt;section class="section" id="kuis"&gt;
    &lt;div class="eyebrow"&gt;03 — Lembar Soal&lt;/div&gt;
    &lt;h2 class="section-title"&gt;Kerjakan 50 Soal Berikut&lt;/h2&gt;

    &lt;div class="panel" id="epbq-form-wrap" style="margin-top:20px;"&gt;
      &lt;div style="display:grid; grid-template-columns:1fr 2fr; gap:14px; margin-bottom:10px;"&gt;
        &lt;div&gt;
          &lt;label class="mono" style="display:block; font-size:0.75rem; color:var(--amber); text-transform:uppercase; letter-spacing:0.08em; margin-bottom:6px;"&gt;No. Absen&lt;/label&gt;
          &lt;input id="epbq-absen" type="text" inputmode="numeric" placeholder="Contoh: 12" style="width:100%; padding:10px 12px; border-radius:2px; border:1px solid var(--line); background:var(--blueprint-deep); color:var(--off-white); font-family:'Source Sans 3',sans-serif; font-size:0.95rem;"&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;label class="mono" style="display:block; font-size:0.75rem; color:var(--amber); text-transform:uppercase; letter-spacing:0.08em; margin-bottom:6px;"&gt;Nama Lengkap&lt;/label&gt;
          &lt;input id="epbq-nama" type="text" placeholder="Tulis nama lengkap" style="width:100%; padding:10px 12px; border-radius:2px; border:1px solid var(--line); background:var(--blueprint-deep); color:var(--off-white); font-family:'Source Sans 3',sans-serif; font-size:0.95rem;"&gt;
        &lt;/div&gt;
      &lt;/div&gt;
      &lt;p id="epbq-attempt-info" class="mono" style="font-size:0.8rem; color:var(--muted); margin:4px 0 18px;"&gt;Masukkan No. Absen untuk melihat sisa kesempatan.&lt;/p&gt;

      &lt;div id="epbq-questions"&gt;&lt;/div&gt;

      &lt;div style="margin-top:24px; display:flex; align-items:center; gap:16px; flex-wrap:wrap;"&gt;
        &lt;button id="epbq-submit" type="button" style="background:var(--amber); color:var(--blueprint-deep); border:none; padding:12px 26px; font-family:'Oswald',sans-serif; text-transform:uppercase; letter-spacing:0.05em; font-weight:600; border-radius:2px; cursor:pointer; font-size:0.95rem;"&gt;Kirim Jawaban&lt;/button&gt;
        &lt;button id="epbq-retry" type="button" style="display:none; background:transparent; color:var(--amber); border:1px solid var(--amber); padding:12px 26px; font-family:'Oswald',sans-serif; text-transform:uppercase; letter-spacing:0.05em; font-weight:600; border-radius:2px; cursor:pointer; font-size:0.95rem;"&gt;Coba Lagi&lt;/button&gt;
        &lt;span id="epbq-status" class="mono" style="font-size:0.85rem; color:var(--muted);"&gt;&lt;/span&gt;
      &lt;/div&gt;

      &lt;div id="epbq-result" style="display:none; margin-top:20px; padding:18px 20px; border:1px solid var(--amber); background:rgba(245,166,35,0.08);"&gt;
        &lt;p style="margin:0; font-size:1.05rem;"&gt;Skor percobaan ini: &lt;b id="epbq-score" style="color:var(--amber); font-size:1.3rem;"&gt;&lt;/b&gt; / 100&lt;/p&gt;
        &lt;p id="epbq-detail" style="margin:8px 0 0; font-size:0.9rem; color:var(--muted);"&gt;&lt;/p&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/section&gt;

&lt;/main&gt;

&lt;footer&gt;
  &lt;div class="doc-code"&gt;DOK/B.INDO/XI/PROSEDUR-AKM — Latihan Soal Tipe AKM, 50 Butir, Pokok Bahasan Petunjuk Kerja&lt;/div&gt;
  &lt;p style="margin:0;"&gt;Referensi: Kurikulum Merdeka — Capaian Pembelajaran Bahasa Indonesia Fase F; Pusat Asesmen dan Pembelajaran Kemendikbudristek — format Asesmen Kompetensi Minimum (AKM) Literasi Membaca.&lt;/p&gt;
&lt;/footer&gt;

&lt;script&gt;
(function(){
  var EPBQ_ENDPOINT = "https://script.google.com/macros/s/AKfycbzM7t2qgAENzxQJXzSYJYL28R6nb3TxJVELLL3CopyEXb51t_gRtrkPOxTpI5mq6VCEKw/exec";
  var EPBQ_MATERI = "Latihan Soal AKM - Pokok Bahasan Petunjuk Kerja (50 Soal)";
  var KKM = 75;
  var MAX_ATTEMPTS = 3;

  var stimuli = [{"id": "A", "judul": "Cara Membuat Teh Hangat", "jenis": "Teks Prosedur", "teks": "Teh hangat adalah minuman yang mudah dibuat dan cocok dinikmati kapan saja. Berikut langkah membuatnya. Pertama, siapkan gelas dan satu kantong teh. Kedua, panaskan air hingga mendidih. Ketiga, masukkan kantong teh ke dalam gelas, lalu tuangkan air panas ke dalamnya. Setelah itu, tambahkan gula sesuai selera. Aduk hingga rata, dan teh hangat siap dinikmati."}, {"id": "B", "judul": "Prosedur Mengganti Baterai Remote TV", "jenis": "Teks Prosedur", "teks": "Remote TV yang tidak merespons biasanya disebabkan baterai yang sudah lemah. Berikut cara menggantinya. Buka penutup baterai di bagian belakang remote dengan menggeser atau menekannya sesuai petunjuk. Keluarkan baterai lama, lalu perhatikan tanda kutub positif (+) dan negatif (–) pada dudukan baterai. Pasang baterai baru sesuai posisi kutub tersebut. Tutup kembali penutup baterai hingga rapat, lalu coba tekan salah satu tombol untuk memastikan remote berfungsi."}, {"id": "C", "judul": "Proses Terjadinya Karat pada Besi", "jenis": "Teks Eksplanasi", "teks": "Karat adalah lapisan berwarna cokelat kemerahan yang muncul pada permukaan besi. Karat terjadi karena besi bereaksi dengan oksigen dan air melalui proses yang disebut oksidasi. Ketika permukaan besi terkena udara lembap dalam waktu lama, oksigen akan berikatan dengan atom besi membentuk senyawa besi oksida. Semakin lama besi terpapar kelembapan, semakin tebal lapisan karat yang terbentuk. Oleh karena itu, besi yang disimpan di tempat lembap akan lebih cepat berkarat dibandingkan besi yang disimpan di tempat kering."}, {"id": "D", "judul": "Prosedur Menyalakan Genset Portabel", "jenis": "Teks Prosedur", "teks": "Genset portabel berguna sebagai sumber listrik cadangan saat listrik padam. Berikut langkah menyalakannya. Pertama, letakkan genset di ruangan tertutup agar terhindar dari hujan. Kedua, periksa jumlah bahan bakar pada tangki genset. Ketiga, tekan tombol starter hingga mesin menyala. Keempat, tunggu beberapa menit sebelum menyambungkan kabel listrik ke genset. Genset kini siap digunakan untuk menyalakan peralatan listrik di rumah."}, {"id": "E", "judul": "Prosedur Membersihkan Filter AC Rumah secara Mandiri", "jenis": "Teks Prosedur", "teks": "Filter AC yang kotor dapat menurunkan kualitas udara dan kinerja pendinginan. Berikut cara membersihkannya. Matikan AC dan cabut sumber listriknya terlebih dahulu. Buka penutup unit indoor AC, lalu lepaskan filter udara secara perlahan. Cuci filter menggunakan air mengalir hingga debu dan kotoran luruh. Keringkan filter di tempat teduh, jangan di bawah sinar matahari langsung agar filter tidak melengkung. Pasang kembali filter setelah benar-benar kering, lalu nyalakan kembali AC seperti biasa."}, {"id": "F", "judul": "Proses Terjadinya Embun di Pagi Hari", "jenis": "Teks Eksplanasi", "teks": "Embun adalah titik-titik air yang muncul pada permukaan benda di pagi hari. Embun terbentuk karena udara di malam hari mengandung uap air yang mendingin seiring turunnya suhu. Ketika suhu udara turun hingga mencapai titik embun, uap air akan mengembun menjadi butiran air kecil pada permukaan benda seperti daun atau rumput. Proses ini biasanya terjadi pada malam hari yang cerah tanpa awan, karena panas bumi lebih cepat terlepas ke atmosfer. Dengan demikian, embun paling sering muncul pada pagi hari yang dingin dan cerah."}, {"id": "G", "judul": "Prosedur Mendaftar Akun Email Baru", "jenis": "Teks Prosedur", "teks": "Memiliki akun email sangat penting untuk berbagai keperluan digital. Berikut langkah mendaftarnya. Buka situs penyedia layanan email, lalu pilih menu 'Buat Akun Baru'. Isi formulir pendaftaran dengan nama lengkap, tanggal lahir, dan nomor telepon aktif. Selanjutnya, buatlah kata sandi yang kuat dengan kombinasi huruf, angka, dan simbol. Perlu diperhatikan, jangan gunakan kata sandi yang sama dengan akun media sosial lain agar lebih aman. Setelah semua data terisi, klik tombol 'Daftar' dan verifikasi akun melalui kode yang dikirim ke nomor telepon."}, {"id": "H", "judul": "Memilah Sampah Rumah Tangga (Sepasang Teks)", "jenis": "Teks Prosedur &amp; Teks Eksplanasi", "teks": "&lt;b&gt;Teks 1 — Prosedur Memilah Sampah Rumah Tangga:&lt;/b&gt; Memilah sampah bertujuan memudahkan proses daur ulang. Sediakan tiga wadah berbeda untuk sampah organik, anorganik, dan B3 (bahan berbahaya beracun). Pisahkan sisa makanan dan daun ke wadah organik. Masukkan plastik, kertas, dan logam ke wadah anorganik. Simpan baterai bekas dan lampu pecah pada wadah B3 secara terpisah. Buang sampah organik setiap hari, sedangkan sampah anorganik dapat dikumpulkan hingga penuh sebelum dibawa ke bank sampah.&lt;br&gt;&lt;br&gt;&lt;b&gt;Teks 2 — Proses Terjadinya Pencemaran akibat Sampah yang Tidak Dipilah:&lt;/b&gt; Sampah yang tidak dipilah akan bercampur antara bahan organik dan anorganik, sehingga proses penguraiannya menjadi lebih lambat. Sampah anorganik seperti plastik membutuhkan waktu ratusan tahun untuk terurai, sehingga menumpuk di tempat pembuangan akhir. Akibatnya, lahan yang tersedia untuk menampung sampah semakin berkurang. Selain itu, zat kimia dari sampah B3 yang tercampur dapat meresap ke dalam tanah dan mencemari sumber air di sekitarnya. Oleh karena itu, pemilahan sampah sejak dari rumah tangga menjadi langkah penting untuk mengurangi dampak pencemaran lingkungan."}];
  var questions = [{"stim": "A", "lvl": "Mudah", "q": "Apa tujuan utama teks prosedur tersebut?", "opts": ["Menjelaskan sejarah teh", "Membuat teh hangat siap diminum", "Membandingkan jenis teh", "Menceritakan pengalaman minum teh", "Menjual produk teh"], "correct": 1}, {"stim": "A", "lvl": "Mudah", "q": "Alat/bahan pertama yang disiapkan dalam teks adalah...", "opts": ["Gula dan sendok", "Air dan panci", "Gelas dan kantong teh", "Termos dan cangkir", "Susu dan kopi"], "correct": 2}, {"stim": "A", "lvl": "Mudah", "q": "Kata “setelah itu” pada teks berfungsi sebagai...", "opts": ["Konjungsi kausalitas", "Konjungsi temporal", "Konjungsi pertentangan", "Konjungsi pilihan", "Konjungsi penjumlahan"], "correct": 1}, {"stim": "A", "lvl": "Mudah", "q": "Kalimat “Aduk hingga rata” termasuk kalimat...", "opts": ["Deklaratif", "Interogatif", "Imperatif", "Persuasif", "Naratif"], "correct": 2}, {"stim": "B", "lvl": "Mudah", "q": "Menurut teks, apa penyebab remote TV tidak merespons?", "opts": ["Remote rusak permanen", "Baterai yang sudah lemah", "TV mati total", "Sinyal remote terganggu", "Remote basah"], "correct": 1}, {"stim": "B", "lvl": "Mudah", "q": "Hal yang harus diperhatikan saat memasang baterai baru adalah...", "opts": ["Warna baterai", "Ukuran remote", "Posisi kutub positif dan negatif", "Merek baterai", "Suhu ruangan"], "correct": 2}, {"stim": "B", "lvl": "Sedang", "q": "Langkah terakhir dalam prosedur tersebut adalah...", "opts": ["Membuka penutup baterai", "Mengeluarkan baterai lama", "Menutup penutup baterai", "Menekan tombol untuk memastikan remote berfungsi", "Membeli baterai baru"], "correct": 3}, {"stim": "B", "lvl": "Sedang", "q": "Mengapa penting memperhatikan tanda kutub baterai saat memasang?", "opts": ["Agar baterai terlihat rapi", "Agar remote berfungsi dengan benar", "Agar baterai lebih awet warnanya", "Karena aturan pabrik semata", "Tidak ada alasan khusus"], "correct": 1}, {"stim": "C", "lvl": "Mudah", "q": "Apa penyebab utama terjadinya karat pada besi menurut teks?", "opts": ["Suhu udara yang panas", "Reaksi besi dengan oksigen dan air", "Sinar matahari langsung", "Getaran mekanis", "Perubahan warna alami"], "correct": 1}, {"stim": "C", "lvl": "Sedang", "q": "Teks tersebut termasuk jenis teks eksplanasi karena...", "opts": ["Berisi langkah-langkah tindakan", "Menjelaskan proses terjadinya suatu fenomena", "Berisi cerita fiksi", "Berisi opini penulis", "Berisi iklan produk"], "correct": 1}, {"stim": "C", "lvl": "Sedang", "q": "Konjungsi “oleh karena itu” pada akhir teks berfungsi sebagai penanda...", "opts": ["Urutan", "Penambahan", "Penekanan", "Simpulan", "Pertentangan"], "correct": 3}, {"stim": "C", "lvl": "Mudah", "q": "Berdasarkan teks, besi akan lebih cepat berkarat jika disimpan di tempat...", "opts": ["Kering", "Lembap", "Dingin", "Bersuhu tinggi", "Tertutup rapat"], "correct": 1}, {"stim": "C", "lvl": "Sedang", "q": "Perbedaan mendasar teks ini dengan teks prosedur adalah...", "opts": ["Teks ini lebih pendek", "Teks ini bertujuan membuat pembaca memahami, bukan melakukan tindakan", "Teks ini tidak memiliki struktur", "Teks ini tidak menggunakan konjungsi", "Teks ini tidak informatif"], "correct": 1}, {"stim": "C", "lvl": "Sedang", "q": "Jika besi disimpan di tempat kering, berdasarkan informasi teks, proses karat akan...", "opts": ["Berlangsung lebih cepat", "Berlangsung lebih lambat", "Tidak berpengaruh sama sekali", "Terjadi secara instan", "Berubah menjadi proses lain"], "correct": 1}, {"stim": "D", "lvl": "Mudah", "q": "Apa tujuan dari prosedur tersebut?", "opts": ["Mematikan genset", "Menyalakan genset sebagai sumber listrik cadangan", "Memperbaiki genset rusak", "Menjual genset", "Menyimpan genset"], "correct": 1}, {"stim": "D", "lvl": "Mudah", "q": "Berapa langkah yang dijelaskan dalam prosedur tersebut?", "opts": ["2 langkah", "3 langkah", "4 langkah", "5 langkah", "6 langkah"], "correct": 2}, {"stim": "D", "lvl": "Sulit", "q": "Instruksi meletakkan genset di ruangan tertutup berpotensi membahayakan karena...", "opts": ["Genset akan cepat rusak", "Risiko keracunan gas karbon monoksida", "Suara genset menjadi lebih keras", "Genset akan kepanasan lebih cepat", "Bahan bakar lebih boros"], "correct": 1}, {"stim": "D", "lvl": "Sulit", "q": "Kekeliruan pada langkah pertama tersebut melanggar kriteria evaluasi teks prosedur, yaitu...", "opts": ["Keakuratan istilah", "Kelengkapan alat", "Keselamatan dan kelayakan praktik", "Kejelasan bahasa", "Kesesuaian judul"], "correct": 2}, {"stim": "D", "lvl": "Sulit", "q": "Rekomendasi perbaikan yang paling tepat untuk langkah pertama adalah...", "opts": ["Genset diletakkan di ruang terbuka atau berventilasi baik", "Genset dinyalakan tanpa bahan bakar", "Genset diletakkan di dalam lemari", "Genset dinyalakan di dalam kamar tidur", "Tidak perlu ada perubahan"], "correct": 0}, {"stim": "D", "lvl": "Mudah", "q": "Kalimat “Periksa jumlah bahan bakar pada tangki genset” termasuk kalimat...", "opts": ["Deklaratif", "Interogatif", "Imperatif", "Persuasif", "Naratif"], "correct": 2}, {"stim": "D", "lvl": "Sedang", "q": "Apakah urutan langkah dalam teks tersebut sudah logis?", "opts": ["Sudah, karena seluruh langkah aman dan berurutan", "Belum, karena langkah pertama membahayakan keselamatan meskipun urutan waktunya runtut", "Sudah, karena tidak ada langkah yang hilang", "Belum, karena tidak menggunakan bahasa baku", "Sudah, karena menggunakan konjungsi temporal"], "correct": 1}, {"stim": "D", "lvl": "Sedang", "q": "Selain keselamatan, aspek apa yang juga perlu diperiksa ulang agar prosedur ini benar-benar aman diikuti pembaca?", "opts": ["Kelengkapan langkah, misalnya instruksi soal ventilasi ruangan", "Jumlah huruf dalam judul", "Warna genset yang digunakan", "Harga bahan bakar", "Merek genset yang disebutkan"], "correct": 0}, {"stim": "E", "lvl": "Mudah", "q": "Apa tujuan prosedur membersihkan filter AC tersebut?", "opts": ["Mengganti unit AC", "Menjaga kualitas udara dan kinerja pendinginan", "Menghemat listrik semata", "Mengecat unit AC", "Memindahkan posisi AC"], "correct": 1}, {"stim": "E", "lvl": "Sedang", "q": "Mengapa filter harus dikeringkan di tempat teduh, bukan di bawah sinar matahari langsung?", "opts": ["Agar warnanya tidak pudar", "Agar filter tidak melengkung atau rusak", "Agar proses lebih cepat", "Karena aturan pabrik tanpa alasan teknis", "Agar debu tidak menempel"], "correct": 1}, {"stim": "E", "lvl": "Mudah", "q": "Kata “unit indoor” dan “filter” pada teks termasuk...", "opts": ["Konjungsi", "Kata teknis", "Kata ganti", "Kata sifat", "Kata seru"], "correct": 1}, {"stim": "E", "lvl": "Sedang", "q": "Kalimat “Matikan AC dan cabut sumber listriknya terlebih dahulu” termasuk kalimat perintah jenis...", "opts": ["Larangan", "Ajakan", "Perintah biasa", "Permintaan", "Persuasif"], "correct": 2}, {"stim": "E", "lvl": "Sedang", "q": "Manakah langkah yang menunjukkan alasan keselamatan sebelum membersihkan filter?", "opts": ["Mencuci filter dengan air mengalir", "Mematikan AC dan mencabut sumber listrik", "Mengeringkan filter di tempat teduh", "Memasang kembali filter", "Menyalakan kembali AC"], "correct": 1}, {"stim": "E", "lvl": "Mudah", "q": "Kalimat “Filter AC yang kotor dapat menurunkan kualitas udara...” termasuk bagian struktur...", "opts": ["Langkah-langkah", "Tujuan", "Alat dan bahan", "Penutup", "Interpretasi"], "correct": 1}, {"stim": "F", "lvl": "Mudah", "q": "Apa yang menyebabkan terbentuknya embun menurut teks?", "opts": ["Hujan yang turun di malam hari", "Penurunan suhu udara hingga titik embun", "Angin kencang di pagi hari", "Sinar matahari pagi", "Kelembapan tanah"], "correct": 1}, {"stim": "F", "lvl": "Sedang", "q": "Penanda wacana “dengan demikian” pada akhir teks berfungsi sebagai penanda...", "opts": ["Urutan", "Penambahan", "Penekanan", "Simpulan", "Pertentangan"], "correct": 3}, {"stim": "F", "lvl": "Mudah", "q": "Berdasarkan teks, embun paling sering muncul pada kondisi cuaca...", "opts": ["Berawan tebal", "Hujan deras", "Cerah tanpa awan", "Berkabut", "Berangin kencang"], "correct": 2}, {"stim": "F", "lvl": "Sedang", "q": "Konjungsi “karena” dalam teks tersebut menunjukkan hubungan...", "opts": ["Pertentangan", "Sebab-akibat", "Pilihan", "Waktu", "Penjumlahan"], "correct": 1}, {"stim": "F", "lvl": "Sedang", "q": "Apa perbedaan fungsi konjungsi kausalitas pada teks ini dengan konjungsi temporal pada teks prosedur?", "opts": ["Keduanya memiliki fungsi yang sama persis", "Kausalitas menjelaskan sebab-akibat proses alami, temporal menandai urutan langkah tindakan", "Kausalitas hanya dipakai dalam teks prosedur", "Temporal hanya dipakai dalam teks eksplanasi", "Keduanya tidak memiliki fungsi apa pun"], "correct": 1}, {"stim": "F", "lvl": "Sulit", "q": "Jika judul teks diubah menjadi “Cara Membuat Embun Buatan”, jenis teks tersebut kemungkinan besar akan berubah menjadi...", "opts": ["Teks deskripsi", "Teks prosedur", "Teks narasi", "Teks anekdot", "Tetap teks eksplanasi"], "correct": 1}, {"stim": "G", "lvl": "Mudah", "q": "Apa tujuan dari prosedur tersebut?", "opts": ["Menghapus akun email", "Mendaftar akun email baru", "Mengganti kata sandi", "Mengirim email", "Menutup akun media sosial"], "correct": 1}, {"stim": "G", "lvl": "Sedang", "q": "Frasa “perlu diperhatikan” pada teks berfungsi sebagai penanda wacana jenis...", "opts": ["Urutan", "Penambahan", "Penekanan", "Simpulan", "Pertentangan"], "correct": 2}, {"stim": "G", "lvl": "Mudah", "q": "Kata “selanjutnya” pada teks menandai...", "opts": ["Sebab-akibat", "Urutan langkah", "Pertentangan", "Pilihan", "Penekanan"], "correct": 1}, {"stim": "G", "lvl": "Sedang", "q": "Mengapa penulis menyarankan agar tidak menggunakan kata sandi yang sama dengan akun lain?", "opts": ["Agar mudah diingat", "Demi keamanan akun", "Agar proses pendaftaran lebih cepat", "Karena aturan pabrik", "Tidak ada alasan khusus"], "correct": 1}, {"stim": "G", "lvl": "Sulit", "q": "Jika seseorang mengikuti prosedur tersebut namun melewatkan langkah verifikasi kode, apa kemungkinan yang terjadi?", "opts": ["Akun langsung terhapus", "Akun belum aktif sepenuhnya", "Tidak terjadi apa-apa", "Kata sandi otomatis berubah", "Proses pendaftaran diulang dari awal secara otomatis"], "correct": 1}, {"stim": "G", "lvl": "Sedang", "q": "Bagian manakah dari teks yang termasuk kalimat persuasif?", "opts": ["“Buka situs penyedia layanan email”", "“Isi formulir pendaftaran dengan nama lengkap”", "“Perlu diperhatikan, jangan gunakan kata sandi yang sama dengan akun media sosial lain agar lebih aman”", "“Klik tombol Daftar”", "“Verifikasi akun melalui kode”"], "correct": 2}, {"stim": "H", "lvl": "Sedang", "q": "Apa persamaan mendasar antara kedua teks tersebut?", "opts": ["Keduanya bersifat fiksi", "Keduanya sama-sama menjelaskan proses/tahapan terkait sampah", "Keduanya tidak memiliki struktur", "Keduanya ditulis dalam bentuk puisi", "Keduanya tidak menggunakan konjungsi"], "correct": 1}, {"stim": "H", "lvl": "Sedang", "q": "Apa perbedaan tujuan utama kedua teks tersebut?", "opts": ["Teks 1 menjelaskan proses, Teks 2 mengarahkan tindakan", "Teks 1 mengarahkan tindakan, Teks 2 menjelaskan proses/dampak", "Keduanya bertujuan menghibur", "Keduanya bertujuan mempromosikan produk", "Keduanya tidak memiliki tujuan jelas"], "correct": 1}, {"stim": "H", "lvl": "Mudah", "q": "Manakah kalimat pada Teks 1 yang merupakan kalimat perintah?", "opts": ["“Memilah sampah bertujuan memudahkan proses daur ulang.”", "“Pisahkan sisa makanan dan daun ke wadah organik.”", "“Sampah yang tidak dipilah akan bercampur.”", "“Plastik membutuhkan waktu ratusan tahun untuk terurai.”", "“Pemilahan sampah menjadi langkah penting.”"], "correct": 1}, {"stim": "H", "lvl": "Sedang", "q": "Konjungsi “sehingga” pada Teks 2 menunjukkan hubungan...", "opts": ["Pertentangan", "Sebab-akibat", "Pilihan", "Waktu", "Penambahan"], "correct": 1}, {"stim": "H", "lvl": "Sedang", "q": "Berdasarkan Teks 2, apa dampak jangka panjang jika sampah tidak dipilah dari rumah tangga?", "opts": ["Sampah otomatis berkurang", "Lahan TPA berkurang dan sumber air tercemar", "Tidak ada dampak apa pun", "Sampah berubah menjadi kompos secara alami", "Proses daur ulang menjadi lebih cepat"], "correct": 1}, {"stim": "H", "lvl": "Sulit", "q": "Jika Teks 1 diikuti dengan benar oleh masyarakat, dampak yang dijelaskan pada Teks 2 kemungkinan akan...", "opts": ["Semakin parah", "Tidak berubah sama sekali", "Berkurang atau dapat dicegah", "Berubah menjadi masalah baru", "Tidak ada hubungannya sama sekali"], "correct": 2}, {"stim": "H", "lvl": "Sulit", "q": "Manakah pernyataan yang paling tepat menggambarkan hubungan antara kedua teks?", "opts": ["Teks 1 adalah solusi/tindakan pencegahan atas masalah yang dijelaskan Teks 2", "Teks 2 adalah solusi atas Teks 1", "Kedua teks membahas topik yang sama sekali berbeda", "Teks 1 dan Teks 2 saling bertentangan", "Teks 1 tidak berkaitan dengan Teks 2"], "correct": 0}, {"stim": "H", "lvl": "Mudah", "q": "Kata “B3” pada Teks 1 merupakan contoh dari...", "opts": ["Konjungsi", "Kata teknis/istilah khusus", "Kata ganti", "Kata sifat", "Kata seru"], "correct": 1}, {"stim": "H", "lvl": "Sulit", "q": "Apabila ingin mengevaluasi kelengkapan Teks 1, aspek apa yang paling perlu diperiksa?", "opts": ["Apakah seluruh jenis sampah rumah tangga sudah tercakup dalam tiga kategori wadah tersebut", "Apakah judul teks menarik", "Apakah teks menggunakan huruf kapital", "Apakah teks memiliki gambar", "Apakah teks ditulis dengan rapi"], "correct": 0}, {"stim": "H", "lvl": "Sulit", "q": "Berdasarkan kedua teks, simpulan yang paling tepat tentang pentingnya teks prosedur dalam menyelesaikan masalah lingkungan adalah...", "opts": ["Teks prosedur tidak ada kaitannya dengan masalah lingkungan", "Teks prosedur berperan sebagai panduan tindakan nyata untuk mencegah dampak negatif yang dijelaskan dalam teks eksplanasi", "Teks eksplanasi lebih penting daripada teks prosedur", "Teks prosedur hanya berguna untuk keperluan akademik", "Kedua jenis teks tidak memiliki hubungan sama sekali"], "correct": 1}];

  var optLabels = ["A","B","C","D","E"];
  var lvlColor = {"Mudah":"#6EC6CA","Sedang":"#F5A623","Sulit":"#D94E2A"};

  var container = document.getElementById("epbq-questions");
  var currentStim = null;
  var qCounter = 0;

  questions.forEach(function(item, idx){
    if(item.stim !== currentStim){
      currentStim = item.stim;
      var stimObj = stimuli.filter(function(s){ return s.id === currentStim; })[0];
      if(stimObj){
        var docSample = document.createElement("div");
        docSample.className = "doc-sample";
        docSample.style.margin = "24px 0 18px";
        docSample.innerHTML =
          '&lt;div class="doc-head"&gt;&lt;span&gt;Teks Stimulus \u00b7 ' + stimObj.jenis + '&lt;/span&gt;&lt;span&gt;Stimulus ' + stimObj.id + '&lt;/span&gt;&lt;/div&gt;' +
          '&lt;div class="doc-body"&gt;&lt;h3 style="color:#132029 !important;"&gt;' + stimObj.judul + '&lt;/h3&gt;' +
          '&lt;p style="color:#132029 !important; margin:8px 0 0;"&gt;' + stimObj.teks + '&lt;/p&gt;&lt;/div&gt;';
        container.appendChild(docSample);
      }
    }

    qCounter++;
    var block = document.createElement("div");
    block.style.marginBottom = "20px";
    block.style.paddingBottom = "16px";
    block.style.borderBottom = "1px dashed rgba(234,242,245,0.16)";

    var tag = document.createElement("span");
    tag.textContent = item.lvl;
    tag.style.display = "inline-block";
    tag.style.fontFamily = "'IBM Plex Mono', monospace";
    tag.style.fontSize = "0.68rem";
    tag.style.letterSpacing = "0.08em";
    tag.style.textTransform = "uppercase";
    tag.style.setProperty("color", lvlColor[item.lvl] || "#9FB4C2", "important");
    tag.style.setProperty("border", "1px solid " + (lvlColor[item.lvl] || "#9FB4C2"), "important");
    tag.style.padding = "2px 8px";
    tag.style.marginBottom = "6px";
    block.appendChild(tag);

    var qEl = document.createElement("p");
    qEl.style.setProperty("color", "#EAF2F5", "important");
    qEl.style.fontWeight = "600";
    qEl.style.margin = "6px 0 8px";
    qEl.textContent = qCounter + ". " + item.q;
    block.appendChild(qEl);

    item.opts.forEach(function(opt, oi){
      var label = document.createElement("label");
      label.style.display = "block";
      label.style.setProperty("color", "#DDE7EC", "important");
      label.style.fontSize = "0.92rem";
      label.style.margin = "4px 0";
      label.style.cursor = "pointer";

      var radio = document.createElement("input");
      radio.type = "radio";
      radio.name = "epbq-q" + idx;
      radio.value = oi;
      radio.style.marginRight = "8px";

      label.appendChild(radio);
      label.appendChild(document.createTextNode(optLabels[oi] + ". " + opt));
      block.appendChild(label);
    });

    container.appendChild(block);
  });

  function stateKey(absen){ return "epbq_akm_" + absen; }
  function loadState(absen){
    try{
      var raw = localStorage.getItem(stateKey(absen));
      if(!raw) return {attempts:0, bestScore:0, sent:false};
      return JSON.parse(raw);
    }catch(e){ return {attempts:0, bestScore:0, sent:false}; }
  }
  function saveState(absen, state){
    try{ localStorage.setItem(stateKey(absen), JSON.stringify(state)); }catch(e){}
  }

  var absenInput = document.getElementById("epbq-absen");
  var attemptInfo = document.getElementById("epbq-attempt-info");
  var submitBtn = document.getElementById("epbq-submit");
  var retryBtn = document.getElementById("epbq-retry");

  function refreshAttemptInfo(){
    var absen = absenInput.value.trim();
    if(!absen){
      attemptInfo.textContent = "Masukkan No. Absen untuk melihat sisa kesempatan.";
      submitBtn.style.display = "inline-block";
      retryBtn.style.display = "none";
      return;
    }
    var st = loadState(absen);
    if(st.sent){
      attemptInfo.textContent = "No. Absen " + absen + " sudah menyelesaikan latihan ini. Nilai tercatat: " + st.bestScore + ".";
      submitBtn.style.display = "none";
      retryBtn.style.display = "none";
    } else {
      attemptInfo.textContent = "No. Absen " + absen + " — kesempatan tersisa: " + (MAX_ATTEMPTS - st.attempts) + " dari " + MAX_ATTEMPTS + ".";
      submitBtn.style.display = "inline-block";
      retryBtn.style.display = "none";
    }
  }
  absenInput.addEventListener("input", refreshAttemptInfo);
  refreshAttemptInfo();

  function resetAnswers(){
    var radios = container.querySelectorAll('input[type="radio"]');
    radios.forEach(function(r){ r.checked = false; });
    window.scrollTo({top: document.getElementById("epbq-questions").offsetTop - 100, behavior:"smooth"});
  }

  retryBtn.addEventListener("click", function(){
    resetAnswers();
    document.getElementById("epbq-result").style.display = "none";
    retryBtn.style.display = "none";
    submitBtn.style.display = "inline-block";
    document.getElementById("epbq-status").textContent = "";
  });

  submitBtn.addEventListener("click", function(){
    var absen = absenInput.value.trim();
    var nama = document.getElementById("epbq-nama").value.trim();
    var statusEl = document.getElementById("epbq-status");

    if(!absen || !nama){
      statusEl.textContent = "Isi No. Absen dan Nama terlebih dahulu.";
      statusEl.style.color = "#F5A623";
      return;
    }

    var st = loadState(absen);
    if(st.sent){
      statusEl.textContent = "No. Absen ini sudah menyelesaikan latihan dan nilainya sudah tercatat.";
      statusEl.style.color = "#F5A623";
      return;
    }
    if(st.attempts &gt;= MAX_ATTEMPTS){
      statusEl.textContent = "Kesempatan sudah habis.";
      statusEl.style.color = "#F5A623";
      return;
    }

    var belumDijawab = [];
    var benar = 0;
    questions.forEach(function(item, idx){
      var checked = document.querySelector('input[name="epbq-q' + idx + '"]:checked');
      if(!checked){
        belumDijawab.push(idx+1);
      } else if(parseInt(checked.value,10) === item.correct){
        benar++;
      }
    });

    if(belumDijawab.length &gt; 0){
      statusEl.textContent = "Masih ada " + belumDijawab.length + " soal yang belum dijawab.";
      statusEl.style.color = "#F5A623";
      return;
    }

    var skor = benar * 2;
    st.attempts += 1;
    st.bestScore = Math.max(st.bestScore, skor);
    saveState(absen, st);

    document.getElementById("epbq-score").textContent = skor;
    document.getElementById("epbq-result").style.display = "block";

    var sisa = MAX_ATTEMPTS - st.attempts;

    if(skor &gt;= KKM){
      document.getElementById("epbq-detail").textContent = "Menjawab benar " + benar + " dari 50 soal. Skor mencapai KKM (75) \u2014 nilai ini akan dikirim ke guru.";
      kirimNilai(absen, nama, skor);
      st.sent = true;
      saveState(absen, st);
      submitBtn.style.display = "none";
      retryBtn.style.display = "none";
    } else if(sisa &gt; 0){
      document.getElementById("epbq-detail").textContent = "Menjawab benar " + benar + " dari 50 soal. Skor belum mencapai KKM (75). Kesempatan tersisa: " + sisa + ".";
      submitBtn.style.display = "none";
      retryBtn.style.display = "inline-block";
      statusEl.textContent = "";
    } else {
      document.getElementById("epbq-detail").textContent = "Menjawab benar " + benar + " dari 50 soal. Kesempatan telah habis. Nilai tertinggi dari 3 percobaan (" + st.bestScore + ") akan dikirim ke guru.";
      kirimNilai(absen, nama, st.bestScore);
      st.sent = true;
      saveState(absen, st);
      submitBtn.style.display = "none";
      retryBtn.style.display = "none";
    }
    refreshAttemptInfo();
  });

  function kirimNilai(absen, nama, skor){
    var statusEl = document.getElementById("epbq-status");
    statusEl.textContent = "Mengirim hasil...";
    statusEl.style.color = "#9FB4C2";

    var payload = new URLSearchParams();
    payload.append("noAbsen", absen);
    payload.append("nama", nama);
    payload.append("skor", skor);
    payload.append("materi", EPBQ_MATERI);
    payload.append("waktu", new Date().toISOString());

    fetch(EPBQ_ENDPOINT, {
      method: "POST",
      mode: "no-cors",
      headers: {"Content-Type":"application/x-www-form-urlencoded"},
      body: payload.toString()
    }).then(function(){
      statusEl.textContent = "Hasil berhasil dikirim ke guru.";
      statusEl.style.color = "#6EC6CA";
    }).catch(function(){
      statusEl.textContent = "Nilai tercatat di perangkat ini, namun pengiriman gagal. Tunjukkan skor ini ke guru.";
      statusEl.style.color = "#F5A623";
    });
  }
})();
&lt;/script&gt;
&lt;/div&gt;</description><link>http://kitab-investasi.blogspot.com/2026/09/latihan-soal-tipe-akm-pokok-bahasan.html</link><thr:total>0</thr:total><author>nof_rizal07@yahoo.co.id (abang_cool)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-9000860041661554971.post-5495090412156498845</guid><pubDate>Tue, 01 Sep 2026 00:34:08 +0000</pubDate><atom:updated>2026-09-01T07:40:10.978+07:00</atom:updated><title>Pencarian Informasi Digital &amp; Kolaborasi Daring</title><description>&lt;!DOCTYPE html&gt;
&lt;html lang="id"&gt;
&lt;head&gt;
&lt;meta charset="UTF-8"&gt;
&lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&gt;
&lt;title&gt;Pencarian Informasi Digital &amp; Kolaborasi Daring — Informatika Kelas X&lt;/title&gt;
&lt;link rel="preconnect" href="https://fonts.googleapis.com"&gt;
&lt;link href="https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;600;700&amp;family=IBM+Plex+Sans:wght@400;500;600;700&amp;display=swap" rel="stylesheet"&gt;
&lt;style&gt;
  :root{
    --ink: #1F2430;
    --ink-soft: #57606F;
    --paper: #FFFFFF;
    --surface: #F4F6FA;
    --line: #DEE3EA;
    --accent: #2F5DA8;
    --accent-dark: #1E3E75;
    --amber: #E8940C;
    --teal: #0F9D8C;
    --red: #D8503C;
    --radius: 6px;
  }
  *{box-sizing:border-box; margin:0; padding:0;}
  html{scroll-behavior:smooth;}
  body{ font-family:'IBM Plex Sans', sans-serif; background:#FFFFFF; color: var(--ink); line-height:1.6; }
  .mono{font-family:'IBM Plex Mono', monospace;}

  .page-shell{
    max-width: 900px; margin: 16px auto; background:#FFFFFF; border-radius:16px; overflow:hidden;
    box-shadow: 0 8px 32px rgba(20,30,50,0.12), 0 1px 3px rgba(20,30,50,0.08);
    border: 1px solid var(--line);
  }

  /* ===== Browser-chrome hero ===== */
  .browser-hero{ background:#FFFFFF; }
  .tabbar{
    display:flex; align-items:flex-end; gap:4px; padding: 14px 5% 0; background: var(--surface); border-bottom:1px solid var(--line);
  }
  .tabbar .tab{
    background:#FFFFFF; border:1px solid var(--line); border-bottom:none; border-radius:8px 8px 0 0;
    padding:8px 16px; font-family:'IBM Plex Mono', monospace; font-size:0.72rem; color: var(--ink-soft);
  }
  .tabbar .tab.active{ color: var(--accent); font-weight:600; }
  .addressbar{
    margin: 0 5%; margin-top:-1px; background:#FFFFFF; border:1px solid var(--line); border-radius:0 0 8px 8px;
    padding:10px 16px; display:flex; align-items:center; gap:10px; font-family:'IBM Plex Mono', monospace; font-size:0.78rem; color: var(--ink-soft);
  }
  .addressbar .lock{ color: var(--teal); }

  .hero-body{ padding: 32px 5% 44px; }
  .eyebrow{
    font-family:'IBM Plex Mono', monospace; font-size:0.78rem; letter-spacing:0.16em; text-transform:uppercase;
    color: var(--accent); display:flex; align-items:center; gap:10px; margin-bottom:20px;
  }
  .eyebrow::before{ content:""; width:10px; height:10px; border:1.5px solid var(--accent); border-radius:50%; }
  h1.title{
    font-family:'IBM Plex Mono', monospace; font-weight:700;
    font-size: clamp(1.85rem, 4vw, 3.2rem); line-height:1.16; max-width: 21ch; color: var(--ink);
  }
  h1.title span{ color: var(--accent); }
  h1.title mark{ background: linear-gradient(180deg, transparent 62%, #FCE3A8 62%); color:var(--ink); }
  .hero-sub{ margin-top:18px; max-width: 66ch; font-size:1.04rem; color: var(--ink-soft); }
  .meta-strip{
    margin-top:36px; display:grid; grid-template-columns: repeat(auto-fit,minmax(160px,1fr)); gap:1px;
    background: var(--line); border:1px solid var(--line); max-width: 940px;
  }
  .meta-cell{ background: var(--surface); padding:14px 16px; }
  .meta-cell .k{ font-family:'IBM Plex Mono', monospace; font-size:0.66rem; letter-spacing:0.1em; text-transform:uppercase; color: var(--accent); }
  .meta-cell .v{ margin-top:6px; font-size:0.94rem; font-weight:600; color: var(--ink); }

  /* ===== Content ===== */
  main{ background: var(--paper); padding: 8px 0 0; }
  .section{ padding: 40px 5%; max-width: 1180px; margin: 0 auto; border-bottom:1px solid #ECEFF3; }
  .section:last-of-type{border-bottom:none;}
  .section-tag{
    font-family:'IBM Plex Mono', monospace; font-size:0.72rem; letter-spacing:0.14em; text-transform:uppercase;
    color: var(--ink-soft); display:flex; align-items:center; gap:10px; margin-bottom:10px;
  }
  .section-tag .num{ color:#fff; background: var(--accent); padding:3px 8px; border-radius:3px; font-weight:600; }
  h2.section-title{ font-family:'IBM Plex Mono', monospace; font-size: clamp(1.35rem, 2.3vw, 1.9rem); font-weight:700; color: var(--ink); margin-bottom: 22px; max-width: 34ch; }
  h3.sub-title{ font-family:'IBM Plex Mono', monospace; font-size:1.06rem; font-weight:600; color: var(--ink); margin: 26px 0 12px; display:flex; align-items:center; gap:10px; }
  h3.sub-title::before{ content:""; width:8px;height:8px; background: var(--amber); display:inline-block; border-radius:1px; }
  p{ color:#3A4453; max-width: 74ch; margin-bottom: 14px;}
  strong{color:var(--ink);}
  ul, ol{ margin: 8px 0 18px 1.3em; max-width: 74ch;}
  li{margin-bottom:8px; color:#3A4453;}

  .callout{ border-left: 3px solid var(--accent); background:#EDF2FA; padding: 16px 20px; border-radius: 0 6px 6px 0; margin: 18px 0; max-width: 74ch; }
  .callout .lbl{ font-family:'IBM Plex Mono', monospace; font-size:0.7rem; letter-spacing:0.1em; text-transform:uppercase; color: var(--accent-dark); font-weight:700; margin-bottom:6px; }
  .callout.warn{ border-left-color: var(--red); background:#FBEAE6; }
  .callout.warn .lbl{ color:#A5402C; }
  .callout.secure{ border-left-color: var(--teal); background:#E8F6F3; }
  .callout.secure .lbl{ color:#0C7A6C; }

  /* ===== Cards ===== */
  .card-grid{ display:grid; grid-template-columns: repeat(auto-fit, minmax(210px, 1fr)); gap: 16px; margin: 20px 0 8px; }
  .card{ background: var(--paper); border: 1.5px solid var(--line); border-radius: var(--radius); padding: 20px; box-shadow: 0 2px 10px rgba(20,30,50,0.05); }
  .card .tag{ font-family:'IBM Plex Mono', monospace; font-size:0.66rem; letter-spacing:0.1em; text-transform:uppercase; color:#fff; background: var(--accent); padding:3px 8px; border-radius:3px; display:inline-block; margin-bottom:12px; }
  .card h4{ font-family:'IBM Plex Mono', monospace; font-size:0.98rem; margin-bottom:8px; color:var(--ink); }
  .card p{font-size:0.89rem; margin-bottom:0;}
  .card code{ font-family:'IBM Plex Mono', monospace; background:var(--surface); padding:1px 6px; border-radius:3px; font-size:0.85em; color: var(--accent-dark); }

  .table-scroll{ overflow-x:auto; margin:18px 0; -webkit-overflow-scrolling:touch; }
  .table-scroll table{ margin:0; }
  table.compare{ width:100%; border-collapse:collapse; font-size:0.9rem; min-width:480px; }
  table.compare th, table.compare td{ border:1px solid var(--line); padding:11px 14px; text-align:left; }
  table.compare th{ background: var(--accent); color:#fff; font-family:'IBM Plex Mono', monospace; font-size:0.74rem; letter-spacing:0.04em; text-transform:uppercase; }
  table.compare tr:nth-child(even) td{ background: var(--surface); }

  /* ===== Diagram ===== */
  .diagram-frame{ margin: 26px 0; background: var(--surface); border-radius: 8px; padding: 18px; border: 1px solid var(--line); }
  .diagram-frame svg{width:100%; height:auto; display:block;}
  .diagram-caption{ font-family:'IBM Plex Mono', monospace; font-size:0.72rem; color: var(--ink-soft); text-align:center; margin-top:10px; letter-spacing:0.03em; }
  .signal{ stroke-dasharray: 6 8; animation: flow 1.6s linear infinite; }
  @keyframes flow{ to{ stroke-dashoffset:-56; } }
  @media (prefers-reduced-motion: reduce){ .signal{animation:none;} }

  /* ===== Summary ===== */
  .summary-box{ background: var(--accent-dark); color: #fff; border-radius: 8px; padding: 26px 28px; margin-top: 10px; }
  .summary-box h4{ font-family:'IBM Plex Mono', monospace; color:#FCD98A; font-size:0.85rem; letter-spacing:0.08em; text-transform:uppercase; margin-bottom:14px; }
  .summary-box ul{ margin:0 0 0 1.1em; max-width:none; }
  .summary-box li{ color:#E6ECF7; margin-bottom:8px; }

  /* ===== Tugas kelompok ===== */
  .task-panel{ border: 1.5px dashed var(--accent); border-radius: 8px; padding: 26px 28px; background: repeating-linear-gradient(135deg, #FFFFFF, #FFFFFF 18px, var(--surface) 18px, var(--surface) 19px); }
  .task-head{ display:flex; align-items:center; gap:12px; flex-wrap:wrap; margin-bottom:12px; }
  .task-head .badge{ font-family:'IBM Plex Mono', monospace; font-size:0.7rem; letter-spacing:0.08em; text-transform:uppercase; background: var(--teal); color:#fff; padding:4px 10px; border-radius:3px; font-weight:700;}
  .task-panel h3{ font-family:'IBM Plex Mono', monospace; font-size:1.22rem; color: var(--ink); }
  .steps-num{ counter-reset: step; margin:16px 0; max-width:78ch; }
  .steps-num li{ counter-increment: step; list-style:none; position:relative; padding-left:34px; margin-bottom:14px; }
  .steps-num li::before{ content: counter(step); position:absolute; left:0; top:0; font-family:'IBM Plex Mono', monospace; font-weight:700; color:#fff; background: var(--accent); width:24px; height:24px; border-radius:50%; display:flex; align-items:center; justify-content:center; font-size:0.8rem; }
  table.rubrik{ width:100%; border-collapse:collapse; margin:18px 0 0; font-size:0.88rem; min-width:520px; }
  table.rubrik th, table.rubrik td{ border:1px solid #C9CFD6; padding:10px 12px; text-align:left; }
  table.rubrik th{ background: var(--accent-dark); color:#fff; font-family:'IBM Plex Mono', monospace; font-size:0.75rem; letter-spacing:0.04em; text-transform:uppercase; }
  table.rubrik tr:nth-child(even) td{ background: var(--surface); }

  .closing-task{ margin-top:22px; background: #FFF6E6; border:1.5px solid var(--amber); border-radius:8px; padding:20px 22px; }
  .closing-task .lbl{ font-family:'IBM Plex Mono', monospace; font-size:0.72rem; letter-spacing:0.1em; text-transform:uppercase; color:#8A5A0A; font-weight:700; margin-bottom:8px; }

  /* ===== Quiz ===== */
  .quiz-panel{ background: var(--surface); border:1px solid var(--line); border-radius: 10px; padding: 30px 28px; color: var(--ink); }
  .quiz-panel h3.sub-title{ color: var(--ink); }
  .quiz-note{ font-size:0.88rem; color: var(--ink-soft); max-width:74ch; margin-bottom:18px;}
  .student-info{ display:grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap:14px; margin: 18px 0 30px; }
  .field label{ display:block; font-family:'IBM Plex Mono', monospace; font-size:0.7rem; letter-spacing:0.06em; text-transform:uppercase; color: var(--accent-dark); margin-bottom:6px; }
  .field input, .field select{
    width:100%; padding:10px 12px; border-radius:5px; border:1px solid var(--line); background:#FFFFFF; color: var(--ink); font-family:'IBM Plex Sans', sans-serif; font-size:0.94rem;
  }
  .field select{ cursor:pointer; }
  .field input:focus, .field select:focus{ outline:2px solid var(--accent); }

  .q-card{ background:#FFFFFF; border:1px solid var(--line); border-radius:8px; padding:18px 20px; margin-bottom:14px; }
  .q-card .q-num{ font-family:'IBM Plex Mono', monospace; font-size:0.72rem; color: var(--accent); letter-spacing:0.08em; margin-bottom:6px; }
  .q-card .q-text{ font-size:0.98rem; color: var(--ink); margin-bottom:12px; font-weight:500; }
  .options{ display:flex; flex-direction:column; gap:8px; }
  .opt{ display:flex; align-items:flex-start; gap:10px; padding:9px 12px; border:1px solid var(--line); border-radius:5px; cursor:pointer; transition: border-color .15s, background .15s; }
  .opt:hover{ border-color: var(--accent); }
  .opt input{ margin-top:3px; accent-color: var(--accent); }
  .opt span{ font-size:0.9rem; color:#33414F; }
  .opt.selected{ border-color: var(--accent); background: rgba(47,93,168,0.07); }

  .quiz-actions{ margin-top:24px; display:flex; align-items:center; gap:16px; flex-wrap:wrap; }
  #btnHitung, #btnKirim{
    font-family:'IBM Plex Mono', monospace; font-weight:600; font-size:0.85rem; letter-spacing:0.04em;
    padding: 12px 22px; border-radius:6px; border:none; cursor:pointer;
  }
  #btnHitung{ background: var(--accent); color:#fff; }
  #btnHitung:hover{ filter:brightness(1.08); }
  #btnKirim{ background: var(--teal); color:#fff; display:none; }
  #btnKirim:hover{ filter:brightness(1.08); }
  #btnKirim:disabled{ opacity:0.6; cursor:not-allowed; }
  #quizMsg{ font-family:'IBM Plex Mono', monospace; font-size:0.85rem; color:#B4791C; }

  .result-panel{ display:none; margin-top:22px; background:#FFFFFF; border:1.5px solid var(--teal); border-radius:8px; padding:22px 24px; }
  .result-panel .score{ font-family:'IBM Plex Mono', monospace; font-size:2.4rem; font-weight:700; color: #0C7A6C; }
  .result-panel .score-lbl{ font-family:'IBM Plex Mono', monospace; font-size:0.72rem; letter-spacing:0.1em; text-transform:uppercase; color: var(--ink-soft); }
  .result-panel p{ color:#33414F; font-size:0.9rem; margin-top:10px; margin-bottom:0; }

  footer{ background: var(--surface); color: var(--ink-soft); text-align:center; padding: 24px 5% 32px; font-family:'IBM Plex Mono', monospace; font-size:0.75rem; letter-spacing:0.04em; border-top:1px solid var(--line); }

  @media (max-width: 700px){
    .card-grid{grid-template-columns:1fr;}
    .hero-body{padding:26px 5% 34px;}
    .section{padding:28px 5%;}
  }
&lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;

&lt;div class="page-shell"&gt;
&lt;div class="browser-hero"&gt;
  &lt;div class="tabbar"&gt;
    &lt;div class="tab active"&gt;&#128269; Pencarian Informasi&lt;/div&gt;
    &lt;div class="tab"&gt;&#129309; Kolaborasi Daring&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="addressbar"&gt;&lt;span class="lock"&gt;&#128274;&lt;/span&gt; https://belajar-informatika.sekolah.id/pencarian-kolaborasi-daring&lt;/div&gt;

  &lt;div class="hero-body"&gt;
    &lt;div class="eyebrow"&gt;Informatika · Fase E · Kelas X SMK&lt;/div&gt;
    &lt;h1 class="title"&gt;Pencarian Informasi Digital &amp; &lt;mark&gt;Kolaborasi&lt;/mark&gt; &lt;span&gt;Daring&lt;/span&gt;&lt;/h1&gt;
    &lt;p class="hero-sub"&gt;Materi ini membahas cara memanfaatkan mesin pencari dan peramban secara efektif, menggunakan layanan komunikasi digital dengan tepat, berkolaborasi lewat media daring, serta menerapkan etika dan keamanan digital yang bertanggung jawab.&lt;/p&gt;

    &lt;div class="meta-strip"&gt;
      &lt;div class="meta-cell"&gt;&lt;div class="k"&gt;Elemen CP&lt;/div&gt;&lt;div class="v"&gt;Pencarian &amp; Kolaborasi Daring&lt;/div&gt;&lt;/div&gt;
      &lt;div class="meta-cell"&gt;&lt;div class="k"&gt;Jenjang&lt;/div&gt;&lt;div class="v"&gt;SMK Kelas X&lt;/div&gt;&lt;/div&gt;
      &lt;div class="meta-cell"&gt;&lt;div class="k"&gt;Alokasi Waktu&lt;/div&gt;&lt;div class="v"&gt;1 Pertemuan · 4 JP (180 menit)&lt;/div&gt;&lt;/div&gt;
      &lt;div class="meta-cell"&gt;&lt;div class="k"&gt;Model&lt;/div&gt;&lt;div class="v"&gt;Praktik, Kerja Kelompok &amp; Kuis&lt;/div&gt;&lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;main&gt;

  &lt;!-- ===================== TUJUAN ===================== --&gt;
  &lt;section class="section" id="tujuan"&gt;
    &lt;div class="section-tag"&gt;&lt;span class="num"&gt;00&lt;/span&gt; Capaian &amp; Tujuan Pembelajaran&lt;/div&gt;
    &lt;h2 class="section-title"&gt;Ke Mana Materi Ini Menuju&lt;/h2&gt;

    &lt;h3 class="sub-title"&gt;Capaian Pembelajaran&lt;/h3&gt;
    &lt;p&gt;Murid mampu memanfaatkan mesin pencari, peramban, layanan komunikasi digital, dan media kolaborasi daring secara efektif, aman, dan bertanggung jawab.&lt;/p&gt;

    &lt;h3 class="sub-title"&gt;Tujuan Pembelajaran&lt;/h3&gt;
    &lt;ol&gt;
      &lt;li&gt;Menjelaskan cara kerja mesin pencari dan menerapkan strategi pencarian informasi yang efektif.&lt;/li&gt;
      &lt;li&gt;Menjelaskan fungsi dan fitur-fitur penting peramban (browser) dalam mengakses informasi digital.&lt;/li&gt;
      &lt;li&gt;Memanfaatkan layanan komunikasi digital (email, pesan instan, video conference) secara tepat dan sopan.&lt;/li&gt;
      &lt;li&gt;Memanfaatkan media kolaborasi daring untuk bekerja sama menyelesaikan tugas kelompok.&lt;/li&gt;
      &lt;li&gt;Menerapkan etika berinternet (netiket), verifikasi informasi, dan keamanan/privasi digital.&lt;/li&gt;
    &lt;/ol&gt;

    &lt;h3 class="sub-title"&gt;Rincian Kegiatan (4 JP × 45 menit)&lt;/h3&gt;
    &lt;div class="table-scroll"&gt;&lt;table class="compare"&gt;
      &lt;tr&gt;&lt;th&gt;Tahap&lt;/th&gt;&lt;th&gt;Kegiatan&lt;/th&gt;&lt;th&gt;Waktu&lt;/th&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Pendahuluan&lt;/td&gt;&lt;td&gt;Apersepsi ("Bagaimana caramu memastikan informasi yang kamu temukan di internet itu benar?"), penyampaian tujuan pembelajaran&lt;/td&gt;&lt;td&gt;15 menit&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Inti — Eksplorasi Konsep&lt;/td&gt;&lt;td&gt;Penjelasan mesin pencari, peramban, komunikasi digital, kolaborasi daring, dan etika/keamanan digital&lt;/td&gt;&lt;td&gt;55 menit&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Inti — Kerja Kelompok&lt;/td&gt;&lt;td&gt;Diskusi dan pengerjaan tugas kelompok riset &amp; kolaborasi dokumen daring&lt;/td&gt;&lt;td&gt;40 menit&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Inti — Presentasi&lt;/td&gt;&lt;td&gt;Presentasi singkat tiap kelompok dan tanggapan guru&lt;/td&gt;&lt;td&gt;20 menit&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Inti — Kuis Individu&lt;/td&gt;&lt;td&gt;Mengerjakan 25 soal pilihan ganda secara mandiri melalui halaman ini&lt;/td&gt;&lt;td&gt;35 menit&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Penutup&lt;/td&gt;&lt;td&gt;Refleksi, penguatan konsep, menulis kesimpulan ringkas di buku catatan&lt;/td&gt;&lt;td&gt;15 menit&lt;/td&gt;&lt;/tr&gt;
    &lt;/table&gt;&lt;/div&gt;
  &lt;/section&gt;

  &lt;!-- ===================== A. MESIN PENCARI ===================== --&gt;
  &lt;section class="section" id="mesin-pencari"&gt;
    &lt;div class="section-tag"&gt;&lt;span class="num"&gt;01&lt;/span&gt; Menemukan Informasi&lt;/div&gt;
    &lt;h2 class="section-title"&gt;Mesin Pencari (Search Engine)&lt;/h2&gt;
    &lt;p&gt;&lt;strong&gt;Mesin pencari&lt;/strong&gt; adalah layanan yang membantu pengguna menemukan informasi di internet berdasarkan kata kunci yang dimasukkan. Contohnya Google, Bing, dan DuckDuckGo. Secara sederhana, mesin pencari bekerja melalui tiga tahap: &lt;strong&gt;crawling&lt;/strong&gt; (menjelajahi halaman-halaman web), &lt;strong&gt;indexing&lt;/strong&gt; (menyimpan dan mengelompokkan informasi halaman tersebut), dan &lt;strong&gt;ranking&lt;/strong&gt; (mengurutkan hasil yang paling relevan dengan kata kunci pencarian).&lt;/p&gt;

    &lt;h3 class="sub-title"&gt;Operator Pencarian agar Hasil Lebih Tepat&lt;/h3&gt;
    &lt;div class="card-grid"&gt;
      &lt;div class="card"&gt;&lt;span class="tag"&gt;Frasa Persis&lt;/span&gt;&lt;h4&gt;Tanda Kutip " "&lt;/h4&gt;&lt;p&gt;Mencari frasa yang harus muncul persis sama. Contoh: &lt;code&gt;"kurikulum merdeka"&lt;/code&gt;&lt;/p&gt;&lt;/div&gt;
      &lt;div class="card"&gt;&lt;span class="tag"&gt;Mengecualikan&lt;/span&gt;&lt;h4&gt;Tanda Minus -&lt;/h4&gt;&lt;p&gt;Mengeluarkan kata tertentu dari hasil pencarian. Contoh: &lt;code&gt;jaguar -mobil&lt;/code&gt;&lt;/p&gt;&lt;/div&gt;
      &lt;div class="card"&gt;&lt;span class="tag"&gt;Batasi Situs&lt;/span&gt;&lt;h4&gt;site:&lt;/h4&gt;&lt;p&gt;Membatasi hasil hanya dari satu situs tertentu. Contoh: &lt;code&gt;site:kemdikbud.go.id&lt;/code&gt;&lt;/p&gt;&lt;/div&gt;
      &lt;div class="card"&gt;&lt;span class="tag"&gt;Format File&lt;/span&gt;&lt;h4&gt;filetype:&lt;/h4&gt;&lt;p&gt;Mencari file dengan format tertentu. Contoh: &lt;code&gt;modul ajar filetype:pdf&lt;/code&gt;&lt;/p&gt;&lt;/div&gt;
      &lt;div class="card"&gt;&lt;span class="tag"&gt;Kata Alternatif&lt;/span&gt;&lt;h4&gt;OR&lt;/h4&gt;&lt;p&gt;Mencari salah satu dari beberapa kata. Contoh: &lt;code&gt;SMK OR SMA jurusan TKJ&lt;/code&gt;&lt;/p&gt;&lt;/div&gt;
      &lt;div class="card"&gt;&lt;span class="tag"&gt;Kata Hilang&lt;/span&gt;&lt;h4&gt;Tanda Bintang *&lt;/h4&gt;&lt;p&gt;Sebagai pengganti kata yang belum diketahui dalam sebuah frasa. Contoh: &lt;code&gt;ibu kota * adalah Jakarta&lt;/code&gt;&lt;/p&gt;&lt;/div&gt;
    &lt;/div&gt;

    &lt;h3 class="sub-title"&gt;Mengevaluasi Kredibilitas Sumber&lt;/h3&gt;
    &lt;p&gt;Tidak semua informasi di internet dapat dipercaya begitu saja. Sebelum menggunakan sebuah sumber, periksa hal-hal berikut:&lt;/p&gt;
    &lt;div class="table-scroll"&gt;&lt;table class="compare"&gt;
      &lt;tr&gt;&lt;th&gt;Aspek&lt;/th&gt;&lt;th&gt;Pertanyaan Kunci&lt;/th&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Penulis/Penerbit&lt;/td&gt;&lt;td&gt;Siapa yang menulis atau menerbitkan informasi ini? Apakah kredibel di bidangnya?&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Waktu Publikasi&lt;/td&gt;&lt;td&gt;Kapan informasi ini dipublikasikan? Apakah masih relevan/terkini?&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Tujuan Konten&lt;/td&gt;&lt;td&gt;Apakah bertujuan memberi informasi, atau justru mempengaruhi opini/menjual sesuatu?&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Bukti Pendukung&lt;/td&gt;&lt;td&gt;Apakah klaim dalam konten didukung data, fakta, atau referensi yang jelas?&lt;/td&gt;&lt;/tr&gt;
    &lt;/table&gt;&lt;/div&gt;
  &lt;/section&gt;

  &lt;!-- ===================== B. PERAMBAN ===================== --&gt;
  &lt;section class="section" id="peramban"&gt;
    &lt;div class="section-tag"&gt;&lt;span class="num"&gt;02&lt;/span&gt; Alat Menjelajah&lt;/div&gt;
    &lt;h2 class="section-title"&gt;Peramban (Browser)&lt;/h2&gt;
    &lt;p&gt;&lt;strong&gt;Peramban (browser)&lt;/strong&gt; adalah perangkat lunak yang digunakan untuk mengakses dan menampilkan halaman web, seperti Google Chrome, Mozilla Firefox, Microsoft Edge, dan Safari.&lt;/p&gt;

    &lt;h3 class="sub-title"&gt;Fitur-Fitur Penting Peramban&lt;/h3&gt;
    &lt;div class="card-grid"&gt;
      &lt;div class="card"&gt;&lt;span class="tag"&gt;Navigasi&lt;/span&gt;&lt;h4&gt;Tab&lt;/h4&gt;&lt;p&gt;Membuka beberapa halaman sekaligus dalam satu jendela peramban.&lt;/p&gt;&lt;/div&gt;
      &lt;div class="card"&gt;&lt;span class="tag"&gt;Simpan Cepat&lt;/span&gt;&lt;h4&gt;Bookmark&lt;/h4&gt;&lt;p&gt;Menyimpan alamat situs favorit agar mudah diakses kembali di kemudian hari.&lt;/p&gt;&lt;/div&gt;
      &lt;div class="card"&gt;&lt;span class="tag"&gt;Jejak Digital&lt;/span&gt;&lt;h4&gt;Riwayat (History)&lt;/h4&gt;&lt;p&gt;Mencatat daftar situs yang pernah dikunjungi.&lt;/p&gt;&lt;/div&gt;
      &lt;div class="card"&gt;&lt;span class="tag"&gt;Privasi&lt;/span&gt;&lt;h4&gt;Mode Incognito/Private&lt;/h4&gt;&lt;p&gt;Menjelajah tanpa menyimpan riwayat, cookie, dan data formulir setelah jendela ditutup.&lt;/p&gt;&lt;/div&gt;
      &lt;div class="card"&gt;&lt;span class="tag"&gt;Tambahan Fungsi&lt;/span&gt;&lt;h4&gt;Ekstensi/Add-on&lt;/h4&gt;&lt;p&gt;Program tambahan yang memperluas fungsi peramban, mis. pemblokir iklan atau kamus.&lt;/p&gt;&lt;/div&gt;
      &lt;div class="card"&gt;&lt;span class="tag"&gt;Keamanan&lt;/span&gt;&lt;h4&gt;Indikator HTTPS&lt;/h4&gt;&lt;p&gt;Ikon gembok pada address bar menandakan koneksi ke situs sudah terenkripsi dan lebih aman.&lt;/p&gt;&lt;/div&gt;
    &lt;/div&gt;
  &lt;/section&gt;

  &lt;!-- ===================== C. KOMUNIKASI DIGITAL ===================== --&gt;
  &lt;section class="section" id="komunikasi"&gt;
    &lt;div class="section-tag"&gt;&lt;span class="num"&gt;03&lt;/span&gt; Terhubung Secara Digital&lt;/div&gt;
    &lt;h2 class="section-title"&gt;Layanan Komunikasi Digital&lt;/h2&gt;
    &lt;p&gt;Komunikasi digital memungkinkan kita bertukar pesan, ide, dan informasi tanpa harus bertatap muka langsung.&lt;/p&gt;
    &lt;div class="table-scroll"&gt;&lt;table class="compare"&gt;
      &lt;tr&gt;&lt;th&gt;Layanan&lt;/th&gt;&lt;th&gt;Contoh&lt;/th&gt;&lt;th&gt;Etika Penggunaan&lt;/th&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Email&lt;/td&gt;&lt;td&gt;Gmail, Outlook&lt;/td&gt;&lt;td&gt;Gunakan subjek yang jelas, salam pembuka/penutup, bahasa sopan, dan periksa ulang sebelum mengirim.&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Pesan Instan (Chat)&lt;/td&gt;&lt;td&gt;WhatsApp, Telegram&lt;/td&gt;&lt;td&gt;Kirim pesan pada jam wajar, hindari pesan berantai/spam, gunakan bahasa yang jelas dan sopan.&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Video Conference&lt;/td&gt;&lt;td&gt;Google Meet, Zoom&lt;/td&gt;&lt;td&gt;Bergabung tepat waktu, matikan mikrofon saat tidak berbicara, berpakaian dan berlatar belakang pantas.&lt;/td&gt;&lt;/tr&gt;
    &lt;/table&gt;&lt;/div&gt;
  &lt;/section&gt;

  &lt;!-- ===================== D. KOLABORASI DARING ===================== --&gt;
  &lt;section class="section" id="kolaborasi"&gt;
    &lt;div class="section-tag"&gt;&lt;span class="num"&gt;04&lt;/span&gt; Bekerja Bersama&lt;/div&gt;
    &lt;h2 class="section-title"&gt;Media Kolaborasi Daring&lt;/h2&gt;
    &lt;p&gt;&lt;strong&gt;Media kolaborasi daring&lt;/strong&gt; memungkinkan beberapa orang menyunting satu dokumen, spreadsheet, atau presentasi secara bersamaan (real-time) melalui internet — tanpa perlu bertemu di tempat yang sama. Contoh: Google Docs, Google Sheets, Google Slides, dan Google Drive.&lt;/p&gt;

    &lt;div class="diagram-frame"&gt;
      &lt;svg viewBox="0 0 800 260" xmlns="http://www.w3.org/2000/svg"&gt;
        &lt;text x="400" y="26" text-anchor="middle" fill="#1E3E75" font-family="IBM Plex Mono, monospace" font-size="12" letter-spacing="2"&gt;KOLABORASI DOKUMEN REAL-TIME&lt;/text&gt;

        &lt;rect x="330" y="60" width="140" height="110" rx="6" fill="none" stroke="#0F9D8C" stroke-width="2"/&gt;
        &lt;text x="400" y="90" text-anchor="middle" fill="#0F9D8C" font-family="IBM Plex Mono, monospace" font-weight="700" font-size="11"&gt;DOKUMEN&lt;/text&gt;
        &lt;text x="400" y="105" text-anchor="middle" fill="#0F9D8C" font-family="IBM Plex Mono, monospace" font-size="10"&gt;BERSAMA&lt;/text&gt;
        &lt;line x1="345" y1="120" x2="455" y2="120" stroke="#DEE3EA" stroke-width="2"/&gt;
        &lt;line x1="345" y1="135" x2="455" y2="135" stroke="#DEE3EA" stroke-width="2"/&gt;
        &lt;line x1="345" y1="150" x2="425" y2="150" stroke="#DEE3EA" stroke-width="2"/&gt;

        &lt;circle cx="120" cy="60" r="26" fill="none" stroke="#2F5DA8" stroke-width="2"/&gt;
        &lt;text x="120" y="65" text-anchor="middle" fill="#2F5DA8" font-family="IBM Plex Mono, monospace" font-size="10"&gt;Murid A&lt;/text&gt;
        &lt;circle cx="120" cy="200" r="26" fill="none" stroke="#E8940C" stroke-width="2"/&gt;
        &lt;text x="120" y="205" text-anchor="middle" fill="#E8940C" font-family="IBM Plex Mono, monospace" font-size="10"&gt;Murid B&lt;/text&gt;
        &lt;circle cx="680" cy="60" r="26" fill="none" stroke="#D8503C" stroke-width="2"/&gt;
        &lt;text x="680" y="65" text-anchor="middle" fill="#D8503C" font-family="IBM Plex Mono, monospace" font-size="10"&gt;Murid C&lt;/text&gt;
        &lt;circle cx="680" cy="200" r="26" fill="none" stroke="#0F9D8C" stroke-width="2"/&gt;
        &lt;text x="680" y="205" text-anchor="middle" fill="#0F9D8C" font-family="IBM Plex Mono, monospace" font-size="10"&gt;Guru&lt;/text&gt;

        &lt;line class="signal" x1="145" y1="72" x2="330" y2="95" stroke="#2F5DA8" stroke-width="2"/&gt;
        &lt;line class="signal" x1="145" y1="188" x2="330" y2="150" stroke="#E8940C" stroke-width="2"/&gt;
        &lt;line class="signal" x1="655" y1="72" x2="470" y2="95" stroke="#D8503C" stroke-width="2"/&gt;
        &lt;line class="signal" x1="655" y1="188" x2="470" y2="150" stroke="#0F9D8C" stroke-width="2"/&gt;
      &lt;/svg&gt;
      &lt;div class="diagram-caption"&gt;Semua peserta dapat menyunting dokumen yang sama secara bersamaan — perubahan setiap orang langsung terlihat oleh yang lain.&lt;/div&gt;
    &lt;/div&gt;

    &lt;h3 class="sub-title"&gt;Tingkat Akses Berbagi (Sharing Permission)&lt;/h3&gt;
    &lt;div class="table-scroll"&gt;&lt;table class="compare"&gt;
      &lt;tr&gt;&lt;th&gt;Tingkat Akses&lt;/th&gt;&lt;th&gt;Yang Dapat Dilakukan&lt;/th&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Viewer (Melihat)&lt;/td&gt;&lt;td&gt;Hanya dapat membaca/melihat isi dokumen, tidak dapat mengubah apa pun.&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Commenter (Mengomentari)&lt;/td&gt;&lt;td&gt;Dapat melihat dan menambahkan komentar/masukan tanpa mengubah isi asli.&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Editor (Menyunting)&lt;/td&gt;&lt;td&gt;Dapat melihat, mengedit, dan mengubah langsung isi dokumen.&lt;/td&gt;&lt;/tr&gt;
    &lt;/table&gt;&lt;/div&gt;
    &lt;p&gt;Fitur &lt;strong&gt;version history (riwayat versi)&lt;/strong&gt; pada Google Docs memungkinkan kita melihat kembali dan mengembalikan perubahan dokumen dari waktu ke waktu — sangat berguna jika terjadi kesalahan saat berkolaborasi.&lt;/p&gt;
  &lt;/section&gt;

  &lt;!-- ===================== E. ETIKA &amp; KEAMANAN ===================== --&gt;
  &lt;section class="section" id="etika-keamanan"&gt;
    &lt;div class="section-tag"&gt;&lt;span class="num"&gt;05&lt;/span&gt; Bertanggung Jawab&lt;/div&gt;
    &lt;h2 class="section-title"&gt;Etika &amp; Keamanan Digital&lt;/h2&gt;

    &lt;h3 class="sub-title"&gt;Netiket (Etika Berinternet)&lt;/h3&gt;
    &lt;div class="callout"&gt;
      &lt;div class="lbl"&gt;Perilaku yang Dianjurkan&lt;/div&gt;
      &lt;ul style="margin:0 0 0 1.1em;"&gt;
        &lt;li&gt;Berkomunikasi dengan sopan dan menghargai pendapat orang lain, meski berbeda pandangan.&lt;/li&gt;
        &lt;li&gt;Mencantumkan sumber saat mengutip atau menggunakan karya orang lain (menghindari plagiarisme).&lt;/li&gt;
        &lt;li&gt;Tidak menyebarkan konten SARA, ujaran kebencian, atau informasi yang belum diverifikasi.&lt;/li&gt;
      &lt;/ul&gt;
    &lt;/div&gt;

    &lt;h3 class="sub-title"&gt;Verifikasi Informasi &amp; Hoaks&lt;/h3&gt;
    &lt;div class="callout warn"&gt;
      &lt;div class="lbl"&gt;Waspadai Hoaks&lt;/div&gt;
      &lt;p style="margin:0;"&gt;&lt;strong&gt;Hoaks&lt;/strong&gt; adalah informasi yang sengaja dibuat menyesatkan dan tidak berdasarkan fakta. Sebelum membagikan sebuah informasi, bandingkan dengan beberapa sumber terpercaya lain, periksa tanggal publikasi, dan jangan hanya menilai dari judul yang bersifat clickbait.&lt;/p&gt;
    &lt;/div&gt;

    &lt;h3 class="sub-title"&gt;Keamanan &amp; Privasi&lt;/h3&gt;
    &lt;div class="callout secure"&gt;
      &lt;div class="lbl"&gt;Langkah Perlindungan&lt;/div&gt;
      &lt;ul style="margin:0 0 0 1.1em;"&gt;
        &lt;li&gt;Atur pengaturan berbagi (sharing) dokumen daring hanya untuk orang/kelompok yang dituju, sesuai kebutuhan akses.&lt;/li&gt;
        &lt;li&gt;Jangan membagikan data pribadi (kata sandi, nomor identitas) melalui email/chat, apalagi kepada pihak tak dikenal.&lt;/li&gt;
        &lt;li&gt;Waspadai pesan atau email &lt;strong&gt;phishing&lt;/strong&gt; yang meminta data pribadi secara mendesak melalui tautan mencurigakan.&lt;/li&gt;
      &lt;/ul&gt;
    &lt;/div&gt;
  &lt;/section&gt;

  &lt;!-- ===================== F. HUBUNGAN ===================== --&gt;
  &lt;section class="section" id="hubungan"&gt;
    &lt;div class="section-tag"&gt;&lt;span class="num"&gt;06&lt;/span&gt; Keterkaitan&lt;/div&gt;
    &lt;h2 class="section-title"&gt;Hubungan Antar Konsep&lt;/h2&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;strong&gt;Mesin pencari&lt;/strong&gt; membantu menemukan informasi, sedangkan &lt;strong&gt;peramban&lt;/strong&gt; adalah alat yang digunakan untuk mengaksesnya.&lt;/li&gt;
      &lt;li&gt;Informasi yang ditemukan perlu dievaluasi kredibilitasnya sebelum digunakan atau dibagikan lewat &lt;strong&gt;layanan komunikasi digital&lt;/strong&gt;.&lt;/li&gt;
      &lt;li&gt;&lt;strong&gt;Media kolaborasi daring&lt;/strong&gt; memungkinkan hasil pencarian dan diskusi diolah bersama menjadi karya kelompok.&lt;/li&gt;
      &lt;li&gt;&lt;strong&gt;Etika dan keamanan digital&lt;/strong&gt; menjadi payung yang melandasi seluruh aktivitas di atas agar dilakukan secara aman dan bertanggung jawab.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/section&gt;

  &lt;!-- ===================== G. RANGKUMAN ===================== --&gt;
  &lt;section class="section" id="rangkuman"&gt;
    &lt;div class="section-tag"&gt;&lt;span class="num"&gt;07&lt;/span&gt; Penguatan Konsep&lt;/div&gt;
    &lt;h2 class="section-title"&gt;Rangkuman Materi&lt;/h2&gt;
    &lt;div class="summary-box"&gt;
      &lt;h4&gt;Poin-Poin Kunci&lt;/h4&gt;
      &lt;ul&gt;
        &lt;li&gt;Mesin pencari bekerja melalui crawling, indexing, dan ranking; gunakan operator pencarian untuk hasil lebih tepat.&lt;/li&gt;
        &lt;li&gt;Evaluasi kredibilitas sumber dengan memeriksa penulis, waktu publikasi, tujuan, dan bukti pendukung.&lt;/li&gt;
        &lt;li&gt;Peramban memiliki fitur tab, bookmark, riwayat, mode incognito, ekstensi, dan indikator keamanan HTTPS.&lt;/li&gt;
        &lt;li&gt;Layanan komunikasi digital (email, chat, video conference) masing-masing punya etika penggunaannya sendiri.&lt;/li&gt;
        &lt;li&gt;Media kolaborasi daring memungkinkan penyuntingan dokumen bersama secara real-time dengan pengaturan akses viewer/commenter/editor.&lt;/li&gt;
        &lt;li&gt;Netiket, verifikasi hoaks, dan keamanan/privasi data adalah dasar berinternet secara bertanggung jawab.&lt;/li&gt;
      &lt;/ul&gt;
    &lt;/div&gt;
  &lt;/section&gt;

  &lt;!-- ===================== TUGAS KELOMPOK ===================== --&gt;
  &lt;section class="section" id="tugas"&gt;
    &lt;div class="section-tag"&gt;&lt;span class="num"&gt;08&lt;/span&gt; Aktivitas Belajar&lt;/div&gt;
    &lt;h2 class="section-title"&gt;Tugas Kelompok&lt;/h2&gt;

    &lt;div class="task-panel"&gt;
      &lt;div class="task-head"&gt;
        &lt;span class="badge"&gt;Kerja Kelompok · 4–5 orang&lt;/span&gt;
        &lt;span class="badge" style="background:var(--accent-dark); color:#fff;"&gt;40 menit diskusi + 20 menit presentasi&lt;/span&gt;
      &lt;/div&gt;
      &lt;h3&gt;Riset &amp; Kolaborasi: Menyusun Artikel Digital Menggunakan Mesin Pencari dan Google Docs&lt;/h3&gt;
      &lt;p&gt;Setiap kelompok melakukan riset singkat tentang sebuah topik teknologi terkini, lalu menyusun hasilnya bersama-sama dalam satu dokumen kolaboratif secara real-time.&lt;/p&gt;

      &lt;ol class="steps-num"&gt;
        &lt;li&gt;&lt;strong&gt;Bentuk kelompok&lt;/strong&gt; beranggotakan 4–5 orang dan tentukan satu topik riset (mis. "Perkembangan Kecerdasan Buatan di Indonesia" atau topik lain yang disetujui guru).&lt;/li&gt;
        &lt;li&gt;&lt;strong&gt;Gunakan mesin pencari&lt;/strong&gt; dengan minimal 2 operator pencarian berbeda (mis. tanda kutip dan site:) untuk menemukan sumber informasi yang relevan.&lt;/li&gt;
        &lt;li&gt;&lt;strong&gt;Evaluasi kredibilitas&lt;/strong&gt; minimal 3 sumber yang ditemukan berdasarkan penulis, waktu publikasi, dan tujuan konten.&lt;/li&gt;
        &lt;li&gt;&lt;strong&gt;Buat satu dokumen Google Docs&lt;/strong&gt; bersama, atur pengaturan berbagi agar seluruh anggota kelompok memiliki akses Editor.&lt;/li&gt;
        &lt;li&gt;&lt;strong&gt;Susun artikel ringkas&lt;/strong&gt; hasil riset secara kolaboratif — seluruh anggota menyunting dokumen yang sama secara bersamaan, lengkap dengan daftar sumber yang digunakan.&lt;/li&gt;
        &lt;li&gt;&lt;strong&gt;Presentasikan&lt;/strong&gt; hasil artikel dan proses kolaborasi kelompok di depan kelas selama maksimal 5 menit per kelompok.&lt;/li&gt;
      &lt;/ol&gt;

      &lt;h3 class="sub-title" style="margin-top:26px;"&gt;Format Laporan&lt;/h3&gt;
      &lt;p&gt;Dokumen memuat: (1) judul &amp; anggota kelompok, (2) daftar kata kunci/operator pencarian yang digunakan, (3) tabel evaluasi kredibilitas 3 sumber, (4) isi artikel ringkas beserta daftar sumber, (5) tautan (link) dokumen Google Docs kelompok.&lt;/p&gt;

      &lt;h3 class="sub-title"&gt;Rubrik Penilaian&lt;/h3&gt;
      &lt;div class="table-scroll"&gt;&lt;table class="rubrik"&gt;
        &lt;tr&gt;&lt;th&gt;Aspek&lt;/th&gt;&lt;th&gt;Indikator&lt;/th&gt;&lt;th&gt;Skor Maks.&lt;/th&gt;&lt;/tr&gt;
        &lt;tr&gt;&lt;td&gt;Strategi Pencarian&lt;/td&gt;&lt;td&gt;Operator pencarian digunakan dengan tepat dan efektif menemukan sumber relevan&lt;/td&gt;&lt;td&gt;20&lt;/td&gt;&lt;/tr&gt;
        &lt;tr&gt;&lt;td&gt;Evaluasi Kredibilitas&lt;/td&gt;&lt;td&gt;Evaluasi sumber logis dan sesuai kriteria (penulis, waktu, tujuan, bukti)&lt;/td&gt;&lt;td&gt;20&lt;/td&gt;&lt;/tr&gt;
        &lt;tr&gt;&lt;td&gt;Kualitas Artikel&lt;/td&gt;&lt;td&gt;Isi artikel jelas, runtut, dan didukung sumber yang valid&lt;/td&gt;&lt;td&gt;25&lt;/td&gt;&lt;/tr&gt;
        &lt;tr&gt;&lt;td&gt;Bukti Kolaborasi&lt;/td&gt;&lt;td&gt;Dokumen menunjukkan kontribusi nyata seluruh anggota secara real-time&lt;/td&gt;&lt;td&gt;20&lt;/td&gt;&lt;/tr&gt;
        &lt;tr&gt;&lt;td&gt;Kerja Sama &amp; Presentasi&lt;/td&gt;&lt;td&gt;Seluruh anggota berkontribusi; presentasi jelas dan percaya diri&lt;/td&gt;&lt;td&gt;15&lt;/td&gt;&lt;/tr&gt;
        &lt;tr&gt;&lt;td colspan="2" style="text-align:right; font-weight:600;"&gt;Total&lt;/td&gt;&lt;td&gt;100&lt;/td&gt;&lt;/tr&gt;
      &lt;/table&gt;&lt;/div&gt;
    &lt;/div&gt;

    &lt;div class="closing-task"&gt;
      &lt;div class="lbl"&gt;Penutup Pembelajaran · Tugas Individu&lt;/div&gt;
      &lt;p style="margin:0;"&gt;&lt;strong&gt;Tulislah satu kesimpulan ringkas (5–7 kalimat) di buku catatan kalian masing-masing&lt;/strong&gt;, yang merangkum keseluruhan materi hari ini: cara kerja mesin pencari dan strategi pencariannya, fitur-fitur peramban, etika layanan komunikasi digital, cara kerja media kolaborasi daring, serta pentingnya netiket dan keamanan digital. Tulis dengan bahasa dan pemahaman kalian sendiri, bukan menyalin ulang materi.&lt;/p&gt;
    &lt;/div&gt;
  &lt;/section&gt;

  &lt;!-- ===================== KUIS INDIVIDU ===================== --&gt;
  &lt;section class="section" id="kuis"&gt;
    &lt;div class="section-tag"&gt;&lt;span class="num"&gt;09&lt;/span&gt; Evaluasi Individu&lt;/div&gt;
    &lt;h2 class="section-title"&gt;Kuis Pilihan Ganda (25 Soal)&lt;/h2&gt;
    &lt;p&gt;Kerjakan seluruh soal berikut secara mandiri. Isi identitas kalian dengan benar — begitu tombol "Hitung &amp; Lihat Skor" ditekan, skor akan otomatis dihitung dan langsung terkirim ke guru.&lt;/p&gt;

    &lt;div class="quiz-panel"&gt;
      &lt;h3 class="sub-title"&gt;Identitas Peserta&lt;/h3&gt;
      &lt;p class="quiz-note"&gt;Pastikan No. Absen, Nama, dan Kelas diisi sesuai data sekolah agar skor tercatat dengan benar.&lt;/p&gt;
      &lt;div class="student-info"&gt;
        &lt;div class="field"&gt;&lt;label for="noAbsen"&gt;No. Absen&lt;/label&gt;&lt;input type="number" id="noAbsen" min="1" placeholder="mis. 12"&gt;&lt;/div&gt;
        &lt;div class="field"&gt;&lt;label for="nama"&gt;Nama Lengkap&lt;/label&gt;&lt;input type="text" id="nama" placeholder="Nama sesuai absensi"&gt;&lt;/div&gt;
        &lt;div class="field"&gt;&lt;label for="kelas"&gt;Kelas&lt;/label&gt;
          &lt;select id="kelas"&gt;
            &lt;option value=""&gt;-- Pilih Kelas --&lt;/option&gt;
            &lt;option value="X TB1"&gt;X TB1&lt;/option&gt;
            &lt;option value="X TB2"&gt;X TB2&lt;/option&gt;
            &lt;option value="X TO1"&gt;X TO1&lt;/option&gt;
            &lt;option value="X TO2"&gt;X TO2&lt;/option&gt;
            &lt;option value="X TJKT1"&gt;X TJKT1&lt;/option&gt;
            &lt;option value="X TJKT2"&gt;X TJKT2&lt;/option&gt;
          &lt;/select&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;h3 class="sub-title"&gt;Soal&lt;/h3&gt;
      &lt;div id="quizContainer"&gt;&lt;/div&gt;

      &lt;div class="quiz-actions"&gt;
        &lt;button id="btnHitung"&gt;Hitung &amp; Lihat Skor&lt;/button&gt;
        &lt;button id="btnKirim"&gt;Kirim Ulang ke Guru&lt;/button&gt;
        &lt;span id="quizMsg"&gt;&lt;/span&gt;
      &lt;/div&gt;

      &lt;div class="result-panel" id="resultPanel"&gt;
        &lt;div class="score-lbl"&gt;Skor Kamu&lt;/div&gt;
        &lt;div class="score" id="scoreValue"&gt;0&lt;/div&gt;
        &lt;p id="resultDetail"&gt;&lt;/p&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/section&gt;

&lt;/main&gt;

&lt;footer&gt;
  INFORMATIKA · PENCARIAN INFORMASI DIGITAL &amp; KOLABORASI DARING · FASE E KELAS X SMK
&lt;/footer&gt;
&lt;/div&gt;

&lt;script&gt;
  // ============================================================
  // KONFIGURASI PENGIRIMAN SKOR KE GOOGLE SHEETS
  // ------------------------------------------------------------
  // Terhubung ke Google Apps Script Web App yang sudah di-deploy.
  // Kolom yang dikirim: no absen, nama, kelas, skor, judul materi.
  // Pastikan skrip doPost() di Apps Script sudah diperbarui agar
  // menerima 5 kolom tersebut (lihat instruksi terpisah).
  // ============================================================
  const GAS_ENDPOINT = "https://script.google.com/macros/s/AKfycbwKp7DrBTALJMlw8crjK7RgXIO8LVcU4yVEd9WJNs_vgSXkVxfw7fwkGbOT2IBNOjg3uQ/exec";
  const JUDUL_MATERI = "Pencarian Informasi Digital dan Kolaborasi Daring";

  const QUESTIONS = [
    { q: "Program/layanan yang berfungsi mencari informasi di internet berdasarkan kata kunci yang dimasukkan pengguna disebut...",
      opts: ["Peramban", "Mesin pencari", "Server", "Cloud storage", "Protokol"], correct: 1 },
    { q: "Proses mesin pencari menjelajahi dan mengumpulkan halaman-halaman web di internet disebut...",
      opts: ["Indexing", "Ranking", "Crawling", "Caching", "Rendering"], correct: 2 },
    { q: "Untuk mencari frasa yang harus muncul persis sama di hasil pencarian, kita dapat menggunakan operator pencarian berupa...",
      opts: ["Tanda minus (-)", "Tanda kutip (\" \")", "Tanda bintang (*)", "site:", "filetype:"], correct: 1 },
    { q: "Operator pencarian \"site:\" digunakan untuk...",
      opts: ["Mencari file dengan format tertentu", "Mengecualikan kata tertentu dari hasil pencarian", "Membatasi hasil pencarian hanya dari satu situs tertentu", "Mencari sinonim kata", "Menyorot kata kunci"], correct: 2 },
    { q: "Ketika mengevaluasi kredibilitas sebuah sumber informasi di internet, hal yang paling penting diperiksa adalah...",
      opts: ["Warna tampilan situs", "Penulis, sumber, dan waktu publikasi", "Jumlah iklan di halaman", "Panjang artikel", "Jumlah gambar dalam artikel"], correct: 1 },
    { q: "Perangkat lunak yang digunakan untuk mengakses dan menampilkan halaman web disebut...",
      opts: ["Mesin pencari", "Peramban (browser)", "Server", "Router", "Sistem operasi"], correct: 1 },
    { q: "Fitur peramban yang memungkinkan pengguna membuka banyak halaman dalam satu jendela sekaligus disebut...",
      opts: ["Bookmark", "Riwayat (history)", "Tab", "Ekstensi", "Cache"], correct: 2 },
    { q: "Mode penjelajahan pada peramban yang tidak menyimpan riwayat, cookie, dan data formulir setelah jendela ditutup disebut...",
      opts: ["Mode offline", "Mode incognito/private browsing", "Mode hemat data", "Mode pengembang", "Mode baca"], correct: 1 },
    { q: "Fitur peramban yang digunakan untuk menyimpan alamat situs favorit agar mudah diakses kembali disebut...",
      opts: ["Cache", "Bookmark", "Cookie", "Plugin", "Riwayat"], correct: 1 },
    { q: "Layanan komunikasi digital yang paling umum digunakan untuk mengirim surat elektronik formal, misalnya melamar kerja, adalah...",
      opts: ["Instant messaging", "Video conference", "Email", "Forum diskusi", "Media sosial"], correct: 2 },
    { q: "Etika menulis email yang baik antara lain...",
      opts: ["Menggunakan subjek email yang jelas dan relevan", "Menulis tanpa salam pembuka maupun penutup", "Menggunakan huruf kapital semua agar terlihat tegas", "Mengirim email tanpa memeriksa ulang isi pesan", "Menuliskan emoji berlebihan di setiap kalimat"], correct: 0 },
    { q: "Layanan yang memungkinkan pengguna melakukan pertemuan tatap muka secara daring melalui audio dan video disebut...",
      opts: ["Email", "Cloud storage", "Video conference", "Forum online", "Mesin pencari"], correct: 2 },
    { q: "Saat mengikuti video conference untuk keperluan sekolah, sikap yang tepat adalah...",
      opts: ["Mematikan mikrofon saat tidak berbicara agar tidak mengganggu", "Menyalakan mikrofon terus-menerus", "Bergabung tanpa memberi salam", "Mengabaikan instruksi moderator", "Membuka banyak aplikasi lain saat presentasi berlangsung"], correct: 0 },
    { q: "Layanan yang memungkinkan beberapa orang menyunting satu dokumen secara bersamaan dan real-time melalui internet disebut...",
      opts: ["Aplikasi pengolah kata offline", "Media kolaborasi daring, mis. Google Docs", "Peramban", "Mesin pencari", "Antivirus"], correct: 1 },
    { q: "Pada Google Docs, pengaturan akses \"Editor\" berarti pengguna yang diberi akses dapat...",
      opts: ["Hanya melihat dokumen", "Melihat dan memberi komentar saja", "Melihat, mengedit, dan mengubah isi dokumen", "Hanya mengunduh dokumen", "Menghapus akun pemilik dokumen"], correct: 2 },
    { q: "Salah satu manfaat utama media kolaborasi daring dalam kerja kelompok adalah...",
      opts: ["Mengharuskan semua anggota bertemu di tempat yang sama", "Memungkinkan anggota kelompok bekerja bersama tanpa harus bertemu langsung", "Menghilangkan kebutuhan untuk berdiskusi", "Membatasi jumlah anggota yang dapat mengakses dokumen", "Hanya dapat digunakan oleh satu orang dalam satu waktu"], correct: 1 },
    { q: "Fitur pada Google Docs yang memungkinkan pengguna melihat dan mengembalikan perubahan dokumen dari waktu ke waktu disebut...",
      opts: ["Version history/riwayat versi", "Mode incognito", "Bookmark", "Cache", "Filter pencarian"], correct: 0 },
    { q: "Etika berinternet yang baik, atau sering disebut \"netiket\", antara lain...",
      opts: ["Menyebarkan informasi tanpa memeriksa kebenarannya", "Berkomentar dengan sopan dan menghargai pendapat orang lain", "Menyalin karya orang lain tanpa mencantumkan sumber", "Membagikan data pribadi orang lain tanpa izin", "Mengirim pesan berantai tanpa verifikasi"], correct: 1 },
    { q: "Berita atau informasi yang sengaja dibuat menyesatkan dan tidak berdasarkan fakta disebut...",
      opts: ["Opini", "Hoaks", "Editorial", "Testimoni", "Riset ilmiah"], correct: 1 },
    { q: "Langkah paling tepat untuk memverifikasi kebenaran sebuah informasi yang beredar di internet adalah...",
      opts: ["Langsung membagikannya jika judulnya menarik", "Membandingkan dengan beberapa sumber terpercaya lain", "Mempercayainya karena dibagikan banyak orang", "Mengabaikan tanggal publikasinya", "Hanya membaca judul tanpa membaca isi berita"], correct: 1 },
    { q: "Tindakan yang sebaiknya dihindari saat berkolaborasi menggunakan dokumen daring bersama adalah...",
      opts: ["Memberi komentar yang membangun", "Menghapus atau mengubah pekerjaan anggota lain tanpa izin", "Menyimpan dokumen secara berkala", "Membagi tugas dengan jelas", "Berdiskusi melalui kolom komentar"], correct: 1 },
    { q: "Untuk menjaga privasi saat membagikan dokumen daring, sebaiknya pengaturan berbagi (sharing) diatur agar...",
      opts: ["Semua orang di internet dapat mengedit tanpa batasan", "Hanya orang/kelompok yang dituju yang memiliki akses sesuai kebutuhan", "Tidak perlu diatur karena internet selalu aman", "Dibagikan ke sebanyak mungkin orang agar cepat selesai", "Selalu diberi akses sebagai Editor untuk siapa pun"], correct: 1 },
    { q: "Ciri email atau pesan phishing yang patut diwaspadai antara lain...",
      opts: ["Dikirim dari alamat resmi yang dikenal dan terverifikasi", "Meminta data pribadi/kata sandi secara mendesak melalui tautan mencurigakan", "Tidak menyertakan tautan apa pun", "Berisi informasi resmi dari sekolah yang telah diverifikasi", "Menggunakan bahasa formal dan tidak terburu-buru"], correct: 1 },
    { q: "Sikap yang tepat ketika menemukan konten SARA atau ujaran kebencian saat berselancar atau berkolaborasi daring adalah...",
      opts: ["Ikut menyebarkannya agar viral", "Membalasnya dengan komentar yang sama kasarnya", "Tidak menyebarkan, dan melaporkan konten tersebut sesuai mekanisme platform", "Mengabaikannya tanpa melakukan apa pun", "Mengunduh dan menyimpannya untuk koleksi pribadi"], correct: 2 },
    { q: "Manfaat menggunakan operator dan strategi pencarian yang tepat pada mesin pencari adalah...",
      opts: ["Memperlambat proses pencarian", "Menghasilkan informasi yang lebih relevan dan sesuai kebutuhan", "Menyembunyikan seluruh hasil pencarian", "Menghapus riwayat pencarian secara otomatis", "Membuat peramban berhenti berfungsi"], correct: 1 }
  ];

  const LETTERS = ["A","B","C","D","E"];
  const container = document.getElementById('quizContainer');

  QUESTIONS.forEach((item, qi) =&gt; {
    const card = document.createElement('div');
    card.className = 'q-card';
    const num = document.createElement('div');
    num.className = 'q-num';
    num.textContent = 'SOAL ' + (qi+1) + ' / ' + QUESTIONS.length;
    const text = document.createElement('div');
    text.className = 'q-text';
    text.textContent = (qi+1) + '. ' + item.q;
    const opts = document.createElement('div');
    opts.className = 'options';

    item.opts.forEach((optText, oi) =&gt; {
      const label = document.createElement('label');
      label.className = 'opt';
      const input = document.createElement('input');
      input.type = 'radio';
      input.name = 'q' + qi;
      input.value = oi;
      input.addEventListener('change', () =&gt; {
        opts.querySelectorAll('.opt').forEach(o =&gt; o.classList.remove('selected'));
        label.classList.add('selected');
      });
      const span = document.createElement('span');
      span.textContent = LETTERS[oi] + '. ' + optText;
      label.appendChild(input);
      label.appendChild(span);
      opts.appendChild(label);
    });

    card.appendChild(num);
    card.appendChild(text);
    card.appendChild(opts);
    container.appendChild(card);
  });

  let finalScore = null;

  document.getElementById('btnHitung').addEventListener('click', () =&gt; {
    const noAbsen = document.getElementById('noAbsen').value.trim();
    const nama = document.getElementById('nama').value.trim();
    const kelas = document.getElementById('kelas').value.trim();
    const msg = document.getElementById('quizMsg');

    if (!noAbsen || !nama || !kelas) {
      msg.textContent = 'Lengkapi No. Absen, Nama, dan Kelas terlebih dahulu.';
      return;
    }

    let answered = 0, correct = 0;
    QUESTIONS.forEach((item, qi) =&gt; {
      const picked = document.querySelector('input[name="q' + qi + '"]:checked');
      if (picked) {
        answered++;
        if (parseInt(picked.value) === item.correct) correct++;
      }
    });

    if (answered &lt; QUESTIONS.length) {
      msg.textContent = 'Masih ada ' + (QUESTIONS.length - answered) + ' soal yang belum dijawab.';
      return;
    }

    msg.textContent = '';
    finalScore = Math.round((correct / QUESTIONS.length) * 100);

    document.getElementById('scoreValue').textContent = finalScore;
    document.getElementById('resultDetail').textContent =
      'Jawaban benar: ' + correct + ' dari ' + QUESTIONS.length + ' soal. Skor sedang dikirim ke guru...';
    document.getElementById('resultPanel').style.display = 'block';

    kirimSkor(noAbsen, nama, kelas, finalScore);
  });

  function kirimSkor(noAbsen, nama, kelas, skor) {
    const msg = document.getElementById('quizMsg');
    const btnKirim = document.getElementById('btnKirim');
    const resultDetail = document.getElementById('resultDetail');

    if (GAS_ENDPOINT.indexOf('GANTI_DENGAN_URL_WEB_APP_ANDA') !== -1) {
      msg.textContent = 'Pengiriman belum aktif — guru perlu memasang URL Apps Script terlebih dahulu.';
      btnKirim.style.display = 'inline-block';
      return;
    }

    btnKirim.disabled = true;
    msg.textContent = 'Mengirim skor...';

    fetch(GAS_ENDPOINT, {
      method: 'POST',
      mode: 'no-cors',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({ noAbsen: noAbsen, nama: nama, kelas: kelas, skor: skor, judulMateri: JUDUL_MATERI })
    }).then(() =&gt; {
      msg.textContent = 'Jawaban terkirim otomatis ke guru.';
      resultDetail.textContent = 'Jawaban benar: ' + Math.round(skor * QUESTIONS.length / 100) + ' dari ' + QUESTIONS.length + ' soal. Skor sudah terkirim ke guru.';
      btnKirim.style.display = 'none';
      btnKirim.disabled = false;
    }).catch(() =&gt; {
      msg.textContent = 'Gagal mengirim otomatis — klik "Kirim Ulang ke Guru", atau foto layar skor ini.';
      btnKirim.style.display = 'inline-block';
      btnKirim.disabled = false;
    });
  }

  document.getElementById('btnKirim').addEventListener('click', () =&gt; {
    const noAbsen = document.getElementById('noAbsen').value.trim();
    const nama = document.getElementById('nama').value.trim();
    const kelas = document.getElementById('kelas').value.trim();
    if (finalScore === null) return;
    kirimSkor(noAbsen, nama, kelas, finalScore);
  });
&lt;/script&gt;

&lt;/body&gt;
&lt;/html&gt;</description><link>http://kitab-investasi.blogspot.com/2026/09/pencarian-informasi-digital-kolaborasi.html</link><thr:total>0</thr:total><author>nof_rizal07@yahoo.co.id (abang_cool)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-9000860041661554971.post-863962356719859888</guid><pubDate>Fri, 21 Aug 2026 02:35:33 +0000</pubDate><atom:updated>2026-08-21T09:35:33.055+07:00</atom:updated><title>Menyajikan Teks Prosedur &amp; Rangkuman Materi Petunjuk Kerja</title><description>&lt;style&gt;
@import url('https://fonts.googleapis.com/css2?family=Oswald:wght@400;500;600;700&amp;family=Source+Sans+3:wght@400;500;600;700&amp;family=IBM+Plex+Mono:wght@400;500;600&amp;display=swap');
.epb{
  --blueprint:#0F2A3D;
  --blueprint-deep:#0A1E2C;
  --panel:#4A2E12;
  --paper:#F3F0E6;
  --ink:#132029;
  --amber:#F5A623;
  --amber-deep:#C97F12;
  --mint:#6EC6CA;
  --line:rgba(234,242,245,0.16);
  --off-white:#EAF2F5;
  --muted:#9FB4C2;
}
.epb *{box-sizing:border-box;}
.epb{scroll-behavior:smooth; background:#0A1F2E;}
.epb{
  margin:0;
  position:relative;
  overflow:hidden;
  background:var(--blueprint);
  color:var(--off-white);
  font-family:'Source Sans 3',sans-serif;
  line-height:1.65;
  background-image:
    linear-gradient(var(--line) 1px, transparent 1px),
    linear-gradient(90deg, var(--line) 1px, transparent 1px);
  background-size: 34px 34px;
}
.epb h1, .epb h2, .epb h3, .epb h4{font-family:'Oswald',sans-serif; text-transform:uppercase; letter-spacing:0.02em; margin:0 0 0.5em;}
.epb .mono{font-family:'IBM Plex Mono',monospace;}
.epb a{color:var(--amber);}
.epb .crop{position:absolute; width:22px; height:22px; z-index:5; opacity:.55; pointer-events:none;}
.epb .crop::before, .epb .crop::after{content:"";position:absolute;background:var(--mint);}
.epb .crop::before{width:100%;height:1px;top:50%;left:0;}
.epb .crop::after{width:1px;height:100%;left:50%;top:0;}
.epb .crop.tl{top:14px;left:14px;}
.epb .crop.tr{top:14px;right:14px;}
.epb .crop.bl{bottom:14px;left:14px;}
.epb .crop.br{bottom:14px;right:14px;}
.epb header.cover{
  position:relative;
  padding:40px 24px 36px;
  border-bottom:1px solid var(--line);
  overflow:hidden;
}
.epb .doc-code{font-family:'IBM Plex Mono',monospace; color:var(--amber); letter-spacing:0.15em; font-size:0.78rem; text-transform:uppercase; margin-bottom:18px; display:flex; gap:10px; align-items:center;}
.epb .doc-code::before{content:"◆"; color:var(--amber);}
.epb .cover h1{font-size:clamp(1.6rem,7vw,2.5rem); color:var(--off-white); max-width:16ch; line-height:1.05;}
.epb .cover .subtitle{color:var(--muted); font-size:1.05rem; max-width:60ch; margin-top:14px;}
.epb .meta-strip{
  margin-top:38px; display:grid; grid-template-columns:repeat(auto-fit,minmax(150px,1fr));
  border-top:1px dashed var(--line); border-bottom:1px dashed var(--line);
}
.epb .meta-strip div{padding:14px 16px; border-right:1px dashed var(--line);}
.epb .meta-strip div:last-child{border-right:none;}
.epb .meta-strip .k{font-family:'IBM Plex Mono',monospace; font-size:0.68rem; color:var(--amber); text-transform:uppercase; letter-spacing:0.1em;}
.epb .meta-strip .v{font-size:0.98rem; color:var(--off-white); margin-top:4px; font-weight:600;}
.epb .stamp{
  position:absolute; top:40px; right:20px; width:104px; height:104px;
  border:2.5px solid var(--amber); border-radius:50%;
  display:flex; align-items:center; justify-content:center;
  transform:rotate(-11deg);
  color:var(--amber); font-family:'IBM Plex Mono',monospace;
  text-align:center; font-size:0.62rem; letter-spacing:0.08em; text-transform:uppercase;
  opacity:0.9;
}
.epb .stamp .ring{position:absolute; inset:8px; border:1px dashed var(--amber); border-radius:50%;}
.epb .stamp b{display:block; font-family:'Oswald',sans-serif; font-size:1.05rem; letter-spacing:0.06em; margin-top:4px;}

@media (max-width:760px){.epb .stamp{display:none;}
.epb }


.epb main{max-width:920px; margin:0 auto; padding:0 20px 60px;}
.epb .section{padding-top:64px;}
.epb .eyebrow{font-family:'IBM Plex Mono',monospace; color:var(--amber); font-size:0.78rem; letter-spacing:0.14em; text-transform:uppercase; margin-bottom:10px; display:flex; align-items:center; gap:10px;}
.epb .eyebrow::after{content:""; flex:1; height:1px; background:var(--line);}
.epb h2.section-title{font-size:1.7rem; color:var(--off-white);}
.epb p{color:#DDE7EC;}
.epb .lead{color:var(--muted); font-size:1.02rem; max-width:72ch;}
.epb .panel{
  background:var(--panel); border:1px solid var(--line); border-radius:2px;
  padding:26px 28px; margin:22px 0;
}
.epb .panel.tp{border-left:4px solid var(--mint);}
.epb .panel.warn{border-left:4px solid var(--amber);}
.epb .tp-box{display:grid; gap:14px; margin-top:18px;}
.epb .tp-item{display:flex; gap:14px; align-items:flex-start;}
.epb .tp-item .idx{font-family:'IBM Plex Mono',monospace; color:var(--amber); font-weight:600; min-width:34px;}
.epb .flow{display:grid; grid-template-columns:repeat(auto-fit,minmax(220px,1fr)); gap:14px; margin-top:20px;}
.epb .flow .step{background:var(--blueprint-deep); border:1px solid var(--line); padding:18px; position:relative;}
.epb .flow .step .tag{font-family:'IBM Plex Mono',monospace; color:var(--amber); font-size:0.7rem; letter-spacing:0.1em; text-transform:uppercase;}
.epb .flow .step h4{font-size:1rem; margin-top:8px; color:var(--off-white);}
.epb .flow .step .time{position:absolute; top:16px; right:16px; font-family:'IBM Plex Mono',monospace; font-size:0.7rem; color:var(--amber);}
.epb .grid-3{display:grid; grid-template-columns:repeat(auto-fit,minmax(200px,1fr)); gap:14px; margin-top:16px;}
.epb .card{background:var(--blueprint-deep); border:1px solid var(--line); padding:18px;}
.epb .card h4{color:var(--amber); font-size:0.95rem;}
.epb .criteria{display:grid; gap:16px; margin-top:20px;}
.epb .crit{
  background:var(--blueprint-deep); border:1px solid var(--line);
  display:grid; grid-template-columns:64px 1fr; gap:0;
}
.epb .crit .num{
  background:var(--amber); color:var(--blueprint-deep); font-family:'IBM Plex Mono',monospace;
  font-weight:700; display:flex; align-items:center; justify-content:center; font-size:1.05rem;
}
.epb .crit .body{padding:18px 20px;}
.epb .crit h4{color:var(--off-white); font-size:1.02rem; margin-bottom:6px;}
.epb .crit .q{margin-top:10px; padding-top:10px; border-top:1px dashed var(--line); font-family:'IBM Plex Mono',monospace; font-size:0.86rem; color:var(--amber);}
.epb .timeline{margin-top:24px; position:relative; padding-left:34px;}
.epb .timeline::before{content:""; position:absolute; left:11px; top:6px; bottom:6px; width:2px; background:var(--line);}
.epb .tl-item{position:relative; padding-bottom:26px;}
.epb .tl-item:last-child{padding-bottom:0;}
.epb .tl-item::before{content:""; position:absolute; left:-34px; top:2px; width:22px; height:22px; border-radius:50%; background:var(--blueprint); border:2px solid var(--amber);}
.epb .tl-item h4{color:var(--off-white); font-size:1rem; margin-bottom:4px;}
.epb .doc-sample{
  background:var(--paper); color:var(--ink); border-radius:2px; padding:0; margin-top:22px;
  box-shadow:0 20px 45px rgba(0,0,0,0.35);
}
.epb .doc-sample .doc-head{background:var(--ink); color:var(--paper); padding:12px 22px; font-family:'IBM Plex Mono',monospace; font-size:0.75rem; letter-spacing:0.1em; text-transform:uppercase; display:flex; justify-content:space-between;}
.epb .doc-sample .doc-body{padding:26px 28px 30px;}
.epb .doc-sample h3{font-family:'Oswald',sans-serif; color:var(--ink); font-size:1.25rem; text-transform:none; letter-spacing:0;}
.epb .doc-sample ol{padding-left:22px;}
.epb .doc-sample li{margin-bottom:9px;}
.epb .flag{
  display:inline-block; font-family:'IBM Plex Mono',monospace; font-size:0.7rem; font-weight:600;
  background:#D94E2A; color:#fff; padding:1px 7px; border-radius:2px; margin-left:6px; vertical-align:middle;
}
.epb .doc-sample .note-margin{margin-top:6px; font-family:'IBM Plex Mono',monospace; font-size:0.78rem; color:#8A3A1F; padding-left:8px; border-left:2px solid #D94E2A;}
.epb .legend{display:flex; flex-wrap:wrap; gap:10px 20px; margin-top:16px;}
.epb .legend span{font-family:'IBM Plex Mono',monospace; font-size:0.78rem; color:var(--muted); display:flex; align-items:center; gap:8px;}
.epb .legend .dot{width:10px; height:10px; border-radius:50%; display:inline-block;}
.epb table{width:100%; border-collapse:collapse; margin-top:18px; font-size:0.94rem;}
.epb th, .epb td{border:1px solid var(--line); padding:10px 12px; text-align:left; vertical-align:top;}
.epb th{background:var(--blueprint-deep); font-family:'IBM Plex Mono',monospace; font-size:0.75rem; text-transform:uppercase; letter-spacing:0.06em; color:var(--amber);}
.epb .summary-box{
  border:1px solid var(--amber); background:linear-gradient(180deg, rgba(245,166,35,0.08), transparent);
  padding:24px 26px; margin-top:24px;
}
.epb .summary-box ul{margin:10px 0 0; padding-left:20px;}
.epb .summary-box li{margin-bottom:8px;}
.epb .task-header{
  background:var(--amber); color:var(--blueprint-deep); padding:22px 26px; margin-top:20px;
  display:flex; justify-content:space-between; align-items:center; flex-wrap:wrap; gap:10px;
}
.epb .task-header h2{color:var(--blueprint-deep); font-size:1.4rem; margin:0;}
.epb .task-header .badge{font-family:'IBM Plex Mono',monospace; font-size:0.8rem; background:var(--blueprint-deep); color:var(--amber); padding:6px 12px; border-radius:2px;}
.epb .steps-num{counter-reset:step; margin-top:18px; list-style:none; padding:0;}
.epb .steps-num li{counter-increment:step; position:relative; padding-left:44px; margin-bottom:16px;}
.epb .steps-num li::before{content:counter(step,decimal-leading-zero); position:absolute; left:0; top:0; font-family:'IBM Plex Mono',monospace; color:var(--amber); font-weight:600; font-size:0.95rem; border:1px solid var(--amber); width:30px; height:26px; display:flex; align-items:center; justify-content:center;}
.epb .rubric-scale{display:grid; grid-template-columns:repeat(4,1fr); gap:10px; margin-top:16px;}
.epb .rubric-scale div{background:var(--blueprint-deep); border:1px solid var(--line); padding:12px; text-align:center;}
.epb .rubric-scale .n{font-family:'IBM Plex Mono',monospace; color:var(--amber); font-size:1.3rem; font-weight:700;}
.epb .rubric-scale .l{font-size:0.78rem; color:var(--muted); text-transform:uppercase; letter-spacing:0.05em;}
.epb .notebook{
  background:repeating-linear-gradient(var(--paper), var(--paper) 33px, #D8D3C2 34px);
  color:var(--ink); border-radius:2px; padding:28px 30px; margin-top:20px; position:relative;
  box-shadow:0 20px 45px rgba(0,0,0,0.35);
}
.epb .notebook::before{content:""; position:absolute; left:46px; top:0; bottom:0; width:1.5px; background:#C0453A; opacity:0.5;}
.epb .notebook .content{padding-left:24px;}
.epb .notebook h3{color:var(--ink); font-family:'Oswald',sans-serif; letter-spacing:0.02em; margin-bottom:10px;}
.epb .notebook ul{padding-left:20px;}
.epb footer{border-top:1px solid var(--line); padding:24px 20px 40px; color:var(--muted); font-size:0.86rem;}
.epb footer .doc-code{margin-bottom:10px;}
.epb .divider-dash{border:none; border-top:1px dashed var(--line); margin:44px 0 0;}
.epb::selection{background:var(--amber); color:var(--blueprint-deep);}

&lt;/style&gt;
&lt;div class="epb"&gt;
&lt;div class="crop tl"&gt;&lt;/div&gt;&lt;div class="crop tr"&gt;&lt;/div&gt;&lt;div class="crop bl"&gt;&lt;/div&gt;&lt;div class="crop br"&gt;&lt;/div&gt;

&lt;header class="cover"&gt;
  &lt;div class="stamp"&gt;&lt;div class="ring"&gt;&lt;/div&gt;&lt;span&gt;Modul Ajar&lt;b&gt;Terverifikasi&lt;/b&gt;Fase F&lt;/span&gt;&lt;/div&gt;
  &lt;div class="doc-code"&gt;DOK/B.INDO/XI/PROSEDUR-SAJIKAN — 3 JP · 1 Pertemuan&lt;/div&gt;
  &lt;h1&gt;Menyajikan Teks Prosedur &amp;amp; Rangkuman Materi Petunjuk Kerja&lt;/h1&gt;
  &lt;p class="subtitle"&gt;Materi Bahasa Indonesia Kelas XI SMK/MAK — melatih murid menyajikan teks prosedur secara lisan/tulisan sekaligus mereview seluruh materi pokok bahasan Petunjuk Kerja.&lt;/p&gt;

  &lt;div class="meta-strip"&gt;
    &lt;div&gt;&lt;div class="k"&gt;Mata Pelajaran&lt;/div&gt;&lt;div class="v"&gt;Bahasa Indonesia&lt;/div&gt;&lt;/div&gt;
    &lt;div&gt;&lt;div class="k"&gt;Jenjang&lt;/div&gt;&lt;div class="v"&gt;SMK/MAK — Kelas XI&lt;/div&gt;&lt;/div&gt;
    &lt;div&gt;&lt;div class="k"&gt;Elemen&lt;/div&gt;&lt;div class="v"&gt;Berbicara, Menulis &amp;amp; Memirsa&lt;/div&gt;&lt;/div&gt;
    &lt;div&gt;&lt;div class="k"&gt;Alokasi Waktu&lt;/div&gt;&lt;div class="v"&gt;3 JP (3 × 45 menit)&lt;/div&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/header&gt;

&lt;main&gt;

  &lt;!-- ============ TUJUAN PEMBELAJARAN ============ --&gt;
  &lt;section class="section" id="tujuan"&gt;
    &lt;div class="eyebrow"&gt;01 — Identitas Pembelajaran&lt;/div&gt;
    &lt;h2 class="section-title"&gt;Capaian &amp;amp; Tujuan Pembelajaran&lt;/h2&gt;

    &lt;div class="panel tp"&gt;
      &lt;div class="eyebrow" style="margin-bottom:6px;"&gt;Capaian Pembelajaran (Elemen Berbicara, Menulis &amp;amp; Memirsa)&lt;/div&gt;
      &lt;p&gt;Murid mampu menyajikan gagasan dan hasil karya berupa teks prosedur secara lisan maupun tulisan dengan struktur dan kaidah kebahasaan yang tepat, serta mampu mereview pemahamannya terhadap materi yang telah dipelajari.&lt;/p&gt;
    &lt;/div&gt;

    &lt;div class="panel"&gt;
      &lt;div class="eyebrow" style="margin-bottom:6px;"&gt;Tujuan Pembelajaran&lt;/div&gt;
      &lt;p style="font-size:1.05rem; color:var(--off-white); font-weight:600;"&gt;Murid mampu menyajikan teks prosedur yang telah dibuat secara lisan/tulisan dan mereview seluruh materi pokok bahasan petunjuk kerja.&lt;/p&gt;

      &lt;div class="tp-box"&gt;
        &lt;div class="tp-item"&gt;&lt;span class="idx mono"&gt;TP.1&lt;/span&gt;&lt;p&gt;Murid dapat menyajikan teks prosedur secara lisan dengan intonasi, artikulasi, dan sikap yang tepat.&lt;/p&gt;&lt;/div&gt;
        &lt;div class="tp-item"&gt;&lt;span class="idx mono"&gt;TP.2&lt;/span&gt;&lt;p&gt;Murid dapat menyajikan teks prosedur secara tulisan dengan struktur dan kaidah kebahasaan yang benar.&lt;/p&gt;&lt;/div&gt;
        &lt;div class="tp-item"&gt;&lt;span class="idx mono"&gt;TP.3&lt;/span&gt;&lt;p&gt;Murid dapat mereview kembali materi evaluasi informasi, perbandingan teks, dan kaidah kebahasaan teks prosedur.&lt;/p&gt;&lt;/div&gt;
        &lt;div class="tp-item"&gt;&lt;span class="idx mono"&gt;TP.4&lt;/span&gt;&lt;p&gt;Murid dapat menjawab pertanyaan reviu materi pokok bahasan petunjuk kerja secara mandiri.&lt;/p&gt;&lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class="eyebrow" style="margin-top:26px; margin-bottom:6px;"&gt;8 Profil Lulusan yang Dikembangkan&lt;/div&gt;
    &lt;div class="grid-3"&gt;
      &lt;div class="card"&gt;&lt;h4&gt;Komunikasi&lt;/h4&gt;&lt;p style="font-size:0.9rem;"&gt;Menyajikan teks prosedur secara lisan dan tulisan dengan jelas.&lt;/p&gt;&lt;/div&gt;
      &lt;div class="card"&gt;&lt;h4&gt;Kemandirian&lt;/h4&gt;&lt;p style="font-size:0.9rem;"&gt;Mengerjakan reviu materi secara mandiri.&lt;/p&gt;&lt;/div&gt;
      &lt;div class="card"&gt;&lt;h4&gt;Kolaborasi&lt;/h4&gt;&lt;p style="font-size:0.9rem;"&gt;Bekerja sama menyiapkan dan menyajikan teks prosedur kelompok.&lt;/p&gt;&lt;/div&gt;
      &lt;div class="card"&gt;&lt;h4&gt;Penalaran Kritis&lt;/h4&gt;&lt;p style="font-size:0.9rem;"&gt;Mereview dan menghubungkan seluruh materi yang telah dipelajari.&lt;/p&gt;&lt;/div&gt;
    &lt;/div&gt;
  &lt;/section&gt;

  &lt;hr class="divider-dash"&gt;

  &lt;!-- ============ MATERI A: RECAP SELURUH UNIT ============ --&gt;
  &lt;section class="section" id="materi-a"&gt;
    &lt;div class="eyebrow"&gt;02 — Materi Inti A&lt;/div&gt;
    &lt;h2 class="section-title"&gt;Mengingat Kembali Materi Pokok Bahasan "Petunjuk Kerja"&lt;/h2&gt;
    &lt;p class="lead"&gt;Sebelum menyajikan teks prosedur, mari mengingat kembali seluruh materi yang telah dipelajari pada pokok bahasan Petunjuk Kerja.&lt;/p&gt;

    &lt;div class="timeline"&gt;
      &lt;div class="tl-item"&gt;&lt;h4 class="mono"&gt;01 · Evaluasi Informasi dalam Teks Prosedur&lt;/h4&gt;&lt;p&gt;Menilai keakuratan, kelengkapan, kelogisan urutan, kejelasan bahasa, kesesuaian tujuan, dan keselamatan sebuah teks prosedur.&lt;/p&gt;&lt;/div&gt;
      &lt;div class="tl-item"&gt;&lt;h4 class="mono"&gt;02 · Membandingkan Teks Prosedur dengan Teks Lain&lt;/h4&gt;&lt;p&gt;Menemukan persamaan dan perbedaan teks prosedur dengan teks eksplanasi berdasarkan tujuan, struktur, dan kebahasaan.&lt;/p&gt;&lt;/div&gt;
      &lt;div class="tl-item"&gt;&lt;h4 class="mono"&gt;03 · Kaidah Kebahasaan Teks Prosedur (Bagian 1)&lt;/h4&gt;&lt;p&gt;Mengidentifikasi kalimat imperatif, deklaratif, persuasif, dan konjungsi temporal.&lt;/p&gt;&lt;/div&gt;
      &lt;div class="tl-item"&gt;&lt;h4 class="mono"&gt;04 · Kaidah Kebahasaan (Bagian 2) &amp;amp; Menyusun Teks Prosedur&lt;/h4&gt;&lt;p&gt;Menganalisis kalimat perintah, kata teknis, penanda wacana, serta menyusun teks prosedur baru.&lt;/p&gt;&lt;/div&gt;
      &lt;div class="tl-item"&gt;&lt;h4 class="mono"&gt;05 · Menyajikan Teks Prosedur (Materi Hari Ini)&lt;/h4&gt;&lt;p&gt;Menyajikan teks prosedur yang telah disusun secara lisan maupun tulisan kepada audiens.&lt;/p&gt;&lt;/div&gt;
    &lt;/div&gt;
  &lt;/section&gt;

  &lt;hr class="divider-dash"&gt;

  &lt;!-- ============ MATERI B: MENYAJIKAN LISAN ============ --&gt;
  &lt;section class="section" id="materi-b"&gt;
    &lt;div class="eyebrow"&gt;03 — Materi Inti B&lt;/div&gt;
    &lt;h2 class="section-title"&gt;Menyajikan Teks Prosedur secara Lisan&lt;/h2&gt;
    &lt;p class="lead"&gt;Menyajikan teks prosedur secara lisan berarti menyampaikan langkah-langkah tersebut secara langsung di hadapan pendengar.&lt;/p&gt;

    &lt;div class="grid-3"&gt;
      &lt;div class="card"&gt;&lt;h4&gt;Intonasi&lt;/h4&gt;&lt;p style="font-size:0.9rem;"&gt;Naik-turunnya nada suara untuk menekankan bagian penting.&lt;/p&gt;&lt;/div&gt;
      &lt;div class="card"&gt;&lt;h4&gt;Artikulasi&lt;/h4&gt;&lt;p style="font-size:0.9rem;"&gt;Kejelasan pelafalan setiap kata agar mudah dipahami pendengar.&lt;/p&gt;&lt;/div&gt;
      &lt;div class="card"&gt;&lt;h4&gt;Sikap &amp;amp; Kepercayaan Diri&lt;/h4&gt;&lt;p style="font-size:0.9rem;"&gt;Berdiri tegak, tenang, dan yakin saat menyajikan.&lt;/p&gt;&lt;/div&gt;
      &lt;div class="card"&gt;&lt;h4&gt;Kontak Mata&lt;/h4&gt;&lt;p style="font-size:0.9rem;"&gt;Memandang audiens secara merata, tidak hanya membaca naskah.&lt;/p&gt;&lt;/div&gt;
      &lt;div class="card"&gt;&lt;h4&gt;Kecepatan Bicara&lt;/h4&gt;&lt;p style="font-size:0.9rem;"&gt;Tidak terlalu cepat maupun terlalu lambat.&lt;/p&gt;&lt;/div&gt;
      &lt;div class="card"&gt;&lt;h4&gt;Bahasa Tubuh&lt;/h4&gt;&lt;p style="font-size:0.9rem;"&gt;Gestur yang mendukung penjelasan, bukan mengganggu.&lt;/p&gt;&lt;/div&gt;
    &lt;/div&gt;
  &lt;/section&gt;

  &lt;hr class="divider-dash"&gt;

  &lt;!-- ============ MATERI C: MENYAJIKAN TULISAN ============ --&gt;
  &lt;section class="section" id="materi-c"&gt;
    &lt;div class="eyebrow"&gt;04 — Materi Inti C&lt;/div&gt;
    &lt;h2 class="section-title"&gt;Menyajikan Teks Prosedur secara Tulisan&lt;/h2&gt;
    &lt;p class="lead"&gt;Menyajikan teks prosedur secara tulisan berarti menuangkan langkah-langkah dalam bentuk teks yang dapat dibaca, seperti artikel, poster, atau infografis.&lt;/p&gt;

    &lt;div class="grid-3"&gt;
      &lt;div class="card"&gt;&lt;h4&gt;Kerapian Struktur&lt;/h4&gt;&lt;p style="font-size:0.9rem;"&gt;Tujuan, alat/bahan, dan langkah tersusun jelas dan berurutan.&lt;/p&gt;&lt;/div&gt;
      &lt;div class="card"&gt;&lt;h4&gt;Ejaan &amp;amp; Tanda Baca&lt;/h4&gt;&lt;p style="font-size:0.9rem;"&gt;Penulisan sesuai kaidah bahasa Indonesia yang baku.&lt;/p&gt;&lt;/div&gt;
      &lt;div class="card"&gt;&lt;h4&gt;Kejelasan Langkah&lt;/h4&gt;&lt;p style="font-size:0.9rem;"&gt;Setiap langkah ditulis ringkas namun tidak ambigu.&lt;/p&gt;&lt;/div&gt;
      &lt;div class="card"&gt;&lt;h4&gt;Media Visual Pendukung&lt;/h4&gt;&lt;p style="font-size:0.9rem;"&gt;Dapat disertai gambar, diagram, atau foto agar lebih mudah dipahami.&lt;/p&gt;&lt;/div&gt;
    &lt;/div&gt;
  &lt;/section&gt;

  &lt;hr class="divider-dash"&gt;

  &lt;!-- ============ MATERI D: PERBEDAAN LISAN &amp; TULISAN ============ --&gt;
  &lt;section class="section" id="materi-d"&gt;
    &lt;div class="eyebrow"&gt;05 — Materi Inti D&lt;/div&gt;
    &lt;h2 class="section-title"&gt;Perbedaan Menyajikan secara Lisan dan Tulisan&lt;/h2&gt;

    &lt;table&gt;
      &lt;tr&gt;&lt;th style="width:22%;"&gt;Aspek&lt;/th&gt;&lt;th&gt;Penyajian Lisan&lt;/th&gt;&lt;th&gt;Penyajian Tulisan&lt;/th&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Media&lt;/td&gt;&lt;td&gt;Suara dan bahasa tubuh&lt;/td&gt;&lt;td&gt;Teks dan visual pendukung&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Kelebihan&lt;/td&gt;&lt;td&gt;Interaktif, bisa tanya jawab langsung&lt;/td&gt;&lt;td&gt;Dapat dibaca ulang dan disimpan lama&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Kekurangan&lt;/td&gt;&lt;td&gt;Sulit diulang, bergantung pada memori pembicara&lt;/td&gt;&lt;td&gt;Tidak ada interaksi langsung dengan audiens&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Penilaian Utama&lt;/td&gt;&lt;td&gt;Intonasi, artikulasi, sikap, kontak mata&lt;/td&gt;&lt;td&gt;Struktur, ejaan, kejelasan langkah&lt;/td&gt;&lt;/tr&gt;
    &lt;/table&gt;
  &lt;/section&gt;

  &lt;hr class="divider-dash"&gt;

  &lt;!-- ============ MATERI E: LANGKAH MENYAJIKAN ============ --&gt;
  &lt;section class="section" id="materi-e"&gt;
    &lt;div class="eyebrow"&gt;06 — Materi Inti E&lt;/div&gt;
    &lt;h2 class="section-title"&gt;Langkah-Langkah Menyajikan Teks Prosedur&lt;/h2&gt;

    &lt;div class="timeline"&gt;
      &lt;div class="tl-item"&gt;&lt;h4 class="mono"&gt;01 · Memahami Isi Teks&lt;/h4&gt;&lt;p&gt;Membaca ulang teks prosedur yang akan disajikan agar benar-benar dipahami.&lt;/p&gt;&lt;/div&gt;
      &lt;div class="tl-item"&gt;&lt;h4 class="mono"&gt;02 · Menyiapkan Media Bantu&lt;/h4&gt;&lt;p&gt;Menyiapkan alat peraga, gambar, atau catatan poin penting bila diperlukan.&lt;/p&gt;&lt;/div&gt;
      &lt;div class="tl-item"&gt;&lt;h4 class="mono"&gt;03 · Berlatih Menyajikan&lt;/h4&gt;&lt;p&gt;Berlatih menyampaikan secara lisan dengan intonasi dan kecepatan yang tepat.&lt;/p&gt;&lt;/div&gt;
      &lt;div class="tl-item"&gt;&lt;h4 class="mono"&gt;04 · Menyajikan di Depan Audiens&lt;/h4&gt;&lt;p&gt;Menyampaikan teks prosedur dengan percaya diri, jelas, dan runtut.&lt;/p&gt;&lt;/div&gt;
      &lt;div class="tl-item"&gt;&lt;h4 class="mono"&gt;05 · Menerima Umpan Balik&lt;/h4&gt;&lt;p&gt;Menerima masukan dari pendengar untuk perbaikan penyajian berikutnya.&lt;/p&gt;&lt;/div&gt;
    &lt;/div&gt;
  &lt;/section&gt;

  &lt;hr class="divider-dash"&gt;

  &lt;!-- ============ MATERI F: TABEL RANGKUMAN SELURUH UNIT ============ --&gt;
  &lt;section class="section" id="materi-f"&gt;
    &lt;div class="eyebrow"&gt;07 — Materi Inti F&lt;/div&gt;
    &lt;h2 class="section-title"&gt;Rangkuman Seluruh Materi Pokok Bahasan "Petunjuk Kerja"&lt;/h2&gt;

    &lt;table&gt;
      &lt;tr&gt;&lt;th style="width:26%;"&gt;Sub-Materi&lt;/th&gt;&lt;th&gt;Poin Kunci&lt;/th&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Evaluasi Informasi&lt;/td&gt;&lt;td&gt;6 kriteria: keakuratan, kelengkapan, kelogisan urutan, kejelasan bahasa, kesesuaian tujuan, keselamatan/kelayakan&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Membandingkan Teks&lt;/td&gt;&lt;td&gt;Teks prosedur mengarahkan tindakan; teks eksplanasi menjelaskan proses agar dipahami&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Kaidah Kebahasaan (1)&lt;/td&gt;&lt;td&gt;Kalimat imperatif, deklaratif, persuasif, dan konjungsi temporal&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Kaidah Kebahasaan (2) &amp;amp; Menyusun&lt;/td&gt;&lt;td&gt;Kalimat perintah, kata teknis, penanda wacana, dan 5 langkah menyusun teks prosedur&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Menyajikan Teks Prosedur&lt;/td&gt;&lt;td&gt;Penyajian lisan (intonasi, artikulasi, sikap) dan tulisan (struktur, ejaan, kejelasan)&lt;/td&gt;&lt;/tr&gt;
    &lt;/table&gt;
  &lt;/section&gt;

  &lt;hr class="divider-dash"&gt;

  &lt;!-- ============ PEMODELAN ============ --&gt;
  &lt;section class="section" id="contoh"&gt;
    &lt;div class="eyebrow"&gt;08 — Pemodelan&lt;/div&gt;
    &lt;h2 class="section-title"&gt;Contoh Penerapan: Cuplikan Naskah Penyajian Lisan&lt;/h2&gt;
    &lt;p class="lead"&gt;Guru membacakan dan membahas bersama cuplikan berikut sebagai model penyajian sebelum murid berlatih dalam kelompok.&lt;/p&gt;

    &lt;div class="doc-sample"&gt;
      &lt;div class="doc-head"&gt;&lt;span&gt;Lampiran · Cuplikan Naskah Presentasi&lt;/span&gt;&lt;span&gt;Dokumen-01&lt;/span&gt;&lt;/div&gt;
      &lt;div class="doc-body"&gt;
        &lt;h3 style="color:#132029 !important;"&gt;Menyajikan Prosedur "Mengisi Daya Ponsel dengan Aman"&lt;/h3&gt;
        &lt;p style="margin:10px 0; color:#132029 !important;"&gt;&lt;i&gt;"Selamat pagi, teman-teman. Pada kesempatan ini, kelompok kami akan menyajikan teks prosedur berjudul 'Mengisi Daya Ponsel dengan Aman'."&lt;/i&gt; &lt;b&gt;(pembukaan — kontak mata ke seluruh audiens)&lt;/b&gt;&lt;/p&gt;
        &lt;p style="margin:10px 0; color:#132029 !important;"&gt;&lt;i&gt;"Tujuan dari prosedur ini adalah agar pengisian daya ponsel dilakukan dengan aman dan tidak merusak baterai."&lt;/i&gt; &lt;b&gt;(kalimat deklaratif — disampaikan dengan intonasi datar dan jelas)&lt;/b&gt;&lt;/p&gt;
        &lt;p style="margin:10px 0; color:#132029 !important;"&gt;&lt;i&gt;"Pertama, pastikan menggunakan kabel dan adaptor asli sesuai spesifikasi ponsel."&lt;/i&gt; &lt;b&gt;(kalimat perintah dengan konjungsi temporal — intonasi naik pada kata "pertama")&lt;/b&gt;&lt;/p&gt;
        &lt;p style="margin:10px 0 0; color:#132029 !important;"&gt;&lt;i&gt;"Dengan demikian, ponsel akan lebih awet dan aman digunakan dalam jangka panjang. Terima kasih atas perhatiannya."&lt;/i&gt; &lt;b&gt;(penutup — kecepatan bicara diperlambat, sikap tenang)&lt;/b&gt;&lt;/p&gt;
      &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class="panel" style="margin-top:22px;"&gt;
      &lt;p style="margin:0;"&gt;&lt;b style="color:var(--off-white);"&gt;Simpulan model penyajian:&lt;/b&gt; Naskah di atas menunjukkan pembukaan yang jelas, penekanan intonasi pada kata kunci ("pertama", "dengan demikian"), serta penutup yang tenang dan sopan — semua ini mendukung penyampaian yang mudah dipahami audiens.&lt;/p&gt;
    &lt;/div&gt;
  &lt;/section&gt;

  &lt;hr class="divider-dash"&gt;

  &lt;!-- ============ RANGKUMAN ============ --&gt;
  &lt;section class="section" id="rangkuman"&gt;
    &lt;div class="eyebrow"&gt;09 — Ringkasan Materi&lt;/div&gt;
    &lt;h2 class="section-title"&gt;Poin-Poin Penting&lt;/h2&gt;
    &lt;div class="summary-box"&gt;
      &lt;ul&gt;
        &lt;li&gt;Menyajikan teks prosedur secara lisan menekankan intonasi, artikulasi, sikap, kontak mata, kecepatan bicara, dan bahasa tubuh.&lt;/li&gt;
        &lt;li&gt;Menyajikan teks prosedur secara tulisan menekankan kerapian struktur, ejaan, kejelasan langkah, dan media visual pendukung.&lt;/li&gt;
        &lt;li&gt;Penyajian lisan bersifat interaktif namun sulit diulang, sedangkan penyajian tulisan dapat dibaca ulang namun tidak interaktif.&lt;/li&gt;
        &lt;li&gt;Seluruh materi pokok bahasan Petunjuk Kerja mencakup evaluasi informasi, perbandingan teks, kaidah kebahasaan, penyusunan, dan penyajian teks prosedur.&lt;/li&gt;
      &lt;/ul&gt;
    &lt;/div&gt;
  &lt;/section&gt;

  &lt;hr class="divider-dash"&gt;

  &lt;!-- ============ TUGAS KELOMPOK ============ --&gt;
  &lt;section class="section" id="tugas-kelompok"&gt;
    &lt;div class="eyebrow"&gt;10 — Lembar Kerja&lt;/div&gt;
    &lt;div class="task-header"&gt;
      &lt;h2&gt;Tugas Kelompok: Menyajikan Teks Prosedur Hasil Karya Kelompok&lt;/h2&gt;
      &lt;span class="badge"&gt;Durasi ± 60 menit&lt;/span&gt;
    &lt;/div&gt;

    &lt;p style="margin-top:18px;"&gt;&lt;b style="color:var(--off-white);"&gt;Tujuan tugas:&lt;/b&gt; Murid secara berkelompok menyajikan teks prosedur yang telah disusun pada pertemuan sebelumnya secara lisan di depan kelas, dengan memperhatikan intonasi, artikulasi, dan sikap penyajian yang tepat.&lt;/p&gt;

    &lt;h4 style="color:var(--off-white); margin-top:24px;"&gt;Petunjuk Pengerjaan&lt;/h4&gt;
    &lt;ol class="steps-num"&gt;
      &lt;li&gt;&lt;b&gt;Berkumpul dalam kelompok&lt;/b&gt; yang sama seperti saat menyusun teks prosedur pada pertemuan sebelumnya.&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Baca ulang teks prosedur&lt;/b&gt; yang telah disusun kelompok, lalu tentukan pembagian bagian yang akan disampaikan tiap anggota.&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Siapkan media bantu&lt;/b&gt; sederhana jika diperlukan (poin penting, gambar, atau alat peraga).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Berlatih menyajikan&lt;/b&gt; secara lisan dalam kelompok sebelum tampil di depan kelas.&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Sajikan teks prosedur&lt;/b&gt; di depan kelas selama maksimal 5 menit per kelompok, dilanjutkan umpan balik singkat dari guru dan kelompok lain.&lt;/li&gt;
    &lt;/ol&gt;

    &lt;h4 style="color:var(--off-white); margin-top:26px;"&gt;Lembar Persiapan Penyajian&lt;/h4&gt;
    &lt;table&gt;
      &lt;tr&gt;&lt;th style="width:26%;"&gt;Bagian&lt;/th&gt;&lt;th&gt;Catatan Persiapan Kelompok&lt;/th&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Judul Teks Prosedur&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Pembagian Penyaji&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Media Bantu yang Digunakan&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Bagian yang Perlu Ditekankan&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;
    &lt;/table&gt;

    &lt;h4 style="color:var(--off-white); margin-top:26px;"&gt;Rubrik Penilaian Presentasi Kelompok&lt;/h4&gt;
    &lt;table&gt;
      &lt;tr&gt;&lt;th style="width:22%;"&gt;Aspek Penilaian&lt;/th&gt;&lt;th&gt;Skor 4 (Sangat Baik)&lt;/th&gt;&lt;th&gt;Skor 3 (Baik)&lt;/th&gt;&lt;th&gt;Skor 2 (Cukup)&lt;/th&gt;&lt;th&gt;Skor 1 (Kurang)&lt;/th&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Intonasi &amp;amp; Artikulasi&lt;/td&gt;&lt;td&gt;Jelas, tepat, mudah dipahami&lt;/td&gt;&lt;td&gt;Jelas namun kurang bervariasi&lt;/td&gt;&lt;td&gt;Kurang jelas di beberapa bagian&lt;/td&gt;&lt;td&gt;Sulit dipahami&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Sikap &amp;amp; Kontak Mata&lt;/td&gt;&lt;td&gt;Percaya diri, kontak mata merata&lt;/td&gt;&lt;td&gt;Cukup percaya diri&lt;/td&gt;&lt;td&gt;Kurang percaya diri, jarang kontak mata&lt;/td&gt;&lt;td&gt;Gugup, tidak ada kontak mata&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Kejelasan Isi&lt;/td&gt;&lt;td&gt;Isi runtut dan mudah diikuti&lt;/td&gt;&lt;td&gt;Isi cukup runtut&lt;/td&gt;&lt;td&gt;Ada bagian yang membingungkan&lt;/td&gt;&lt;td&gt;Isi tidak runtut&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Kekompakan Kelompok&lt;/td&gt;&lt;td&gt;Seluruh anggota berperan aktif&lt;/td&gt;&lt;td&gt;Sebagian besar anggota aktif&lt;/td&gt;&lt;td&gt;Hanya sebagian kecil anggota aktif&lt;/td&gt;&lt;td&gt;Didominasi satu orang&lt;/td&gt;&lt;/tr&gt;
    &lt;/table&gt;
  &lt;/section&gt;

  &lt;hr class="divider-dash"&gt;

  &lt;!-- ============ TUGAS INDIVIDU: KUIS 25 PERTANYAAN ============ --&gt;
  &lt;section class="section" id="tugas-individu"&gt;
    &lt;div class="eyebrow"&gt;11 — Penutup Pembelajaran&lt;/div&gt;
    &lt;div class="task-header"&gt;
      &lt;h2&gt;Tugas Individu: Reviu 25 Pertanyaan Materi Petunjuk Kerja&lt;/h2&gt;
      &lt;span class="badge"&gt;Dikerjakan Mandiri · Otomatis Bernilai&lt;/span&gt;
    &lt;/div&gt;

    &lt;p style="margin-top:18px;"&gt;&lt;b style="color:var(--off-white);"&gt;Petunjuk:&lt;/b&gt; Isi No. Absen dan Nama, lalu jawab 25 pertanyaan pilihan ganda (5 opsi) berikut yang mereviu seluruh materi pokok bahasan Petunjuk Kerja — terdiri atas 10 soal tingkat mudah, 10 soal tingkat sedang, dan 5 soal tingkat sulit. Skor akan muncul otomatis dan hasilnya tercatat otomatis.&lt;/p&gt;

    &lt;div class="panel" id="epbq-form-wrap" style="margin-top:20px;"&gt;
      &lt;div style="display:grid; grid-template-columns:1fr 2fr; gap:14px; margin-bottom:22px;"&gt;
        &lt;div&gt;
          &lt;label class="mono" style="display:block; font-size:0.75rem; color:var(--amber); text-transform:uppercase; letter-spacing:0.08em; margin-bottom:6px;"&gt;No. Absen&lt;/label&gt;
          &lt;input id="epbq-absen" type="text" inputmode="numeric" placeholder="Contoh: 12" style="width:100%; padding:10px 12px; border-radius:2px; border:1px solid var(--line); background:var(--blueprint-deep); color:var(--off-white); font-family:'Source Sans 3',sans-serif; font-size:0.95rem;"&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;label class="mono" style="display:block; font-size:0.75rem; color:var(--amber); text-transform:uppercase; letter-spacing:0.08em; margin-bottom:6px;"&gt;Nama Lengkap&lt;/label&gt;
          &lt;input id="epbq-nama" type="text" placeholder="Tulis nama lengkap" style="width:100%; padding:10px 12px; border-radius:2px; border:1px solid var(--line); background:var(--blueprint-deep); color:var(--off-white); font-family:'Source Sans 3',sans-serif; font-size:0.95rem;"&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div id="epbq-questions"&gt;&lt;/div&gt;

      &lt;div style="margin-top:24px; display:flex; align-items:center; gap:16px; flex-wrap:wrap;"&gt;
        &lt;button id="epbq-submit" type="button" style="background:var(--amber); color:var(--blueprint-deep); border:none; padding:12px 26px; font-family:'Oswald',sans-serif; text-transform:uppercase; letter-spacing:0.05em; font-weight:600; border-radius:2px; cursor:pointer; font-size:0.95rem;"&gt;Kirim Jawaban&lt;/button&gt;
        &lt;span id="epbq-status" class="mono" style="font-size:0.85rem; color:var(--muted);"&gt;&lt;/span&gt;
      &lt;/div&gt;

      &lt;div id="epbq-result" style="display:none; margin-top:20px; padding:18px 20px; border:1px solid var(--amber); background:rgba(245,166,35,0.08);"&gt;
        &lt;p style="margin:0; font-size:1.05rem;"&gt;Skor kamu: &lt;b id="epbq-score" style="color:var(--amber); font-size:1.3rem;"&gt;&lt;/b&gt; / 100&lt;/p&gt;
        &lt;p id="epbq-detail" style="margin:8px 0 0; font-size:0.9rem; color:var(--muted);"&gt;&lt;/p&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/section&gt;

&lt;script&gt;
(function(){
  var EPBQ_ENDPOINT = "https://script.google.com/macros/s/AKfycbzM7t2qgAENzxQJXzSYJYL28R6nb3TxJVELLL3CopyEXb51t_gRtrkPOxTpI5mq6VCEKw/exec";
  var EPBQ_MATERI = "Menyajikan Teks Prosedur &amp; Rangkuman Materi Petunjuk Kerja";

  var questions = [
    {lvl:"Mudah", q:"1. Apa tujuan utama teks prosedur?", opts:["Menghibur pembaca","Mengarahkan pembaca melakukan tindakan","Menceritakan pengalaman pribadi","Membujuk pembaca membeli barang","Menjelaskan pendapat penulis"], correct:1},
    {lvl:"Mudah", q:"2. Bagian struktur teks prosedur yang berisi hasil akhir/catatan tambahan disebut...", opts:["Tujuan","Alat dan bahan","Langkah-langkah","Penutup/hasil","Interpretasi"], correct:3},
    {lvl:"Mudah", q:"3. Kalimat yang berisi perintah kepada pembaca disebut kalimat...", opts:["Deklaratif","Interogatif","Imperatif","Persuasif","Naratif"], correct:2},
    {lvl:"Mudah", q:"4. Kata penghubung yang menandai urutan waktu disebut konjungsi...", opts:["Kausalitas","Temporal","Pertentangan","Pilihan","Penjumlahan"], correct:1},
    {lvl:"Mudah", q:"5. Teks yang menjelaskan proses terjadinya suatu fenomena berdasarkan sebab-akibat disebut teks...", opts:["Prosedur","Eksplanasi","Deskripsi","Narasi","Anekdot"], correct:1},
    {lvl:"Mudah", q:"6. Istilah khusus dalam bidang keahlian tertentu disebut...", opts:["Konjungsi","Kata teknis","Kata baku","Kata ganti","Kata sifat"], correct:1},
    {lvl:"Mudah", q:"7. Kalimat yang membujuk pembaca agar mengikuti langkah dengan sungguh-sungguh disebut kalimat...", opts:["Imperatif","Deklaratif","Persuasif","Interogatif","Naratif"], correct:2},
    {lvl:"Mudah", q:"8. Manakah contoh konjungsi temporal?", opts:["Karena","Kemudian","Meskipun","Atau","Tetapi"], correct:1},
    {lvl:"Mudah", q:"9. Langkah pertama dalam menyusun teks prosedur adalah...", opts:["Merevisi teks","Menentukan tujuan","Menyajikan secara lisan","Mencari kata teknis","Menilai teks orang lain"], correct:1},
    {lvl:"Mudah", q:"10. Menyajikan teks prosedur secara lisan berarti menyampaikannya melalui...", opts:["Tulisan di buku","Berbicara di depan orang lain","Gambar diam","Video tanpa suara","Simbol"], correct:1},

    {lvl:"Sedang", q:"11. Berikut ini yang termasuk kriteria evaluasi teks prosedur, KECUALI...", opts:["Keakuratan","Kelengkapan","Kelogisan urutan","Kepopuleran penulis","Kesesuaian tujuan"], correct:3},
    {lvl:"Sedang", q:"12. Manakah pasangan yang tepat untuk membedakan teks prosedur dan teks eksplanasi?", opts:["Prosedur=memahami, Eksplanasi=melakukan","Prosedur=melakukan tindakan, Eksplanasi=memahami proses","Keduanya sama-sama persuasif","Keduanya tidak berstruktur","Keduanya tidak memakai konjungsi"], correct:1},
    {lvl:"Sedang", q:"13. \"Selain itu, pastikan area kerja dalam keadaan bersih.\" Kalimat tersebut mengandung penanda wacana jenis...", opts:["Urutan","Penambahan","Penekanan","Simpulan","Pertentangan"], correct:1},
    {lvl:"Sedang", q:"14. Kalimat \"Jangan sentuh permukaan yang masih panas\" termasuk kalimat perintah jenis...", opts:["Ajakan","Permintaan","Larangan","Deklaratif","Persuasif"], correct:2},
    {lvl:"Sedang", q:"15. Ciri kalimat deklaratif dalam teks prosedur adalah...", opts:["Selalu diakhiri tanda seru","Berupa kalimat berita tanpa perintah","Selalu menggunakan kata \"jangan\"","Selalu berupa pertanyaan","Menggunakan konjungsi temporal"], correct:1},
    {lvl:"Sedang", q:"16. Manakah contoh kata teknis bidang tata boga?", opts:["Karburator","Partisi","Marinasi","Ejector pin","Velg"], correct:2},
    {lvl:"Sedang", q:"17. Fungsi utama menyajikan teks prosedur secara tulisan dibanding lisan adalah...", opts:["Lebih cepat dipahami tanpa membaca","Dapat dibaca ulang dan disimpan","Tidak memerlukan struktur","Tidak perlu memperhatikan kaidah kebahasaan","Hanya bisa disampaikan satu arah"], correct:1},
    {lvl:"Sedang", q:"18. Ketika membandingkan dua teks, langkah setelah membaca kedua teks adalah...", opts:["Menyimpulkan langsung","Mengidentifikasi tujuan masing-masing teks","Menyajikan secara lisan","Menerbitkan teks","Menghapus salah satu teks"], correct:1},
    {lvl:"Sedang", q:"19. Aspek yang TIDAK termasuk penilaian presentasi lisan adalah...", opts:["Intonasi","Artikulasi","Sikap","Jumlah halaman naskah","Kontak mata"], correct:3},
    {lvl:"Sedang", q:"20. \"Dengan demikian, kompos siap digunakan sebagai pupuk.\" Kalimat ini menunjukkan penanda wacana jenis...", opts:["Penambahan","Penekanan","Simpulan","Urutan","Pertentangan"], correct:2},

    {lvl:"Sulit", q:"21. Sebuah teks prosedur menyebutkan takaran bahan yang tidak sesuai standar umum. Kekeliruan ini melanggar kriteria evaluasi...", opts:["Kelogisan urutan","Keakuratan","Kesesuaian tujuan","Kelengkapan","Keselamatan"], correct:1},
    {lvl:"Sulit", q:"22. Sebuah teks prosedur tidak mencantumkan langkah verifikasi hasil akhir, padahal langkah tersebut penting untuk memastikan keberhasilan. Kekurangan ini termasuk pelanggaran kriteria...", opts:["Keakuratan","Kelengkapan","Kejelasan bahasa","Konjungsi temporal","Kata teknis"], correct:1},
    {lvl:"Sulit", q:"23. Manakah simpulan yang PALING TEPAT membedakan teks prosedur dan teks eksplanasi berdasarkan hasil yang diharapkan bagi pembaca?", opts:["Keduanya menghasilkan tindakan yang sama","Prosedur menghasilkan tindakan, eksplanasi menghasilkan pemahaman","Keduanya hanya menghasilkan hiburan","Eksplanasi selalu lebih pendek daripada prosedur","Prosedur tidak memiliki tujuan"], correct:1},
    {lvl:"Sulit", q:"24. Sebuah kelompok menyusun teks prosedur dengan langkah yang runtut, namun saat presentasi lisan, anggota kelompok berbicara terbata-bata dan tidak melakukan kontak mata. Aspek apa yang paling perlu diperbaiki?", opts:["Struktur teks tulisan","Kaidah kebahasaan teks","Keterampilan penyajian lisan","Ketepatan kata teknis","Penanda wacana"], correct:2},
    {lvl:"Sulit", q:"25. Perhatikan kalimat: \"Pastikan sakelar dalam posisi mati, lalu periksa kabel secara berkala agar tidak terjadi korsleting.\" Kalimat tersebut menggabungkan ciri kebahasaan...", opts:["Kalimat deklaratif dan konjungsi kausalitas","Kalimat perintah dan konjungsi temporal","Kalimat persuasif dan kata teknis","Kalimat interogatif dan penanda simpulan","Kalimat naratif dan konjungsi temporal"], correct:1}
  ];

  var optLabels = ["A","B","C","D","E"];
  var lvlColor = {"Mudah":"#6EC6CA","Sedang":"#F5A623","Sulit":"#D94E2A"};

  var container = document.getElementById("epbq-questions");
  questions.forEach(function(item, idx){
    var block = document.createElement("div");
    block.style.marginBottom = "20px";
    block.style.paddingBottom = "16px";
    block.style.borderBottom = "1px dashed rgba(234,242,245,0.16)";

    var tag = document.createElement("span");
    tag.textContent = item.lvl;
    tag.style.display = "inline-block";
    tag.style.fontFamily = "'IBM Plex Mono', monospace";
    tag.style.fontSize = "0.68rem";
    tag.style.letterSpacing = "0.08em";
    tag.style.textTransform = "uppercase";
    tag.style.color = lvlColor[item.lvl] || "#9FB4C2";
    tag.style.border = "1px solid " + (lvlColor[item.lvl] || "#9FB4C2");
    tag.style.padding = "2px 8px";
    tag.style.marginBottom = "6px";
    block.appendChild(tag);

    var qEl = document.createElement("p");
    qEl.style.color = "#EAF2F5";
    qEl.style.fontWeight = "600";
    qEl.style.margin = "6px 0 8px";
    qEl.textContent = item.q;
    block.appendChild(qEl);

    item.opts.forEach(function(opt, oi){
      var label = document.createElement("label");
      label.style.display = "block";
      label.style.color = "#DDE7EC";
      label.style.fontSize = "0.92rem";
      label.style.margin = "4px 0";
      label.style.cursor = "pointer";

      var radio = document.createElement("input");
      radio.type = "radio";
      radio.name = "epbq-q" + idx;
      radio.value = oi;
      radio.style.marginRight = "8px";

      label.appendChild(radio);
      label.appendChild(document.createTextNode(optLabels[oi] + ". " + opt));
      block.appendChild(label);
    });

    container.appendChild(block);
  });

  document.getElementById("epbq-submit").addEventListener("click", function(){
    var absen = document.getElementById("epbq-absen").value.trim();
    var nama = document.getElementById("epbq-nama").value.trim();
    var statusEl = document.getElementById("epbq-status");

    if(!absen || !nama){
      statusEl.textContent = "Isi No. Absen dan Nama terlebih dahulu.";
      statusEl.style.color = "#F5A623";
      return;
    }

    var belumDijawab = [];
    var benar = 0;
    questions.forEach(function(item, idx){
      var checked = document.querySelector('input[name="epbq-q' + idx + '"]:checked');
      if(!checked){
        belumDijawab.push(idx+1);
      } else if(parseInt(checked.value,10) === item.correct){
        benar++;
      }
    });

    if(belumDijawab.length &gt; 0){
      statusEl.textContent = "Pertanyaan belum dijawab: nomor " + belumDijawab.join(", ");
      statusEl.style.color = "#F5A623";
      return;
    }

    var skor = benar * 4;
    document.getElementById("epbq-score").textContent = skor;
    document.getElementById("epbq-detail").textContent = "Menjawab benar " + benar + " dari 25 pertanyaan.";
    document.getElementById("epbq-result").style.display = "block";
    statusEl.textContent = "Mengirim hasil...";
    statusEl.style.color = "#9FB4C2";

    var payload = new URLSearchParams();
    payload.append("noAbsen", absen);
    payload.append("nama", nama);
    payload.append("skor", skor);
    payload.append("materi", EPBQ_MATERI);
    payload.append("waktu", new Date().toISOString());

    fetch(EPBQ_ENDPOINT, {
      method: "POST",
      mode: "no-cors",
      headers: {"Content-Type":"application/x-www-form-urlencoded"},
      body: payload.toString()
    }).then(function(){
      statusEl.textContent = "Hasil berhasil dikirim ke guru.";
      statusEl.style.color = "#6EC6CA";
    }).catch(function(){
      statusEl.textContent = "Skor tercatat di halaman ini, namun pengiriman gagal. Tunjukkan skor ini ke guru.";
      statusEl.style.color = "#F5A623";
    });
  });
})();
&lt;/script&gt;

&lt;/main&gt;

&lt;footer&gt;
  &lt;div class="doc-code"&gt;DOK/B.INDO/XI/PROSEDUR-SAJIKAN — Fokus Tujuan Pembelajaran, Materi Inti, Tugas Kelompok &amp;amp; Reviu 25 Soal, 1× pertemuan (3 JP)&lt;/div&gt;
  &lt;p style="margin:0;"&gt;Referensi: Kurikulum Merdeka — Capaian Pembelajaran Bahasa Indonesia Fase F (Elemen Berbicara, Menulis, dan Memirsa); Buku Teks Bahasa Indonesia Kelas XI SMK/MAK Kemendikbudristek.&lt;/p&gt;
&lt;/footer&gt;
&lt;/div&gt;</description><link>http://kitab-investasi.blogspot.com/2026/08/menyajikan-teks-prosedur-rangkuman.html</link><thr:total>0</thr:total><author>nof_rizal07@yahoo.co.id (abang_cool)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-9000860041661554971.post-3058660478422290104</guid><pubDate>Thu, 20 Aug 2026 03:08:59 +0000</pubDate><atom:updated>2026-08-20T10:10:03.035+07:00</atom:updated><title>SERTIFKAT KOMBEL KE 9</title><description>&lt;!DOCTYPE html&gt;
&lt;html lang="id"&gt;
&lt;head&gt;
&lt;meta charset="UTF-8"&gt;
&lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&gt;
&lt;title&gt;Generator Sertifikat&lt;/title&gt;

&lt;link href="https://fonts.googleapis.com/css2?family=Montserrat:wght@700&amp;display=swap" rel="stylesheet"&gt;

&lt;script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/2.5.1/jspdf.umd.min.js"&gt;&lt;/script&gt;

&lt;style&gt;

body{
    font-family:Arial,sans-serif;
    background:#eef2f7;
    padding:20px;
    max-width:700px;
    margin:auto;
}

.card{
    background:white;
    padding:24px;
    border-radius:20px;
    box-shadow:0 10px 20px rgba(0,0,0,.1);
}

h2{
    text-align:center;
    color:#1e4668;
}

.confirm-box{
    background:#f0f6ff;
    border-left:5px solid #2c7da0;
    padding:16px;
    border-radius:16px;
    margin-bottom:20px;
    text-align:center;
}

.confirm-box p{
    margin-top:0;
    font-weight:bold;
    color:#1e4668;
}

.confirm-buttons{
    display:flex;
    gap:10px;
    margin-top:10px;
}

.confirm-buttons button{
    flex:1;
}

.yes-btn{
    background:#1f8a4c;
}

.yes-btn:hover{
    background:#166638;
}

.no-btn{
    background:#c0392b;
}

.no-btn:hover{
    background:#962d22;
}

input,select,button{
    width:100%;
    padding:12px;
    margin-top:10px;
    border-radius:12px;
    border:1px solid #ccc;
    font-size:16px;
}

button{
    background:#2c7da0;
    color:white;
    border:none;
    cursor:pointer;
    font-weight:bold;
}

button:hover{
    background:#1f5e7a;
}

button:disabled{
    background:#94a3b8;
    cursor:not-allowed;
}

input:disabled,
select:disabled{
    background:#f1f5f9;
}

#preview{
    width:100%;
    border-radius:12px;
    margin-top:10px;
}

.loading{
    display:none;
    margin-top:15px;
    color:#1e4668;
    font-weight:bold;
    text-align:center;
}

.status{
    margin-top:12px;
    font-weight:bold;
}

.success{
    color:#1f8a4c;
}

.error{
    color:#c0392b;
}

&lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;

&lt;div class="card"&gt;

&lt;h2&gt;&#128220; Generator Sertifikat&lt;/h2&gt;

&lt;!-- ================= KONFIRMASI ================= --&gt;

&lt;div class="confirm-box"&gt;

&lt;p&gt;&#128269; Apakah Anda mengikuti pelatihan?&lt;/p&gt;

&lt;div class="confirm-buttons"&gt;

&lt;button class="yes-btn" onclick="confirmIkut()"&gt;
✅ YA, IKUT
&lt;/button&gt;

&lt;button class="no-btn" onclick="confirmTidakIkut()"&gt;
❌ TIDAK
&lt;/button&gt;

&lt;/div&gt;

&lt;div id="statusKonfirmasi" class="status"&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;!-- ================= FORM ================= --&gt;

&lt;label&gt;Nama Lengkap&lt;/label&gt;

&lt;input
type="text"
id="nama"
placeholder="Contoh: Ahmad Fauzi"
disabled&gt;

&lt;label&gt;Peran&lt;/label&gt;

&lt;select id="peran" disabled&gt;
    &lt;option&gt;Peserta&lt;/option&gt;
    &lt;option&gt;Narasumber&lt;/option&gt;
&lt;/select&gt;

&lt;img
id="preview"
src="https://lh3.googleusercontent.com/d/17OvHkbTI7cLyTZiZiL2gJykxyIQ1s44Z"
alt="Template"&gt;

&lt;button
id="downloadBtn"
onclick="generatePDF()"
disabled&gt;

⬇️ UNDUH PDF

&lt;/button&gt;

&lt;div class="loading" id="loading"&gt;
Memproses PDF...
&lt;/div&gt;

&lt;/div&gt;

&lt;script&gt;

// ================= TEMPLATE (DIUBAH) =================

const FILE_ID =
'17OvHkbTI7cLyTZiZiL2gJykxyIQ1s44Z';  // &lt;-- ID baru

const TEMPLATE_URL =
`https://lh3.googleusercontent.com/d/${FILE_ID}`;

// ================= UTIL =================

function showLoading(show){

    document.getElementById('loading').style.display =
        show ? 'block' : 'none';

}

function getRomanMonth(monthIndex){

    const romawi = [
        "I","II","III","IV","V","VI",
        "VII","VIII","IX","X","XI","XII"
    ];

    return romawi[monthIndex];

}

function capitalizeEachWord(text){

    return text
        .toLowerCase()
        .replace(/\b\w/g,c=&gt;c.toUpperCase());

}

// ================= KONFIRMASI =================

function confirmIkut(){

    document.getElementById('nama').disabled = false;

    document.getElementById('peran').disabled = false;

    document.getElementById('downloadBtn').disabled = false;

    document.getElementById('statusKonfirmasi').innerHTML =
        '&lt;span class="success"&gt;✅ Konfirmasi diterima. Anda dapat mengunduh sertifikat.&lt;/span&gt;';

}

function confirmTidakIkut(){

    document.getElementById('nama').disabled = true;

    document.getElementById('peran').disabled = true;

    document.getElementById('downloadBtn').disabled = true;

    document.getElementById('statusKonfirmasi').innerHTML =
        '&lt;span class="error"&gt;❌ Anda tidak dapat mengunduh sertifikat.&lt;/span&gt;';

}

// ================= LOAD IMAGE =================

function loadImage(url){

    return new Promise((resolve,reject)=&gt;{

        const img = new Image();

        img.crossOrigin = "anonymous";

        img.onload = ()=&gt;resolve(img);

        img.onerror = ()=&gt;{

            reject(
                new Error(
                    'Template Google Drive gagal dimuat'
                )
            );

        };

        img.src = url + '?t=' + Date.now();

    });

}

// ================= NOMOR =================

async function generateNomor(){

    const now = new Date();

    const bulan =
        getRomanMonth(now.getMonth());

    const tahun =
        now.getFullYear();

    const nomor =
        Math.floor(Math.random()*900)+100;

    return `${nomor}/K/${bulan}/${tahun}`;

}

// ================= PDF =================

async function generatePDF(){

    const namaInput =
        document.getElementById('nama');

    const peranSelect =
        document.getElementById('peran');

    let nama =
        namaInput.value.trim();

    const peran =
        peranSelect.value;

    if(!nama){

        alert('Nama wajib diisi');

        return;

    }

    nama =
        capitalizeEachWord(nama);

    showLoading(true);

    try{

        await document.fonts.ready;

        const img =
            await loadImage(TEMPLATE_URL);

        const canvas =
            document.createElement('canvas');

        canvas.width = img.width;
        canvas.height = img.height;

        const ctx =
            canvas.getContext('2d');

        ctx.drawImage(
            img,
            0,
            0,
            canvas.width,
            canvas.height
        );

        // ================= POSISI =================

        const nomorY =
            canvas.height * 0.235;

        const namaY =
            canvas.height * 0.3990;

        const peranY =
            canvas.height * 0.5420;

        // ================= STYLE =================

        ctx.textAlign = 'center';

        ctx.textBaseline = 'middle';

        ctx.fillStyle = '#000';

        // nomor
        const nomorSertifikat =
            await generateNomor();

        ctx.font =
            `bold ${canvas.width*0.0125}px Montserrat`;

        ctx.fillText(
            nomorSertifikat,
            canvas.width/2,
            nomorY
        );

        // nama auto shrink
        let fontSize =
            canvas.width * 0.031;

        ctx.font =
            `700 ${fontSize}px Montserrat`;

        let textWidth =
            ctx.measureText(nama).width;

        const maxWidth =
            canvas.width - 180;

        while(
            textWidth &gt; maxWidth &amp;&amp;
            fontSize &gt; 20
        ){

            fontSize -= 2;

            ctx.font =
                `700 ${fontSize}px Montserrat`;

            textWidth =
                ctx.measureText(nama).width;

        }

        ctx.fillText(
            nama,
            canvas.width/2,
            namaY
        );

        // peran
        ctx.font =
            `bold ${canvas.width*0.024}px Montserrat`;

        ctx.fillText(
            peran,
            canvas.width/2,
            peranY
        );

        // ================= PDF =================

        const imageData =
            canvas.toDataURL(
                'image/jpeg',
                1.0
            );

        const { jsPDF } =
            window.jspdf;

        const pdf =
            new jsPDF({

                orientation:
                    canvas.width &gt; canvas.height
                    ? 'landscape'
                    : 'portrait',

                unit:'px',

                format:[
                    canvas.width,
                    canvas.height
                ]

            });

        pdf.addImage(
            imageData,
            'JPEG',
            0,
            0,
            canvas.width,
            canvas.height
        );

        const safeName =
            nama.replace(/[^a-z0-9]/gi,'_');

        pdf.save(
            `Sertifikat_${safeName}.pdf`
        );

    }catch(error){

        console.error(error);

        alert(
            '❌ Gagal membuat PDF\n\n' +
            error.message +
            '\n\nPastikan file Google Drive bersifat PUBLIC.'
        );

    }finally{

        showLoading(false);

    }

}

&lt;/script&gt;

&lt;/body&gt;
&lt;/html&gt;</description><link>http://kitab-investasi.blogspot.com/2026/08/sertifkat-kombel-ke-9.html</link><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://lh3.googleusercontent.com/d/17OvHkbTI7cLyTZiZiL2gJykxyIQ1s44Z=s72-c" width="72"/><thr:total>0</thr:total><author>nof_rizal07@yahoo.co.id (abang_cool)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-9000860041661554971.post-9087345521102818853</guid><pubDate>Wed, 19 Aug 2026 07:24:53 +0000</pubDate><atom:updated>2026-08-20T14:49:14.439+07:00</atom:updated><title>Jaringan Komputer, Internet, &amp; Keamanan Digital</title><description>&lt;!DOCTYPE html&gt;
&lt;html lang="id"&gt;
&lt;head&gt;
&lt;meta charset="UTF-8"&gt;
&lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&gt;
&lt;title&gt;Jaringan Komputer, Internet, &amp; Keamanan Digital — Informatika Kelas X&lt;/title&gt;
&lt;link rel="preconnect" href="https://fonts.googleapis.com"&gt;
&lt;link href="https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;600;700&amp;family=IBM+Plex+Sans:wght@400;500;600;700&amp;display=swap" rel="stylesheet"&gt;
&lt;style&gt;
  :root{
    --bg: #0B1B2B;
    --bg-deep: #071320;
    --node: #38BDF8;
    --node-dim: rgba(56,189,248,0.3);
    --secure: #22C55E;
    --alert: #F87171;
    --amber: #F2B84B;
    --paper: #FBFCFD;
    --ink: #16232E;
    --ink-soft: #4B5B6B;
    --line: #DCE3EA;
    --radius:6px;
  }
  *{box-sizing:border-box; margin:0; padding:0;}
  html{scroll-behavior:smooth;}
  body{ font-family:'IBM Plex Sans', sans-serif; background: var(--bg); color: var(--ink); line-height:1.6; }
  .mono{font-family:'IBM Plex Mono', monospace;}

  /* ===== Hero with network nodes ===== */
  header.hero{ position:relative; overflow:hidden; padding: 60px 6vw 56px; color:#EAF2FA; }
  header.hero::before{
    content:""; position:absolute; inset:0;
    background-image: radial-gradient(var(--node-dim) 1.5px, transparent 1.5px);
    background-size: 26px 26px;
    opacity:0.5;
  }
  header.hero .content{position:relative; z-index:1;}
  .eyebrow{
    font-family:'IBM Plex Mono', monospace; font-size:0.78rem; letter-spacing:0.16em; text-transform:uppercase;
    color: var(--node); display:flex; align-items:center; gap:10px; margin-bottom:20px;
  }
  .eyebrow::before{ content:""; width:10px; height:10px; border:1.5px solid var(--node); border-radius:50%; box-shadow:0 0 0 3px var(--node-dim); }
  h1.title{
    font-family:'IBM Plex Mono', monospace; font-weight:700;
    font-size: clamp(1.9rem, 4.2vw, 3.4rem); line-height:1.14; max-width: 19ch; color:#FFFFFF;
  }
  h1.title span{color: var(--node);}
  .hero-sub{ margin-top:18px; max-width: 64ch; font-size:1.04rem; color:#EAF2FA; }
  .meta-strip{
    margin-top:36px; display:grid; grid-template-columns: repeat(auto-fit,minmax(160px,1fr)); gap:1px;
    background: var(--node-dim); border:1px solid var(--node-dim); max-width: 940px;
  }
  .meta-cell{ background: var(--bg-deep); padding:14px 16px; }
  .meta-cell .k{ font-family:'IBM Plex Mono', monospace; font-size:0.66rem; letter-spacing:0.1em; text-transform:uppercase; color: var(--node); opacity:0.9; }
  .meta-cell .v{ margin-top:6px; font-size:0.94rem; font-weight:600; color:#F1F6FA; }

  /* ===== Content shell ===== */
  main{ background: var(--paper); border-radius:18px 18px 0 0; margin-top:-18px; position:relative; z-index:2; padding: 8px 0 0; }
  .section{ padding: 54px 6vw; max-width: 1180px; margin: 0 auto; border-bottom:1px solid #E7EAEE; }
  .section:last-of-type{border-bottom:none;}
  .section-tag{
    font-family:'IBM Plex Mono', monospace; font-size:0.72rem; letter-spacing:0.14em; text-transform:uppercase;
    color: var(--ink-soft); display:flex; align-items:center; gap:10px; margin-bottom:10px;
  }
  .section-tag .num{ color:#fff; background: var(--bg); padding:3px 8px; border-radius:3px; font-weight:600; }
  h2.section-title{ font-family:'IBM Plex Mono', monospace; font-size: clamp(1.35rem, 2.3vw, 1.9rem); font-weight:700; color: var(--bg); margin-bottom: 22px; max-width: 32ch; }
  h3.sub-title{ font-family:'IBM Plex Mono', monospace; font-size:1.06rem; font-weight:600; color: var(--bg); margin: 26px 0 12px; display:flex; align-items:center; gap:10px; }
  h3.sub-title::before{ content:""; width:8px;height:8px; background: var(--node); display:inline-block; border-radius:1px; }
  p{ color:#2C3B4A; max-width: 74ch; margin-bottom: 14px;}
  strong{color:var(--bg);}
  ul, ol{ margin: 8px 0 18px 1.3em; max-width: 74ch;}
  li{margin-bottom:8px; color:#2C3B4A;}

  .callout{ border-left: 3px solid var(--node); background: #EAF6FD; padding: 16px 20px; border-radius: 0 6px 6px 0; margin: 18px 0; max-width: 74ch; }
  .callout .lbl{ font-family:'IBM Plex Mono', monospace; font-size:0.7rem; letter-spacing:0.1em; text-transform:uppercase; color:#0E6E9C; font-weight:700; margin-bottom:6px; }
  .callout.warn{ border-left-color: var(--alert); background:#FDEEEC; }
  .callout.warn .lbl{ color:#B9392A; }
  .callout.secure{ border-left-color: var(--secure); background:#EBF9F0; }
  .callout.secure .lbl{ color:#177A43; }

  /* ===== Cards ===== */
  .card-grid{ display:grid; grid-template-columns: repeat(3, 1fr); gap: 16px; margin: 20px 0 8px; }
  @media (max-width: 860px){ .card-grid{grid-template-columns: 1fr;} }
  .card{ background: var(--paper); border: 1.5px solid var(--bg); border-radius: var(--radius); padding: 20px; }
  .card .tag{ font-family:'IBM Plex Mono', monospace; font-size:0.66rem; letter-spacing:0.1em; text-transform:uppercase; color:#fff; background: var(--bg); padding:3px 8px; border-radius:3px; display:inline-block; margin-bottom:12px; }
  .card h4{ font-family:'IBM Plex Mono', monospace; font-size:0.98rem; margin-bottom:8px; color:var(--bg); }
  .card p{font-size:0.89rem; margin-bottom:0;}

  table.compare{ width:100%; border-collapse:collapse; margin:18px 0; font-size:0.9rem; }
  table.compare th, table.compare td{ border:1px solid var(--line); padding:11px 14px; text-align:left; }
  table.compare th{ background: var(--bg); color:#fff; font-family:'IBM Plex Mono', monospace; font-size:0.74rem; letter-spacing:0.04em; text-transform:uppercase; }
  table.compare tr:nth-child(even) td{ background:#F4F6F8; }

  /* ===== Diagram ===== */
  .diagram-frame{ margin: 26px 0; background: var(--bg-deep); border-radius: 8px; padding: 18px; border: 1px solid var(--node-dim); }
  .diagram-frame svg{width:100%; height:auto; display:block;}
  .diagram-caption{ font-family:'IBM Plex Mono', monospace; font-size:0.72rem; color: var(--node); text-align:center; margin-top:10px; letter-spacing:0.03em; }
  .signal{ stroke-dasharray: 6 8; animation: flow 1.6s linear infinite; }
  @keyframes flow{ to{ stroke-dashoffset:-56; } }
  @media (prefers-reduced-motion: reduce){ .signal{animation:none;} }

  /* ===== Summary ===== */
  .summary-box{ background: var(--bg); color: #fff; border-radius: 8px; padding: 26px 28px; margin-top: 10px; }
  .summary-box h4{ font-family:'IBM Plex Mono', monospace; color: var(--node); font-size:0.85rem; letter-spacing:0.08em; text-transform:uppercase; margin-bottom:14px; }
  .summary-box ul{ margin:0 0 0 1.1em; max-width:none; }
  .summary-box li{ color:#DCEAF2; margin-bottom:8px; }

  /* ===== Tugas kelompok ===== */
  .task-panel{ border: 1.5px dashed var(--bg); border-radius: 8px; padding: 26px 28px; background: repeating-linear-gradient(135deg, #FBFCFD, #FBFCFD 18px, #EEF2F6 18px, #EEF2F6 19px); }
  .task-head{ display:flex; align-items:center; gap:12px; flex-wrap:wrap; margin-bottom:12px; }
  .task-head .badge{ font-family:'IBM Plex Mono', monospace; font-size:0.7rem; letter-spacing:0.08em; text-transform:uppercase; background: var(--node); color:#062230; padding:4px 10px; border-radius:3px; font-weight:700;}
  .task-panel h3{ font-family:'IBM Plex Mono', monospace; font-size:1.22rem; color: var(--bg); }
  .steps-num{ counter-reset: step; margin:16px 0; max-width:78ch; }
  .steps-num li{ counter-increment: step; list-style:none; position:relative; padding-left:34px; margin-bottom:14px; }
  .steps-num li::before{ content: counter(step); position:absolute; left:0; top:0; font-family:'IBM Plex Mono', monospace; font-weight:700; color:#fff; background: var(--bg); width:24px; height:24px; border-radius:50%; display:flex; align-items:center; justify-content:center; font-size:0.8rem; }
  table.rubrik{ width:100%; border-collapse:collapse; margin-top:18px; font-size:0.88rem; }
  table.rubrik th, table.rubrik td{ border:1px solid #C9CFD6; padding:10px 12px; text-align:left; }
  table.rubrik th{ background: var(--bg); color:#fff; font-family:'IBM Plex Mono', monospace; font-size:0.75rem; letter-spacing:0.04em; text-transform:uppercase; }
  table.rubrik tr:nth-child(even) td{ background:#EFF2F5; }

  .closing-task{ margin-top:22px; background: #FEF6EA; border:1.5px solid var(--amber); border-radius:8px; padding:20px 22px; }
  .closing-task .lbl{ font-family:'IBM Plex Mono', monospace; font-size:0.72rem; letter-spacing:0.1em; text-transform:uppercase; color:#8A5A0A; font-weight:700; margin-bottom:8px; }

  /* ===== Quiz ===== */
  .quiz-panel{ background: var(--bg-deep); border-radius: 10px; padding: 30px 28px; color:#EAF2FA; }
  .quiz-panel h3.sub-title{ color:#EAF2FA; }
  .quiz-panel h3.sub-title::before{ background: var(--node); }
  .quiz-note{ font-size:0.88rem; color:#9FB4C6; max-width:74ch; margin-bottom:18px;}
  .student-info{ display:grid; grid-template-columns: repeat(3, 1fr); gap:14px; margin: 18px 0 30px; }
  @media (max-width:700px){ .student-info{grid-template-columns:1fr;} }
  .field label{ display:block; font-family:'IBM Plex Mono', monospace; font-size:0.7rem; letter-spacing:0.06em; text-transform:uppercase; color: var(--node); margin-bottom:6px; }
  .field input, .field select{
    width:100%; padding:10px 12px; border-radius:5px; border:1px solid #2A4258; background:#0F2438; color:#EAF2FA; font-family:'IBM Plex Sans', sans-serif; font-size:0.94rem;
  }
  .field select{ cursor:pointer; }
  .field input:focus, .field select:focus{ outline:2px solid var(--node); }

  .q-card{ background:#0F2438; border:1px solid #23384B; border-radius:8px; padding:18px 20px; margin-bottom:14px; }
  .q-card .q-num{ font-family:'IBM Plex Mono', monospace; font-size:0.72rem; color: var(--node); letter-spacing:0.08em; margin-bottom:6px; }
  .q-card .q-text{ font-size:0.98rem; color:#F1F6FA; margin-bottom:12px; font-weight:500; }
  .options{ display:flex; flex-direction:column; gap:8px; }
  .opt{ display:flex; align-items:flex-start; gap:10px; padding:9px 12px; border:1px solid #23384B; border-radius:5px; cursor:pointer; transition: border-color .15s, background .15s; }
  .opt:hover{ border-color: var(--node); }
  .opt input{ margin-top:3px; accent-color: var(--node); }
  .opt span{ font-size:0.9rem; color:#DDE8F0; }
  .opt.selected{ border-color: var(--node); background: rgba(56,189,248,0.08); }

  .quiz-actions{ margin-top:24px; display:flex; align-items:center; gap:16px; flex-wrap:wrap; }
  #btnHitung, #btnKirim{
    font-family:'IBM Plex Mono', monospace; font-weight:600; font-size:0.85rem; letter-spacing:0.04em;
    padding: 12px 22px; border-radius:6px; border:none; cursor:pointer;
  }
  #btnHitung{ background: var(--node); color:#062230; }
  #btnHitung:hover{ filter:brightness(1.08); }
  #btnKirim{ background: var(--secure); color:#062230; display:none; }
  #btnKirim:hover{ filter:brightness(1.08); }
  #btnKirim:disabled{ opacity:0.6; cursor:not-allowed; }
  #quizMsg{ font-family:'IBM Plex Mono', monospace; font-size:0.85rem; color: var(--amber); }

  .result-panel{
    display:none; margin-top:22px; background:#0F2438; border:1.5px solid var(--secure); border-radius:8px; padding:22px 24px;
  }
  .result-panel .score{ font-family:'IBM Plex Mono', monospace; font-size:2.4rem; font-weight:700; color: var(--secure); }
  .result-panel .score-lbl{ font-family:'IBM Plex Mono', monospace; font-size:0.72rem; letter-spacing:0.1em; text-transform:uppercase; color:#9FB4C6; }
  .result-panel p{ color:#DDE8F0; font-size:0.9rem; margin-top:10px; margin-bottom:0; }

  footer{ background: var(--bg-deep); color:#7E93A6; text-align:center; padding: 30px 6vw 40px; font-family:'IBM Plex Mono', monospace; font-size:0.75rem; letter-spacing:0.04em; }

  @media (max-width: 700px){
    .card-grid{grid-template-columns:1fr;}
    header.hero{padding:44px 5vw 40px;}
    .section{padding:38px 5vw;}
  }
&lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;

&lt;header class="hero" style="background:#0B1B2A; border-radius:10px;"&gt;
  &lt;div class="content"&gt;
    &lt;div class="eyebrow"&gt;Informatika · Fase E · Kelas X SMK&lt;/div&gt;
    &lt;h1 class="title" style="color:#FFFFFF; text-shadow:0 2px 6px rgba(0,0,0,0.55);"&gt;Jaringan Komputer, Internet, &amp; Keamanan &lt;span style="color:#38BDF8;"&gt;Digital&lt;/span&gt;&lt;/h1&gt;
    &lt;p class="hero-sub" style="color:#EAF2FA; text-shadow:0 1px 4px rgba(0,0,0,0.45);"&gt;Materi ini membahas bagaimana perangkat saling terhubung membentuk jaringan, bagaimana internet bekerja menghubungkan jaringan-jaringan di seluruh dunia, serta bagaimana menerapkan keamanan dasar dan enkripsi agar aktivitas digital kita tetap aman.&lt;/p&gt;

    &lt;div class="meta-strip"&gt;
      &lt;div class="meta-cell"&gt;&lt;div class="k"&gt;Elemen CP&lt;/div&gt;&lt;div class="v"&gt;Jaringan &amp; Keamanan Digital&lt;/div&gt;&lt;/div&gt;
      &lt;div class="meta-cell"&gt;&lt;div class="k"&gt;Jenjang&lt;/div&gt;&lt;div class="v"&gt;SMK Kelas X&lt;/div&gt;&lt;/div&gt;
      &lt;div class="meta-cell"&gt;&lt;div class="k"&gt;Alokasi Waktu&lt;/div&gt;&lt;div class="v"&gt;1 Pertemuan · 4 JP (180 menit)&lt;/div&gt;&lt;/div&gt;
      &lt;div class="meta-cell"&gt;&lt;div class="k"&gt;Model&lt;/div&gt;&lt;div class="v"&gt;Diskusi, Kerja Kelompok &amp; Kuis&lt;/div&gt;&lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/header&gt;

&lt;main&gt;

  &lt;!-- ===================== TUJUAN ===================== --&gt;
  &lt;section class="section" id="tujuan"&gt;
    &lt;div class="section-tag"&gt;&lt;span class="num"&gt;00&lt;/span&gt; Capaian &amp; Tujuan Pembelajaran&lt;/div&gt;
    &lt;h2 class="section-title"&gt;Ke Mana Materi Ini Menuju&lt;/h2&gt;

    &lt;h3 class="sub-title"&gt;Capaian Pembelajaran&lt;/h3&gt;
    &lt;p&gt;Murid mampu menjelaskan konsep jaringan komputer, konektivitas internet, perangkat jaringan, komunikasi data, serta menerapkan keamanan dasar dan enkripsi dalam penggunaan jaringan.&lt;/p&gt;

    &lt;h3 class="sub-title"&gt;Tujuan Pembelajaran&lt;/h3&gt;
    &lt;ol&gt;
      &lt;li&gt;Menjelaskan konsep dasar jaringan komputer dan jenis-jenisnya berdasarkan jangkauan (PAN, LAN, MAN, WAN).&lt;/li&gt;
      &lt;li&gt;Menjelaskan konektivitas internet: ISP, alamat IP, DNS, dan protokol dasar (TCP/IP, HTTP/HTTPS).&lt;/li&gt;
      &lt;li&gt;Mengidentifikasi perangkat jaringan (router, switch, modem, access point, firewall) beserta fungsinya.&lt;/li&gt;
      &lt;li&gt;Menjelaskan konsep komunikasi data, termasuk bandwidth dan latency.&lt;/li&gt;
      &lt;li&gt;Menerapkan prinsip keamanan dasar dan enkripsi dalam penggunaan jaringan sehari-hari.&lt;/li&gt;
    &lt;/ol&gt;

    &lt;h3 class="sub-title"&gt;Rincian Kegiatan (4 JP × 45 menit)&lt;/h3&gt;
    &lt;table class="compare"&gt;
      &lt;tr&gt;&lt;th&gt;Tahap&lt;/th&gt;&lt;th&gt;Kegiatan&lt;/th&gt;&lt;th&gt;Waktu&lt;/th&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Pendahuluan&lt;/td&gt;&lt;td&gt;Apersepsi ("Bagaimana pesan yang kamu kirim bisa sampai ke HP temanmu dalam hitungan detik?"), penyampaian tujuan pembelajaran&lt;/td&gt;&lt;td&gt;15 menit&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Inti — Eksplorasi Konsep&lt;/td&gt;&lt;td&gt;Penjelasan jaringan komputer, internet, perangkat jaringan, komunikasi data, dan keamanan digital&lt;/td&gt;&lt;td&gt;55 menit&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Inti — Kerja Kelompok&lt;/td&gt;&lt;td&gt;Diskusi dan pengerjaan tugas kelompok merancang skema jaringan&lt;/td&gt;&lt;td&gt;40 menit&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Inti — Presentasi&lt;/td&gt;&lt;td&gt;Presentasi singkat tiap kelompok dan tanggapan guru&lt;/td&gt;&lt;td&gt;20 menit&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Inti — Kuis Individu&lt;/td&gt;&lt;td&gt;Mengerjakan 15 soal pilihan ganda secara mandiri melalui halaman ini&lt;/td&gt;&lt;td&gt;30 menit&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Penutup&lt;/td&gt;&lt;td&gt;Refleksi, penguatan konsep, menulis kesimpulan ringkas di buku catatan&lt;/td&gt;&lt;td&gt;20 menit&lt;/td&gt;&lt;/tr&gt;
    &lt;/table&gt;
  &lt;/section&gt;

  &lt;!-- ===================== A. JARINGAN KOMPUTER ===================== --&gt;
  &lt;section class="section" id="jaringan"&gt;
    &lt;div class="section-tag"&gt;&lt;span class="num"&gt;01&lt;/span&gt; Konsep Dasar&lt;/div&gt;
    &lt;h2 class="section-title"&gt;Apa Itu Jaringan Komputer?&lt;/h2&gt;
    &lt;p&gt;&lt;strong&gt;Jaringan komputer&lt;/strong&gt; adalah kumpulan dua atau lebih perangkat (komputer, laptop, HP, printer, dsb.) yang saling terhubung melalui media kabel atau nirkabel, sehingga dapat saling berbagi data, aplikasi, dan sumber daya seperti printer atau koneksi internet.&lt;/p&gt;

    &lt;h3 class="sub-title"&gt;Jenis Jaringan Berdasarkan Jangkauan&lt;/h3&gt;
    &lt;table class="compare"&gt;
      &lt;tr&gt;&lt;th&gt;Jenis&lt;/th&gt;&lt;th&gt;Kepanjangan&lt;/th&gt;&lt;th&gt;Cakupan&lt;/th&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;PAN&lt;/td&gt;&lt;td&gt;Personal Area Network&lt;/td&gt;&lt;td&gt;Sangat dekat, antar perangkat pribadi — mis. HP tersambung ke earphone via Bluetooth.&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;LAN&lt;/td&gt;&lt;td&gt;Local Area Network&lt;/td&gt;&lt;td&gt;Satu ruangan atau gedung — mis. jaringan komputer di lab sekolah.&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;MAN&lt;/td&gt;&lt;td&gt;Metropolitan Area Network&lt;/td&gt;&lt;td&gt;Satu kota — mis. jaringan yang menghubungkan beberapa kantor cabang dalam satu kota.&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;WAN&lt;/td&gt;&lt;td&gt;Wide Area Network&lt;/td&gt;&lt;td&gt;Sangat luas, antar kota bahkan antar negara — internet adalah contoh WAN terbesar.&lt;/td&gt;&lt;/tr&gt;
    &lt;/table&gt;

    &lt;h3 class="sub-title"&gt;Topologi Jaringan&lt;/h3&gt;
    &lt;p&gt;Topologi adalah pola bagaimana perangkat-perangkat dalam jaringan diatur dan dihubungkan satu sama lain.&lt;/p&gt;
    &lt;div class="diagram-frame"&gt;
      &lt;svg viewBox="0 0 800 230" xmlns="http://www.w3.org/2000/svg"&gt;
        &lt;text x="400" y="24" text-anchor="middle" fill="#38BDF8" font-family="IBM Plex Mono, monospace" font-size="12" letter-spacing="2"&gt;TOPOLOGI STAR (paling umum di lab sekolah)&lt;/text&gt;
        &lt;circle cx="400" cy="120" r="22" fill="none" stroke="#F2B84B" stroke-width="2"/&gt;
        &lt;text x="400" y="125" text-anchor="middle" fill="#F2B84B" font-family="IBM Plex Mono, monospace" font-size="10"&gt;SWITCH&lt;/text&gt;
        &lt;g stroke="#38BDF8" stroke-width="2"&gt;
          &lt;line class="signal" x1="400" y1="98" x2="400" y2="45"/&gt;
          &lt;line class="signal" x1="420" y1="105" x2="620" y2="70"/&gt;
          &lt;line class="signal" x1="420" y1="135" x2="620" y2="170"/&gt;
          &lt;line class="signal" x1="380" y1="135" x2="180" y2="170"/&gt;
          &lt;line class="signal" x1="380" y1="105" x2="180" y2="70"/&gt;
        &lt;/g&gt;
        &lt;g fill="none" stroke="#EAF2FA" stroke-width="1.5"&gt;
          &lt;rect x="375" y="15" width="50" height="30" rx="3"/&gt;
          &lt;rect x="600" y="55" width="55" height="30" rx="3"/&gt;
          &lt;rect x="600" y="155" width="55" height="30" rx="3"/&gt;
          &lt;rect x="150" y="55" width="55" height="30" rx="3"/&gt;
          &lt;rect x="150" y="155" width="55" height="30" rx="3"/&gt;
        &lt;/g&gt;
        &lt;g fill="#EAF2FA" font-family="IBM Plex Mono, monospace" font-size="9" text-anchor="middle"&gt;
          &lt;text x="400" y="34"&gt;PC 1&lt;/text&gt;
          &lt;text x="627" y="74"&gt;PC 2&lt;/text&gt;
          &lt;text x="627" y="174"&gt;PC 3&lt;/text&gt;
          &lt;text x="177" y="74"&gt;PC 4&lt;/text&gt;
          &lt;text x="177" y="174"&gt;PC 5&lt;/text&gt;
        &lt;/g&gt;
      &lt;/svg&gt;
      &lt;div class="diagram-caption"&gt;Semua perangkat terhubung ke satu titik pusat (switch) — mudah dipasang &amp; ditelusuri jika ada gangguan pada satu perangkat.&lt;/div&gt;
    &lt;/div&gt;
    &lt;p&gt;Selain &lt;em&gt;star&lt;/em&gt;, dikenal juga topologi &lt;strong&gt;bus&lt;/strong&gt; (semua perangkat berbagi satu jalur kabel utama), &lt;strong&gt;ring&lt;/strong&gt; (perangkat terhubung membentuk lingkaran), &lt;strong&gt;mesh&lt;/strong&gt; (setiap perangkat saling terhubung langsung satu sama lain), dan &lt;strong&gt;tree&lt;/strong&gt; (gabungan beberapa topologi star bertingkat).&lt;/p&gt;
  &lt;/section&gt;

  &lt;!-- ===================== B. PERANGKAT JARINGAN ===================== --&gt;
  &lt;section class="section" id="perangkat"&gt;
    &lt;div class="section-tag"&gt;&lt;span class="num"&gt;02&lt;/span&gt; Infrastruktur&lt;/div&gt;
    &lt;h2 class="section-title"&gt;Perangkat Jaringan&lt;/h2&gt;
    &lt;p&gt;Sebuah jaringan membutuhkan beberapa perangkat keras khusus agar data dapat mengalir dengan benar antar perangkat.&lt;/p&gt;
    &lt;div class="card-grid"&gt;
      &lt;div class="card"&gt;&lt;span class="tag"&gt;Penghubung Internet&lt;/span&gt;&lt;h4&gt;Router&lt;/h4&gt;&lt;p&gt;Menghubungkan jaringan lokal (LAN) ke jaringan lain/internet, serta menentukan jalur terbaik pengiriman data.&lt;/p&gt;&lt;/div&gt;
      &lt;div class="card"&gt;&lt;span class="tag"&gt;Penghubung Lokal&lt;/span&gt;&lt;h4&gt;Switch&lt;/h4&gt;&lt;p&gt;Menghubungkan banyak perangkat dalam satu LAN dan meneruskan data hanya ke perangkat tujuan yang tepat.&lt;/p&gt;&lt;/div&gt;
      &lt;div class="card"&gt;&lt;span class="tag"&gt;Konversi Sinyal&lt;/span&gt;&lt;h4&gt;Modem&lt;/h4&gt;&lt;p&gt;Mengubah sinyal digital dari komputer menjadi sinyal yang dapat dikirim lewat jalur ISP, dan sebaliknya.&lt;/p&gt;&lt;/div&gt;
      &lt;div class="card"&gt;&lt;span class="tag"&gt;Nirkabel&lt;/span&gt;&lt;h4&gt;Access Point&lt;/h4&gt;&lt;p&gt;Memancarkan sinyal Wi-Fi agar perangkat dapat terhubung ke jaringan tanpa kabel.&lt;/p&gt;&lt;/div&gt;
      &lt;div class="card"&gt;&lt;span class="tag"&gt;Kartu Jaringan&lt;/span&gt;&lt;h4&gt;NIC (Network Interface Card)&lt;/h4&gt;&lt;p&gt;Komponen di dalam perangkat yang memungkinkannya terhubung secara fisik ke jaringan.&lt;/p&gt;&lt;/div&gt;
      &lt;div class="card"&gt;&lt;span class="tag"&gt;Keamanan&lt;/span&gt;&lt;h4&gt;Firewall&lt;/h4&gt;&lt;p&gt;Menyaring dan mengendalikan lalu lintas data masuk/keluar jaringan berdasarkan aturan keamanan tertentu.&lt;/p&gt;&lt;/div&gt;
    &lt;/div&gt;
  &lt;/section&gt;

  &lt;!-- ===================== C. INTERNET &amp; KOMUNIKASI DATA ===================== --&gt;
  &lt;section class="section" id="internet"&gt;
    &lt;div class="section-tag"&gt;&lt;span class="num"&gt;03&lt;/span&gt; Konektivitas&lt;/div&gt;
    &lt;h2 class="section-title"&gt;Internet &amp; Komunikasi Data&lt;/h2&gt;
    &lt;p&gt;&lt;strong&gt;Internet&lt;/strong&gt; adalah jaringan raksasa (WAN) yang menghubungkan jutaan jaringan komputer di seluruh dunia menggunakan aturan komunikasi yang sama, yaitu protokol &lt;strong&gt;TCP/IP&lt;/strong&gt;.&lt;/p&gt;

    &lt;h3 class="sub-title"&gt;Istilah Kunci Konektivitas&lt;/h3&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;strong&gt;ISP (Internet Service Provider)&lt;/strong&gt; — perusahaan penyedia layanan akses internet, mis. Telkom/IndiHome, Biznet, atau operator seluler.&lt;/li&gt;
      &lt;li&gt;&lt;strong&gt;IP Address&lt;/strong&gt; — alamat unik yang mengidentifikasi setiap perangkat dalam jaringan, seperti alamat rumah di dunia digital.&lt;/li&gt;
      &lt;li&gt;&lt;strong&gt;DNS (Domain Name System)&lt;/strong&gt; — sistem yang menerjemahkan nama domain (mis. &lt;span class="mono"&gt;www.contoh.com&lt;/span&gt;) menjadi alamat IP yang dipahami komputer.&lt;/li&gt;
      &lt;li&gt;&lt;strong&gt;HTTP/HTTPS&lt;/strong&gt; — protokol untuk mengakses halaman web; HTTPS menambahkan lapisan enkripsi agar data yang dikirim antara browser dan server lebih aman.&lt;/li&gt;
    &lt;/ul&gt;

    &lt;h3 class="sub-title"&gt;Bandwidth &amp; Latency&lt;/h3&gt;
    &lt;table class="compare"&gt;
      &lt;tr&gt;&lt;th&gt;Istilah&lt;/th&gt;&lt;th&gt;Penjelasan&lt;/th&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Bandwidth&lt;/td&gt;&lt;td&gt;Kapasitas maksimum data yang dapat ditransmisikan dalam jaringan pada waktu tertentu — makin besar, makin banyak data yang bisa mengalir sekaligus.&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Latency&lt;/td&gt;&lt;td&gt;Waktu tunda yang dibutuhkan data untuk berpindah dari satu titik ke titik lain — makin kecil, makin responsif koneksi terasa (penting untuk video call/game online).&lt;/td&gt;&lt;/tr&gt;
    &lt;/table&gt;
  &lt;/section&gt;

  &lt;!-- ===================== D. KEAMANAN DIGITAL ===================== --&gt;
  &lt;section class="section" id="keamanan"&gt;
    &lt;div class="section-tag"&gt;&lt;span class="num"&gt;04&lt;/span&gt; Perlindungan Data&lt;/div&gt;
    &lt;h2 class="section-title"&gt;Keamanan Dasar &amp; Enkripsi&lt;/h2&gt;
    &lt;p&gt;Semakin banyak aktivitas dilakukan lewat jaringan, semakin penting pula memahami risiko dan cara melindungi data dari ancaman digital.&lt;/p&gt;

    &lt;h3 class="sub-title"&gt;Ancaman Umum di Jaringan&lt;/h3&gt;
    &lt;div class="callout warn"&gt;
      &lt;div class="lbl"&gt;Waspadai&lt;/div&gt;
      &lt;ul style="margin:0 0 0 1.1em;"&gt;
        &lt;li&gt;&lt;strong&gt;Malware&lt;/strong&gt; — perangkat lunak berbahaya (virus, ransomware) yang merusak atau mencuri data.&lt;/li&gt;
        &lt;li&gt;&lt;strong&gt;Phishing&lt;/strong&gt; — upaya menipu pengguna agar memberikan data pribadi (mis. password) lewat tautan atau pesan palsu.&lt;/li&gt;
        &lt;li&gt;&lt;strong&gt;DDoS (Distributed Denial of Service)&lt;/strong&gt; — serangan yang membanjiri server dengan lalu lintas palsu hingga layanan tidak bisa diakses.&lt;/li&gt;
      &lt;/ul&gt;
    &lt;/div&gt;

    &lt;h3 class="sub-title"&gt;Praktik Keamanan Dasar&lt;/h3&gt;
    &lt;div class="callout secure"&gt;
      &lt;div class="lbl"&gt;Langkah Perlindungan&lt;/div&gt;
      &lt;ul style="margin:0 0 0 1.1em;"&gt;
        &lt;li&gt;Gunakan &lt;strong&gt;kata sandi (password) yang kuat&lt;/strong&gt; dan berbeda untuk setiap akun.&lt;/li&gt;
        &lt;li&gt;Aktifkan &lt;strong&gt;autentikasi dua faktor (2FA)&lt;/strong&gt; untuk lapisan keamanan tambahan.&lt;/li&gt;
        &lt;li&gt;Selalu &lt;strong&gt;perbarui (update)&lt;/strong&gt; sistem operasi dan aplikasi untuk menutup celah keamanan.&lt;/li&gt;
        &lt;li&gt;Aktifkan &lt;strong&gt;firewall&lt;/strong&gt; dan gunakan &lt;strong&gt;VPN&lt;/strong&gt; saat mengakses jaringan publik yang tidak terpercaya.&lt;/li&gt;
      &lt;/ul&gt;
    &lt;/div&gt;

    &lt;h3 class="sub-title"&gt;Enkripsi&lt;/h3&gt;
    &lt;p&gt;&lt;strong&gt;Enkripsi&lt;/strong&gt; adalah proses mengubah data menjadi bentuk acak yang tidak dapat dibaca oleh pihak yang tidak berwenang, dan hanya dapat dikembalikan ke bentuk semula dengan kunci tertentu. Saat kalian mengakses situs dengan ikon gembok dan awalan &lt;span class="mono"&gt;https://&lt;/span&gt; di address bar, artinya data yang dikirim antara perangkat kalian dan server situs tersebut sudah dienkripsi.&lt;/p&gt;
  &lt;/section&gt;

  &lt;!-- ===================== E. HUBUNGAN ===================== --&gt;
  &lt;section class="section" id="hubungan"&gt;
    &lt;div class="section-tag"&gt;&lt;span class="num"&gt;05&lt;/span&gt; Keterkaitan&lt;/div&gt;
    &lt;h2 class="section-title"&gt;Hubungan Antar Konsep&lt;/h2&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;strong&gt;Perangkat jaringan&lt;/strong&gt; (router, switch, modem, access point) adalah fondasi fisik yang membentuk jaringan komputer.&lt;/li&gt;
      &lt;li&gt;&lt;strong&gt;Jaringan lokal&lt;/strong&gt; yang terhubung ke &lt;strong&gt;ISP&lt;/strong&gt; menjadi bagian dari &lt;strong&gt;internet&lt;/strong&gt; — jaringan global.&lt;/li&gt;
      &lt;li&gt;&lt;strong&gt;Komunikasi data&lt;/strong&gt; antar perangkat diatur oleh protokol standar (TCP/IP, HTTP/HTTPS) agar semua perangkat "berbicara bahasa yang sama".&lt;/li&gt;
      &lt;li&gt;&lt;strong&gt;Keamanan digital dan enkripsi&lt;/strong&gt; melindungi seluruh proses komunikasi data ini dari pihak yang tidak berwenang.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/section&gt;

  &lt;!-- ===================== F. RANGKUMAN ===================== --&gt;
  &lt;section class="section" id="rangkuman"&gt;
    &lt;div class="section-tag"&gt;&lt;span class="num"&gt;06&lt;/span&gt; Penguatan Konsep&lt;/div&gt;
    &lt;h2 class="section-title"&gt;Rangkuman Materi&lt;/h2&gt;
    &lt;div class="summary-box"&gt;
      &lt;h4&gt;Poin-Poin Kunci&lt;/h4&gt;
      &lt;ul&gt;
        &lt;li&gt;Jaringan komputer menghubungkan dua atau lebih perangkat untuk berbagi data dan sumber daya, dengan jangkauan PAN, LAN, MAN, hingga WAN.&lt;/li&gt;
        &lt;li&gt;Topologi jaringan (star, bus, ring, mesh, tree) menentukan pola koneksi antar perangkat.&lt;/li&gt;
        &lt;li&gt;Perangkat jaringan utama meliputi router, switch, modem, access point, NIC, dan firewall.&lt;/li&gt;
        &lt;li&gt;Internet adalah WAN raksasa yang menghubungkan jaringan di seluruh dunia melalui protokol TCP/IP.&lt;/li&gt;
        &lt;li&gt;ISP menyediakan akses internet; IP address mengidentifikasi perangkat; DNS menerjemahkan nama domain menjadi IP.&lt;/li&gt;
        &lt;li&gt;Bandwidth menentukan kapasitas data, sedangkan latency menentukan kecepatan respons jaringan.&lt;/li&gt;
        &lt;li&gt;Ancaman digital meliputi malware, phishing, dan DDoS — dicegah dengan password kuat, 2FA, update rutin, firewall, dan VPN.&lt;/li&gt;
        &lt;li&gt;Enkripsi mengubah data menjadi bentuk aman, dan menjadi dasar dari koneksi HTTPS yang kita gunakan sehari-hari.&lt;/li&gt;
      &lt;/ul&gt;
    &lt;/div&gt;
  &lt;/section&gt;

  &lt;!-- ===================== TUGAS KELOMPOK ===================== --&gt;
  &lt;section class="section" id="tugas"&gt;
    &lt;div class="section-tag"&gt;&lt;span class="num"&gt;07&lt;/span&gt; Aktivitas Belajar&lt;/div&gt;
    &lt;h2 class="section-title"&gt;Tugas Kelompok&lt;/h2&gt;

    &lt;div class="task-panel"&gt;
      &lt;div class="task-head"&gt;
        &lt;span class="badge"&gt;Kerja Kelompok · 4–5 orang&lt;/span&gt;
        &lt;span class="badge" style="background:var(--bg); color:#fff;"&gt;40 menit diskusi + 20 menit presentasi&lt;/span&gt;
      &lt;/div&gt;
      &lt;h3&gt;Merancang Skema Jaringan LAN untuk Laboratorium Komputer Sekolah&lt;/h3&gt;
      &lt;p&gt;Setiap kelompok berperan sebagai "tim IT sekolah" yang ditugaskan merancang jaringan LAN sederhana dan aman untuk sebuah laboratorium komputer.&lt;/p&gt;

      &lt;ol class="steps-num"&gt;
        &lt;li&gt;&lt;strong&gt;Bentuk kelompok&lt;/strong&gt; beranggotakan 4–5 orang, tentukan skenario: jumlah komputer di lab (mis. 15 unit) dan kebutuhan aksesnya ke internet.&lt;/li&gt;
        &lt;li&gt;&lt;strong&gt;Pilih topologi jaringan&lt;/strong&gt; yang paling sesuai untuk skenario tersebut, dan jelaskan alasan pemilihannya.&lt;/li&gt;
        &lt;li&gt;&lt;strong&gt;Tentukan perangkat jaringan&lt;/strong&gt; yang dibutuhkan (router, switch, kabel/access point, dsb.) beserta perkiraan jumlahnya.&lt;/li&gt;
        &lt;li&gt;&lt;strong&gt;Gambarkan skema jaringan sederhana&lt;/strong&gt; yang menunjukkan bagaimana seluruh komputer, perangkat jaringan, dan sambungan internet terhubung.&lt;/li&gt;
        &lt;li&gt;&lt;strong&gt;Rancang langkah keamanan dasar&lt;/strong&gt; untuk jaringan tersebut, misalnya kebijakan password Wi-Fi, penggunaan firewall, dan pembatasan akses pengguna.&lt;/li&gt;
        &lt;li&gt;&lt;strong&gt;Presentasikan&lt;/strong&gt; rancangan di depan kelas selama maksimal 5 menit per kelompok.&lt;/li&gt;
      &lt;/ol&gt;

      &lt;h3 class="sub-title" style="margin-top:26px;"&gt;Format Laporan&lt;/h3&gt;
      &lt;p&gt;Laporan memuat: (1) skenario &amp; anggota kelompok, (2) topologi pilihan beserta alasan, (3) daftar perangkat jaringan yang dibutuhkan, (4) gambar skema jaringan, (5) rancangan langkah keamanan dasar.&lt;/p&gt;

      &lt;h3 class="sub-title"&gt;Rubrik Penilaian&lt;/h3&gt;
      &lt;table class="rubrik"&gt;
        &lt;tr&gt;&lt;th&gt;Aspek&lt;/th&gt;&lt;th&gt;Indikator&lt;/th&gt;&lt;th&gt;Skor Maks.&lt;/th&gt;&lt;/tr&gt;
        &lt;tr&gt;&lt;td&gt;Ketepatan Topologi&lt;/td&gt;&lt;td&gt;Topologi yang dipilih sesuai skenario dan alasannya logis&lt;/td&gt;&lt;td&gt;25&lt;/td&gt;&lt;/tr&gt;
        &lt;tr&gt;&lt;td&gt;Kelengkapan Perangkat&lt;/td&gt;&lt;td&gt;Perangkat jaringan yang disebutkan lengkap dan fungsinya tepat&lt;/td&gt;&lt;td&gt;25&lt;/td&gt;&lt;/tr&gt;
        &lt;tr&gt;&lt;td&gt;Skema Jaringan&lt;/td&gt;&lt;td&gt;Gambar skema jelas dan menunjukkan hubungan antar komponen dengan benar&lt;/td&gt;&lt;td&gt;20&lt;/td&gt;&lt;/tr&gt;
        &lt;tr&gt;&lt;td&gt;Aspek Keamanan&lt;/td&gt;&lt;td&gt;Langkah keamanan dasar relevan dan dapat diterapkan&lt;/td&gt;&lt;td&gt;15&lt;/td&gt;&lt;/tr&gt;
        &lt;tr&gt;&lt;td&gt;Kerja Sama &amp; Presentasi&lt;/td&gt;&lt;td&gt;Seluruh anggota berkontribusi; presentasi jelas dan percaya diri&lt;/td&gt;&lt;td&gt;15&lt;/td&gt;&lt;/tr&gt;
        &lt;tr&gt;&lt;td colspan="2" style="text-align:right; font-weight:600;"&gt;Total&lt;/td&gt;&lt;td&gt;100&lt;/td&gt;&lt;/tr&gt;
      &lt;/table&gt;
    &lt;/div&gt;

    &lt;div class="closing-task"&gt;
      &lt;div class="lbl"&gt;Penutup Pembelajaran · Tugas Individu&lt;/div&gt;
      &lt;p style="margin:0;"&gt;&lt;strong&gt;Tulislah satu kesimpulan ringkas (5–7 kalimat) di buku catatan kalian masing-masing&lt;/strong&gt;, yang merangkum keseluruhan materi hari ini: konsep jaringan komputer, perangkat jaringan, cara kerja internet, komunikasi data, serta pentingnya keamanan dasar dan enkripsi. Tulis dengan bahasa dan pemahaman kalian sendiri, bukan menyalin ulang materi.&lt;/p&gt;
    &lt;/div&gt;
  &lt;/section&gt;

  &lt;!-- ===================== KUIS INDIVIDU ===================== --&gt;
  &lt;section class="section" id="kuis"&gt;
    &lt;div class="section-tag"&gt;&lt;span class="num"&gt;08&lt;/span&gt; Evaluasi Individu&lt;/div&gt;
    &lt;h2 class="section-title"&gt;Kuis Pilihan Ganda (15 Soal)&lt;/h2&gt;
    &lt;p&gt;Kerjakan seluruh soal berikut secara mandiri. Isi identitas kalian dengan benar sebelum mengirim jawaban — skor akan otomatis dihitung dan dikirim ke guru.&lt;/p&gt;

    &lt;div class="quiz-panel"&gt;
      &lt;h3 class="sub-title"&gt;Identitas Peserta&lt;/h3&gt;
      &lt;p class="quiz-note"&gt;Pastikan No. Absen, Nama, dan Kelas diisi sesuai data sekolah agar skor tercatat dengan benar.&lt;/p&gt;
      &lt;div class="student-info"&gt;
        &lt;div class="field"&gt;&lt;label for="noAbsen"&gt;No. Absen&lt;/label&gt;&lt;input type="number" id="noAbsen" min="1" placeholder="mis. 12"&gt;&lt;/div&gt;
        &lt;div class="field"&gt;&lt;label for="nama"&gt;Nama Lengkap&lt;/label&gt;&lt;input type="text" id="nama" placeholder="Nama sesuai absensi"&gt;&lt;/div&gt;
        &lt;div class="field"&gt;&lt;label for="kelas"&gt;Kelas&lt;/label&gt;
          &lt;select id="kelas"&gt;
            &lt;option value=""&gt;-- Pilih Kelas --&lt;/option&gt;
            &lt;option value="X TB1"&gt;X TB1&lt;/option&gt;
            &lt;option value="X TB2"&gt;X TB2&lt;/option&gt;
            &lt;option value="X TO1"&gt;X TO1&lt;/option&gt;
            &lt;option value="X TO2"&gt;X TO2&lt;/option&gt;
            &lt;option value="X TJKT1"&gt;X TJKT1&lt;/option&gt;
            &lt;option value="X TJKT2"&gt;X TJKT2&lt;/option&gt;
          &lt;/select&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;h3 class="sub-title"&gt;Soal&lt;/h3&gt;
      &lt;div id="quizContainer"&gt;&lt;/div&gt;

      &lt;div class="quiz-actions"&gt;
        &lt;button id="btnHitung"&gt;Hitung &amp; Lihat Skor&lt;/button&gt;
        &lt;button id="btnKirim"&gt;Kirim Ulang ke Guru&lt;/button&gt;
        &lt;span id="quizMsg"&gt;&lt;/span&gt;
      &lt;/div&gt;

      &lt;div class="result-panel" id="resultPanel"&gt;
        &lt;div class="score-lbl"&gt;Skor Kamu&lt;/div&gt;
        &lt;div class="score" id="scoreValue"&gt;0&lt;/div&gt;
        &lt;p id="resultDetail"&gt;&lt;/p&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/section&gt;

  &lt;!-- ===================== CONTOH JAWABAN TUGAS KELOMPOK ===================== --&gt;
  &lt;section class="section" id="jawaban-tugas"&gt;
    &lt;div class="section-tag"&gt;&lt;span class="num"&gt;09&lt;/span&gt; Referensi Diskusi Kelompok&lt;/div&gt;
    &lt;h2 class="section-title"&gt;Contoh Jawaban: Skema Jaringan LAN Laboratorium Komputer&lt;/h2&gt;

    &lt;div class="callout secure"&gt;
      &lt;div class="lbl"&gt;Catatan&lt;/div&gt;
      &lt;p style="margin:0;"&gt;Bagian ini adalah &lt;strong&gt;contoh jawaban/kunci jawaban&lt;/strong&gt; untuk tugas kelompok di atas, disusun dari sudut pandang "Tim IT Sekolah" sebagai referensi Diskusi Kelompok hasil kerja murid. Skenario yang digunakan: laboratorium komputer dengan &lt;strong&gt;20 unit komputer siswa dan 1 unit komputer guru&lt;/strong&gt;, membutuhkan akses internet bersama dari satu sambungan ISP sekolah.&lt;/p&gt;
    &lt;/div&gt;

    &lt;h3 class="sub-title"&gt;1. Pemilihan Topologi Jaringan&lt;/h3&gt;
    &lt;p&gt;Topologi yang dipilih adalah &lt;strong&gt;topologi star&lt;/strong&gt;, dengan seluruh komputer terhubung ke satu switch pusat. Alasan pemilihan:&lt;/p&gt;
    &lt;ul&gt;
      &lt;li&gt;Jika satu kabel atau satu komputer bermasalah, komputer lain di lab tetap dapat terhubung ke jaringan — gangguan tidak menjalar ke seluruh jaringan seperti pada topologi bus.&lt;/li&gt;
      &lt;li&gt;Penambahan atau pengurangan komputer (mis. saat ada unit rusak/diganti) sangat mudah dilakukan tanpa mengganggu komputer lain.&lt;/li&gt;
      &lt;li&gt;Pelacakan gangguan (troubleshooting) lebih sederhana karena setiap jalur kabel dapat diperiksa satu per satu dari switch pusat.&lt;/li&gt;
      &lt;li&gt;Topologi ini paling umum dan paling sesuai untuk skala satu ruangan/lab dengan jumlah perangkat menengah (± 20 unit).&lt;/li&gt;
    &lt;/ul&gt;

    &lt;h3 class="sub-title"&gt;2. Perangkat Jaringan yang Dibutuhkan&lt;/h3&gt;
    &lt;table class="compare"&gt;
      &lt;tr&gt;&lt;th&gt;Perangkat&lt;/th&gt;&lt;th&gt;Perkiraan Jumlah&lt;/th&gt;&lt;th&gt;Fungsi dalam Skema&lt;/th&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Modem&lt;/td&gt;&lt;td&gt;1 unit&lt;/td&gt;&lt;td&gt;Menghubungkan jaringan sekolah ke jalur internet dari ISP.&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Router (dengan firewall &amp; DHCP)&lt;/td&gt;&lt;td&gt;1 unit&lt;/td&gt;&lt;td&gt;Membagi alamat IP otomatis ke seluruh perangkat dan menjadi lapisan keamanan pertama jaringan.&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Switch 24-port&lt;/td&gt;&lt;td&gt;1 unit&lt;/td&gt;&lt;td&gt;Menghubungkan seluruh 21 komputer (20 siswa + 1 guru) dalam satu jaringan lokal.&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Access Point&lt;/td&gt;&lt;td&gt;1 unit&lt;/td&gt;&lt;td&gt;Menyediakan akses Wi-Fi terbatas untuk perangkat guru/tamu tanpa perlu kabel tambahan.&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Kabel UTP Cat6 + konektor RJ45&lt;/td&gt;&lt;td&gt;± 21 jalur kabel&lt;/td&gt;&lt;td&gt;Media penghubung fisik dari switch ke setiap komputer.&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;UPS (Uninterruptible Power Supply)&lt;/td&gt;&lt;td&gt;1 unit&lt;/td&gt;&lt;td&gt;Menjaga router dan switch tetap menyala saat listrik padam mendadak, mencegah kerusakan perangkat.&lt;/td&gt;&lt;/tr&gt;
    &lt;/table&gt;

    &lt;h3 class="sub-title"&gt;3. Skema Jaringan&lt;/h3&gt;
    &lt;div class="diagram-frame"&gt;
      &lt;svg viewBox="0 0 800 380" xmlns="http://www.w3.org/2000/svg"&gt;
        &lt;text x="400" y="26" text-anchor="middle" fill="#38BDF8" font-family="IBM Plex Mono, monospace" font-size="12" letter-spacing="2"&gt;SKEMA JARINGAN LAN — LABORATORIUM KOMPUTER&lt;/text&gt;

        &lt;!-- internet cloud --&gt;
        &lt;g transform="translate(345,42)"&gt;
          &lt;path d="M28 46 a22 22 0 0 1 0-44 a27 27 0 0 1 52-8 a20 20 0 0 1 2 52 z" fill="none" stroke="#38BDF8" stroke-width="2"/&gt;
          &lt;text x="55" y="27" text-anchor="middle" fill="#38BDF8" font-family="IBM Plex Mono, monospace" font-weight="700" font-size="11"&gt;INTERNET&lt;/text&gt;
        &lt;/g&gt;

        &lt;line class="signal" x1="400" y1="100" x2="400" y2="122" stroke="#38BDF8" stroke-width="2"/&gt;

        &lt;!-- modem --&gt;
        &lt;rect x="335" y="122" width="130" height="34" rx="4" fill="none" stroke="#EAF2FA" stroke-width="1.5"/&gt;
        &lt;text x="400" y="143" text-anchor="middle" fill="#EAF2FA" font-family="IBM Plex Mono, monospace" font-size="11"&gt;MODEM&lt;/text&gt;

        &lt;line class="signal" x1="400" y1="156" x2="400" y2="178" stroke="#38BDF8" stroke-width="2"/&gt;

        &lt;!-- router --&gt;
        &lt;rect x="300" y="178" width="200" height="40" rx="4" fill="none" stroke="#F2B84B" stroke-width="1.5"/&gt;
        &lt;text x="400" y="199" text-anchor="middle" fill="#F2B84B" font-family="IBM Plex Mono, monospace" font-weight="700" font-size="11"&gt;ROUTER&lt;/text&gt;
        &lt;text x="400" y="212" text-anchor="middle" fill="#C3D3E0" font-family="IBM Plex Mono, monospace" font-size="8"&gt;Firewall aktif + DHCP&lt;/text&gt;

        &lt;line class="signal" x1="400" y1="218" x2="400" y2="240" stroke="#22C55E" stroke-width="2"/&gt;

        &lt;!-- switch --&gt;
        &lt;rect x="290" y="240" width="220" height="38" rx="4" fill="none" stroke="#22C55E" stroke-width="1.5"/&gt;
        &lt;text x="400" y="264" text-anchor="middle" fill="#22C55E" font-family="IBM Plex Mono, monospace" font-weight="700" font-size="11"&gt;SWITCH 24-PORT&lt;/text&gt;

        &lt;!-- fan out to PC siswa, PC guru, access point --&gt;
        &lt;line class="signal" x1="320" y1="278" x2="130" y2="330" stroke="#38BDF8" stroke-width="2"/&gt;
        &lt;line class="signal" x1="400" y1="278" x2="400" y2="330" stroke="#38BDF8" stroke-width="2"/&gt;
        &lt;line class="signal" x1="480" y1="278" x2="670" y2="330" stroke="#38BDF8" stroke-width="2"/&gt;

        &lt;rect x="45" y="330" width="170" height="38" rx="4" fill="none" stroke="#EAF2FA" stroke-width="1.5"/&gt;
        &lt;text x="130" y="350" text-anchor="middle" fill="#EAF2FA" font-family="IBM Plex Mono, monospace" font-size="10"&gt;PC SISWA (unit 1–20)&lt;/text&gt;
        &lt;text x="130" y="362" text-anchor="middle" fill="#9FB4C6" font-family="IBM Plex Mono, monospace" font-size="8"&gt;terhubung kabel UTP&lt;/text&gt;

        &lt;rect x="315" y="330" width="170" height="38" rx="4" fill="none" stroke="#EAF2FA" stroke-width="1.5"/&gt;
        &lt;text x="400" y="350" text-anchor="middle" fill="#EAF2FA" font-family="IBM Plex Mono, monospace" font-size="10"&gt;PC GURU&lt;/text&gt;
        &lt;text x="400" y="362" text-anchor="middle" fill="#9FB4C6" font-family="IBM Plex Mono, monospace" font-size="8"&gt;terhubung kabel UTP&lt;/text&gt;

        &lt;rect x="585" y="330" width="170" height="38" rx="4" fill="none" stroke="#EAF2FA" stroke-width="1.5"/&gt;
        &lt;text x="670" y="350" text-anchor="middle" fill="#EAF2FA" font-family="IBM Plex Mono, monospace" font-size="10"&gt;ACCESS POINT&lt;/text&gt;
        &lt;text x="670" y="362" text-anchor="middle" fill="#9FB4C6" font-family="IBM Plex Mono, monospace" font-size="8"&gt;Wi-Fi guru/tamu&lt;/text&gt;
      &lt;/svg&gt;
      &lt;div class="diagram-caption"&gt;Alur: Internet → Modem → Router (firewall &amp; DHCP) → Switch 24-port → seluruh PC siswa, PC guru, dan Access Point (Wi-Fi terbatas).&lt;/div&gt;
    &lt;/div&gt;

    &lt;h3 class="sub-title"&gt;4. Langkah Keamanan Dasar&lt;/h3&gt;
    &lt;div class="callout secure"&gt;
      &lt;div class="lbl"&gt;Kebijakan Keamanan Lab&lt;/div&gt;
      &lt;ul style="margin:0 0 0 1.1em;"&gt;
        &lt;li&gt;&lt;strong&gt;Password Wi-Fi kuat (WPA2/WPA3)&lt;/strong&gt; — kombinasi huruf, angka, dan simbol, diganti secara berkala tiap semester.&lt;/li&gt;
        &lt;li&gt;&lt;strong&gt;Firewall aktif di router&lt;/strong&gt; — memblokir port dan akses masuk yang tidak diperlukan dari luar jaringan sekolah.&lt;/li&gt;
        &lt;li&gt;&lt;strong&gt;Ganti kredensial admin default router/switch&lt;/strong&gt; — username dan password bawaan pabrik wajib diganti agar tidak mudah diretas.&lt;/li&gt;
        &lt;li&gt;&lt;strong&gt;Pembatasan akses pengguna&lt;/strong&gt; — akun/level akses PC guru dipisahkan dari PC siswa; siswa tidak diberi hak admin pada komputer lab.&lt;/li&gt;
        &lt;li&gt;&lt;strong&gt;Web filtering&lt;/strong&gt; — pembatasan akses ke situs yang tidak relevan dengan pembelajaran melalui pengaturan router atau software tambahan.&lt;/li&gt;
        &lt;li&gt;&lt;strong&gt;Update firmware &amp; software berkala&lt;/strong&gt; — router, switch, dan sistem operasi PC lab diperbarui rutin untuk menutup celah keamanan.&lt;/li&gt;
        &lt;li&gt;&lt;strong&gt;Backup data berkala&lt;/strong&gt; — file penting di komputer guru dicadangkan ke penyimpanan terpisah/cloud secara rutin.&lt;/li&gt;
      &lt;/ul&gt;
    &lt;/div&gt;

    &lt;div class="callout"&gt;
      &lt;div class="lbl"&gt;Kesimpulan Tim IT Sekolah&lt;/div&gt;
      &lt;p style="margin:0;"&gt;Dengan topologi star, satu router berfirewall, satu switch 24-port, serta kebijakan password dan pembatasan akses yang jelas, laboratorium komputer sekolah dapat memiliki jaringan LAN yang sederhana untuk dikelola, mudah diperluas di masa depan, dan cukup aman untuk mendukung kegiatan belajar-mengajar sehari-hari.&lt;/p&gt;
    &lt;/div&gt;
  &lt;/section&gt;

&lt;/main&gt;

&lt;footer&gt;
  INFORMATIKA · JARINGAN KOMPUTER, INTERNET &amp; KEAMANAN DIGITAL · FASE E KELAS X SMK
&lt;/footer&gt;

&lt;script&gt;
  // ============================================================
  // KONFIGURASI PENGIRIMAN SKOR KE GOOGLE SHEETS
  // ------------------------------------------------------------
  // Google Sheets TIDAK bisa menerima data langsung dari halaman
  // web biasa. Guru WAJIB membuat Google Apps Script Web App yang
  // terhubung ke spreadsheet, lalu tempel URL Web App tersebut di
  // bawah ini menggantikan teks GANTI_DENGAN_URL_WEB_APP_ANDA.
  // Lihat instruksi lengkap yang diberikan terpisah dari file ini.
  // ============================================================
  const GAS_ENDPOINT = "https://script.google.com/macros/s/AKfycbwKp7DrBTALJMlw8crjK7RgXIO8LVcU4yVEd9WJNs_vgSXkVxfw7fwkGbOT2IBNOjg3uQ/exec";

  const QUESTIONS = [
    { q: "Jaringan komputer secara umum didefinisikan sebagai...",
      opts: ["Sekumpulan program yang berjalan otomatis di komputer",
             "Kumpulan dua atau lebih perangkat yang saling terhubung untuk berbagi data dan sumber daya",
             "Perangkat keras yang menyimpan data secara permanen",
             "Sistem operasi yang mengatur banyak pengguna sekaligus",
             "Aplikasi yang digunakan khusus untuk browsing internet"], correct: 1 },
    { q: "Jaringan yang mencakup area sangat luas seperti antar kota bahkan antar negara disebut...",
      opts: ["LAN", "PAN", "MAN", "WAN", "HAN"], correct: 3 },
    { q: "Jaringan yang biasa digunakan untuk menghubungkan perangkat dalam satu ruangan/gedung seperti lab komputer sekolah disebut...",
      opts: ["LAN", "WAN", "MAN", "Internet", "Cloud Network"], correct: 0 },
    { q: "Topologi jaringan di mana seluruh perangkat terhubung ke satu perangkat pusat (switch) disebut topologi...",
      opts: ["Bus", "Ring", "Star", "Mesh", "Tree"], correct: 2 },
    { q: "Perangkat yang menghubungkan jaringan lokal (LAN) dengan jaringan lain/internet serta menentukan jalur terbaik pengiriman data disebut...",
      opts: ["Switch", "Hub", "Modem", "Router", "Repeater"], correct: 3 },
    { q: "Perangkat atau perangkat lunak yang menyaring dan mengendalikan lalu lintas data masuk/keluar jaringan berdasarkan aturan keamanan disebut...",
      opts: ["Router", "Firewall", "Switch", "Modem", "Access Point"], correct: 1 },
    { q: "Perangkat yang mengubah sinyal digital menjadi sinyal yang dapat dikirim lewat jalur ISP (dan sebaliknya) disebut...",
      opts: ["Switch", "Modem", "Router", "Access Point", "NIC"], correct: 1 },
    { q: "Alamat unik yang digunakan untuk mengidentifikasi setiap perangkat dalam sebuah jaringan disebut...",
      opts: ["URL", "DNS", "IP Address", "MAC Studio", "Domain"], correct: 2 },
    { q: "Sistem yang menerjemahkan nama domain (misalnya www.contoh.com) menjadi alamat IP yang dipahami komputer disebut...",
      opts: ["HTTP", "DNS", "FTP", "ISP", "TCP"], correct: 1 },
    { q: "Perusahaan atau lembaga yang menyediakan layanan akses internet kepada pengguna disebut...",
      opts: ["Web Hosting", "Domain Provider", "ISP (Internet Service Provider)", "Data Center", "Cloud Provider"], correct: 2 },
    { q: "Protokol untuk mengakses halaman web dengan tambahan lapisan enkripsi ditandai dengan awalan...",
      opts: ["FTP", "HTTP", "HTTPS", "SMTP", "POP3"], correct: 2 },
    { q: "Ukuran kapasitas maksimum data yang dapat ditransmisikan dalam jaringan pada waktu tertentu disebut...",
      opts: ["Latency", "Bandwidth", "Ping", "Protokol", "Bit rate error"], correct: 1 },
    { q: "Waktu tunda yang dibutuhkan data untuk berpindah dari satu titik ke titik lain dalam jaringan disebut...",
      opts: ["Bandwidth", "Throughput", "Latency", "Uptime", "Frekuensi"], correct: 2 },
    { q: "Jenis serangan digital yang menipu pengguna agar memberikan data pribadi (seperti password) melalui tautan atau pesan palsu disebut...",
      opts: ["DDoS", "Malware", "Phishing", "Spoofing perangkat keras", "Brute force fisik"], correct: 2 },
    { q: "Proses mengubah data menjadi bentuk yang tidak dapat dibaca oleh pihak yang tidak berwenang, sehingga data tetap aman saat dikirim melalui jaringan, disebut...",
      opts: ["Kompresi", "Enkripsi", "Kalibrasi", "Sinkronisasi", "Virtualisasi"], correct: 1 }
  ];

  const LETTERS = ["A","B","C","D","E"];
  const container = document.getElementById('quizContainer');

  QUESTIONS.forEach((item, qi) =&gt; {
    const card = document.createElement('div');
    card.className = 'q-card';
    const num = document.createElement('div');
    num.className = 'q-num';
    num.textContent = 'SOAL ' + (qi+1) + ' / ' + QUESTIONS.length;
    const text = document.createElement('div');
    text.className = 'q-text';
    text.textContent = (qi+1) + '. ' + item.q;
    const opts = document.createElement('div');
    opts.className = 'options';

    item.opts.forEach((optText, oi) =&gt; {
      const label = document.createElement('label');
      label.className = 'opt';
      const input = document.createElement('input');
      input.type = 'radio';
      input.name = 'q' + qi;
      input.value = oi;
      input.addEventListener('change', () =&gt; {
        opts.querySelectorAll('.opt').forEach(o =&gt; o.classList.remove('selected'));
        label.classList.add('selected');
      });
      const span = document.createElement('span');
      span.textContent = LETTERS[oi] + '. ' + optText;
      label.appendChild(input);
      label.appendChild(span);
      opts.appendChild(label);
    });

    card.appendChild(num);
    card.appendChild(text);
    card.appendChild(opts);
    container.appendChild(card);
  });

  let finalScore = null;

  document.getElementById('btnHitung').addEventListener('click', () =&gt; {
    const noAbsen = document.getElementById('noAbsen').value.trim();
    const nama = document.getElementById('nama').value.trim();
    const kelas = document.getElementById('kelas').value.trim();
    const msg = document.getElementById('quizMsg');

    if (!noAbsen || !nama || !kelas) {
      msg.textContent = 'Lengkapi No. Absen, Nama, dan Kelas terlebih dahulu.';
      return;
    }

    let answered = 0, correct = 0;
    QUESTIONS.forEach((item, qi) =&gt; {
      const picked = document.querySelector('input[name="q' + qi + '"]:checked');
      if (picked) {
        answered++;
        if (parseInt(picked.value) === item.correct) correct++;
      }
    });

    if (answered &lt; QUESTIONS.length) {
      msg.textContent = 'Masih ada ' + (QUESTIONS.length - answered) + ' soal yang belum dijawab.';
      return;
    }

    msg.textContent = '';
    finalScore = Math.round((correct / QUESTIONS.length) * 100);

    document.getElementById('scoreValue').textContent = finalScore;
    document.getElementById('resultDetail').textContent =
      'Jawaban benar: ' + correct + ' dari ' + QUESTIONS.length + ' soal. Skor sedang dikirim ke guru...';
    document.getElementById('resultPanel').style.display = 'block';

    kirimSkor(noAbsen, nama, kelas, finalScore);
  });

  function kirimSkor(noAbsen, nama, kelas, skor) {
    const msg = document.getElementById('quizMsg');
    const btnKirim = document.getElementById('btnKirim');
    const resultDetail = document.getElementById('resultDetail');

    if (GAS_ENDPOINT.indexOf('GANTI_DENGAN_URL_WEB_APP_ANDA') !== -1) {
      msg.textContent = 'Pengiriman belum aktif — guru perlu memasang URL Apps Script terlebih dahulu.';
      btnKirim.style.display = 'inline-block';
      return;
    }

    btnKirim.disabled = true;
    msg.textContent = 'Mengirim skor...';

    fetch(GAS_ENDPOINT, {
      method: 'POST',
      mode: 'no-cors',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({ noAbsen: noAbsen, nama: nama, kelas: kelas, skor: skor })
    }).then(() =&gt; {
      msg.textContent = 'Jawaban terkirim otomatis ke guru.';
      resultDetail.textContent = 'Jawaban benar: ' + Math.round(skor * QUESTIONS.length / 100) + ' dari ' + QUESTIONS.length + ' soal. Skor sudah terkirim ke guru.';
      btnKirim.style.display = 'none';
      btnKirim.disabled = false;
    }).catch(() =&gt; {
      msg.textContent = 'Gagal mengirim otomatis — klik "Kirim Ulang ke Guru", atau foto layar skor ini.';
      btnKirim.style.display = 'inline-block';
      btnKirim.disabled = false;
    });
  }

  document.getElementById('btnKirim').addEventListener('click', () =&gt; {
    const noAbsen = document.getElementById('noAbsen').value.trim();
    const nama = document.getElementById('nama').value.trim();
    const kelas = document.getElementById('kelas').value.trim();
    if (finalScore === null) return;
    kirimSkor(noAbsen, nama, kelas, finalScore);
  });
&lt;/script&gt;

&lt;/body&gt;
&lt;/html&gt;</description><link>http://kitab-investasi.blogspot.com/2026/08/jaringan-komputer-internet-keamanan.html</link><thr:total>0</thr:total><author>nof_rizal07@yahoo.co.id (abang_cool)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-9000860041661554971.post-5361175741707973809</guid><pubDate>Fri, 14 Aug 2026 00:50:06 +0000</pubDate><atom:updated>2026-08-14T10:17:18.742+07:00</atom:updated><title>Pemetaan Profil Growth Mindset Murid</title><description>&lt;!DOCTYPE html&gt;
&lt;html lang="id"&gt;
&lt;head&gt;
&lt;meta charset="UTF-8"&gt;
&lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&gt;
&lt;title&gt;Pemetaan Growth Mindset Murid — SMKN 1 Tuntang&lt;/title&gt;
&lt;style&gt;
  :root{
    --navy:#152238;
    --navy-2:#1F3454;
    --steel:#3D5A80;
    --amber:#E8A33D;
    --amber-dark:#C97F1B;
    --paper:#F5F6F8;
    --card:#FFFFFF;
    --ink:#1B2333;
    --ink-soft:#5A6478;
    --line:#E1E4EA;
    --growth:#2E7D5B;
    --fixed:#B0532B;
    --radius:14px;
  }
  *{box-sizing:border-box;}
  body{
    margin:0;
    font-family:'Segoe UI',-apple-system,BlinkMacSystemFont,'Inter',Arial,sans-serif;
    background:var(--paper);
    color:var(--ink);
  }
  .topbar{
    background:linear-gradient(120deg,var(--navy) 0%,var(--navy-2) 100%);
    color:#fff;
    padding:36px 20px 90px;
    position:relative;
    overflow:hidden;
  }
  .topbar::after{
    content:"";
    position:absolute;
    right:-60px; top:-60px;
    width:220px; height:220px;
    border-radius:50%;
    background:radial-gradient(circle, rgba(232,163,61,0.25) 0%, rgba(232,163,61,0) 70%);
  }
  .topbar-inner{
    max-width:760px;
    margin:0 auto;
    position:relative;
    z-index:1;
  }
  .eyebrow{
    display:inline-block;
    font-size:12.5px;
    letter-spacing:.14em;
    text-transform:uppercase;
    color:var(--amber);
    font-weight:700;
    border:1px solid rgba(232,163,61,0.5);
    padding:5px 12px;
    border-radius:999px;
    margin-bottom:16px;
  }
  h1{
    font-size:clamp(24px,4vw,32px);
    line-height:1.25;
    margin:0 0 10px;
    font-weight:700;
  }
  .lede{
    color:#C9D2E3;
    font-size:15px;
    line-height:1.6;
    max-width:640px;
    margin:0;
  }
  .wrap{
    max-width:760px;
    margin:-56px auto 60px;
    padding:0 20px;
    position:relative;
    z-index:2;
  }
  .card{
    background:var(--card);
    border-radius:var(--radius);
    box-shadow:0 12px 30px rgba(21,34,56,0.10);
    padding:28px;
    margin-bottom:20px;
    border:1px solid var(--line);
  }
  .card h2{
    font-size:17px;
    margin:0 0 4px;
    color:var(--navy);
  }
  .card .sub{
    font-size:13px;
    color:var(--ink-soft);
    margin:0 0 18px;
  }
  label.field{
    display:block;
    font-size:13.5px;
    font-weight:600;
    color:var(--navy);
    margin-bottom:6px;
  }
  .field-wrap{margin-bottom:16px;}
  input[type=text], select{
    width:100%;
    padding:11px 13px;
    border-radius:9px;
    border:1.5px solid var(--line);
    font-size:14.5px;
    font-family:inherit;
    color:var(--ink);
    background:#fcfcfd;
  }
  input[type=text]:focus, select:focus{
    outline:none;
    border-color:var(--steel);
    box-shadow:0 0 0 3px rgba(61,90,128,0.15);
  }
  .progress-shell{
    position:sticky;
    top:0;
    z-index:20;
    background:rgba(245,246,248,0.94);
    backdrop-filter:blur(6px);
    padding:12px 20px;
    border-bottom:1px solid var(--line);
  }
  .progress-inner{
    max-width:760px;
    margin:0 auto;
    display:flex;
    align-items:center;
    gap:12px;
  }
  .progress-track{
    flex:1;
    height:7px;
    border-radius:999px;
    background:#E4E7EE;
    overflow:hidden;
  }
  .progress-fill{
    height:100%;
    width:0%;
    background:linear-gradient(90deg,var(--steel),var(--amber));
    border-radius:999px;
    transition:width .25s ease;
  }
  .progress-label{
    font-size:12.5px;
    font-weight:700;
    color:var(--navy);
    white-space:nowrap;
    min-width:64px;
    text-align:right;
  }
  .section-tag{
    display:inline-flex;
    align-items:center;
    gap:8px;
    font-size:11.5px;
    font-weight:700;
    letter-spacing:.06em;
    text-transform:uppercase;
    color:var(--steel);
    margin-bottom:14px;
  }
  .section-tag .dot{
    width:7px;height:7px;border-radius:50%;
    background:var(--amber);
  }
  .qitem{
    padding:18px 0;
    border-top:1px solid var(--line);
  }
  .qitem:first-of-type{border-top:none; padding-top:4px;}
  .qnum{
    font-size:12px;
    font-weight:700;
    color:#fff;
    background:var(--steel);
    width:22px;height:22px;
    border-radius:6px;
    display:inline-flex;
    align-items:center;
    justify-content:center;
    margin-right:8px;
    flex-shrink:0;
  }
  .qtext{
    font-size:14.5px;
    line-height:1.55;
    color:var(--ink);
    display:flex;
    margin-bottom:12px;
  }
  .qtext span.txt{padding-top:1px;}
  .opts{
    display:grid;
    grid-template-columns:repeat(4,1fr);
    gap:8px;
  }
  @media (max-width:520px){
    .opts{grid-template-columns:repeat(2,1fr);}
  }
  .opt{
    position:relative;
  }
  .opt input{
    position:absolute;
    opacity:0;
    width:100%;height:100%;
    cursor:pointer;
    margin:0;
  }
  .opt .pill{
    display:block;
    text-align:center;
    font-size:12.5px;
    font-weight:600;
    padding:10px 6px;
    border-radius:9px;
    border:1.5px solid var(--line);
    color:var(--ink-soft);
    transition:all .15s ease;
    background:#fcfcfd;
  }
  .opt input:checked + .pill{
    background:var(--navy);
    border-color:var(--navy);
    color:#fff;
  }
  .opt input:focus-visible + .pill{
    box-shadow:0 0 0 3px rgba(61,90,128,0.35);
  }
  .opt .pill:hover{border-color:var(--steel); color:var(--navy);}
  .submit-bar{
    display:flex;
    flex-direction:column;
    gap:12px;
    align-items:center;
    text-align:center;
  }
  button#submitBtn{
    width:100%;
    padding:15px;
    border:none;
    border-radius:11px;
    background:var(--amber-dark);
    color:#fff;
    font-size:15.5px;
    font-weight:700;
    cursor:pointer;
    transition:background .15s ease, transform .1s ease;
  }
  button#submitBtn:hover{background:#B06F16;}
  button#submitBtn:active{transform:scale(0.99);}
  button#submitBtn:disabled{background:#C7CCD6; cursor:not-allowed;}
  .hint{font-size:12.5px; color:var(--ink-soft);}
  .warn{
    font-size:13px;
    color:var(--fixed);
    font-weight:600;
    margin-top:6px;
    display:none;
  }
  .footer-note{
    text-align:center;
    font-size:12px;
    color:var(--ink-soft);
    margin-top:24px;
  }
  #successScreen{
    display:none;
    text-align:center;
    padding:40px 20px 70px;
    max-width:560px;
    margin:0 auto;
  }
  #successScreen .check{
    width:64px;height:64px;
    border-radius:50%;
    background:var(--growth);
    color:#fff;
    display:flex;
    align-items:center;
    justify-content:center;
    margin:0 auto 18px;
    font-size:30px;
  }
  #successScreen h2{color:var(--navy); font-size:22px; margin-bottom:8px;}
  #successScreen p{color:var(--ink-soft); font-size:14.5px; line-height:1.6;}
  #resultBox{
    margin-top:18px;
    background:var(--card);
    border:1px solid var(--line);
    border-radius:var(--radius);
    padding:20px;
    text-align:left;
  }
  #resultBox .scoreRow{display:flex; justify-content:space-between; font-size:14px; padding:6px 0; border-bottom:1px dashed var(--line);}
  #resultBox .scoreRow:last-child{border-bottom:none;}
  .catBadge{
    display:inline-block;
    padding:3px 10px;
    border-radius:999px;
    font-size:12.5px;
    font-weight:700;
    color:#fff;
  }
&lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;

&lt;div class="topbar"&gt;
  &lt;div class="topbar-inner"&gt;
    &lt;span class="eyebrow"&gt;SMKN 1 Tuntang · TJKT · Teknik Otomotif · Tata Busana&lt;/span&gt;
    &lt;h1&gt;Pemetaan Profil Growth Mindset Murid&lt;/h1&gt;
    &lt;p class="lede"&gt;Kuesioner ini diisi oleh Bapak/Ibu guru mata pelajaran untuk memetakan profil pola pikir (growth mindset) murid yang diajar, sebagai bagian dari siklus inkuiri kolaboratif identifikasi masalah pembelajaran di laboratorium/bengkel. Jawaban akan otomatis terkirim dan tersimpan.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="progress-shell" id="progressShell"&gt;
  &lt;div class="progress-inner"&gt;
    &lt;div class="progress-track"&gt;&lt;div class="progress-fill" id="progressFill"&gt;&lt;/div&gt;&lt;/div&gt;
    &lt;div class="progress-label" id="progressLabel"&gt;0 / 25&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="wrap"&gt;

  &lt;form id="mindsetForm"&gt;

    &lt;div class="card" id="metaCard"&gt;
      &lt;h2&gt;Data Guru&lt;/h2&gt;
      &lt;p class="sub"&gt;Isi identitas Bapak/Ibu guru dan kelompok murid yang sedang dinilai.&lt;/p&gt;

      &lt;div class="field-wrap"&gt;
        &lt;label class="field"&gt;Nama Guru&lt;/label&gt;
        &lt;input type="text" id="namaGuru" required placeholder="Contoh: Nofrizal, S.Pd."&gt;
      &lt;/div&gt;

      &lt;div class="field-wrap"&gt;
        &lt;label class="field"&gt;Mata Pelajaran yang Diampu&lt;/label&gt;
        &lt;input type="text" id="mapel" required placeholder="Contoh: Produktif TJKT"&gt;
      &lt;/div&gt;

      &lt;div class="field-wrap" style="margin-bottom:0;"&gt;
        &lt;label class="field"&gt;Jurusan&lt;/label&gt;
        &lt;select id="jurusan" required&gt;
          &lt;option value="" disabled selected&gt;Pilih jurusan&lt;/option&gt;
          &lt;option value="TJKT"&gt;Teknik Jaringan Komputer dan Telekomunikasi (TJKT)&lt;/option&gt;
          &lt;option value="Teknik Otomotif"&gt;Teknik dan Bisnis Sepeda Motor (Teknik Otomotif)&lt;/option&gt;
          &lt;option value="Tata Busana"&gt;Tata Busana&lt;/option&gt;
          &lt;option value="Tata Busana"&gt;Semua Jurusan&lt;/option&gt;
        &lt;/select&gt;
      &lt;/div&gt;

      &lt;div class="field-wrap" style="margin-bottom:0; margin-top:16px;"&gt;
        &lt;label class="field"&gt;Jumlah Murid yang Dinilai (perkiraan, semua rombel di jurusan ini)&lt;/label&gt;
        &lt;input type="text" id="jumlahMurid" placeholder="Contoh: 96 murid"&gt;
      &lt;/div&gt;
    &lt;/div&gt;

    &lt;div id="questionsContainer"&gt;&lt;/div&gt;

    &lt;div class="card"&gt;
      &lt;div class="submit-bar"&gt;
        &lt;button type="submit" id="submitBtn"&gt;Kirim Jawaban&lt;/button&gt;
        &lt;div class="warn" id="warnMsg"&gt;Mohon lengkapi semua data dan jawab seluruh 25 pernyataan sebelum mengirim.&lt;/div&gt;
        &lt;div class="hint"&gt;Jawaban dikirim langsung ke rekap Google Sheet sekolah.&lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;

  &lt;/form&gt;

  &lt;div id="successScreen"&gt;
    &lt;div class="check"&gt;✓&lt;/div&gt;
    &lt;h2&gt;Jawaban Terkirim&lt;/h2&gt;
    &lt;p&gt;Terima kasih, Bapak/Ibu Guru. Pemetaan profil growth mindset murid yang diampu telah tercatat dan akan digunakan dalam siklus inkuiri kolaboratif SMKN 1 Tuntang.&lt;/p&gt;
    &lt;div id="resultBox"&gt;&lt;/div&gt;
  &lt;/div&gt;

  &lt;p class="footer-note"&gt;Presentasi Siklus Inkuiri Kolaboratif — SMKN 1 Tuntang&lt;/p&gt;
&lt;/div&gt;

&lt;script&gt;
/* ======================================================
   KONFIGURASI PENGIRIMAN DATA
   Ganti WEB_APP_URL dengan URL Web App Google Apps Script
   yang sudah di-deploy dan terhubung ke Google Sheet tujuan.
   Lihat panduan "Apps Script" yang disertakan terpisah.
====================================================== */
const WEB_APP_URL = "https://script.google.com/macros/s/AKfycbwntViLE98jkmp-xGIHAK8u13gdKyR4DY8dGMVfz77m9pqBHra7cc8bCOqlsmX3MtQadg/exec";

// type: "growth" -&gt; setuju mencerminkan growth mindset (skor SS=3..STS=0)
// type: "fixed"  -&gt; setuju mencerminkan fixed mindset (skor SS=0..STS=3)
const QUESTIONS = [
  { section:"Keyakinan tentang Kemampuan", items:[
    {t:"Murid yang saya ajar meyakini bahwa kemampuan mereka di mata pelajaran/praktik ini bisa terus berkembang melalui latihan.", type:"growth"},
    {t:"Murid yang saya ajar menganggap kemampuan praktiknya sudah menetap dan sulit untuk diubah.", type:"fixed"},
    {t:"Murid saya percaya bahwa kerja keras lebih menentukan keberhasilan dibanding bakat bawaan.", type:"growth"},
    {t:"Murid saya percaya hanya murid yang berbakat saja yang bisa unggul dalam praktik di jurusan ini.", type:"fixed"},
    {t:"Murid saya cepat puas dengan kemampuan yang sudah dimiliki dan enggan mempelajari hal baru.", type:"fixed"},
  ]},
  { section:"Sikap terhadap Tantangan &amp; Kegigihan", items:[
    {t:"Ketika menghadapi materi atau praktik yang sulit, murid saya cenderung terus mencoba hingga berhasil.", type:"growth"},
    {t:"Murid saya mudah menyerah ketika mengerjakan tugas praktik yang menantang.", type:"fixed"},
    {t:"Murid saya menganggap tantangan dalam tugas praktik sebagai kesempatan untuk berkembang.", type:"growth"},
    {t:"Murid saya menghindari tugas atau proyek praktik yang dirasa terlalu menantang.", type:"fixed"},
    {t:"Murid saya tetap berusaha semaksimal mungkin meski keterbatasan alat/bahan praktik di laboratorium atau bengkel.", type:"growth"},
    {t:"Murid saya mudah frustrasi dan berhenti berusaha ketika alat atau bahan praktik terbatas.", type:"fixed"},
  ]},
  { section:"Respon terhadap Kegagalan &amp; Kritik", items:[
    {t:"Murid saya menganggap kesalahan dalam praktik sebagai bagian wajar dari proses belajar.", type:"growth"},
    {t:"Murid saya merasa malu dan menghindar setelah melakukan kesalahan di depan teman-temannya.", type:"fixed"},
    {t:"Murid saya menunjukkan semangat yang lebih tinggi setelah mendapat kritik atau masukan dari saya.", type:"growth"},
    {t:"Murid saya bersikap defensif atau tidak senang saat menerima kritik terhadap hasil kerjanya.", type:"fixed"},
    {t:"Murid saya mau mencoba metode atau pendekatan baru saat cara sebelumnya gagal.", type:"growth"},
    {t:"Murid saya enggan mencoba cara baru karena takut gagal lagi.", type:"fixed"},
  ]},
  { section:"Rasa Ingin Tahu &amp; Motivasi Belajar", items:[
    {t:"Murid saya aktif bertanya ketika belum memahami suatu topik atau teknik praktik.", type:"growth"},
    {t:"Murid saya cenderung diam meski belum paham, karena takut dianggap tidak mampu.", type:"fixed"},
    {t:"Murid saya menunjukkan rasa ingin tahu terhadap teknik, alat, atau tren baru di bidang jurusannya.", type:"growth"},
    {t:"Secara umum, murid yang saya ajar memiliki motivasi belajar yang tinggi untuk berkembang di bidang keahliannya.", type:"growth"},
  ]},
  { section:"Kolaborasi &amp; Perkembangan Keterampilan", items:[
    {t:"Murid saya saling membantu dan berdiskusi dengan teman saat menghadapi kesulitan praktik.", type:"growth"},
    {t:"Murid saya lebih memilih bekerja sendiri dan enggan berkolaborasi saat praktik atau proyek kelompok.", type:"fixed"},
    {t:"Murid saya menunjukkan peningkatan keterampilan praktik dari waktu ke waktu selama saya ajar.", type:"growth"},
    {t:"Murid saya menunjukkan keterampilan praktik yang stagnan meski sudah diberi banyak latihan dan bimbingan.", type:"fixed"},
  ]},
];

const OPTIONS = [
  {label:"Sangat Setuju", key:"SS"},
  {label:"Setuju", key:"S"},
  {label:"Tidak Setuju", key:"TS"},
  {label:"Sangat Tidak Setuju", key:"STS"},
];

function scoreFor(type, key){
  const growthScale = {SS:3,S:2,TS:1,STS:0};
  const fixedScale  = {SS:0,S:1,TS:2,STS:3};
  return type === "growth" ? growthScale[key] : fixedScale[key];
}

const container = document.getElementById("questionsContainer");
let qCounter = 0;
let totalQuestions = 0;
QUESTIONS.forEach(sec =&gt; totalQuestions += sec.items.length);

QUESTIONS.forEach((sec) =&gt; {
  const card = document.createElement("div");
  card.className = "card";
  const tag = document.createElement("div");
  tag.className = "section-tag";
  tag.innerHTML = '&lt;span class="dot"&gt;&lt;/span&gt;' + sec.section;
  card.appendChild(tag);

  sec.items.forEach((item) =&gt; {
    qCounter++;
    const qid = "q" + qCounter;
    const qDiv = document.createElement("div");
    qDiv.className = "qitem";

    const qText = document.createElement("div");
    qText.className = "qtext";
    qText.innerHTML = '&lt;span class="qnum"&gt;' + qCounter + '&lt;/span&gt;&lt;span class="txt"&gt;' + item.t + '&lt;/span&gt;';
    qDiv.appendChild(qText);

    const opts = document.createElement("div");
    opts.className = "opts";
    OPTIONS.forEach((o) =&gt; {
      const optDiv = document.createElement("label");
      optDiv.className = "opt";
      optDiv.innerHTML =
        '&lt;input type="radio" name="' + qid + '" value="' + o.key + '" data-type="' + item.type + '" data-text="' + item.t.replace(/"/g,'&amp;quot;') + '" required&gt;' +
        '&lt;span class="pill"&gt;' + o.label + '&lt;/span&gt;';
      opts.appendChild(optDiv);
    });
    qDiv.appendChild(opts);
    card.appendChild(qDiv);
  });

  container.appendChild(card);
});

document.getElementById("progressLabel").textContent = "0 / " + totalQuestions;

function updateProgress(){
  const answered = new Set();
  document.querySelectorAll('#questionsContainer input[type=radio]:checked').forEach(r =&gt; answered.add(r.name));
  const n = answered.size;
  document.getElementById("progressLabel").textContent = n + " / " + totalQuestions;
  document.getElementById("progressFill").style.width = (n / totalQuestions * 100) + "%";
}
container.addEventListener("change", updateProgress);

function categorize(total, maxScore){
  const f1 = Math.round(maxScore * (20/60));
  const f2 = Math.round(maxScore * (33/60));
  const f3 = Math.round(maxScore * (44/60));
  if(total &lt;= f1) return {label:"Fixed Mindset (F)", color:"#B0532B"};
  if(total &lt;= f2) return {label:"Fixed-Growth (FG)", color:"#C97F1B"};
  if(total &lt;= f3) return {label:"Growth-Fixed (GF)", color:"#3D5A80"};
  return {label:"Growth Mindset (G)", color:"#2E7D5B"};
}

document.getElementById("mindsetForm").addEventListener("submit", function(e){
  e.preventDefault();

  const namaGuru = document.getElementById("namaGuru").value.trim();
  const mapel = document.getElementById("mapel").value.trim();
  const jurusan = document.getElementById("jurusan").value;
  const jumlahMurid = document.getElementById("jumlahMurid").value.trim();

  const checked = document.querySelectorAll('#questionsContainer input[type=radio]:checked');
  const warnMsg = document.getElementById("warnMsg");

  if(!namaGuru || !mapel || !jurusan || checked.length &lt; totalQuestions){
    warnMsg.style.display = "block";
    window.scrollTo({top:0, behavior:"smooth"});
    return;
  }
  warnMsg.style.display = "none";

  let total = 0;
  const answers = {};
  checked.forEach((r) =&gt; {
    const s = scoreFor(r.dataset.type, r.value);
    total += s;
    answers[r.name + "_jawaban"] = r.value;
    answers[r.name + "_skor"] = s;
  });
  const maxScore = totalQuestions * 3;
  const cat = categorize(total, maxScore);

  const payload = Object.assign({
    timestamp: new Date().toISOString(),
    namaGuru: namaGuru,
    mapel: mapel,
    jurusan: jurusan,
    jumlahMurid: jumlahMurid,
    totalSkor: total,
    skorMaksimal: maxScore,
    kategori: cat.label,
  }, answers);

  const submitBtn = document.getElementById("submitBtn");
  submitBtn.disabled = true;
  submitBtn.textContent = "Mengirim...";

  const formData = new URLSearchParams();
  Object.keys(payload).forEach(k =&gt; formData.append(k, payload[k]));

  fetch(WEB_APP_URL, {
    method: "POST",
    mode: "no-cors",
    body: formData
  }).catch(function(err){
    console.warn("Pengiriman ke Google Sheet gagal atau tidak dapat dikonfirmasi (mode no-cors):", err);
  }).finally(function(){
    document.getElementById("mindsetForm").style.display = "none";
    document.getElementById("progressShell").style.display = "none";
    const successScreen = document.getElementById("successScreen");
    successScreen.style.display = "block";
    document.getElementById("resultBox").innerHTML =
      '&lt;div class="scoreRow"&gt;&lt;span&gt;Guru&lt;/span&gt;&lt;b&gt;' + namaGuru + '&lt;/b&gt;&lt;/div&gt;' +
      '&lt;div class="scoreRow"&gt;&lt;span&gt;Jurusan&lt;/span&gt;&lt;b&gt;' + jurusan + '&lt;/b&gt;&lt;/div&gt;' +
      '&lt;div class="scoreRow"&gt;&lt;span&gt;Total Skor&lt;/span&gt;&lt;b&gt;' + total + ' / ' + maxScore + '&lt;/b&gt;&lt;/div&gt;' +
      '&lt;div class="scoreRow"&gt;&lt;span&gt;Kategori Mindset&lt;/span&gt;&lt;span class="catBadge" style="background:' + cat.color + '"&gt;' + cat.label + '&lt;/span&gt;&lt;/div&gt;';
    window.scrollTo({top:0, behavior:"smooth"});
  });
});
&lt;/script&gt;

&lt;/body&gt;
&lt;/html&gt;</description><link>http://kitab-investasi.blogspot.com/2026/08/pemetaan-growth-mindset-murid-smkn-1.html</link><thr:total>0</thr:total><author>nof_rizal07@yahoo.co.id (abang_cool)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-9000860041661554971.post-575736118791912939</guid><pubDate>Wed, 12 Aug 2026 02:46:19 +0000</pubDate><atom:updated>2026-08-12T10:09:55.509+07:00</atom:updated><title>Sistem Operasi, Manajemen File, Kaidah Keba&amp;asaan Teks Prosedur (Bagian 2) &amp; Menyusun Teks Prosedur&amp; Penyimpanan Cloud</title><description>&lt;style&gt;
@import url('https://fonts.googleapis.com/css2?family=Oswald:wght@400;500;600;700&amp;family=Source+Sans+3:wght@400;500;600;700&amp;family=IBM+Plex+Mono:wght@400;500;600&amp;display=swap');
.epb{
  --blueprint:#0F2A3D;
  --blueprint-deep:#0A1E2C;
  --panel:#4A2E12;
  --paper:#F3F0E6;
  --ink:#132029;
  --amber:#F5A623;
  --amber-deep:#C97F12;
  --mint:#6EC6CA;
  --line:rgba(234,242,245,0.16);
  --off-white:#EAF2F5;
  --muted:#9FB4C2;
}
.epb *{box-sizing:border-box;}
.epb{scroll-behavior:smooth; background:#0A1F2E;}
.epb{
  margin:0;
  position:relative;
  overflow:hidden;
  background:var(--blueprint);
  color:var(--off-white);
  font-family:'Source Sans 3',sans-serif;
  line-height:1.65;
  background-image:
    linear-gradient(var(--line) 1px, transparent 1px),
    linear-gradient(90deg, var(--line) 1px, transparent 1px);
  background-size: 34px 34px;
}
.epb h1, .epb h2, .epb h3, .epb h4{font-family:'Oswald',sans-serif; text-transform:uppercase; letter-spacing:0.02em; margin:0 0 0.5em;}
.epb .mono{font-family:'IBM Plex Mono',monospace;}
.epb a{color:var(--amber);}
.epb .crop{position:absolute; width:22px; height:22px; z-index:5; opacity:.55; pointer-events:none;}
.epb .crop::before, .epb .crop::after{content:"";position:absolute;background:var(--mint);}
.epb .crop::before{width:100%;height:1px;top:50%;left:0;}
.epb .crop::after{width:1px;height:100%;left:50%;top:0;}
.epb .crop.tl{top:14px;left:14px;}
.epb .crop.tr{top:14px;right:14px;}
.epb .crop.bl{bottom:14px;left:14px;}
.epb .crop.br{bottom:14px;right:14px;}
.epb header.cover{
  position:relative;
  padding:40px 24px 36px;
  border-bottom:1px solid var(--line);
  overflow:hidden;
}
.epb .doc-code{font-family:'IBM Plex Mono',monospace; color:var(--amber); letter-spacing:0.15em; font-size:0.78rem; text-transform:uppercase; margin-bottom:18px; display:flex; gap:10px; align-items:center;}
.epb .doc-code::before{content:"◆"; color:var(--amber);}
.epb .cover h1{font-size:clamp(1.6rem,7vw,2.5rem); color:var(--off-white); max-width:16ch; line-height:1.05;}
.epb .cover .subtitle{color:var(--muted); font-size:1.05rem; max-width:60ch; margin-top:14px;}
.epb .meta-strip{
  margin-top:38px; display:grid; grid-template-columns:repeat(auto-fit,minmax(150px,1fr));
  border-top:1px dashed var(--line); border-bottom:1px dashed var(--line);
}
.epb .meta-strip div{padding:14px 16px; border-right:1px dashed var(--line);}
.epb .meta-strip div:last-child{border-right:none;}
.epb .meta-strip .k{font-family:'IBM Plex Mono',monospace; font-size:0.68rem; color:var(--amber); text-transform:uppercase; letter-spacing:0.1em;}
.epb .meta-strip .v{font-size:0.98rem; color:var(--off-white); margin-top:4px; font-weight:600;}
.epb .stamp{
  position:absolute; top:40px; right:20px; width:104px; height:104px;
  border:2.5px solid var(--amber); border-radius:50%;
  display:flex; align-items:center; justify-content:center;
  transform:rotate(-11deg);
  color:var(--amber); font-family:'IBM Plex Mono',monospace;
  text-align:center; font-size:0.62rem; letter-spacing:0.08em; text-transform:uppercase;
  opacity:0.9;
}
.epb .stamp .ring{position:absolute; inset:8px; border:1px dashed var(--amber); border-radius:50%;}
.epb .stamp b{display:block; font-family:'Oswald',sans-serif; font-size:1.05rem; letter-spacing:0.06em; margin-top:4px;}

@media (max-width:760px){.epb .stamp{display:none;}
.epb }


.epb main{max-width:920px; margin:0 auto; padding:0 20px 60px;}
.epb .section{padding-top:64px;}
.epb .eyebrow{font-family:'IBM Plex Mono',monospace; color:var(--amber); font-size:0.78rem; letter-spacing:0.14em; text-transform:uppercase; margin-bottom:10px; display:flex; align-items:center; gap:10px;}
.epb .eyebrow::after{content:""; flex:1; height:1px; background:var(--line);}
.epb h2.section-title{font-size:1.7rem; color:var(--off-white);}
.epb p{color:#DDE7EC;}
.epb .lead{color:var(--muted); font-size:1.02rem; max-width:72ch;}
.epb .panel{
  background:var(--panel); border:1px solid var(--line); border-radius:2px;
  padding:26px 28px; margin:22px 0;
}
.epb .panel.tp{border-left:4px solid var(--mint);}
.epb .panel.warn{border-left:4px solid var(--amber);}
.epb .tp-box{display:grid; gap:14px; margin-top:18px;}
.epb .tp-item{display:flex; gap:14px; align-items:flex-start;}
.epb .tp-item .idx{font-family:'IBM Plex Mono',monospace; color:var(--amber); font-weight:600; min-width:34px;}
.epb .flow{display:grid; grid-template-columns:repeat(auto-fit,minmax(220px,1fr)); gap:14px; margin-top:20px;}
.epb .flow .step{background:var(--blueprint-deep); border:1px solid var(--line); padding:18px; position:relative;}
.epb .flow .step .tag{font-family:'IBM Plex Mono',monospace; color:var(--amber); font-size:0.7rem; letter-spacing:0.1em; text-transform:uppercase;}
.epb .flow .step h4{font-size:1rem; margin-top:8px; color:var(--off-white);}
.epb .flow .step .time{position:absolute; top:16px; right:16px; font-family:'IBM Plex Mono',monospace; font-size:0.7rem; color:var(--amber);}
.epb .grid-3{display:grid; grid-template-columns:repeat(auto-fit,minmax(200px,1fr)); gap:14px; margin-top:16px;}
.epb .card{background:var(--blueprint-deep); border:1px solid var(--line); padding:18px;}
.epb .card h4{color:var(--amber); font-size:0.95rem;}
.epb .criteria{display:grid; gap:16px; margin-top:20px;}
.epb .crit{
  background:var(--blueprint-deep); border:1px solid var(--line);
  display:grid; grid-template-columns:64px 1fr; gap:0;
}
.epb .crit .num{
  background:var(--amber); color:var(--blueprint-deep); font-family:'IBM Plex Mono',monospace;
  font-weight:700; display:flex; align-items:center; justify-content:center; font-size:1.05rem;
}
.epb .crit .body{padding:18px 20px;}
.epb .crit h4{color:var(--off-white); font-size:1.02rem; margin-bottom:6px;}
.epb .crit .q{margin-top:10px; padding-top:10px; border-top:1px dashed var(--line); font-family:'IBM Plex Mono',monospace; font-size:0.86rem; color:var(--amber);}
.epb .timeline{margin-top:24px; position:relative; padding-left:34px;}
.epb .timeline::before{content:""; position:absolute; left:11px; top:6px; bottom:6px; width:2px; background:var(--line);}
.epb .tl-item{position:relative; padding-bottom:26px;}
.epb .tl-item:last-child{padding-bottom:0;}
.epb .tl-item::before{content:""; position:absolute; left:-34px; top:2px; width:22px; height:22px; border-radius:50%; background:var(--blueprint); border:2px solid var(--amber);}
.epb .tl-item h4{color:var(--off-white); font-size:1rem; margin-bottom:4px;}
.epb .doc-sample{
  background:var(--paper); color:var(--ink); border-radius:2px; padding:0; margin-top:22px;
  box-shadow:0 20px 45px rgba(0,0,0,0.35);
}
.epb .doc-sample .doc-head{background:var(--ink); color:var(--paper); padding:12px 22px; font-family:'IBM Plex Mono',monospace; font-size:0.75rem; letter-spacing:0.1em; text-transform:uppercase; display:flex; justify-content:space-between;}
.epb .doc-sample .doc-body{padding:26px 28px 30px;}
.epb .doc-sample h3{font-family:'Oswald',sans-serif; color:var(--ink); font-size:1.25rem; text-transform:none; letter-spacing:0;}
.epb .doc-sample ol{padding-left:22px;}
.epb .doc-sample li{margin-bottom:9px;}
.epb .flag{
  display:inline-block; font-family:'IBM Plex Mono',monospace; font-size:0.7rem; font-weight:600;
  background:#D94E2A; color:#fff; padding:1px 7px; border-radius:2px; margin-left:6px; vertical-align:middle;
}
.epb .doc-sample .note-margin{margin-top:6px; font-family:'IBM Plex Mono',monospace; font-size:0.78rem; color:#8A3A1F; padding-left:8px; border-left:2px solid #D94E2A;}
.epb .legend{display:flex; flex-wrap:wrap; gap:10px 20px; margin-top:16px;}
.epb .legend span{font-family:'IBM Plex Mono',monospace; font-size:0.78rem; color:var(--muted); display:flex; align-items:center; gap:8px;}
.epb .legend .dot{width:10px; height:10px; border-radius:50%; display:inline-block;}
.epb table{width:100%; border-collapse:collapse; margin-top:18px; font-size:0.94rem;}
.epb th, .epb td{border:1px solid var(--line); padding:10px 12px; text-align:left; vertical-align:top;}
.epb th{background:var(--blueprint-deep); font-family:'IBM Plex Mono',monospace; font-size:0.75rem; text-transform:uppercase; letter-spacing:0.06em; color:var(--amber);}
.epb .summary-box{
  border:1px solid var(--amber); background:linear-gradient(180deg, rgba(245,166,35,0.08), transparent);
  padding:24px 26px; margin-top:24px;
}
.epb .summary-box ul{margin:10px 0 0; padding-left:20px;}
.epb .summary-box li{margin-bottom:8px;}
.epb .task-header{
  background:var(--amber); color:var(--blueprint-deep); padding:22px 26px; margin-top:20px;
  display:flex; justify-content:space-between; align-items:center; flex-wrap:wrap; gap:10px;
}
.epb .task-header h2{color:var(--blueprint-deep); font-size:1.4rem; margin:0;}
.epb .task-header .badge{font-family:'IBM Plex Mono',monospace; font-size:0.8rem; background:var(--blueprint-deep); color:var(--amber); padding:6px 12px; border-radius:2px;}
.epb .steps-num{counter-reset:step; margin-top:18px; list-style:none; padding:0;}
.epb .steps-num li{counter-increment:step; position:relative; padding-left:44px; margin-bottom:16px;}
.epb .steps-num li::before{content:counter(step,decimal-leading-zero); position:absolute; left:0; top:0; font-family:'IBM Plex Mono',monospace; color:var(--amber); font-weight:600; font-size:0.95rem; border:1px solid var(--amber); width:30px; height:26px; display:flex; align-items:center; justify-content:center;}
.epb .rubric-scale{display:grid; grid-template-columns:repeat(4,1fr); gap:10px; margin-top:16px;}
.epb .rubric-scale div{background:var(--blueprint-deep); border:1px solid var(--line); padding:12px; text-align:center;}
.epb .rubric-scale .n{font-family:'IBM Plex Mono',monospace; color:var(--amber); font-size:1.3rem; font-weight:700;}
.epb .rubric-scale .l{font-size:0.78rem; color:var(--muted); text-transform:uppercase; letter-spacing:0.05em;}
.epb .notebook{
  background:repeating-linear-gradient(var(--paper), var(--paper) 33px, #D8D3C2 34px);
  color:var(--ink); border-radius:2px; padding:28px 30px; margin-top:20px; position:relative;
  box-shadow:0 20px 45px rgba(0,0,0,0.35);
}
.epb .notebook::before{content:""; position:absolute; left:46px; top:0; bottom:0; width:1.5px; background:#C0453A; opacity:0.5;}
.epb .notebook .content{padding-left:24px;}
.epb .notebook h3{color:var(--ink); font-family:'Oswald',sans-serif; letter-spacing:0.02em; margin-bottom:10px;}
.epb .notebook ul{padding-left:20px;}
.epb footer{border-top:1px solid var(--line); padding:24px 20px 40px; color:var(--muted); font-size:0.86rem;}
.epb footer .doc-code{margin-bottom:10px;}
.epb .divider-dash{border:none; border-top:1px dashed var(--line); margin:44px 0 0;}
.epb::selection{background:var(--amber); color:var(--blueprint-deep);}

&lt;/style&gt;
&lt;div class="epb"&gt;
&lt;div class="crop tl"&gt;&lt;/div&gt;&lt;div class="crop tr"&gt;&lt;/div&gt;&lt;div class="crop bl"&gt;&lt;/div&gt;&lt;div class="crop br"&gt;&lt;/div&gt;

&lt;header class="cover"&gt;
  &lt;div class="stamp"&gt;&lt;div class="ring"&gt;&lt;/div&gt;&lt;span&gt;Modul Ajar&lt;b&gt;Terverifikasi&lt;/b&gt;Fase F&lt;/span&gt;&lt;/div&gt;
  &lt;div class="doc-code"&gt;DOK/B.INDO/XI/PROSEDUR-KAIDAH-2 — 3 JP · 1 Pertemuan&lt;/div&gt;
  &lt;h1&gt;Kaidah Kebahasaan Teks Prosedur (Bagian 2) &amp;amp; Menyusun Teks Prosedur&lt;/h1&gt;
  &lt;p class="subtitle"&gt;Materi Bahasa Indonesia Kelas XI SMK/MAK — melatih murid menganalisis kalimat perintah, kata teknis, dan penanda wacana, serta menyusun teks prosedur secara logis dan sistematis.&lt;/p&gt;

  &lt;div class="meta-strip"&gt;
    &lt;div&gt;&lt;div class="k"&gt;Mata Pelajaran&lt;/div&gt;&lt;div class="v"&gt;Bahasa Indonesia&lt;/div&gt;&lt;/div&gt;
    &lt;div&gt;&lt;div class="k"&gt;Jenjang&lt;/div&gt;&lt;div class="v"&gt;SMK/MAK — Kelas XI&lt;/div&gt;&lt;/div&gt;
    &lt;div&gt;&lt;div class="k"&gt;Elemen&lt;/div&gt;&lt;div class="v"&gt;Membaca, Memirsa &amp;amp; Menulis&lt;/div&gt;&lt;/div&gt;
    &lt;div&gt;&lt;div class="k"&gt;Alokasi Waktu&lt;/div&gt;&lt;div class="v"&gt;3 JP (3 × 45 menit)&lt;/div&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/header&gt;

&lt;main&gt;

  &lt;!-- ============ TUJUAN PEMBELAJARAN ============ --&gt;
  &lt;section class="section" id="tujuan"&gt;
    &lt;div class="eyebrow"&gt;01 — Identitas Pembelajaran&lt;/div&gt;
    &lt;h2 class="section-title"&gt;Capaian &amp;amp; Tujuan Pembelajaran&lt;/h2&gt;

    &lt;div class="panel tp"&gt;
      &lt;div class="eyebrow" style="margin-bottom:6px;"&gt;Capaian Pembelajaran (Elemen Membaca–Memirsa &amp;amp; Menulis)&lt;/div&gt;
      &lt;p&gt;Murid mampu menganalisis kaidah kebahasaan pada berbagai jenis teks, termasuk teks prosedur, serta menulis teks prosedur secara logis dan sistematis dengan memperhatikan struktur dan kaidah kebahasaan yang tepat.&lt;/p&gt;
    &lt;/div&gt;

    &lt;div class="panel"&gt;
      &lt;div class="eyebrow" style="margin-bottom:6px;"&gt;Tujuan Pembelajaran&lt;/div&gt;
      &lt;p style="font-size:1.05rem; color:var(--off-white); font-weight:600;"&gt;Murid mampu menganalisis penggunaan kalimat perintah, kata teknis, dan penanda wacana, serta menyusun teks prosedur secara logis dan sistematis.&lt;/p&gt;

      &lt;div class="tp-box"&gt;
        &lt;div class="tp-item"&gt;&lt;span class="idx mono"&gt;TP.1&lt;/span&gt;&lt;p&gt;Murid dapat menganalisis variasi bentuk dan fungsi kalimat perintah dalam teks prosedur.&lt;/p&gt;&lt;/div&gt;
        &lt;div class="tp-item"&gt;&lt;span class="idx mono"&gt;TP.2&lt;/span&gt;&lt;p&gt;Murid dapat mengidentifikasi kata teknis dalam teks prosedur beserta fungsinya.&lt;/p&gt;&lt;/div&gt;
        &lt;div class="tp-item"&gt;&lt;span class="idx mono"&gt;TP.3&lt;/span&gt;&lt;p&gt;Murid dapat mengidentifikasi penanda wacana dan menjelaskan fungsinya dalam menjaga keterpaduan teks.&lt;/p&gt;&lt;/div&gt;
        &lt;div class="tp-item"&gt;&lt;span class="idx mono"&gt;TP.4&lt;/span&gt;&lt;p&gt;Murid dapat menyusun teks prosedur baru secara logis dan sistematis dengan menerapkan ketiga kaidah kebahasaan tersebut.&lt;/p&gt;&lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class="eyebrow" style="margin-top:26px; margin-bottom:6px;"&gt;8 Profil Lulusan yang Dikembangkan&lt;/div&gt;
    &lt;div class="grid-3"&gt;
      &lt;div class="card"&gt;&lt;h4&gt;Penalaran Kritis&lt;/h4&gt;&lt;p style="font-size:0.9rem;"&gt;Menganalisis fungsi kalimat perintah, kata teknis, dan penanda wacana dalam teks.&lt;/p&gt;&lt;/div&gt;
      &lt;div class="card"&gt;&lt;h4&gt;Kreativitas&lt;/h4&gt;&lt;p style="font-size:0.9rem;"&gt;Menyusun teks prosedur baru secara orisinal dan sistematis.&lt;/p&gt;&lt;/div&gt;
      &lt;div class="card"&gt;&lt;h4&gt;Kolaborasi&lt;/h4&gt;&lt;p style="font-size:0.9rem;"&gt;Bekerja sama dalam kelompok saat menyusun teks prosedur.&lt;/p&gt;&lt;/div&gt;
      &lt;div class="card"&gt;&lt;h4&gt;Komunikasi&lt;/h4&gt;&lt;p style="font-size:0.9rem;"&gt;Menyampaikan hasil analisis dan teks prosedur yang disusun secara jelas.&lt;/p&gt;&lt;/div&gt;
    &lt;/div&gt;
  &lt;/section&gt;

  &lt;hr class="divider-dash"&gt;

  &lt;!-- ============ MATERI A: RECAP BAGIAN 1 ============ --&gt;
  &lt;section class="section" id="materi-a"&gt;
    &lt;div class="eyebrow"&gt;02 — Materi Inti A&lt;/div&gt;
    &lt;h2 class="section-title"&gt;Mengingat Kembali Kaidah Kebahasaan Teks Prosedur (Bagian 1)&lt;/h2&gt;
    &lt;p class="lead"&gt;Pada pertemuan sebelumnya, murid telah mempelajari empat ciri kebahasaan teks prosedur. Materi hari ini melanjutkan dengan tiga ciri kebahasaan tambahan, sekaligus mempelajari cara menyusun teks prosedur.&lt;/p&gt;

    &lt;div class="grid-3"&gt;
      &lt;div class="card"&gt;&lt;h4&gt;Kalimat Imperatif&lt;/h4&gt;&lt;p style="font-size:0.9rem;"&gt;Mengarahkan pembaca melakukan tindakan.&lt;/p&gt;&lt;/div&gt;
      &lt;div class="card"&gt;&lt;h4&gt;Kalimat Deklaratif&lt;/h4&gt;&lt;p style="font-size:0.9rem;"&gt;Menyampaikan fakta atau informasi pendukung.&lt;/p&gt;&lt;/div&gt;
      &lt;div class="card"&gt;&lt;h4&gt;Kalimat Persuasif&lt;/h4&gt;&lt;p style="font-size:0.9rem;"&gt;Membujuk pembaca mengikuti langkah dengan sungguh-sungguh.&lt;/p&gt;&lt;/div&gt;
      &lt;div class="card"&gt;&lt;h4&gt;Konjungsi Temporal&lt;/h4&gt;&lt;p style="font-size:0.9rem;"&gt;Menandai urutan waktu antarlangkah.&lt;/p&gt;&lt;/div&gt;
    &lt;/div&gt;
  &lt;/section&gt;

  &lt;hr class="divider-dash"&gt;

  &lt;!-- ============ MATERI B: KALIMAT PERINTAH ============ --&gt;
  &lt;section class="section" id="materi-b"&gt;
    &lt;div class="eyebrow"&gt;03 — Materi Inti B&lt;/div&gt;
    &lt;h2 class="section-title"&gt;Kalimat Perintah dalam Teks Prosedur&lt;/h2&gt;
    &lt;p class="lead"&gt;Kalimat perintah merupakan bentuk khusus kalimat imperatif yang memiliki beberapa variasi sesuai maksud penyampaiannya.&lt;/p&gt;

    &lt;div class="criteria"&gt;
      &lt;div class="crit"&gt;
        &lt;div class="num mono"&gt;1&lt;/div&gt;
        &lt;div class="body"&gt;
          &lt;h4&gt;Perintah Biasa&lt;/h4&gt;
          &lt;p style="margin:0;"&gt;Mengarahkan pembaca melakukan tindakan secara langsung.&lt;/p&gt;
          &lt;div class="q"&gt;Contoh: "Sambungkan kabel ke sumber listrik."&lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;
      &lt;div class="crit"&gt;
        &lt;div class="num mono"&gt;2&lt;/div&gt;
        &lt;div class="body"&gt;
          &lt;h4&gt;Perintah Larangan&lt;/h4&gt;
          &lt;p style="margin:0;"&gt;Melarang pembaca melakukan suatu tindakan tertentu.&lt;/p&gt;
          &lt;div class="q"&gt;Contoh: "Jangan sentuh permukaan yang masih panas."&lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;
      &lt;div class="crit"&gt;
        &lt;div class="num mono"&gt;3&lt;/div&gt;
        &lt;div class="body"&gt;
          &lt;h4&gt;Perintah Ajakan&lt;/h4&gt;
          &lt;p style="margin:0;"&gt;Mengajak pembaca melakukan tindakan dengan nada lebih halus.&lt;/p&gt;
          &lt;div class="q"&gt;Contoh: "Mari kita mulai dengan menyiapkan alat terlebih dahulu."&lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;
      &lt;div class="crit"&gt;
        &lt;div class="num mono"&gt;4&lt;/div&gt;
        &lt;div class="body"&gt;
          &lt;h4&gt;Perintah Permintaan&lt;/h4&gt;
          &lt;p style="margin:0;"&gt;Meminta pembaca melakukan sesuatu dengan nada sopan.&lt;/p&gt;
          &lt;div class="q"&gt;Contoh: "Tolong perhatikan indikator suhu sebelum melanjutkan."&lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/section&gt;

  &lt;hr class="divider-dash"&gt;

  &lt;!-- ============ MATERI C: KATA TEKNIS ============ --&gt;
  &lt;section class="section" id="materi-c"&gt;
    &lt;div class="eyebrow"&gt;04 — Materi Inti C&lt;/div&gt;
    &lt;h2 class="section-title"&gt;Kata Teknis dalam Teks Prosedur&lt;/h2&gt;

    &lt;div class="panel"&gt;
      &lt;p&gt;&lt;b style="color:var(--off-white);"&gt;Kata teknis&lt;/b&gt; adalah istilah khusus yang digunakan dalam bidang keahlian tertentu, jarang dipakai dalam percakapan sehari-hari, dan berfungsi memberikan ketepatan serta presisi pada instruksi yang disampaikan.&lt;/p&gt;
    &lt;/div&gt;

    &lt;div class="grid-3"&gt;
      &lt;div class="card"&gt;&lt;h4&gt;Bidang Otomotif&lt;/h4&gt;&lt;p style="font-size:0.9rem;"&gt;karburator, velg, pentil, kampas rem&lt;/p&gt;&lt;/div&gt;
      &lt;div class="card"&gt;&lt;h4&gt;Bidang Tata Boga&lt;/h4&gt;&lt;p style="font-size:0.9rem;"&gt;mengocok, memfermentasi, mengukus, marinasi&lt;/p&gt;&lt;/div&gt;
      &lt;div class="card"&gt;&lt;h4&gt;Bidang Teknik Komputer&lt;/h4&gt;&lt;p style="font-size:0.9rem;"&gt;partisi, ekstensi file, restart, defrag&lt;/p&gt;&lt;/div&gt;
    &lt;/div&gt;
    &lt;p class="lead" style="margin-top:14px;"&gt;&lt;b style="color:var(--off-white);"&gt;Fungsi:&lt;/b&gt; memastikan pembaca yang memahami bidang tersebut dapat mengikuti instruksi secara akurat tanpa salah tafsir.&lt;/p&gt;
  &lt;/section&gt;

  &lt;hr class="divider-dash"&gt;

  &lt;!-- ============ MATERI D: PENANDA WACANA ============ --&gt;
  &lt;section class="section" id="materi-d"&gt;
    &lt;div class="eyebrow"&gt;05 — Materi Inti D&lt;/div&gt;
    &lt;h2 class="section-title"&gt;Penanda Wacana dalam Teks Prosedur&lt;/h2&gt;

    &lt;div class="panel"&gt;
      &lt;p&gt;&lt;b style="color:var(--off-white);"&gt;Penanda wacana&lt;/b&gt; adalah kata atau frasa yang mengatur hubungan antarkalimat atau antarparagraf dalam sebuah teks, sehingga teks menjadi padu dan mudah dipahami. Penanda wacana tidak hanya menunjukkan urutan waktu, tetapi juga penambahan, penekanan, dan simpulan.&lt;/p&gt;
    &lt;/div&gt;

    &lt;table&gt;
      &lt;tr&gt;&lt;th style="width:24%;"&gt;Jenis Penanda Wacana&lt;/th&gt;&lt;th style="width:38%;"&gt;Contoh Kata/Frasa&lt;/th&gt;&lt;th&gt;Fungsi&lt;/th&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Penanda Urutan&lt;/td&gt;&lt;td&gt;pertama-tama, selanjutnya, berikutnya&lt;/td&gt;&lt;td&gt;Menunjukkan urutan langkah&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Penanda Penambahan&lt;/td&gt;&lt;td&gt;selain itu, di samping itu, lagi pula&lt;/td&gt;&lt;td&gt;Menambahkan informasi baru&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Penanda Penekanan&lt;/td&gt;&lt;td&gt;perlu diperhatikan, yang terpenting, perlu diingat&lt;/td&gt;&lt;td&gt;Menegaskan bagian penting&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Penanda Simpulan&lt;/td&gt;&lt;td&gt;dengan demikian, oleh karena itu, jadi&lt;/td&gt;&lt;td&gt;Menyimpulkan atau menegaskan hasil akhir&lt;/td&gt;&lt;/tr&gt;
    &lt;/table&gt;
  &lt;/section&gt;

  &lt;hr class="divider-dash"&gt;

  &lt;!-- ============ MATERI E: MENYUSUN TEKS PROSEDUR ============ --&gt;
  &lt;section class="section" id="materi-e"&gt;
    &lt;div class="eyebrow"&gt;06 — Materi Inti E&lt;/div&gt;
    &lt;h2 class="section-title"&gt;Menyusun Teks Prosedur secara Logis dan Sistematis&lt;/h2&gt;

    &lt;div class="timeline"&gt;
      &lt;div class="tl-item"&gt;&lt;h4 class="mono"&gt;01 · Menentukan Tujuan&lt;/h4&gt;&lt;p&gt;Tentukan tujuan atau hasil akhir yang ingin dicapai dari prosedur yang akan disusun.&lt;/p&gt;&lt;/div&gt;
      &lt;div class="tl-item"&gt;&lt;h4 class="mono"&gt;02 · Mendaftar Alat &amp;amp; Bahan&lt;/h4&gt;&lt;p&gt;Susun daftar alat dan bahan yang diperlukan, jika prosedur membutuhkannya.&lt;/p&gt;&lt;/div&gt;
      &lt;div class="tl-item"&gt;&lt;h4 class="mono"&gt;03 · Merancang Langkah secara Berurutan&lt;/h4&gt;&lt;p&gt;Susun langkah-langkah sesuai urutan logis, tanpa ada langkah yang meloncat atau bertentangan.&lt;/p&gt;&lt;/div&gt;
      &lt;div class="tl-item"&gt;&lt;h4 class="mono"&gt;04 · Menerapkan Kaidah Kebahasaan&lt;/h4&gt;&lt;p&gt;Gunakan kalimat perintah, kata teknis, dan penanda wacana yang tepat pada setiap bagian teks.&lt;/p&gt;&lt;/div&gt;
      &lt;div class="tl-item"&gt;&lt;h4 class="mono"&gt;05 · Merevisi Keruntutan Teks&lt;/h4&gt;&lt;p&gt;Baca ulang teks yang disusun untuk memastikan urutan sudah logis dan mudah diikuti pembaca.&lt;/p&gt;&lt;/div&gt;
    &lt;/div&gt;
  &lt;/section&gt;

  &lt;hr class="divider-dash"&gt;

  &lt;!-- ============ MATERI F: TABEL RANGKUMAN ============ --&gt;
  &lt;section class="section" id="materi-f"&gt;
    &lt;div class="eyebrow"&gt;07 — Materi Inti F&lt;/div&gt;
    &lt;h2 class="section-title"&gt;Rangkuman Ciri Kebahasaan Bagian 2&lt;/h2&gt;

    &lt;table&gt;
      &lt;tr&gt;&lt;th style="width:20%;"&gt;Ciri Kebahasaan&lt;/th&gt;&lt;th style="width:30%;"&gt;Fungsi&lt;/th&gt;&lt;th&gt;Contoh&lt;/th&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Kalimat Perintah&lt;/td&gt;&lt;td&gt;Mengarahkan, melarang, mengajak, atau meminta pembaca melakukan tindakan&lt;/td&gt;&lt;td&gt;"Jangan sentuh permukaan yang masih panas."&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Kata Teknis&lt;/td&gt;&lt;td&gt;Memberikan ketepatan dan presisi sesuai bidang keahlian&lt;/td&gt;&lt;td&gt;"Periksa tekanan pada pentil ban."&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Penanda Wacana&lt;/td&gt;&lt;td&gt;Menjaga keterpaduan antarkalimat/paragraf dalam teks&lt;/td&gt;&lt;td&gt;"Selain itu, pastikan area kerja dalam keadaan bersih."&lt;/td&gt;&lt;/tr&gt;
    &lt;/table&gt;
  &lt;/section&gt;

  &lt;hr class="divider-dash"&gt;

  &lt;!-- ============ PEMODELAN ============ --&gt;
  &lt;section class="section" id="contoh"&gt;
    &lt;div class="eyebrow"&gt;08 — Pemodelan&lt;/div&gt;
    &lt;h2 class="section-title"&gt;Contoh Penerapan: Menganalisis dan Menyusun Teks Prosedur&lt;/h2&gt;
    &lt;p class="lead"&gt;Guru membacakan dan membahas bersama contoh berikut sebagai model sebelum murid mengerjakan tugas kelompok.&lt;/p&gt;

    &lt;div class="doc-sample"&gt;
      &lt;div class="doc-head"&gt;&lt;span&gt;Lampiran · Teks Prosedur Contoh&lt;/span&gt;&lt;span&gt;Dokumen-01&lt;/span&gt;&lt;/div&gt;
      &lt;div class="doc-body"&gt;
        &lt;h3 style="color:#132029 !important;"&gt;Prosedur Memasang Kartu SIM dan Kartu Memori pada Smartphone&lt;/h3&gt;
        &lt;p style="margin-top:-4px; color:#4b5a63 !important;"&gt;&lt;i&gt;Tujuan: Memasang kartu SIM dan kartu memori dengan benar agar smartphone dapat digunakan secara optimal.&lt;/i&gt;&lt;/p&gt;
        &lt;ol style="color:#132029 !important;"&gt;
          &lt;li style="color:#132029 !important;"&gt;Matikan smartphone terlebih dahulu sebelum memasang kartu.&lt;span class="flag"&gt;PERINTAH&lt;/span&gt;&lt;/li&gt;
          &lt;li style="color:#132029 !important;"&gt;Gunakan ejector pin untuk membuka slot kartu SIM.&lt;span class="flag"&gt;KATA TEKNIS&lt;/span&gt;&lt;/li&gt;
          &lt;li style="color:#132029 !important;"&gt;Letakkan kartu SIM pada baki (tray) sesuai posisi yang tertera.&lt;span class="flag"&gt;KATA TEKNIS&lt;/span&gt;&lt;/li&gt;
          &lt;li style="color:#132029 !important;"&gt;Selain itu, pastikan kartu memori terpasang pada slot yang benar agar terbaca oleh sistem.&lt;span class="flag"&gt;PENANDA WACANA&lt;/span&gt;&lt;/li&gt;
          &lt;li style="color:#132029 !important;"&gt;Masukkan kembali baki ke dalam slot hingga terdengar bunyi klik.&lt;span class="flag"&gt;PERINTAH&lt;/span&gt;&lt;/li&gt;
          &lt;li style="color:#132029 !important;"&gt;Jangan memaksa memasukkan baki jika terasa tersendat.&lt;span class="flag"&gt;PERINTAH&lt;/span&gt;&lt;/li&gt;
        &lt;/ol&gt;
        &lt;div class="note-margin" style="margin-top:10px; color:#8A3A1F !important;"&gt;Dengan demikian, kartu SIM dan kartu memori siap digunakan setelah smartphone dinyalakan kembali. &lt;b&gt;(penanda simpulan)&lt;/b&gt;&lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class="panel" style="margin-top:22px;"&gt;
      &lt;p style="margin:0;"&gt;&lt;b style="color:var(--off-white);"&gt;Simpulan model analisis:&lt;/b&gt; Teks di atas menggunakan variasi kalimat perintah (perintah biasa dan larangan), kata teknis khas perangkat elektronik ("ejector pin", "baki/tray"), serta penanda wacana penambahan ("selain itu") dan simpulan ("dengan demikian") yang menjaga keterpaduan antarlangkah.&lt;/p&gt;
    &lt;/div&gt;
  &lt;/section&gt;

  &lt;hr class="divider-dash"&gt;

  &lt;!-- ============ RANGKUMAN ============ --&gt;
  &lt;section class="section" id="rangkuman"&gt;
    &lt;div class="eyebrow"&gt;09 — Ringkasan Materi&lt;/div&gt;
    &lt;h2 class="section-title"&gt;Poin-Poin Penting&lt;/h2&gt;
    &lt;div class="summary-box"&gt;
      &lt;ul&gt;
        &lt;li&gt;Kalimat perintah memiliki variasi bentuk: perintah biasa, larangan, ajakan, dan permintaan.&lt;/li&gt;
        &lt;li&gt;Kata teknis adalah istilah khusus bidang keahlian yang memberi ketepatan pada instruksi.&lt;/li&gt;
        &lt;li&gt;Penanda wacana menjaga keterpaduan teks melalui penanda urutan, penambahan, penekanan, dan simpulan.&lt;/li&gt;
        &lt;li&gt;Teks prosedur disusun melalui lima langkah: menentukan tujuan → mendaftar alat/bahan → merancang langkah → menerapkan kaidah kebahasaan → merevisi keruntutan.&lt;/li&gt;
      &lt;/ul&gt;
    &lt;/div&gt;
  &lt;/section&gt;

  &lt;hr class="divider-dash"&gt;

  &lt;!-- ============ TUGAS KELOMPOK ============ --&gt;
  &lt;section class="section" id="tugas-kelompok"&gt;
    &lt;div class="eyebrow"&gt;10 — Lembar Kerja&lt;/div&gt;
    &lt;div class="task-header"&gt;
      &lt;h2&gt;Tugas Kelompok: Menyusun Teks Prosedur Baru&lt;/h2&gt;
      &lt;span class="badge"&gt;Durasi ± 60 menit&lt;/span&gt;
    &lt;/div&gt;

    &lt;p style="margin-top:18px;"&gt;&lt;b style="color:var(--off-white);"&gt;Tujuan tugas:&lt;/b&gt; Murid secara berkelompok menyusun sebuah teks prosedur baru secara logis dan sistematis, dengan menerapkan kalimat perintah, kata teknis, dan penanda wacana yang telah dipelajari.&lt;/p&gt;

    &lt;div class="panel" style="margin-top:20px;"&gt;
      &lt;div class="eyebrow" style="margin-bottom:6px;"&gt;Pilihan Tema (boleh memilih salah satu atau mengusulkan tema lain sesuai bidang keahlian dengan persetujuan guru)&lt;/div&gt;
      &lt;p style="margin:0;"&gt;Mengisi Daya Ponsel dengan Aman · Membuat Mi Instan yang Lezat · Merawat Tanaman Hias di Dalam Ruangan · Membersihkan Keyboard Laptop · atau prosedur lain sesuai bidang keahlian kelompok.&lt;/p&gt;
    &lt;/div&gt;

    &lt;h4 style="color:var(--off-white); margin-top:24px;"&gt;Petunjuk Pengerjaan&lt;/h4&gt;
    &lt;ol class="steps-num"&gt;
      &lt;li&gt;&lt;b&gt;Bentuk kelompok&lt;/b&gt; beranggotakan 4–5 orang sesuai pembagian dari guru.&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Pilih satu tema&lt;/b&gt; teks prosedur yang akan disusun.&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Tentukan tujuan&lt;/b&gt; serta alat/bahan (jika ada) untuk prosedur tersebut.&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Susun langkah-langkah&lt;/b&gt; secara berurutan dan logis pada Lembar Kerja Penyusunan di bawah ini.&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Terapkan kaidah kebahasaan&lt;/b&gt;: gunakan minimal 5 kalimat perintah, 2 kata teknis, dan 2 penanda wacana, lalu isi tabel ceklis penggunaannya.&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Presentasikan hasil&lt;/b&gt; di depan kelas selama maksimal 5 menit per kelompok, dilanjutkan tanya jawab singkat.&lt;/li&gt;
    &lt;/ol&gt;

    &lt;h4 style="color:var(--off-white); margin-top:26px;"&gt;Lembar Kerja Penyusunan Teks Prosedur&lt;/h4&gt;
    &lt;table&gt;
      &lt;tr&gt;&lt;th style="width:22%;"&gt;Bagian&lt;/th&gt;&lt;th&gt;Isi yang Disusun Kelompok&lt;/th&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Judul&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Tujuan&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Alat &amp;amp; Bahan&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Langkah 1–3&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Langkah 4–6&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Penutup&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;
    &lt;/table&gt;

    &lt;h4 style="color:var(--off-white); margin-top:26px;"&gt;Ceklis Penggunaan Kaidah Kebahasaan&lt;/h4&gt;
    &lt;table&gt;
      &lt;tr&gt;&lt;th style="width:34%;"&gt;Kaidah Kebahasaan&lt;/th&gt;&lt;th style="width:20%;"&gt;Target Minimal&lt;/th&gt;&lt;th&gt;Jumlah yang Digunakan&lt;/th&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Kalimat Perintah&lt;/td&gt;&lt;td&gt;5 kalimat&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Kata Teknis&lt;/td&gt;&lt;td&gt;2 kata&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Penanda Wacana&lt;/td&gt;&lt;td&gt;2 kata/frasa&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;
    &lt;/table&gt;

    &lt;h4 style="color:var(--off-white); margin-top:26px;"&gt;Rubrik Penilaian Kelompok&lt;/h4&gt;
    &lt;table&gt;
      &lt;tr&gt;&lt;th style="width:26%;"&gt;Aspek Penilaian&lt;/th&gt;&lt;th&gt;Skor 4 (Sangat Baik)&lt;/th&gt;&lt;th&gt;Skor 3 (Baik)&lt;/th&gt;&lt;th&gt;Skor 2 (Cukup)&lt;/th&gt;&lt;th&gt;Skor 1 (Kurang)&lt;/th&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Kelogisan urutan langkah&lt;/td&gt;&lt;td&gt;Seluruh langkah runtut dan logis&lt;/td&gt;&lt;td&gt;Sebagian besar runtut&lt;/td&gt;&lt;td&gt;Ada beberapa langkah tidak runtut&lt;/td&gt;&lt;td&gt;Urutan tidak logis&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Ketepatan kalimat perintah&lt;/td&gt;&lt;td&gt;Digunakan tepat dan bervariasi&lt;/td&gt;&lt;td&gt;Digunakan tepat&lt;/td&gt;&lt;td&gt;Kurang bervariasi&lt;/td&gt;&lt;td&gt;Tidak tepat/tidak digunakan&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Ketepatan kata teknis &amp;amp; penanda wacana&lt;/td&gt;&lt;td&gt;Digunakan tepat sesuai konteks&lt;/td&gt;&lt;td&gt;Sebagian besar tepat&lt;/td&gt;&lt;td&gt;Kurang tepat&lt;/td&gt;&lt;td&gt;Tidak digunakan&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Presentasi&lt;/td&gt;&lt;td&gt;Jelas, percaya diri, menjawab pertanyaan dengan baik&lt;/td&gt;&lt;td&gt;Jelas namun kurang percaya diri&lt;/td&gt;&lt;td&gt;Kurang jelas/terbata-bata&lt;/td&gt;&lt;td&gt;Tidak dapat menjelaskan hasil&lt;/td&gt;&lt;/tr&gt;
    &lt;/table&gt;
  &lt;/section&gt;

  &lt;hr class="divider-dash"&gt;

&lt;!-- ============ TUGAS INDIVIDU: KUIS INTERAKTIF 10 PERTANYAAN ============ --&gt;
  &lt;section class="section" id="tugas-individu"&gt;
    &lt;div class="eyebrow"&gt;11 — Penutup Pembelajaran&lt;/div&gt;
    &lt;div class="task-header"&gt;
      &lt;h2&gt;Tugas Individu: Menjawab 10 Pertanyaan tentang Materi&lt;/h2&gt;
      &lt;span class="badge"&gt;Dikerjakan Mandiri · Otomatis Bernilai&lt;/span&gt;
    &lt;/div&gt;

    &lt;p style="margin-top:18px;"&gt;&lt;b style="color:var(--off-white);"&gt;Petunjuk:&lt;/b&gt; Isi No. Absen dan Nama, lalu jawab 10 pertanyaan pilihan ganda berikut berdasarkan materi yang telah dipelajari hari ini. Skor akan muncul otomatis setelah menekan tombol "Kirim Jawaban", dan hasilnya (No. Absen, Nama, Skor) akan tercatat otomatis.&lt;/p&gt;

    &lt;div class="panel" id="epbq-form-wrap" style="margin-top:20px;"&gt;
      &lt;div style="display:grid; grid-template-columns:1fr 2fr; gap:14px; margin-bottom:22px;"&gt;
        &lt;div&gt;
          &lt;label class="mono" style="display:block; font-size:0.75rem; color:var(--amber); text-transform:uppercase; letter-spacing:0.08em; margin-bottom:6px;"&gt;No. Absen&lt;/label&gt;
          &lt;input id="epbq-absen" type="text" inputmode="numeric" placeholder="Contoh: 12" style="width:100%; padding:10px 12px; border-radius:2px; border:1px solid var(--line); background:var(--blueprint-deep); color:var(--off-white); font-family:'Source Sans 3',sans-serif; font-size:0.95rem;"&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;label class="mono" style="display:block; font-size:0.75rem; color:var(--amber); text-transform:uppercase; letter-spacing:0.08em; margin-bottom:6px;"&gt;Nama Lengkap&lt;/label&gt;
          &lt;input id="epbq-nama" type="text" placeholder="Tulis nama lengkap" style="width:100%; padding:10px 12px; border-radius:2px; border:1px solid var(--line); background:var(--blueprint-deep); color:var(--off-white); font-family:'Source Sans 3',sans-serif; font-size:0.95rem;"&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div id="epbq-questions"&gt;&lt;/div&gt;

      &lt;div style="margin-top:24px; display:flex; align-items:center; gap:16px; flex-wrap:wrap;"&gt;
        &lt;button id="epbq-submit" type="button" style="background:var(--amber); color:var(--blueprint-deep); border:none; padding:12px 26px; font-family:'Oswald',sans-serif; text-transform:uppercase; letter-spacing:0.05em; font-weight:600; border-radius:2px; cursor:pointer; font-size:0.95rem;"&gt;Kirim Jawaban&lt;/button&gt;
        &lt;span id="epbq-status" class="mono" style="font-size:0.85rem; color:var(--muted);"&gt;&lt;/span&gt;
      &lt;/div&gt;

      &lt;div id="epbq-result" style="display:none; margin-top:20px; padding:18px 20px; border:1px solid var(--amber); background:rgba(245,166,35,0.08);"&gt;
        &lt;p style="margin:0; font-size:1.05rem;"&gt;Skor kamu: &lt;b id="epbq-score" style="color:var(--amber); font-size:1.3rem;"&gt;&lt;/b&gt; / 100&lt;/p&gt;
        &lt;p id="epbq-detail" style="margin:8px 0 0; font-size:0.9rem; color:var(--muted);"&gt;&lt;/p&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/section&gt;

&lt;script&gt;
(function(){
  var EPBQ_ENDPOINT = "https://script.google.com/macros/s/AKfycbzM7t2qgAENzxQJXzSYJYL28R6nb3TxJVELLL3CopyEXb51t_gRtrkPOxTpI5mq6VCEKw/exec";

  var questions = [
    {q:"1. Kalimat yang berisi larangan kepada pembaca disebut...", opts:["Kalimat deklaratif","Kalimat perintah larangan","Kalimat persuasif","Kalimat interogatif"], correct:1},
    {q:"2. Manakah contoh kalimat perintah ajakan?", opts:["\"Jangan sentuh permukaan yang panas.\"","\"Mari kita mulai dengan menyiapkan alat.\"","\"Alat ini terbuat dari logam.\"","\"Sebaiknya gunakan alat ini secara rutin.\""], correct:1},
    {q:"3. Kata teknis dalam teks prosedur berfungsi untuk...", opts:["Membuat teks lebih panjang","Memberikan ketepatan dan presisi instruksi","Menghibur pembaca","Menambah jumlah kalimat persuasif"], correct:1},
    {q:"4. Manakah yang termasuk kata teknis bidang otomotif?", opts:["Mengocok","Partisi","Karburator","Marinasi"], correct:2},
    {q:"5. Penanda wacana \"selain itu\" termasuk jenis...", opts:["Penanda urutan","Penanda penambahan","Penanda penekanan","Penanda simpulan"], correct:1},
    {q:"6. Contoh penanda wacana penekanan adalah...", opts:["\"Pertama-tama...\"","\"Dengan demikian...\"","\"Perlu diperhatikan...\"","\"Selanjutnya...\""], correct:2},
    {q:"7. Langkah pertama dalam menyusun teks prosedur adalah...", opts:["Merevisi keruntutan teks","Menentukan tujuan","Menerapkan kaidah kebahasaan","Mendaftar alat dan bahan"], correct:1},
    {q:"8. Mengapa urutan langkah dalam teks prosedur tidak boleh diacak?", opts:["Karena akan membuat teks lebih pendek","Karena pembaca bisa gagal mencapai hasil yang diinginkan","Karena aturan tata bahasa mengharuskannya","Karena teks prosedur harus selalu memiliki 5 langkah"], correct:1},
    {q:"9. Manakah kalimat yang mengandung kata teknis?", opts:["\"Silakan duduk dengan nyaman.\"","\"Periksa tekanan pada pentil ban.\"","\"Semoga langkah ini bermanfaat.\"","\"Jangan lupa berdoa sebelum memulai.\""], correct:1},
    {q:"10. Penanda wacana yang menyimpulkan sebuah proses biasanya menggunakan kata...", opts:["\"Kemudian\"","\"Selain itu\"","\"Dengan demikian\"","\"Perlu diperhatikan\""], correct:2}
  ];

  var container = document.getElementById("epbq-questions");
  questions.forEach(function(item, idx){
    var block = document.createElement("div");
    block.style.marginBottom = "20px";
    block.style.paddingBottom = "16px";
    block.style.borderBottom = "1px dashed rgba(234,242,245,0.16)";

    var qEl = document.createElement("p");
    qEl.style.color = "#EAF2F5";
    qEl.style.fontWeight = "600";
    qEl.style.marginBottom = "8px";
    qEl.textContent = item.q;
    block.appendChild(qEl);

    item.opts.forEach(function(opt, oi){
      var label = document.createElement("label");
      label.style.display = "block";
      label.style.color = "#DDE7EC";
      label.style.fontSize = "0.92rem";
      label.style.margin = "4px 0";
      label.style.cursor = "pointer";

      var radio = document.createElement("input");
      radio.type = "radio";
      radio.name = "epbq-q" + idx;
      radio.value = oi;
      radio.style.marginRight = "8px";

      label.appendChild(radio);
      label.appendChild(document.createTextNode(opt));
      block.appendChild(label);
    });

    container.appendChild(block);
  });

  document.getElementById("epbq-submit").addEventListener("click", function(){
    var absen = document.getElementById("epbq-absen").value.trim();
    var nama = document.getElementById("epbq-nama").value.trim();
    var statusEl = document.getElementById("epbq-status");

    if(!absen || !nama){
      statusEl.textContent = "Isi No. Absen dan Nama terlebih dahulu.";
      statusEl.style.color = "#F5A623";
      return;
    }

    var belumDijawab = [];
    var benar = 0;
    questions.forEach(function(item, idx){
      var checked = document.querySelector('input[name="epbq-q' + idx + '"]:checked');
      if(!checked){
        belumDijawab.push(idx+1);
      } else if(parseInt(checked.value,10) === item.correct){
        benar++;
      }
    });

    if(belumDijawab.length &gt; 0){
      statusEl.textContent = "Pertanyaan belum dijawab: nomor " + belumDijawab.join(", ");
      statusEl.style.color = "#F5A623";
      return;
    }

    var skor = benar * 10;
    document.getElementById("epbq-score").textContent = skor;
    document.getElementById("epbq-detail").textContent = "Menjawab benar " + benar + " dari 10 pertanyaan.";
    document.getElementById("epbq-result").style.display = "block";
    statusEl.textContent = "Mengirim hasil...";
    statusEl.style.color = "#9FB4C2";

    var payload = new URLSearchParams();
    payload.append("noAbsen", absen);
    payload.append("nama", nama);
    payload.append("skor", skor);
    payload.append("waktu", new Date().toISOString());

    if(EPBQ_ENDPOINT.indexOf("PASTE_URL") === 0){
      statusEl.textContent = "Skor tercatat di halaman ini. (Pengiriman ke Google Sheets belum diaktifkan guru.)";
      return;
    }

    fetch(EPBQ_ENDPOINT, {
      method: "POST",
      mode: "no-cors",
      headers: {"Content-Type":"application/x-www-form-urlencoded"},
      body: payload.toString()
    }).then(function(){
      statusEl.textContent = "Hasil berhasil dikirim ke guru.";
      statusEl.style.color = "#6EC6CA";
    }).catch(function(){
      statusEl.textContent = "Skor tercatat di halaman ini, namun pengiriman gagal. Tunjukkan skor ini ke guru.";
      statusEl.style.color = "#F5A623";
    });
  });
})();
&lt;/script&gt;

&lt;/main&gt;

&lt;footer&gt;
  &lt;div class="doc-code"&gt;DOK/B.INDO/XI/PROSEDUR-KAIDAH-2 — Fokus Tujuan Pembelajaran, Materi Inti, Tugas Kelompok &amp;amp; Tugas Individu, 1× pertemuan (3 JP)&lt;/div&gt;
  &lt;p style="margin:0;"&gt;Referensi: Kurikulum Merdeka — Capaian Pembelajaran Bahasa Indonesia Fase F (Elemen Membaca, Memirsa, dan Menulis); Buku Teks Bahasa Indonesia Kelas XI SMK/MAK Kemendikbudristek.&lt;/p&gt;
&lt;/footer&gt;
&lt;/div&gt;</description><link>http://kitab-investasi.blogspot.com/2026/08/kaidah-kebahasaan-teks-prosedur-bagian.html</link><thr:total>0</thr:total><author>nof_rizal07@yahoo.co.id (abang_cool)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-9000860041661554971.post-8699242951655968917</guid><pubDate>Fri, 07 Aug 2026 01:33:22 +0000</pubDate><atom:updated>2026-08-07T08:33:22.366+07:00</atom:updated><title>Sistem Operasi, Manajemen File, Kaidah Keba&amp;asaan Teks Prosedur (Bagian 2) &amp; Menyusun Teks Prosedur&amp; Penyimpanan Cloud</title><description>&lt;!DOCTYPE html&gt;
&lt;html lang="id"&gt;
&lt;head&gt;
&lt;meta charset="UTF-8"&gt;
&lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&gt;
&lt;title&gt;Sistem Operasi, Manajemen File &amp; Penyimpanan Cloud — Informatika Kelas X&lt;/title&gt;
&lt;link rel="preconnect" href="https://fonts.googleapis.com"&gt;
&lt;link href="https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;600;700&amp;family=IBM+Plex+Sans:wght@400;500;600;700&amp;display=swap" rel="stylesheet"&gt;
&lt;style&gt;
  :root{
    --chrome: #2E3440;
    --chrome-deep: #232833;
    --desktop: #E8ECF1;
    --window: #FFFFFF;
    --line: #C7D0DA;
    --folder: #F0A93F;
    --folder-dark: #C9820A;
    --cloud: #3B82C4;
    --cloud-dark: #2A5F8F;
    --file-gray: #7C8798;
    --ink: #1F2A36;
    --ink-soft: #55647A;
    --green: #3FAE72;
    --red: #E0604A;
    --radius: 6px;
  }
  *{box-sizing:border-box; margin:0; padding:0;}
  html{scroll-behavior:smooth;}
  body{
    font-family:'IBM Plex Sans', sans-serif;
    background: var(--desktop);
    color: var(--ink);
    line-height:1.6;
  }
  .mono{font-family:'IBM Plex Mono', monospace;}

  /* ===== Top window chrome hero ===== */
  .titlebar-hero{
    background: var(--chrome);
    color: #E8ECF1;
  }
  .titlebar{
    display:flex; align-items:center; gap:8px;
    padding: 14px 6vw;
    border-bottom: 1px solid rgba(255,255,255,0.08);
  }
  .dot{width:12px; height:12px; border-radius:50%;}
  .dot.r{background:#E0604A;}
  .dot.y{background:#F0A93F;}
  .dot.g{background:#3FAE72;}
  .path-bar{
    margin-left:14px;
    font-family:'IBM Plex Mono', monospace;
    font-size:0.78rem;
    background: rgba(255,255,255,0.07);
    padding:5px 12px;
    border-radius:4px;
    color:#B9C4D2;
    letter-spacing:0.02em;
  }
  .hero-body{
    padding: 40px 6vw 60px;
  }
  .eyebrow{
    font-family:'IBM Plex Mono', monospace;
    font-size:0.78rem;
    letter-spacing:0.14em;
    text-transform:uppercase;
    color: var(--folder);
    margin-bottom:18px;
  }
  h1.title{
    font-family:'IBM Plex Mono', monospace;
    font-weight:700;
    font-size: clamp(1.9rem, 4vw, 3.3rem);
    line-height:1.16;
    max-width: 20ch;
    color:#F4F6F9;
  }
  h1.title span{color: var(--cloud);}
  .hero-sub{
    margin-top:16px;
    max-width: 64ch;
    font-size:1.03rem;
    color: #C3CCD8;
  }
  .meta-strip{
    margin-top:36px;
    display:grid;
    grid-template-columns: repeat(auto-fit,minmax(160px,1fr));
    gap:1px;
    background: rgba(255,255,255,0.1);
    border:1px solid rgba(255,255,255,0.1);
    max-width: 920px;
  }
  .meta-cell{ background: var(--chrome-deep); padding:14px 16px; }
  .meta-cell .k{
    font-family:'IBM Plex Mono', monospace;
    font-size:0.66rem; letter-spacing:0.1em; text-transform:uppercase;
    color: var(--cloud); opacity:0.9;
  }
  .meta-cell .v{ margin-top:6px; font-size:0.94rem; font-weight:600; color:#F1F4F7; }

  /* ===== Content ===== */
  main{
    background: var(--desktop);
    padding: 8px 0 0;
  }
  .section{
    padding: 54px 6vw;
    max-width: 1180px;
    margin: 0 auto;
  }
  .section-tag{
    font-family:'IBM Plex Mono', monospace;
    font-size:0.72rem; letter-spacing:0.14em; text-transform:uppercase;
    color: var(--ink-soft);
    display:flex; align-items:center; gap:10px; margin-bottom:10px;
  }
  .section-tag .num{
    color:#fff; background: var(--chrome); padding:3px 8px; border-radius:3px; font-weight:600;
  }
  h2.section-title{
    font-family:'IBM Plex Mono', monospace;
    font-size: clamp(1.35rem, 2.3vw, 1.9rem);
    font-weight:700; color: var(--chrome); margin-bottom: 22px; max-width: 32ch;
  }
  h3.sub-title{
    font-family:'IBM Plex Mono', monospace;
    font-size:1.06rem; font-weight:600; color: var(--chrome);
    margin: 26px 0 12px; display:flex; align-items:center; gap:10px;
  }
  h3.sub-title::before{ content:""; width:8px;height:8px; background: var(--folder); display:inline-block; border-radius:1px; }
  p{ color:#33414F; max-width: 74ch; margin-bottom: 14px;}
  strong{color:var(--chrome);}
  ul, ol{ margin: 8px 0 18px 1.3em; max-width: 74ch;}
  li{margin-bottom:8px; color:#33414F;}

  .callout{
    border-left: 3px solid var(--cloud);
    background: #EAF2FA;
    padding: 16px 20px; border-radius: 0 6px 6px 0; margin: 18px 0; max-width: 74ch;
  }
  .callout .lbl{
    font-family:'IBM Plex Mono', monospace; font-size:0.7rem; letter-spacing:0.1em; text-transform:uppercase;
    color:#2A5F8F; font-weight:700; margin-bottom:6px;
  }

  /* ===== Window-style cards ===== */
  .win-card{
    background: var(--window);
    border: 1px solid var(--line);
    border-radius: var(--radius);
    box-shadow: 0 2px 10px rgba(30,40,55,0.06);
    overflow:hidden;
  }
  .win-card .win-bar{
    background: #F3F5F8;
    border-bottom: 1px solid var(--line);
    padding: 8px 12px;
    display:flex; align-items:center; gap:6px;
  }
  .win-card .win-bar .d{width:9px;height:9px;border-radius:50%;}
  .win-card .win-bar .d.r{background:#E0604A;} .win-card .win-bar .d.y{background:#F0A93F;} .win-card .win-bar .d.g{background:#3FAE72;}
  .win-card .win-bar .win-title{
    margin-left:8px; font-family:'IBM Plex Mono', monospace; font-size:0.72rem; color: var(--ink-soft);
  }
  .win-card .win-content{ padding: 18px 20px; }

  .card-grid{ display:grid; grid-template-columns: repeat(3, 1fr); gap: 16px; margin: 20px 0 8px; }
  @media (max-width: 860px){ .card-grid{grid-template-columns: 1fr;} }
  .card-grid .win-card h4{ font-family:'IBM Plex Mono', monospace; font-size:0.98rem; color:var(--chrome); margin-bottom:6px;}
  .card-grid .win-card p{ font-size:0.88rem; margin-bottom:8px;}
  .card-grid .win-card ul{ margin:6px 0 0 1.1em; font-size:0.88rem;}
  .card-grid .win-card li{ margin-bottom:4px; color:#3C4C5B;}

  /* ===== Folder tree diagram ===== */
  .tree-frame{
    margin: 24px 0;
    background: var(--window);
    border:1px solid var(--line);
    border-radius: 8px;
    padding: 22px 24px;
  }
  .tree{ font-family:'IBM Plex Mono', monospace; font-size:0.88rem; line-height:2; color:#2C3947;}
  .tree .lvl0::before{ content:"&#128193; "; }
  .tree .lvl1{ padding-left:26px; position:relative;}
  .tree .lvl1::before{ content:"├─ &#128193; "; color: var(--ink-soft);}
  .tree .lvl2{ padding-left:52px; position:relative; color:#55647A;}
  .tree .lvl2::before{ content:"├─ &#128196; "; }
  .tree .lvl2.last::before{ content:"└─ &#128196; "; }
  .tree .folder-name{color:var(--folder-dark); font-weight:600;}
  .tree .file-name{color:var(--file-gray);}

  /* ===== Cloud sync diagram ===== */
  .diagram-frame{
    margin: 26px 0;
    background: var(--window);
    border-radius: 8px;
    padding: 18px;
    border: 1px solid var(--line);
  }
  .diagram-frame svg{width:100%; height:auto; display:block;}
  .diagram-caption{
    font-family:'IBM Plex Mono', monospace; font-size:0.72rem; color: var(--ink-soft);
    text-align:center; margin-top:10px; letter-spacing:0.03em;
  }
  .signal{ stroke-dasharray: 6 8; animation: flow 1.6s linear infinite; }
  @keyframes flow{ to{ stroke-dashoffset:-56; } }
  @media (prefers-reduced-motion: reduce){ .signal{animation:none;} }

  /* ===== Compare table ===== */
  table.compare{ width:100%; border-collapse:collapse; margin:18px 0; font-size:0.9rem; background:var(--window); }
  table.compare th, table.compare td{ border:1px solid var(--line); padding:11px 14px; text-align:left; }
  table.compare th{ background: var(--chrome); color:#fff; font-family:'IBM Plex Mono', monospace; font-size:0.74rem; letter-spacing:0.04em; text-transform:uppercase; }
  table.compare tr:nth-child(even) td{ background:#F3F5F8; }

  /* ===== Summary ===== */
  .summary-box{ background: var(--chrome); color: #fff; border-radius: 8px; padding: 26px 28px; margin-top: 10px; }
  .summary-box h4{ font-family:'IBM Plex Mono', monospace; color: var(--folder); font-size:0.85rem; letter-spacing:0.08em; text-transform:uppercase; margin-bottom:14px; }
  .summary-box ul{ margin:0 0 0 1.1em; max-width:none; }
  .summary-box li{ color:#E4EAF0; margin-bottom:8px; }

  /* ===== Tugas kelompok ===== */
  .task-panel{
    border: 1.5px dashed var(--chrome);
    border-radius: 8px; padding: 26px 28px;
    background: repeating-linear-gradient(135deg, #FFFFFF, #FFFFFF 18px, #EEF1F5 18px, #EEF1F5 19px);
  }
  .task-head{ display:flex; align-items:center; gap:12px; flex-wrap:wrap; margin-bottom:12px; }
  .task-head .badge{
    font-family:'IBM Plex Mono', monospace; font-size:0.7rem; letter-spacing:0.08em; text-transform:uppercase;
    background: var(--cloud); color:#fff; padding:4px 10px; border-radius:3px;
  }
  .task-panel h3{ font-family:'IBM Plex Mono', monospace; font-size:1.22rem; color: var(--chrome); }
  .steps-num{ counter-reset: step; margin:16px 0; max-width:78ch; }
  .steps-num li{ counter-increment: step; list-style:none; position:relative; padding-left:34px; margin-bottom:14px; }
  .steps-num li::before{
    content: counter(step); position:absolute; left:0; top:0;
    font-family:'IBM Plex Mono', monospace; font-weight:700; color:#fff; background: var(--chrome);
    width:24px; height:24px; border-radius:50%; display:flex; align-items:center; justify-content:center; font-size:0.8rem;
  }
  table.rubrik{ width:100%; border-collapse:collapse; margin-top:18px; font-size:0.88rem; }
  table.rubrik th, table.rubrik td{ border:1px solid #C9C4B4; padding:10px 12px; text-align:left; }
  table.rubrik th{ background: var(--chrome); color:#fff; font-family:'IBM Plex Mono', monospace; font-size:0.75rem; letter-spacing:0.04em; text-transform:uppercase; }
  table.rubrik tr:nth-child(even) td{ background:#F1F0E8; }

  .closing-task{
    margin-top:22px; background: #FFF6E8; border:1.5px solid var(--folder); border-radius:8px; padding:20px 22px;
  }
  .closing-task .lbl{ font-family:'IBM Plex Mono', monospace; font-size:0.72rem; letter-spacing:0.1em; text-transform:uppercase; color:#8A5A0A; font-weight:700; margin-bottom:8px; }

  footer{
    background: var(--chrome-deep); color:#9FAEC0; text-align:center; padding: 30px 6vw 40px;
    font-family:'IBM Plex Mono', monospace; font-size:0.75rem; letter-spacing:0.04em;
  }

  @media (max-width: 700px){
    .card-grid{grid-template-columns:1fr;}
    .hero-body{padding:32px 5vw 44px;}
    .section{padding:38px 5vw;}
  }
&lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;

&lt;div class="titlebar-hero"&gt;
  &lt;div class="titlebar"&gt;
    &lt;span class="dot r"&gt;&lt;/span&gt;&lt;span class="dot y"&gt;&lt;/span&gt;&lt;span class="dot g"&gt;&lt;/span&gt;
    &lt;span class="path-bar"&gt;C:\Informatika\Kelas-X\Sistem-Operasi-File-Cloud&lt;/span&gt;
  &lt;/div&gt;
  &lt;div class="hero-body"&gt;
    &lt;div class="eyebrow"&gt;Informatika · Fase E · Kelas X SMK&lt;/div&gt;
    &lt;h1 class="title"&gt;Sistem Operasi, Manajemen File, &amp; Penyimpanan &lt;span&gt;Cloud&lt;/span&gt;&lt;/h1&gt;
    &lt;p class="hero-sub"&gt;Materi ini membahas bagaimana sistem operasi mengatur seluruh sumber daya komputer, bagaimana file dan folder dikelola secara sistematis, serta bagaimana layanan penyimpanan cloud mendukung pekerjaan digital masa kini.&lt;/p&gt;

    &lt;div class="meta-strip"&gt;
      &lt;div class="meta-cell"&gt;&lt;div class="k"&gt;Elemen CP&lt;/div&gt;&lt;div class="v"&gt;Sistem Operasi &amp; File&lt;/div&gt;&lt;/div&gt;
      &lt;div class="meta-cell"&gt;&lt;div class="k"&gt;Jenjang&lt;/div&gt;&lt;div class="v"&gt;SMK Kelas X&lt;/div&gt;&lt;/div&gt;
      &lt;div class="meta-cell"&gt;&lt;div class="k"&gt;Alokasi Waktu&lt;/div&gt;&lt;div class="v"&gt;1 Pertemuan · 4 JP (180 menit)&lt;/div&gt;&lt;/div&gt;
      &lt;div class="meta-cell"&gt;&lt;div class="k"&gt;Model&lt;/div&gt;&lt;div class="v"&gt;Praktik &amp; Kerja Kelompok&lt;/div&gt;&lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;main&gt;

  &lt;!-- ===================== TUJUAN ===================== --&gt;
  &lt;section class="section" id="tujuan"&gt;
    &lt;div class="section-tag"&gt;&lt;span class="num"&gt;00&lt;/span&gt; Capaian &amp; Tujuan Pembelajaran&lt;/div&gt;
    &lt;h2 class="section-title"&gt;Ke Mana Materi Ini Menuju&lt;/h2&gt;

    &lt;h3 class="sub-title"&gt;Capaian Pembelajaran&lt;/h3&gt;
    &lt;p&gt;Murid mampu mengelola sistem operasi, file, folder, media penyimpanan, serta memanfaatkan layanan cloud storage untuk mendukung pekerjaan digital.&lt;/p&gt;

    &lt;h3 class="sub-title"&gt;Tujuan Pembelajaran&lt;/h3&gt;
    &lt;ol&gt;
      &lt;li&gt;Menjelaskan pengertian dan fungsi sistem operasi dalam mengelola sumber daya komputer.&lt;/li&gt;
      &lt;li&gt;Mengidentifikasi jenis-jenis sistem operasi yang umum digunakan.&lt;/li&gt;
      &lt;li&gt;Mengelola file dan folder: membuat, menamai, menyalin, memindahkan, dan menghapus dengan struktur yang rapi.&lt;/li&gt;
      &lt;li&gt;Membedakan jenis media penyimpanan (internal, removable, dan cloud) beserta karakteristiknya.&lt;/li&gt;
      &lt;li&gt;Memanfaatkan layanan penyimpanan cloud untuk menyimpan, mengelola, dan berbagi berkas pekerjaan digital.&lt;/li&gt;
    &lt;/ol&gt;

    &lt;h3 class="sub-title"&gt;Rincian Kegiatan (4 JP × 45 menit)&lt;/h3&gt;
    &lt;table class="compare"&gt;
      &lt;tr&gt;&lt;th&gt;Tahap&lt;/th&gt;&lt;th&gt;Kegiatan&lt;/th&gt;&lt;th&gt;Waktu&lt;/th&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Pendahuluan&lt;/td&gt;&lt;td&gt;Apersepsi ("Ke mana perginya file yang kamu simpan?"), penyampaian tujuan pembelajaran&lt;/td&gt;&lt;td&gt;15 menit&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Inti — Eksplorasi Konsep&lt;/td&gt;&lt;td&gt;Penjelasan sistem operasi, manajemen file/folder, media penyimpanan, dan cloud storage&lt;/td&gt;&lt;td&gt;55 menit&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Inti — Praktik Mandiri&lt;/td&gt;&lt;td&gt;Murid mempraktikkan membuat struktur folder dan mengunggah file ke akun cloud storage&lt;/td&gt;&lt;td&gt;30 menit&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Inti — Kerja Kelompok&lt;/td&gt;&lt;td&gt;Diskusi dan pengerjaan tugas kelompok&lt;/td&gt;&lt;td&gt;45 menit&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Inti — Presentasi&lt;/td&gt;&lt;td&gt;Presentasi singkat tiap kelompok dan tanggapan guru&lt;/td&gt;&lt;td&gt;25 menit&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Penutup&lt;/td&gt;&lt;td&gt;Refleksi, penguatan konsep, menulis kesimpulan ringkas di buku catatan&lt;/td&gt;&lt;td&gt;10 menit&lt;/td&gt;&lt;/tr&gt;
    &lt;/table&gt;
  &lt;/section&gt;

  &lt;!-- ===================== A. SISTEM OPERASI ===================== --&gt;
  &lt;section class="section" id="sistem-operasi"&gt;
    &lt;div class="section-tag"&gt;&lt;span class="num"&gt;01&lt;/span&gt; Konsep Dasar&lt;/div&gt;
    &lt;h2 class="section-title"&gt;Apa Itu Sistem Operasi?&lt;/h2&gt;
    &lt;p&gt;&lt;strong&gt;Sistem operasi (operating system/OS)&lt;/strong&gt; adalah perangkat lunak utama yang menjembatani antara pengguna, aplikasi, dan perangkat keras komputer. OS dijalankan pertama kali saat komputer dinyalakan dan terus bekerja di latar belakang selama komputer digunakan.&lt;/p&gt;

    &lt;h3 class="sub-title"&gt;Fungsi Utama Sistem Operasi&lt;/h3&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;strong&gt;Manajemen proses&lt;/strong&gt; — mengatur program apa saja yang sedang berjalan dan membagi waktu pemrosesan CPU untuk masing-masing program.&lt;/li&gt;
      &lt;li&gt;&lt;strong&gt;Manajemen memori&lt;/strong&gt; — mengalokasikan RAM untuk setiap program agar dapat berjalan tanpa saling bertabrakan.&lt;/li&gt;
      &lt;li&gt;&lt;strong&gt;Manajemen perangkat keras&lt;/strong&gt; — mengatur komunikasi dengan printer, keyboard, mouse, dan perangkat lain melalui driver.&lt;/li&gt;
      &lt;li&gt;&lt;strong&gt;Manajemen file&lt;/strong&gt; — mengatur bagaimana data disimpan, disusun dalam folder, dan diakses kembali.&lt;/li&gt;
      &lt;li&gt;&lt;strong&gt;Antarmuka pengguna (User Interface)&lt;/strong&gt; — menyediakan tampilan (GUI) atau baris perintah (CLI) agar manusia dapat berinteraksi dengan komputer.&lt;/li&gt;
    &lt;/ul&gt;

    &lt;h3 class="sub-title"&gt;Jenis-Jenis Sistem Operasi&lt;/h3&gt;
    &lt;div class="card-grid"&gt;
      &lt;div class="win-card"&gt;
        &lt;div class="win-bar"&gt;&lt;span class="d r"&gt;&lt;/span&gt;&lt;span class="d y"&gt;&lt;/span&gt;&lt;span class="d g"&gt;&lt;/span&gt;&lt;span class="win-title"&gt;desktop-os.exe&lt;/span&gt;&lt;/div&gt;
        &lt;div class="win-content"&gt;
          &lt;h4&gt;Windows&lt;/h4&gt;
          &lt;p&gt;OS paling umum di komputer perkantoran dan sekolah, dikembangkan oleh Microsoft, dikenal luas kompatibel dengan berbagai aplikasi.&lt;/p&gt;
        &lt;/div&gt;
      &lt;/div&gt;
      &lt;div class="win-card"&gt;
        &lt;div class="win-bar"&gt;&lt;span class="d r"&gt;&lt;/span&gt;&lt;span class="d y"&gt;&lt;/span&gt;&lt;span class="d g"&gt;&lt;/span&gt;&lt;span class="win-title"&gt;macos.app&lt;/span&gt;&lt;/div&gt;
        &lt;div class="win-content"&gt;
          &lt;h4&gt;macOS&lt;/h4&gt;
          &lt;p&gt;OS buatan Apple untuk perangkat Mac, dikenal dengan antarmuka yang halus dan integrasi kuat dengan perangkat Apple lainnya.&lt;/p&gt;
        &lt;/div&gt;
      &lt;/div&gt;
      &lt;div class="win-card"&gt;
        &lt;div class="win-bar"&gt;&lt;span class="d r"&gt;&lt;/span&gt;&lt;span class="d y"&gt;&lt;/span&gt;&lt;span class="d g"&gt;&lt;/span&gt;&lt;span class="win-title"&gt;~/linux&lt;/span&gt;&lt;/div&gt;
        &lt;div class="win-content"&gt;
          &lt;h4&gt;Linux&lt;/h4&gt;
          &lt;p&gt;OS open-source yang fleksibel dan banyak dipakai di server, perangkat pengembangan, hingga superkomputer. Contoh: Ubuntu, Debian.&lt;/p&gt;
        &lt;/div&gt;
      &lt;/div&gt;
      &lt;div class="win-card"&gt;
        &lt;div class="win-bar"&gt;&lt;span class="d r"&gt;&lt;/span&gt;&lt;span class="d y"&gt;&lt;/span&gt;&lt;span class="d g"&gt;&lt;/span&gt;&lt;span class="win-title"&gt;mobile.apk&lt;/span&gt;&lt;/div&gt;
        &lt;div class="win-content"&gt;
          &lt;h4&gt;Android&lt;/h4&gt;
          &lt;p&gt;OS berbasis Linux untuk perangkat mobile, dikembangkan Google, digunakan oleh mayoritas smartphone di dunia.&lt;/p&gt;
        &lt;/div&gt;
      &lt;/div&gt;
      &lt;div class="win-card"&gt;
        &lt;div class="win-bar"&gt;&lt;span class="d r"&gt;&lt;/span&gt;&lt;span class="d y"&gt;&lt;/span&gt;&lt;span class="d g"&gt;&lt;/span&gt;&lt;span class="win-title"&gt;mobile.ipa&lt;/span&gt;&lt;/div&gt;
        &lt;div class="win-content"&gt;
          &lt;h4&gt;iOS&lt;/h4&gt;
          &lt;p&gt;OS buatan Apple khusus untuk iPhone, dikenal dengan ekosistem tertutup namun stabil dan aman.&lt;/p&gt;
        &lt;/div&gt;
      &lt;/div&gt;
      &lt;div class="win-card"&gt;
        &lt;div class="win-bar"&gt;&lt;span class="d r"&gt;&lt;/span&gt;&lt;span class="d y"&gt;&lt;/span&gt;&lt;span class="d g"&gt;&lt;/span&gt;&lt;span class="win-title"&gt;chrome.os&lt;/span&gt;&lt;/div&gt;
        &lt;div class="win-content"&gt;
          &lt;h4&gt;Chrome OS&lt;/h4&gt;
          &lt;p&gt;OS ringan berbasis cloud dari Google, banyak digunakan di Chromebook untuk kebutuhan belajar dan kerja ringan berbasis internet.&lt;/p&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/section&gt;

  &lt;!-- ===================== B. MANAJEMEN FILE ===================== --&gt;
  &lt;section class="section" id="manajemen-file"&gt;
    &lt;div class="section-tag"&gt;&lt;span class="num"&gt;02&lt;/span&gt; Pengelolaan Data&lt;/div&gt;
    &lt;h2 class="section-title"&gt;Manajemen File dan Folder&lt;/h2&gt;
    &lt;p&gt;Salah satu tugas penting sistem operasi adalah mengatur &lt;strong&gt;file&lt;/strong&gt; (berkas data) dan &lt;strong&gt;folder/direktori&lt;/strong&gt; (wadah untuk mengelompokkan file) agar data dapat disimpan dan ditemukan kembali dengan mudah.&lt;/p&gt;

    &lt;h3 class="sub-title"&gt;Anatomi Sebuah File&lt;/h3&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;strong&gt;Nama file&lt;/strong&gt; — identitas unik dalam satu folder, sebaiknya deskriptif dan konsisten.&lt;/li&gt;
      &lt;li&gt;&lt;strong&gt;Ekstensi file&lt;/strong&gt; — akhiran nama yang menandakan jenis/format file, misalnya &lt;span class="mono"&gt;.docx&lt;/span&gt; (dokumen), &lt;span class="mono"&gt;.xlsx&lt;/span&gt; (spreadsheet), &lt;span class="mono"&gt;.jpg&lt;/span&gt; (gambar), &lt;span class="mono"&gt;.pdf&lt;/span&gt; (dokumen portabel), &lt;span class="mono"&gt;.mp4&lt;/span&gt; (video).&lt;/li&gt;
      &lt;li&gt;&lt;strong&gt;Ukuran file&lt;/strong&gt; — kapasitas ruang yang dipakai, diukur dalam KB, MB, atau GB.&lt;/li&gt;
      &lt;li&gt;&lt;strong&gt;Path (alamat file)&lt;/strong&gt; — lokasi lengkap file dalam struktur folder, misalnya &lt;span class="mono"&gt;D:\Tugas\Informatika\laporan.docx&lt;/span&gt;.&lt;/li&gt;
    &lt;/ul&gt;

    &lt;h3 class="sub-title"&gt;Struktur Folder (Hierarki)&lt;/h3&gt;
    &lt;p&gt;Folder disusun secara berjenjang seperti pohon terbalik — satu folder utama dapat memiliki banyak subfolder, dan setiap subfolder dapat menyimpan file maupun subfolder lain di dalamnya.&lt;/p&gt;
    &lt;div class="tree-frame"&gt;
      &lt;div class="tree"&gt;
        &lt;div class="lvl0"&gt;&lt;span class="folder-name"&gt;Tugas Sekolah&lt;/span&gt;&lt;/div&gt;
        &lt;div class="lvl1"&gt;&lt;span class="folder-name"&gt;Informatika&lt;/span&gt;&lt;/div&gt;
        &lt;div class="lvl2"&gt;&lt;span class="file-name"&gt;materi-sistem-operasi.pdf&lt;/span&gt;&lt;/div&gt;
        &lt;div class="lvl2 last"&gt;&lt;span class="file-name"&gt;tugas-kelompok.docx&lt;/span&gt;&lt;/div&gt;
        &lt;div class="lvl1"&gt;&lt;span class="folder-name"&gt;Matematika&lt;/span&gt;&lt;/div&gt;
        &lt;div class="lvl2 last"&gt;&lt;span class="file-name"&gt;latihan-soal.pdf&lt;/span&gt;&lt;/div&gt;
        &lt;div class="lvl1"&gt;&lt;span class="folder-name"&gt;Bahasa Indonesia&lt;/span&gt;&lt;/div&gt;
        &lt;div class="lvl2 last"&gt;&lt;span class="file-name"&gt;esai-argumentatif.docx&lt;/span&gt;&lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;

    &lt;h3 class="sub-title"&gt;Operasi Dasar Pengelolaan File&lt;/h3&gt;
    &lt;ul style="columns:2;"&gt;
      &lt;li&gt;&lt;strong&gt;Create&lt;/strong&gt; — membuat file/folder baru&lt;/li&gt;
      &lt;li&gt;&lt;strong&gt;Rename&lt;/strong&gt; — mengganti nama&lt;/li&gt;
      &lt;li&gt;&lt;strong&gt;Copy&lt;/strong&gt; — menggandakan&lt;/li&gt;
      &lt;li&gt;&lt;strong&gt;Move&lt;/strong&gt; — memindahkan lokasi&lt;/li&gt;
      &lt;li&gt;&lt;strong&gt;Delete&lt;/strong&gt; — menghapus&lt;/li&gt;
      &lt;li&gt;&lt;strong&gt;Compress&lt;/strong&gt; — memampatkan (mis. .zip)&lt;/li&gt;
    &lt;/ul&gt;

    &lt;div class="callout"&gt;
      &lt;div class="lbl"&gt;Praktik Baik&lt;/div&gt;
      &lt;p style="margin:0;"&gt;Gunakan penamaan file yang konsisten dan deskriptif, misalnya &lt;span class="mono"&gt;Laporan_Praktikum_Bab3_v1.docx&lt;/span&gt;, serta kelompokkan file ke dalam folder bertema agar mudah ditemukan kembali — bukan menumpuk semua file langsung di Desktop.&lt;/p&gt;
    &lt;/div&gt;
  &lt;/section&gt;

  &lt;!-- ===================== C. MEDIA PENYIMPANAN ===================== --&gt;
  &lt;section class="section" id="penyimpanan"&gt;
    &lt;div class="section-tag"&gt;&lt;span class="num"&gt;03&lt;/span&gt; Perangkat Simpan&lt;/div&gt;
    &lt;h2 class="section-title"&gt;Media Penyimpanan&lt;/h2&gt;
    &lt;p&gt;File dan folder yang dikelola sistem operasi pada akhirnya disimpan secara fisik maupun virtual pada media penyimpanan berikut.&lt;/p&gt;

    &lt;table class="compare"&gt;
      &lt;tr&gt;&lt;th&gt;Jenis&lt;/th&gt;&lt;th&gt;Contoh&lt;/th&gt;&lt;th&gt;Karakteristik&lt;/th&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Penyimpanan Internal&lt;/td&gt;&lt;td&gt;HDD (Hard Disk Drive), SSD (Solid State Drive)&lt;/td&gt;&lt;td&gt;Terpasang permanen di dalam perangkat; SSD jauh lebih cepat namun lebih mahal per GB dibanding HDD.&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Penyimpanan Removable&lt;/td&gt;&lt;td&gt;Flashdisk, memory card (microSD), HDD eksternal&lt;/td&gt;&lt;td&gt;Portabel, mudah dipindah antar perangkat, namun rawan hilang atau rusak fisik.&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Penyimpanan Cloud&lt;/td&gt;&lt;td&gt;Google Drive, OneDrive, Dropbox, iCloud&lt;/td&gt;&lt;td&gt;Data tersimpan di server internet, dapat diakses dari mana saja selama terhubung internet.&lt;/td&gt;&lt;/tr&gt;
    &lt;/table&gt;
  &lt;/section&gt;

  &lt;!-- ===================== D. CLOUD STORAGE ===================== --&gt;
  &lt;section class="section" id="cloud"&gt;
    &lt;div class="section-tag"&gt;&lt;span class="num"&gt;04&lt;/span&gt; Penyimpanan Modern&lt;/div&gt;
    &lt;h2 class="section-title"&gt;Penyimpanan Cloud (Cloud Storage)&lt;/h2&gt;
    &lt;p&gt;&lt;strong&gt;Cloud storage&lt;/strong&gt; adalah layanan penyimpanan data yang menempatkan file pada server jarak jauh milik penyedia layanan, bukan pada perangkat milik pengguna sendiri. File yang disimpan di cloud dapat diakses, diedit, dan dibagikan dari perangkat mana pun yang terhubung ke internet.&lt;/p&gt;

    &lt;h3 class="sub-title"&gt;Cara Kerja Cloud Storage&lt;/h3&gt;
    &lt;div class="diagram-frame"&gt;
      &lt;svg viewBox="0 0 800 300" xmlns="http://www.w3.org/2000/svg"&gt;
        &lt;text x="400" y="28" text-anchor="middle" fill="#55647A" font-family="IBM Plex Mono, monospace" font-size="12" letter-spacing="2"&gt;SINKRONISASI PERANGKAT LOKAL &amp;amp; CLOUD&lt;/text&gt;

        &lt;!-- laptop --&gt;
        &lt;rect x="60" y="90" width="150" height="95" rx="6" fill="none" stroke="#2E3440" stroke-width="1.5"/&gt;
        &lt;text x="135" y="122" text-anchor="middle" fill="#2E3440" font-family="IBM Plex Mono, monospace" font-weight="700" font-size="12"&gt;Laptop&lt;/text&gt;
        &lt;text x="135" y="145" text-anchor="middle" fill="#55647A" font-family="IBM Plex Mono, monospace" font-size="9"&gt;file lokal&lt;/text&gt;
        &lt;rect x="85" y="155" width="100" height="16" fill="none" stroke="#7C8798" stroke-width="1"/&gt;

        &lt;!-- smartphone --&gt;
        &lt;rect x="60" y="205" width="150" height="70" rx="6" fill="none" stroke="#2E3440" stroke-width="1.5"/&gt;
        &lt;text x="135" y="232" text-anchor="middle" fill="#2E3440" font-family="IBM Plex Mono, monospace" font-weight="700" font-size="12"&gt;Smartphone&lt;/text&gt;
        &lt;text x="135" y="252" text-anchor="middle" fill="#55647A" font-family="IBM Plex Mono, monospace" font-size="9"&gt;app cloud storage&lt;/text&gt;

        &lt;!-- cloud --&gt;
        &lt;g transform="translate(430,60)"&gt;
          &lt;path d="M50 90 a40 40 0 0 1 0-80 a50 50 0 0 1 96-14 a36 36 0 0 1 4 94 z" fill="none" stroke="#3B82C4" stroke-width="2"/&gt;
          &lt;text x="90" y="52" text-anchor="middle" fill="#2A5F8F" font-family="IBM Plex Mono, monospace" font-weight="700" font-size="13"&gt;CLOUD&lt;/text&gt;
          &lt;text x="90" y="70" text-anchor="middle" fill="#3B82C4" font-family="IBM Plex Mono, monospace" font-size="9"&gt;server penyedia layanan&lt;/text&gt;
        &lt;/g&gt;

        &lt;!-- arrows --&gt;
        &lt;line class="signal" x1="210" y1="130" x2="440" y2="110" stroke="#3B82C4" stroke-width="2"/&gt;
        &lt;line class="signal" x1="210" y1="240" x2="440" y2="150" stroke="#3B82C4" stroke-width="2"/&gt;

        &lt;text x="580" y="235" text-anchor="middle" fill="#55647A" font-family="IBM Plex Mono, monospace" font-size="10"&gt;Sinkron otomatis via internet —&lt;/text&gt;
        &lt;text x="580" y="252" text-anchor="middle" fill="#55647A" font-family="IBM Plex Mono, monospace" font-size="10"&gt;perubahan di satu perangkat&lt;/text&gt;
        &lt;text x="580" y="269" text-anchor="middle" fill="#55647A" font-family="IBM Plex Mono, monospace" font-size="10"&gt;otomatis muncul di perangkat lain&lt;/text&gt;
      &lt;/svg&gt;
      &lt;div class="diagram-caption"&gt;File yang diunggah dari satu perangkat langsung tersinkronisasi ke semua perangkat lain yang masuk ke akun cloud yang sama.&lt;/div&gt;
    &lt;/div&gt;

    &lt;h3 class="sub-title"&gt;Contoh Layanan Cloud Storage&lt;/h3&gt;
    &lt;div class="card-grid"&gt;
      &lt;div class="win-card"&gt;&lt;div class="win-bar"&gt;&lt;span class="d r"&gt;&lt;/span&gt;&lt;span class="d y"&gt;&lt;/span&gt;&lt;span class="d g"&gt;&lt;/span&gt;&lt;span class="win-title"&gt;drive.google.com&lt;/span&gt;&lt;/div&gt;&lt;div class="win-content"&gt;&lt;h4&gt;Google Drive&lt;/h4&gt;&lt;p&gt;Terintegrasi dengan akun Google dan Google Docs/Sheets/Slides untuk kolaborasi real-time.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
      &lt;div class="win-card"&gt;&lt;div class="win-bar"&gt;&lt;span class="d r"&gt;&lt;/span&gt;&lt;span class="d y"&gt;&lt;/span&gt;&lt;span class="d g"&gt;&lt;/span&gt;&lt;span class="win-title"&gt;onedrive.live.com&lt;/span&gt;&lt;/div&gt;&lt;div class="win-content"&gt;&lt;h4&gt;OneDrive&lt;/h4&gt;&lt;p&gt;Layanan cloud dari Microsoft, terhubung erat dengan Windows dan aplikasi Office.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
      &lt;div class="win-card"&gt;&lt;div class="win-bar"&gt;&lt;span class="d r"&gt;&lt;/span&gt;&lt;span class="d y"&gt;&lt;/span&gt;&lt;span class="d g"&gt;&lt;/span&gt;&lt;span class="win-title"&gt;dropbox.com&lt;/span&gt;&lt;/div&gt;&lt;div class="win-content"&gt;&lt;h4&gt;Dropbox&lt;/h4&gt;&lt;p&gt;Salah satu pionir cloud storage, dikenal dengan fitur sinkronisasi dan berbagi file yang sederhana.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
    &lt;/div&gt;

    &lt;h3 class="sub-title"&gt;Kelebihan &amp; Tantangan Cloud Storage&lt;/h3&gt;
    &lt;table class="compare"&gt;
      &lt;tr&gt;&lt;th&gt;Kelebihan&lt;/th&gt;&lt;th&gt;Tantangan&lt;/th&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Dapat diakses dari mana saja dan kapan saja selama ada internet&lt;/td&gt;&lt;td&gt;Membutuhkan koneksi internet untuk sinkronisasi&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Memudahkan kolaborasi dan berbagi file dengan orang lain&lt;/td&gt;&lt;td&gt;Kapasitas gratis terbatas, perlu berlangganan untuk kapasitas lebih besar&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Berfungsi sebagai cadangan (backup) jika perangkat lokal rusak/hilang&lt;/td&gt;&lt;td&gt;Perlu diperhatikan pengaturan privasi dan keamanan berbagi file&lt;/td&gt;&lt;/tr&gt;
    &lt;/table&gt;
  &lt;/section&gt;

  &lt;!-- ===================== E. HUBUNGAN ===================== --&gt;
  &lt;section class="section" id="hubungan"&gt;
    &lt;div class="section-tag"&gt;&lt;span class="num"&gt;05&lt;/span&gt; Keterkaitan&lt;/div&gt;
    &lt;h2 class="section-title"&gt;Hubungan Antar Konsep&lt;/h2&gt;
    &lt;p&gt;Sistem operasi, manajemen file, media penyimpanan, dan cloud storage bekerja sebagai satu rangkaian yang saling melengkapi:&lt;/p&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;strong&gt;Sistem operasi&lt;/strong&gt; menyediakan alat (file manager) untuk mengelola file dan folder.&lt;/li&gt;
      &lt;li&gt;&lt;strong&gt;File dan folder&lt;/strong&gt; yang dikelola tersebut pada akhirnya disimpan secara fisik pada &lt;strong&gt;media penyimpanan&lt;/strong&gt; — baik internal, removable, maupun cloud.&lt;/li&gt;
      &lt;li&gt;&lt;strong&gt;Cloud storage&lt;/strong&gt; memperluas kapasitas dan fleksibilitas penyimpanan, memungkinkan file yang sama diakses dari berbagai perangkat dan sistem operasi yang berbeda.&lt;/li&gt;
      &lt;li&gt;Ketiganya membentuk fondasi produktivitas digital: tanpa manajemen file yang baik, kapasitas penyimpanan sebesar apa pun akan sulit dimanfaatkan secara efektif.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/section&gt;

  &lt;!-- ===================== F. RANGKUMAN ===================== --&gt;
  &lt;section class="section" id="rangkuman"&gt;
    &lt;div class="section-tag"&gt;&lt;span class="num"&gt;06&lt;/span&gt; Penguatan Konsep&lt;/div&gt;
    &lt;h2 class="section-title"&gt;Rangkuman Materi&lt;/h2&gt;
    &lt;div class="summary-box"&gt;
      &lt;h4&gt;Poin-Poin Kunci&lt;/h4&gt;
      &lt;ul&gt;
        &lt;li&gt;Sistem operasi mengatur proses, memori, perangkat keras, file, dan antarmuka pengguna.&lt;/li&gt;
        &lt;li&gt;Contoh sistem operasi: Windows, macOS, Linux, Android, iOS, dan Chrome OS.&lt;/li&gt;
        &lt;li&gt;File memiliki nama, ekstensi, ukuran, dan path; folder menyusun file dalam struktur hierarki.&lt;/li&gt;
        &lt;li&gt;Operasi dasar pengelolaan file meliputi create, rename, copy, move, delete, dan compress.&lt;/li&gt;
        &lt;li&gt;Media penyimpanan terbagi atas internal (HDD/SSD), removable (flashdisk, HDD eksternal), dan cloud.&lt;/li&gt;
        &lt;li&gt;Cloud storage menyimpan file di server internet dan mensinkronkannya ke seluruh perangkat pengguna.&lt;/li&gt;
        &lt;li&gt;Cloud storage memudahkan akses dan kolaborasi, namun bergantung pada koneksi internet dan kuota penyimpanan.&lt;/li&gt;
        &lt;li&gt;Sistem operasi, manajemen file, dan cloud storage saling melengkapi dalam mendukung pekerjaan digital.&lt;/li&gt;
      &lt;/ul&gt;
    &lt;/div&gt;
  &lt;/section&gt;

  &lt;!-- ===================== TUGAS KELOMPOK ===================== --&gt;
  &lt;section class="section" id="tugas"&gt;
    &lt;div class="section-tag"&gt;&lt;span class="num"&gt;07&lt;/span&gt; Aktivitas Belajar&lt;/div&gt;
    &lt;h2 class="section-title"&gt;Tugas Kelompok&lt;/h2&gt;

    &lt;div class="task-panel"&gt;
      &lt;div class="task-head"&gt;
        &lt;span class="badge"&gt;Kerja Kelompok · 4–5 orang&lt;/span&gt;
        &lt;span class="badge" style="background:var(--chrome);"&gt;45 menit diskusi + 25 menit presentasi&lt;/span&gt;
      &lt;/div&gt;
      &lt;h3&gt;Membangun Struktur Folder &amp; Ekosistem Cloud Storage Kelompok&lt;/h3&gt;
      &lt;p&gt;Setiap kelompok merancang struktur folder digital untuk sebuah proyek belajar, kemudian mengimplementasikannya pada salah satu layanan cloud storage dan mempraktikkan cara berbagi file antar anggota.&lt;/p&gt;

      &lt;ol class="steps-num"&gt;
        &lt;li&gt;&lt;strong&gt;Bentuk kelompok&lt;/strong&gt; beranggotakan 4–5 orang dan pilih satu layanan cloud storage yang akan digunakan (Google Drive, OneDrive, atau Dropbox).&lt;/li&gt;
        &lt;li&gt;&lt;strong&gt;Rancang struktur folder&lt;/strong&gt; untuk proyek "Portofolio Belajar Semester Ini" dengan minimal 1 folder utama dan 3 subfolder bertema (mis. per mata pelajaran atau per jenis tugas).&lt;/li&gt;
        &lt;li&gt;&lt;strong&gt;Buat struktur folder tersebut&lt;/strong&gt; di akun cloud storage kelompok, lalu unggah minimal 3 contoh file ke dalamnya.&lt;/li&gt;
        &lt;li&gt;&lt;strong&gt;Atur pengaturan berbagi (sharing)&lt;/strong&gt; agar seluruh anggota kelompok dapat mengakses dan mengedit folder bersama.&lt;/li&gt;
        &lt;li&gt;&lt;strong&gt;Dokumentasikan prosesnya&lt;/strong&gt; dalam bentuk tangkapan layar (screenshot) struktur folder dan pengaturan berbagi.&lt;/li&gt;
        &lt;li&gt;&lt;strong&gt;Diskusikan dan tuliskan perbandingan&lt;/strong&gt;: kelebihan dan kekurangan menyimpan tugas di penyimpanan lokal (flashdisk/laptop) dibandingkan di cloud storage untuk skenario kerja kelompok.&lt;/li&gt;
        &lt;li&gt;&lt;strong&gt;Presentasikan&lt;/strong&gt; struktur folder, hasil dokumentasi, dan kesimpulan perbandingan di depan kelas selama maksimal 5 menit per kelompok.&lt;/li&gt;
      &lt;/ol&gt;

      &lt;h3 class="sub-title" style="margin-top:26px;"&gt;Format Laporan&lt;/h3&gt;
      &lt;p&gt;Laporan memuat: (1) nama layanan cloud &amp; anggota kelompok, (2) skema/daftar struktur folder yang dirancang, (3) tangkapan layar folder dan pengaturan berbagi di cloud, (4) tabel perbandingan penyimpanan lokal vs cloud.&lt;/p&gt;

      &lt;h3 class="sub-title"&gt;Rubrik Penilaian&lt;/h3&gt;
      &lt;table class="rubrik"&gt;
        &lt;tr&gt;&lt;th&gt;Aspek&lt;/th&gt;&lt;th&gt;Indikator&lt;/th&gt;&lt;th&gt;Skor Maks.&lt;/th&gt;&lt;/tr&gt;
        &lt;tr&gt;&lt;td&gt;Struktur Folder&lt;/td&gt;&lt;td&gt;Struktur folder logis, bertingkat, dan sesuai tema proyek&lt;/td&gt;&lt;td&gt;25&lt;/td&gt;&lt;/tr&gt;
        &lt;tr&gt;&lt;td&gt;Implementasi di Cloud&lt;/td&gt;&lt;td&gt;Folder dan file berhasil dibuat serta diunggah ke layanan cloud yang dipilih&lt;/td&gt;&lt;td&gt;25&lt;/td&gt;&lt;/tr&gt;
        &lt;tr&gt;&lt;td&gt;Pengaturan Berbagi&lt;/td&gt;&lt;td&gt;Pengaturan sharing tepat sehingga seluruh anggota dapat mengakses&lt;/td&gt;&lt;td&gt;20&lt;/td&gt;&lt;/tr&gt;
        &lt;tr&gt;&lt;td&gt;Analisis Perbandingan&lt;/td&gt;&lt;td&gt;Perbandingan lokal vs cloud logis, relevan, dan didukung alasan yang jelas&lt;/td&gt;&lt;td&gt;15&lt;/td&gt;&lt;/tr&gt;
        &lt;tr&gt;&lt;td&gt;Kerja Sama &amp; Presentasi&lt;/td&gt;&lt;td&gt;Seluruh anggota berkontribusi; presentasi jelas dan percaya diri&lt;/td&gt;&lt;td&gt;15&lt;/td&gt;&lt;/tr&gt;
        &lt;tr&gt;&lt;td colspan="2" style="text-align:right; font-weight:600;"&gt;Total&lt;/td&gt;&lt;td&gt;100&lt;/td&gt;&lt;/tr&gt;
      &lt;/table&gt;
    &lt;/div&gt;

    &lt;div class="closing-task"&gt;
      &lt;div class="lbl"&gt;Penutup Pembelajaran · Tugas Individu&lt;/div&gt;
      &lt;p style="margin:0;"&gt;&lt;strong&gt;Tulislah satu kesimpulan ringkas (5–7 kalimat) di buku catatan kalian masing-masing&lt;/strong&gt;, yang merangkum keseluruhan materi hari ini: fungsi sistem operasi, cara mengelola file dan folder, jenis-jenis media penyimpanan, serta peran dan cara kerja cloud storage dalam mendukung pekerjaan digital. Tulis dengan bahasa dan pemahaman kalian sendiri, bukan menyalin ulang materi.&lt;/p&gt;
    &lt;/div&gt;
  &lt;/section&gt;

&lt;/main&gt;

&lt;footer&gt;
  INFORMATIKA · SISTEM OPERASI, MANAJEMEN FILE &amp; PENYIMPANAN CLOUD · FASE E KELAS X SMK
&lt;/footer&gt;

&lt;/body&gt;
&lt;/html&gt;</description><link>http://kitab-investasi.blogspot.com/2026/08/sistem-operasi-manajemen-file.html</link><thr:total>0</thr:total><author>nof_rizal07@yahoo.co.id (abang_cool)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-9000860041661554971.post-4375210522487967607</guid><pubDate>Tue, 04 Aug 2026 02:25:41 +0000</pubDate><atom:updated>2026-08-04T09:25:41.044+07:00</atom:updated><title>sertifikat kombel</title><description>&lt;!DOCTYPE html&gt;
&lt;html lang="id"&gt;
&lt;head&gt;
&lt;meta charset="UTF-8"&gt;
&lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&gt;
&lt;title&gt;Generator Sertifikat&lt;/title&gt;

&lt;link href="https://fonts.googleapis.com/css2?family=Montserrat:wght@700&amp;display=swap" rel="stylesheet"&gt;

&lt;script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/2.5.1/jspdf.umd.min.js"&gt;&lt;/script&gt;

&lt;style&gt;

body{
    font-family:Arial,sans-serif;
    background:#eef2f7;
    padding:20px;
    max-width:700px;
    margin:auto;
}

.card{
    background:white;
    padding:24px;
    border-radius:20px;
    box-shadow:0 10px 20px rgba(0,0,0,.1);
}

h2{
    text-align:center;
    color:#1e4668;
}

.confirm-box{
    background:#f0f6ff;
    border-left:5px solid #2c7da0;
    padding:16px;
    border-radius:16px;
    margin-bottom:20px;
    text-align:center;
}

.confirm-box p{
    margin-top:0;
    font-weight:bold;
    color:#1e4668;
}

.confirm-buttons{
    display:flex;
    gap:10px;
    margin-top:10px;
}

.confirm-buttons button{
    flex:1;
}

.yes-btn{
    background:#1f8a4c;
}

.yes-btn:hover{
    background:#166638;
}

.no-btn{
    background:#c0392b;
}

.no-btn:hover{
    background:#962d22;
}

input,select,button{
    width:100%;
    padding:12px;
    margin-top:10px;
    border-radius:12px;
    border:1px solid #ccc;
    font-size:16px;
}

button{
    background:#2c7da0;
    color:white;
    border:none;
    cursor:pointer;
    font-weight:bold;
}

button:hover{
    background:#1f5e7a;
}

button:disabled{
    background:#94a3b8;
    cursor:not-allowed;
}

input:disabled,
select:disabled{
    background:#f1f5f9;
}

#preview{
    width:100%;
    border-radius:12px;
    margin-top:10px;
}

.loading{
    display:none;
    margin-top:15px;
    color:#1e4668;
    font-weight:bold;
    text-align:center;
}

.status{
    margin-top:12px;
    font-weight:bold;
}

.success{
    color:#1f8a4c;
}

.error{
    color:#c0392b;
}

&lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;

&lt;div class="card"&gt;

&lt;h2&gt;&#128220; Generator Sertifikat&lt;/h2&gt;

&lt;!-- ================= KONFIRMASI ================= --&gt;

&lt;div class="confirm-box"&gt;

&lt;p&gt;&#128269; Apakah Anda mengikuti pelatihan?&lt;/p&gt;

&lt;div class="confirm-buttons"&gt;

&lt;button class="yes-btn" onclick="confirmIkut()"&gt;
✅ YA, IKUT
&lt;/button&gt;

&lt;button class="no-btn" onclick="confirmTidakIkut()"&gt;
❌ TIDAK
&lt;/button&gt;

&lt;/div&gt;

&lt;div id="statusKonfirmasi" class="status"&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;!-- ================= FORM ================= --&gt;

&lt;label&gt;Nama Lengkap&lt;/label&gt;

&lt;input
type="text"
id="nama"
placeholder="Contoh: Ahmad Fauzi"
disabled&gt;

&lt;label&gt;Peran&lt;/label&gt;

&lt;select id="peran" disabled&gt;
    &lt;option&gt;Peserta&lt;/option&gt;
    &lt;option&gt;Narasumber&lt;/option&gt;
&lt;/select&gt;

&lt;img
id="preview"
src="https://lh3.googleusercontent.com/d/1uGWwV5s0sYXgquBcnrH5_jyIFYnyMTHz"
alt="Template"&gt;

&lt;button
id="downloadBtn"
onclick="generatePDF()"
disabled&gt;

⬇️ UNDUH PDF

&lt;/button&gt;

&lt;div class="loading" id="loading"&gt;
Memproses PDF...
&lt;/div&gt;

&lt;/div&gt;

&lt;script&gt;

// ================= TEMPLATE (DIUBAH) =================

const FILE_ID =
'1uGWwV5s0sYXgquBcnrH5_jyIFYnyMTHz';  // &lt;-- ID baru

const TEMPLATE_URL =
`https://lh3.googleusercontent.com/d/${FILE_ID}`;

// ================= UTIL =================

function showLoading(show){

    document.getElementById('loading').style.display =
        show ? 'block' : 'none';

}

function getRomanMonth(monthIndex){

    const romawi = [
        "I","II","III","IV","V","VI",
        "VII","VIII","IX","X","XI","XII"
    ];

    return romawi[monthIndex];

}

function capitalizeEachWord(text){

    return text
        .toLowerCase()
        .replace(/\b\w/g,c=&gt;c.toUpperCase());

}

// ================= KONFIRMASI =================

function confirmIkut(){

    document.getElementById('nama').disabled = false;

    document.getElementById('peran').disabled = false;

    document.getElementById('downloadBtn').disabled = false;

    document.getElementById('statusKonfirmasi').innerHTML =
        '&lt;span class="success"&gt;✅ Konfirmasi diterima. Anda dapat mengunduh sertifikat.&lt;/span&gt;';

}

function confirmTidakIkut(){

    document.getElementById('nama').disabled = true;

    document.getElementById('peran').disabled = true;

    document.getElementById('downloadBtn').disabled = true;

    document.getElementById('statusKonfirmasi').innerHTML =
        '&lt;span class="error"&gt;❌ Anda tidak dapat mengunduh sertifikat.&lt;/span&gt;';

}

// ================= LOAD IMAGE =================

function loadImage(url){

    return new Promise((resolve,reject)=&gt;{

        const img = new Image();

        img.crossOrigin = "anonymous";

        img.onload = ()=&gt;resolve(img);

        img.onerror = ()=&gt;{

            reject(
                new Error(
                    'Template Google Drive gagal dimuat'
                )
            );

        };

        img.src = url + '?t=' + Date.now();

    });

}

// ================= NOMOR =================

async function generateNomor(){

    const now = new Date();

    const bulan =
        getRomanMonth(now.getMonth());

    const tahun =
        now.getFullYear();

    const nomor =
        Math.floor(Math.random()*900)+100;

    return `${nomor}/K/${bulan}/${tahun}`;

}

// ================= PDF =================

async function generatePDF(){

    const namaInput =
        document.getElementById('nama');

    const peranSelect =
        document.getElementById('peran');

    let nama =
        namaInput.value.trim();

    const peran =
        peranSelect.value;

    if(!nama){

        alert('Nama wajib diisi');

        return;

    }

    nama =
        capitalizeEachWord(nama);

    showLoading(true);

    try{

        await document.fonts.ready;

        const img =
            await loadImage(TEMPLATE_URL);

        const canvas =
            document.createElement('canvas');

        canvas.width = img.width;
        canvas.height = img.height;

        const ctx =
            canvas.getContext('2d');

        ctx.drawImage(
            img,
            0,
            0,
            canvas.width,
            canvas.height
        );

        // ================= POSISI =================

        const nomorY =
            canvas.height * 0.235;

        const namaY =
            canvas.height * 0.3990;

        const peranY =
            canvas.height * 0.5420;

        // ================= STYLE =================

        ctx.textAlign = 'center';

        ctx.textBaseline = 'middle';

        ctx.fillStyle = '#000';

        // nomor
        const nomorSertifikat =
            await generateNomor();

        ctx.font =
            `bold ${canvas.width*0.0125}px Montserrat`;

        ctx.fillText(
            nomorSertifikat,
            canvas.width/2,
            nomorY
        );

        // nama auto shrink
        let fontSize =
            canvas.width * 0.031;

        ctx.font =
            `700 ${fontSize}px Montserrat`;

        let textWidth =
            ctx.measureText(nama).width;

        const maxWidth =
            canvas.width - 180;

        while(
            textWidth &gt; maxWidth &amp;&amp;
            fontSize &gt; 20
        ){

            fontSize -= 2;

            ctx.font =
                `700 ${fontSize}px Montserrat`;

            textWidth =
                ctx.measureText(nama).width;

        }

        ctx.fillText(
            nama,
            canvas.width/2,
            namaY
        );

        // peran
        ctx.font =
            `bold ${canvas.width*0.024}px Montserrat`;

        ctx.fillText(
            peran,
            canvas.width/2,
            peranY
        );

        // ================= PDF =================

        const imageData =
            canvas.toDataURL(
                'image/jpeg',
                1.0
            );

        const { jsPDF } =
            window.jspdf;

        const pdf =
            new jsPDF({

                orientation:
                    canvas.width &gt; canvas.height
                    ? 'landscape'
                    : 'portrait',

                unit:'px',

                format:[
                    canvas.width,
                    canvas.height
                ]

            });

        pdf.addImage(
            imageData,
            'JPEG',
            0,
            0,
            canvas.width,
            canvas.height
        );

        const safeName =
            nama.replace(/[^a-z0-9]/gi,'_');

        pdf.save(
            `Sertifikat_${safeName}.pdf`
        );

    }catch(error){

        console.error(error);

        alert(
            '❌ Gagal membuat PDF\n\n' +
            error.message +
            '\n\nPastikan file Google Drive bersifat PUBLIC.'
        );

    }finally{

        showLoading(false);

    }

}

&lt;/script&gt;

&lt;/body&gt;
&lt;/html&gt;</description><link>http://kitab-investasi.blogspot.com/2026/08/sertifikat-kombel.html</link><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://lh3.googleusercontent.com/d/1uGWwV5s0sYXgquBcnrH5_jyIFYnyMTHz=s72-c" width="72"/><thr:total>0</thr:total><author>nof_rizal07@yahoo.co.id (abang_cool)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-9000860041661554971.post-639845434598151534</guid><pubDate>Tue, 04 Aug 2026 00:35:15 +0000</pubDate><atom:updated>2026-08-04T07:38:59.337+07:00</atom:updated><title>Kaidah Kebahasaan Teks Prosedur (Bagian 1)</title><description>&lt;style&gt;
@import url('https://fonts.googleapis.com/css2?family=Oswald:wght@400;500;600;700&amp;family=Source+Sans+3:wght@400;500;600;700&amp;family=IBM+Plex+Mono:wght@400;500;600&amp;display=swap');
.epb{
  --blueprint:#0F2A3D;
  --blueprint-deep:#0A1E2C;
  --panel:#4A2E12;
  --paper:#F3F0E6;
  --ink:#132029;
  --amber:#F5A623;
  --amber-deep:#C97F12;
  --mint:#6EC6CA;
  --line:rgba(234,242,245,0.16);
  --off-white:#EAF2F5;
  --muted:#9FB4C2;
}
.epb *{box-sizing:border-box;}
.epb{scroll-behavior:smooth; background:#0A1F2E;}
.epb{
  margin:0;
  position:relative;
  overflow:hidden;
  background:var(--blueprint);
  color:var(--off-white);
  font-family:'Source Sans 3',sans-serif;
  line-height:1.65;
  background-image:
    linear-gradient(var(--line) 1px, transparent 1px),
    linear-gradient(90deg, var(--line) 1px, transparent 1px);
  background-size: 34px 34px;
}
.epb h1, .epb h2, .epb h3, .epb h4{font-family:'Oswald',sans-serif; text-transform:uppercase; letter-spacing:0.02em; margin:0 0 0.5em;}
.epb .mono{font-family:'IBM Plex Mono',monospace;}
.epb a{color:var(--amber);}
.epb .crop{position:absolute; width:22px; height:22px; z-index:5; opacity:.55; pointer-events:none;}
.epb .crop::before, .epb .crop::after{content:"";position:absolute;background:var(--mint);}
.epb .crop::before{width:100%;height:1px;top:50%;left:0;}
.epb .crop::after{width:1px;height:100%;left:50%;top:0;}
.epb .crop.tl{top:14px;left:14px;}
.epb .crop.tr{top:14px;right:14px;}
.epb .crop.bl{bottom:14px;left:14px;}
.epb .crop.br{bottom:14px;right:14px;}
.epb header.cover{
  position:relative;
  padding:40px 24px 36px;
  border-bottom:1px solid var(--line);
  overflow:hidden;
}
.epb .doc-code{font-family:'IBM Plex Mono',monospace; color:var(--amber); letter-spacing:0.15em; font-size:0.78rem; text-transform:uppercase; margin-bottom:18px; display:flex; gap:10px; align-items:center;}
.epb .doc-code::before{content:"◆"; color:var(--amber);}
.epb .cover h1{font-size:clamp(1.6rem,7vw,2.5rem); color:var(--off-white); max-width:16ch; line-height:1.05;}
.epb .cover .subtitle{color:var(--muted); font-size:1.05rem; max-width:60ch; margin-top:14px;}
.epb .meta-strip{
  margin-top:38px; display:grid; grid-template-columns:repeat(auto-fit,minmax(150px,1fr));
  border-top:1px dashed var(--line); border-bottom:1px dashed var(--line);
}
.epb .meta-strip div{padding:14px 16px; border-right:1px dashed var(--line);}
.epb .meta-strip div:last-child{border-right:none;}
.epb .meta-strip .k{font-family:'IBM Plex Mono',monospace; font-size:0.68rem; color:var(--amber); text-transform:uppercase; letter-spacing:0.1em;}
.epb .meta-strip .v{font-size:0.98rem; color:var(--off-white); margin-top:4px; font-weight:600;}
.epb .stamp{
  position:absolute; top:40px; right:20px; width:104px; height:104px;
  border:2.5px solid var(--amber); border-radius:50%;
  display:flex; align-items:center; justify-content:center;
  transform:rotate(-11deg);
  color:var(--amber); font-family:'IBM Plex Mono',monospace;
  text-align:center; font-size:0.62rem; letter-spacing:0.08em; text-transform:uppercase;
  opacity:0.9;
}
.epb .stamp .ring{position:absolute; inset:8px; border:1px dashed var(--amber); border-radius:50%;}
.epb .stamp b{display:block; font-family:'Oswald',sans-serif; font-size:1.05rem; letter-spacing:0.06em; margin-top:4px;}

@media (max-width:760px){.epb .stamp{display:none;}
.epb }


.epb main{max-width:920px; margin:0 auto; padding:0 20px 60px;}
.epb .section{padding-top:64px;}
.epb .eyebrow{font-family:'IBM Plex Mono',monospace; color:var(--amber); font-size:0.78rem; letter-spacing:0.14em; text-transform:uppercase; margin-bottom:10px; display:flex; align-items:center; gap:10px;}
.epb .eyebrow::after{content:""; flex:1; height:1px; background:var(--line);}
.epb h2.section-title{font-size:1.7rem; color:var(--off-white);}
.epb p{color:#DDE7EC;}
.epb .lead{color:var(--muted); font-size:1.02rem; max-width:72ch;}
.epb .panel{
  background:var(--panel); border:1px solid var(--line); border-radius:2px;
  padding:26px 28px; margin:22px 0;
}
.epb .panel.tp{border-left:4px solid var(--mint);}
.epb .panel.warn{border-left:4px solid var(--amber);}
.epb .tp-box{display:grid; gap:14px; margin-top:18px;}
.epb .tp-item{display:flex; gap:14px; align-items:flex-start;}
.epb .tp-item .idx{font-family:'IBM Plex Mono',monospace; color:var(--amber); font-weight:600; min-width:34px;}
.epb .flow{display:grid; grid-template-columns:repeat(auto-fit,minmax(220px,1fr)); gap:14px; margin-top:20px;}
.epb .flow .step{background:var(--blueprint-deep); border:1px solid var(--line); padding:18px; position:relative;}
.epb .flow .step .tag{font-family:'IBM Plex Mono',monospace; color:var(--amber); font-size:0.7rem; letter-spacing:0.1em; text-transform:uppercase;}
.epb .flow .step h4{font-size:1rem; margin-top:8px; color:var(--off-white);}
.epb .flow .step .time{position:absolute; top:16px; right:16px; font-family:'IBM Plex Mono',monospace; font-size:0.7rem; color:var(--amber);}
.epb .grid-3{display:grid; grid-template-columns:repeat(auto-fit,minmax(200px,1fr)); gap:14px; margin-top:16px;}
.epb .card{background:var(--blueprint-deep); border:1px solid var(--line); padding:18px;}
.epb .card h4{color:var(--amber); font-size:0.95rem;}
.epb .criteria{display:grid; gap:16px; margin-top:20px;}
.epb .crit{
  background:var(--blueprint-deep); border:1px solid var(--line);
  display:grid; grid-template-columns:64px 1fr; gap:0;
}
.epb .crit .num{
  background:var(--amber); color:var(--blueprint-deep); font-family:'IBM Plex Mono',monospace;
  font-weight:700; display:flex; align-items:center; justify-content:center; font-size:1.05rem;
}
.epb .crit .body{padding:18px 20px;}
.epb .crit h4{color:var(--off-white); font-size:1.02rem; margin-bottom:6px;}
.epb .crit .q{margin-top:10px; padding-top:10px; border-top:1px dashed var(--line); font-family:'IBM Plex Mono',monospace; font-size:0.86rem; color:var(--amber);}
.epb .timeline{margin-top:24px; position:relative; padding-left:34px;}
.epb .timeline::before{content:""; position:absolute; left:11px; top:6px; bottom:6px; width:2px; background:var(--line);}
.epb .tl-item{position:relative; padding-bottom:26px;}
.epb .tl-item:last-child{padding-bottom:0;}
.epb .tl-item::before{content:""; position:absolute; left:-34px; top:2px; width:22px; height:22px; border-radius:50%; background:var(--blueprint); border:2px solid var(--amber);}
.epb .tl-item h4{color:var(--off-white); font-size:1rem; margin-bottom:4px;}
.epb .doc-sample{
  background:var(--paper); color:var(--ink); border-radius:2px; padding:0; margin-top:22px;
  box-shadow:0 20px 45px rgba(0,0,0,0.35);
}
.epb .doc-sample .doc-head{background:var(--ink); color:var(--paper); padding:12px 22px; font-family:'IBM Plex Mono',monospace; font-size:0.75rem; letter-spacing:0.1em; text-transform:uppercase; display:flex; justify-content:space-between;}
.epb .doc-sample .doc-body{padding:26px 28px 30px;}
.epb .doc-sample h3{font-family:'Oswald',sans-serif; color:var(--ink); font-size:1.25rem; text-transform:none; letter-spacing:0;}
.epb .doc-sample ol{padding-left:22px;}
.epb .doc-sample li{margin-bottom:9px;}
.epb .flag{
  display:inline-block; font-family:'IBM Plex Mono',monospace; font-size:0.7rem; font-weight:600;
  background:#D94E2A; color:#fff; padding:1px 7px; border-radius:2px; margin-left:6px; vertical-align:middle;
}
.epb .doc-sample .note-margin{margin-top:6px; font-family:'IBM Plex Mono',monospace; font-size:0.78rem; color:#8A3A1F; padding-left:8px; border-left:2px solid #D94E2A;}
.epb .legend{display:flex; flex-wrap:wrap; gap:10px 20px; margin-top:16px;}
.epb .legend span{font-family:'IBM Plex Mono',monospace; font-size:0.78rem; color:var(--muted); display:flex; align-items:center; gap:8px;}
.epb .legend .dot{width:10px; height:10px; border-radius:50%; display:inline-block;}
.epb table{width:100%; border-collapse:collapse; margin-top:18px; font-size:0.94rem;}
.epb th, .epb td{border:1px solid var(--line); padding:10px 12px; text-align:left; vertical-align:top;}
.epb th{background:var(--blueprint-deep); font-family:'IBM Plex Mono',monospace; font-size:0.75rem; text-transform:uppercase; letter-spacing:0.06em; color:var(--amber);}
.epb .summary-box{
  border:1px solid var(--amber); background:linear-gradient(180deg, rgba(245,166,35,0.08), transparent);
  padding:24px 26px; margin-top:24px;
}
.epb .summary-box ul{margin:10px 0 0; padding-left:20px;}
.epb .summary-box li{margin-bottom:8px;}
.epb .task-header{
  background:var(--amber); color:var(--blueprint-deep); padding:22px 26px; margin-top:20px;
  display:flex; justify-content:space-between; align-items:center; flex-wrap:wrap; gap:10px;
}
.epb .task-header h2{color:var(--blueprint-deep); font-size:1.4rem; margin:0;}
.epb .task-header .badge{font-family:'IBM Plex Mono',monospace; font-size:0.8rem; background:var(--blueprint-deep); color:var(--amber); padding:6px 12px; border-radius:2px;}
.epb .steps-num{counter-reset:step; margin-top:18px; list-style:none; padding:0;}
.epb .steps-num li{counter-increment:step; position:relative; padding-left:44px; margin-bottom:16px;}
.epb .steps-num li::before{content:counter(step,decimal-leading-zero); position:absolute; left:0; top:0; font-family:'IBM Plex Mono',monospace; color:var(--amber); font-weight:600; font-size:0.95rem; border:1px solid var(--amber); width:30px; height:26px; display:flex; align-items:center; justify-content:center;}
.epb .rubric-scale{display:grid; grid-template-columns:repeat(4,1fr); gap:10px; margin-top:16px;}
.epb .rubric-scale div{background:var(--blueprint-deep); border:1px solid var(--line); padding:12px; text-align:center;}
.epb .rubric-scale .n{font-family:'IBM Plex Mono',monospace; color:var(--amber); font-size:1.3rem; font-weight:700;}
.epb .rubric-scale .l{font-size:0.78rem; color:var(--muted); text-transform:uppercase; letter-spacing:0.05em;}
.epb .notebook{
  background:repeating-linear-gradient(var(--paper), var(--paper) 33px, #D8D3C2 34px);
  color:var(--ink); border-radius:2px; padding:28px 30px; margin-top:20px; position:relative;
  box-shadow:0 20px 45px rgba(0,0,0,0.35);
}
.epb .notebook::before{content:""; position:absolute; left:46px; top:0; bottom:0; width:1.5px; background:#C0453A; opacity:0.5;}
.epb .notebook .content{padding-left:24px;}
.epb .notebook h3{color:var(--ink); font-family:'Oswald',sans-serif; letter-spacing:0.02em; margin-bottom:10px;}
.epb .notebook ul{padding-left:20px;}
.epb footer{border-top:1px solid var(--line); padding:24px 20px 40px; color:var(--muted); font-size:0.86rem;}
.epb footer .doc-code{margin-bottom:10px;}
.epb .divider-dash{border:none; border-top:1px dashed var(--line); margin:44px 0 0;}
.epb::selection{background:var(--amber); color:var(--blueprint-deep);}

&lt;/style&gt;
&lt;div class="epb"&gt;
&lt;div class="crop tl"&gt;&lt;/div&gt;&lt;div class="crop tr"&gt;&lt;/div&gt;&lt;div class="crop bl"&gt;&lt;/div&gt;&lt;div class="crop br"&gt;&lt;/div&gt;

&lt;header class="cover"&gt;
  &lt;div class="stamp"&gt;&lt;div class="ring"&gt;&lt;/div&gt;&lt;span&gt;Modul Ajar&lt;b&gt;Terverifikasi&lt;/b&gt;Fase F&lt;/span&gt;&lt;/div&gt;
  &lt;div class="doc-code"&gt;DOK/B.INDO/XI/PROSEDUR-KAIDAH-1 — 3 JP · 1 Pertemuan&lt;/div&gt;
  &lt;h1&gt;Kaidah Kebahasaan Teks Prosedur (Bagian 1)&lt;/h1&gt;
  &lt;p class="subtitle"&gt;Materi Bahasa Indonesia Kelas XI SMK/MAK — melatih murid mengidentifikasi ciri kebahasaan teks prosedur: kalimat imperatif, deklaratif, persuasif, dan konjungsi temporal.&lt;/p&gt;

  &lt;div class="meta-strip"&gt;
    &lt;div&gt;&lt;div class="k"&gt;Mata Pelajaran&lt;/div&gt;&lt;div class="v"&gt;Bahasa Indonesia&lt;/div&gt;&lt;/div&gt;
    &lt;div&gt;&lt;div class="k"&gt;Jenjang&lt;/div&gt;&lt;div class="v"&gt;SMK/MAK — Kelas XI&lt;/div&gt;&lt;/div&gt;
    &lt;div&gt;&lt;div class="k"&gt;Elemen&lt;/div&gt;&lt;div class="v"&gt;Membaca &amp;amp; Memirsa&lt;/div&gt;&lt;/div&gt;
    &lt;div&gt;&lt;div class="k"&gt;Alokasi Waktu&lt;/div&gt;&lt;div class="v"&gt;3 JP (3 × 45 menit)&lt;/div&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/header&gt;

&lt;main&gt;

  &lt;!-- ============ TUJUAN PEMBELAJARAN ============ --&gt;
  &lt;section class="section" id="tujuan"&gt;
    &lt;div class="eyebrow"&gt;01 — Identitas Pembelajaran&lt;/div&gt;
    &lt;h2 class="section-title"&gt;Capaian &amp;amp; Tujuan Pembelajaran&lt;/h2&gt;

    &lt;div class="panel tp"&gt;
      &lt;div class="eyebrow" style="margin-bottom:6px;"&gt;Capaian Pembelajaran (Elemen Membaca–Memirsa)&lt;/div&gt;
      &lt;p&gt;Murid mampu mengidentifikasi dan menganalisis ciri kebahasaan pada berbagai jenis teks, termasuk teks prosedur, untuk memahami bagaimana bahasa digunakan secara efektif dalam menyampaikan instruksi kepada pembaca.&lt;/p&gt;
    &lt;/div&gt;

    &lt;div class="panel"&gt;
      &lt;div class="eyebrow" style="margin-bottom:6px;"&gt;Tujuan Pembelajaran&lt;/div&gt;
      &lt;p style="font-size:1.05rem; color:var(--off-white); font-weight:600;"&gt;Murid mampu mengidentifikasi ciri-ciri kebahasaan teks prosedur, seperti kalimat imperatif, deklaratif, persuasif, dan konjungsi temporal.&lt;/p&gt;

      &lt;div class="tp-box"&gt;
        &lt;div class="tp-item"&gt;&lt;span class="idx mono"&gt;TP.1&lt;/span&gt;&lt;p&gt;Murid dapat menjelaskan pengertian dan ciri kalimat imperatif dalam teks prosedur.&lt;/p&gt;&lt;/div&gt;
        &lt;div class="tp-item"&gt;&lt;span class="idx mono"&gt;TP.2&lt;/span&gt;&lt;p&gt;Murid dapat menjelaskan pengertian dan ciri kalimat deklaratif dalam teks prosedur.&lt;/p&gt;&lt;/div&gt;
        &lt;div class="tp-item"&gt;&lt;span class="idx mono"&gt;TP.3&lt;/span&gt;&lt;p&gt;Murid dapat menjelaskan pengertian dan ciri kalimat persuasif dalam teks prosedur.&lt;/p&gt;&lt;/div&gt;
        &lt;div class="tp-item"&gt;&lt;span class="idx mono"&gt;TP.4&lt;/span&gt;&lt;p&gt;Murid dapat mengidentifikasi konjungsi temporal serta menemukan keempat ciri kebahasaan tersebut dalam sebuah teks prosedur.&lt;/p&gt;&lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class="eyebrow" style="margin-top:26px; margin-bottom:6px;"&gt;8 Profil Lulusan yang Dikembangkan&lt;/div&gt;
    &lt;div class="grid-3"&gt;
      &lt;div class="card"&gt;&lt;h4&gt;Penalaran Kritis&lt;/h4&gt;&lt;p style="font-size:0.9rem;"&gt;Menganalisis fungsi setiap jenis kalimat dan konjungsi dalam teks prosedur.&lt;/p&gt;&lt;/div&gt;
      &lt;div class="card"&gt;&lt;h4&gt;Kemandirian&lt;/h4&gt;&lt;p style="font-size:0.9rem;"&gt;Menyelesaikan identifikasi dan rangkuman secara mandiri.&lt;/p&gt;&lt;/div&gt;
      &lt;div class="card"&gt;&lt;h4&gt;Kolaborasi&lt;/h4&gt;&lt;p style="font-size:0.9rem;"&gt;Bekerja sama dalam kelompok saat menganalisis ciri kebahasaan teks.&lt;/p&gt;&lt;/div&gt;
      &lt;div class="card"&gt;&lt;h4&gt;Komunikasi&lt;/h4&gt;&lt;p style="font-size:0.9rem;"&gt;Menyampaikan hasil identifikasi ciri kebahasaan secara jelas dan runtut.&lt;/p&gt;&lt;/div&gt;
    &lt;/div&gt;
  &lt;/section&gt;

  &lt;hr class="divider-dash"&gt;

  &lt;!-- ============ MATERI A: RECAP ============ --&gt;
  &lt;section class="section" id="materi-a"&gt;
    &lt;div class="eyebrow"&gt;02 — Materi Inti A&lt;/div&gt;
    &lt;h2 class="section-title"&gt;Mengingat Kembali Ciri Umum Teks Prosedur&lt;/h2&gt;
    &lt;p class="lead"&gt;Teks prosedur memiliki kaidah kebahasaan yang khas karena tujuannya mengarahkan pembaca melakukan suatu tindakan. Pada pertemuan ini, murid akan mempelajari empat ciri kebahasaan utama teks prosedur.&lt;/p&gt;

    &lt;div class="grid-3"&gt;
      &lt;div class="card"&gt;&lt;h4&gt;1. Kalimat Imperatif&lt;/h4&gt;&lt;p style="font-size:0.92rem;"&gt;Kalimat perintah yang mengarahkan pembaca melakukan tindakan.&lt;/p&gt;&lt;/div&gt;
      &lt;div class="card"&gt;&lt;h4&gt;2. Kalimat Deklaratif&lt;/h4&gt;&lt;p style="font-size:0.92rem;"&gt;Kalimat pernyataan yang menyampaikan fakta atau informasi.&lt;/p&gt;&lt;/div&gt;
      &lt;div class="card"&gt;&lt;h4&gt;3. Kalimat Persuasif&lt;/h4&gt;&lt;p style="font-size:0.92rem;"&gt;Kalimat ajakan/bujukan agar pembaca mengikuti langkah dengan sungguh-sungguh.&lt;/p&gt;&lt;/div&gt;
      &lt;div class="card"&gt;&lt;h4&gt;4. Konjungsi Temporal&lt;/h4&gt;&lt;p style="font-size:0.92rem;"&gt;Kata penghubung yang menandai urutan waktu antarlangkah.&lt;/p&gt;&lt;/div&gt;
    &lt;/div&gt;
  &lt;/section&gt;

  &lt;hr class="divider-dash"&gt;

  &lt;!-- ============ MATERI B: IMPERATIF ============ --&gt;
  &lt;section class="section" id="materi-b"&gt;
    &lt;div class="eyebrow"&gt;03 — Materi Inti B&lt;/div&gt;
    &lt;h2 class="section-title"&gt;Kalimat Imperatif dalam Teks Prosedur&lt;/h2&gt;

    &lt;div class="panel"&gt;
      &lt;p&gt;&lt;b style="color:var(--off-white);"&gt;Kalimat imperatif&lt;/b&gt; adalah kalimat yang berisi perintah, larangan, permintaan, atau anjuran kepada pembaca agar melakukan suatu tindakan. Kalimat ini merupakan ciri paling dominan dalam teks prosedur karena berfungsi langsung mengarahkan langkah-langkah yang harus dilakukan.&lt;/p&gt;
    &lt;/div&gt;

    &lt;div class="grid-3"&gt;
      &lt;div class="card"&gt;&lt;h4&gt;Perintah biasa&lt;/h4&gt;&lt;p style="font-size:0.9rem;"&gt;"Panaskan minyak dalam wajan."&lt;/p&gt;&lt;/div&gt;
      &lt;div class="card"&gt;&lt;h4&gt;Larangan&lt;/h4&gt;&lt;p style="font-size:0.9rem;"&gt;"Jangan gunakan alat dalam keadaan basah."&lt;/p&gt;&lt;/div&gt;
      &lt;div class="card"&gt;&lt;h4&gt;Permintaan/anjuran halus&lt;/h4&gt;&lt;p style="font-size:0.9rem;"&gt;"Tunggulah hingga adonan mengembang."&lt;/p&gt;&lt;/div&gt;
    &lt;/div&gt;
    &lt;p class="lead" style="margin-top:14px;"&gt;&lt;b style="color:var(--off-white);"&gt;Ciri penanda:&lt;/b&gt; biasanya berakhiran &lt;i&gt;-lah&lt;/i&gt; atau &lt;i&gt;-kan&lt;/i&gt;, menggunakan kata kerja dasar tanpa subjek eksplisit, dan sering diakhiri tanda seru atau titik.&lt;/p&gt;
  &lt;/section&gt;

  &lt;hr class="divider-dash"&gt;

  &lt;!-- ============ MATERI C: DEKLARATIF ============ --&gt;
  &lt;section class="section" id="materi-c"&gt;
    &lt;div class="eyebrow"&gt;04 — Materi Inti C&lt;/div&gt;
    &lt;h2 class="section-title"&gt;Kalimat Deklaratif dalam Teks Prosedur&lt;/h2&gt;

    &lt;div class="panel"&gt;
      &lt;p&gt;&lt;b style="color:var(--off-white);"&gt;Kalimat deklaratif&lt;/b&gt; adalah kalimat yang menyatakan suatu fakta, informasi, atau penjelasan kepada pembaca tanpa memerintah. Dalam teks prosedur, kalimat ini biasanya muncul pada bagian tujuan, pengantar, atau catatan tambahan untuk memberi konteks sebelum atau setelah langkah-langkah dijelaskan.&lt;/p&gt;
    &lt;/div&gt;

    &lt;div class="grid-3"&gt;
      &lt;div class="card"&gt;&lt;h4&gt;Pada bagian tujuan&lt;/h4&gt;&lt;p style="font-size:0.9rem;"&gt;"Prosedur ini bertujuan menjaga kebersihan alat dapur."&lt;/p&gt;&lt;/div&gt;
      &lt;div class="card"&gt;&lt;h4&gt;Pada bagian penjelas&lt;/h4&gt;&lt;p style="font-size:0.9rem;"&gt;"Minyak yang terlalu panas dapat merusak tekstur makanan."&lt;/p&gt;&lt;/div&gt;
      &lt;div class="card"&gt;&lt;h4&gt;Pada catatan tambahan&lt;/h4&gt;&lt;p style="font-size:0.9rem;"&gt;"Alat ini umumnya digunakan di dapur rumah tangga."&lt;/p&gt;&lt;/div&gt;
    &lt;/div&gt;
    &lt;p class="lead" style="margin-top:14px;"&gt;&lt;b style="color:var(--off-white);"&gt;Ciri penanda:&lt;/b&gt; berupa kalimat berita, tidak mengandung perintah, dan biasanya diakhiri tanda titik.&lt;/p&gt;
  &lt;/section&gt;

  &lt;hr class="divider-dash"&gt;

  &lt;!-- ============ MATERI D: PERSUASIF ============ --&gt;
  &lt;section class="section" id="materi-d"&gt;
    &lt;div class="eyebrow"&gt;05 — Materi Inti D&lt;/div&gt;
    &lt;h2 class="section-title"&gt;Kalimat Persuasif dalam Teks Prosedur&lt;/h2&gt;

    &lt;div class="panel"&gt;
      &lt;p&gt;&lt;b style="color:var(--off-white);"&gt;Kalimat persuasif&lt;/b&gt; adalah kalimat yang bertujuan membujuk atau meyakinkan pembaca agar mengikuti langkah-langkah dengan sungguh-sungguh, biasanya muncul pada bagian tips, peringatan, atau penutup teks prosedur.&lt;/p&gt;
    &lt;/div&gt;

    &lt;div class="grid-3"&gt;
      &lt;div class="card"&gt;&lt;h4&gt;Ajakan&lt;/h4&gt;&lt;p style="font-size:0.9rem;"&gt;"Sebaiknya langkah ini dilakukan secara rutin agar hasilnya maksimal."&lt;/p&gt;&lt;/div&gt;
      &lt;div class="card"&gt;&lt;h4&gt;Penekanan manfaat&lt;/h4&gt;&lt;p style="font-size:0.9rem;"&gt;"Dengan mengikuti langkah ini, alat akan lebih awet digunakan."&lt;/p&gt;&lt;/div&gt;
      &lt;div class="card"&gt;&lt;h4&gt;Peringatan halus&lt;/h4&gt;&lt;p style="font-size:0.9rem;"&gt;"Pastikan langkah ini tidak dilewatkan agar hasil kerja optimal."&lt;/p&gt;&lt;/div&gt;
    &lt;/div&gt;
    &lt;p class="lead" style="margin-top:14px;"&gt;&lt;b style="color:var(--off-white);"&gt;Ciri penanda:&lt;/b&gt; sering menggunakan kata "sebaiknya", "agar", "disarankan", "pastikan", dan menekankan alasan atau manfaat mengikuti langkah.&lt;/p&gt;
  &lt;/section&gt;

  &lt;hr class="divider-dash"&gt;

  &lt;!-- ============ MATERI E: KONJUNGSI TEMPORAL ============ --&gt;
  &lt;section class="section" id="materi-e"&gt;
    &lt;div class="eyebrow"&gt;06 — Materi Inti E&lt;/div&gt;
    &lt;h2 class="section-title"&gt;Konjungsi Temporal dalam Teks Prosedur&lt;/h2&gt;

    &lt;div class="panel"&gt;
      &lt;p&gt;&lt;b style="color:var(--off-white);"&gt;Konjungsi temporal&lt;/b&gt; adalah kata penghubung yang menandai urutan waktu antarlangkah dalam teks prosedur, sehingga pembaca dapat memahami langkah mana yang harus dilakukan lebih dulu dan langkah berikutnya.&lt;/p&gt;
    &lt;/div&gt;

    &lt;div class="grid-3"&gt;
      &lt;div class="card"&gt;&lt;h4&gt;Penanda awal&lt;/h4&gt;&lt;p style="font-size:0.9rem;"&gt;pertama, mula-mula, langkah awal&lt;/p&gt;&lt;/div&gt;
      &lt;div class="card"&gt;&lt;h4&gt;Penanda lanjutan&lt;/h4&gt;&lt;p style="font-size:0.9rem;"&gt;kemudian, selanjutnya, setelah itu, lalu&lt;/p&gt;&lt;/div&gt;
      &lt;div class="card"&gt;&lt;h4&gt;Penanda akhir&lt;/h4&gt;&lt;p style="font-size:0.9rem;"&gt;terakhir, akhirnya, hingga selesai&lt;/p&gt;&lt;/div&gt;
    &lt;/div&gt;
  &lt;/section&gt;

  &lt;hr class="divider-dash"&gt;

  &lt;!-- ============ MATERI F: TABEL RANGKUMAN CIRI ============ --&gt;
  &lt;section class="section" id="materi-f"&gt;
    &lt;div class="eyebrow"&gt;07 — Materi Inti F&lt;/div&gt;
    &lt;h2 class="section-title"&gt;Rangkuman Empat Ciri Kebahasaan Teks Prosedur&lt;/h2&gt;

    &lt;table&gt;
      &lt;tr&gt;&lt;th style="width:20%;"&gt;Ciri Kebahasaan&lt;/th&gt;&lt;th style="width:28%;"&gt;Fungsi&lt;/th&gt;&lt;th style="width:26%;"&gt;Penanda&lt;/th&gt;&lt;th&gt;Contoh&lt;/th&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Kalimat Imperatif&lt;/td&gt;&lt;td&gt;Mengarahkan pembaca melakukan tindakan&lt;/td&gt;&lt;td&gt;Akhiran -lah/-kan, tanpa subjek eksplisit&lt;/td&gt;&lt;td&gt;"Aduk adonan hingga rata."&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Kalimat Deklaratif&lt;/td&gt;&lt;td&gt;Menyampaikan fakta/informasi pendukung&lt;/td&gt;&lt;td&gt;Kalimat berita, tanpa perintah&lt;/td&gt;&lt;td&gt;"Adonan yang baik bertekstur lembut."&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Kalimat Persuasif&lt;/td&gt;&lt;td&gt;Membujuk pembaca mengikuti langkah dengan sungguh-sungguh&lt;/td&gt;&lt;td&gt;Kata "sebaiknya", "agar", "pastikan"&lt;/td&gt;&lt;td&gt;"Sebaiknya adonan didiamkan 10 menit agar mengembang sempurna."&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Konjungsi Temporal&lt;/td&gt;&lt;td&gt;Menandai urutan waktu antarlangkah&lt;/td&gt;&lt;td&gt;Kata "kemudian", "setelah itu", "lalu"&lt;/td&gt;&lt;td&gt;"Kemudian, masukkan adonan ke dalam oven."&lt;/td&gt;&lt;/tr&gt;
    &lt;/table&gt;
  &lt;/section&gt;

  &lt;hr class="divider-dash"&gt;

  &lt;!-- ============ PEMODELAN ============ --&gt;
  &lt;section class="section" id="contoh"&gt;
    &lt;div class="eyebrow"&gt;08 — Pemodelan&lt;/div&gt;
    &lt;h2 class="section-title"&gt;Contoh Penerapan: Mengidentifikasi Ciri Kebahasaan&lt;/h2&gt;
    &lt;p class="lead"&gt;Guru membacakan dan membahas bersama contoh berikut sebagai model identifikasi sebelum murid mengerjakan tugas kelompok. Setiap kalimat ditandai sesuai ciri kebahasaannya.&lt;/p&gt;

    &lt;div class="doc-sample"&gt;
      &lt;div class="doc-head"&gt;&lt;span&gt;Lampiran · Teks Prosedur Contoh&lt;/span&gt;&lt;span&gt;Dokumen-01&lt;/span&gt;&lt;/div&gt;
      &lt;div class="doc-body"&gt;
        &lt;h3 style="color:#132029 !important;"&gt;Prosedur Menjaga Kesehatan Mata saat Bekerja di Depan Layar Komputer&lt;/h3&gt;
        &lt;p style="margin-top:-4px; color:#4b5a63 !important;"&gt;&lt;i&gt;Tujuan: Menjaga kesehatan mata agar tidak cepat lelah selama bekerja atau belajar menggunakan komputer.&lt;/i&gt;&lt;/p&gt;
        &lt;ol style="color:#132029 !important;"&gt;
          &lt;li style="color:#132029 !important;"&gt;Aturlah jarak pandang layar komputer sekitar 50–70 cm dari mata.&lt;span class="flag"&gt;IMPERATIF&lt;/span&gt;&lt;/li&gt;
          &lt;li style="color:#132029 !important;"&gt;Sesuaikan tingkat kecerahan layar agar tidak terlalu terang atau terlalu redup.&lt;span class="flag"&gt;IMPERATIF&lt;/span&gt;&lt;/li&gt;
          &lt;li style="color:#132029 !important;"&gt;Kemudian, terapkan aturan 20-20-20: setiap 20 menit, alihkan pandangan ke objek sejauh 20 kaki selama 20 detik.&lt;span class="flag"&gt;KONJUNGSI TEMPORAL&lt;/span&gt;&lt;/li&gt;
          &lt;li style="color:#132029 !important;"&gt;Berkediplah lebih sering agar mata tidak kering.&lt;span class="flag"&gt;IMPERATIF&lt;/span&gt;&lt;/li&gt;
          &lt;li style="color:#132029 !important;"&gt;Setelah itu, gunakan kacamata anti-radiasi jika diperlukan.&lt;span class="flag"&gt;KONJUNGSI TEMPORAL&lt;/span&gt;&lt;/li&gt;
        &lt;/ol&gt;
        &lt;div class="note-margin" style="margin-top:10px; color:#8A3A1F !important;"&gt;Paparan layar dalam waktu lama dapat menyebabkan mata lelah, kering, bahkan menurunkan konsentrasi. &lt;b&gt;(kalimat deklaratif — fakta pendukung)&lt;/b&gt;&lt;/div&gt;
        &lt;div class="note-margin" style="margin-top:10px; color:#8A3A1F !important;"&gt;Sebaiknya langkah-langkah ini dilakukan secara rutin agar kesehatan mata tetap terjaga selama bekerja atau belajar. &lt;b&gt;(kalimat persuasif — penutup)&lt;/b&gt;&lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class="panel" style="margin-top:22px;"&gt;
      &lt;p style="margin:0;"&gt;&lt;b style="color:var(--off-white);"&gt;Simpulan model identifikasi:&lt;/b&gt; Teks di atas didominasi kalimat imperatif pada bagian langkah-langkah, dua konjungsi temporal ("kemudian" dan "setelah itu") menandai urutan langkah, satu kalimat deklaratif memberi fakta pendukung, dan satu kalimat persuasif pada bagian penutup membujuk pembaca agar konsisten menerapkan langkah tersebut.&lt;/p&gt;
    &lt;/div&gt;
  &lt;/section&gt;

  &lt;hr class="divider-dash"&gt;

  &lt;!-- ============ RANGKUMAN ============ --&gt;
  &lt;section class="section" id="rangkuman"&gt;
    &lt;div class="eyebrow"&gt;09 — Ringkasan Materi&lt;/div&gt;
    &lt;h2 class="section-title"&gt;Poin-Poin Penting&lt;/h2&gt;
    &lt;div class="summary-box"&gt;
      &lt;ul&gt;
        &lt;li&gt;Kalimat imperatif mengarahkan pembaca melakukan tindakan dan menjadi ciri paling dominan dalam teks prosedur.&lt;/li&gt;
        &lt;li&gt;Kalimat deklaratif menyampaikan fakta atau informasi pendukung, biasanya pada bagian tujuan atau catatan tambahan.&lt;/li&gt;
        &lt;li&gt;Kalimat persuasif membujuk pembaca agar mengikuti langkah dengan sungguh-sungguh, biasanya pada bagian tips atau penutup.&lt;/li&gt;
        &lt;li&gt;Konjungsi temporal menandai urutan waktu antarlangkah, seperti "pertama", "kemudian", "setelah itu", dan "terakhir".&lt;/li&gt;
      &lt;/ul&gt;
    &lt;/div&gt;
  &lt;/section&gt;

  &lt;hr class="divider-dash"&gt;

  &lt;!-- ============ TUGAS KELOMPOK ============ --&gt;
  &lt;section class="section" id="tugas-kelompok"&gt;
    &lt;div class="eyebrow"&gt;10 — Lembar Kerja&lt;/div&gt;
    &lt;div class="task-header"&gt;
      &lt;h2&gt;Tugas Kelompok: Mengidentifikasi Ciri Kebahasaan Teks Prosedur&lt;/h2&gt;
      &lt;span class="badge"&gt;Durasi ± 60 menit&lt;/span&gt;
    &lt;/div&gt;

    &lt;p style="margin-top:18px;"&gt;&lt;b style="color:var(--off-white);"&gt;Tujuan tugas:&lt;/b&gt; Murid secara berkelompok mengidentifikasi kalimat imperatif, deklaratif, persuasif, dan konjungsi temporal pada teks prosedur berikut, lalu mempresentasikan hasil temuannya.&lt;/p&gt;

    &lt;div class="doc-sample" style="margin-top:20px;"&gt;
      &lt;div class="doc-head"&gt;&lt;span&gt;Lampiran · Teks Prosedur untuk Diidentifikasi&lt;/span&gt;&lt;span&gt;Dokumen-02&lt;/span&gt;&lt;/div&gt;
      &lt;div class="doc-body"&gt;
        &lt;h3 style="color:#132029 !important;"&gt;Prosedur Mencuci Tangan yang Benar sesuai Anjuran Kesehatan&lt;/h3&gt;
        &lt;p style="margin-top:-4px; color:#4b5a63 !important;"&gt;&lt;i&gt;Tujuan: Membersihkan tangan dari kuman dan kotoran agar terhindar dari penyakit.&lt;/i&gt;&lt;/p&gt;
        &lt;ol style="color:#132029 !important;"&gt;
          &lt;li style="color:#132029 !important;"&gt;Basahi kedua tangan dengan air mengalir.&lt;/li&gt;
          &lt;li style="color:#132029 !important;"&gt;Gunakan sabun secukupnya, lalu gosok telapak tangan hingga berbusa.&lt;/li&gt;
          &lt;li style="color:#132029 !important;"&gt;Bersihkan sela-sela jari, punggung tangan, dan kuku secara menyeluruh.&lt;/li&gt;
          &lt;li style="color:#132029 !important;"&gt;Setelah itu, bilas tangan dengan air mengalir hingga bersih.&lt;/li&gt;
          &lt;li style="color:#132029 !important;"&gt;Keringkan tangan menggunakan tisu atau kain bersih.&lt;/li&gt;
        &lt;/ol&gt;
        &lt;p style="margin:10px 0 0; color:#132029 !important;"&gt;Tangan merupakan bagian tubuh yang paling sering bersentuhan dengan kuman penyebab penyakit.&lt;/p&gt;
        &lt;p style="margin:10px 0 0; color:#4b5a63 !important;"&gt;&lt;i&gt;Sebaiknya kebiasaan mencuci tangan ini dilakukan secara rutin, terutama sebelum makan dan setelah beraktivitas di luar rumah, agar tubuh tetap sehat.&lt;/i&gt;&lt;/p&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;p class="lead" style="margin-top:14px;"&gt;Teks di atas &lt;b style="color:var(--off-white);"&gt;belum ditandai&lt;/b&gt; — tugas kelompok adalah menemukan sendiri kalimat imperatif, deklaratif, persuasif, dan konjungsi temporal yang terdapat di dalamnya.&lt;/p&gt;

    &lt;h4 style="color:var(--off-white); margin-top:24px;"&gt;Petunjuk Pengerjaan&lt;/h4&gt;
    &lt;ol class="steps-num"&gt;
      &lt;li&gt;&lt;b&gt;Bentuk kelompok&lt;/b&gt; beranggotakan 4–5 orang sesuai pembagian dari guru.&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Baca teks prosedur&lt;/b&gt; di atas secara bersama-sama dalam kelompok.&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Tandai setiap kalimat&lt;/b&gt; sesuai jenisnya (imperatif, deklaratif, atau persuasif) dan garis bawahi konjungsi temporal yang ditemukan.&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Isi Tabel Identifikasi&lt;/b&gt; di bawah ini untuk setiap ciri kebahasaan.&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Presentasikan hasil&lt;/b&gt; di depan kelas selama maksimal 5 menit per kelompok, dilanjutkan tanya jawab singkat.&lt;/li&gt;
    &lt;/ol&gt;

    &lt;h4 style="color:var(--off-white); margin-top:26px;"&gt;Format Tabel Identifikasi Kelompok&lt;/h4&gt;
    &lt;table&gt;
      &lt;tr&gt;&lt;th style="width:22%;"&gt;Ciri Kebahasaan&lt;/th&gt;&lt;th style="width:38%;"&gt;Contoh Kalimat/Kata yang Ditemukan&lt;/th&gt;&lt;th style="width:12%;"&gt;Jumlah&lt;/th&gt;&lt;th&gt;Fungsi dalam Teks&lt;/th&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Kalimat Imperatif&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Kalimat Deklaratif&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Kalimat Persuasif&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Konjungsi Temporal&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;
    &lt;/table&gt;

    &lt;h4 style="color:var(--off-white); margin-top:26px;"&gt;Rubrik Penilaian Kelompok&lt;/h4&gt;
    &lt;table&gt;
      &lt;tr&gt;&lt;th style="width:26%;"&gt;Aspek Penilaian&lt;/th&gt;&lt;th&gt;Skor 4 (Sangat Baik)&lt;/th&gt;&lt;th&gt;Skor 3 (Baik)&lt;/th&gt;&lt;th&gt;Skor 2 (Cukup)&lt;/th&gt;&lt;th&gt;Skor 1 (Kurang)&lt;/th&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Ketepatan identifikasi kalimat&lt;/td&gt;&lt;td&gt;Seluruh jenis kalimat teridentifikasi tepat&lt;/td&gt;&lt;td&gt;Sebagian besar tepat&lt;/td&gt;&lt;td&gt;Identifikasi dangkal, sebagian keliru&lt;/td&gt;&lt;td&gt;Identifikasi tidak sesuai&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Ketepatan identifikasi konjungsi&lt;/td&gt;&lt;td&gt;Seluruh konjungsi temporal ditemukan dengan tepat&lt;/td&gt;&lt;td&gt;Sebagian besar tepat&lt;/td&gt;&lt;td&gt;Sebagian konjungsi terlewat&lt;/td&gt;&lt;td&gt;Tidak ditemukan dengan tepat&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Kerja sama kelompok&lt;/td&gt;&lt;td&gt;Seluruh anggota aktif berkontribusi&lt;/td&gt;&lt;td&gt;Sebagian besar anggota aktif&lt;/td&gt;&lt;td&gt;Hanya sebagian kecil anggota aktif&lt;/td&gt;&lt;td&gt;Didominasi satu orang&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Presentasi&lt;/td&gt;&lt;td&gt;Jelas, percaya diri, menjawab pertanyaan dengan baik&lt;/td&gt;&lt;td&gt;Jelas namun kurang percaya diri&lt;/td&gt;&lt;td&gt;Kurang jelas/terbata-bata&lt;/td&gt;&lt;td&gt;Tidak dapat menjelaskan hasil&lt;/td&gt;&lt;/tr&gt;
    &lt;/table&gt;
  &lt;/section&gt;

  &lt;hr class="divider-dash"&gt;

  &lt;!-- ============ RANGKUMAN UNTUK BUKU CATATAN ============ --&gt;
  &lt;section class="section" id="catatan-murid"&gt;
    &lt;div class="eyebrow"&gt;11 — Penutup Pembelajaran&lt;/div&gt;
    &lt;h2 class="section-title"&gt;Rangkuman untuk Dicatat di Buku Catatan&lt;/h2&gt;
    &lt;p class="lead"&gt;Sebagai penutup pertemuan, setiap murid menuliskan satu rangkuman ringkas secara mandiri di buku catatan sebagai simpulan pribadi atas materi hari ini.&lt;/p&gt;

    &lt;div class="notebook"&gt;
      &lt;div class="content"&gt;
        &lt;h3 style="color:#132029 !important;"&gt;Instruksi Menulis Rangkuman&lt;/h3&gt;
        &lt;p style="margin-top:0; color:#132029 !important;"&gt;Tulis di buku catatan masing-masing, maksimal &lt;b&gt;satu halaman&lt;/b&gt;, mencakup poin-poin berikut:&lt;/p&gt;
        &lt;ul style="color:#132029 !important;"&gt;
          &lt;li style="color:#132029 !important;"&gt;Pengertian kalimat imperatif, deklaratif, dan persuasif dalam teks prosedur, menurut pemahaman sendiri.&lt;/li&gt;
          &lt;li style="color:#132029 !important;"&gt;Ciri penanda masing-masing jenis kalimat tersebut.&lt;/li&gt;
          &lt;li style="color:#132029 !important;"&gt;Pengertian dan fungsi konjungsi temporal, disertai minimal tiga contoh kata.&lt;/li&gt;
          &lt;li style="color:#132029 !important;"&gt;Satu contoh kalimat buatan sendiri untuk setiap ciri kebahasaan (imperatif, deklaratif, persuasif, dan konjungsi temporal).&lt;/li&gt;
        &lt;/ul&gt;
        &lt;p style="margin-bottom:0; color:#4b5a63 !important;"&gt;&lt;i&gt;Rangkuman ditulis dengan kalimat sendiri (bukan menyalin ulang dari materi), dan dikumpulkan pada awal pertemuan berikutnya untuk diperiksa guru.&lt;/i&gt;&lt;/p&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/section&gt;

&lt;/main&gt;

&lt;footer&gt;
  &lt;div class="doc-code"&gt;DOK/B.INDO/XI/PROSEDUR-KAIDAH-1 — Fokus Tujuan Pembelajaran, Materi Inti &amp;amp; Tugas Kelompok, 1× pertemuan (3 JP)&lt;/div&gt;
  &lt;p style="margin:0;"&gt;Referensi: Kurikulum Merdeka — Capaian Pembelajaran Bahasa Indonesia Fase F (Elemen Membaca dan Memirsa); Buku Teks Bahasa Indonesia Kelas XI SMK/MAK Kemendikbudristek.&lt;/p&gt;
&lt;/footer&gt;
&lt;/div&gt;</description><link>http://kitab-investasi.blogspot.com/2026/08/kaidah-kebahasaan-teks-prosedur-bagian-1.html</link><thr:total>0</thr:total><author>nof_rizal07@yahoo.co.id (abang_cool)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-9000860041661554971.post-6658566003008767440</guid><pubDate>Wed, 29 Jul 2026 02:22:44 +0000</pubDate><atom:updated>2026-07-29T09:22:44.174+07:00</atom:updated><title>Sistem Komputer &amp; Arsitektur Von Neumann</title><description>&lt;!DOCTYPE html&gt;
&lt;html lang="id"&gt;
&lt;head&gt;
&lt;meta charset="UTF-8"&gt;
&lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&gt;
&lt;title&gt;Sistem Komputer &amp; Arsitektur Von Neumann — Informatika Kelas X&lt;/title&gt;
&lt;link rel="preconnect" href="https://fonts.googleapis.com"&gt;
&lt;link href="https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;600;700&amp;family=IBM+Plex+Sans:wght@400;500;600;700&amp;display=swap" rel="stylesheet"&gt;
&lt;style&gt;
  :root{
    --blueprint: #0F2A44;
    --blueprint-deep: #0A1E33;
    --line: #7FC7FF;
    --line-dim: rgba(127,199,255,0.35);
    --paper: #FBFBF9;
    --paper-dim: #EEF2F5;
    --ink: #16232E;
    --ink-soft: #47586A;
    --amber: #F2A340;
    --green: #4CAF7D;
    --rose: #E2694B;
    --radius: 4px;
  }
  *{box-sizing:border-box; margin:0; padding:0;}
  html{scroll-behavior:smooth;}
  body{
    font-family:'IBM Plex Sans', sans-serif;
    background: var(--blueprint);
    color: var(--ink);
    line-height:1.6;
  }
  .mono{font-family:'IBM Plex Mono', monospace;}

  /* ===== Blueprint grid background ===== */
  .blueprint-bg{
    background-color: var(--blueprint);
    background-image:
      linear-gradient(var(--line-dim) 1px, transparent 1px),
      linear-gradient(90deg, var(--line-dim) 1px, transparent 1px);
    background-size: 32px 32px;
    position:relative;
  }
  .blueprint-bg::before{
    content:"";
    position:absolute; inset:0;
    background: radial-gradient(ellipse at 20% 0%, rgba(127,199,255,0.10), transparent 55%);
    pointer-events:none;
  }

  /* ===== Hero ===== */
  header.hero{
    padding: 64px 6vw 56px;
    color: var(--paper);
    position:relative;
    overflow:hidden;
  }
  .eyebrow{
    font-family:'IBM Plex Mono', monospace;
    font-size:0.78rem;
    letter-spacing:0.16em;
    text-transform:uppercase;
    color: var(--line);
    display:flex; align-items:center; gap:10px;
    margin-bottom:22px;
  }
  .eyebrow::before{
    content:"";
    width:10px; height:10px;
    border:1.5px solid var(--line);
    border-radius:2px;
    display:inline-block;
    box-shadow: 0 0 0 3px var(--line-dim);
  }
  h1.title{
    font-family:'IBM Plex Mono', monospace;
    font-weight:700;
    font-size: clamp(2rem, 4.4vw, 3.6rem);
    line-height:1.12;
    letter-spacing:-0.01em;
    max-width: 16ch;
  }
  h1.title span{color: var(--line);}
  .hero-sub{
    margin-top:18px;
    max-width: 62ch;
    font-size:1.05rem;
    color: #C9DCEC;
  }
  .meta-strip{
    margin-top:40px;
    display:grid;
    grid-template-columns: repeat(auto-fit,minmax(160px,1fr));
    gap:1px;
    background: var(--line-dim);
    border:1px solid var(--line-dim);
    max-width: 920px;
  }
  .meta-cell{
    background: var(--blueprint-deep);
    padding:14px 16px;
  }
  .meta-cell .k{
    font-family:'IBM Plex Mono', monospace;
    font-size:0.68rem;
    letter-spacing:0.1em;
    text-transform:uppercase;
    color: var(--line);
    opacity:0.85;
  }
  .meta-cell .v{
    margin-top:6px;
    font-size:0.95rem;
    font-weight:600;
    color: var(--paper);
  }

  /* ===== Content shell ===== */
  main{
    background: var(--paper);
    border-radius: 18px 18px 0 0;
    margin-top: -18px;
    position:relative;
    z-index:2;
    padding: 8px 0 0;
  }
  .section{
    padding: 56px 6vw;
    max-width: 1180px;
    margin: 0 auto;
    border-bottom: 1px solid #E4E1D8;
  }
  .section:last-of-type{border-bottom:none;}
  .section-tag{
    font-family:'IBM Plex Mono', monospace;
    font-size:0.72rem;
    letter-spacing:0.14em;
    text-transform:uppercase;
    color: var(--ink-soft);
    display:flex; align-items:center; gap:10px;
    margin-bottom:10px;
  }
  .section-tag .num{
    color: var(--paper);
    background: var(--blueprint);
    padding:3px 8px;
    border-radius:3px;
    font-weight:600;
  }
  h2.section-title{
    font-family:'IBM Plex Mono', monospace;
    font-size: clamp(1.4rem, 2.4vw, 2rem);
    font-weight:700;
    color: var(--blueprint);
    margin-bottom: 22px;
    max-width: 30ch;
  }
  h3.sub-title{
    font-family:'IBM Plex Mono', monospace;
    font-size:1.08rem;
    font-weight:600;
    color: var(--blueprint);
    margin: 28px 0 12px;
    display:flex; align-items:center; gap:10px;
  }
  h3.sub-title::before{
    content:"";
    width:8px;height:8px;
    background: var(--amber);
    display:inline-block;
    border-radius:1px;
  }
  p{ color:#2B3A48; max-width: 74ch; margin-bottom: 14px;}
  strong{color:var(--blueprint);}
  ul, ol{ margin: 8px 0 18px 1.3em; max-width: 74ch;}
  li{margin-bottom:8px; color:#2B3A48;}

  .callout{
    border-left: 3px solid var(--amber);
    background: #FEF6EA;
    padding: 16px 20px;
    border-radius: 0 6px 6px 0;
    margin: 18px 0;
    max-width: 74ch;
  }
  .callout .lbl{
    font-family:'IBM Plex Mono', monospace;
    font-size:0.7rem;
    letter-spacing:0.1em;
    text-transform:uppercase;
    color:#B4791C;
    font-weight:700;
    margin-bottom:6px;
  }

  /* ===== Cards grid (komponen) ===== */
  .card-grid{
    display:grid;
    grid-template-columns: repeat(3, 1fr);
    gap: 16px;
    margin: 20px 0 8px;
  }
  @media (max-width: 860px){ .card-grid{grid-template-columns: 1fr;} }
  .card{
    background: var(--paper);
    border: 1.5px solid var(--blueprint);
    border-radius: var(--radius);
    padding: 20px;
    position:relative;
  }
  .card .tag{
    font-family:'IBM Plex Mono', monospace;
    font-size:0.68rem;
    letter-spacing:0.1em;
    text-transform:uppercase;
    color:#fff;
    background: var(--blueprint);
    padding:3px 8px;
    border-radius:3px;
    display:inline-block;
    margin-bottom:12px;
  }
  .card h4{
    font-family:'IBM Plex Mono', monospace;
    font-size:1rem;
    margin-bottom:8px;
    color:var(--blueprint);
  }
  .card ul{margin:6px 0 0 1.1em; font-size:0.92rem;}
  .card li{margin-bottom:5px; color:#3C4C5B;}

  /* ===== IPO diagram ===== */
  .ipo-wrap{
    margin: 26px 0;
    overflow-x:auto;
  }
  .ipo-row{
    display:flex; align-items:stretch; gap:0;
    min-width: 640px;
  }
  .ipo-box{
    flex:1;
    background: var(--blueprint);
    color: var(--paper);
    padding: 20px 16px;
    text-align:center;
    position:relative;
  }
  .ipo-box:nth-child(odd){background: var(--blueprint);}
  .ipo-box .lab{
    font-family:'IBM Plex Mono', monospace;
    font-size:0.7rem;
    letter-spacing:0.12em;
    text-transform:uppercase;
    color: var(--line);
  }
  .ipo-box .desc{font-size:0.85rem; margin-top:8px; color:#D6E4F0;}
  .ipo-arrow{
    width:44px; flex-shrink:0;
    display:flex; align-items:center; justify-content:center;
    background: var(--paper-dim);
    color: var(--blueprint);
    font-size:1.3rem;
  }
  .ipo-storage{
    margin-top:14px;
    text-align:center;
    font-family:'IBM Plex Mono', monospace;
    font-size:0.78rem;
    color: var(--ink-soft);
  }

  /* ===== Von Neumann diagram ===== */
  .diagram-frame{
    margin: 26px 0;
    background: var(--blueprint-deep);
    border-radius: 8px;
    padding: 18px;
    border: 1px solid var(--line-dim);
  }
  .diagram-frame svg{width:100%; height:auto; display:block;}
  .diagram-caption{
    font-family:'IBM Plex Mono', monospace;
    font-size:0.72rem;
    color: var(--line);
    text-align:center;
    margin-top:10px;
    letter-spacing:0.04em;
  }

  /* signal flow animation */
  .signal{
    stroke-dasharray: 6 8;
    animation: flow 1.6s linear infinite;
  }
  @keyframes flow{ to{ stroke-dashoffset:-56; } }
  @media (prefers-reduced-motion: reduce){ .signal{animation:none;} }

  /* ===== Fetch-decode-execute steps ===== */
  .cycle{
    display:flex; flex-wrap:wrap; gap:14px; margin:22px 0;
  }
  .cycle .step{
    flex:1; min-width:190px;
    border:1.5px solid var(--blueprint);
    border-radius: var(--radius);
    padding:16px;
    position:relative;
  }
  .cycle .step .n{
    font-family:'IBM Plex Mono', monospace;
    font-weight:700;
    font-size:1.6rem;
    color: var(--amber);
  }
  .cycle .step h5{
    font-family:'IBM Plex Mono', monospace;
    font-size:0.92rem;
    margin:4px 0 6px;
    color: var(--blueprint);
  }
  .cycle .step p{font-size:0.86rem; margin:0;}

  /* ===== Rangkuman ===== */
  .summary-box{
    background: var(--blueprint);
    color: var(--paper);
    border-radius: 8px;
    padding: 26px 28px;
    margin-top: 10px;
  }
  .summary-box h4{
    font-family:'IBM Plex Mono', monospace;
    color: var(--line);
    font-size:0.85rem;
    letter-spacing:0.08em;
    text-transform:uppercase;
    margin-bottom:14px;
  }
  .summary-box ul{margin:0 0 0 1.1em; max-width:none;}
  .summary-box li{color:#E4EEF5; margin-bottom:8px;}

  /* ===== Tugas kelompok ===== */
  .task-panel{
    border: 1.5px dashed var(--blueprint);
    border-radius: 8px;
    padding: 26px 28px;
    background: repeating-linear-gradient(135deg, #FBFBF9, #FBFBF9 18px, #F3F1E9 18px, #F3F1E9 19px);
  }
  .task-head{
    display:flex; align-items:center; gap:12px; flex-wrap:wrap;
    margin-bottom:12px;
  }
  .task-head .badge{
    font-family:'IBM Plex Mono', monospace;
    font-size:0.7rem;
    letter-spacing:0.08em;
    text-transform:uppercase;
    background: var(--rose);
    color:#fff;
    padding:4px 10px;
    border-radius:3px;
  }
  .task-panel h3{
    font-family:'IBM Plex Mono', monospace;
    font-size:1.25rem;
    color: var(--blueprint);
  }
  .steps-num{ counter-reset: step; margin:16px 0; max-width:78ch;}
  .steps-num li{
    counter-increment: step;
    list-style:none;
    position:relative;
    padding-left:34px;
    margin-bottom:14px;
  }
  .steps-num li::before{
    content: counter(step);
    position:absolute; left:0; top:0;
    font-family:'IBM Plex Mono', monospace;
    font-weight:700;
    color:#fff;
    background: var(--blueprint);
    width:24px; height:24px;
    border-radius:50%;
    display:flex; align-items:center; justify-content:center;
    font-size:0.8rem;
  }
  table.rubrik{
    width:100%;
    border-collapse:collapse;
    margin-top:18px;
    font-size:0.88rem;
  }
  table.rubrik th, table.rubrik td{
    border:1px solid #C9C4B4;
    padding:10px 12px;
    text-align:left;
  }
  table.rubrik th{
    background: var(--blueprint);
    color:#fff;
    font-family:'IBM Plex Mono', monospace;
    font-size:0.75rem;
    letter-spacing:0.04em;
    text-transform:uppercase;
  }
  table.rubrik tr:nth-child(even) td{ background:#F4F2EA; }

  .closing-task{
    margin-top:22px;
    background: #FEF6EA;
    border:1.5px solid var(--amber);
    border-radius:8px;
    padding:20px 22px;
  }
  .closing-task .lbl{
    font-family:'IBM Plex Mono', monospace;
    font-size:0.72rem;
    letter-spacing:0.1em;
    text-transform:uppercase;
    color:#B4791C;
    font-weight:700;
    margin-bottom:8px;
  }

  footer{
    background: var(--blueprint-deep);
    color:#9FB4C6;
    text-align:center;
    padding: 30px 6vw 40px;
    font-family:'IBM Plex Mono', monospace;
    font-size:0.75rem;
    letter-spacing:0.04em;
  }

  @media (max-width: 700px){
    .card-grid{grid-template-columns:1fr;}
    header.hero{padding:44px 5vw 40px;}
    .section{padding:40px 5vw;}
  }
&lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;

&lt;div class="blueprint-bg"&gt;
  &lt;header class="hero"&gt;
    &lt;div class="eyebrow"&gt;Informatika · Fase E · Kelas X SMK&lt;/div&gt;
    &lt;h1 class="title"&gt;Sistem Komputer &lt;span&gt;&amp;&lt;/span&gt; Arsitektur Von&amp;nbsp;Neumann&lt;/h1&gt;
    &lt;p class="hero-sub"&gt;Materi ini membahas bagaimana komputer tersusun dan bekerja — mulai dari komponen penyusunnya, alur input–proses–output, hingga cetak biru arsitektur yang mendasari hampir seluruh komputer modern: arsitektur Von Neumann.&lt;/p&gt;

    &lt;div class="meta-strip"&gt;
      &lt;div class="meta-cell"&gt;&lt;div class="k"&gt;Elemen CP&lt;/div&gt;&lt;div class="v"&gt;Sistem Komputer&lt;/div&gt;&lt;/div&gt;
      &lt;div class="meta-cell"&gt;&lt;div class="k"&gt;Jenjang&lt;/div&gt;&lt;div class="v"&gt;SMK Kelas X&lt;/div&gt;&lt;/div&gt;
      &lt;div class="meta-cell"&gt;&lt;div class="k"&gt;Alokasi Waktu&lt;/div&gt;&lt;div class="v"&gt;1 Pertemuan · 4 JP (180 menit)&lt;/div&gt;&lt;/div&gt;
      &lt;div class="meta-cell"&gt;&lt;div class="k"&gt;Model&lt;/div&gt;&lt;div class="v"&gt;Diskusi &amp; Kerja Kelompok&lt;/div&gt;&lt;/div&gt;
    &lt;/div&gt;
  &lt;/header&gt;
&lt;/div&gt;

&lt;main&gt;

  &lt;!-- ===================== CAPAIAN &amp; TUJUAN ===================== --&gt;
  &lt;section class="section" id="tujuan"&gt;
    &lt;div class="section-tag"&gt;&lt;span class="num"&gt;00&lt;/span&gt; Capaian &amp; Tujuan Pembelajaran&lt;/div&gt;
    &lt;h2 class="section-title"&gt;Ke Mana Materi Ini Menuju&lt;/h2&gt;

    &lt;h3 class="sub-title"&gt;Capaian Pembelajaran&lt;/h3&gt;
    &lt;p&gt;Peserta didik mampu menjelaskan komponen sistem komputer, model input–proses–output, fungsi perangkat keras, perangkat lunak, brainware, serta hubungan antar komponennya dalam sistem komputer.&lt;/p&gt;

    &lt;h3 class="sub-title"&gt;Tujuan Pembelajaran&lt;/h3&gt;
    &lt;ol&gt;
      &lt;li&gt;Menjelaskan pengertian sistem komputer sebagai satu kesatuan yang utuh.&lt;/li&gt;
      &lt;li&gt;Mengidentifikasi dan mengelompokkan komponen sistem komputer: perangkat keras (hardware), perangkat lunak (software), dan pengguna (brainware).&lt;/li&gt;
      &lt;li&gt;Menjelaskan model kerja input – proses – output beserta peran penyimpanan (storage) di dalamnya.&lt;/li&gt;
      &lt;li&gt;Menjelaskan arsitektur Von Neumann dan fungsi setiap bagiannya: CPU (Control Unit &amp; ALU), memori utama, serta jalur bus.&lt;/li&gt;
      &lt;li&gt;Menganalisis hubungan dan ketergantungan antar komponen dalam sebuah sistem komputer melalui studi kasus perangkat nyata.&lt;/li&gt;
    &lt;/ol&gt;

    &lt;h3 class="sub-title"&gt;Rincian Kegiatan (4 JP × 45 menit)&lt;/h3&gt;
    &lt;table class="rubrik"&gt;
      &lt;tr&gt;&lt;th&gt;Tahap&lt;/th&gt;&lt;th&gt;Kegiatan&lt;/th&gt;&lt;th&gt;Waktu&lt;/th&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Pendahuluan&lt;/td&gt;&lt;td&gt;Apersepsi, pertanyaan pemantik ("Apa yang sebenarnya terjadi di dalam laptopmu saat kamu mengetik?"), penyampaian tujuan pembelajaran&lt;/td&gt;&lt;td&gt;15 menit&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Kegiatan Inti — Eksplorasi Konsep&lt;/td&gt;&lt;td&gt;Penjelasan materi: komponen sistem komputer, model IPO, dan arsitektur Von Neumann&lt;/td&gt;&lt;td&gt;60 menit&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Kegiatan Inti — Kerja Kelompok&lt;/td&gt;&lt;td&gt;Diskusi dan pengerjaan tugas kelompok (identifikasi komponen &amp; skema Von Neumann)&lt;/td&gt;&lt;td&gt;45 menit&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Kegiatan Inti — Presentasi&lt;/td&gt;&lt;td&gt;Presentasi singkat tiap kelompok dan tanggapan/klarifikasi guru&lt;/td&gt;&lt;td&gt;30 menit&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Penutup&lt;/td&gt;&lt;td&gt;Refleksi, penguatan konsep, dan menulis kesimpulan ringkas di buku catatan&lt;/td&gt;&lt;td&gt;30 menit&lt;/td&gt;&lt;/tr&gt;
    &lt;/table&gt;
  &lt;/section&gt;

  &lt;!-- ===================== A. PENGERTIAN ===================== --&gt;
  &lt;section class="section" id="pengertian"&gt;
    &lt;div class="section-tag"&gt;&lt;span class="num"&gt;01&lt;/span&gt; Konsep Dasar&lt;/div&gt;
    &lt;h2 class="section-title"&gt;Apa Itu Sistem Komputer?&lt;/h2&gt;
    &lt;p&gt;&lt;strong&gt;Sistem komputer&lt;/strong&gt; adalah kumpulan komponen yang saling terhubung dan bekerja sama secara terkoordinasi untuk menerima, mengolah, menyimpan, dan menghasilkan data menjadi informasi yang berguna. Kata kuncinya adalah &lt;em&gt;"saling bekerja sama"&lt;/em&gt; — satu komputer bukan sekadar tumpukan komponen elektronik, melainkan sebuah sistem, di mana setiap bagian punya peran dan tidak dapat berfungsi maksimal tanpa bagian lainnya.&lt;/p&gt;

    &lt;div class="callout"&gt;
      &lt;div class="lbl"&gt;Analogi&lt;/div&gt;
      &lt;p style="margin:0;"&gt;Bayangkan sistem komputer seperti tubuh manusia: &lt;strong&gt;hardware&lt;/strong&gt; adalah tubuh fisik (otot, tulang, organ), &lt;strong&gt;software&lt;/strong&gt; adalah pikiran dan instruksi yang mengatur gerakan, dan &lt;strong&gt;brainware&lt;/strong&gt; adalah orang yang memberi perintah dan tujuan. Ketiganya harus hadir bersama agar "tubuh" itu dapat benar-benar hidup dan berguna.&lt;/p&gt;
    &lt;/div&gt;

    &lt;p&gt;Secara umum, sistem komputer tersusun atas tiga elemen utama yang akan kita bahas satu per satu: &lt;strong&gt;perangkat keras (hardware)&lt;/strong&gt;, &lt;strong&gt;perangkat lunak (software)&lt;/strong&gt;, dan &lt;strong&gt;manusia sebagai pengguna/pengelola (brainware)&lt;/strong&gt;.&lt;/p&gt;
  &lt;/section&gt;

  &lt;!-- ===================== B. KOMPONEN ===================== --&gt;
  &lt;section class="section" id="komponen"&gt;
    &lt;div class="section-tag"&gt;&lt;span class="num"&gt;02&lt;/span&gt; Komponen Sistem&lt;/div&gt;
    &lt;h2 class="section-title"&gt;Tiga Pilar Sistem Komputer&lt;/h2&gt;

    &lt;h3 class="sub-title"&gt;1. Perangkat Keras (Hardware)&lt;/h3&gt;
    &lt;p&gt;Hardware adalah seluruh komponen fisik komputer yang dapat dilihat dan disentuh. Berdasarkan fungsinya, hardware dikelompokkan menjadi empat kategori berikut.&lt;/p&gt;

    &lt;div class="card-grid"&gt;
      &lt;div class="card"&gt;
        &lt;span class="tag"&gt;Input&lt;/span&gt;
        &lt;h4&gt;Perangkat Masukan&lt;/h4&gt;
        &lt;p style="font-size:0.9rem; margin-bottom:6px;"&gt;Mengubah data dari luar menjadi bentuk yang dapat diproses komputer.&lt;/p&gt;
        &lt;ul&gt;&lt;li&gt;Keyboard&lt;/li&gt;&lt;li&gt;Mouse&lt;/li&gt;&lt;li&gt;Scanner&lt;/li&gt;&lt;li&gt;Mikrofon&lt;/li&gt;&lt;li&gt;Kamera/webcam&lt;/li&gt;&lt;/ul&gt;
      &lt;/div&gt;
      &lt;div class="card"&gt;
        &lt;span class="tag"&gt;Proses&lt;/span&gt;
        &lt;h4&gt;Perangkat Pemroses&lt;/h4&gt;
        &lt;p style="font-size:0.9rem; margin-bottom:6px;"&gt;Mengolah data menjadi informasi; "otak" komputer.&lt;/p&gt;
        &lt;ul&gt;&lt;li&gt;CPU (Processor)&lt;/li&gt;&lt;li&gt;Motherboard&lt;/li&gt;&lt;li&gt;RAM (memori kerja)&lt;/li&gt;&lt;li&gt;VGA/GPU&lt;/li&gt;&lt;/ul&gt;
      &lt;/div&gt;
      &lt;div class="card"&gt;
        &lt;span class="tag"&gt;Output&lt;/span&gt;
        &lt;h4&gt;Perangkat Keluaran&lt;/h4&gt;
        &lt;p style="font-size:0.9rem; margin-bottom:6px;"&gt;Menampilkan atau menyajikan hasil pemrosesan.&lt;/p&gt;
        &lt;ul&gt;&lt;li&gt;Monitor&lt;/li&gt;&lt;li&gt;Printer&lt;/li&gt;&lt;li&gt;Speaker&lt;/li&gt;&lt;li&gt;Proyektor&lt;/li&gt;&lt;/ul&gt;
      &lt;/div&gt;
      &lt;div class="card" style="grid-column: span 3;"&gt;
        &lt;span class="tag" style="background:var(--amber); color:#3A2400;"&gt;Storage&lt;/span&gt;
        &lt;h4&gt;Perangkat Penyimpanan&lt;/h4&gt;
        &lt;p style="font-size:0.9rem; margin-bottom:6px;"&gt;Menyimpan data dan program, baik sementara maupun permanen.&lt;/p&gt;
        &lt;ul style="columns:2;"&gt;
          &lt;li&gt;&lt;strong&gt;Penyimpanan primer&lt;/strong&gt; — RAM (volatile, sementara, sangat cepat)&lt;/li&gt;
          &lt;li&gt;&lt;strong&gt;Penyimpanan sekunder&lt;/strong&gt; — HDD, SSD, flashdisk (non-volatile, permanen, lebih lambat)&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/div&gt;
    &lt;/div&gt;

    &lt;h3 class="sub-title"&gt;2. Perangkat Lunak (Software)&lt;/h3&gt;
    &lt;p&gt;Software adalah kumpulan instruksi/program yang mengatur bagaimana hardware bekerja. Tanpa software, hardware hanyalah rangkaian komponen elektronik yang tidak tahu harus melakukan apa.&lt;/p&gt;
    &lt;div class="card-grid"&gt;
      &lt;div class="card"&gt;
        &lt;span class="tag"&gt;Sistem Operasi&lt;/span&gt;
        &lt;h4&gt;Operating System&lt;/h4&gt;
        &lt;p style="font-size:0.9rem;"&gt;Mengelola dan menjembatani seluruh sumber daya hardware agar dapat digunakan software lain. Contoh: Windows, Linux, macOS, Android.&lt;/p&gt;
      &lt;/div&gt;
      &lt;div class="card"&gt;
        &lt;span class="tag"&gt;Aplikasi&lt;/span&gt;
        &lt;h4&gt;Software Aplikasi&lt;/h4&gt;
        &lt;p style="font-size:0.9rem;"&gt;Program untuk menyelesaikan tugas spesifik pengguna. Contoh: pengolah kata, browser, aplikasi desain.&lt;/p&gt;
      &lt;/div&gt;
      &lt;div class="card"&gt;
        &lt;span class="tag"&gt;Bahasa &amp; Utilitas&lt;/span&gt;
        &lt;h4&gt;Bahasa Pemrograman / Utility&lt;/h4&gt;
        &lt;p style="font-size:0.9rem;"&gt;Alat untuk membuat software (mis. Python, Java) dan program pemeliharaan sistem (antivirus, disk cleaner).&lt;/p&gt;
      &lt;/div&gt;
    &lt;/div&gt;

    &lt;h3 class="sub-title"&gt;3. Brainware&lt;/h3&gt;
    &lt;p&gt;Brainware adalah manusia yang berinteraksi langsung dengan sistem komputer — merancang, mengoperasikan, dan mengelolanya. Tanpa brainware, hardware dan software secanggih apa pun tidak memiliki tujuan.&lt;/p&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;strong&gt;End user&lt;/strong&gt; — pengguna yang memanfaatkan komputer untuk kebutuhan sehari-hari.&lt;/li&gt;
      &lt;li&gt;&lt;strong&gt;Programmer&lt;/strong&gt; — merancang dan menulis kode program/software.&lt;/li&gt;
      &lt;li&gt;&lt;strong&gt;System administrator&lt;/strong&gt; — mengelola dan menjaga sistem agar berjalan optimal dan aman.&lt;/li&gt;
      &lt;li&gt;&lt;strong&gt;Operator&lt;/strong&gt; — menjalankan operasi rutin sistem, misalnya operator entri data.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/section&gt;

  &lt;!-- ===================== C. MODEL IPO ===================== --&gt;
  &lt;section class="section" id="ipo"&gt;
    &lt;div class="section-tag"&gt;&lt;span class="num"&gt;03&lt;/span&gt; Alur Kerja&lt;/div&gt;
    &lt;h2 class="section-title"&gt;Model Input – Proses – Output&lt;/h2&gt;
    &lt;p&gt;Secara fungsional, cara kerja komputer dapat digambarkan sebagai sebuah alur sederhana: data masuk sebagai &lt;strong&gt;input&lt;/strong&gt;, diolah pada tahap &lt;strong&gt;proses&lt;/strong&gt;, lalu menghasilkan &lt;strong&gt;output&lt;/strong&gt;. Di sepanjang alur ini, &lt;strong&gt;storage&lt;/strong&gt; berperan menyimpan data maupun hasil, baik untuk digunakan kembali maupun disimpan permanen.&lt;/p&gt;

    &lt;div class="ipo-wrap"&gt;
      &lt;div class="ipo-row"&gt;
        &lt;div class="ipo-box"&gt;
          &lt;div class="lab"&gt;Input&lt;/div&gt;
          &lt;div class="desc"&gt;Data mentah dimasukkan&lt;br&gt;mis. mengetik teks di keyboard&lt;/div&gt;
        &lt;/div&gt;
        &lt;div class="ipo-arrow"&gt;→&lt;/div&gt;
        &lt;div class="ipo-box"&gt;
          &lt;div class="lab"&gt;Proses&lt;/div&gt;
          &lt;div class="desc"&gt;CPU mengolah data sesuai&lt;br&gt;instruksi program&lt;/div&gt;
        &lt;/div&gt;
        &lt;div class="ipo-arrow"&gt;→&lt;/div&gt;
        &lt;div class="ipo-box"&gt;
          &lt;div class="lab"&gt;Output&lt;/div&gt;
          &lt;div class="desc"&gt;Hasil olahan ditampilkan&lt;br&gt;mis. teks muncul di layar&lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ipo-storage"&gt;▲▼ Storage — menyimpan data &amp; hasil di setiap tahap (mis. autosave dokumen ke SSD) ▲▼&lt;/div&gt;

    &lt;div class="callout"&gt;
      &lt;div class="lbl"&gt;Contoh Konkret&lt;/div&gt;
      &lt;p style="margin:0;"&gt;Saat kamu mengetik nama di aplikasi pengolah kata: &lt;strong&gt;keyboard&lt;/strong&gt; menjadi input, &lt;strong&gt;CPU dan RAM&lt;/strong&gt; memproses karakter yang diketik dan menyusunnya menjadi dokumen, &lt;strong&gt;monitor&lt;/strong&gt; menampilkan hasilnya sebagai output, dan saat kamu menekan "Save", dokumen tersebut ditulis ke &lt;strong&gt;penyimpanan (storage)&lt;/strong&gt; agar tidak hilang.&lt;/p&gt;
    &lt;/div&gt;
  &lt;/section&gt;

  &lt;!-- ===================== D. VON NEUMANN ===================== --&gt;
  &lt;section class="section" id="von-neumann"&gt;
    &lt;div class="section-tag"&gt;&lt;span class="num"&gt;04&lt;/span&gt; Arsitektur Komputer&lt;/div&gt;
    &lt;h2 class="section-title"&gt;Arsitektur Von Neumann&lt;/h2&gt;

    &lt;p&gt;Pada tahun 1945, ilmuwan &lt;strong&gt;John von Neumann&lt;/strong&gt; memperkenalkan sebuah rancangan (arsitektur) komputer yang menjadi fondasi hampir seluruh komputer modern hingga saat ini — mulai dari laptop, komputer sekolah, sampai smartphone. Gagasan utamanya disebut &lt;strong&gt;stored-program concept&lt;/strong&gt;: instruksi program dan data disimpan bersama di dalam memori yang sama, sehingga komputer dapat membaca dan mengeksekusi instruksi tersebut secara berurutan tanpa harus diprogram ulang secara fisik setiap kali.&lt;/p&gt;

    &lt;h3 class="sub-title"&gt;Komponen Utama Arsitektur Von Neumann&lt;/h3&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;strong&gt;CPU (Central Processing Unit)&lt;/strong&gt; — pusat pemrosesan, terdiri atas:
        &lt;ul&gt;
          &lt;li&gt;&lt;strong&gt;Control Unit (CU)&lt;/strong&gt; — mengatur dan mengendalikan seluruh aktivitas dalam CPU, termasuk mengambil dan menerjemahkan instruksi.&lt;/li&gt;
          &lt;li&gt;&lt;strong&gt;Arithmetic Logic Unit (ALU)&lt;/strong&gt; — melakukan operasi aritmatika (tambah, kurang, kali, bagi) dan operasi logika (perbandingan, AND/OR/NOT).&lt;/li&gt;
          &lt;li&gt;&lt;strong&gt;Register&lt;/strong&gt; — memori berkapasitas sangat kecil namun sangat cepat di dalam CPU, tempat menyimpan data yang sedang diproses.&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;&lt;strong&gt;Memori Utama (Main Memory)&lt;/strong&gt; — menyimpan instruksi program dan data dalam bentuk biner, dan menjadi ciri khas arsitektur ini karena instruksi maupun data berbagi ruang penyimpanan yang sama.&lt;/li&gt;
      &lt;li&gt;&lt;strong&gt;Perangkat Input/Output&lt;/strong&gt; — jalur komunikasi antara komputer dan dunia luar.&lt;/li&gt;
      &lt;li&gt;&lt;strong&gt;Bus&lt;/strong&gt; — jalur fisik yang menghubungkan dan mengalirkan data antar komponen, terbagi menjadi tiga:
        &lt;ul&gt;
          &lt;li&gt;&lt;strong&gt;Bus Alamat (Address Bus)&lt;/strong&gt; — membawa informasi lokasi/alamat data di memori.&lt;/li&gt;
          &lt;li&gt;&lt;strong&gt;Bus Data (Data Bus)&lt;/strong&gt; — membawa data atau instruksi yang sesungguhnya.&lt;/li&gt;
          &lt;li&gt;&lt;strong&gt;Bus Kontrol (Control Bus)&lt;/strong&gt; — membawa sinyal perintah/pengendali antar komponen.&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
    &lt;/ul&gt;

    &lt;div class="diagram-frame"&gt;
      &lt;svg viewBox="0 0 800 420" xmlns="http://www.w3.org/2000/svg"&gt;
        &lt;!-- title --&gt;
        &lt;text x="400" y="30" text-anchor="middle" fill="#7FC7FF" font-family="IBM Plex Mono, monospace" font-size="13" letter-spacing="2"&gt;SKEMA ARSITEKTUR VON NEUMANN&lt;/text&gt;

        &lt;!-- CPU block --&gt;
        &lt;rect x="60" y="70" width="300" height="200" rx="4" fill="none" stroke="#7FC7FF" stroke-width="1.5"/&gt;
        &lt;text x="210" y="92" text-anchor="middle" fill="#F2A340" font-family="IBM Plex Mono, monospace" font-weight="700" font-size="14"&gt;CPU&lt;/text&gt;

        &lt;rect x="80" y="108" width="115" height="60" rx="3" fill="none" stroke="#7FC7FF" stroke-width="1"/&gt;
        &lt;text x="137" y="132" text-anchor="middle" fill="#EEF2F5" font-family="IBM Plex Mono, monospace" font-size="11"&gt;Control&lt;/text&gt;
        &lt;text x="137" y="148" text-anchor="middle" fill="#EEF2F5" font-family="IBM Plex Mono, monospace" font-size="11"&gt;Unit (CU)&lt;/text&gt;

        &lt;rect x="205" y="108" width="115" height="60" rx="3" fill="none" stroke="#7FC7FF" stroke-width="1"/&gt;
        &lt;text x="262" y="132" text-anchor="middle" fill="#EEF2F5" font-family="IBM Plex Mono, monospace" font-size="11"&gt;ALU&lt;/text&gt;
        &lt;text x="262" y="148" text-anchor="middle" fill="#C9DCEC" font-family="IBM Plex Mono, monospace" font-size="9"&gt;Arithmetic/Logic&lt;/text&gt;

        &lt;rect x="80" y="188" width="240" height="58" rx="3" fill="none" stroke="#7FC7FF" stroke-width="1"/&gt;
        &lt;text x="200" y="212" text-anchor="middle" fill="#EEF2F5" font-family="IBM Plex Mono, monospace" font-size="11"&gt;Register&lt;/text&gt;
        &lt;text x="200" y="228" text-anchor="middle" fill="#C9DCEC" font-family="IBM Plex Mono, monospace" font-size="9"&gt;Penyimpanan sementara super cepat&lt;/text&gt;

        &lt;!-- Memory block --&gt;
        &lt;rect x="470" y="70" width="270" height="130" rx="4" fill="none" stroke="#7FC7FF" stroke-width="1.5"/&gt;
        &lt;text x="605" y="94" text-anchor="middle" fill="#F2A340" font-family="IBM Plex Mono, monospace" font-weight="700" font-size="14"&gt;MEMORI UTAMA&lt;/text&gt;
        &lt;text x="605" y="118" text-anchor="middle" fill="#C9DCEC" font-family="IBM Plex Mono, monospace" font-size="10"&gt;Instruksi &amp;amp; data disimpan&lt;/text&gt;
        &lt;text x="605" y="133" text-anchor="middle" fill="#C9DCEC" font-family="IBM Plex Mono, monospace" font-size="10"&gt;bersama (stored program)&lt;/text&gt;
        &lt;rect x="500" y="150" width="60" height="34" fill="none" stroke="#4CAF7D" stroke-width="1"/&gt;
        &lt;text x="530" y="171" text-anchor="middle" fill="#9FE0BE" font-family="IBM Plex Mono, monospace" font-size="9"&gt;0101&lt;/text&gt;
        &lt;rect x="565" y="150" width="60" height="34" fill="none" stroke="#4CAF7D" stroke-width="1"/&gt;
        &lt;text x="595" y="171" text-anchor="middle" fill="#9FE0BE" font-family="IBM Plex Mono, monospace" font-size="9"&gt;1100&lt;/text&gt;
        &lt;rect x="630" y="150" width="60" height="34" fill="none" stroke="#4CAF7D" stroke-width="1"/&gt;
        &lt;text x="660" y="171" text-anchor="middle" fill="#9FE0BE" font-family="IBM Plex Mono, monospace" font-size="9"&gt;0011&lt;/text&gt;

        &lt;!-- I/O block --&gt;
        &lt;rect x="470" y="240" width="270" height="70" rx="4" fill="none" stroke="#7FC7FF" stroke-width="1.5"/&gt;
        &lt;text x="605" y="266" text-anchor="middle" fill="#F2A340" font-family="IBM Plex Mono, monospace" font-weight="700" font-size="13"&gt;PERANGKAT INPUT / OUTPUT&lt;/text&gt;
        &lt;text x="605" y="286" text-anchor="middle" fill="#C9DCEC" font-family="IBM Plex Mono, monospace" font-size="10"&gt;Keyboard, monitor, printer, dll.&lt;/text&gt;

        &lt;!-- Buses connecting CPU &lt;-&gt; Memory --&gt;
        &lt;line class="signal" x1="360" y1="120" x2="470" y2="120" stroke="#7FC7FF" stroke-width="2"/&gt;
        &lt;line class="signal" x1="360" y1="150" x2="470" y2="150" stroke="#F2A340" stroke-width="2"/&gt;
        &lt;line class="signal" x1="360" y1="180" x2="470" y2="180" stroke="#4CAF7D" stroke-width="2"/&gt;

        &lt;!-- Buses connecting CPU &lt;-&gt; I/O --&gt;
        &lt;line class="signal" x1="360" y1="230" x2="470" y2="275" stroke="#7FC7FF" stroke-width="2"/&gt;

        &lt;!-- Legend --&gt;
        &lt;g font-family="IBM Plex Mono, monospace" font-size="10"&gt;
          &lt;line x1="60" y1="345" x2="90" y2="345" stroke="#7FC7FF" stroke-width="2"/&gt;
          &lt;text x="98" y="349" fill="#C9DCEC"&gt;Bus Alamat (Address Bus)&lt;/text&gt;
          &lt;line x1="60" y1="368" x2="90" y2="368" stroke="#F2A340" stroke-width="2"/&gt;
          &lt;text x="98" y="372" fill="#C9DCEC"&gt;Bus Data (Data Bus)&lt;/text&gt;
          &lt;line x1="60" y1="391" x2="90" y2="391" stroke="#4CAF7D" stroke-width="2"/&gt;
          &lt;text x="98" y="395" fill="#C9DCEC"&gt;Bus Kontrol (Control Bus)&lt;/text&gt;
        &lt;/g&gt;
      &lt;/svg&gt;
      &lt;div class="diagram-caption"&gt;Ketiga jalur bus mengalirkan sinyal terus-menerus antara CPU, memori, dan I/O — inilah "sistem peredaran darah" komputer.&lt;/div&gt;
    &lt;/div&gt;

    &lt;h3 class="sub-title"&gt;Siklus Fetch – Decode – Execute&lt;/h3&gt;
    &lt;p&gt;Setiap instruksi program dijalankan CPU melalui siklus mesin (machine cycle) berikut, berulang-ulang jutaan kali per detik:&lt;/p&gt;
    &lt;div class="cycle"&gt;
      &lt;div class="step"&gt;
        &lt;div class="n"&gt;01&lt;/div&gt;
        &lt;h5&gt;FETCH&lt;/h5&gt;
        &lt;p&gt;Control Unit mengambil instruksi berikutnya dari memori utama menggunakan bus alamat dan bus data.&lt;/p&gt;
      &lt;/div&gt;
      &lt;div class="step"&gt;
        &lt;div class="n"&gt;02&lt;/div&gt;
        &lt;h5&gt;DECODE&lt;/h5&gt;
        &lt;p&gt;Instruksi yang diambil diterjemahkan oleh Control Unit agar CPU memahami perintah apa yang harus dilakukan.&lt;/p&gt;
      &lt;/div&gt;
      &lt;div class="step"&gt;
        &lt;div class="n"&gt;03&lt;/div&gt;
        &lt;h5&gt;EXECUTE&lt;/h5&gt;
        &lt;p&gt;ALU menjalankan instruksi tersebut (mis. operasi hitung), lalu hasilnya disimpan kembali ke register atau memori.&lt;/p&gt;
      &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class="callout"&gt;
      &lt;div class="lbl"&gt;Istilah Penting&lt;/div&gt;
      &lt;p style="margin:0;"&gt;&lt;strong&gt;Von Neumann bottleneck&lt;/strong&gt; adalah keterbatasan kecepatan yang muncul karena instruksi dan data harus bergantian melewati bus yang sama menuju satu memori yang sama, sehingga kecepatan pemrosesan CPU sering kali dibatasi oleh kecepatan transfer data ke/dari memori.&lt;/p&gt;
    &lt;/div&gt;
  &lt;/section&gt;

  &lt;!-- ===================== E. HUBUNGAN ANTAR KOMPONEN ===================== --&gt;
  &lt;section class="section" id="hubungan"&gt;
    &lt;div class="section-tag"&gt;&lt;span class="num"&gt;05&lt;/span&gt; Keterkaitan&lt;/div&gt;
    &lt;h2 class="section-title"&gt;Hubungan Antar Komponen&lt;/h2&gt;
    &lt;p&gt;Hardware, software, dan brainware bukan tiga hal yang berdiri sendiri, melainkan tiga sisi dari satu sistem yang saling bergantung:&lt;/p&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;strong&gt;Hardware membutuhkan software&lt;/strong&gt; — tanpa sistem operasi dan program, hardware hanyalah komponen elektronik yang tidak tahu harus melakukan apa.&lt;/li&gt;
      &lt;li&gt;&lt;strong&gt;Software membutuhkan hardware&lt;/strong&gt; — instruksi program tidak dapat dijalankan tanpa CPU, memori, dan perangkat fisik lain sebagai tempat eksekusinya.&lt;/li&gt;
      &lt;li&gt;&lt;strong&gt;Brainware mengendalikan keduanya&lt;/strong&gt; — manusia merancang software, mengoperasikan hardware, dan menentukan tujuan penggunaan sistem.&lt;/li&gt;
      &lt;li&gt;&lt;strong&gt;Arsitektur Von Neumann adalah "jembatan"&lt;/strong&gt; yang menjelaskan bagaimana secara teknis instruksi (software) dan komponen fisik (hardware) benar-benar saling berkomunikasi melalui CPU, memori, dan bus.&lt;/li&gt;
    &lt;/ul&gt;
    &lt;p&gt;Jika salah satu unsur ini tidak ada atau tidak berfungsi, sistem komputer sebagai satu kesatuan tidak dapat bekerja sebagaimana mestinya.&lt;/p&gt;
  &lt;/section&gt;

  &lt;!-- ===================== F. RANGKUMAN ===================== --&gt;
  &lt;section class="section" id="rangkuman"&gt;
    &lt;div class="section-tag"&gt;&lt;span class="num"&gt;06&lt;/span&gt; Penguatan Konsep&lt;/div&gt;
    &lt;h2 class="section-title"&gt;Rangkuman Materi&lt;/h2&gt;
    &lt;div class="summary-box"&gt;
      &lt;h4&gt;Poin-Poin Kunci&lt;/h4&gt;
      &lt;ul&gt;
        &lt;li&gt;Sistem komputer adalah kesatuan hardware, software, dan brainware yang bekerja sama mengolah data menjadi informasi.&lt;/li&gt;
        &lt;li&gt;Hardware terbagi atas perangkat input, proses, output, dan storage (primer &amp; sekunder).&lt;/li&gt;
        &lt;li&gt;Software terdiri atas sistem operasi, aplikasi, serta bahasa pemrograman/utility.&lt;/li&gt;
        &lt;li&gt;Model kerja komputer mengikuti alur input → proses → output, dengan storage berperan menyimpan data di sepanjang alur.&lt;/li&gt;
        &lt;li&gt;Arsitektur Von Neumann memperkenalkan konsep &lt;em&gt;stored program&lt;/em&gt;: instruksi dan data disimpan bersama di satu memori.&lt;/li&gt;
        &lt;li&gt;CPU terdiri atas Control Unit, ALU, dan register, yang bekerja melalui siklus fetch–decode–execute.&lt;/li&gt;
        &lt;li&gt;Bus alamat, bus data, dan bus kontrol adalah jalur komunikasi yang menghubungkan CPU, memori, dan I/O.&lt;/li&gt;
        &lt;li&gt;Ketiga komponen sistem komputer saling bergantung — tidak dapat berfungsi optimal secara terpisah.&lt;/li&gt;
      &lt;/ul&gt;
    &lt;/div&gt;
  &lt;/section&gt;

  &lt;!-- ===================== TUGAS KELOMPOK ===================== --&gt;
  &lt;section class="section" id="tugas"&gt;
    &lt;div class="section-tag"&gt;&lt;span class="num"&gt;07&lt;/span&gt; Aktivitas Belajar&lt;/div&gt;
    &lt;h2 class="section-title"&gt;Tugas Kelompok&lt;/h2&gt;

    &lt;div class="task-panel"&gt;
      &lt;div class="task-head"&gt;
        &lt;span class="badge"&gt;Kerja Kelompok · 4–5 orang&lt;/span&gt;
        &lt;span class="badge" style="background:var(--blueprint);"&gt;45 menit diskusi + 30 menit presentasi&lt;/span&gt;
      &lt;/div&gt;
      &lt;h3&gt;Menelusuri Arsitektur Von Neumann di Perangkat Sehari-hari&lt;/h3&gt;
      &lt;p&gt;Setiap kelompok memilih satu perangkat komputer yang dikenal (laptop, komputer di lab sekolah, atau smartphone), lalu menganalisis komponen sistem komputernya dan memetakannya ke dalam kerangka arsitektur Von Neumann.&lt;/p&gt;

      &lt;ol class="steps-num"&gt;
        &lt;li&gt;&lt;strong&gt;Bentuk kelompok&lt;/strong&gt; beranggotakan 4–5 orang, tentukan satu perangkat komputer yang akan dianalisis.&lt;/li&gt;
        &lt;li&gt;&lt;strong&gt;Identifikasi hardware&lt;/strong&gt; perangkat tersebut dan kelompokkan ke dalam kategori input, proses, output, dan storage (buat dalam bentuk tabel).&lt;/li&gt;
        &lt;li&gt;&lt;strong&gt;Identifikasi software&lt;/strong&gt; yang berjalan di perangkat tersebut: sistem operasi dan minimal 2 contoh aplikasi.&lt;/li&gt;
        &lt;li&gt;&lt;strong&gt;Gambarkan skema sederhana&lt;/strong&gt; arsitektur Von Neumann untuk perangkat pilihan kalian (CPU dengan CU &amp; ALU, memori, I/O, dan tiga jenis bus) — boleh digambar tangan di kertas atau dibuat digital.&lt;/li&gt;
        &lt;li&gt;&lt;strong&gt;Jelaskan dengan bahasa sendiri&lt;/strong&gt; bagaimana siklus fetch–decode–execute terjadi ketika perangkat tersebut menjalankan satu contoh aktivitas sederhana (mis. menekan tombol volume atau membuka aplikasi).&lt;/li&gt;
        &lt;li&gt;&lt;strong&gt;Presentasikan&lt;/strong&gt; hasil kerja kelompok di depan kelas selama maksimal 5 menit per kelompok.&lt;/li&gt;
      &lt;/ol&gt;

      &lt;h3 class="sub-title" style="margin-top:26px;"&gt;Format Laporan&lt;/h3&gt;
      &lt;p&gt;Laporan ditulis pada kertas folio atau dokumen sederhana, memuat: (1) nama perangkat &amp; anggota kelompok, (2) tabel komponen hardware &amp; software, (3) gambar skema Von Neumann, (4) penjelasan siklus fetch-decode-execute.&lt;/p&gt;

      &lt;h3 class="sub-title"&gt;Rubrik Penilaian&lt;/h3&gt;
      &lt;table class="rubrik"&gt;
        &lt;tr&gt;&lt;th&gt;Aspek&lt;/th&gt;&lt;th&gt;Indikator&lt;/th&gt;&lt;th&gt;Skor Maks.&lt;/th&gt;&lt;/tr&gt;
        &lt;tr&gt;&lt;td&gt;Ketepatan Konsep&lt;/td&gt;&lt;td&gt;Komponen hardware/software teridentifikasi dan dikategorikan dengan benar&lt;/td&gt;&lt;td&gt;30&lt;/td&gt;&lt;/tr&gt;
        &lt;tr&gt;&lt;td&gt;Kelengkapan Skema&lt;/td&gt;&lt;td&gt;Skema Von Neumann memuat CPU (CU, ALU), memori, I/O, dan tiga bus dengan benar&lt;/td&gt;&lt;td&gt;30&lt;/td&gt;&lt;/tr&gt;
        &lt;tr&gt;&lt;td&gt;Penjelasan Siklus&lt;/td&gt;&lt;td&gt;Penjelasan fetch-decode-execute logis dan sesuai contoh yang dipilih&lt;/td&gt;&lt;td&gt;20&lt;/td&gt;&lt;/tr&gt;
        &lt;tr&gt;&lt;td&gt;Kerja Sama &amp; Presentasi&lt;/td&gt;&lt;td&gt;Seluruh anggota berkontribusi; presentasi jelas dan percaya diri&lt;/td&gt;&lt;td&gt;20&lt;/td&gt;&lt;/tr&gt;
        &lt;tr&gt;&lt;td colspan="2" style="text-align:right; font-weight:600;"&gt;Total&lt;/td&gt;&lt;td&gt;100&lt;/td&gt;&lt;/tr&gt;
      &lt;/table&gt;
    &lt;/div&gt;

    &lt;div class="closing-task"&gt;
      &lt;div class="lbl"&gt;Penutup Pembelajaran · Tugas Individu&lt;/div&gt;
      &lt;p style="margin:0;"&gt;&lt;strong&gt;Tulislah satu kesimpulan ringkas (5–7 kalimat) di buku catatan kalian masing-masing&lt;/strong&gt;, yang merangkum keseluruhan materi hari ini: pengertian sistem komputer, tiga komponennya (hardware, software, brainware), model input–proses–output, dan inti dari arsitektur Von Neumann beserta siklus fetch–decode–execute. Tulis dengan bahasa dan pemahaman kalian sendiri, bukan menyalin ulang materi.&lt;/p&gt;
    &lt;/div&gt;
  &lt;/section&gt;

&lt;/main&gt;

&lt;footer&gt;
  INFORMATIKA · SISTEM KOMPUTER &amp; ARSITEKTUR VON NEUMANN · FASE E KELAS X SMK
&lt;/footer&gt;

&lt;/body&gt;
&lt;/html&gt;</description><link>http://kitab-investasi.blogspot.com/2026/07/sistem-komputer-arsitektur-von-neumann.html</link><thr:total>0</thr:total><author>nof_rizal07@yahoo.co.id (abang_cool)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-9000860041661554971.post-1012881908066357365</guid><pubDate>Wed, 29 Jul 2026 01:36:39 +0000</pubDate><atom:updated>2026-07-29T09:03:10.220+07:00</atom:updated><title>Membandingkan Teks Prosedur dengan Teks Lain</title><description>&lt;style&gt;
@import url('https://fonts.googleapis.com/css2?family=Oswald:wght@400;500;600;700&amp;family=Source+Sans+3:wght@400;500;600;700&amp;family=IBM+Plex+Mono:wght@400;500;600&amp;display=swap');
.epb{
  --blueprint:#0F2A3D;
  --blueprint-deep:#0A1E2C;
  --panel:#4A2E12;
  --paper:#F3F0E6;
  --ink:#132029;
  --amber:#F5A623;
  --amber-deep:#C97F12;
  --mint:#6EC6CA;
  --line:rgba(234,242,245,0.16);
  --off-white:#EAF2F5;
  --muted:#9FB4C2;
}
.epb *{box-sizing:border-box;}
.epb{scroll-behavior:smooth; background:#0A1F2E;}
.epb{
  margin:0;
  position:relative;
  overflow:hidden;
  background:var(--blueprint);
  color:var(--off-white);
  font-family:'Source Sans 3',sans-serif;
  line-height:1.65;
  background-image:
    linear-gradient(var(--line) 1px, transparent 1px),
    linear-gradient(90deg, var(--line) 1px, transparent 1px);
  background-size: 34px 34px;
}
.epb h1, .epb h2, .epb h3, .epb h4{font-family:'Oswald',sans-serif; text-transform:uppercase; letter-spacing:0.02em; margin:0 0 0.5em;}
.epb .mono{font-family:'IBM Plex Mono',monospace;}
.epb a{color:var(--amber);}
.epb .crop{position:absolute; width:22px; height:22px; z-index:5; opacity:.55; pointer-events:none;}
.epb .crop::before, .epb .crop::after{content:"";position:absolute;background:var(--mint);}
.epb .crop::before{width:100%;height:1px;top:50%;left:0;}
.epb .crop::after{width:1px;height:100%;left:50%;top:0;}
.epb .crop.tl{top:14px;left:14px;}
.epb .crop.tr{top:14px;right:14px;}
.epb .crop.bl{bottom:14px;left:14px;}
.epb .crop.br{bottom:14px;right:14px;}
.epb header.cover{
  position:relative;
  padding:40px 24px 36px;
  border-bottom:1px solid var(--line);
  overflow:hidden;
}
.epb .doc-code{font-family:'IBM Plex Mono',monospace; color:var(--amber); letter-spacing:0.15em; font-size:0.78rem; text-transform:uppercase; margin-bottom:18px; display:flex; gap:10px; align-items:center;}
.epb .doc-code::before{content:"◆"; color:var(--amber);}
.epb .cover h1{font-size:clamp(1.6rem,7vw,2.5rem); color:var(--off-white); max-width:16ch; line-height:1.05;}
.epb .cover .subtitle{color:var(--muted); font-size:1.05rem; max-width:60ch; margin-top:14px;}
.epb .meta-strip{
  margin-top:38px; display:grid; grid-template-columns:repeat(auto-fit,minmax(150px,1fr));
  border-top:1px dashed var(--line); border-bottom:1px dashed var(--line);
}
.epb .meta-strip div{padding:14px 16px; border-right:1px dashed var(--line);}
.epb .meta-strip div:last-child{border-right:none;}
.epb .meta-strip .k{font-family:'IBM Plex Mono',monospace; font-size:0.68rem; color:var(--amber); text-transform:uppercase; letter-spacing:0.1em;}
.epb .meta-strip .v{font-size:0.98rem; color:var(--off-white); margin-top:4px; font-weight:600;}
.epb .stamp{
  position:absolute; top:40px; right:20px; width:104px; height:104px;
  border:2.5px solid var(--amber); border-radius:50%;
  display:flex; align-items:center; justify-content:center;
  transform:rotate(-11deg);
  color:var(--amber); font-family:'IBM Plex Mono',monospace;
  text-align:center; font-size:0.62rem; letter-spacing:0.08em; text-transform:uppercase;
  opacity:0.9;
}
.epb .stamp .ring{position:absolute; inset:8px; border:1px dashed var(--amber); border-radius:50%;}
.epb .stamp b{display:block; font-family:'Oswald',sans-serif; font-size:1.05rem; letter-spacing:0.06em; margin-top:4px;}

@media (max-width:760px){.epb .stamp{display:none;}
.epb }


.epb main{max-width:920px; margin:0 auto; padding:0 20px 60px;}
.epb .section{padding-top:64px;}
.epb .eyebrow{font-family:'IBM Plex Mono',monospace; color:var(--amber); font-size:0.78rem; letter-spacing:0.14em; text-transform:uppercase; margin-bottom:10px; display:flex; align-items:center; gap:10px;}
.epb .eyebrow::after{content:""; flex:1; height:1px; background:var(--line);}
.epb h2.section-title{font-size:1.7rem; color:var(--off-white);}
.epb p{color:#DDE7EC;}
.epb .lead{color:var(--muted); font-size:1.02rem; max-width:72ch;}
.epb .panel{
  background:var(--panel); border:1px solid var(--line); border-radius:2px;
  padding:26px 28px; margin:22px 0;
}
.epb .panel.tp{border-left:4px solid var(--mint);}
.epb .panel.warn{border-left:4px solid var(--amber);}
.epb .tp-box{display:grid; gap:14px; margin-top:18px;}
.epb .tp-item{display:flex; gap:14px; align-items:flex-start;}
.epb .tp-item .idx{font-family:'IBM Plex Mono',monospace; color:var(--amber); font-weight:600; min-width:34px;}
.epb .flow{display:grid; grid-template-columns:repeat(auto-fit,minmax(220px,1fr)); gap:14px; margin-top:20px;}
.epb .flow .step{background:var(--blueprint-deep); border:1px solid var(--line); padding:18px; position:relative;}
.epb .flow .step .tag{font-family:'IBM Plex Mono',monospace; color:var(--amber); font-size:0.7rem; letter-spacing:0.1em; text-transform:uppercase;}
.epb .flow .step h4{font-size:1rem; margin-top:8px; color:var(--off-white);}
.epb .flow .step .time{position:absolute; top:16px; right:16px; font-family:'IBM Plex Mono',monospace; font-size:0.7rem; color:var(--amber);}
.epb .grid-3{display:grid; grid-template-columns:repeat(auto-fit,minmax(200px,1fr)); gap:14px; margin-top:16px;}
.epb .card{background:var(--blueprint-deep); border:1px solid var(--line); padding:18px;}
.epb .card h4{color:var(--amber); font-size:0.95rem;}
.epb .criteria{display:grid; gap:16px; margin-top:20px;}
.epb .crit{
  background:var(--blueprint-deep); border:1px solid var(--line);
  display:grid; grid-template-columns:64px 1fr; gap:0;
}
.epb .crit .num{
  background:var(--amber); color:var(--blueprint-deep); font-family:'IBM Plex Mono',monospace;
  font-weight:700; display:flex; align-items:center; justify-content:center; font-size:1.05rem;
}
.epb .crit .body{padding:18px 20px;}
.epb .crit h4{color:var(--off-white); font-size:1.02rem; margin-bottom:6px;}
.epb .crit .q{margin-top:10px; padding-top:10px; border-top:1px dashed var(--line); font-family:'IBM Plex Mono',monospace; font-size:0.86rem; color:var(--amber);}
.epb .timeline{margin-top:24px; position:relative; padding-left:34px;}
.epb .timeline::before{content:""; position:absolute; left:11px; top:6px; bottom:6px; width:2px; background:var(--line);}
.epb .tl-item{position:relative; padding-bottom:26px;}
.epb .tl-item:last-child{padding-bottom:0;}
.epb .tl-item::before{content:""; position:absolute; left:-34px; top:2px; width:22px; height:22px; border-radius:50%; background:var(--blueprint); border:2px solid var(--amber);}
.epb .tl-item h4{color:var(--off-white); font-size:1rem; margin-bottom:4px;}
.epb .doc-sample{
  background:var(--paper); color:var(--ink); border-radius:2px; padding:0; margin-top:22px;
  box-shadow:0 20px 45px rgba(0,0,0,0.35);
}
.epb .doc-sample .doc-head{background:var(--ink); color:var(--paper); padding:12px 22px; font-family:'IBM Plex Mono',monospace; font-size:0.75rem; letter-spacing:0.1em; text-transform:uppercase; display:flex; justify-content:space-between;}
.epb .doc-sample .doc-body{padding:26px 28px 30px;}
.epb .doc-sample h3{font-family:'Oswald',sans-serif; color:var(--ink); font-size:1.25rem; text-transform:none; letter-spacing:0;}
.epb .doc-sample ol{padding-left:22px;}
.epb .doc-sample li{margin-bottom:9px;}
.epb .flag{
  display:inline-block; font-family:'IBM Plex Mono',monospace; font-size:0.7rem; font-weight:600;
  background:#D94E2A; color:#fff; padding:1px 7px; border-radius:2px; margin-left:6px; vertical-align:middle;
}
.epb .doc-sample .note-margin{margin-top:6px; font-family:'IBM Plex Mono',monospace; font-size:0.78rem; color:#8A3A1F; padding-left:8px; border-left:2px solid #D94E2A;}
.epb .legend{display:flex; flex-wrap:wrap; gap:10px 20px; margin-top:16px;}
.epb .legend span{font-family:'IBM Plex Mono',monospace; font-size:0.78rem; color:var(--muted); display:flex; align-items:center; gap:8px;}
.epb .legend .dot{width:10px; height:10px; border-radius:50%; display:inline-block;}
.epb table{width:100%; border-collapse:collapse; margin-top:18px; font-size:0.94rem;}
.epb th, .epb td{border:1px solid var(--line); padding:10px 12px; text-align:left; vertical-align:top;}
.epb th{background:var(--blueprint-deep); font-family:'IBM Plex Mono',monospace; font-size:0.75rem; text-transform:uppercase; letter-spacing:0.06em; color:var(--amber);}
.epb .summary-box{
  border:1px solid var(--amber); background:linear-gradient(180deg, rgba(245,166,35,0.08), transparent);
  padding:24px 26px; margin-top:24px;
}
.epb .summary-box ul{margin:10px 0 0; padding-left:20px;}
.epb .summary-box li{margin-bottom:8px;}
.epb .task-header{
  background:var(--amber); color:var(--blueprint-deep); padding:22px 26px; margin-top:20px;
  display:flex; justify-content:space-between; align-items:center; flex-wrap:wrap; gap:10px;
}
.epb .task-header h2{color:var(--blueprint-deep); font-size:1.4rem; margin:0;}
.epb .task-header .badge{font-family:'IBM Plex Mono',monospace; font-size:0.8rem; background:var(--blueprint-deep); color:var(--amber); padding:6px 12px; border-radius:2px;}
.epb .steps-num{counter-reset:step; margin-top:18px; list-style:none; padding:0;}
.epb .steps-num li{counter-increment:step; position:relative; padding-left:44px; margin-bottom:16px;}
.epb .steps-num li::before{content:counter(step,decimal-leading-zero); position:absolute; left:0; top:0; font-family:'IBM Plex Mono',monospace; color:var(--amber); font-weight:600; font-size:0.95rem; border:1px solid var(--amber); width:30px; height:26px; display:flex; align-items:center; justify-content:center;}
.epb .rubric-scale{display:grid; grid-template-columns:repeat(4,1fr); gap:10px; margin-top:16px;}
.epb .rubric-scale div{background:var(--blueprint-deep); border:1px solid var(--line); padding:12px; text-align:center;}
.epb .rubric-scale .n{font-family:'IBM Plex Mono',monospace; color:var(--amber); font-size:1.3rem; font-weight:700;}
.epb .rubric-scale .l{font-size:0.78rem; color:var(--muted); text-transform:uppercase; letter-spacing:0.05em;}
.epb .notebook{
  background:repeating-linear-gradient(var(--paper), var(--paper) 33px, #D8D3C2 34px);
  color:var(--ink); border-radius:2px; padding:28px 30px; margin-top:20px; position:relative;
  box-shadow:0 20px 45px rgba(0,0,0,0.35);
}
.epb .notebook::before{content:""; position:absolute; left:46px; top:0; bottom:0; width:1.5px; background:#C0453A; opacity:0.5;}
.epb .notebook .content{padding-left:24px;}
.epb .notebook h3{color:var(--ink); font-family:'Oswald',sans-serif; letter-spacing:0.02em; margin-bottom:10px;}
.epb .notebook ul{padding-left:20px;}
.epb footer{border-top:1px solid var(--line); padding:24px 20px 40px; color:var(--muted); font-size:0.86rem;}
.epb footer .doc-code{margin-bottom:10px;}
.epb .divider-dash{border:none; border-top:1px dashed var(--line); margin:44px 0 0;}
.epb::selection{background:var(--amber); color:var(--blueprint-deep);}

&lt;/style&gt;
&lt;div class="epb"&gt;
&lt;div class="crop tl"&gt;&lt;/div&gt;&lt;div class="crop tr"&gt;&lt;/div&gt;&lt;div class="crop bl"&gt;&lt;/div&gt;&lt;div class="crop br"&gt;&lt;/div&gt;

&lt;header class="cover"&gt;
  &lt;div class="stamp"&gt;&lt;div class="ring"&gt;&lt;/div&gt;&lt;span&gt;Modul Ajar&lt;b&gt;Terverifikasi&lt;/b&gt;Fase F&lt;/span&gt;&lt;/div&gt;
  &lt;div class="doc-code"&gt;DOK/B.INDO/XI/PROSEDUR-BANDING — 3 JP · 1 Pertemuan&lt;/div&gt;
  &lt;h1&gt;Membandingkan Teks Prosedur dengan Teks Lain&lt;/h1&gt;
  &lt;p class="subtitle"&gt;Materi Bahasa Indonesia Kelas XI SMK/MAK — melatih murid membandingkan teks prosedur dengan teks eksplanasi untuk menemukan persamaan dan perbedaan keduanya secara kritis dan sistematis.&lt;/p&gt;

  &lt;div class="meta-strip"&gt;
    &lt;div&gt;&lt;div class="k"&gt;Mata Pelajaran&lt;/div&gt;&lt;div class="v"&gt;Bahasa Indonesia&lt;/div&gt;&lt;/div&gt;
    &lt;div&gt;&lt;div class="k"&gt;Jenjang&lt;/div&gt;&lt;div class="v"&gt;SMK/MAK — Kelas XI&lt;/div&gt;&lt;/div&gt;
    &lt;div&gt;&lt;div class="k"&gt;Elemen&lt;/div&gt;&lt;div class="v"&gt;Membaca &amp;amp; Memirsa&lt;/div&gt;&lt;/div&gt;
    &lt;div&gt;&lt;div class="k"&gt;Alokasi Waktu&lt;/div&gt;&lt;div class="v"&gt;3 JP (3 × 45 menit)&lt;/div&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/header&gt;

&lt;main&gt;

  &lt;!-- ============ TUJUAN PEMBELAJARAN ============ --&gt;
  &lt;section class="section" id="tujuan"&gt;
    &lt;div class="eyebrow"&gt;01 — Identitas Pembelajaran&lt;/div&gt;
    &lt;h2 class="section-title"&gt;Capaian &amp;amp; Tujuan Pembelajaran&lt;/h2&gt;

    &lt;div class="panel tp"&gt;
      &lt;div class="eyebrow" style="margin-bottom:6px;"&gt;Capaian Pembelajaran (Elemen Membaca–Memirsa)&lt;/div&gt;
      &lt;p&gt;Murid mampu mengevaluasi informasi berupa gagasan, pikiran, pandangan, arahan, atau pesan dari berbagai jenis teks, termasuk teks prosedur, untuk menemukan makna yang tersurat dan tersirat, serta membandingkan teks tersebut dengan jenis teks lain untuk menemukan persamaan dan perbedaannya secara kritis.&lt;/p&gt;
    &lt;/div&gt;

    &lt;div class="panel"&gt;
      &lt;div class="eyebrow" style="margin-bottom:6px;"&gt;Tujuan Pembelajaran&lt;/div&gt;
      &lt;p style="font-size:1.05rem; color:var(--off-white); font-weight:600;"&gt;Murid mampu membandingkan teks prosedur dengan teks lainnya yang mendukung serta menemukan persamaan dan perbedaannya.&lt;/p&gt;

      &lt;div class="tp-box"&gt;
        &lt;div class="tp-item"&gt;&lt;span class="idx mono"&gt;TP.1&lt;/span&gt;&lt;p&gt;Murid dapat menjelaskan kembali struktur dan ciri kebahasaan teks prosedur.&lt;/p&gt;&lt;/div&gt;
        &lt;div class="tp-item"&gt;&lt;span class="idx mono"&gt;TP.2&lt;/span&gt;&lt;p&gt;Murid dapat menjelaskan struktur dan ciri kebahasaan teks eksplanasi sebagai teks pembanding.&lt;/p&gt;&lt;/div&gt;
        &lt;div class="tp-item"&gt;&lt;span class="idx mono"&gt;TP.3&lt;/span&gt;&lt;p&gt;Murid dapat menemukan persamaan antara teks prosedur dan teks eksplanasi berdasarkan tujuan, struktur, dan kebahasaannya.&lt;/p&gt;&lt;/div&gt;
        &lt;div class="tp-item"&gt;&lt;span class="idx mono"&gt;TP.4&lt;/span&gt;&lt;p&gt;Murid dapat menemukan perbedaan antara teks prosedur dan teks eksplanasi, lalu menyusun simpulan perbandingan secara tertulis.&lt;/p&gt;&lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class="eyebrow" style="margin-top:26px; margin-bottom:6px;"&gt;8 Profil Lulusan yang Dikembangkan&lt;/div&gt;
    &lt;div class="grid-3"&gt;
      &lt;div class="card"&gt;&lt;h4&gt;Penalaran Kritis&lt;/h4&gt;&lt;p style="font-size:0.9rem;"&gt;Menganalisis persamaan dan perbedaan dua jenis teks berdasarkan bukti tekstual.&lt;/p&gt;&lt;/div&gt;
      &lt;div class="card"&gt;&lt;h4&gt;Kemandirian&lt;/h4&gt;&lt;p style="font-size:0.9rem;"&gt;Menyelesaikan simpulan perbandingan dan rangkuman secara mandiri.&lt;/p&gt;&lt;/div&gt;
      &lt;div class="card"&gt;&lt;h4&gt;Kolaborasi&lt;/h4&gt;&lt;p style="font-size:0.9rem;"&gt;Bekerja sama dalam kelompok saat membandingkan dua teks.&lt;/p&gt;&lt;/div&gt;
      &lt;div class="card"&gt;&lt;h4&gt;Komunikasi&lt;/h4&gt;&lt;p style="font-size:0.9rem;"&gt;Menyampaikan hasil perbandingan teks secara jelas dan runtut.&lt;/p&gt;&lt;/div&gt;
    &lt;/div&gt;
  &lt;/section&gt;

  &lt;hr class="divider-dash"&gt;

  &lt;!-- ============ MATERI A ============ --&gt;
  &lt;section class="section" id="materi-a"&gt;
    &lt;div class="eyebrow"&gt;02 — Materi Inti A&lt;/div&gt;
    &lt;h2 class="section-title"&gt;Mengingat Kembali Teks Prosedur&lt;/h2&gt;
    &lt;p class="lead"&gt;Sebelum membandingkan, murid perlu mengingat kembali ciri utama teks prosedur sebagai salah satu teks yang akan dibandingkan.&lt;/p&gt;

    &lt;div class="panel"&gt;
      &lt;p&gt;&lt;b style="color:var(--off-white);"&gt;Teks prosedur&lt;/b&gt; adalah teks yang berisi langkah-langkah sistematis untuk melakukan atau membuat sesuatu, bertujuan agar pembaca dapat mencapai hasil tertentu jika mengikuti langkah tersebut dengan tepat.&lt;/p&gt;
    &lt;/div&gt;

    &lt;div class="grid-3"&gt;
      &lt;div class="card"&gt;&lt;h4&gt;Tujuan&lt;/h4&gt;&lt;p style="font-size:0.92rem;"&gt;Mengarahkan pembaca untuk &lt;b&gt;melakukan tindakan&lt;/b&gt; tertentu secara berurutan.&lt;/p&gt;&lt;/div&gt;
      &lt;div class="card"&gt;&lt;h4&gt;Struktur&lt;/h4&gt;&lt;p style="font-size:0.92rem;"&gt;Tujuan → alat/bahan (jika ada) → langkah-langkah → penutup/hasil.&lt;/p&gt;&lt;/div&gt;
      &lt;div class="card"&gt;&lt;h4&gt;Ciri Kebahasaan&lt;/h4&gt;&lt;p style="font-size:0.92rem;"&gt;Kalimat imperatif, konjungsi temporal (kemudian, lalu, setelah itu), verba tindakan.&lt;/p&gt;&lt;/div&gt;
    &lt;/div&gt;
  &lt;/section&gt;

  &lt;hr class="divider-dash"&gt;

  &lt;!-- ============ MATERI B ============ --&gt;
  &lt;section class="section" id="materi-b"&gt;
    &lt;div class="eyebrow"&gt;03 — Materi Inti B&lt;/div&gt;
    &lt;h2 class="section-title"&gt;Mengenal Teks Eksplanasi sebagai Teks Pembanding&lt;/h2&gt;
    &lt;p class="lead"&gt;Teks eksplanasi dipilih sebagai teks pembanding karena sama-sama menjelaskan sebuah proses, namun dengan tujuan yang berbeda dari teks prosedur.&lt;/p&gt;

    &lt;div class="panel"&gt;
      &lt;p&gt;&lt;b style="color:var(--off-white);"&gt;Teks eksplanasi&lt;/b&gt; adalah teks yang menjelaskan proses terjadinya suatu fenomena (alam, sosial, atau ilmiah) berdasarkan hubungan sebab-akibat, bertujuan agar pembaca &lt;b&gt;memahami mengapa dan bagaimana&lt;/b&gt; sesuatu terjadi — bukan untuk diikuti sebagai tindakan.&lt;/p&gt;
    &lt;/div&gt;

    &lt;div class="grid-3"&gt;
      &lt;div class="card"&gt;&lt;h4&gt;Tujuan&lt;/h4&gt;&lt;p style="font-size:0.92rem;"&gt;Menjelaskan proses/fenomena agar pembaca &lt;b&gt;memahami&lt;/b&gt;, bukan melakukan tindakan.&lt;/p&gt;&lt;/div&gt;
      &lt;div class="card"&gt;&lt;h4&gt;Struktur&lt;/h4&gt;&lt;p style="font-size:0.92rem;"&gt;Pernyataan umum → deretan penjelas (sebab-akibat) → interpretasi/penutup.&lt;/p&gt;&lt;/div&gt;
      &lt;div class="card"&gt;&lt;h4&gt;Ciri Kebahasaan&lt;/h4&gt;&lt;p style="font-size:0.92rem;"&gt;Konjungsi kausalitas (sebab, karena, akibatnya) dan kronologis, kalimat pasif, istilah ilmiah/faktual.&lt;/p&gt;&lt;/div&gt;
    &lt;/div&gt;
  &lt;/section&gt;

  &lt;hr class="divider-dash"&gt;

  &lt;!-- ============ MATERI C: PERSAMAAN ============ --&gt;
  &lt;section class="section" id="materi-c"&gt;
    &lt;div class="eyebrow"&gt;04 — Materi Inti C&lt;/div&gt;
    &lt;h2 class="section-title"&gt;Persamaan Teks Prosedur dan Teks Eksplanasi&lt;/h2&gt;
    &lt;p class="lead"&gt;Meskipun berbeda tujuan, kedua teks memiliki beberapa kesamaan mendasar berikut.&lt;/p&gt;

    &lt;div class="criteria"&gt;
      &lt;div class="crit"&gt;
        &lt;div class="num mono"&gt;1&lt;/div&gt;
        &lt;div class="body"&gt;
          &lt;h4&gt;Sama-Sama Menjelaskan Proses/Tahapan&lt;/h4&gt;
          &lt;p style="margin:0;"&gt;Kedua teks disusun dalam rangkaian tahap atau langkah yang berurutan, bukan sekadar kumpulan informasi acak.&lt;/p&gt;
        &lt;/div&gt;
      &lt;/div&gt;
      &lt;div class="crit"&gt;
        &lt;div class="num mono"&gt;2&lt;/div&gt;
        &lt;div class="body"&gt;
          &lt;h4&gt;Bersifat Informatif dan Faktual&lt;/h4&gt;
          &lt;p style="margin:0;"&gt;Keduanya menyampaikan informasi berdasarkan fakta atau kebenaran umum, bukan opini atau imajinasi penulis.&lt;/p&gt;
        &lt;/div&gt;
      &lt;/div&gt;
      &lt;div class="crit"&gt;
        &lt;div class="num mono"&gt;3&lt;/div&gt;
        &lt;div class="body"&gt;
          &lt;h4&gt;Menggunakan Konjungsi Urutan&lt;/h4&gt;
          &lt;p style="margin:0;"&gt;Keduanya memakai kata penghubung yang menandai urutan, baik urutan waktu maupun urutan sebab-akibat.&lt;/p&gt;
        &lt;/div&gt;
      &lt;/div&gt;
      &lt;div class="crit"&gt;
        &lt;div class="num mono"&gt;4&lt;/div&gt;
        &lt;div class="body"&gt;
          &lt;h4&gt;Disusun secara Sistematis&lt;/h4&gt;
          &lt;p style="margin:0;"&gt;Kedua teks memiliki struktur yang jelas dan tidak dapat diacak susunannya tanpa mengubah makna.&lt;/p&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/section&gt;

  &lt;hr class="divider-dash"&gt;

  &lt;!-- ============ MATERI D: PERBEDAAN ============ --&gt;
  &lt;section class="section" id="materi-d"&gt;
    &lt;div class="eyebrow"&gt;05 — Materi Inti D&lt;/div&gt;
    &lt;h2 class="section-title"&gt;Perbedaan Teks Prosedur dan Teks Eksplanasi&lt;/h2&gt;
    &lt;p class="lead"&gt;Gunakan tabel berikut untuk membandingkan kedua teks berdasarkan beberapa aspek utama.&lt;/p&gt;

    &lt;table&gt;
      &lt;tr&gt;&lt;th style="width:22%;"&gt;Aspek&lt;/th&gt;&lt;th&gt;Teks Prosedur&lt;/th&gt;&lt;th&gt;Teks Eksplanasi&lt;/th&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Tujuan&lt;/td&gt;&lt;td&gt;Mengarahkan pembaca &lt;b&gt;melakukan&lt;/b&gt; sesuatu&lt;/td&gt;&lt;td&gt;Membuat pembaca &lt;b&gt;memahami&lt;/b&gt; suatu proses/fenomena&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Fokus Isi&lt;/td&gt;&lt;td&gt;Tindakan yang harus dilakukan manusia&lt;/td&gt;&lt;td&gt;Proses alami, ilmiah, atau sosial yang terjadi dengan sendirinya&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Struktur&lt;/td&gt;&lt;td&gt;Tujuan → alat/bahan → langkah-langkah → penutup&lt;/td&gt;&lt;td&gt;Pernyataan umum → deretan penjelas → interpretasi&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Kalimat Dominan&lt;/td&gt;&lt;td&gt;Kalimat imperatif (perintah/anjuran)&lt;/td&gt;&lt;td&gt;Kalimat deklaratif/pasif (pernyataan)&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Konjungsi Utama&lt;/td&gt;&lt;td&gt;Konjungsi temporal (lalu, kemudian, setelah itu)&lt;/td&gt;&lt;td&gt;Konjungsi kausalitas (karena, sebab, akibatnya)&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Hasil bagi Pembaca&lt;/td&gt;&lt;td&gt;Mampu melakukan/menghasilkan sesuatu&lt;/td&gt;&lt;td&gt;Mampu menjelaskan mengapa/bagaimana sesuatu terjadi&lt;/td&gt;&lt;/tr&gt;
    &lt;/table&gt;
  &lt;/section&gt;

  &lt;hr class="divider-dash"&gt;

  &lt;!-- ============ MATERI E: LANGKAH MEMBANDINGKAN ============ --&gt;
  &lt;section class="section" id="materi-e"&gt;
    &lt;div class="eyebrow"&gt;06 — Materi Inti E&lt;/div&gt;
    &lt;h2 class="section-title"&gt;Langkah-Langkah Membandingkan Dua Teks&lt;/h2&gt;

    &lt;div class="timeline"&gt;
      &lt;div class="tl-item"&gt;&lt;h4 class="mono"&gt;01 · Membaca Kedua Teks&lt;/h4&gt;&lt;p&gt;Baca teks prosedur dan teks eksplanasi secara menyeluruh untuk memahami isi masing-masing.&lt;/p&gt;&lt;/div&gt;
      &lt;div class="tl-item"&gt;&lt;h4 class="mono"&gt;02 · Mengidentifikasi Tujuan&lt;/h4&gt;&lt;p&gt;Tentukan tujuan penulisan setiap teks: apakah mengarahkan tindakan atau menjelaskan proses.&lt;/p&gt;&lt;/div&gt;
      &lt;div class="tl-item"&gt;&lt;h4 class="mono"&gt;03 · Membandingkan Struktur&lt;/h4&gt;&lt;p&gt;Bandingkan bagian-bagian pembangun kedua teks dan urutannya.&lt;/p&gt;&lt;/div&gt;
      &lt;div class="tl-item"&gt;&lt;h4 class="mono"&gt;04 · Membandingkan Ciri Kebahasaan&lt;/h4&gt;&lt;p&gt;Cermati jenis kalimat dan konjungsi dominan yang digunakan pada masing-masing teks.&lt;/p&gt;&lt;/div&gt;
      &lt;div class="tl-item"&gt;&lt;h4 class="mono"&gt;05 · Menyusun Simpulan Perbandingan&lt;/h4&gt;&lt;p&gt;Tuliskan persamaan dan perbedaan kedua teks secara ringkas dan berdasarkan bukti dari teks.&lt;/p&gt;&lt;/div&gt;
    &lt;/div&gt;
  &lt;/section&gt;

  &lt;hr class="divider-dash"&gt;

  &lt;!-- ============ CONTOH PENERAPAN ============ --&gt;
  &lt;section class="section" id="contoh"&gt;
    &lt;div class="eyebrow"&gt;07 — Pemodelan&lt;/div&gt;
    &lt;h2 class="section-title"&gt;Contoh Penerapan: Membandingkan Dua Teks&lt;/h2&gt;
    &lt;p class="lead"&gt;Guru membacakan dan membahas bersama sepasang teks berikut sebagai model penerapan sebelum murid mengerjakan tugas kelompok.&lt;/p&gt;

    &lt;div class="doc-sample"&gt;
      &lt;div class="doc-head"&gt;&lt;span&gt;Lampiran · Teks Prosedur Contoh&lt;/span&gt;&lt;span&gt;Dokumen-01&lt;/span&gt;&lt;/div&gt;
      &lt;div class="doc-body"&gt;
        &lt;h3&gt;Prosedur Membuat Kompos dari Sampah Organik&lt;/h3&gt;
        &lt;p style="margin-top:-4px; color:#4b5a63;"&gt;&lt;i&gt;Tujuan: Mengubah sampah organik rumah tangga menjadi kompos yang dapat digunakan sebagai pupuk.&lt;/i&gt;&lt;/p&gt;
        &lt;ol&gt;
          &lt;li&gt;Kumpulkan sampah organik seperti sisa sayuran, buah, dan daun kering.&lt;/li&gt;
          &lt;li&gt;Cacah sampah organik menjadi potongan kecil agar cepat terurai.&lt;/li&gt;
          &lt;li&gt;Masukkan sampah organik ke dalam wadah komposter secara berlapis dengan tanah.&lt;/li&gt;
          &lt;li&gt;Siram dengan sedikit air agar kelembapan terjaga, lalu tutup wadah.&lt;/li&gt;
          &lt;li&gt;Aduk campuran setiap tiga hari sekali selama proses pengomposan berlangsung.&lt;/li&gt;
          &lt;li&gt;Setelah 3–4 minggu, kompos siap digunakan sebagai pupuk tanaman.&lt;/li&gt;
        &lt;/ol&gt;
      &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class="doc-sample" style="margin-top:22px;"&gt;
      &lt;div class="doc-head"&gt;&lt;span&gt;Lampiran · Teks Eksplanasi Contoh&lt;/span&gt;&lt;span&gt;Dokumen-02&lt;/span&gt;&lt;/div&gt;
      &lt;div class="doc-body"&gt;
        &lt;h3 style="color:#132029 !important;"&gt;Proses Terjadinya Pengomposan pada Sampah Organik&lt;/h3&gt;
        &lt;p style="margin-top:-4px; color:#4b5a63 !important;"&gt;&lt;i&gt;Pernyataan umum: Pengomposan adalah proses penguraian bahan organik oleh mikroorganisme menjadi bahan yang lebih sederhana dan bermanfaat bagi tanah.&lt;/i&gt;&lt;/p&gt;
        &lt;p style="margin:10px 0; color:#132029 !important;"&gt;Proses ini terjadi karena mikroorganisme seperti bakteri dan jamur menguraikan senyawa organik kompleks pada sisa sayuran dan daun. Akibat aktivitas mikroorganisme tersebut, suhu tumpukan sampah meningkat sehingga mempercepat proses penguraian. Seiring berjalannya waktu, struktur sampah organik berubah menjadi lebih gelap, remah, dan tidak berbau menyengat sebagai tanda bahwa proses penguraian telah selesai.&lt;/p&gt;
        &lt;p style="margin:10px 0 0; color:#4b5a63 !important;"&gt;&lt;i&gt;Interpretasi: Dengan demikian, pengomposan merupakan proses alami yang mengubah sampah organik menjadi materi yang bermanfaat bagi kesuburan tanah.&lt;/i&gt;&lt;/p&gt;
      &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class="panel" style="margin-top:22px;"&gt;
      &lt;p style="margin:0;"&gt;&lt;b style="color:var(--off-white);"&gt;Simpulan model perbandingan:&lt;/b&gt; Kedua teks membahas tema yang sama, yaitu pengomposan sampah organik. &lt;b&gt;Persamaannya&lt;/b&gt;, keduanya bersifat informatif dan disusun secara bertahap. &lt;b&gt;Perbedaannya&lt;/b&gt;, teks pertama berisi instruksi yang harus dilakukan pembaca (kalimat imperatif, konjungsi temporal), sedangkan teks kedua menjelaskan proses alami yang terjadi dengan sendirinya (kalimat deklaratif, konjungsi kausalitas) agar pembaca memahami mengapa dan bagaimana pengomposan terjadi.&lt;/p&gt;
    &lt;/div&gt;
  &lt;/section&gt;

  &lt;hr class="divider-dash"&gt;

  &lt;!-- ============ RANGKUMAN ============ --&gt;
  &lt;section class="section" id="rangkuman"&gt;
    &lt;div class="eyebrow"&gt;08 — Ringkasan Materi&lt;/div&gt;
    &lt;h2 class="section-title"&gt;Poin-Poin Penting&lt;/h2&gt;
    &lt;div class="summary-box"&gt;
      &lt;ul&gt;
        &lt;li&gt;Teks prosedur bertujuan mengarahkan pembaca melakukan tindakan, sedangkan teks eksplanasi bertujuan membuat pembaca memahami suatu proses/fenomena.&lt;/li&gt;
        &lt;li&gt;Persamaan kedua teks: sama-sama menjelaskan proses/tahapan, bersifat informatif dan faktual, menggunakan konjungsi urutan, dan disusun secara sistematis.&lt;/li&gt;
        &lt;li&gt;Perbedaan utama terletak pada tujuan, fokus isi, struktur, jenis kalimat dominan, dan konjungsi yang digunakan.&lt;/li&gt;
        &lt;li&gt;Membandingkan dilakukan bertahap: membaca kedua teks → mengidentifikasi tujuan → membandingkan struktur → membandingkan kebahasaan → menyusun simpulan.&lt;/li&gt;
      &lt;/ul&gt;
    &lt;/div&gt;
  &lt;/section&gt;

  &lt;hr class="divider-dash"&gt;

  &lt;!-- ============ TUGAS KELOMPOK ============ --&gt;
  &lt;section class="section" id="tugas-kelompok"&gt;
    &lt;div class="eyebrow"&gt;09 — Lembar Kerja&lt;/div&gt;
    &lt;div class="task-header"&gt;
      &lt;h2&gt;Tugas Kelompok: Membandingkan Teks Prosedur dan Teks Eksplanasi&lt;/h2&gt;
      &lt;span class="badge"&gt;Durasi ± 60 menit&lt;/span&gt;
    &lt;/div&gt;

    &lt;p style="margin-top:18px;"&gt;&lt;b style="color:var(--off-white);"&gt;Tujuan tugas:&lt;/b&gt; Murid secara berkelompok membandingkan sepasang teks bertema sama berikut, lalu menemukan persamaan dan perbedaannya berdasarkan tujuan, struktur, dan ciri kebahasaan.&lt;/p&gt;

    &lt;div class="doc-sample" style="margin-top:20px;"&gt;
      &lt;div class="doc-head"&gt;&lt;span&gt;Lampiran · Teks Prosedur untuk Dibandingkan&lt;/span&gt;&lt;span&gt;Dokumen-03&lt;/span&gt;&lt;/div&gt;
      &lt;div class="doc-body"&gt;
        &lt;h3&gt;Prosedur Mendaur Ulang Botol Plastik menjadi Pot Tanaman&lt;/h3&gt;
        &lt;p style="margin-top:-4px; color:#4b5a63;"&gt;&lt;i&gt;Tujuan: Mengubah botol plastik bekas menjadi pot tanaman sederhana.&lt;/i&gt;&lt;/p&gt;
        &lt;ol&gt;
          &lt;li&gt;Siapkan botol plastik bekas, gunting, dan cat jika diperlukan.&lt;/li&gt;
          &lt;li&gt;Potong botol plastik menjadi dua bagian menggunakan gunting.&lt;/li&gt;
          &lt;li&gt;Buat beberapa lubang kecil di bagian bawah botol sebagai saluran air.&lt;/li&gt;
          &lt;li&gt;Hias bagian luar botol dengan cat sesuai selera.&lt;/li&gt;
          &lt;li&gt;Isi botol dengan tanah dan bibit tanaman.&lt;/li&gt;
          &lt;li&gt;Pot dari botol plastik siap digunakan untuk menanam.&lt;/li&gt;
        &lt;/ol&gt;
      &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class="doc-sample" style="margin-top:20px;"&gt;
      &lt;div class="doc-head"&gt;&lt;span&gt;Lampiran · Teks Eksplanasi untuk Dibandingkan&lt;/span&gt;&lt;span&gt;Dokumen-04&lt;/span&gt;&lt;/div&gt;
      &lt;div class="doc-body"&gt;
        &lt;h3 style="color:#132029 !important;"&gt;Proses Terjadinya Pencemaran Lingkungan akibat Sampah Plastik&lt;/h3&gt;
        &lt;p style="margin-top:-4px; color:#4b5a63 !important;"&gt;&lt;i&gt;Pernyataan umum: Pencemaran lingkungan akibat sampah plastik terjadi karena sifat plastik yang sulit terurai secara alami.&lt;/i&gt;&lt;/p&gt;
        &lt;p style="margin:10px 0; color:#132029 !important;"&gt;Plastik yang dibuang sembarangan akan terurai dalam waktu yang sangat lama, bahkan hingga ratusan tahun. Selama proses tersebut, plastik dapat mencemari tanah dan air karena melepaskan zat kimia berbahaya. Selain itu, sampah plastik yang menumpuk di saluran air dapat menyebabkan penyumbatan sehingga memicu banjir pada musim hujan.&lt;/p&gt;
        &lt;p style="margin:10px 0 0; color:#4b5a63 !important;"&gt;&lt;i&gt;Interpretasi: Oleh karena itu, pengelolaan sampah plastik yang tepat, termasuk melalui daur ulang, sangat penting untuk mengurangi dampak pencemaran lingkungan.&lt;/i&gt;&lt;/p&gt;
      &lt;/div&gt;
    &lt;/div&gt;

    &lt;h4 style="color:var(--off-white); margin-top:26px;"&gt;Petunjuk Pengerjaan&lt;/h4&gt;
    &lt;ol class="steps-num"&gt;
      &lt;li&gt;&lt;b&gt;Bentuk kelompok&lt;/b&gt; beranggotakan 4–5 orang sesuai pembagian dari guru.&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Baca kedua teks&lt;/b&gt; di atas secara bersama-sama dalam kelompok.&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Identifikasi tujuan, struktur, dan ciri kebahasaan&lt;/b&gt; masing-masing teks.&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Isi Tabel Perbandingan&lt;/b&gt; di bawah ini untuk setiap aspek yang diminta.&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Presentasikan hasil&lt;/b&gt; di depan kelas selama maksimal 5 menit per kelompok, dilanjutkan tanya jawab singkat.&lt;/li&gt;
    &lt;/ol&gt;

    &lt;h4 style="color:var(--off-white); margin-top:26px;"&gt;Format Tabel Perbandingan Kelompok&lt;/h4&gt;
    &lt;table&gt;
      &lt;tr&gt;&lt;th style="width:22%;"&gt;Aspek&lt;/th&gt;&lt;th&gt;Teks Prosedur&lt;/th&gt;&lt;th&gt;Teks Eksplanasi&lt;/th&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Tujuan&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Struktur&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Kalimat dominan&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Konjungsi utama&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Hasil bagi pembaca&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;
    &lt;/table&gt;

    &lt;h4 style="color:var(--off-white); margin-top:26px;"&gt;Rubrik Penilaian Kelompok&lt;/h4&gt;
    &lt;table&gt;
      &lt;tr&gt;&lt;th style="width:26%;"&gt;Aspek Penilaian&lt;/th&gt;&lt;th&gt;Skor 4 (Sangat Baik)&lt;/th&gt;&lt;th&gt;Skor 3 (Baik)&lt;/th&gt;&lt;th&gt;Skor 2 (Cukup)&lt;/th&gt;&lt;th&gt;Skor 1 (Kurang)&lt;/th&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Ketepatan identifikasi persamaan&lt;/td&gt;&lt;td&gt;Seluruh persamaan teridentifikasi tepat&lt;/td&gt;&lt;td&gt;Sebagian besar tepat&lt;/td&gt;&lt;td&gt;Identifikasi dangkal&lt;/td&gt;&lt;td&gt;Tidak sesuai&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Ketepatan identifikasi perbedaan&lt;/td&gt;&lt;td&gt;Seluruh perbedaan teridentifikasi tepat dengan bukti jelas&lt;/td&gt;&lt;td&gt;Sebagian besar tepat&lt;/td&gt;&lt;td&gt;Identifikasi dangkal&lt;/td&gt;&lt;td&gt;Tidak sesuai&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Kerja sama kelompok&lt;/td&gt;&lt;td&gt;Seluruh anggota aktif berkontribusi&lt;/td&gt;&lt;td&gt;Sebagian besar anggota aktif&lt;/td&gt;&lt;td&gt;Hanya sebagian kecil anggota aktif&lt;/td&gt;&lt;td&gt;Didominasi satu orang&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Presentasi&lt;/td&gt;&lt;td&gt;Jelas, percaya diri, menjawab pertanyaan dengan baik&lt;/td&gt;&lt;td&gt;Jelas namun kurang percaya diri&lt;/td&gt;&lt;td&gt;Kurang jelas/terbata-bata&lt;/td&gt;&lt;td&gt;Tidak dapat menjelaskan hasil&lt;/td&gt;&lt;/tr&gt;
    &lt;/table&gt;
  &lt;/section&gt;

  &lt;hr class="divider-dash"&gt;

  &lt;!-- ============ RANGKUMAN UNTUK BUKU CATATAN ============ --&gt;
  &lt;section class="section" id="catatan-murid"&gt;
    &lt;div class="eyebrow"&gt;10 — Penutup Pembelajaran&lt;/div&gt;
    &lt;h2 class="section-title"&gt;Rangkuman untuk Dicatat di Buku Catatan&lt;/h2&gt;
    &lt;p class="lead"&gt;Sebagai penutup pertemuan, setiap murid menuliskan satu rangkuman ringkas secara mandiri di buku catatan sebagai simpulan pribadi atas materi hari ini.&lt;/p&gt;

    &lt;div class="notebook"&gt;
      &lt;div class="content"&gt;
        &lt;h3 style="color:#132029 !important;"&gt;Instruksi Menulis Rangkuman&lt;/h3&gt;
        &lt;p style="margin-top:0; color:#132029 !important;"&gt;Tulis di buku catatan masing-masing, maksimal &lt;b&gt;satu halaman&lt;/b&gt;, mencakup poin-poin berikut:&lt;/p&gt;
        &lt;ul style="color:#132029 !important;"&gt;
          &lt;li style="color:#132029 !important;"&gt;Perbedaan tujuan antara teks prosedur dan teks eksplanasi, menurut pemahaman sendiri.&lt;/li&gt;
          &lt;li style="color:#132029 !important;"&gt;Minimal dua persamaan dan tiga perbedaan antara teks prosedur dan teks eksplanasi.&lt;/li&gt;
          &lt;li style="color:#132029 !important;"&gt;Langkah-langkah membandingkan dua teks secara berurutan.&lt;/li&gt;
          &lt;li style="color:#132029 !important;"&gt;Satu contoh situasi sehari-hari yang menunjukkan perbedaan antara "mengikuti prosedur" dan "memahami penjelasan proses".&lt;/li&gt;
        &lt;/ul&gt;
        &lt;p style="margin-bottom:0; color:#4b5a63 !important;"&gt;&lt;i&gt;Rangkuman ditulis dengan kalimat sendiri (bukan menyalin ulang dari materi), dan dikumpulkan pada awal pertemuan berikutnya untuk diperiksa guru.&lt;/i&gt;&lt;/p&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/section&gt;

&lt;/main&gt;

&lt;footer&gt;
  &lt;div class="doc-code"&gt;DOK/B.INDO/XI/PROSEDUR-BANDING — Fokus Tujuan Pembelajaran, Materi Inti &amp;amp; Tugas Kelompok, 1× pertemuan (3 JP)&lt;/div&gt;
  &lt;p style="margin:0;"&gt;Referensi: Kurikulum Merdeka — Capaian Pembelajaran Bahasa Indonesia Fase F (Elemen Membaca dan Memirsa); Buku Teks Bahasa Indonesia Kelas XI SMK/MAK Kemendikbudristek.&lt;/p&gt;
&lt;/footer&gt;
&lt;/div&gt;</description><link>http://kitab-investasi.blogspot.com/2026/07/membandingkan-teks-prosedur-dengan-teks.html</link><thr:total>0</thr:total><author>nof_rizal07@yahoo.co.id (abang_cool)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-9000860041661554971.post-4520144294968549584</guid><pubDate>Thu, 23 Jul 2026 07:35:22 +0000</pubDate><atom:updated>2026-07-24T07:29:26.342+07:00</atom:updated><title>Asesmen Awal Bahasa Indonesia XI SMK</title><description>&lt;!DOCTYPE html&gt;
&lt;html lang="id"&gt;
&lt;head&gt;
    &lt;meta charset="UTF-8"&gt;
    &lt;meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"&gt;
    &lt;title&gt;SMART • Asesmen Awal Bahasa Indonesia XI SMK&lt;/title&gt;
    &lt;style&gt;
        * { margin: 0; padding: 0; box-sizing: border-box; user-select: none; }
        html, body {
            width: 100%;
            min-height: 100vh;
            background: #080c18;
            font-family: 'Segoe UI', 'Arial', 'Helvetica', sans-serif;
            overflow: hidden;
            position: relative;
        }
        #game-wrapper {
            position: fixed;
            top: 0;
            left: 0;
            width: 100vw;
            height: 100vh;
            max-width: 100%;
            max-height: 100%;
            background: radial-gradient(circle at 20% 30%, #0e1a2b, #050a14);
            box-shadow: 0 0 50px #00d4ff40, 0 0 120px #0055ff20;
            border: 1px solid #00d4ff60;
            display: flex;
            flex-direction: column;
            padding: 16px;
            overflow: hidden;
            z-index: 9999;
        }
        #header {
            display: flex;
            justify-content: space-between;
            align-items: center;
            padding: 6px 12px;
            color: #a8e6ff;
            font-weight: bold;
            background: rgba(0, 20, 40, 0.6);
            backdrop-filter: blur(4px);
            border-radius: 60px;
            border: 1px solid #00d4ff80;
            margin-bottom: 10px;
            flex-shrink: 0;
        }
        #header span { background: #0a1a2e; padding: 4px 16px; border-radius: 40px; border: 1px solid #00d4ff; font-size: 0.9rem; letter-spacing: 1px; }
        #level-indicator { background: #0a1a2e; color: #7ad0ff; border-color: #00aaff; }
        #score-indicator { color: #facc15; border-color: #facc15; }
        #player-name-display { color: #7ad0ff; border-color: #00aaff; }
        #timer-display { background: #1a0a0a; color: #ff6b6b; border-color: #ff4444; min-width: 80px; text-align: center; }
        #game-canvas-container {
            flex: 1;
            position: relative;
            border-radius: 24px;
            overflow: hidden;
            min-height: 200px;
            border: 1px solid #00d4ff40;
            box-shadow: inset 0 0 60px #0044aa30;
            cursor: crosshair;
        }
        canvas { display: block; width: 100%; height: 100%; background: transparent; cursor: crosshair; }
        #question-panel {
            background: rgba(0, 16, 32, 0.85);
            backdrop-filter: blur(8px);
            border: 1px solid #00d4ff;
            border-radius: 40px;
            padding: 14px 20px;
            margin-top: 10px;
            color: #e6f7ff;
            font-weight: 600;
            font-size: clamp(0.95rem, 2.6vw, 1.25rem);
            text-align: left;
            box-shadow: 0 0 40px #0066ff44;
            flex-shrink: 0;
            min-height: 76px;
            display: flex;
            align-items: center;
            line-height: 1.5;
        }
        #question-panel .q-number { color: #00d4ff; font-weight: 800; margin-right: 12px; white-space: nowrap; text-shadow: 0 0 12px #00aaff; }
        #question-panel .q-text { color: #ffffff; font-weight: 700; text-shadow: 0 0 8px rgba(0, 180, 255, 0.3); }
        #entry-screen {
            position: absolute; inset: 0; z-index: 20;
            background: rgba(0, 6, 16, 0.92); backdrop-filter: blur(12px);
            display: flex; flex-direction: column; justify-content: center; align-items: center; gap: 30px;
            border-radius: 32px; padding: 20px;
        }
        #entry-screen h1 { font-size: 2.6rem; color: #7ad0ff; text-shadow: 0 0 40px #00aaff, 0 0 100px #0055ff; letter-spacing: 4px; font-weight: 800; }
        #entry-screen h2 { color: #7ad0ff; font-size: 1.4rem; margin-top: -20px; text-shadow: 0 0 20px #00aaff; font-weight: 400; letter-spacing: 2px; }
        #entry-screen input { background: #0a1a2e; border: 2px solid #00d4ff; border-radius: 60px; padding: 16px 24px; width: 80%; max-width: 340px; font-size: 1.3rem; color: #d6f0ff; text-align: center; outline: none; box-shadow: 0 0 40px #0066ff55; }
        #entry-screen input::placeholder { color: #4a7a9a; }
        .cyber-btn {
            background: linear-gradient(145deg, #0a2a4a, #06152a); border: 1px solid #00d4ff; color: #d6f0ff;
            padding: 16px 48px; border-radius: 60px; font-size: 1.6rem; font-weight: bold; letter-spacing: 3px;
            box-shadow: 0 0 40px #00aaffaa, inset 0 0 20px #00aaff44; transition: 0.2s; cursor: pointer; backdrop-filter: blur(4px);
        }
        .cyber-btn:active { transform: scale(0.93); box-shadow: 0 0 80px #00d4ff; }
        #congrats-overlay {
            position: absolute; inset: 0; z-index: 30;
            background: rgba(0, 4, 16, 0.85); backdrop-filter: blur(8px); border-radius: 32px;
            display: none; flex-direction: column; justify-content: center; align-items: center; padding: 20px; text-align: center; color: #fff;
        }
        #congrats-overlay.show { display: flex; }
        .congrats-box {
            background: rgba(0, 16, 32, 0.8); border: 2px solid #00d4ff; border-radius: 60px; padding: 30px 20px;
            max-width: 480px; width: 100%; box-shadow: 0 0 80px #0066ff88, inset 0 0 30px #00aaff44; backdrop-filter: blur(8px); position: relative; z-index: 5;
        }
        .congrats-box .user-name { font-size: 1.4rem; color: #7ad0ff; margin-bottom: 8px; text-shadow: 0 0 20px #00aaff; }
        .congrats-box .user-name i { font-style: normal; background: rgba(0,180,255,0.15); padding: 2px 14px; border-radius: 30px; border: 1px solid #00aaff44; }
        .congrats-box h2 { font-size: 2.4rem; margin-bottom: 6px; color: #facc15; text-shadow: 0 0 30px #facc15aa; }
        .congrats-box .rank { font-size: 2rem; font-weight: 800; background: linear-gradient(45deg, #7ad0ff, #00aaff, #a855f7); -webkit-background-clip: text; -webkit-text-fill-color: transparent; margin: 10px 0; }
        .congrats-box .final-score { font-size: 1.8rem; color: #7ad0ff; text-shadow: 0 0 20px #00aaff66; }
        .congrats-box .final-score span { color: #facc15; font-weight: 800; text-shadow: 0 0 20px #facc1566; }
        .congrats-box .message { font-size: 1.2rem; color: #c8e6ff; margin: 16px 0; background: rgba(0,180,255,0.1); padding: 10px 16px; border-radius: 30px; border: 1px solid #00aaff44; }
        .congrats-box .stats-grid { display: flex; justify-content: center; gap: 20px; margin: 12px 0; font-size: 0.9rem; color: #7ad0ff; }
        .congrats-box .stats-grid span { background: rgba(0,20,50,0.5); padding: 4px 14px; border-radius: 20px; border: 1px solid #00aaff33; }
        .congrats-box .footer-note { margin-top: 16px; font-size: 0.85rem; color: #5a8aaa; letter-spacing: 1px; border-top: 1px solid #00aaff33; padding-top: 14px; font-style: italic; }
        .small-btn { background: #0a2a4a; border: 1px solid #00d4ff; color: #d6f0ff; padding: 12px 30px; border-radius: 60px; font-size: 1.2rem; margin-top: 12px; cursor: pointer; transition: 0.2s; box-shadow: 0 0 20px #00aaff33; }
        .small-btn:active { transform: scale(0.92); }
        #speech-btn { background: rgba(0,180,255,0.15); border: 1px solid #00d4ff; color: #7ad0ff; padding: 8px 20px; border-radius: 40px; font-size: 0.9rem; cursor: pointer; margin-top: 6px; transition: 0.2s; box-shadow: 0 0 15px #00aaff22; }
        #speech-btn:hover { background: rgba(0,180,255,0.3); }
        #leaderboard {
            position: absolute; bottom: 10px; right: 16px;
            background: #0a1218cc; backdrop-filter: blur(8px); padding: 10px 18px; border-radius: 40px;
            border: 1px solid #00d4ff; color: #7ad0ff; font-size: 0.8rem; max-width: 200px; max-height: 120px; overflow-y: auto; z-index: 10;
        }
        #leaderboard div { display: flex; justify-content: space-between; gap: 10px; border-bottom: 1px solid #00d4ff40; padding: 2px 0; }
        .lb-score { color: #facc15; }
        /* Tombol Panduan - PASTI MUNCUL */
        #guide-btn {
            position: absolute;
            top: 12px;
            right: 12px;
            background: rgba(0, 180, 255, 0.2);
            border: 1.5px solid #00d4ff;
            color: #7ad0ff;
            padding: 8px 18px;
            border-radius: 40px;
            font-size: 0.9rem;
            font-weight: bold;
            cursor: pointer;
            z-index: 15;
            transition: 0.3s;
            box-shadow: 0 0 20px #00aaff44;
            backdrop-filter: blur(4px);
            display: flex;
            align-items: center;
            gap: 6px;
        }
        #guide-btn:hover { background: rgba(0, 180, 255, 0.35); transform: scale(1.05); }
        #guide-btn:active { transform: scale(0.95); }
        /* Modal Panduan */
        #guide-modal {
            position: absolute; inset: 0; z-index: 40;
            background: rgba(0, 4, 16, 0.92); backdrop-filter: blur(10px);
            display: none; flex-direction: column; justify-content: center; align-items: center;
            border-radius: 32px; padding: 30px 20px;
            text-align: center; color: #fff;
        }
        #guide-modal.show { display: flex; }
        #guide-modal .guide-box {
            background: rgba(0, 16, 32, 0.9); border: 1px solid #00d4ff; border-radius: 40px;
            padding: 30px 25px; max-width: 500px; width: 100%;
            max-height: 80vh; overflow-y: auto;
            box-shadow: 0 0 60px #0066ff66;
        }
        #guide-modal h2 { color: #facc15; font-size: 2rem; margin-bottom: 16px; text-shadow: 0 0 30px #facc15aa; }
        #guide-modal p, #guide-modal li { color: #c8e6ff; font-size: 1rem; line-height: 1.6; text-align: left; }
        #guide-modal ul { padding-left: 20px; margin: 10px 0; }
        #guide-modal .close-guide {
            margin-top: 20px;
            background: #0a2a4a; border: 1px solid #00d4ff; color: #d6f0ff;
            padding: 10px 30px; border-radius: 60px; font-size: 1.1rem;
            cursor: pointer; transition: 0.2s;
        }
        #guide-modal .close-guide:hover { background: #0a3a5a; }
        .guide-icon { font-size: 1.5rem; margin-right: 8px; }
        @media (max-width: 500px) {
            #header span { font-size: 0.7rem; padding: 2px 10px; }
            #entry-screen h1 { font-size: 2rem; }
            #question-panel { font-size: clamp(0.8rem, 2.5vw, 1rem); padding: 10px 14px; min-height: 64px; }
            .congrats-box { padding: 20px 14px; }
            .congrats-box h2 { font-size: 1.8rem; }
            .congrats-box .rank { font-size: 1.5rem; }
            #leaderboard { max-width: 140px; font-size: 0.7rem; padding: 6px 12px; }
            #guide-btn { font-size: 0.7rem; padding: 5px 12px; top: 8px; right: 8px; }
            #guide-modal .guide-box { padding: 20px 15px; }
            #guide-modal h2 { font-size: 1.5rem; }
            #guide-modal p, #guide-modal li { font-size: 0.85rem; }
        }
        @media (max-width: 400px) {
            #header span { font-size: 0.6rem; padding: 2px 6px; }
            #timer-display { min-width: 60px; font-size: 0.7rem; }
            #guide-btn { font-size: 0.6rem; padding: 4px 10px; }
        }
    &lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;div id="game-wrapper"&gt;
    &lt;div id="header"&gt;
        &lt;span id="player-name-display"&gt;&#128218; User&lt;/span&gt;
        &lt;span id="level-indicator"&gt;⚡ Level 1&lt;/span&gt;
        &lt;span id="score-indicator"&gt;⭐ 0 / 100&lt;/span&gt;
        &lt;span id="timer-display"&gt;⏱️ 60:00&lt;/span&gt;
    &lt;/div&gt;
    &lt;div id="game-canvas-container"&gt;
        &lt;canvas id="gameCanvas" width="800" height="600"&gt;&lt;/canvas&gt;
        &lt;!-- TOMBOL PANDUAN - DITAMPILKAN DI ATAS CANVAS --&gt;
        &lt;button id="guide-btn"&gt;&#128214; Panduan&lt;/button&gt;
        &lt;div id="entry-screen"&gt;
            &lt;h1&gt;&#128218; SMART&lt;/h1&gt;
            &lt;h2&gt;Asesmen Awal Bahasa Indonesia • Kelas XI SMK&lt;/h2&gt;
            &lt;input id="playerNameInput" type="text" placeholder="Nama User" maxlength="20"&gt;
            &lt;button class="cyber-btn" id="startGameBtn"&gt;▶ MULAI&lt;/button&gt;
            &lt;div style="color:#4a7a9a; font-size:0.8rem;"&gt;Panah ke buku &amp; perpustakaan! • Waktu 60 menit&lt;/div&gt;
        &lt;/div&gt;
        &lt;div id="congrats-overlay"&gt;
            &lt;div class="congrats-box"&gt;
                &lt;div class="user-name"&gt;&#128218; &lt;i id="userNameDisplay"&gt;User&lt;/i&gt;&lt;/div&gt;
                &lt;h2&gt;&#127937; ASESMEN SELESAI&lt;/h2&gt;
                &lt;div class="rank" id="rankDisplay"&gt;Master Bahasa Indonesia&lt;/div&gt;
                &lt;div class="final-score"&gt;Skor Akhir: &lt;span id="finalScoreDisplay"&gt;0&lt;/span&gt; / 100&lt;/div&gt;
                &lt;div class="stats-grid"&gt;
                    &lt;span id="levelCompleteDisplay"&gt;Level: 5/5&lt;/span&gt;
                    &lt;span id="accuracyDisplay"&gt;Akurasi: 0%&lt;/span&gt;
                &lt;/div&gt;
                &lt;div class="message" id="personalMessage"&gt;Hebat, User!&lt;/div&gt;
                &lt;button id="speech-btn"&gt;&#128266; Dengarkan Laporan&lt;/button&gt;
                &lt;button class="small-btn" id="restartFromCongratsBtn"&gt;&#128260; Misi Ulang&lt;/button&gt;
                &lt;div class="footer-note"&gt;✦ Selamat Belajar &amp; Bermain ✦&lt;/div&gt;
            &lt;/div&gt;
        &lt;/div&gt;
        &lt;div id="leaderboard"&gt;
            &lt;div style="color:#facc15; font-weight:bold;"&gt;&#127942; LEADERBOARD&lt;/div&gt;
            &lt;div id="lbEntries"&gt;&lt;div style="color:#4a7a9a;"&gt;Belum ada data&lt;/div&gt;&lt;/div&gt;
        &lt;/div&gt;
        &lt;!-- Modal Panduan --&gt;
        &lt;div id="guide-modal"&gt;
            &lt;div class="guide-box"&gt;
                &lt;h2&gt;&#128214; Panduan Permainan&lt;/h2&gt;
                &lt;p&gt;&lt;strong&gt;&#127919; Tujuan:&lt;/strong&gt; Jawab 50 pertanyaan Bahasa Indonesia Kelas XI SMK dengan menembak target yang benar.&lt;/p&gt;
                &lt;hr style="border-color:#00aaff44; margin:12px 0;"&gt;
                &lt;ul&gt;
                    &lt;li&gt;&lt;strong&gt;&#128260; Cara Bermain:&lt;/strong&gt; Gerakkan kursor/tap untuk mengarahkan busur. &lt;strong&gt;Klik atau tap&lt;/strong&gt; pada target (buku/perpustakaan) yang kamu yakini sebagai jawaban benar.&lt;/li&gt;
                    &lt;li&gt;&lt;strong&gt;&#128218; Materi:&lt;/strong&gt; 5 Level mewakili 18 pertemuan: Teks Prosedur, Ceramah, Resensi, Latihan AKM, dan Rangkuman.&lt;/li&gt;
                    &lt;li&gt;&lt;strong&gt;⭐ Skor:&lt;/strong&gt; Setiap jawaban benar mendapat poin. Skor maksimal 100. Target bernilai 2 poin per jawaban benar.&lt;/li&gt;
                    &lt;li&gt;&lt;strong&gt;⏱️ Waktu:&lt;/strong&gt; Kamu memiliki waktu 60 menit untuk menyelesaikan semua level. Waktu akan berubah merah saat &lt; 5 menit.&lt;/li&gt;
                    &lt;li&gt;&lt;strong&gt;&#127942; Predikat:&lt;/strong&gt; Skor akhir menentukan predikat: Master, Expert, Pro, Learner, atau Perlu Belajar Lagi.&lt;/li&gt;
                    &lt;li&gt;&lt;strong&gt;&#128266; Suara:&lt;/strong&gt; Klik tombol "Dengarkan Laporan" di akhir permainan untuk mendengar hasil.&lt;/li&gt;
                &lt;/ul&gt;
                &lt;p style="margin-top:12px; font-style:italic; color:#7ad0ff;"&gt;✦ Selamat belajar &amp; semoga sukses! ✦&lt;/p&gt;
                &lt;button class="close-guide" id="closeGuideBtn"&gt;✔️ Saya Mengerti&lt;/button&gt;
            &lt;/div&gt;
        &lt;/div&gt;
    &lt;/div&gt;
    &lt;div id="question-panel"&gt;
        &lt;span class="q-number" id="qNumberDisplay"&gt;1.&lt;/span&gt;
        &lt;span class="q-text" id="qTextDisplay"&gt;Tekan mulai &amp; tembak buku pengetahuan&lt;/span&gt;
    &lt;/div&gt;
&lt;/div&gt;

&lt;script&gt;
    (function(){
        // ============================================================
        // BANK SOAL BAHASA INDONESIA KELAS XI SMK (18 Pertemuan)
        // ============================================================
        const LEVELS = 5;
        const QUESTIONS_PER_LEVEL = 10;
        const MAX_SCORE = 100;
        const TOTAL_TIME = 60 * 60;

        const QUESTION_BANK = [
            // ===== LEVEL 1: Teks Prosedur =====
            [
                { q: "Apa tujuan utama dari teks prosedur?", options: ["Memberikan petunjuk langkah-langkah", "Menghibur pembaca", "Menceritakan pengalaman", "Meyakinkan pembaca", "Menjelaskan definisi"], correct: 0 },
                { q: "Ciri kebahasaan yang dominan dalam teks prosedur adalah...", options: ["Kalimat imperatif", "Kalimat tanya", "Kalimat pasif", "Kalimat berita", "Kalimat seru"], correct: 0 },
                { q: "Konjungsi temporal yang sering digunakan dalam teks prosedur adalah...", options: ["Kemudian, setelah itu, lalu", "Namun, akan tetapi", "Oleh karena itu", "Selain itu", "Dengan demikian"], correct: 0 },
                { q: "Contoh kalimat deklaratif dalam teks prosedur adalah...", options: ["Langkah pertama adalah menyiapkan alat", "Siapkan alat-alat!", "Apakah kamu sudah siap?", "Ayo kita mulai!", "Jangan lupa berdoa"], correct: 0 },
                { q: "Kalimat persuasif dalam teks prosedur bertujuan...", options: ["Membujuk pembaca untuk melakukan", "Memberi perintah", "Menanyakan", "Menceritakan", "Menjelaskan"], correct: 0 },
                { q: "Kaidah kebahasaan teks prosedur meliputi...", options: ["Kalimat perintah, kata teknis, konjungsi temporal", "Kata ganti orang, kata sifat, antonim", "Kata kerja mental, kata kerja material", "Kalimat pasif, kalimat aktif", "Konjungsi kausalitas, kata tanya"], correct: 0 },
                { q: "Salah satu langkah menulis teks prosedur yang baik adalah...", options: ["Menentukan tujuan dan audiens", "Mengabaikan urutan", "Menggunakan bahasa asing", "Membuat panjang lebar", "Menghilangkan langkah"], correct: 0 },
                { q: "Teks prosedur yang baik harus disusun secara...", options: ["Logis dan sistematis", "Acak dan bebas", "Emosional", "Panjang lebar", "Subjektif"], correct: 0 },
                { q: "Contoh kata teknis dalam teks prosedur memasak adalah...", options: ["Tumis, rebus, panggang", "Indah, cantik, bagus", "Cepat, lambat, sedang", "Panas, dingin, hangat", "Manis, asin, asam"], correct: 0 },
                { q: "Apa yang dimaksud dengan evaluasi informasi dalam teks prosedur?", options: ["Menilai kebenaran dan kegunaan informasi", "Menghafal isi teks", "Menceritakan kembali", "Mengabaikan detail", "Mengubah isi teks"], correct: 0 }
            ],
            // ===== LEVEL 2: Teks Ceramah =====
            [
                { q: "Tujuan utama teks ceramah adalah...", options: ["Memberi nasihat atau arahan", "Menghibur pendengar", "Menceritakan kisah", "Menjelaskan prosedur", "Meyakinkan dengan data"], correct: 0 },
                { q: "Gagasan pokok dalam teks ceramah biasanya terletak di...", options: ["Awal paragraf", "Akhir paragraf", "Tengah paragraf", "Semua paragraf", "Tidak tentu"], correct: 0 },
                { q: "Kata ganti orang yang sering digunakan dalam ceramah adalah...", options: ["Kita, kami, anda", "Saya, aku", "Mereka", "Kalian", "Beliau"], correct: 0 },
                { q: "Kata teknis dalam teks ceramah keagamaan contohnya...", options: ["Taqwa, ikhlas, sabar", "Masak, goreng, rebus", "Lari, jalan, duduk", "Baca, tulis, hitung", "Senyum, sapa, salam"], correct: 0 },
                { q: "Kata persuasif dalam ceramah bertujuan...", options: ["Membujuk pendengar", "Memberi perintah", "Menjelaskan fakta", "Menceritakan kejadian", "Menanyakan pendapat"], correct: 0 },
                { q: "Ciri kebahasaan teks ceramah meliputi...", options: ["Kata ganti orang, kata teknis, kata persuasif", "Kalimat imperatif, konjungsi temporal", "Kata benda, kata sifat", "Kalimat tanya, kata seru", "Kata kerja mental"], correct: 0 },
                { q: "Saat menyajikan ceramah, intonasi yang baik adalah...", options: ["Jelas dan bervariasi", "Monoton", "Sangat cepat", "Sangat lambat", "Berteriak"], correct: 0 },
                { q: "Membandingkan isi teks ceramah dengan teks lain bertujuan...", options: ["Menemukan persamaan dan perbedaan", "Menghafal isi", "Mengubah isi", "Mengabaikan teks lain", "Meniru gaya bahasa"], correct: 0 },
                { q: "Evaluasi informasi dalam teks ceramah berarti...", options: ["Menilai keakuratan dan relevansi informasi", "Menghafal semua isi", "Menceritakan kembali", "Mengabaikan sumber", "Mengubah topik"], correct: 0 },
                { q: "Sikap yang harus dimiliki saat menyampaikan ceramah adalah...", options: ["Santun dan percaya diri", "Marah dan keras", "Acuh tak acuh", "Malu dan ragu", "Bercanda berlebihan"], correct: 0 }
            ],
            // ===== LEVEL 3: Teks Resensi =====
            [
                { q: "Teks resensi bertujuan untuk...", options: ["Memberi penilaian terhadap karya", "Menghibur pembaca", "Menceritakan kisah", "Memberi petunjuk", "Menyampaikan berita"], correct: 0 },
                { q: "Struktur teks resensi yang benar adalah...", options: ["Identitas, orientasi, sinopsis, analisis, evaluasi", "Pendahuluan, isi, penutup", "Abstrak, pendahuluan, pembahasan, kesimpulan", "Tesis, argumentasi, penegasan", "Orientasi, komplikasi, resolusi"], correct: 0 },
                { q: "Kaidah kebahasaan teks resensi yang dominan adalah...", options: ["Kata kerja mental, kata sifat penilaian", "Kalimat imperatif", "Konjungsi temporal", "Kata ganti orang", "Kata teknis prosedur"], correct: 0 },
                { q: "Contoh kata sifat penilaian dalam resensi adalah...", options: ["Menarik, membosankan, inspiratif", "Cepat, lambat, sedang", "Besar, kecil, panjang", "Manis, asin, asam", "Panas, dingin, hangat"], correct: 0 },
                { q: "Sinopsis dalam resensi berisi...", options: ["Ringkasan cerita secara singkat", "Analisis mendalam", "Kelebihan buku", "Kekurangan buku", "Kesimpulan akhir"], correct: 0 },
                { q: "Menganalisis kaidah kebahasaan resensi berarti...", options: ["Menelaah penggunaan bahasa", "Menghafal isi", "Mengubah isi", "Membandingkan buku", "Menceritakan kembali"], correct: 0 },
                { q: "Teks resensi yang baik harus ditulis secara...", options: ["Logis dan sistematis", "Acak dan bebas", "Emosional", "Panjang lebar", "Subjektif"], correct: 0 },
                { q: "Saat mempresentasikan resensi, hal yang perlu diperhatikan adalah...", options: ["Kejelasan dan logika penyampaian", "Kecepatan bicara", "Penggunaan bahasa asing", "Penampilan fisik", "Durasi yang sangat panjang"], correct: 0 },
                { q: "Membandingkan teks resensi dengan teks lain bertujuan...", options: ["Menemukan kelebihan dan kekurangan", "Menghafal isi", "Mengubah isi", "Mengabaikan teks lain", "Meniru gaya bahasa"], correct: 0 },
                { q: "Evaluasi struktur teks resensi meliputi...", options: ["Kelengkapan bagian-bagian resensi", "Jumlah halaman", "Penerbit buku", "Harga buku", "Tahun terbit"], correct: 0 }
            ],
            // ===== LEVEL 4: Latihan Soal &amp; AKM =====
            [
                { q: "Soal AKM (Asesmen Kompetensi Minimum) biasanya mengukur...", options: ["Kemampuan bernalar dan literasi", "Penghafalan materi", "Kecepatan menulis", "Keterampilan berbicara", "Kemampuan menggambar"], correct: 0 },
                { q: "Dalam soal AKM teks prosedur, yang sering diuji adalah...", options: ["Pemahaman langkah-langkah dan tujuan", "Menghafal teks", "Mengubah teks", "Menulis ulang", "Menyanyi teks"], correct: 0 },
                { q: "Latihan soal teks ceramah bertujuan untuk...", options: ["Mengidentifikasi kelemahan pemahaman", "Menghafal isi", "Mengubah ceramah", "Menulis ceramah baru", "Membandingkan ceramah"], correct: 0 },
                { q: "Ulangan harian petunjuk kerja bertujuan...", options: ["Mengevaluasi kompetensi siswa", "Menghafal materi", "Membuat proyek", "Presentasi", "Diskusi"], correct: 0 },
                { q: "Soal tipe AKM biasanya berbentuk...", options: ["Pilihan ganda kompleks dan menjodohkan", "Pilihan ganda biasa", "Essay", "Uraian", "Benar-salah"], correct: 0 },
                { q: "Mengidentifikasi kelemahan pemahaman dilakukan melalui...", options: ["Analisis kesalahan jawaban", "Menghafal materi", "Membaca ulang", "Bertanya pada teman", "Mengubah jawaban"], correct: 0 },
                { q: "Ulangan harian resensi bertujuan...", options: ["Mengevaluasi kemampuan menilai buku", "Menghafal isi buku", "Membuat buku baru", "Membandingkan buku", "Menjual buku"], correct: 0 },
                { q: "Soal AKM menuntut siswa untuk...", options: ["Bernalar dan berpikir kritis", "Menghafal jawaban", "Membaca cepat", "Menulis panjang", "Menghafal istilah"], correct: 0 },
                { q: "Salah satu manfaat latihan soal AKM adalah...", options: ["Mengenal tipe soal dan meningkatkan nalar", "Menghafal materi", "Membuat soal baru", "Menilai teman", "Mengubah kurikulum"], correct: 0 },
                { q: "Evaluasi pencapaian kompetensi pada ulangan harian bertujuan...", options: ["Mengukur pemahaman siswa", "Menghafal materi", "Membuat proyek", "Presentasi", "Diskusi"], correct: 0 }
            ],
            // ===== LEVEL 5: Rangkuman =====
            [
                { q: "Rangkuman materi petunjuk kerja mencakup...", options: ["Prosedur, ceramah, dan resensi", "Puisi dan drama", "Novel dan cerpen", "Surat dan iklan", "Laporan dan berita"], correct: 0 },
                { q: "Persamaan teks prosedur dan teks ceramah adalah...", options: ["Sama-sama memberikan arahan", "Sama-sama menghibur", "Sama-sama bercerita", "Sama-sama menilai", "Sama-sama berita"], correct: 0 },
                { q: "Perbedaan teks resensi dengan teks prosedur adalah...", options: ["Resensi menilai, prosedur memberi petunjuk", "Resensi bercerita, prosedur menghibur", "Resensi berita, prosedur cerita", "Resensi puisi, prosedur drama", "Resensi surat, prosedur laporan"], correct: 0 },
                { q: "Kaidah kebahasaan yang digunakan dalam teks resensi adalah...", options: ["Kata kerja mental dan kata sifat penilaian", "Kalimat imperatif", "Konjungsi temporal", "Kata ganti orang", "Kata teknis prosedur"], correct: 0 },
                { q: "Menyajikan teks prosedur secara lisan memerlukan...", options: ["Kejelasan dan urutan yang logis", "Kecepatan bicara", "Penggunaan bahasa asing", "Penampilan menarik", "Durasi panjang"], correct: 0 },
                { q: "Menyajikan teks ceramah harus disertai...", options: ["Sikap santun dan intonasi yang tepat", "Suara keras", "Gerakan berlebihan", "Membaca teks", "Bercanda"], correct: 0 },
                { q: "Mempresentasikan resensi harus dilakukan secara...", options: ["Logis dan kreatif", "Acak dan bebas", "Emosional", "Panjang lebar", "Subjektif"], correct: 0 },
                { q: "Teks prosedur, ceramah, dan resensi termasuk jenis teks...", options: ["Fungsional (nonfiksi)", "Fiksi", "Puisi", "Drama", "Epik"], correct: 0 },
                { q: "Keterampilan menyimak teks ceramah bertujuan...", options: ["Memahami isi dan maksud pembicara", "Menghafal isi", "Mengubah isi", "Menulis ulang", "Membandingkan"], correct: 0 },
                { q: "Tujuan akhir dari pembelajaran teks prosedur, ceramah, dan resensi adalah...", options: ["Meningkatkan literasi dan keterampilan berbahasa", "Menghafal semua teks", "Membuat teks panjang", "Menjadi penulis", "Menjadi pembicara"], correct: 0 }
            ]
        ];

        // ===== STATE =====
        let userName = "User";
        let currentLevel = 0;
        let currentQuestionIndex = 0;
        let score = 0;
        let totalAttempts = 0;
        let correctAttempts = 0;
        let questionsForLevel = [];
        let targets = [];
        let gameActive = false;
        let levelCompleted = false;
        let animationFrame = null;
        let canvas, ctx;
        let W, H;
        let leaderboardData = [];
        let particles = [];
        let fireworks = [];
        let isCelebrating = false;
        let finalScore = 0, finalRank = "", finalMessage = "", finalAccuracy = 0;

        let timeRemaining = TOTAL_TIME;
        let timerInterval = null;
        let timerRunning = false;

        let archer = { x: 50, y: 0 };
        let arrow = { x: 0, y: 0, vx: 0, vy: 0, active: false, angle: 0, targetX: 0, targetY: 0, speed: 10, homing: false };
        let arrowCooldown = 0;
        let mouseX = 0, mouseY = 0;

        // DOM
        const canvasEl = document.getElementById('gameCanvas');
        const questionPanel = document.getElementById('question-panel');
        const qNumberDisplay = document.getElementById('qNumberDisplay');
        const qTextDisplay = document.getElementById('qTextDisplay');
        const levelIndicator = document.getElementById('level-indicator');
        const scoreIndicator = document.getElementById('score-indicator');
        const playerNameDisplay = document.getElementById('player-name-display');
        const timerDisplay = document.getElementById('timer-display');
        const entryScreen = document.getElementById('entry-screen');
        const congratsOverlay = document.getElementById('congrats-overlay');
        const finalScoreSpan = document.getElementById('finalScoreDisplay');
        const rankDisplay = document.getElementById('rankDisplay');
        const personalMessage = document.getElementById('personalMessage');
        const userNameDisplay = document.getElementById('userNameDisplay');
        const levelCompleteDisplay = document.getElementById('levelCompleteDisplay');
        const accuracyDisplay = document.getElementById('accuracyDisplay');
        const lbEntries = document.getElementById('lbEntries');
        const speechBtn = document.getElementById('speech-btn');
        const guideBtn = document.getElementById('guide-btn');
        const guideModal = document.getElementById('guide-modal');
        const closeGuideBtn = document.getElementById('closeGuideBtn');

        canvas = canvasEl; ctx = canvas.getContext('2d');

        // ===== PANDUAN =====
        guideBtn.addEventListener('click', () =&gt; { guideModal.classList.add('show'); });
        closeGuideBtn.addEventListener('click', () =&gt; { guideModal.classList.remove('show'); });
        guideModal.addEventListener('click', (e) =&gt; { if (e.target === guideModal) guideModal.classList.remove('show'); });

        let speechSynth = window.speechSynthesis;
        let speechUtterance = null;
        function speakScoreboard(score, rank, message, accuracy) {
            if (!window.speechSynthesis) return;
            if (speechSynth.speaking) speechSynth.cancel();
            const text = `Laporan untuk User ${userName}. Skor ${score} dari 100. Predikat ${rank}. Akurasi ${accuracy} persen. ${message}`;
            speechUtterance = new SpeechSynthesisUtterance(text);
            speechUtterance.lang = 'id-ID'; speechUtterance.rate = 0.85; speechUtterance.pitch = 1;
            speechSynth.speak(speechUtterance);
        }

        function shuffleArray(arr) { for (let i=arr.length-1; i&gt;0; i--) { const j=Math.floor(Math.random()*(i+1)); [arr[i],arr[j]]=[arr[j],arr[i]]; } return arr; }

        function loadLeaderboard() {
            try { const data = localStorage.getItem('smart_bindo_leaderboard'); leaderboardData = data ? JSON.parse(data) : []; } catch(e){ leaderboardData = []; }
            renderLeaderboard();
        }
        function saveLeaderboard() { localStorage.setItem('smart_bindo_leaderboard', JSON.stringify(leaderboardData)); renderLeaderboard(); }
        function renderLeaderboard() {
            if (!lbEntries) return;
            if (leaderboardData.length === 0) { lbEntries.innerHTML = '&lt;div style="color:#4a7a9a;"&gt;Belum ada data&lt;/div&gt;'; return; }
            const sorted = [...leaderboardData].sort((a,b) =&gt; b.score - a.score).slice(0,5);
            lbEntries.innerHTML = sorted.map(p =&gt; `&lt;div&gt;&lt;span&gt;${p.name}&lt;/span&gt;&lt;span class="lb-score"&gt;${p.score}&lt;/span&gt;&lt;/div&gt;`).join('');
        }

        function resizeCanvas() {
            const container = document.getElementById('game-canvas-container');
            const rect = container.getBoundingClientRect();
            canvas.width = rect.width || 800; canvas.height = rect.height || 600;
            W = canvas.width; H = canvas.height;
            archer.y = H - 70; archer.x = Math.min(archer.x, W-30);
            if (gameActive &amp;&amp; questionsForLevel.length) { generateTargets(); if (!levelCompleted) showCurrentQuestion(); }
        }
        window.addEventListener('resize', resizeCanvas);
        resizeCanvas();

        function loadLevel(levelIdx) {
            currentLevel = levelIdx; currentQuestionIndex = 0; levelCompleted = false;
            const raw = QUESTION_BANK[levelIdx] || QUESTION_BANK[0];
            questionsForLevel = raw.map(item =&gt; {
                const shuffledOptions = shuffleArray([...item.options]);
                const correctIndex = shuffledOptions.indexOf(item.options[item.correct]);
                return { q: item.q, options: shuffledOptions, correct: correctIndex };
            });
            questionsForLevel = shuffleArray(questionsForLevel);
            generateTargets();
            updateUI();
            if (gameActive) showCurrentQuestion();
        }

        function generateTargets() {
            targets = [];
            if (!questionsForLevel.length) return;
            const total = questionsForLevel.length;
            const cols = Math.min(4, total, Math.floor(W / 130) + 1);
            const rows = Math.ceil(total / cols);
            const spacingX = (W - 80) / (cols + 1);
            const spacingY = (H - 140) / (rows + 2);
            const size = Math.min(spacingX * 0.40, spacingY * 0.45, 62);
            const baseY = spacingY * 0.6 + 20;
            const icons = ['&#128218;', '&#128214;', '&#128213;', '&#128215;', '&#128216;', '&#128217;', '&#128211;', '&#128212;', '&#128210;', '&#128240;', '&#128278;', '&#127963;️'];
            for (let i = 0; i &lt; total; i++) {
                const col = i % cols, row = Math.floor(i / cols);
                let x = 60 + spacingX * (col + 1) + (Math.random() - 0.5) * 30;
                let y = baseY + spacingY * row + (Math.random() - 0.5) * 20;
                x = Math.min(Math.max(x, size+20), W - size - 10);
                y = Math.min(Math.max(y, size+20), H - size - 80);
                const vx = (Math.random() - 0.5) * 0.6, vy = (Math.random() - 0.5) * 0.6;
                targets.push({
                    id: i, x, y, size,
                    vx, vy,
                    icon: icons[i % icons.length],
                    label: questionsForLevel[i]?.options[0] || '?',
                    fullText: questionsForLevel[i]?.options[0] || '?',
                    answered: false,
                    optionIndex: 0
                });
            }
        }

        function showCurrentQuestion() {
            if (!questionsForLevel.length || currentQuestionIndex &gt;= questionsForLevel.length) {
                levelCompleted = true;
                if (currentLevel + 1 &lt; LEVELS) { currentLevel++; loadLevel(currentLevel); updateUI(); }
                else { endGame(); }
                return;
            }
            const qData = questionsForLevel[currentQuestionIndex];
            if (!qData) return;
            qNumberDisplay.textContent = `${currentQuestionIndex + 1}.`;
            qTextDisplay.textContent = qData.q;
            targets.forEach((t, idx) =&gt; {
                const optIdx = idx % qData.options.length;
                t.optionIndex = optIdx;
                t.fullText = qData.options[optIdx] || '?';
                t.label = t.fullText;
                t.answered = false;
            });
        }

        function shootArrow(targetX, targetY) {
            if (!gameActive || levelCompleted) return;
            if (arrow.active || arrowCooldown &gt; 0) return;
            const dx = targetX - archer.x, dy = targetY - archer.y;
            if (Math.sqrt(dx*dx + dy*dy) &lt; 30) return;
            arrow.active = true;
            arrow.x = archer.x + 20; arrow.y = archer.y - 10;
            arrow.targetX = targetX; arrow.targetY = targetY;
            arrow.homing = true; arrow.speed = 10;
            const angle = Math.atan2(dy, dx);
            arrow.vx = Math.cos(angle) * arrow.speed;
            arrow.vy = Math.sin(angle) * arrow.speed;
            arrow.angle = angle;
            arrowCooldown = 12;
        }

        function updateArrow() {
            if (!arrow.active) return;
            if (arrow.homing) {
                const dx = arrow.targetX - arrow.x, dy = arrow.targetY - arrow.y;
                const dist = Math.sqrt(dx*dx + dy*dy);
                if (dist &gt; 5) {
                    const targetAngle = Math.atan2(dy, dx);
                    let angleDiff = targetAngle - arrow.angle;
                    while (angleDiff &gt; Math.PI) angleDiff -= 2*Math.PI;
                    while (angleDiff &lt; -Math.PI) angleDiff += 2*Math.PI;
                    arrow.angle += angleDiff * 0.1;
                    arrow.vx = Math.cos(arrow.angle) * arrow.speed;
                    arrow.vy = Math.sin(arrow.angle) * arrow.speed;
                }
            }
            arrow.x += arrow.vx; arrow.y += arrow.vy;
            for (let t of targets) {
                if (t.answered) continue;
                const dx = arrow.x - t.x, dy = arrow.y - t.y;
                if (dx*dx + dy*dy &lt; (t.size + 8) * (t.size + 8)) {
                    arrow.active = false;
                    t.answered = true;
                    totalAttempts++;
                    const qData = questionsForLevel[currentQuestionIndex];
                    const selectedOptIdx = t.optionIndex % qData.options.length;
                    const isCorrect = (selectedOptIdx === qData.correct);
                    if (isCorrect) {
                        const scorePerQuestion = MAX_SCORE / (LEVELS * QUESTIONS_PER_LEVEL);
                        score = Math.min(MAX_SCORE, score + scorePerQuestion);
                        correctAttempts++;
                        spawnExplosion(t.x, t.y, '#00ffaa', 25);
                    } else {
                        spawnExplosion(t.x, t.y, '#ff4444', 18);
                    }
                    currentQuestionIndex++;
                    if (currentQuestionIndex &gt;= questionsForLevel.length) {
                        if (currentLevel + 1 &lt; LEVELS) showLevelCongrats();
                        else { endGame(); }
                    } else showCurrentQuestion();
                    updateUI();
                    return;
                }
            }
            if (arrow.x &gt; W || arrow.x &lt; 0 || arrow.y &gt; H || arrow.y &lt; 0) arrow.active = false;
        }

        function spawnExplosion(x, y, color, count) {
            for (let i=0; i&lt;count; i++) {
                const angle = Math.random() * 2 * Math.PI, speed = Math.random() * 4 + 1;
                particles.push({ x, y, vx: Math.cos(angle)*speed, vy: Math.sin(angle)*speed, life: 1, decay: Math.random()*0.025+0.015, size: Math.random()*5+2, color });
            }
        }

        function showLevelCongrats() {
            qNumberDisplay.textContent = '⚡';
            qTextDisplay.textContent = `Level ${currentLevel+1} Selesai! Skor: ${Math.round(score)} / ${MAX_SCORE}`;
            for (let i=0; i&lt;25; i++) spawnExplosion(Math.random()*W, Math.random()*H, '#00ddff', 6);
            setTimeout(() =&gt; { if (currentLevel + 1 &lt; LEVELS) { currentLevel++; loadLevel(currentLevel); updateUI(); } else endGame(); }, 1200);
        }

        function getRank(scr) {
            const pct = (scr/MAX_SCORE)*100;
            if (pct &gt;= 90) return "Master Bahasa Indonesia";
            else if (pct &gt;= 75) return "Expert Bahasa Indonesia";
            else if (pct &gt;= 60) return "Pro Bahasa Indonesia";
            else if (pct &gt;= 40) return "Learner Bahasa Indonesia";
            else return "Perlu Belajar Lagi";
        }

        function getMessage(scr) {
            const pct = (scr/MAX_SCORE)*100;
            if (pct &gt;= 90) return "Luar biasa! Anda Master Bahasa Indonesia sejati!";
            else if (pct &gt;= 75) return "Hebat! Pemahaman Bahasa Indonesia Anda solid!";
            else if (pct &gt;= 60) return "Bagus! Terus asah kemampuan literasi Anda!";
            else if (pct &gt;= 40) return "Mulai konsisten, raih predikat lebih tinggi!";
            else return "Perlu belajar lagi, kuasai dasar-dasar Bahasa Indonesia!";
        }

        function endGame() {
            gameActive = false;
            if (timerInterval) { clearInterval(timerInterval); timerInterval = null; }
            timerRunning = false;
            
            finalScore = Math.round(score);
            finalRank = getRank(finalScore);
            finalMessage = getMessage(finalScore);
            finalAccuracy = totalAttempts &gt; 0 ? Math.round((correctAttempts / totalAttempts) * 100) : 0;
            
            congratsOverlay.classList.add('show');
            finalScoreSpan.textContent = finalScore;
            rankDisplay.textContent = finalRank;
            personalMessage.textContent = finalMessage;
            userNameDisplay.textContent = userName;
            levelCompleteDisplay.textContent = `Level: ${LEVELS}/${LEVELS}`;
            accuracyDisplay.textContent = `Akurasi: ${finalAccuracy}%`;
            
            leaderboardData.push({ name: userName, score: finalScore });
            saveLeaderboard();
            isCelebrating = true;
            for (let i=0; i&lt;80; i++) setTimeout(() =&gt; spawnFirework(Math.random()*W, Math.random()*H*0.7 + 50), i*65);
            for (let i=0; i&lt;45; i++) setTimeout(() =&gt; spawnFirework(Math.random()*W, Math.random()*H*0.5 + 30), 3800 + i*85);
            setTimeout(() =&gt; speakScoreboard(finalScore, finalRank, finalMessage, finalAccuracy), 1600);
        }

        function spawnFirework(x, y) {
            const colors = ['#ff4444','#ffdd44','#44ff44','#44ddff','#ff44ff','#ffffff','#ff8800','#00ffaa','#a855f7'];
            for (let i=0; i&lt;55; i++) {
                const angle = Math.random()*2*Math.PI, speed = Math.random()*7+2, color = colors[Math.floor(Math.random()*colors.length)];
                fireworks.push({ x, y, vx: Math.cos(angle)*speed, vy: Math.sin(angle)*speed-1, life:1, decay: Math.random()*0.015+0.006, size: Math.random()*5+2, color, isConfetti: false });
            }
            for (let i=0; i&lt;30; i++) {
                const angle = Math.random()*2*Math.PI, speed = Math.random()*4+1, color = colors[Math.floor(Math.random()*colors.length)];
                fireworks.push({ x, y, vx: Math.cos(angle)*speed+(Math.random()-0.5)*2, vy: Math.sin(angle)*speed-2.5, life:1, decay: Math.random()*0.01+0.004, size: Math.random()*9+4, color, isConfetti: true });
            }
        }

        function updateUI() {
            levelIndicator.textContent = `⚡ Level ${currentLevel+1}`;
            scoreIndicator.textContent = `⭐ ${Math.round(score)} / ${MAX_SCORE}`;
            playerNameDisplay.textContent = `&#128218; ${userName}`;
        }

        function startTimer() {
            if (timerRunning) return;
            timerRunning = true;
            timerInterval = setInterval(() =&gt; {
                timeRemaining--;
                updateTimerDisplay();
                if (timeRemaining &lt;= 0) {
                    clearInterval(timerInterval);
                    timerInterval = null;
                    timerRunning = false;
                    if (gameActive) { endGame(); }
                }
            }, 1000);
        }

        function updateTimerDisplay() {
            const mins = Math.floor(timeRemaining / 60);
            const secs = timeRemaining % 60;
            timerDisplay.textContent = `⏱️ ${String(mins).padStart(2, '0')}:${String(secs).padStart(2, '0')}`;
            if (timeRemaining &lt; 300) {
                timerDisplay.style.color = '#ff4444';
                timerDisplay.style.borderColor = '#ff4444';
            } else {
                timerDisplay.style.color = '#ff6b6b';
                timerDisplay.style.borderColor = '#ff4444';
            }
        }

        function drawArcher() {
            const ax = archer.x, ay = archer.y;
            ctx.shadowBlur = 20; ctx.shadowColor = '#00aaff66';
            ctx.fillStyle = '#1a3a5a'; ctx.fillRect(ax-8, ay+10, 6, 14); ctx.fillRect(ax+2, ay+10, 6, 14);
            ctx.fillStyle = '#2a5a7a'; ctx.beginPath(); ctx.ellipse(ax, ay-4, 16, 22, 0, 0, Math.PI*2); ctx.fill();
            ctx.fillStyle = '#f0d8b0'; ctx.beginPath(); ctx.arc(ax, ay-28, 14, 0, Math.PI*2); ctx.fill();
            ctx.fillStyle = '#4a3a2a'; ctx.beginPath(); ctx.arc(ax, ay-34, 14, Math.PI, 2*Math.PI); ctx.fill();
            const bowAngle = Math.atan2(mouseY - ay, mouseX - ax);
            const bowLen = 38;
            ctx.strokeStyle = '#c8a060'; ctx.lineWidth = 3; ctx.shadowBlur = 15; ctx.shadowColor = '#ffdd44aa';
            ctx.beginPath(); ctx.arc(ax + 16, ay - 4, bowLen, bowAngle - 0.7, bowAngle + 0.7); ctx.stroke();
            ctx.strokeStyle = '#aaaacc'; ctx.lineWidth = 1.5;
            const e1 = bowAngle - 0.7, e2 = bowAngle + 0.7;
            const ex1 = ax+16+Math.cos(e1)*bowLen, ey1 = ay-4+Math.sin(e1)*bowLen;
            const ex2 = ax+16+Math.cos(e2)*bowLen, ey2 = ay-4+Math.sin(e2)*bowLen;
            ctx.beginPath(); ctx.moveTo(ex1, ey1); ctx.lineTo(ax+16+Math.cos(bowAngle)*10, ay-4+Math.sin(bowAngle)*10); ctx.lineTo(ex2, ey2); ctx.stroke();
            ctx.shadowBlur = 0;
            if (arrow.active) {
                ctx.save(); ctx.translate(arrow.x, arrow.y); ctx.rotate(arrow.angle);
                ctx.shadowBlur = 20; ctx.shadowColor = '#00ffaa88';
                ctx.strokeStyle = '#ddaa88'; ctx.lineWidth = 2.5; ctx.beginPath(); ctx.moveTo(0,0); ctx.lineTo(25,0); ctx.stroke();
                ctx.fillStyle = '#ffdd44'; ctx.shadowColor = '#ffdd44aa'; ctx.beginPath(); ctx.moveTo(28,0); ctx.lineTo(20,-5); ctx.lineTo(20,5); ctx.closePath(); ctx.fill();
                ctx.fillStyle = '#ff6666'; ctx.shadowColor = '#ff666688'; ctx.beginPath(); ctx.moveTo(-2,0); ctx.lineTo(-8,-6); ctx.lineTo(-8,6); ctx.closePath(); ctx.fill();
                ctx.restore(); ctx.shadowBlur = 0;
            }
        }

        function draw() {
            ctx.clearRect(0, 0, W, H);
            ctx.fillStyle = 'rgba(0, 10, 30, 0.3)'; ctx.fillRect(0, 0, W, H);
            ctx.strokeStyle = '#00aaff20'; ctx.lineWidth = 0.5;
            for (let i=0; i&lt;W; i+=30) { ctx.beginPath(); ctx.moveTo(i,0); ctx.lineTo(i,H); ctx.stroke(); }
            for (let i=0; i&lt;H; i+=30) { ctx.beginPath(); ctx.moveTo(0,i); ctx.lineTo(W,i); ctx.stroke(); }
            ctx.strokeStyle = '#00d4ff15'; ctx.lineWidth = 1;
            for (let i=0; i&lt;W; i+=80) { ctx.beginPath(); ctx.moveTo(i,0); ctx.lineTo(i+40,H); ctx.stroke(); }
            for (let i=0; i&lt;30; i++) {
                ctx.fillStyle = `rgba(0, 180, 255, ${Math.random()*0.15+0.03})`;
                ctx.font = '12px monospace'; ctx.fillText(Math.random()&gt;0.5?'1':'0', Math.random()*W, Math.random()*H);
            }
            ctx.fillStyle = '#00aaff10'; ctx.font = '28px sans-serif';
            ctx.fillText('&#128218;', 20, 40); ctx.fillText('&#128214;', W-50, 50); ctx.fillText('&#127963;️', W-70, H-30); ctx.fillText('&#128213;', 30, H-20);

            targets.forEach(t =&gt; {
                if (t.answered) return;
                ctx.shadowColor = '#00aaffaa'; ctx.shadowBlur = 30;
                const grad = ctx.createRadialGradient(t.x-5, t.y-5, 2, t.x, t.y, t.size);
                grad.addColorStop(0, '#80d4ff'); grad.addColorStop(0.5, '#0088ff'); grad.addColorStop(1, '#1a0066');
                ctx.beginPath(); ctx.arc(t.x, t.y, t.size, 0, 2*Math.PI);
                ctx.fillStyle = grad; ctx.fill();
                ctx.shadowBlur = 0;
                ctx.strokeStyle = '#80d4ff'; ctx.lineWidth = 2.5; ctx.shadowBlur = 15; ctx.shadowColor = '#00aaff';
                ctx.stroke(); ctx.shadowBlur = 0;
                
                ctx.font = `${t.size * 0.38}px 'Segoe UI Emoji', 'Apple Color Emoji', 'Noto Color Emoji', sans-serif`;
                ctx.textAlign = 'center'; ctx.textBaseline = 'middle';
                ctx.fillStyle = '#ffffff'; ctx.shadowBlur = 8; ctx.shadowColor = '#0044ff';
                ctx.fillText(t.icon, t.x, t.y - 14);
                ctx.shadowBlur = 0;
                
                ctx.fillStyle = '#ffffff'; 
                const fontSize = Math.max(14, t.size * 0.34);
                ctx.font = `bold ${fontSize}px 'Segoe UI', Arial, sans-serif`;
                ctx.textAlign = 'center'; ctx.textBaseline = 'bottom';
                let displayText = t.fullText;
                if (displayText.length &gt; 14) displayText = displayText.substring(0, 13) + '…';
                
                const metrics = ctx.measureText(displayText);
                const tw = metrics.width;
                const th = fontSize * 1.5;
                const tx = t.x - tw/2 - 8;
                const ty = t.y + t.size - 14 - th;
                
                ctx.shadowBlur = 0;
                const r = 6;
                ctx.beginPath();
                ctx.moveTo(tx + r, ty);
                ctx.lineTo(tx + tw + 16 - r, ty);
                ctx.quadraticCurveTo(tx + tw + 16, ty, tx + tw + 16, ty + r);
                ctx.lineTo(tx + tw + 16, ty + th + 6 - r);
                ctx.quadraticCurveTo(tx + tw + 16, ty + th + 6, tx + tw + 16 - r, ty + th + 6);
                ctx.lineTo(tx + r, ty + th + 6);
                ctx.quadraticCurveTo(tx, ty + th + 6, tx, ty + th + 6 - r);
                ctx.lineTo(tx, ty + r);
                ctx.quadraticCurveTo(tx, ty, tx + r, ty);
                ctx.closePath();
                ctx.fillStyle = 'rgba(0, 10, 30, 0.85)';
                ctx.fill();
                
                ctx.fillStyle = '#ffffff';
                ctx.shadowBlur = 4;
                ctx.shadowColor = 'rgba(0, 0, 0, 0.5)';
                ctx.textAlign = 'center'; ctx.textBaseline = 'bottom';
                ctx.fillText(displayText, t.x, t.y + t.size - 6);
                ctx.shadowBlur = 0;
                
                t.x += t.vx; t.y += t.vy;
                if (t.x &lt; t.size + 20 || t.x &gt; W - t.size - 10) t.vx *= -1;
                if (t.y &lt; t.size + 20 || t.y &gt; H - t.size - 80) t.vy *= -1;
                t.x = Math.min(Math.max(t.x, t.size+20), W - t.size - 10);
                t.y = Math.min(Math.max(t.y, t.size+20), H - t.size - 80);
            });

            if (arrow.active) updateArrow();
            if (arrowCooldown &gt; 0) arrowCooldown--;
            if (gameActive) {
                const targetX = Math.min(Math.max(mouseX, 30), W - 30);
                archer.x += (targetX - archer.x) * 0.08;
                archer.y = H - 70;
            }
            drawArcher();

            for (let i=particles.length-1; i&gt;=0; i--) {
                const p = particles[i];
                p.x += p.vx; p.y += p.vy; p.life -= p.decay; p.vy += 0.05;
                if (p.life &lt;= 0) { particles.splice(i,1); continue; }
                ctx.globalAlpha = p.life; ctx.fillStyle = p.color; ctx.shadowBlur = 10; ctx.shadowColor = p.color;
                ctx.beginPath(); ctx.arc(p.x, p.y, p.size * p.life, 0, 2*Math.PI); ctx.fill();
                ctx.shadowBlur = 0;
            }
            ctx.globalAlpha = 1;

            for (let i=fireworks.length-1; i&gt;=0; i--) {
                const f = fireworks[i];
                f.x += f.vx; f.y += f.vy; f.vy += 0.04; f.life -= f.decay;
                if (f.life &lt;= 0) { fireworks.splice(i,1); continue; }
                ctx.globalAlpha = f.life; ctx.fillStyle = f.color; ctx.shadowBlur = 18; ctx.shadowColor = f.color;
                if (f.isConfetti) { ctx.save(); ctx.translate(f.x, f.y); ctx.rotate(f.life*12); ctx.fillRect(-f.size/2, -f.size/2, f.size*f.life, f.size*f.life*0.5); ctx.restore(); }
                else { ctx.beginPath(); ctx.arc(f.x, f.y, f.size * f.life, 0, 2*Math.PI); ctx.fill(); }
                ctx.shadowBlur = 0;
            }
            ctx.globalAlpha = 1;
        }

        function gameLoop() { draw(); animationFrame = requestAnimationFrame(gameLoop); }

        canvasEl.addEventListener('click', (e) =&gt; {
            const rect = canvasEl.getBoundingClientRect();
            const scaleX = canvas.width / rect.width, scaleY = canvas.height / rect.height;
            shootArrow((e.clientX - rect.left)*scaleX, (e.clientY - rect.top)*scaleY);
        });
        canvasEl.addEventListener('touchstart', (e) =&gt; {
            e.preventDefault(); const rect = canvasEl.getBoundingClientRect();
            const touch = e.touches[0]; const scaleX = canvas.width/rect.width, scaleY = canvas.height/rect.height;
            shootArrow((touch.clientX - rect.left)*scaleX, (touch.clientY - rect.top)*scaleY);
        }, { passive: false });
        canvasEl.addEventListener('mousemove', (e) =&gt; {
            const rect = canvasEl.getBoundingClientRect();
            mouseX = (e.clientX - rect.left) * (canvas.width/rect.width);
            mouseY = (e.clientY - rect.top) * (canvas.height/rect.height);
        });
        speechBtn.addEventListener('click', () =&gt; speakScoreboard(finalScore, finalRank, finalMessage, finalAccuracy));

        function startGame() {
            const nameInput = document.getElementById('playerNameInput');
            userName = nameInput.value.trim() || "User";
            playerNameDisplay.textContent = `&#128218; ${userName}`;
            entryScreen.style.display = 'none';
            congratsOverlay.classList.remove('show');
            
            score = 0; totalAttempts = 0; correctAttempts = 0; currentLevel = 0;
            timeRemaining = TOTAL_TIME;
            updateTimerDisplay();
            timerDisplay.style.color = '#ff6b6b';
            timerDisplay.style.borderColor = '#ff4444';
            
            gameActive = true; isCelebrating = false; particles = []; fireworks = []; arrow.active = false;
            if (speechSynth.speaking) speechSynth.cancel();
            
            startTimer();
            loadLevel(0); updateUI();
            if (animationFrame) cancelAnimationFrame(animationFrame);
            gameLoop();
        }

        document.getElementById('startGameBtn').addEventListener('click', startGame);
        document.getElementById('restartFromCongratsBtn').addEventListener('click', () =&gt; { 
            congratsOverlay.classList.remove('show'); 
            if (timerInterval) { clearInterval(timerInterval); timerInterval = null; }
            timerRunning = false;
            startGame(); 
        });
        loadLeaderboard(); loadLevel(0); updateUI();
        qNumberDisplay.textContent = '&#128218;'; qTextDisplay.textContent = 'Masukkan nama &amp; tekan MULAI';
        updateTimerDisplay();
        gameLoop();
        window.addEventListener('resize', resizeCanvas);
    })();
&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</description><link>http://kitab-investasi.blogspot.com/2026/07/asesmen-awal-bahasa-indonesia-xi-smk.html</link><thr:total>0</thr:total><author>nof_rizal07@yahoo.co.id (abang_cool)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-9000860041661554971.post-413804888584619253</guid><pubDate>Thu, 23 Jul 2026 06:21:44 +0000</pubDate><atom:updated>2026-07-24T07:47:57.023+07:00</atom:updated><title>Evaluasi Informasi dalam Teks Prosedur</title><description>&lt;style&gt;
@import url('https://fonts.googleapis.com/css2?family=Oswald:wght@400;500;600;700&amp;family=Source+Sans+3:wght@400;500;600;700&amp;family=IBM+Plex+Mono:wght@400;500;600&amp;display=swap');
.epb{
  --blueprint:#0F2A3D;
  --blueprint-deep:#0A1E2C;
  --panel:#4A2E12;
  --paper:#F3F0E6;
  --ink:#132029;
  --amber:#F5A623;
  --amber-deep:#C97F12;
  --mint:#6EC6CA;
  --line:rgba(234,242,245,0.16);
  --off-white:#EAF2F5;
  --muted:#9FB4C2;
}
.epb *{box-sizing:border-box;}
.epb{scroll-behavior:smooth; background:#0A1F2E;}
.epb{
  margin:0;
  position:relative;
  overflow:hidden;
  background:var(--blueprint);
  color:var(--off-white);
  font-family:'Source Sans 3',sans-serif;
  line-height:1.65;
  background-image:
    linear-gradient(var(--line) 1px, transparent 1px),
    linear-gradient(90deg, var(--line) 1px, transparent 1px);
  background-size: 34px 34px;
}
.epb h1, .epb h2, .epb h3, .epb h4{font-family:'Oswald',sans-serif; text-transform:uppercase; letter-spacing:0.02em; margin:0 0 0.5em;}
.epb .mono{font-family:'IBM Plex Mono',monospace;}
.epb a{color:var(--amber);}
.epb .crop{position:absolute; width:22px; height:22px; z-index:5; opacity:.55; pointer-events:none;}
.epb .crop::before, .epb .crop::after{content:"";position:absolute;background:var(--mint);}
.epb .crop::before{width:100%;height:1px;top:50%;left:0;}
.epb .crop::after{width:1px;height:100%;left:50%;top:0;}
.epb .crop.tl{top:14px;left:14px;}
.epb .crop.tr{top:14px;right:14px;}
.epb .crop.bl{bottom:14px;left:14px;}
.epb .crop.br{bottom:14px;right:14px;}
.epb header.cover{
  position:relative;
  padding:40px 24px 36px;
  border-bottom:1px solid var(--line);
  overflow:hidden;
}
.epb .doc-code{font-family:'IBM Plex Mono',monospace; color:var(--amber); letter-spacing:0.15em; font-size:0.78rem; text-transform:uppercase; margin-bottom:18px; display:flex; gap:10px; align-items:center;}
.epb .doc-code::before{content:"◆"; color:var(--amber);}
.epb .cover h1{font-size:clamp(1.6rem,7vw,2.5rem); color:var(--off-white); max-width:16ch; line-height:1.05;}
.epb .cover .subtitle{color:var(--muted); font-size:1.05rem; max-width:60ch; margin-top:14px;}
.epb .meta-strip{
  margin-top:38px; display:grid; grid-template-columns:repeat(auto-fit,minmax(150px,1fr));
  border-top:1px dashed var(--line); border-bottom:1px dashed var(--line);
}
.epb .meta-strip div{padding:14px 16px; border-right:1px dashed var(--line);}
.epb .meta-strip div:last-child{border-right:none;}
.epb .meta-strip .k{font-family:'IBM Plex Mono',monospace; font-size:0.68rem; color:var(--amber); text-transform:uppercase; letter-spacing:0.1em;}
.epb .meta-strip .v{font-size:0.98rem; color:var(--off-white); margin-top:4px; font-weight:600;}
.epb .stamp{
  position:absolute; top:40px; right:20px; width:104px; height:104px;
  border:2.5px solid var(--amber); border-radius:50%;
  display:flex; align-items:center; justify-content:center;
  transform:rotate(-11deg);
  color:var(--amber); font-family:'IBM Plex Mono',monospace;
  text-align:center; font-size:0.62rem; letter-spacing:0.08em; text-transform:uppercase;
  opacity:0.9;
}
.epb .stamp .ring{position:absolute; inset:8px; border:1px dashed var(--amber); border-radius:50%;}
.epb .stamp b{display:block; font-family:'Oswald',sans-serif; font-size:1.05rem; letter-spacing:0.06em; margin-top:4px;}

@media (max-width:760px){.epb .stamp{display:none;}
.epb }


.epb main{max-width:920px; margin:0 auto; padding:0 20px 60px;}
.epb .section{padding-top:64px;}
.epb .eyebrow{font-family:'IBM Plex Mono',monospace; color:var(--amber); font-size:0.78rem; letter-spacing:0.14em; text-transform:uppercase; margin-bottom:10px; display:flex; align-items:center; gap:10px;}
.epb .eyebrow::after{content:""; flex:1; height:1px; background:var(--line);}
.epb h2.section-title{font-size:1.7rem; color:var(--off-white);}
.epb p{color:#DDE7EC;}
.epb .lead{color:var(--muted); font-size:1.02rem; max-width:72ch;}
.epb .panel{
  background:var(--panel); border:1px solid var(--line); border-radius:2px;
  padding:26px 28px; margin:22px 0;
}
.epb .panel.tp{border-left:4px solid var(--mint);}
.epb .panel.warn{border-left:4px solid var(--amber);}
.epb .tp-box{display:grid; gap:14px; margin-top:18px;}
.epb .tp-item{display:flex; gap:14px; align-items:flex-start;}
.epb .tp-item .idx{font-family:'IBM Plex Mono',monospace; color:var(--amber); font-weight:600; min-width:34px;}
.epb .flow{display:grid; grid-template-columns:repeat(auto-fit,minmax(220px,1fr)); gap:14px; margin-top:20px;}
.epb .flow .step{background:var(--blueprint-deep); border:1px solid var(--line); padding:18px; position:relative;}
.epb .flow .step .tag{font-family:'IBM Plex Mono',monospace; color:var(--amber); font-size:0.7rem; letter-spacing:0.1em; text-transform:uppercase;}
.epb .flow .step h4{font-size:1rem; margin-top:8px; color:var(--off-white);}
.epb .flow .step .time{position:absolute; top:16px; right:16px; font-family:'IBM Plex Mono',monospace; font-size:0.7rem; color:var(--amber);}
.epb .grid-3{display:grid; grid-template-columns:repeat(auto-fit,minmax(200px,1fr)); gap:14px; margin-top:16px;}
.epb .card{background:var(--blueprint-deep); border:1px solid var(--line); padding:18px;}
.epb .card h4{color:var(--amber); font-size:0.95rem;}
.epb .criteria{display:grid; gap:16px; margin-top:20px;}
.epb .crit{
  background:var(--blueprint-deep); border:1px solid var(--line);
  display:grid; grid-template-columns:64px 1fr; gap:0;
}
.epb .crit .num{
  background:var(--amber); color:var(--blueprint-deep); font-family:'IBM Plex Mono',monospace;
  font-weight:700; display:flex; align-items:center; justify-content:center; font-size:1.05rem;
}
.epb .crit .body{padding:18px 20px;}
.epb .crit h4{color:var(--off-white); font-size:1.02rem; margin-bottom:6px;}
.epb .crit .q{margin-top:10px; padding-top:10px; border-top:1px dashed var(--line); font-family:'IBM Plex Mono',monospace; font-size:0.86rem; color:var(--amber);}
.epb .timeline{margin-top:24px; position:relative; padding-left:34px;}
.epb .timeline::before{content:""; position:absolute; left:11px; top:6px; bottom:6px; width:2px; background:var(--line);}
.epb .tl-item{position:relative; padding-bottom:26px;}
.epb .tl-item:last-child{padding-bottom:0;}
.epb .tl-item::before{content:""; position:absolute; left:-34px; top:2px; width:22px; height:22px; border-radius:50%; background:var(--blueprint); border:2px solid var(--amber);}
.epb .tl-item h4{color:var(--off-white); font-size:1rem; margin-bottom:4px;}
.epb .doc-sample{
  background:var(--paper); color:var(--ink); border-radius:2px; padding:0; margin-top:22px;
  box-shadow:0 20px 45px rgba(0,0,0,0.35);
}
.epb .doc-sample .doc-head{background:var(--ink); color:var(--paper); padding:12px 22px; font-family:'IBM Plex Mono',monospace; font-size:0.75rem; letter-spacing:0.1em; text-transform:uppercase; display:flex; justify-content:space-between;}
.epb .doc-sample .doc-body{padding:26px 28px 30px;}
.epb .doc-sample h3{font-family:'Oswald',sans-serif; color:var(--ink); font-size:1.25rem; text-transform:none; letter-spacing:0;}
.epb .doc-sample ol{padding-left:22px;}
.epb .doc-sample li{margin-bottom:9px;}
.epb .flag{
  display:inline-block; font-family:'IBM Plex Mono',monospace; font-size:0.7rem; font-weight:600;
  background:#D94E2A; color:#fff; padding:1px 7px; border-radius:2px; margin-left:6px; vertical-align:middle;
}
.epb .doc-sample .note-margin{margin-top:6px; font-family:'IBM Plex Mono',monospace; font-size:0.78rem; color:#8A3A1F; padding-left:8px; border-left:2px solid #D94E2A;}
.epb .legend{display:flex; flex-wrap:wrap; gap:10px 20px; margin-top:16px;}
.epb .legend span{font-family:'IBM Plex Mono',monospace; font-size:0.78rem; color:var(--muted); display:flex; align-items:center; gap:8px;}
.epb .legend .dot{width:10px; height:10px; border-radius:50%; display:inline-block;}
.epb table{width:100%; border-collapse:collapse; margin-top:18px; font-size:0.94rem;}
.epb th, .epb td{border:1px solid var(--line); padding:10px 12px; text-align:left; vertical-align:top;}
.epb th{background:var(--blueprint-deep); font-family:'IBM Plex Mono',monospace; font-size:0.75rem; text-transform:uppercase; letter-spacing:0.06em; color:var(--amber);}
.epb .summary-box{
  border:1px solid var(--amber); background:linear-gradient(180deg, rgba(245,166,35,0.08), transparent);
  padding:24px 26px; margin-top:24px;
}
.epb .summary-box ul{margin:10px 0 0; padding-left:20px;}
.epb .summary-box li{margin-bottom:8px;}
.epb .task-header{
  background:var(--amber); color:var(--blueprint-deep); padding:22px 26px; margin-top:20px;
  display:flex; justify-content:space-between; align-items:center; flex-wrap:wrap; gap:10px;
}
.epb .task-header h2{color:var(--blueprint-deep); font-size:1.4rem; margin:0;}
.epb .task-header .badge{font-family:'IBM Plex Mono',monospace; font-size:0.8rem; background:var(--blueprint-deep); color:var(--amber); padding:6px 12px; border-radius:2px;}
.epb .steps-num{counter-reset:step; margin-top:18px; list-style:none; padding:0;}
.epb .steps-num li{counter-increment:step; position:relative; padding-left:44px; margin-bottom:16px;}
.epb .steps-num li::before{content:counter(step,decimal-leading-zero); position:absolute; left:0; top:0; font-family:'IBM Plex Mono',monospace; color:var(--amber); font-weight:600; font-size:0.95rem; border:1px solid var(--amber); width:30px; height:26px; display:flex; align-items:center; justify-content:center;}
.epb .rubric-scale{display:grid; grid-template-columns:repeat(4,1fr); gap:10px; margin-top:16px;}
.epb .rubric-scale div{background:var(--blueprint-deep); border:1px solid var(--line); padding:12px; text-align:center;}
.epb .rubric-scale .n{font-family:'IBM Plex Mono',monospace; color:var(--amber); font-size:1.3rem; font-weight:700;}
.epb .rubric-scale .l{font-size:0.78rem; color:var(--muted); text-transform:uppercase; letter-spacing:0.05em;}
.epb .notebook{
  background:repeating-linear-gradient(var(--paper), var(--paper) 33px, #D8D3C2 34px);
  color:var(--ink); border-radius:2px; padding:28px 30px; margin-top:20px; position:relative;
  box-shadow:0 20px 45px rgba(0,0,0,0.35);
}
.epb .notebook::before{content:""; position:absolute; left:46px; top:0; bottom:0; width:1.5px; background:#C0453A; opacity:0.5;}
.epb .notebook .content{padding-left:24px;}
.epb .notebook h3{color:var(--ink); font-family:'Oswald',sans-serif; letter-spacing:0.02em; margin-bottom:10px;}
.epb .notebook ul{padding-left:20px;}
.epb footer{border-top:1px solid var(--line); padding:24px 20px 40px; color:var(--muted); font-size:0.86rem;}
.epb footer .doc-code{margin-bottom:10px;}
.epb .divider-dash{border:none; border-top:1px dashed var(--line); margin:44px 0 0;}
.epb::selection{background:var(--amber); color:var(--blueprint-deep);}

&lt;/style&gt;
&lt;div class="epb"&gt;
&lt;div class="crop tl"&gt;&lt;/div&gt;&lt;div class="crop tr"&gt;&lt;/div&gt;&lt;div class="crop bl"&gt;&lt;/div&gt;&lt;div class="crop br"&gt;&lt;/div&gt;

&lt;header class="cover"&gt;
  &lt;div class="stamp"&gt;&lt;div class="ring"&gt;&lt;/div&gt;&lt;span&gt;Modul Ajar&lt;b&gt;Terverifikasi&lt;/b&gt;Fase F&lt;/span&gt;&lt;/div&gt;
  &lt;div class="doc-code"&gt;DOK/B.INDO/XI/PROSEDUR-EVAL — 3 JP · 1 Pertemuan&lt;/div&gt;
  &lt;h1&gt;Evaluasi Informasi dalam Teks Prosedur&lt;/h1&gt;
  &lt;p class="subtitle"&gt;Materi Bahasa Indonesia Kelas XI SMK/MAK — melatih murid membaca teks prosedur secara kritis: memeriksa keakuratan, kelengkapan, kelogisan urutan, dan kejelasan bahasa sebelum informasi tersebut dipercaya dan digunakan.&lt;/p&gt;

  &lt;div class="meta-strip"&gt;
    &lt;div&gt;&lt;div class="k"&gt;Mata Pelajaran&lt;/div&gt;&lt;div class="v"&gt;Bahasa Indonesia&lt;/div&gt;&lt;/div&gt;
    &lt;div&gt;&lt;div class="k"&gt;Jenjang&lt;/div&gt;&lt;div class="v"&gt;SMK/MAK — Kelas XI&lt;/div&gt;&lt;/div&gt;
    &lt;div&gt;&lt;div class="k"&gt;Elemen&lt;/div&gt;&lt;div class="v"&gt;Membaca &amp;amp; Memirsa&lt;/div&gt;&lt;/div&gt;
    &lt;div&gt;&lt;div class="k"&gt;Alokasi Waktu&lt;/div&gt;&lt;div class="v"&gt;3 JP (3 × 45 menit)&lt;/div&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/header&gt;

&lt;main&gt;

  &lt;!-- ============ CP &amp; TP ============ --&gt;
  &lt;section class="section" id="tujuan"&gt;
    &lt;div class="eyebrow"&gt;01 — Identitas Pembelajaran&lt;/div&gt;
    &lt;h2 class="section-title"&gt;Capaian &amp;amp; Tujuan Pembelajaran&lt;/h2&gt;

    &lt;div class="panel tp"&gt;
      &lt;div class="eyebrow" style="margin-bottom:6px;"&gt;Capaian Pembelajaran (Elemen Membaca–Memirsa)&lt;/div&gt;
      &lt;p&gt;Murid mampu mengevaluasi informasi berupa gagasan, pikiran, pandangan, arahan, atau pesan dari berbagai jenis teks, termasuk teks prosedur, untuk menemukan makna yang tersurat dan tersirat, serta menilai akurasi dan kualitas informasi dari teks tersebut secara kritis.&lt;/p&gt;
    &lt;/div&gt;

    &lt;div class="panel"&gt;
      &lt;div class="eyebrow" style="margin-bottom:6px;"&gt;Tujuan Pembelajaran&lt;/div&gt;
      &lt;p style="font-size:1.05rem; color:var(--off-white); font-weight:600;"&gt;Murid mampu mengevaluasi informasi yang disajikan dalam teks prosedur secara kritis dan logis.&lt;/p&gt;

      &lt;div class="tp-box"&gt;
        &lt;div class="tp-item"&gt;&lt;span class="idx mono"&gt;TP.1&lt;/span&gt;&lt;p&gt;Murid dapat menjelaskan kembali struktur dan ciri kebahasaan teks prosedur.&lt;/p&gt;&lt;/div&gt;
        &lt;div class="tp-item"&gt;&lt;span class="idx mono"&gt;TP.2&lt;/span&gt;&lt;p&gt;Murid dapat mengidentifikasi kriteria yang digunakan untuk menilai kualitas informasi dalam teks prosedur (keakuratan, kelengkapan, kelogisan urutan, kejelasan bahasa, dan kesesuaian tujuan).&lt;/p&gt;&lt;/div&gt;
        &lt;div class="tp-item"&gt;&lt;span class="idx mono"&gt;TP.3&lt;/span&gt;&lt;p&gt;Murid dapat menemukan kekeliruan, kejanggalan, atau bagian yang kurang logis pada sebuah teks prosedur berdasarkan kriteria evaluasi.&lt;/p&gt;&lt;/div&gt;
        &lt;div class="tp-item"&gt;&lt;span class="idx mono"&gt;TP.4&lt;/span&gt;&lt;p&gt;Murid dapat menyusun simpulan dan rekomendasi perbaikan atas hasil evaluasi teks prosedur secara tertulis.&lt;/p&gt;&lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class="eyebrow" style="margin-top:26px; margin-bottom:6px;"&gt;8 Profil Lulusan yang Dikembangkan&lt;/div&gt;
    &lt;div class="grid-3"&gt;
      &lt;div class="card"&gt;&lt;h4&gt;Penalaran Kritis&lt;/h4&gt;&lt;p style="font-size:0.9rem;"&gt;Menganalisis dan menilai keakuratan serta kelogisan informasi dalam teks prosedur.&lt;/p&gt;&lt;/div&gt;
      &lt;div class="card"&gt;&lt;h4&gt;Kemandirian&lt;/h4&gt;&lt;p style="font-size:0.9rem;"&gt;Menyelesaikan analisis dan menuliskan kesimpulan secara mandiri.&lt;/p&gt;&lt;/div&gt;
      &lt;div class="card"&gt;&lt;h4&gt;Kolaborasi&lt;/h4&gt;&lt;p style="font-size:0.9rem;"&gt;Bekerja sama dalam kelompok saat mengevaluasi teks prosedur.&lt;/p&gt;&lt;/div&gt;
      &lt;div class="card"&gt;&lt;h4&gt;Komunikasi&lt;/h4&gt;&lt;p style="font-size:0.9rem;"&gt;Menyampaikan hasil evaluasi dan rekomendasi perbaikan secara jelas.&lt;/p&gt;&lt;/div&gt;
    &lt;/div&gt;
  &lt;/section&gt;

  &lt;hr class="divider-dash"&gt;

  &lt;!-- ============ MATERI A: TEKS PROSEDUR ============ --&gt;
  &lt;section class="section" id="materi-a"&gt;
    &lt;div class="eyebrow"&gt;02 — Materi Inti A&lt;/div&gt;
    &lt;h2 class="section-title"&gt;Mengingat Kembali Teks Prosedur&lt;/h2&gt;
    &lt;p class="lead"&gt;Sebelum mengevaluasi, murid perlu memahami kembali apa yang membentuk sebuah teks prosedur, agar tahu bagian mana yang perlu diperiksa.&lt;/p&gt;

    &lt;div class="panel"&gt;
      &lt;p&gt;&lt;b style="color:var(--off-white);"&gt;Teks prosedur&lt;/b&gt; adalah teks yang berisi langkah-langkah sistematis untuk melakukan atau membuat sesuatu, dengan tujuan agar pembaca dapat mencapai hasil tertentu jika mengikuti langkah tersebut dengan tepat. Dalam konteks SMK, teks prosedur sangat erat dengan praktik kejuruan — misalnya prosedur pengoperasian mesin, prosedur keselamatan kerja (K3), prosedur instalasi, atau prosedur perawatan alat.&lt;/p&gt;
    &lt;/div&gt;

    &lt;h4 style="color:var(--off-white); margin-top:26px;"&gt;Struktur Teks Prosedur&lt;/h4&gt;
    &lt;div class="grid-3"&gt;
      &lt;div class="card"&gt;&lt;h4&gt;1. Tujuan&lt;/h4&gt;&lt;p style="font-size:0.92rem;"&gt;Pernyataan tentang hasil atau capaian yang ingin diperoleh dari prosedur tersebut.&lt;/p&gt;&lt;/div&gt;
      &lt;div class="card"&gt;&lt;h4&gt;2. Alat &amp;amp; Bahan&lt;/h4&gt;&lt;p style="font-size:0.92rem;"&gt;Daftar alat, bahan, atau syarat yang diperlukan sebelum langkah dimulai (tidak selalu ada, tergantung jenis prosedur).&lt;/p&gt;&lt;/div&gt;
      &lt;div class="card"&gt;&lt;h4&gt;3. Langkah-Langkah&lt;/h4&gt;&lt;p style="font-size:0.92rem;"&gt;Urutan tindakan yang harus dilakukan, biasanya bersifat kronologis dan tidak dapat diacak.&lt;/p&gt;&lt;/div&gt;
      &lt;div class="card"&gt;&lt;h4&gt;4. Penutup/Hasil&lt;/h4&gt;&lt;p style="font-size:0.92rem;"&gt;Penegasan hasil akhir, catatan tambahan, atau peringatan keselamatan (jika ada).&lt;/p&gt;&lt;/div&gt;
    &lt;/div&gt;

    &lt;h4 style="color:var(--off-white); margin-top:26px;"&gt;Ciri Kebahasaan&lt;/h4&gt;
    &lt;div class="grid-3"&gt;
      &lt;div class="card"&gt;&lt;h4&gt;Kalimat imperatif&lt;/h4&gt;&lt;p style="font-size:0.92rem;"&gt;Kalimat perintah/larangan/anjuran, mis. "Pasang kabel dengan benar."&lt;/p&gt;&lt;/div&gt;
      &lt;div class="card"&gt;&lt;h4&gt;Konjungsi temporal&lt;/h4&gt;&lt;p style="font-size:0.92rem;"&gt;Kata penghubung urutan waktu: kemudian, selanjutnya, setelah itu, lalu.&lt;/p&gt;&lt;/div&gt;
      &lt;div class="card"&gt;&lt;h4&gt;Verba tindakan &amp;amp; kata teknis&lt;/h4&gt;&lt;p style="font-size:0.92rem;"&gt;Kata kerja aktif dan istilah khusus sesuai bidang keahlian.&lt;/p&gt;&lt;/div&gt;
      &lt;div class="card"&gt;&lt;h4&gt;Keterangan alat/ukuran&lt;/h4&gt;&lt;p style="font-size:0.92rem;"&gt;Angka, satuan, dan spesifikasi yang harus tepat dan konsisten.&lt;/p&gt;&lt;/div&gt;
    &lt;/div&gt;
  &lt;/section&gt;

  &lt;hr class="divider-dash"&gt;

  &lt;!-- ============ MATERI B: KONSEP EVALUASI INFORMASI ============ --&gt;
  &lt;section class="section" id="materi-b"&gt;
    &lt;div class="eyebrow"&gt;03 — Materi Inti B&lt;/div&gt;
    &lt;h2 class="section-title"&gt;Apa itu Evaluasi Informasi?&lt;/h2&gt;

    &lt;p&gt;&lt;b style="color:var(--off-white);"&gt;Mengevaluasi informasi&lt;/b&gt; berarti menilai apakah informasi yang disajikan dalam sebuah teks layak dipercaya, digunakan, dan diikuti — bukan sekadar memahami isinya. Membaca biasa berhenti pada "apa isi teksnya", sedangkan membaca kritis-evaluatif melangkah lebih jauh: "apakah informasi ini benar, lengkap, masuk akal, dan aman untuk diikuti?"&lt;/p&gt;

    &lt;table&gt;
      &lt;tr&gt;&lt;th style="width:30%;"&gt;Aspek&lt;/th&gt;&lt;th&gt;Membaca Biasa (Pemahaman)&lt;/th&gt;&lt;th&gt;Membaca Kritis (Evaluasi)&lt;/th&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Fokus&lt;/td&gt;&lt;td&gt;Mengetahui apa yang harus dilakukan&lt;/td&gt;&lt;td&gt;Menilai apakah langkah tersebut benar, lengkap, dan logis&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Sikap pembaca&lt;/td&gt;&lt;td&gt;Menerima informasi apa adanya&lt;/td&gt;&lt;td&gt;Mempertanyakan dan memeriksa informasi sebelum dipercaya&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Hasil&lt;/td&gt;&lt;td&gt;Paham urutan langkah&lt;/td&gt;&lt;td&gt;Dapat menemukan kekeliruan dan memberi rekomendasi perbaikan&lt;/td&gt;&lt;/tr&gt;
    &lt;/table&gt;

    &lt;div class="panel warn" style="margin-top:22px;"&gt;
      &lt;p style="margin:0;"&gt;&lt;b style="color:var(--off-white);"&gt;Mengapa penting bagi murid SMK?&lt;/b&gt; Teks prosedur yang keliru atau tidak lengkap dalam konteks kejuruan bukan hanya membingungkan, tetapi dapat menyebabkan kegagalan kerja, kerusakan alat, bahkan kecelakaan kerja. Kemampuan mengevaluasi teks prosedur adalah bagian dari kesiapan kerja (job readiness).&lt;/p&gt;
    &lt;/div&gt;
  &lt;/section&gt;

  &lt;hr class="divider-dash"&gt;

  &lt;!-- ============ MATERI C: KRITERIA EVALUASI ============ --&gt;
  &lt;section class="section" id="materi-c"&gt;
    &lt;div class="eyebrow"&gt;04 — Materi Inti C&lt;/div&gt;
    &lt;h2 class="section-title"&gt;Kriteria Evaluasi Teks Prosedur&lt;/h2&gt;
    &lt;p class="lead"&gt;Gunakan enam kriteria berikut sebagai "alat ukur" ketika memeriksa sebuah teks prosedur.&lt;/p&gt;

    &lt;div class="criteria"&gt;
      &lt;div class="crit"&gt;
        &lt;div class="num mono"&gt;A&lt;/div&gt;
        &lt;div class="body"&gt;
          &lt;h4&gt;Keakuratan Informasi&lt;/h4&gt;
          &lt;p style="margin:0;"&gt;Apakah data, istilah, ukuran, takaran, atau spesifikasi yang digunakan sudah tepat dan sesuai fakta/standar yang berlaku?&lt;/p&gt;
          &lt;div class="q"&gt;Pertanyaan panduan: Apakah angka dan satuan masuk akal? Apakah istilah teknis digunakan secara tepat?&lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;
      &lt;div class="crit"&gt;
        &lt;div class="num mono"&gt;B&lt;/div&gt;
        &lt;div class="body"&gt;
          &lt;h4&gt;Kelengkapan Informasi&lt;/h4&gt;
          &lt;p style="margin:0;"&gt;Apakah seluruh alat/bahan dan langkah yang diperlukan untuk mencapai tujuan sudah disebutkan, tanpa ada bagian penting yang hilang?&lt;/p&gt;
          &lt;div class="q"&gt;Pertanyaan panduan: Jika langkah ini benar-benar diikuti, apakah tujuannya bisa tercapai? Adakah langkah yang "meloncat"?&lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;
      &lt;div class="crit"&gt;
        &lt;div class="num mono"&gt;C&lt;/div&gt;
        &lt;div class="body"&gt;
          &lt;h4&gt;Kelogisan &amp;amp; Keruntutan Urutan&lt;/h4&gt;
          &lt;p style="margin:0;"&gt;Apakah langkah-langkah disusun dengan urutan yang logis (sebab sebelum akibat) dan tidak bertentangan satu sama lain?&lt;/p&gt;
          &lt;div class="q"&gt;Pertanyaan panduan: Apakah ada langkah yang seharusnya dilakukan lebih dulu tetapi diletakkan belakangan?&lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;
      &lt;div class="crit"&gt;
        &lt;div class="num mono"&gt;D&lt;/div&gt;
        &lt;div class="body"&gt;
          &lt;h4&gt;Kejelasan &amp;amp; Keefektifan Bahasa&lt;/h4&gt;
          &lt;p style="margin:0;"&gt;Apakah kalimat mudah dipahami, tidak ambigu (bermakna ganda), dan menggunakan kalimat efektif?&lt;/p&gt;
          &lt;div class="q"&gt;Pertanyaan panduan: Apakah ada kalimat yang bisa ditafsirkan lebih dari satu cara oleh pembaca yang berbeda?&lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;
      &lt;div class="crit"&gt;
        &lt;div class="num mono"&gt;E&lt;/div&gt;
        &lt;div class="body"&gt;
          &lt;h4&gt;Kesesuaian dengan Tujuan&lt;/h4&gt;
          &lt;p style="margin:0;"&gt;Apakah seluruh langkah benar-benar mengarah pada tujuan yang dinyatakan di awal teks, atau ada langkah yang tidak relevan?&lt;/p&gt;
          &lt;div class="q"&gt;Pertanyaan panduan: Apakah ada langkah yang tidak berkaitan dengan tujuan prosedur tersebut?&lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;
      &lt;div class="crit"&gt;
        &lt;div class="num mono"&gt;F&lt;/div&gt;
        &lt;div class="body"&gt;
          &lt;h4&gt;Keselamatan &amp;amp; Kelayakan Praktik&lt;/h4&gt;
          &lt;p style="margin:0;"&gt;Khusus untuk teks prosedur kejuruan: apakah aspek keselamatan kerja (K3) dan kelayakan alat sudah diperhatikan?&lt;/p&gt;
          &lt;div class="q"&gt;Pertanyaan panduan: Apakah ada risiko keselamatan yang tidak diperingatkan dalam teks?&lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/section&gt;

  &lt;hr class="divider-dash"&gt;

  &lt;!-- ============ MATERI D: LANGKAH EVALUASI ============ --&gt;
  &lt;section class="section" id="materi-d"&gt;
    &lt;div class="eyebrow"&gt;05 — Materi Inti D&lt;/div&gt;
    &lt;h2 class="section-title"&gt;Langkah-Langkah Mengevaluasi Teks Prosedur&lt;/h2&gt;

    &lt;div class="timeline"&gt;
      &lt;div class="tl-item"&gt;&lt;h4 class="mono"&gt;01 · Membaca Menyeluruh&lt;/h4&gt;&lt;p&gt;Baca teks prosedur dari awal hingga akhir untuk memahami tujuan dan gambaran umum langkahnya sebelum menilai bagian per bagian.&lt;/p&gt;&lt;/div&gt;
      &lt;div class="tl-item"&gt;&lt;h4 class="mono"&gt;02 · Mengidentifikasi Struktur&lt;/h4&gt;&lt;p&gt;Tandai bagian tujuan, alat/bahan, dan langkah-langkah. Struktur yang tidak lengkap sudah menjadi indikasi awal masalah.&lt;/p&gt;&lt;/div&gt;
      &lt;div class="tl-item"&gt;&lt;h4 class="mono"&gt;03 · Menguji dengan Kriteria&lt;/h4&gt;&lt;p&gt;Periksa teks menggunakan keenam kriteria (A–F) satu per satu. Catat bagian teks yang tidak memenuhi kriteria tertentu.&lt;/p&gt;&lt;/div&gt;
      &lt;div class="tl-item"&gt;&lt;h4 class="mono"&gt;04 · Mencatat Temuan&lt;/h4&gt;&lt;p&gt;Tuliskan temuan secara spesifik: bagian/kalimat mana yang bermasalah dan mengapa, bukan sekadar "kurang jelas".&lt;/p&gt;&lt;/div&gt;
      &lt;div class="tl-item"&gt;&lt;h4 class="mono"&gt;05 · Menyimpulkan &amp;amp; Merekomendasikan&lt;/h4&gt;&lt;p&gt;Simpulkan apakah teks prosedur tersebut layak diikuti, dan berikan saran perbaikan konkret untuk bagian yang bermasalah.&lt;/p&gt;&lt;/div&gt;
    &lt;/div&gt;
  &lt;/section&gt;

  &lt;hr class="divider-dash"&gt;

  &lt;!-- ============ CONTOH PENERAPAN ============ --&gt;
  &lt;section class="section" id="contoh"&gt;
    &lt;div class="eyebrow"&gt;06 — Pemodelan&lt;/div&gt;
    &lt;h2 class="section-title"&gt;Contoh Penerapan: Menganalisis Teks Prosedur Bidang Otomotif Sepeda Motor&lt;/h2&gt;
    &lt;p class="lead"&gt;Guru membacakan dan membahas bersama contoh berikut sebagai model penerapan kriteria evaluasi. Bagian bertanda merah sengaja mengandung kejanggalan untuk dianalisis.&lt;/p&gt;

    &lt;div class="doc-sample"&gt;
      &lt;div class="doc-head"&gt;&lt;span&gt;Lampiran · Teks Prosedur Contoh&lt;/span&gt;&lt;span&gt;Dokumen-01 · TBSM&lt;/span&gt;&lt;/div&gt;
      &lt;div class="doc-body"&gt;
        &lt;h3&gt;Prosedur Mengganti Oli Mesin Sepeda Motor&lt;/h3&gt;
        &lt;p style="margin-top:-4px; color:#4b5a63;"&gt;&lt;i&gt;Tujuan: Mengganti oli mesin sepeda motor secara berkala agar performa dan usia mesin tetap terjaga.&lt;/i&gt;&lt;/p&gt;
        &lt;p style="margin:10px 0 4px; color:#4b5a63; font-size:0.92rem;"&gt;&lt;b&gt;Alat &amp;amp; bahan:&lt;/b&gt; kunci pas ring 17, wadah penampung oli bekas, oli mesin baru sesuai spesifikasi pabrikan, corong, lap bersih.&lt;/p&gt;
        &lt;ol&gt;
          &lt;li&gt;Panaskan mesin sepeda motor selama beberapa menit agar oli lebih mudah mengalir saat dibuang.&lt;/li&gt;
          &lt;li&gt;Matikan mesin, lalu siapkan wadah penampung tepat di bawah baut pembuangan oli.&lt;/li&gt;
          &lt;li&gt;Buka baut pembuangan oli menggunakan kunci pas ring 17, biarkan oli lama mengalir hingga habis.&lt;/li&gt;
          &lt;li&gt;Pasang kembali baut pembuangan oli setelah oli lama habis menetes.&lt;/li&gt;
          &lt;li&gt;Tuang oli mesin baru sebanyak 5 liter melalui lubang pengisian menggunakan corong.&lt;span class="flag"&gt;JANGGAL&lt;/span&gt;
            &lt;div class="note-margin"&gt;Kriteria A — tidak akurat: kapasitas oli mesin sepeda motor umumnya hanya sekitar 0,8–1,2 liter, bukan 5 liter. Angka ini tidak sesuai spesifikasi standar.&lt;/div&gt;
          &lt;/li&gt;
          &lt;li&gt;Nyalakan mesin dan periksa kebocoran oli di sekitar baut pembuangan.&lt;/li&gt;
        &lt;/ol&gt;
        &lt;div class="note-margin" style="margin-top:14px;"&gt;Kriteria B — kurang lengkap: teks tidak menyebutkan langkah memeriksa ketinggian oli melalui kaca duga (oil level window) atau stik oli setelah pengisian, padahal langkah ini penting untuk memastikan takaran oli sudah tepat.&lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class="legend"&gt;
      &lt;span&gt;&lt;span class="dot" style="background:#D94E2A;"&gt;&lt;/span&gt;Bagian yang mengandung kejanggalan (ditandai untuk didiskusikan)&lt;/span&gt;
    &lt;/div&gt;

    &lt;div class="panel" style="margin-top:22px;"&gt;
      &lt;p style="margin:0;"&gt;&lt;b style="color:var(--off-white);"&gt;Simpulan model analisis:&lt;/b&gt; Teks prosedur di atas cukup logis dari segi urutan langkah (Kriteria C terpenuhi), tetapi tidak akurat pada takaran oli yang dituliskan (melanggar Kriteria A) dan kurang lengkap karena tidak ada langkah pengecekan ketinggian oli di akhir (melanggar Kriteria B). Rekomendasi: perbaiki angka takaran oli sesuai spesifikasi motor yang sebenarnya, dan tambahkan langkah memeriksa ketinggian oli melalui kaca duga sebelum menyalakan mesin.&lt;/p&gt;
    &lt;/div&gt;
  &lt;/section&gt;

  &lt;hr class="divider-dash"&gt;

  &lt;!-- ============ RANGKUMAN ============ --&gt;
  &lt;section class="section" id="rangkuman"&gt;
    &lt;div class="eyebrow"&gt;07 — Ringkasan Materi&lt;/div&gt;
    &lt;h2 class="section-title"&gt;Poin-Poin Penting&lt;/h2&gt;
    &lt;div class="summary-box"&gt;
      &lt;ul&gt;
        &lt;li&gt;Mengevaluasi informasi dalam teks prosedur berarti menilai kelayakan teks tersebut untuk dipercaya dan diikuti, bukan sekadar memahami isinya.&lt;/li&gt;
        &lt;li&gt;Enam kriteria evaluasi: keakuratan, kelengkapan, kelogisan urutan, kejelasan bahasa, kesesuaian tujuan, dan keselamatan/kelayakan praktik.&lt;/li&gt;
        &lt;li&gt;Evaluasi dilakukan bertahap: membaca menyeluruh → mengidentifikasi struktur → menguji dengan kriteria → mencatat temuan → menyimpulkan dan merekomendasikan.&lt;/li&gt;
        &lt;li&gt;Kemampuan ini penting bagi murid SMK karena berkaitan langsung dengan keselamatan dan ketepatan kerja di bidang kejuruan.&lt;/li&gt;
      &lt;/ul&gt;
    &lt;/div&gt;
  &lt;/section&gt;

  &lt;hr class="divider-dash"&gt;

  &lt;!-- ============ TUGAS KELOMPOK ============ --&gt;
  &lt;section class="section" id="tugas-kelompok"&gt;
    &lt;div class="eyebrow"&gt;08 — Lembar Kerja&lt;/div&gt;
    &lt;div class="task-header"&gt;
      &lt;h2&gt;Tugas Kelompok: Evaluasi Teks Prosedur Bidang Sepeda Motor&lt;/h2&gt;
      &lt;span class="badge"&gt;Durasi ± 60 menit&lt;/span&gt;
    &lt;/div&gt;

    &lt;p style="margin-top:18px;"&gt;&lt;b style="color:var(--off-white);"&gt;Tujuan tugas:&lt;/b&gt; Murid secara berkelompok mengevaluasi teks prosedur bidang Teknik Otomotif Sepeda Motor berikut menggunakan enam kriteria yang telah dipelajari, kemudian mempresentasikan hasil evaluasi dan rekomendasi perbaikannya.&lt;/p&gt;

    &lt;div class="doc-sample" style="margin-top:20px;"&gt;
      &lt;div class="doc-head"&gt;&lt;span&gt;Lampiran · Teks Prosedur untuk Dievaluasi Kelompok&lt;/span&gt;&lt;span&gt;Dokumen-02 · TBSM&lt;/span&gt;&lt;/div&gt;
      &lt;div class="doc-body"&gt;
        &lt;h3&gt;Prosedur Memeriksa dan Mengganti Busi Sepeda Motor&lt;/h3&gt;
        &lt;p style="margin-top:-4px; color:#4b5a63;"&gt;&lt;i&gt;Tujuan: Memeriksa kondisi busi dan menggantinya apabila sudah tidak layak pakai agar pembakaran mesin tetap optimal.&lt;/i&gt;&lt;/p&gt;
        &lt;p style="margin:10px 0 4px; color:#4b5a63; font-size:0.92rem;"&gt;&lt;b&gt;Alat &amp;amp; bahan:&lt;/b&gt; kunci busi, sikat kawat, feeler gauge (pengukur celah busi), busi baru sesuai spesifikasi motor.&lt;/p&gt;
        &lt;ol&gt;
          &lt;li&gt;Pastikan mesin sepeda motor dalam kondisi menyala saat akan membuka busi agar posisi piston mudah ditentukan.&lt;/li&gt;
          &lt;li&gt;Buka penutup busi (cap) menggunakan tangan.&lt;/li&gt;
          &lt;li&gt;Lepaskan busi lama menggunakan kunci busi dengan cara memutar searah jarum jam.&lt;/li&gt;
          &lt;li&gt;Periksa kondisi ujung elektroda busi; jika berwarna hitam pekat atau basah, bersihkan menggunakan sikat kawat.&lt;/li&gt;
          &lt;li&gt;Apabila busi sudah aus, retak, atau elektroda sudah menipis, ganti dengan busi baru sesuai spesifikasi pabrikan.&lt;/li&gt;
          &lt;li&gt;Pasang busi baru, kencangkan dengan tangan terlebih dahulu, lalu kencangkan penuh menggunakan kunci busi.&lt;/li&gt;
          &lt;li&gt;Sepeda motor siap digunakan kembali.&lt;/li&gt;
        &lt;/ol&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;p class="lead" style="margin-top:14px;"&gt;Teks di atas &lt;b style="color:var(--off-white);"&gt;belum dianotasi&lt;/b&gt; — tugas kelompok adalah menemukan sendiri bagian yang bermasalah menggunakan keenam kriteria evaluasi.&lt;/p&gt;

    &lt;h4 style="color:var(--off-white); margin-top:24px;"&gt;Petunjuk Pengerjaan&lt;/h4&gt;
    &lt;ol class="steps-num"&gt;
      &lt;li&gt;&lt;b&gt;Bentuk kelompok&lt;/b&gt; beranggotakan 4–5 orang sesuai pembagian dari guru.&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Baca teks prosedur&lt;/b&gt; di atas secara bersama-sama dalam kelompok, lalu identifikasi struktur teks (tujuan, alat/bahan, langkah-langkah).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Isi Tabel Evaluasi&lt;/b&gt; di bawah ini untuk setiap kriteria: tuliskan temuan, beri skor 1–4, dan berikan alasan.&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Rumuskan rekomendasi perbaikan&lt;/b&gt; untuk setiap bagian teks yang dinilai bermasalah.&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Presentasikan hasil&lt;/b&gt; di depan kelas selama maksimal 5 menit per kelompok, dilanjutkan tanya jawab singkat.&lt;/li&gt;
    &lt;/ol&gt;

    &lt;h4 style="color:var(--off-white); margin-top:26px;"&gt;Format Tabel Evaluasi Kelompok&lt;/h4&gt;
    &lt;table&gt;
      &lt;tr&gt;&lt;th style="width:22%;"&gt;Kriteria&lt;/th&gt;&lt;th style="width:34%;"&gt;Temuan &amp;amp; Bukti dari Teks&lt;/th&gt;&lt;th style="width:10%;"&gt;Skor (1–4)&lt;/th&gt;&lt;th&gt;Rekomendasi Perbaikan&lt;/th&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;A. Keakuratan&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;B. Kelengkapan&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;C. Kelogisan urutan&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;D. Kejelasan bahasa&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;E. Kesesuaian tujuan&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;F. Keselamatan/kelayakan&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;
    &lt;/table&gt;

    &lt;h4 style="color:var(--off-white); margin-top:26px;"&gt;Rubrik Penilaian Kelompok&lt;/h4&gt;
    &lt;table&gt;
      &lt;tr&gt;&lt;th style="width:26%;"&gt;Aspek Penilaian&lt;/th&gt;&lt;th&gt;Skor 4 (Sangat Baik)&lt;/th&gt;&lt;th&gt;Skor 3 (Baik)&lt;/th&gt;&lt;th&gt;Skor 2 (Cukup)&lt;/th&gt;&lt;th&gt;Skor 1 (Kurang)&lt;/th&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Ketepatan analisis kriteria&lt;/td&gt;&lt;td&gt;Seluruh kriteria dianalisis tepat dengan bukti jelas&lt;/td&gt;&lt;td&gt;Sebagian besar kriteria tepat&lt;/td&gt;&lt;td&gt;Analisis dangkal, sebagian kriteria terlewat&lt;/td&gt;&lt;td&gt;Analisis tidak sesuai kriteria&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Kualitas rekomendasi&lt;/td&gt;&lt;td&gt;Rekomendasi konkret dan dapat diterapkan&lt;/td&gt;&lt;td&gt;Rekomendasi cukup jelas&lt;/td&gt;&lt;td&gt;Rekomendasi umum/kurang spesifik&lt;/td&gt;&lt;td&gt;Tidak ada rekomendasi&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Kerja sama kelompok&lt;/td&gt;&lt;td&gt;Seluruh anggota aktif berkontribusi&lt;/td&gt;&lt;td&gt;Sebagian besar anggota aktif&lt;/td&gt;&lt;td&gt;Hanya sebagian kecil anggota aktif&lt;/td&gt;&lt;td&gt;Didominasi satu orang&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Presentasi&lt;/td&gt;&lt;td&gt;Jelas, percaya diri, menjawab pertanyaan dengan baik&lt;/td&gt;&lt;td&gt;Jelas namun kurang percaya diri&lt;/td&gt;&lt;td&gt;Kurang jelas/terbata-bata&lt;/td&gt;&lt;td&gt;Tidak dapat menjelaskan hasil&lt;/td&gt;&lt;/tr&gt;
    &lt;/table&gt;
  &lt;/section&gt;

  &lt;hr class="divider-dash"&gt;

  &lt;!-- ============ RANGKUMAN UNTUK BUKU CATATAN ============ --&gt;
  &lt;section class="section" id="catatan-murid"&gt;
    &lt;div class="eyebrow"&gt;09 — Penutup Pembelajaran&lt;/div&gt;
    &lt;h2 class="section-title"&gt;Rangkuman untuk Dicatat di Buku Catatan&lt;/h2&gt;
    &lt;p class="lead"&gt;Sebagai penutup pertemuan, setiap murid menuliskan satu rangkuman ringkas secara mandiri di buku catatan sebagai simpulan pribadi atas materi hari ini.&lt;/p&gt;

    &lt;div class="notebook"&gt;
      &lt;div class="content"&gt;
        &lt;h3&gt;Instruksi Menulis Rangkuman&lt;/h3&gt;
        &lt;p style="margin-top:0;"&gt;Tulis di buku catatan masing-masing, maksimal &lt;b&gt;satu halaman&lt;/b&gt;, mencakup poin-poin berikut:&lt;/p&gt;
        &lt;ul&gt;
          &lt;li&gt;Pengertian evaluasi informasi dalam teks prosedur, menurut pemahaman sendiri.&lt;/li&gt;
          &lt;li&gt;Minimal empat dari enam kriteria evaluasi teks prosedur yang telah dipelajari beserta penjelasan singkat.&lt;/li&gt;
          &lt;li&gt;Langkah-langkah mengevaluasi teks prosedur secara berurutan.&lt;/li&gt;
          &lt;li&gt;Satu manfaat konkret mempelajari kemampuan ini bagi bidang keahlian Teknik Otomotif Sepeda Motor.&lt;/li&gt;
        &lt;/ul&gt;
        &lt;p style="margin-bottom:0;"&gt;&lt;i&gt;Rangkuman ditulis dengan kalimat sendiri (bukan menyalin ulang dari materi), dan dikumpulkan pada awal pertemuan berikutnya untuk diperiksa guru.&lt;/i&gt;&lt;/p&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/section&gt;

&lt;/main&gt;

&lt;footer&gt;
  &lt;div class="doc-code"&gt;DOK/B.INDO/XI/PROSEDUR-EVAL — Fokus Tujuan Pembelajaran, Materi Inti, Tugas Kelompok TBSM &amp;amp; Rangkuman Buku Catatan, 1× pertemuan (3 JP)&lt;/div&gt;
  &lt;p style="margin:0;"&gt;Referensi: Kurikulum Merdeka — Capaian Pembelajaran Bahasa Indonesia Fase F (Elemen Membaca dan Memirsa); Buku Teks Bahasa Indonesia Kelas XI SMK/MAK Kemendikbudristek.&lt;/p&gt;
&lt;/footer&gt;
&lt;/div&gt;</description><link>http://kitab-investasi.blogspot.com/2026/07/evaluasi-informasi-dalam-teks-prosedur.html</link><thr:total>0</thr:total><author>nof_rizal07@yahoo.co.id (abang_cool)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-9000860041661554971.post-6948960574111861418</guid><pubDate>Thu, 23 Jul 2026 05:29:08 +0000</pubDate><atom:updated>2026-07-23T12:43:21.641+07:00</atom:updated><title>SERTIFIKAT KOMBEL</title><description>&lt;!DOCTYPE html&gt;
&lt;html lang="id"&gt;
&lt;head&gt;
&lt;meta charset="UTF-8"&gt;
&lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&gt;
&lt;title&gt;Generator Sertifikat&lt;/title&gt;

&lt;link href="https://fonts.googleapis.com/css2?family=Montserrat:wght@700&amp;display=swap" rel="stylesheet"&gt;

&lt;script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/2.5.1/jspdf.umd.min.js"&gt;&lt;/script&gt;

&lt;style&gt;

body{
    font-family:Arial,sans-serif;
    background:#eef2f7;
    padding:20px;
    max-width:700px;
    margin:auto;
}

.card{
    background:white;
    padding:24px;
    border-radius:20px;
    box-shadow:0 10px 20px rgba(0,0,0,.1);
}

h2{
    text-align:center;
    color:#1e4668;
}

.confirm-box{
    background:#f0f6ff;
    border-left:5px solid #2c7da0;
    padding:16px;
    border-radius:16px;
    margin-bottom:20px;
    text-align:center;
}

.confirm-box p{
    margin-top:0;
    font-weight:bold;
    color:#1e4668;
}

.confirm-buttons{
    display:flex;
    gap:10px;
    margin-top:10px;
}

.confirm-buttons button{
    flex:1;
}

.yes-btn{
    background:#1f8a4c;
}

.yes-btn:hover{
    background:#166638;
}

.no-btn{
    background:#c0392b;
}

.no-btn:hover{
    background:#962d22;
}

input,select,button{
    width:100%;
    padding:12px;
    margin-top:10px;
    border-radius:12px;
    border:1px solid #ccc;
    font-size:16px;
}

button{
    background:#2c7da0;
    color:white;
    border:none;
    cursor:pointer;
    font-weight:bold;
}

button:hover{
    background:#1f5e7a;
}

button:disabled{
    background:#94a3b8;
    cursor:not-allowed;
}

input:disabled,
select:disabled{
    background:#f1f5f9;
}

#preview{
    width:100%;
    border-radius:12px;
    margin-top:10px;
}

.loading{
    display:none;
    margin-top:15px;
    color:#1e4668;
    font-weight:bold;
    text-align:center;
}

.status{
    margin-top:12px;
    font-weight:bold;
}

.success{
    color:#1f8a4c;
}

.error{
    color:#c0392b;
}

&lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;

&lt;div class="card"&gt;

&lt;h2&gt;&#128220; Generator Sertifikat&lt;/h2&gt;

&lt;!-- ================= KONFIRMASI ================= --&gt;

&lt;div class="confirm-box"&gt;

&lt;p&gt;&#128269; Apakah Anda mengikuti pelatihan?&lt;/p&gt;

&lt;div class="confirm-buttons"&gt;

&lt;button class="yes-btn" onclick="confirmIkut()"&gt;
✅ YA, IKUT
&lt;/button&gt;

&lt;button class="no-btn" onclick="confirmTidakIkut()"&gt;
❌ TIDAK
&lt;/button&gt;

&lt;/div&gt;

&lt;div id="statusKonfirmasi" class="status"&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;!-- ================= FORM ================= --&gt;

&lt;label&gt;Nama Lengkap&lt;/label&gt;

&lt;input
type="text"
id="nama"
placeholder="Contoh: Ahmad Fauzi"
disabled&gt;

&lt;label&gt;Peran&lt;/label&gt;

&lt;select id="peran" disabled&gt;
    &lt;option&gt;Peserta&lt;/option&gt;
    &lt;option&gt;Narasumber&lt;/option&gt;
&lt;/select&gt;

&lt;img
id="preview"
src="https://lh3.googleusercontent.com/d/1wYfpuHGjH4rw1199lBUM7vvdigBwkJbY"
alt="Template"&gt;

&lt;button
id="downloadBtn"
onclick="generatePDF()"
disabled&gt;

⬇️ UNDUH PDF

&lt;/button&gt;

&lt;div class="loading" id="loading"&gt;
Memproses PDF...
&lt;/div&gt;

&lt;/div&gt;

&lt;script&gt;

// ================= TEMPLATE (DIUBAH) =================

const FILE_ID =
'1wYfpuHGjH4rw1199lBUM7vvdigBwkJbY';  // &lt;-- ID baru

const TEMPLATE_URL =
`https://lh3.googleusercontent.com/d/${FILE_ID}`;

// ================= UTIL =================

function showLoading(show){

    document.getElementById('loading').style.display =
        show ? 'block' : 'none';

}

function getRomanMonth(monthIndex){

    const romawi = [
        "I","II","III","IV","V","VI",
        "VII","VIII","IX","X","XI","XII"
    ];

    return romawi[monthIndex];

}

function capitalizeEachWord(text){

    return text
        .toLowerCase()
        .replace(/\b\w/g,c=&gt;c.toUpperCase());

}

// ================= KONFIRMASI =================

function confirmIkut(){

    document.getElementById('nama').disabled = false;

    document.getElementById('peran').disabled = false;

    document.getElementById('downloadBtn').disabled = false;

    document.getElementById('statusKonfirmasi').innerHTML =
        '&lt;span class="success"&gt;✅ Konfirmasi diterima. Anda dapat mengunduh sertifikat.&lt;/span&gt;';

}

function confirmTidakIkut(){

    document.getElementById('nama').disabled = true;

    document.getElementById('peran').disabled = true;

    document.getElementById('downloadBtn').disabled = true;

    document.getElementById('statusKonfirmasi').innerHTML =
        '&lt;span class="error"&gt;❌ Anda tidak dapat mengunduh sertifikat.&lt;/span&gt;';

}

// ================= LOAD IMAGE =================

function loadImage(url){

    return new Promise((resolve,reject)=&gt;{

        const img = new Image();

        img.crossOrigin = "anonymous";

        img.onload = ()=&gt;resolve(img);

        img.onerror = ()=&gt;{

            reject(
                new Error(
                    'Template Google Drive gagal dimuat'
                )
            );

        };

        img.src = url + '?t=' + Date.now();

    });

}

// ================= NOMOR =================

async function generateNomor(){

    const now = new Date();

    const bulan =
        getRomanMonth(now.getMonth());

    const tahun =
        now.getFullYear();

    const nomor =
        Math.floor(Math.random()*900)+100;

    return `${nomor}/K/${bulan}/${tahun}`;

}

// ================= PDF =================

async function generatePDF(){

    const namaInput =
        document.getElementById('nama');

    const peranSelect =
        document.getElementById('peran');

    let nama =
        namaInput.value.trim();

    const peran =
        peranSelect.value;

    if(!nama){

        alert('Nama wajib diisi');

        return;

    }

    nama =
        capitalizeEachWord(nama);

    showLoading(true);

    try{

        await document.fonts.ready;

        const img =
            await loadImage(TEMPLATE_URL);

        const canvas =
            document.createElement('canvas');

        canvas.width = img.width;
        canvas.height = img.height;

        const ctx =
            canvas.getContext('2d');

        ctx.drawImage(
            img,
            0,
            0,
            canvas.width,
            canvas.height
        );

        // ================= POSISI =================

        const nomorY =
            canvas.height * 0.235;

        const namaY =
            canvas.height * 0.3990;

        const peranY =
            canvas.height * 0.5420;

        // ================= STYLE =================

        ctx.textAlign = 'center';

        ctx.textBaseline = 'middle';

        ctx.fillStyle = '#000';

        // nomor
        const nomorSertifikat =
            await generateNomor();

        ctx.font =
            `bold ${canvas.width*0.0125}px Montserrat`;

        ctx.fillText(
            nomorSertifikat,
            canvas.width/2,
            nomorY
        );

        // nama auto shrink
        let fontSize =
            canvas.width * 0.031;

        ctx.font =
            `700 ${fontSize}px Montserrat`;

        let textWidth =
            ctx.measureText(nama).width;

        const maxWidth =
            canvas.width - 180;

        while(
            textWidth &gt; maxWidth &amp;&amp;
            fontSize &gt; 20
        ){

            fontSize -= 2;

            ctx.font =
                `700 ${fontSize}px Montserrat`;

            textWidth =
                ctx.measureText(nama).width;

        }

        ctx.fillText(
            nama,
            canvas.width/2,
            namaY
        );

        // peran
        ctx.font =
            `bold ${canvas.width*0.024}px Montserrat`;

        ctx.fillText(
            peran,
            canvas.width/2,
            peranY
        );

        // ================= PDF =================

        const imageData =
            canvas.toDataURL(
                'image/jpeg',
                1.0
            );

        const { jsPDF } =
            window.jspdf;

        const pdf =
            new jsPDF({

                orientation:
                    canvas.width &gt; canvas.height
                    ? 'landscape'
                    : 'portrait',

                unit:'px',

                format:[
                    canvas.width,
                    canvas.height
                ]

            });

        pdf.addImage(
            imageData,
            'JPEG',
            0,
            0,
            canvas.width,
            canvas.height
        );

        const safeName =
            nama.replace(/[^a-z0-9]/gi,'_');

        pdf.save(
            `Sertifikat_${safeName}.pdf`
        );

    }catch(error){

        console.error(error);

        alert(
            '❌ Gagal membuat PDF\n\n' +
            error.message +
            '\n\nPastikan file Google Drive bersifat PUBLIC.'
        );

    }finally{

        showLoading(false);

    }

}

&lt;/script&gt;

&lt;/body&gt;
&lt;/html&gt;</description><link>http://kitab-investasi.blogspot.com/2026/07/sertifikat-kombel.html</link><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://lh3.googleusercontent.com/d/1wYfpuHGjH4rw1199lBUM7vvdigBwkJbY=s72-c" width="72"/><thr:total>0</thr:total><author>nof_rizal07@yahoo.co.id (abang_cool)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-9000860041661554971.post-4157946749772995627</guid><pubDate>Wed, 22 Jul 2026 02:45:18 +0000</pubDate><atom:updated>2026-07-22T09:58:50.051+07:00</atom:updated><title>Pengantar Informatika, Budaya Kerja Digital, Etika &amp; Profesi Teknologi Informasi</title><description>
&lt;html lang="id"&gt;
&lt;head&gt;
&lt;meta charset="UTF-8"&gt;&lt;/meta&gt;
&lt;meta content="width=device-width, initial-scale=1.0" name="viewport"&gt;&lt;/meta&gt;
&lt;title&gt;Modul Informatika X — Pengantar Informatika, Budaya Kerja Digital, Etika &amp; Profesi TI&lt;/title&gt;
&lt;link href="https://fonts.googleapis.com" rel="preconnect"&gt;&lt;/link&gt;
&lt;link href="https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@500;600;700&amp;amp;family=Literata:opsz,wght@18..144,400;18..144,500;18..144,600&amp;amp;family=JetBrains+Mono:wght@400;500&amp;amp;display=swap" rel="stylesheet"&gt;&lt;/link&gt;
&lt;style&gt;
  :root{
    --bg:#EEF1F6;
    --paper:#FFFFFF;
    --ink:#171F30;
    --ink-soft:#4B5568;
    --line:#D8DEEA;

    --c-info:#2B6CB0;      /* Pengantar Informatika */
    --c-info-bg:#E7F0FA;
    --c-budaya:#0C8F80;    /* Budaya Kerja Digital */
    --c-budaya-bg:#E3F5F1;
    --c-etika:#B5570C;     /* Etika Digital */
    --c-etika-bg:#FBEEE2;
    --c-profesi:#6D28D9;   /* Profesi TI */
    --c-profesi-bg:#EFE7FC;

    --font-display:'Space Grotesk', sans-serif;
    --font-body:'Literata', Georgia, serif;
    --font-mono:'JetBrains Mono', monospace;
  }

  *{box-sizing:border-box; margin:0; padding:0;}
  html{scroll-behavior:smooth;}
  body{
    background:var(--bg);
    color:var(--ink);
    font-family:var(--font-body);
    line-height:1.65;
    font-size:16px;
  }
  ::selection{background:var(--c-info); color:#fff;}

  a{color:inherit;}

  /* ---------- Layout shell ---------- */
  .shell{
    display:grid;
    grid-template-columns:280px 1fr;
    max-width:1280px;
    margin:0 auto;
  }
  @media (max-width:900px){
    .shell{grid-template-columns:1fr;}
    .sidebar{position:static; height:auto; order:2;}
  }

  /* ---------- Sidebar ---------- */
  .sidebar{
    position:sticky; top:0; height:100vh;
    padding:28px 20px 20px 28px;
    display:flex; flex-direction:column; gap:22px;
    overflow-y:auto;
    border-right:1px solid var(--line);
  }
  .brand{
    font-family:var(--font-display); font-weight:700; font-size:15px;
    letter-spacing:.02em;
  }
  .brand span{display:block; font-family:var(--font-mono); font-weight:400; font-size:11px; color:var(--ink-soft); margin-top:4px; letter-spacing:.03em;}

  .jp-track{display:flex; flex-direction:column; gap:2px; margin-top:4px;}
  .jp-track .label{font-family:var(--font-mono); font-size:10.5px; color:var(--ink-soft); text-transform:uppercase; letter-spacing:.08em; margin-bottom:6px;}
  .jp-node{
    display:flex; align-items:center; gap:10px;
    font-family:var(--font-mono); font-size:11.5px; color:var(--ink-soft);
    padding:5px 0;
  }
  .jp-dot{width:8px; height:8px; border-radius:50%; background:var(--line); flex-shrink:0;}
  .jp-node.i1 .jp-dot{background:var(--c-info);}
  .jp-node.i2 .jp-dot{background:var(--c-budaya);}
  .jp-node.i3 .jp-dot{background:var(--c-etika);}
  .jp-node.i4 .jp-dot{background:var(--c-profesi);}

  nav.toc{display:flex; flex-direction:column; gap:1px; font-family:var(--font-display); font-size:13.5px;}
  nav.toc .grp-label{font-family:var(--font-mono); font-size:10px; color:var(--ink-soft); text-transform:uppercase; letter-spacing:.08em; margin:14px 0 6px;}
  nav.toc a{
    display:block; padding:7px 10px; border-radius:6px; text-decoration:none;
    color:var(--ink-soft); border-left:2px solid transparent;
  }
  nav.toc a:hover{background:var(--paper); color:var(--ink);}
  nav.toc a.c1{border-left-color:var(--c-info);}
  nav.toc a.c2{border-left-color:var(--c-budaya);}
  nav.toc a.c3{border-left-color:var(--c-etika);}
  nav.toc a.c4{border-left-color:var(--c-profesi);}

  /* ---------- Main ---------- */
  main{padding:36px 40px 100px; min-width:0;}
  @media (max-width:640px){main{padding:24px 18px 80px;}}

  section{scroll-margin-top:24px;}

  .eyebrow{
    font-family:var(--font-mono); font-size:11px; letter-spacing:.1em; text-transform:uppercase;
    color:var(--ink-soft); margin-bottom:8px; display:flex; align-items:center; gap:8px;
  }
  .tag{
    font-family:var(--font-mono); font-size:10.5px; padding:2px 8px; border-radius:999px;
    border:1px solid currentColor;
  }

  h1,h2,h3{font-family:var(--font-display); font-weight:700; line-height:1.15;}
  h1{font-size:clamp(28px,4vw,42px); letter-spacing:-.01em;}
  h2{font-size:26px; margin-bottom:14px;}
  h3{font-size:17px; margin:20px 0 8px;}
  p{margin-bottom:12px; color:var(--ink);}
  strong{font-weight:600;}

  /* ---------- Hero ---------- */
  .hero{padding-bottom:40px; border-bottom:1px solid var(--line); margin-bottom:44px;}
  .hero-top{display:flex; justify-content:space-between; align-items:flex-start; gap:30px; flex-wrap:wrap;}
  .hero p.lede{font-size:16.5px; max-width:56ch; color:var(--ink-soft); margin-top:14px;}
  .meta-row{display:flex; gap:10px; flex-wrap:wrap; margin-top:18px;}
  .meta-chip{
    font-family:var(--font-mono); font-size:11.5px; color:var(--ink-soft);
    border:1px solid var(--line); padding:5px 11px; border-radius:999px; background:var(--paper);
  }

  .hub{flex-shrink:0;}

  /* ---------- Cards / boxes ---------- */
  .card{
    background:var(--paper); border:1px solid var(--line); border-radius:14px;
    padding:22px 26px; margin-bottom:16px;
  }

  .rpp{
    display:grid; grid-template-columns:repeat(4,1fr); gap:0;
    background:var(--paper); border:1px solid var(--line); border-radius:14px; overflow:hidden; margin-bottom:44px;
  }
  .rpp div{padding:16px 18px; border-right:1px solid var(--line);}
  .rpp div:last-child{border-right:none;}
  .rpp .k{font-family:var(--font-mono); font-size:10px; text-transform:uppercase; letter-spacing:.08em; color:var(--ink-soft); margin-bottom:5px;}
  .rpp .v{font-family:var(--font-display); font-weight:600; font-size:14.5px;}
  @media (max-width:700px){.rpp{grid-template-columns:1fr 1fr;} .rpp div{border-bottom:1px solid var(--line);}}

  .obj-list{list-style:none; display:flex; flex-direction:column; gap:10px; margin:16px 0 40px;}
  .obj-list li{
    display:flex; gap:12px; align-items:flex-start; background:var(--paper);
    border:1px solid var(--line); border-radius:10px; padding:12px 16px; font-size:14.5px;
  }
  .obj-list .n{font-family:var(--font-mono); font-size:11px; color:var(--ink-soft); flex-shrink:0; padding-top:2px;}

  /* ---------- Topic sections ---------- */
  .topic{
    border-radius:18px; padding:34px clamp(20px,4vw,40px); margin-bottom:36px;
    border:1px solid var(--line); background:var(--paper);
  }
  .topic .eyebrow .tag{border-color:currentColor;}
  .topic-1{border-top:5px solid var(--c-info);}
  .topic-2{border-top:5px solid var(--c-budaya);}
  .topic-3{border-top:5px solid var(--c-etika);}
  .topic-4{border-top:5px solid var(--c-profesi);}
  .topic-1 .eyebrow, .topic-1 h2{color:var(--c-info);}
  .topic-2 .eyebrow, .topic-2 h2{color:var(--c-budaya);}
  .topic-3 .eyebrow, .topic-3 h2{color:var(--c-etika);}
  .topic-4 .eyebrow, .topic-4 h2{color:var(--c-profesi);}

  .subgrid{display:grid; grid-template-columns:repeat(auto-fit,minmax(230px,1fr)); gap:14px; margin:18px 0;}
  .pill-card{
    border:1px solid var(--line); border-radius:12px; padding:14px 16px; background:var(--bg);
  }
  .pill-card h4{font-family:var(--font-display); font-size:14px; margin-bottom:5px; color:var(--ink);}
  .pill-card p{font-size:13.5px; margin:0; color:var(--ink-soft);}

  table{width:100%; border-collapse:collapse; margin:16px 0; font-size:14px;}
  th,td{text-align:left; padding:10px 12px; border-bottom:1px solid var(--line); vertical-align:top;}
  th{font-family:var(--font-mono); font-size:10.5px; text-transform:uppercase; letter-spacing:.06em; color:var(--ink-soft); font-weight:500;}

  .timeline{margin:20px 0; border-left:2px solid var(--line); padding-left:22px; display:flex; flex-direction:column; gap:18px;}
  .timeline .ev{position:relative;}
  .timeline .ev::before{content:''; position:absolute; left:-27.5px; top:5px; width:9px; height:9px; border-radius:50%; background:var(--c-info);}
  .timeline .ev .era{font-family:var(--font-mono); font-size:11px; color:var(--ink-soft);}
  .timeline .ev h4{font-family:var(--font-display); font-size:14.5px; margin:2px 0 3px;}
  .timeline .ev p{font-size:13.5px; margin:0; color:var(--ink-soft);}

  .callout{
    border-radius:12px; padding:16px 18px; margin:18px 0; font-size:14.5px;
    border:1px dashed var(--line); background:var(--bg);
  }
  .callout b{font-family:var(--font-display);}

  ul.check{list-style:none; display:flex; flex-direction:column; gap:8px; margin:12px 0;}
  ul.check li{padding-left:26px; position:relative; font-size:14.5px;}
  ul.check li::before{content:'✓'; position:absolute; left:0; top:0; font-family:var(--font-mono); font-weight:600;}

  /* ---------- Task blocks ---------- */
  .task{
    border-radius:18px; padding:34px clamp(20px,4vw,40px); margin-bottom:28px; color:#fff;
  }
  .task-group{background:linear-gradient(155deg,#1B2A4A,#101830);}
  .task-solo{background:var(--paper); border:2px solid var(--ink); color:var(--ink);}
  .task .eyebrow{color:#B9C4E0;}
  .task-solo .eyebrow{color:var(--ink-soft);}
  .task h2{color:#fff;}
  .task-solo h2{color:var(--ink);}
  .task p{color:#DCE3F2;}
  .task-solo p{color:var(--ink-soft);}

  .steps{counter-reset:step; display:flex; flex-direction:column; gap:12px; margin:18px 0;}
  .steps .step{counter-increment:step; display:flex; gap:14px; align-items:flex-start;}
  .steps .step::before{
    content:counter(step); font-family:var(--font-mono); font-size:12px; flex-shrink:0;
    width:24px; height:24px; border-radius:50%; display:flex; align-items:center; justify-content:center;
    background:rgba(255,255,255,.12); border:1px solid rgba(255,255,255,.35);
  }
  .task-solo .steps .step::before{background:var(--bg); border-color:var(--line); color:var(--ink);}
  .steps .step div{font-size:14.5px;}
  .steps .step strong{display:block; margin-bottom:2px; font-family:var(--font-display); font-size:14.5px;}

  .rubric{width:100%; margin-top:14px; font-size:13.5px; border-collapse:collapse;}
  .rubric th,.rubric td{padding:9px 10px; border-bottom:1px solid rgba(255,255,255,.18); color:#DCE3F2;}
  .rubric th{font-family:var(--font-mono); font-size:10px; text-transform:uppercase; color:#B9C4E0;}

  .deliverable-row{display:flex; gap:10px; flex-wrap:wrap; margin-top:16px;}
  .deliverable-row span{
    font-family:var(--font-mono); font-size:11.5px; padding:6px 12px; border-radius:999px;
    background:rgba(255,255,255,.1); border:1px solid rgba(255,255,255,.3);
  }
  .task-solo .deliverable-row span{background:var(--bg); border-color:var(--line);}

  footer{
    max-width:1280px; margin:0 auto; padding:30px 40px 60px; grid-column:1/-1;
    font-family:var(--font-mono); font-size:12px; color:var(--ink-soft); border-top:1px solid var(--line);
  }

  @media print{
    .sidebar{display:none;}
    .shell{grid-template-columns:1fr;}
  }
&lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;div class="shell"&gt;

  &lt;!-- ============ SIDEBAR ============ --&gt;
  &lt;aside class="sidebar"&gt;
    &lt;div class="brand"&gt;Modul Informatika&lt;span&gt;Kelas X SMK · Fase E&lt;/span&gt;&lt;/div&gt;

    &lt;div class="jp-track"&gt;
      &lt;div class="label"&gt;Alur 4 JP&lt;/div&gt;
      &lt;div class="jp-node i1"&gt;&lt;span class="jp-dot"&gt;&lt;/span&gt;JP 1 — Pengantar Informatika&lt;/div&gt;
      &lt;div class="jp-node i2"&gt;&lt;span class="jp-dot"&gt;&lt;/span&gt;JP 2 — Budaya Kerja Digital&lt;/div&gt;
      &lt;div class="jp-node i3"&gt;&lt;span class="jp-dot"&gt;&lt;/span&gt;JP 3 — Etika, HAKI &amp;amp; Keamanan&lt;/div&gt;
      &lt;div class="jp-node i4"&gt;&lt;span class="jp-dot"&gt;&lt;/span&gt;JP 4 — Profesi TI &amp;amp; Tugas&lt;/div&gt;
    &lt;/div&gt;

    &lt;nav class="toc"&gt;
      &lt;a href="#tujuan"&gt;Tujuan Pembelajaran&lt;/a&gt;
      &lt;div class="grp-label"&gt;JP 1&lt;/div&gt;
      &lt;a class="c1" href="#materi-1"&gt;01 · Pengantar Informatika&lt;/a&gt;
      &lt;div class="grp-label"&gt;JP 2&lt;/div&gt;
      &lt;a class="c2" href="#materi-2"&gt;02 · Budaya Kerja Digital&lt;/a&gt;
      &lt;div class="grp-label"&gt;JP 3&lt;/div&gt;
      &lt;a class="c3" href="#materi-3"&gt;03 · Etika, HAKI &amp;amp; Keamanan&lt;/a&gt;
      &lt;div class="grp-label"&gt;JP 4&lt;/div&gt;
      &lt;a class="c4" href="#materi-4"&gt;04 · Profesi Teknologi Informasi&lt;/a&gt;
      &lt;div class="grp-label"&gt;Penutup&lt;/div&gt;
      &lt;a href="#tugas-kelompok"&gt;Tugas Kelompok&lt;/a&gt;
      &lt;a href="#tugas-mandiri"&gt;Kesimpulan (Buku)&lt;/a&gt;
      &lt;a href="#refleksi"&gt;Refleksi Cepat&lt;/a&gt;
    &lt;/nav&gt;
  &lt;/aside&gt;

  &lt;!-- ============ MAIN ============ --&gt;
  &lt;main&gt;

    &lt;!-- HERO --&gt;
    &lt;section class="hero"&gt;
      &lt;div class="hero-top"&gt;
        &lt;div&gt;
          &lt;div class="eyebrow"&gt;&lt;span class="tag"&gt;Informatika&lt;/span&gt; Materi Pertemuan · 4 JP (180 menit)&lt;/div&gt;
          &lt;h1&gt;Pengantar Informatika, Budaya Kerja Digital,&lt;br /&gt;Etika &amp;amp; Profesi Teknologi Informasi&lt;/h1&gt;
          &lt;p class="lede"&gt;Empat topik ini adalah satu kesatuan: memahami &lt;em&gt;apa itu&lt;/em&gt; Informatika membuka jalan untuk memahami &lt;em&gt;bagaimana&lt;/em&gt; orang bekerja di dunia digital, &lt;em&gt;aturan main&lt;/em&gt; apa yang harus dipegang, dan &lt;em&gt;ke mana&lt;/em&gt; semua ini bisa membawamu sebagai karier.&lt;/p&gt;
          &lt;div class="meta-row"&gt;
            &lt;span class="meta-chip"&gt;Mapel: Informatika&lt;/span&gt;
            &lt;span class="meta-chip"&gt;Kelas X SMK&lt;/span&gt;
            &lt;span class="meta-chip"&gt;4 JP × 45 menit&lt;/span&gt;
            &lt;span class="meta-chip"&gt;Elemen: Dampak Sosial Informatika&lt;/span&gt;
          &lt;/div&gt;
        &lt;/div&gt;
        &lt;svg aria-label="Diagram keterkaitan empat topik" class="hub" height="230" role="img" viewbox="0 0 230 230" width="230" xmlns="http://www.w3.org/2000/svg"&gt;
          &lt;line stroke-width="2" stroke="#D8DEEA" x1="115" x2="115" y1="115" y2="34"&gt;
          &lt;line stroke-width="2" stroke="#D8DEEA" x1="115" x2="196" y1="115" y2="115"&gt;
          &lt;line stroke-width="2" stroke="#D8DEEA" x1="115" x2="115" y1="115" y2="196"&gt;
          &lt;line stroke-width="2" stroke="#D8DEEA" x1="115" x2="34" y1="115" y2="115"&gt;
          &lt;circle cx="115" cy="115" fill="#171F30" r="30"&gt;
          &lt;text fill="#fff" font-family="Space Grotesk" font-size="9" font-weight="700" text-anchor="middle" x="115" y="111"&gt;EKOSISTEM&lt;/text&gt;
          &lt;text fill="#fff" font-family="Space Grotesk" font-size="9" font-weight="700" text-anchor="middle" x="115" y="122"&gt;TI&lt;/text&gt;
          &lt;circle cx="115" cy="34" fill="#E7F0FA" r="24" stroke-width="2" stroke="#2B6CB0"&gt;
          &lt;text fill="#2B6CB0" font-family="Space Grotesk" font-size="8" font-weight="700" text-anchor="middle" x="115" y="31"&gt;01&lt;/text&gt;
          &lt;text fill="#2B6CB0" font-family="Space Grotesk" font-size="7" font-weight="700" text-anchor="middle" x="115" y="41"&gt;Informatika&lt;/text&gt;
          &lt;circle cx="196" cy="115" fill="#E3F5F1" r="24" stroke-width="2" stroke="#0C8F80"&gt;
          &lt;text fill="#0C8F80" font-family="Space Grotesk" font-size="8" font-weight="700" text-anchor="middle" x="196" y="112"&gt;02&lt;/text&gt;
          &lt;text fill="#0C8F80" font-family="Space Grotesk" font-size="6.3" font-weight="700" text-anchor="middle" x="196" y="122"&gt;Budaya Kerja&lt;/text&gt;
          &lt;circle cx="115" cy="196" fill="#FBEEE2" r="24" stroke-width="2" stroke="#B5570C"&gt;
          &lt;text fill="#B5570C" font-family="Space Grotesk" font-size="8" font-weight="700" text-anchor="middle" x="115" y="193"&gt;03&lt;/text&gt;
          &lt;text fill="#B5570C" font-family="Space Grotesk" font-size="7" font-weight="700" text-anchor="middle" x="115" y="203"&gt;Etika&lt;/text&gt;
          &lt;circle cx="34" cy="115" fill="#EFE7FC" r="24" stroke-width="2" stroke="#6D28D9"&gt;
          &lt;text fill="#6D28D9" font-family="Space Grotesk" font-size="8" font-weight="700" text-anchor="middle" x="34" y="112"&gt;04&lt;/text&gt;
          &lt;text fill="#6D28D9" font-family="Space Grotesk" font-size="6.3" font-weight="700" text-anchor="middle" x="34" y="122"&gt;Profesi TI&lt;/text&gt;
        &lt;/circle&gt;&lt;/circle&gt;&lt;/circle&gt;&lt;/circle&gt;&lt;/circle&gt;&lt;/line&gt;&lt;/line&gt;&lt;/line&gt;&lt;/line&gt;&lt;/svg&gt;
      &lt;/div&gt;
    &lt;/section&gt;

    &lt;!-- RPP MINI --&gt;
    &lt;div class="rpp"&gt;
      &lt;div&gt;&lt;div class="k"&gt;Fase / Kelas&lt;/div&gt;&lt;div class="v"&gt;Fase E · X SMK&lt;/div&gt;&lt;/div&gt;
      &lt;div&gt;&lt;div class="k"&gt;Alokasi Waktu&lt;/div&gt;&lt;div class="v"&gt;4 JP (180 menit)&lt;/div&gt;&lt;/div&gt;
      &lt;div&gt;&lt;div class="k"&gt;Model&lt;/div&gt;&lt;div class="v"&gt;Diskusi &amp;amp; Kerja Kelompok&lt;/div&gt;&lt;/div&gt;
      &lt;div&gt;&lt;div class="k"&gt;Penilaian&lt;/div&gt;&lt;div class="v"&gt;Produk + Kesimpulan Tertulis&lt;/div&gt;&lt;/div&gt;
    &lt;/div&gt;

    &lt;!-- TUJUAN --&gt;
    &lt;section id="tujuan"&gt;
      &lt;div class="eyebrow"&gt;&lt;span class="tag"&gt;Tujuan Pembelajaran&lt;/span&gt;&lt;/div&gt;
      &lt;h2 style="color: var(--ink);"&gt;Setelah pertemuan ini, murid mampu:&lt;/h2&gt;
      &lt;ul class="obj-list"&gt;
        &lt;li&gt;&lt;span class="n"&gt;TP.1&lt;/span&gt; Menjelaskan ruang lingkup Informatika dan bidang-bidang keilmuan yang menyusunnya.&lt;/li&gt;
        &lt;li&gt;&lt;span class="n"&gt;TP.2&lt;/span&gt; Menguraikan perkembangan teknologi digital dan dampaknya terhadap cara manusia bekerja.&lt;/li&gt;
        &lt;li&gt;&lt;span class="n"&gt;TP.3&lt;/span&gt; Menerapkan prinsip etika digital, menghormati hak kekayaan intelektual (HAKI), dan praktik keamanan digital dasar.&lt;/li&gt;
        &lt;li&gt;&lt;span class="n"&gt;TP.4&lt;/span&gt; Mengidentifikasi ragam profesi di bidang Teknologi Informasi beserta kompetensi yang dibutuhkan.&lt;/li&gt;
      &lt;/ul&gt;
    &lt;/section&gt;

    &lt;!-- ================= TOPIK 1 ================= --&gt;
    &lt;section class="topic topic-1" id="materi-1"&gt;
      &lt;div class="eyebrow"&gt;&lt;span class="tag"&gt;JP 1 · 45 menit&lt;/span&gt; 01 — Pengantar Informatika&lt;/div&gt;
      &lt;h2&gt;Apa Itu Informatika, dan Seluas Apa Cakupannya?&lt;/h2&gt;
      &lt;p&gt;&lt;strong&gt;Informatika&lt;/strong&gt; adalah ilmu yang mempelajari bagaimana informasi direpresentasikan, diproses, disimpan, dan dikomunikasikan secara sistematis dengan bantuan komputer. Informatika bukan sekadar "belajar komputer" — ia adalah cara berpikir untuk memecahkan masalah secara terstruktur (disebut &lt;em&gt;computational thinking&lt;/em&gt; atau berpikir komputasional), yang kemudian diwujudkan lewat algoritma, program, dan sistem.&lt;/p&gt;

      &lt;h3&gt;Tujuh Bidang Ilmu dalam Informatika&lt;/h3&gt;
      &lt;div class="subgrid"&gt;
        &lt;div class="pill-card"&gt;&lt;h4&gt;Berpikir Komputasional&lt;/h4&gt;&lt;p&gt;Kemampuan memecah masalah kompleks menjadi langkah-langkah logis dan sistematis.&lt;/p&gt;&lt;/div&gt;
        &lt;div class="pill-card"&gt;&lt;h4&gt;Teknologi Informasi &amp;amp; Komunikasi&lt;/h4&gt;&lt;p&gt;Penggunaan perangkat lunak dan platform digital untuk produktivitas sehari-hari.&lt;/p&gt;&lt;/div&gt;
        &lt;div class="pill-card"&gt;&lt;h4&gt;Sistem Komputer&lt;/h4&gt;&lt;p&gt;Perangkat keras, perangkat lunak, dan cara keduanya bekerja sama memproses data.&lt;/p&gt;&lt;/div&gt;
        &lt;div class="pill-card"&gt;&lt;h4&gt;Jaringan Komputer &amp;amp; Internet&lt;/h4&gt;&lt;p&gt;Bagaimana perangkat saling terhubung dan bertukar data melalui jaringan.&lt;/p&gt;&lt;/div&gt;
        &lt;div class="pill-card"&gt;&lt;h4&gt;Analisis Data&lt;/h4&gt;&lt;p&gt;Mengolah data mentah menjadi informasi yang bermakna untuk pengambilan keputusan.&lt;/p&gt;&lt;/div&gt;
        &lt;div class="pill-card"&gt;&lt;h4&gt;Algoritma &amp;amp; Pemrograman&lt;/h4&gt;&lt;p&gt;Menyusun instruksi logis yang dapat dieksekusi komputer untuk menyelesaikan tugas.&lt;/p&gt;&lt;/div&gt;
        &lt;div class="pill-card"&gt;&lt;h4&gt;Dampak Sosial Informatika&lt;/h4&gt;&lt;p&gt;Pengaruh teknologi terhadap ekonomi, budaya, etika, dan kehidupan sosial masyarakat.&lt;/p&gt;&lt;/div&gt;
      &lt;/div&gt;

      &lt;h3&gt;Perkembangan Teknologi Digital&lt;/h3&gt;
      &lt;p&gt;Perkembangan komputer dan revolusi industri berjalan beriringan, mengubah cara manusia bekerja di setiap era:&lt;/p&gt;
      &lt;div class="timeline"&gt;
        &lt;div class="ev"&gt;&lt;div class="era"&gt;1780-an — Revolusi Industri 1.0&lt;/div&gt;&lt;h4&gt;Mekanisasi &amp;amp; Mesin Uap&lt;/h4&gt;&lt;p&gt;Tenaga manusia digantikan mesin mekanis untuk produksi massal.&lt;/p&gt;&lt;/div&gt;
        &lt;div class="ev"&gt;&lt;div class="era"&gt;1870-an — Revolusi Industri 2.0&lt;/div&gt;&lt;h4&gt;Listrik &amp;amp; Produksi Massal&lt;/h4&gt;&lt;p&gt;Lini produksi (assembly line) dan tenaga listrik mempercepat industri.&lt;/p&gt;&lt;/div&gt;
        &lt;div class="ev"&gt;&lt;div class="era"&gt;1970-an — Revolusi Industri 3.0&lt;/div&gt;&lt;h4&gt;Komputer &amp;amp; Otomasi&lt;/h4&gt;&lt;p&gt;Komputer, elektronik, dan internet mulai mengotomasi proses kerja.&lt;/p&gt;&lt;/div&gt;
        &lt;div class="ev"&gt;&lt;div class="era"&gt;2010-an — Revolusi Industri 4.0&lt;/div&gt;&lt;h4&gt;Konektivitas &amp;amp; Kecerdasan Buatan&lt;/h4&gt;&lt;p&gt;IoT, big data, cloud computing, dan AI mengintegrasikan dunia fisik dan digital.&lt;/p&gt;&lt;/div&gt;
        &lt;div class="ev"&gt;&lt;div class="era"&gt;Saat ini — Menuju 5.0&lt;/div&gt;&lt;h4&gt;Teknologi Berpusat pada Manusia&lt;/h4&gt;&lt;p&gt;Teknologi cerdas dipadukan kembali dengan sentuhan dan nilai kemanusiaan.&lt;/p&gt;&lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="callout"&gt;&lt;b&gt;Contoh nyata di sekitar kita:&lt;/b&gt; aplikasi ojek daring memakai algoritma pencocokan rute, sekolah memakai sistem informasi akademik, rumah sakit memakai rekam medis elektronik, petani memakai sensor IoT untuk memantau lahan — semua ini adalah wujud nyata Informatika.&lt;/div&gt;
    &lt;/section&gt;

    &lt;!-- ================= TOPIK 2 ================= --&gt;
    &lt;section class="topic topic-2" id="materi-2"&gt;
      &lt;div class="eyebrow"&gt;&lt;span class="tag"&gt;JP 2 · 45 menit&lt;/span&gt; 02 — Budaya Kerja Digital&lt;/div&gt;
      &lt;h2&gt;Bekerja dengan Cara Baru di Dunia yang Terhubung&lt;/h2&gt;
      &lt;p&gt;&lt;strong&gt;Budaya kerja digital&lt;/strong&gt; adalah pola pikir, sikap, dan kebiasaan kerja yang terbentuk karena teknologi mengubah cara kita berkolaborasi, berkomunikasi, dan menghasilkan karya. Budaya ini tidak menggantikan etos kerja lama, tetapi menambahkan lapisan baru: kolaboratif, adaptif, dan berbasis data.&lt;/p&gt;

      &lt;h3&gt;Karakteristik Utama Budaya Kerja Digital&lt;/h3&gt;
      &lt;div class="subgrid"&gt;
        &lt;div class="pill-card"&gt;&lt;h4&gt;Kolaborasi Daring&lt;/h4&gt;&lt;p&gt;Bekerja bersama lewat cloud (Google Workspace, Microsoft 365) tanpa harus berada di ruang yang sama.&lt;/p&gt;&lt;/div&gt;
        &lt;div class="pill-card"&gt;&lt;h4&gt;Fleksibilitas Kerja&lt;/h4&gt;&lt;p&gt;Pola kerja jarak jauh (remote) dan hybrid semakin umum lintas industri.&lt;/p&gt;&lt;/div&gt;
        &lt;div class="pill-card"&gt;&lt;h4&gt;Berbasis Data&lt;/h4&gt;&lt;p&gt;Keputusan diambil berdasarkan data dan bukti, bukan sekadar asumsi.&lt;/p&gt;&lt;/div&gt;
        &lt;div class="pill-card"&gt;&lt;h4&gt;Pembelajaran Berkelanjutan&lt;/h4&gt;&lt;p&gt;Teknologi cepat berubah, sehingga belajar hal baru menjadi kebiasaan, bukan pengecualian.&lt;/p&gt;&lt;/div&gt;
        &lt;div class="pill-card"&gt;&lt;h4&gt;Budaya Paperless&lt;/h4&gt;&lt;p&gt;Dokumen dan arsip beralih ke bentuk digital untuk efisiensi dan keberlanjutan.&lt;/p&gt;&lt;/div&gt;
        &lt;div class="pill-card"&gt;&lt;h4&gt;Berbagi Pengetahuan&lt;/h4&gt;&lt;p&gt;Dokumentasi kerja dan wawasan dibagikan terbuka lewat wiki, forum, atau grup tim.&lt;/p&gt;&lt;/div&gt;
      &lt;/div&gt;

      &lt;h3&gt;Soft Skill yang Dibutuhkan&lt;/h3&gt;
      &lt;table&gt;
        &lt;tr&gt;&lt;th&gt;Kompetensi&lt;/th&gt;&lt;th&gt;Contoh Penerapan&lt;/th&gt;&lt;/tr&gt;
        &lt;tr&gt;&lt;td&gt;Komunikasi digital&lt;/td&gt;&lt;td&gt;Menulis pesan kerja yang jelas dan sopan di email, chat, atau video call.&lt;/td&gt;&lt;/tr&gt;
        &lt;tr&gt;&lt;td&gt;Manajemen waktu&lt;/td&gt;&lt;td&gt;Mengatur tenggat kerja menggunakan aplikasi seperti Trello atau Google Calendar.&lt;/td&gt;&lt;/tr&gt;
        &lt;tr&gt;&lt;td&gt;Kolaborasi tim&lt;/td&gt;&lt;td&gt;Mengedit dokumen bersama secara real-time tanpa tumpang tindih pekerjaan.&lt;/td&gt;&lt;/tr&gt;
        &lt;tr&gt;&lt;td&gt;Berpikir kritis &amp;amp; kreatif&lt;/td&gt;&lt;td&gt;Mengevaluasi informasi digital sebelum menggunakannya untuk mengambil keputusan.&lt;/td&gt;&lt;/tr&gt;
        &lt;tr&gt;&lt;td&gt;Adaptasi teknologi baru&lt;/td&gt;&lt;td&gt;Cepat mempelajari aplikasi atau alat kerja yang baru diperkenalkan.&lt;/td&gt;&lt;/tr&gt;
      &lt;/table&gt;

      &lt;div class="callout"&gt;&lt;b&gt;Nilai profesional yang tetap relevan:&lt;/b&gt; disiplin terhadap tenggat waktu digital, tanggung jawab menjaga data yang dikelola, serta transparansi proses kerja — nilai-nilai lama yang dibungkus cara kerja baru.&lt;/div&gt;
    &lt;/section&gt;

    &lt;!-- ================= TOPIK 3 ================= --&gt;
    &lt;section class="topic topic-3" id="materi-3"&gt;
      &lt;div class="eyebrow"&gt;&lt;span class="tag"&gt;JP 3 · 45 menit&lt;/span&gt; 03 — Etika Digital, HAKI &amp;amp; Keamanan&lt;/div&gt;
      &lt;h2&gt;Aturan Main di Dunia Digital&lt;/h2&gt;
      &lt;p&gt;Semakin besar kekuatan teknologi, semakin besar pula tanggung jawab menggunakannya. Bagian ini membahas tiga pilar: &lt;strong&gt;etika digital&lt;/strong&gt; (bagaimana bersikap), &lt;strong&gt;HAKI&lt;/strong&gt; (menghargai karya orang lain), dan &lt;strong&gt;keamanan digital&lt;/strong&gt; (melindungi diri dan data).&lt;/p&gt;

      &lt;h3&gt;Etika Digital (Netiket)&lt;/h3&gt;
      &lt;ul&gt;
        &lt;li&gt;Bersikap sopan dan menghargai perbedaan pendapat saat berinteraksi daring.&lt;/li&gt;
        &lt;li&gt;Tidak menyebarkan ujaran kebencian, perundungan siber (cyberbullying), atau konten SARA.&lt;/li&gt;
        &lt;li&gt;Memeriksa kebenaran informasi sebelum membagikannya, untuk mencegah penyebaran hoaks.&lt;/li&gt;
        &lt;li&gt;Menyadari bahwa jejak digital (digital footprint) bersifat permanen dan dapat memengaruhi reputasi di masa depan.&lt;/li&gt;
      &lt;/ul&gt;

      &lt;h3&gt;Hak Kekayaan Intelektual (HAKI)&lt;/h3&gt;
      &lt;p&gt;HAKI melindungi hasil karya cipta seseorang — termasuk perangkat lunak, tulisan, gambar, musik, dan desain — dari penggunaan tanpa izin. Beberapa jenis lisensi perangkat lunak yang perlu dikenali:&lt;/p&gt;
      &lt;table&gt;
        &lt;tr&gt;&lt;th&gt;Jenis Lisensi&lt;/th&gt;&lt;th&gt;Penjelasan&lt;/th&gt;&lt;/tr&gt;
        &lt;tr&gt;&lt;td&gt;Proprietary (berbayar)&lt;/td&gt;&lt;td&gt;Kode sumber tertutup, penggunaan diatur ketat oleh pemilik, contoh: Microsoft Office.&lt;/td&gt;&lt;/tr&gt;
        &lt;tr&gt;&lt;td&gt;Freeware&lt;/td&gt;&lt;td&gt;Gratis digunakan, tetapi kode sumber tetap tertutup dan hak cipta melekat pada pembuat.&lt;/td&gt;&lt;/tr&gt;
        &lt;tr&gt;&lt;td&gt;Shareware&lt;/td&gt;&lt;td&gt;Boleh dicoba gratis dalam batas waktu/fitur tertentu sebelum harus membeli lisensi penuh.&lt;/td&gt;&lt;/tr&gt;
        &lt;tr&gt;&lt;td&gt;Open Source&lt;/td&gt;&lt;td&gt;Kode sumber terbuka dan boleh dimodifikasi, dengan syarat mengikuti ketentuan lisensinya, contoh: Linux.&lt;/td&gt;&lt;/tr&gt;
      &lt;/table&gt;
      &lt;p&gt;Dalam konteks tugas sekolah, &lt;strong&gt;plagiarisme&lt;/strong&gt; — menyalin karya orang lain tanpa mencantumkan sumber — adalah pelanggaran HAKI. Kebiasaan baik: selalu mencantumkan sumber referensi dan memahami lisensi &lt;em&gt;Creative Commons&lt;/em&gt; saat menggunakan gambar atau materi dari internet.&lt;/p&gt;

      &lt;h3&gt;Keamanan Digital&lt;/h3&gt;
      &lt;div class="subgrid"&gt;
        &lt;div class="pill-card"&gt;&lt;h4&gt;Kata sandi kuat&lt;/h4&gt;&lt;p&gt;Kombinasi huruf, angka, simbol, dan berbeda untuk tiap akun.&lt;/p&gt;&lt;/div&gt;
        &lt;div class="pill-card"&gt;&lt;h4&gt;Autentikasi dua faktor (2FA)&lt;/h4&gt;&lt;p&gt;Lapisan keamanan tambahan selain kata sandi, misalnya kode OTP.&lt;/p&gt;&lt;/div&gt;
        &lt;div class="pill-card"&gt;&lt;h4&gt;Waspada phishing&lt;/h4&gt;&lt;p&gt;Tidak sembarangan mengklik tautan atau memberi data pribadi ke sumber tak dikenal.&lt;/p&gt;&lt;/div&gt;
        &lt;div class="pill-card"&gt;&lt;h4&gt;Cadangkan data (backup)&lt;/h4&gt;&lt;p&gt;Menyimpan salinan data penting untuk berjaga dari kehilangan atau serangan siber.&lt;/p&gt;&lt;/div&gt;
      &lt;/div&gt;
    &lt;/section&gt;

    &lt;!-- ================= TOPIK 4 ================= --&gt;
    &lt;section class="topic topic-4" id="materi-4"&gt;
      &lt;div class="eyebrow"&gt;&lt;span class="tag"&gt;JP 4 · 45 menit&lt;/span&gt; 04 — Profesi Teknologi Informasi&lt;/div&gt;
      &lt;h2&gt;Ke Mana Semua Ini Bisa Membawamu?&lt;/h2&gt;
      &lt;p&gt;Industri teknologi informasi menawarkan ragam jalur karier yang terus berkembang. Setiap profesi menekankan kombinasi berbeda antara kemampuan teknis (&lt;em&gt;hard skill&lt;/em&gt;) dan kemampuan bekerja sama (&lt;em&gt;soft skill&lt;/em&gt;) yang sudah dibahas di JP 2.&lt;/p&gt;

      &lt;table&gt;
        &lt;tr&gt;&lt;th&gt;Profesi&lt;/th&gt;&lt;th&gt;Fokus Pekerjaan&lt;/th&gt;&lt;th&gt;Kompetensi Kunci&lt;/th&gt;&lt;/tr&gt;
        &lt;tr&gt;&lt;td&gt;Software / Web Developer&lt;/td&gt;&lt;td&gt;Membangun aplikasi atau situs web.&lt;/td&gt;&lt;td&gt;Logika pemrograman, bahasa pemrograman&lt;/td&gt;&lt;/tr&gt;
        &lt;tr&gt;&lt;td&gt;Mobile App Developer&lt;/td&gt;&lt;td&gt;Membangun aplikasi untuk perangkat seluler.&lt;/td&gt;&lt;td&gt;Pemrograman mobile, desain UI&lt;/td&gt;&lt;/tr&gt;
        &lt;tr&gt;&lt;td&gt;Network Engineer / Administrator&lt;/td&gt;&lt;td&gt;Merancang dan menjaga jaringan komputer.&lt;/td&gt;&lt;td&gt;Pemahaman protokol jaringan, troubleshooting&lt;/td&gt;&lt;/tr&gt;
        &lt;tr&gt;&lt;td&gt;Database Administrator&lt;/td&gt;&lt;td&gt;Mengelola dan mengamankan basis data organisasi.&lt;/td&gt;&lt;td&gt;SQL, manajemen data&lt;/td&gt;&lt;/tr&gt;
        &lt;tr&gt;&lt;td&gt;Data Analyst / Data Scientist&lt;/td&gt;&lt;td&gt;Mengolah data menjadi wawasan untuk keputusan bisnis.&lt;/td&gt;&lt;td&gt;Statistik, visualisasi data&lt;/td&gt;&lt;/tr&gt;
        &lt;tr&gt;&lt;td&gt;UI/UX Designer&lt;/td&gt;&lt;td&gt;Merancang tampilan dan pengalaman pengguna produk digital.&lt;/td&gt;&lt;td&gt;Desain, empati pengguna&lt;/td&gt;&lt;/tr&gt;
        &lt;tr&gt;&lt;td&gt;Cyber Security Specialist&lt;/td&gt;&lt;td&gt;Melindungi sistem dari ancaman dan serangan siber.&lt;/td&gt;&lt;td&gt;Analisis risiko, keamanan jaringan&lt;/td&gt;&lt;/tr&gt;
        &lt;tr&gt;&lt;td&gt;IT Support / Helpdesk&lt;/td&gt;&lt;td&gt;Membantu pengguna mengatasi masalah perangkat dan sistem.&lt;/td&gt;&lt;td&gt;Troubleshooting, komunikasi&lt;/td&gt;&lt;/tr&gt;
        &lt;tr&gt;&lt;td&gt;Cloud Engineer&lt;/td&gt;&lt;td&gt;Mengelola infrastruktur dan layanan berbasis cloud.&lt;/td&gt;&lt;td&gt;Sistem cloud, otomasi&lt;/td&gt;&lt;/tr&gt;
        &lt;tr&gt;&lt;td&gt;Game Developer&lt;/td&gt;&lt;td&gt;Merancang dan membangun permainan digital.&lt;/td&gt;&lt;td&gt;Pemrograman, desain kreatif&lt;/td&gt;&lt;/tr&gt;
      &lt;/table&gt;

      &lt;h3&gt;Jalur Menuju Profesi TI&lt;/h3&gt;
      &lt;ul &gt;
        &lt;li&gt;Pendidikan formal: SMK jurusan RPL/TKJ, D3/D4/S1 bidang Informatika atau Ilmu Komputer.&lt;/li&gt;
        &lt;li&gt;Sertifikasi industri: misalnya sertifikasi jaringan, cloud, atau keamanan siber dari penyedia teknologi global.&lt;/li&gt;
        &lt;li&gt;Jalur mandiri: bootcamp, kursus daring, dan portofolio proyek pribadi.&lt;/li&gt;
        &lt;li&gt;Peluang kerja lintas batas: banyak profesi TI kini bisa dikerjakan secara remote untuk perusahaan di berbagai negara.&lt;/li&gt;
      &lt;/ul&gt;
    &lt;/section&gt;

    &lt;!-- ============ TUGAS KELOMPOK ============ --&gt;
    &lt;section class="task task-group" id="tugas-kelompok"&gt;
      &lt;div class="eyebrow"&gt;&lt;span class="tag" style="border-color: #B9C4E0;"&gt;Tugas Kelompok&lt;/span&gt; Penerapan JP 1–4&lt;/div&gt;
      &lt;h2&gt;Investigasi Profesi &amp;amp; Budaya Kerja Digital&lt;/h2&gt;
      &lt;p&gt;Bekerja dalam kelompok untuk menghubungkan keempat materi hari ini: memilih satu profesi TI, lalu menelusuri ruang lingkup keilmuannya, budaya kerjanya, serta isu etika yang mungkin dihadapinya.&lt;/p&gt;

      &lt;div class="steps"&gt;
        &lt;div class="step"&gt;&lt;div&gt;&lt;strong&gt;Bentuk kelompok&lt;/strong&gt;4–5 murid per kelompok, tentukan pembagian peran (peneliti, penulis, desainer, juru bicara).&lt;/div&gt;&lt;/div&gt;
        &lt;div class="step"&gt;&lt;div&gt;&lt;strong&gt;Pilih satu profesi TI&lt;/strong&gt;Contoh: Web Developer, Data Analyst, Cyber Security Specialist, UI/UX Designer, Network Engineer, dsb — satu profesi per kelompok, tidak boleh sama dengan kelompok lain.&lt;/div&gt;&lt;/div&gt;
        &lt;div class="step"&gt;&lt;div&gt;&lt;strong&gt;Lakukan riset singkat&lt;/strong&gt;Cari informasi tentang deskripsi pekerjaan, bidang Informatika yang mendasarinya, kompetensi yang dibutuhkan, dan jenjang kariernya.&lt;/div&gt;&lt;/div&gt;
        &lt;div class="step"&gt;&lt;div&gt;&lt;strong&gt;Kaitkan dengan budaya kerja&lt;/strong&gt;Jelaskan bagaimana profesi tersebut menerapkan budaya kerja digital (kolaborasi, fleksibilitas, dsb.) dalam praktiknya.&lt;/div&gt;&lt;/div&gt;
        &lt;div class="step"&gt;&lt;div&gt;&lt;strong&gt;Identifikasi isu etika&lt;/strong&gt;Sebutkan satu isu etika, HAKI, atau keamanan digital yang relevan dengan profesi tersebut, dan bagaimana idealnya disikapi.&lt;/div&gt;&lt;/div&gt;
        &lt;div class="step"&gt;&lt;div&gt;&lt;strong&gt;Susun &amp;amp; presentasikan&lt;/strong&gt;Tuangkan hasil riset ke dalam poster atau slide presentasi sederhana, lalu presentasikan di depan kelas (5–7 menit per kelompok).&lt;/div&gt;&lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="deliverable-row"&gt;
        &lt;span&gt;Produk: Poster / Infografis / Slide&lt;/span&gt;
        &lt;span&gt;Waktu pengerjaan: ± 60 menit&lt;/span&gt;
        &lt;span&gt;Presentasi: 5–7 menit/kelompok&lt;/span&gt;
      &lt;/div&gt;

      &lt;table class="rubric"&gt;
        &lt;tr&gt;&lt;th&gt;Aspek Penilaian&lt;/th&gt;&lt;th&gt;Indikator&lt;/th&gt;&lt;/tr&gt;
        &lt;tr&gt;&lt;td&gt;Pemahaman konsep&lt;/td&gt;&lt;td&gt;Kaitan antara profesi, bidang Informatika, dan budaya kerja dijelaskan dengan tepat.&lt;/td&gt;&lt;/tr&gt;
        &lt;tr&gt;&lt;td&gt;Kelengkapan isi&lt;/td&gt;&lt;td&gt;Deskripsi kerja, kompetensi, jenjang karier, dan isu etika tercakup lengkap.&lt;/td&gt;&lt;/tr&gt;
        &lt;tr&gt;&lt;td&gt;Kerja sama tim&lt;/td&gt;&lt;td&gt;Pembagian peran jelas dan seluruh anggota berkontribusi.&lt;/td&gt;&lt;/tr&gt;
        &lt;tr&gt;&lt;td&gt;Presentasi&lt;/td&gt;&lt;td&gt;Penyampaian jelas, percaya diri, dan mampu menjawab pertanyaan.&lt;/td&gt;&lt;/tr&gt;
      &lt;/table&gt;
    &lt;/section&gt;

    &lt;!-- ============ TUGAS MANDIRI / KESIMPULAN ============ --&gt;
    &lt;section class="task task-solo" id="tugas-mandiri"&gt;
      &lt;div class="eyebrow"&gt;Tugas Mandiri · Penutup&lt;/div&gt;
      &lt;h2&gt;Tulis Kesimpulan Ringkas di Buku Catatan&lt;/h2&gt;
      &lt;p&gt;Sebagai penutup pembelajaran, setiap murid menuliskan satu kesimpulan ringkas secara mandiri di buku catatan sebagai rangkuman pemahaman pribadi terhadap materi hari ini.&lt;/p&gt;
      &lt;div class="steps"&gt;
        &lt;div class="step"&gt;&lt;div&gt;&lt;strong&gt;Tulis dengan bahasa sendiri&lt;/strong&gt;Bukan menyalin ulang dari modul, tetapi merangkum apa yang benar-benar dipahami.&lt;/div&gt;&lt;/div&gt;
        &lt;div class="step"&gt;&lt;div&gt;&lt;strong&gt;Cakup keempat topik&lt;/strong&gt;Singgung ruang lingkup Informatika, budaya kerja digital, etika/HAKI/keamanan, dan profesi TI dalam satu rangkaian kesimpulan.&lt;/div&gt;&lt;/div&gt;
        &lt;div class="step"&gt;&lt;div&gt;&lt;strong&gt;Minimal 150 kata&lt;/strong&gt;Ditulis dalam 1 paragraf utuh di buku catatan, rapi dan mudah dibaca.&lt;/div&gt;&lt;/div&gt;
        &lt;div class="step"&gt;&lt;div&gt;&lt;strong&gt;Kumpulkan&lt;/strong&gt;Difoto dan dikirim ke guru, atau diperlihatkan langsung pada pertemuan berikutnya.&lt;/div&gt;&lt;/div&gt;
      &lt;/div&gt;
    &lt;/section&gt;

    &lt;!-- ============ REFLEKSI ============ --&gt;
    &lt;section class="card" id="refleksi"&gt;
      &lt;div class="eyebrow"&gt;Refleksi Cepat&lt;/div&gt;
      &lt;h3 style="margin-top: 0;"&gt;Sebelum menutup pertemuan, tanyakan pada diri sendiri:&lt;/h3&gt;
      &lt;ul &gt;
        &lt;li&gt;Bidang Informatika mana yang paling menarik perhatianku, dan mengapa?&lt;/li&gt;
        &lt;li&gt;Kebiasaan kerja digital apa yang sudah kulakukan, dan apa yang perlu kulatih?&lt;/li&gt;
        &lt;li&gt;Satu praktik keamanan digital apa yang akan mulai kuterapkan mulai hari ini?&lt;/li&gt;
        &lt;li&gt;Profesi TI mana yang ingin kuketahui lebih dalam?&lt;/li&gt;
      &lt;/ul&gt;
    &lt;/section&gt;

  &lt;/main&gt;

  &lt;footer&gt;Modul Informatika Kelas X SMK · Pertemuan 4 JP · Elemen Dampak Sosial Informatika&lt;/footer&gt;
&lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;</description><link>http://kitab-investasi.blogspot.com/2026/07/pengantar-informatika-budaya-kerja.html</link><thr:total>0</thr:total><author>nof_rizal07@yahoo.co.id (abang_cool)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-9000860041661554971.post-8908856282371387948</guid><pubDate>Fri, 17 Jul 2026 03:50:29 +0000</pubDate><atom:updated>2026-07-17T10:50:29.936+07:00</atom:updated><title>MATERI DAN TUJUAN PEMBELAJARAN Informatika Kelas X SMK Semester 1 2026-2027</title><description>&lt;h2 style="text-align: justify;"&gt;&amp;nbsp;Informatika Kelas X SMK Semester 1&lt;/h2&gt;
&lt;p data-end="374" data-start="351" style="text-align: justify;"&gt;&lt;strong data-end="374" data-start="351"&gt;18 Pertemuan × 4 JP&lt;/strong&gt;&lt;/p&gt;
&lt;div class="TyagGW_tableContainer"&gt;&lt;div class="group TyagGW_tableWrapper flex flex-col-reverse w-fit" tabindex="-1"&gt;&lt;table class="w-fit min-w-(--thread-content-width)" data-end="4713" data-start="376" style="text-align: justify;"&gt;&lt;thead data-end="426" data-start="376"&gt;&lt;tr data-end="426" data-start="376"&gt;&lt;th class="last:pe-10" data-col-size="sm" data-end="388" data-start="376"&gt;Pertemuan&lt;/th&gt;&lt;th class="last:pe-10" data-col-size="md" data-end="403" data-start="388"&gt;Judul Materi&lt;/th&gt;&lt;th class="last:pe-10" data-col-size="xl" data-end="426" data-start="403"&gt;Tujuan Pembelajaran&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody data-end="4713" data-start="478"&gt;&lt;tr data-end="792" data-start="478"&gt;&lt;td data-col-size="sm" data-end="486" data-start="478"&gt;&lt;strong data-end="485" data-start="480"&gt;1&lt;/strong&gt;&lt;/td&gt;&lt;td data-col-size="md" data-end="576" data-start="486"&gt;&lt;strong data-end="575" data-start="488"&gt;Pengantar Informatika, Budaya Kerja Digital, Etika, dan Profesi Teknologi Informasi&lt;/strong&gt;&lt;/td&gt;&lt;td data-col-size="xl" data-end="792" data-start="576"&gt;Peserta didik mampu menjelaskan ruang lingkup Informatika, perkembangan teknologi digital, profesi di bidang TIK, serta menerapkan etika digital, hak kekayaan intelektual, dan keamanan dalam penggunaan teknologi.&lt;/td&gt;&lt;/tr&gt;&lt;tr data-end="1046" data-start="793"&gt;&lt;td data-col-size="sm" data-end="801" data-start="793"&gt;&lt;strong data-end="800" data-start="795"&gt;2&lt;/strong&gt;&lt;/td&gt;&lt;td data-col-size="md" data-end="850" data-start="801"&gt;&lt;strong data-end="849" data-start="803"&gt;Sistem Komputer dan Arsitektur Von Neumann&lt;/strong&gt;&lt;/td&gt;&lt;td data-col-size="xl" data-end="1046" data-start="850"&gt;Peserta didik mampu menjelaskan komponen sistem komputer, model input-proses-output, fungsi perangkat keras, perangkat lunak, brainware, serta hubungan antar komponennya dalam sistem komputer.&lt;/td&gt;&lt;/tr&gt;&lt;tr data-end="1273" data-start="1047"&gt;&lt;td data-col-size="sm" data-end="1055" data-start="1047"&gt;&lt;strong data-end="1054" data-start="1049"&gt;3&lt;/strong&gt;&lt;/td&gt;&lt;td data-col-size="md" data-end="1115" data-start="1055"&gt;&lt;strong data-end="1114" data-start="1057"&gt;Sistem Operasi, Manajemen File, dan Penyimpanan Cloud&lt;/strong&gt;&lt;/td&gt;&lt;td data-col-size="xl" data-end="1273" data-start="1115"&gt;Peserta didik mampu mengelola sistem operasi, file, folder, media penyimpanan, serta memanfaatkan layanan cloud storage untuk mendukung pekerjaan digital.&lt;/td&gt;&lt;/tr&gt;&lt;tr data-end="1531" data-start="1274"&gt;&lt;td data-col-size="sm" data-end="1282" data-start="1274"&gt;&lt;strong data-end="1281" data-start="1276"&gt;4&lt;/strong&gt;&lt;/td&gt;&lt;td data-col-size="md" data-end="1338" data-start="1282"&gt;&lt;strong data-end="1337" data-start="1284"&gt;Jaringan Komputer, Internet, dan Keamanan Digital&lt;/strong&gt;&lt;/td&gt;&lt;td data-col-size="xl" data-end="1531" data-start="1338"&gt;Peserta didik mampu menjelaskan konsep jaringan komputer, konektivitas internet, perangkat jaringan, komunikasi data, serta menerapkan keamanan dasar dan enkripsi dalam penggunaan jaringan.&lt;/td&gt;&lt;/tr&gt;&lt;tr data-end="1758" data-start="1532"&gt;&lt;td data-col-size="sm" data-end="1540" data-start="1532"&gt;&lt;strong data-end="1539" data-start="1534"&gt;5&lt;/strong&gt;&lt;/td&gt;&lt;td data-col-size="md" data-end="1596" data-start="1540"&gt;&lt;strong data-end="1595" data-start="1542"&gt;Pencarian Informasi Digital dan Kolaborasi Daring&lt;/strong&gt;&lt;/td&gt;&lt;td data-col-size="xl" data-end="1758" data-start="1596"&gt;Peserta didik mampu memanfaatkan mesin pencari, peramban, layanan komunikasi digital, dan media kolaborasi daring secara efektif, aman, dan bertanggung jawab.&lt;/td&gt;&lt;/tr&gt;&lt;tr data-end="1989" data-start="1759"&gt;&lt;td data-col-size="sm" data-end="1767" data-start="1759"&gt;&lt;strong data-end="1766" data-start="1761"&gt;6&lt;/strong&gt;&lt;/td&gt;&lt;td data-col-size="md" data-end="1838" data-start="1767"&gt;&lt;strong data-end="1837" data-start="1769"&gt;Pengenalan Aplikasi Pengolah Kata untuk Administrasi Perkantoran&lt;/strong&gt;&lt;/td&gt;&lt;td data-col-size="xl" data-end="1989" data-start="1838"&gt;Peserta didik mampu membuat, mengedit, memformat, dan menyimpan dokumen administrasi menggunakan aplikasi pengolah kata sesuai standar perkantoran.&lt;/td&gt;&lt;/tr&gt;&lt;tr data-end="2234" data-start="1990"&gt;&lt;td data-col-size="sm" data-end="1998" data-start="1990"&gt;&lt;strong data-end="1997" data-start="1992"&gt;7&lt;/strong&gt;&lt;/td&gt;&lt;td data-col-size="md" data-end="2057" data-start="1998"&gt;&lt;strong data-end="2056" data-start="2000"&gt;Fitur Lanjut Pengolah Kata untuk Dokumen Profesional&lt;/strong&gt;&lt;/td&gt;&lt;td data-col-size="xl" data-end="2234" data-start="2057"&gt;Peserta didik mampu menggunakan style, heading, daftar isi otomatis, tabel, gambar, mail merge, referensi, dan fitur otomatis lainnya untuk menghasilkan dokumen profesional.&lt;/td&gt;&lt;/tr&gt;&lt;tr data-end="2450" data-start="2235"&gt;&lt;td data-col-size="sm" data-end="2243" data-start="2235"&gt;&lt;strong data-end="2242" data-start="2237"&gt;8&lt;/strong&gt;&lt;/td&gt;&lt;td data-col-size="md" data-end="2293" data-start="2243"&gt;&lt;strong data-end="2292" data-start="2245"&gt;Integrasi Dokumen dan Otomasi Pengolah Kata&lt;/strong&gt;&lt;/td&gt;&lt;td data-col-size="xl" data-end="2450" data-start="2293"&gt;Peserta didik mampu mengintegrasikan berbagai objek, menggunakan template, formulir, serta fitur otomatis untuk meningkatkan efisiensi pembuatan dokumen.&lt;/td&gt;&lt;/tr&gt;&lt;tr data-end="2630" data-start="2451"&gt;&lt;td data-col-size="sm" data-end="2459" data-start="2451"&gt;&lt;strong data-end="2458" data-start="2453"&gt;9&lt;/strong&gt;&lt;/td&gt;&lt;td data-col-size="md" data-end="2504" data-start="2459"&gt;&lt;strong data-end="2503" data-start="2461"&gt;Ulangan Bab I – Aplikasi Pengolah Kata&lt;/strong&gt;&lt;/td&gt;&lt;td data-col-size="xl" data-end="2630" data-start="2504"&gt;Peserta didik mampu menunjukkan penguasaan kompetensi penggunaan aplikasi pengolah kata melalui asesmen teori dan praktik.&lt;/td&gt;&lt;/tr&gt;&lt;tr data-end="2847" data-start="2631"&gt;&lt;td data-col-size="sm" data-end="2640" data-start="2631"&gt;&lt;strong data-end="2639" data-start="2633"&gt;10&lt;/strong&gt;&lt;/td&gt;&lt;td data-col-size="md" data-end="2695" data-start="2640"&gt;&lt;strong data-end="2694" data-start="2642"&gt;Pengenalan Aplikasi Pengolah Angka (Spreadsheet)&lt;/strong&gt;&lt;/td&gt;&lt;td data-col-size="xl" data-end="2847" data-start="2695"&gt;Peserta didik mampu mengolah data menggunakan format sel, rumus dasar, fungsi matematika, logika, dan statistik sederhana pada aplikasi spreadsheet.&lt;/td&gt;&lt;/tr&gt;&lt;tr data-end="3066" data-start="2848"&gt;&lt;td data-col-size="sm" data-end="2857" data-start="2848"&gt;&lt;strong data-end="2856" data-start="2850"&gt;11&lt;/strong&gt;&lt;/td&gt;&lt;td data-col-size="md" data-end="2906" data-start="2857"&gt;&lt;strong data-end="2905" data-start="2859"&gt;Analisis Data dan Fitur Lanjut Spreadsheet&lt;/strong&gt;&lt;/td&gt;&lt;td data-col-size="xl" data-end="3066" data-start="2906"&gt;Peserta didik mampu menerapkan fungsi lanjutan, lookup, sort, filter, conditional formatting, grafik, dan PivotTable untuk menganalisis data secara efektif.&lt;/td&gt;&lt;/tr&gt;&lt;tr data-end="3277" data-start="3067"&gt;&lt;td data-col-size="sm" data-end="3076" data-start="3067"&gt;&lt;strong data-end="3075" data-start="3069"&gt;12&lt;/strong&gt;&lt;/td&gt;&lt;td data-col-size="md" data-end="3123" data-start="3076"&gt;&lt;strong data-end="3122" data-start="3078"&gt;Ulangan Bab II – Aplikasi Pengolah Angka&lt;/strong&gt;&lt;/td&gt;&lt;td data-col-size="xl" data-end="3277" data-start="3123"&gt;Peserta didik mampu menunjukkan penguasaan kompetensi pengolahan dan analisis data menggunakan aplikasi spreadsheet melalui asesmen teori dan praktik.&lt;/td&gt;&lt;/tr&gt;&lt;tr data-end="3491" data-start="3278"&gt;&lt;td data-col-size="sm" data-end="3287" data-start="3278"&gt;&lt;strong data-end="3286" data-start="3280"&gt;13&lt;/strong&gt;&lt;/td&gt;&lt;td data-col-size="md" data-end="3334" data-start="3287"&gt;&lt;strong data-end="3333" data-start="3289"&gt;Aplikasi Pengolah Presentasi Profesional&lt;/strong&gt;&lt;/td&gt;&lt;td data-col-size="xl" data-end="3491" data-start="3334"&gt;Peserta didik mampu merancang presentasi yang komunikatif menggunakan tema, slide master, multimedia, animasi, transisi, hyperlink, dan fitur kolaborasi.&lt;/td&gt;&lt;/tr&gt;&lt;tr data-end="3735" data-start="3492"&gt;&lt;td data-col-size="sm" data-end="3501" data-start="3492"&gt;&lt;strong data-end="3500" data-start="3494"&gt;14&lt;/strong&gt;&lt;/td&gt;&lt;td data-col-size="md" data-end="3564" data-start="3501"&gt;&lt;strong data-end="3563" data-start="3503"&gt;Integrasi Aplikasi Perkantoran dan Produktivitas Digital&lt;/strong&gt;&lt;/td&gt;&lt;td data-col-size="xl" data-end="3735" data-start="3564"&gt;Peserta didik mampu mengintegrasikan dokumen pengolah kata, spreadsheet, dan presentasi serta memanfaatkan layanan cloud untuk menghasilkan dokumen kerja yang terpadu.&lt;/td&gt;&lt;/tr&gt;&lt;tr data-end="3995" data-start="3736"&gt;&lt;td data-col-size="sm" data-end="3745" data-start="3736"&gt;&lt;strong data-end="3744" data-start="3738"&gt;15&lt;/strong&gt;&lt;/td&gt;&lt;td data-col-size="md" data-end="3801" data-start="3745"&gt;&lt;strong data-end="3800" data-start="3747"&gt;Berpikir Komputasional dalam Penyelesaian Masalah&lt;/strong&gt;&lt;/td&gt;&lt;td data-col-size="xl" data-end="3995" data-start="3801"&gt;Peserta didik mampu menerapkan dekomposisi, pengenalan pola, abstraksi, dan algoritma untuk menyelesaikan permasalahan yang melibatkan data dalam konteks pekerjaan dan kehidupan sehari-hari.&lt;/td&gt;&lt;/tr&gt;&lt;tr data-end="4204" data-start="3996"&gt;&lt;td data-col-size="sm" data-end="4005" data-start="3996"&gt;&lt;strong data-end="4004" data-start="3998"&gt;16&lt;/strong&gt;&lt;/td&gt;&lt;td data-col-size="md" data-end="4064" data-start="4005"&gt;&lt;strong data-end="4063" data-start="4007"&gt;Algoritma Searching dan Sorting pada Pengolahan Data&lt;/strong&gt;&lt;/td&gt;&lt;td data-col-size="xl" data-end="4204" data-start="4064"&gt;Peserta didik mampu menerapkan algoritma pencarian dan pengurutan data sebagai dasar pengolahan informasi secara sistematis dan efisien.&lt;/td&gt;&lt;/tr&gt;&lt;tr data-end="4477" data-start="4205"&gt;&lt;td data-col-size="sm" data-end="4214" data-start="4205"&gt;&lt;strong data-end="4213" data-start="4207"&gt;17&lt;/strong&gt;&lt;/td&gt;&lt;td data-col-size="md" data-end="4261" data-start="4214"&gt;&lt;strong data-end="4260" data-start="4216"&gt;Proyek Terintegrasi Aplikasi Perkantoran&lt;/strong&gt;&lt;/td&gt;&lt;td data-col-size="xl" data-end="4477" data-start="4261"&gt;Peserta didik mampu menghasilkan proyek administrasi digital berupa laporan, analisis data, dan presentasi dengan mengintegrasikan aplikasi pengolah kata, spreadsheet, dan presentasi sesuai kebutuhan dunia kerja.&lt;/td&gt;&lt;/tr&gt;&lt;tr data-end="4713" data-start="4478"&gt;&lt;td data-col-size="sm" data-end="4487" data-start="4478"&gt;&lt;strong data-end="4486" data-start="4480"&gt;18&lt;/strong&gt;&lt;/td&gt;&lt;td data-col-size="md" data-end="4546" data-start="4487"&gt;&lt;strong data-end="4545" data-start="4489"&gt;Asesmen Sumatif Akhir Semester dan Presentasi Proyek&lt;/strong&gt;&lt;/td&gt;&lt;td data-col-size="xl" data-end="4713" data-start="4546"&gt;Peserta didik mampu mempresentasikan hasil proyek, menyusun portofolio digital, serta menunjukkan penguasaan kompetensi semester melalui asesmen praktik dan teori.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h3 data-end="4732" data-section-id="1dfkpdp" data-start="4715" style="text-align: justify;"&gt;Pembagian Bab&lt;/h3&gt;
&lt;ul data-end="5180" data-start="4734"&gt;
&lt;li data-end="4838" data-section-id="h0ktz3" data-start="4734" style="text-align: justify;"&gt;
&lt;strong data-end="4746" data-start="4736"&gt;Bab I:&lt;/strong&gt; Konsep Dasar Informatika, Sistem Komputer, Jaringan, dan Kolaborasi Digital (Pertemuan 1–5)
&lt;/li&gt;
&lt;li data-end="4891" data-section-id="198n676" data-start="4839" style="text-align: justify;"&gt;
&lt;strong data-end="4852" data-start="4841"&gt;Bab II:&lt;/strong&gt; Aplikasi Pengolah Kata (Pertemuan 6–9)
&lt;/li&gt;
&lt;li data-end="4960" data-section-id="1344r2i" data-start="4892" style="text-align: justify;"&gt;
&lt;strong data-end="4906" data-start="4894"&gt;Bab III:&lt;/strong&gt; Aplikasi Pengolah Angka/Spreadsheet (Pertemuan 10–12)
&lt;/li&gt;
&lt;li data-end="5047" data-section-id="1hhpm7y" data-start="4961" style="text-align: justify;"&gt;
&lt;strong data-end="4974" data-start="4963"&gt;Bab IV:&lt;/strong&gt; Aplikasi Presentasi dan Integrasi Aplikasi Perkantoran (Pertemuan 13–14)
&lt;/li&gt;
&lt;li data-end="5101" data-section-id="1rl7t2e" data-start="5048" style="text-align: justify;"&gt;
&lt;strong data-end="5060" data-start="5050"&gt;Bab V:&lt;/strong&gt; Berpikir Komputasional (Pertemuan 15–16)
&lt;/li&gt;
&lt;li data-end="5180" data-section-id="10ph39r" data-start="5102" style="text-align: justify;"&gt;
&lt;strong data-end="5115" data-start="5104"&gt;Bab VI:&lt;/strong&gt; Proyek Terintegrasi dan Asesmen Akhir Semester (Pertemuan 17–18)
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end="5589" data-is-last-node="" data-is-only-node="" data-start="5182" style="text-align: justify;"&gt;Struktur ini lebih sesuai untuk pembelajaran SMK karena sekitar &lt;strong data-end="5398" data-start="5246"&gt;65–70% waktu pembelajaran difokuskan pada kompetensi aplikasi perkantoran (Word, Spreadsheet, Presentasi, integrasi dokumen, dan kolaborasi digital)&lt;/strong&gt;, sementara konsep dasar Informatika, sistem komputer, jaringan, dan berpikir komputasional tetap diberikan sebagai fondasi yang mendukung keterampilan kerja di lingkungan perkantoran modern.&lt;/p&gt;</description><link>http://kitab-investasi.blogspot.com/2026/07/materi-dan-tujuan-pembelajaran.html</link><thr:total>0</thr:total><author>nof_rizal07@yahoo.co.id (abang_cool)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-9000860041661554971.post-8510606503991406358</guid><pubDate>Thu, 16 Jul 2026 02:22:09 +0000</pubDate><atom:updated>2026-07-16T09:22:09.716+07:00</atom:updated><title> MATERI PEMBELAJARAN BAHASA INDONESIA KELAS XI SMK SEMESTER 1</title><description>&lt;h3 style="text-align: left;"&gt;MATERI PEMBELAJARAN BAHASA INDONESIA KELAS XI SMK SEMESTER 1&lt;/h3&gt;&lt;p class="MsoNormal"&gt;&lt;b&gt;Fase F — Kurikulum Merdeka&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;b&gt;Alokasi: 18 Pertemuan × 3 JP&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/p&gt;

&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;

&lt;hr align="center" size="1" width="100%" /&gt;

&lt;/div&gt;

&lt;p class="MsoNormal"&gt;&lt;b&gt;A. DISTRIBUSI PERTEMUAN (TANPA KOLOM BAB)&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/p&gt;

&lt;table border="0" cellpadding="0" cellspacing="0" class="MsoNormalTable" style="border-collapse: collapse; mso-yfti-tbllook: 1184; width: 652px;"&gt;
 &lt;thead&gt;
  &lt;tr style="mso-yfti-firstrow: yes; mso-yfti-irow: 0;"&gt;
   &lt;td style="padding: 7.5pt 12.0pt 7.5pt 0cm; width: 65.95pt;" width="88"&gt;
   &lt;p class="MsoNormal"&gt;Pertemuan&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;
   &lt;/td&gt;
   &lt;td style="padding: 7.5pt 12.0pt 7.5pt 12.0pt; width: 160.85pt;" width="214"&gt;
   &lt;p class="MsoNormal"&gt;Topik/Materi Pembelajaran&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;
   &lt;/td&gt;
   &lt;td style="padding: 7.5pt 12.0pt 7.5pt 12.0pt; width: 262.25pt;" width="350"&gt;
   &lt;p class="MsoNormal"&gt;Tujuan Pembelajaran&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;
   &lt;/td&gt;
  &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;&lt;tr style="mso-yfti-irow: 1;"&gt;
  &lt;td style="padding: 7.5pt 12.0pt 7.5pt 0cm; width: 65.95pt;" width="88"&gt;
  &lt;p class="MsoNormal"&gt;&lt;b&gt;1&lt;/b&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 7.5pt 12.0pt 7.5pt 12.0pt; width: 160.85pt;" width="214"&gt;
  &lt;p class="MsoNormal"&gt;Evaluasi Informasi dalam Teks Prosedur&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 7.5pt 0cm 7.5pt 12.0pt; width: 262.25pt;" width="350"&gt;
  &lt;p class="MsoNormal"&gt;Peserta didik mampu mengevaluasi informasi yang disajikan
  dalam teks prosedur secara kritis dan logis.&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;
  &lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr style="mso-yfti-irow: 2;"&gt;
  &lt;td style="padding: 7.5pt 12.0pt 7.5pt 0cm; width: 65.95pt;" width="88"&gt;
  &lt;p class="MsoNormal"&gt;&lt;b&gt;2&lt;/b&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 7.5pt 12.0pt 7.5pt 12.0pt; width: 160.85pt;" width="214"&gt;
  &lt;p class="MsoNormal"&gt;Membandingkan Teks Prosedur dengan Teks Lain&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 7.5pt 0cm 7.5pt 12.0pt; width: 262.25pt;" width="350"&gt;
  &lt;p class="MsoNormal"&gt;Peserta didik mampu membandingkan teks prosedur dengan
  teks lainnya yang mendukung serta menemukan persamaan dan perbedaannya.&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;
  &lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr style="mso-yfti-irow: 3;"&gt;
  &lt;td style="padding: 7.5pt 12.0pt 7.5pt 0cm; width: 65.95pt;" width="88"&gt;
  &lt;p class="MsoNormal"&gt;&lt;b&gt;3&lt;/b&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 7.5pt 12.0pt 7.5pt 12.0pt; width: 160.85pt;" width="214"&gt;
  &lt;p class="MsoNormal"&gt;Kaidah Kebahasaan Teks Prosedur (Bagian 1)&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 7.5pt 0cm 7.5pt 12.0pt; width: 262.25pt;" width="350"&gt;
  &lt;p class="MsoNormal"&gt;Peserta didik mampu mengidentifikasi ciri-ciri kebahasaan
  teks prosedur, seperti kalimat imperatif, deklaratif, persuasif, dan
  konjungsi temporal.&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;
  &lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr style="mso-yfti-irow: 4;"&gt;
  &lt;td style="padding: 7.5pt 12.0pt 7.5pt 0cm; width: 65.95pt;" width="88"&gt;
  &lt;p class="MsoNormal"&gt;&lt;b&gt;4&lt;/b&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 7.5pt 12.0pt 7.5pt 12.0pt; width: 160.85pt;" width="214"&gt;
  &lt;p class="MsoNormal"&gt;Kaidah Kebahasaan Teks Prosedur (Bagian 2) &amp;amp; Menyusun
  Teks Prosedur&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 7.5pt 0cm 7.5pt 12.0pt; width: 262.25pt;" width="350"&gt;
  &lt;p class="MsoNormal"&gt;Peserta didik mampu menganalisis penggunaan kalimat
  perintah, kata teknis, dan penanda wacana, serta menyusun teks prosedur
  secara logis dan sistematis.&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;
  &lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr style="mso-yfti-irow: 5;"&gt;
  &lt;td style="padding: 7.5pt 12.0pt 7.5pt 0cm; width: 65.95pt;" width="88"&gt;
  &lt;p class="MsoNormal"&gt;&lt;b&gt;5&lt;/b&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 7.5pt 12.0pt 7.5pt 12.0pt; width: 160.85pt;" width="214"&gt;
  &lt;p class="MsoNormal"&gt;Menyajikan Teks Prosedur &amp;amp; Rangkuman Materi Petunjuk
  Kerja&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 7.5pt 0cm 7.5pt 12.0pt; width: 262.25pt;" width="350"&gt;
  &lt;p class="MsoNormal"&gt;Peserta didik mampu menyajikan teks prosedur yang telah
  dibuat secara lisan/tulisan dan mereview seluruh materi pokok bahasan
  petunjuk kerja.&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;
  &lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr style="mso-yfti-irow: 6;"&gt;
  &lt;td style="padding: 7.5pt 12.0pt 7.5pt 0cm; width: 65.95pt;" width="88"&gt;
  &lt;p class="MsoNormal"&gt;&lt;b&gt;6&lt;/b&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 7.5pt 12.0pt 7.5pt 12.0pt; width: 160.85pt;" width="214"&gt;
  &lt;p class="MsoNormal"&gt;Latihan Soal &amp;amp; Soal Tipe AKM (Pokok Bahasan Petunjuk
  Kerja)&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 7.5pt 0cm 7.5pt 12.0pt; width: 262.25pt;" width="350"&gt;
  &lt;p class="MsoNormal"&gt;Peserta didik mampu mengerjakan soal-soal latihan dan soal
  tipe AKM dengan tepat serta mengidentifikasi kelemahan pemahaman.&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;
  &lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr style="mso-yfti-irow: 7;"&gt;
  &lt;td style="padding: 7.5pt 12.0pt 7.5pt 0cm; width: 65.95pt;" width="88"&gt;
  &lt;p class="MsoNormal"&gt;&lt;b&gt;7&lt;/b&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 7.5pt 12.0pt 7.5pt 12.0pt; width: 160.85pt;" width="214"&gt;
  &lt;p class="MsoNormal"&gt;&lt;b&gt;Ulangan Harian 1 (Petunjuk Kerja)&lt;/b&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 7.5pt 0cm 7.5pt 12.0pt; width: 262.25pt;" width="350"&gt;
  &lt;p class="MsoNormal"&gt;Mengevaluasi pencapaian kompetensi peserta didik pada
  pokok bahasan petunjuk kerja.&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;
  &lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr style="mso-yfti-irow: 8;"&gt;
  &lt;td style="padding: 7.5pt 12.0pt 7.5pt 0cm; width: 65.95pt;" width="88"&gt;
  &lt;p class="MsoNormal"&gt;&lt;b&gt;8&lt;/b&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 7.5pt 12.0pt 7.5pt 12.0pt; width: 160.85pt;" width="214"&gt;
  &lt;p class="MsoNormal"&gt;Evaluasi Informasi dalam Teks Ceramah&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 7.5pt 0cm 7.5pt 12.0pt; width: 262.25pt;" width="350"&gt;
  &lt;p class="MsoNormal"&gt;Peserta didik mampu mengevaluasi informasi dalam teks
  ceramah serta mengidentifikasi gagasan pokok dan pendukung.&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;
  &lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr style="mso-yfti-irow: 9;"&gt;
  &lt;td style="padding: 7.5pt 12.0pt 7.5pt 0cm; width: 65.95pt;" width="88"&gt;
  &lt;p class="MsoNormal"&gt;&lt;b&gt;9&lt;/b&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 7.5pt 12.0pt 7.5pt 12.0pt; width: 160.85pt;" width="214"&gt;
  &lt;p class="MsoNormal"&gt;Membandingkan Isi Teks Ceramah dengan Teks Lain&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 7.5pt 0cm 7.5pt 12.0pt; width: 262.25pt;" width="350"&gt;
  &lt;p class="MsoNormal"&gt;Peserta didik mampu membandingkan isi teks ceramah dengan
  teks lainnya serta menemukan kelebihan dan kekurangan masing-masing.&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;
  &lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr style="mso-yfti-irow: 10;"&gt;
  &lt;td style="padding: 7.5pt 12.0pt 7.5pt 0cm; width: 65.95pt;" width="88"&gt;
  &lt;p class="MsoNormal"&gt;&lt;b&gt;10&lt;/b&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 7.5pt 12.0pt 7.5pt 12.0pt; width: 160.85pt;" width="214"&gt;
  &lt;p class="MsoNormal"&gt;Kaidah Kebahasaan Teks Ceramah (Bagian 1)&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 7.5pt 0cm 7.5pt 12.0pt; width: 262.25pt;" width="350"&gt;
  &lt;p class="MsoNormal"&gt;Peserta didik mampu mengidentifikasi ciri kebahasaan teks
  ceramah, seperti kata ganti orang, kata teknis, dan kata persuasif.&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;
  &lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr style="mso-yfti-irow: 11;"&gt;
  &lt;td style="padding: 7.5pt 12.0pt 7.5pt 0cm; width: 65.95pt;" width="88"&gt;
  &lt;p class="MsoNormal"&gt;&lt;b&gt;11&lt;/b&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 7.5pt 12.0pt 7.5pt 12.0pt; width: 160.85pt;" width="214"&gt;
  &lt;p class="MsoNormal"&gt;Kaidah Kebahasaan Teks Ceramah (Bagian 2) &amp;amp; Menulis
  Teks Ceramah&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 7.5pt 0cm 7.5pt 12.0pt; width: 262.25pt;" width="350"&gt;
  &lt;p class="MsoNormal"&gt;Peserta didik mampu menganalisis kaidah kebahasaan secara
  mendalam dan menulis teks ceramah secara kreatif.&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;
  &lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr style="mso-yfti-irow: 12;"&gt;
  &lt;td style="padding: 7.5pt 12.0pt 7.5pt 0cm; width: 65.95pt;" width="88"&gt;
  &lt;p class="MsoNormal"&gt;&lt;b&gt;12&lt;/b&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 7.5pt 12.0pt 7.5pt 12.0pt; width: 160.85pt;" width="214"&gt;
  &lt;p class="MsoNormal"&gt;Menyajikan Teks Ceramah secara Lisan &amp;amp; Rangkuman&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 7.5pt 0cm 7.5pt 12.0pt; width: 262.25pt;" width="350"&gt;
  &lt;p class="MsoNormal"&gt;Peserta didik mampu menyajikan teks ceramah secara lisan
  dengan teknik berbicara, intonasi, dan sikap santun, serta mereview seluruh
  materi ceramah.&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;
  &lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr style="mso-yfti-irow: 13;"&gt;
  &lt;td style="padding: 7.5pt 12.0pt 7.5pt 0cm; width: 65.95pt;" width="88"&gt;
  &lt;p class="MsoNormal"&gt;&lt;b&gt;13&lt;/b&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 7.5pt 12.0pt 7.5pt 12.0pt; width: 160.85pt;" width="214"&gt;
  &lt;p class="MsoNormal"&gt;Latihan Soal &amp;amp; Soal Tipe AKM (Pokok Bahasan Ceramah)&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 7.5pt 0cm 7.5pt 12.0pt; width: 262.25pt;" width="350"&gt;
  &lt;p class="MsoNormal"&gt;Peserta didik mampu mengerjakan soal-soal latihan dan soal
  tipe AKM dengan tepat serta mengidentifikasi kelemahan pemahaman.&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;
  &lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr style="mso-yfti-irow: 14;"&gt;
  &lt;td style="padding: 7.5pt 12.0pt 7.5pt 0cm; width: 65.95pt;" width="88"&gt;
  &lt;p class="MsoNormal"&gt;&lt;b&gt;14&lt;/b&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 7.5pt 12.0pt 7.5pt 12.0pt; width: 160.85pt;" width="214"&gt;
  &lt;p class="MsoNormal"&gt;&lt;b&gt;Ulangan Harian 2 (Santun Berbicara di Depan Khalayak)&lt;/b&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 7.5pt 0cm 7.5pt 12.0pt; width: 262.25pt;" width="350"&gt;
  &lt;p class="MsoNormal"&gt;Mengevaluasi pencapaian kompetensi peserta didik pada
  pokok bahasan ceramah.&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;
  &lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr style="mso-yfti-irow: 15;"&gt;
  &lt;td style="padding: 7.5pt 12.0pt 7.5pt 0cm; width: 65.95pt;" width="88"&gt;
  &lt;p class="MsoNormal"&gt;&lt;b&gt;15&lt;/b&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 7.5pt 12.0pt 7.5pt 12.0pt; width: 160.85pt;" width="214"&gt;
  &lt;p class="MsoNormal"&gt;Memahami Isi &amp;amp; Mengevaluasi Struktur Teks Resensi&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 7.5pt 0cm 7.5pt 12.0pt; width: 262.25pt;" width="350"&gt;
  &lt;p class="MsoNormal"&gt;Peserta didik mampu memahami isi teks resensi serta
  mengevaluasi struktur teks resensi dan membandingkannya dengan teks lain.&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;
  &lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr style="mso-yfti-irow: 16;"&gt;
  &lt;td style="padding: 7.5pt 12.0pt 7.5pt 0cm; width: 65.95pt;" width="88"&gt;
  &lt;p class="MsoNormal"&gt;&lt;b&gt;16&lt;/b&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 7.5pt 12.0pt 7.5pt 12.0pt; width: 160.85pt;" width="214"&gt;
  &lt;p class="MsoNormal"&gt;Menganalisis Kaidah Kebahasaan Teks Resensi &amp;amp; Menulis
  Teks Resensi&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 7.5pt 0cm 7.5pt 12.0pt; width: 262.25pt;" width="350"&gt;
  &lt;p class="MsoNormal"&gt;Peserta didik mampu menganalisis kaidah kebahasaan teks
  resensi serta menulis teks resensi buku fiksi secara logis dan sistematis.&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;
  &lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr style="mso-yfti-irow: 17;"&gt;
  &lt;td style="padding: 7.5pt 12.0pt 7.5pt 0cm; width: 65.95pt;" width="88"&gt;
  &lt;p class="MsoNormal"&gt;&lt;b&gt;17&lt;/b&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 7.5pt 12.0pt 7.5pt 12.0pt; width: 160.85pt;" width="214"&gt;
  &lt;p class="MsoNormal"&gt;Mempresentasikan Teks Resensi &amp;amp; Rangkuman Materi
  Resensi&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 7.5pt 0cm 7.5pt 12.0pt; width: 262.25pt;" width="350"&gt;
  &lt;p class="MsoNormal"&gt;Peserta didik mampu mempresentasikan teks resensi secara
  logis dan kreatif serta mereview seluruh materi resensi.&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;
  &lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr style="mso-yfti-irow: 18; mso-yfti-lastrow: yes;"&gt;
  &lt;td style="padding: 7.5pt 12.0pt 7.5pt 0cm; width: 65.95pt;" width="88"&gt;
  &lt;p class="MsoNormal"&gt;&lt;b&gt;18&lt;/b&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 7.5pt 12.0pt 7.5pt 12.0pt; width: 160.85pt;" width="214"&gt;
  &lt;p class="MsoNormal"&gt;&lt;b&gt;Ulangan Harian 3 (Objektif Menilai Buku)&lt;/b&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 7.5pt 0cm 7.5pt 12.0pt; width: 262.25pt;" width="350"&gt;
  &lt;p class="MsoNormal"&gt;Mengevaluasi pencapaian kompetensi peserta didik pada
  pokok bahasan resensi.&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;
  &lt;/td&gt;
 &lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;</description><link>http://kitab-investasi.blogspot.com/2026/07/materi-pembelajaran-bahasa-indonesia.html</link><thr:total>0</thr:total><author>nof_rizal07@yahoo.co.id (abang_cool)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-9000860041661554971.post-9014831872284392146</guid><pubDate>Wed, 15 Jul 2026 08:34:21 +0000</pubDate><atom:updated>2026-07-22T09:22:51.015+07:00</atom:updated><title>SMART ASSESEMENT AWAL INFORMATIKA ARROW</title><description>&lt;!DOCTYPE html&gt;
&lt;html lang="id"&gt;
&lt;head&gt;
    &lt;meta charset="UTF-8"&gt;
    &lt;meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"&gt;
    &lt;title&gt;ARROW SMART • Asesmen Awal Informatika&lt;/title&gt;
    &lt;style&gt;
        /* RESET &amp; BASE */
        * { margin: 0; padding: 0; box-sizing: border-box; user-select: none; }
        html, body {
            width: 100%;
            min-height: 100vh;
            background: #080c18;
            font-family: 'Segoe UI', 'Arial', 'Helvetica', sans-serif;
            overflow: hidden;
            position: relative;
        }
        /* GAME WRAPPER - FULLSCREEN &amp; TANPA GULIR */
        #game-wrapper {
            position: fixed;
            top: 0;
            left: 0;
            width: 100vw;
            height: 100vh;
            max-width: 100%;
            max-height: 100%;
            background: radial-gradient(circle at 20% 30%, #0e1a2b, #050a14);
            box-shadow: 0 0 50px #00d4ff40, 0 0 120px #0055ff20;
            border: 1px solid #00d4ff60;
            display: flex;
            flex-direction: column;
            padding: 16px;
            overflow: hidden;
            z-index: 9999;
        }
        /* HEADER */
        #header {
            display: flex;
            justify-content: space-between;
            align-items: center;
            padding: 6px 12px;
            color: #a8e6ff;
            font-weight: bold;
            background: rgba(0, 20, 40, 0.6);
            backdrop-filter: blur(4px);
            border-radius: 60px;
            border: 1px solid #00d4ff80;
            margin-bottom: 10px;
            flex-shrink: 0;
        }
        #header span { background: #0a1a2e; padding: 4px 16px; border-radius: 40px; border: 1px solid #00d4ff; font-size: 0.9rem; letter-spacing: 1px; }
        #level-indicator { background: #0a1a2e; color: #7ad0ff; border-color: #00aaff; }
        #score-indicator { color: #facc15; border-color: #facc15; }
        #player-name-display { color: #7ad0ff; border-color: #00aaff; }
        #timer-display { background: #1a0a0a; color: #ff6b6b; border-color: #ff4444; min-width: 80px; text-align: center; }
        /* CANVAS AREA */
        #game-canvas-container {
            flex: 1;
            position: relative;
            border-radius: 24px;
            overflow: hidden;
            min-height: 200px;
            border: 1px solid #00d4ff40;
            box-shadow: inset 0 0 60px #0044aa30;
            cursor: crosshair;
        }
        canvas { display: block; width: 100%; height: 100%; background: transparent; cursor: crosshair; }
        /* QUESTION PANEL */
        #question-panel {
            background: rgba(0, 16, 32, 0.85);
            backdrop-filter: blur(8px);
            border: 1px solid #00d4ff;
            border-radius: 40px;
            padding: 14px 20px;
            margin-top: 10px;
            color: #e6f7ff;
            font-weight: 600;
            font-size: clamp(0.95rem, 2.6vw, 1.25rem);
            text-align: left;
            box-shadow: 0 0 40px #0066ff44;
            flex-shrink: 0;
            min-height: 76px;
            display: flex;
            align-items: center;
            line-height: 1.5;
        }
        #question-panel .q-number { color: #00d4ff; font-weight: 800; margin-right: 12px; white-space: nowrap; text-shadow: 0 0 12px #00aaff; }
        #question-panel .q-text { color: #ffffff; font-weight: 700; text-shadow: 0 0 8px rgba(0, 180, 255, 0.3); }
        /* ENTRY SCREEN */
        #entry-screen {
            position: absolute; inset: 0; z-index: 20;
            background: rgba(0, 6, 16, 0.92); backdrop-filter: blur(12px);
            display: flex; flex-direction: column; justify-content: center; align-items: center; gap: 30px;
            border-radius: 32px; padding: 20px;
        }
        #entry-screen h1 { font-size: 2.6rem; color: #7ad0ff; text-shadow: 0 0 40px #00aaff, 0 0 100px #0055ff; letter-spacing: 4px; font-weight: 800; }
        #entry-screen h2 { color: #7ad0ff; font-size: 1.4rem; margin-top: -20px; text-shadow: 0 0 20px #00aaff; font-weight: 400; letter-spacing: 2px; }
        #entry-screen input { background: #0a1a2e; border: 2px solid #00d4ff; border-radius: 60px; padding: 16px 24px; width: 80%; max-width: 340px; font-size: 1.3rem; color: #d6f0ff; text-align: center; outline: none; box-shadow: 0 0 40px #0066ff55; }
        #entry-screen input::placeholder { color: #4a7a9a; }
        .cyber-btn {
            background: linear-gradient(145deg, #0a2a4a, #06152a); border: 1px solid #00d4ff; color: #d6f0ff;
            padding: 16px 48px; border-radius: 60px; font-size: 1.6rem; font-weight: bold; letter-spacing: 3px;
            box-shadow: 0 0 40px #00aaffaa, inset 0 0 20px #00aaff44; transition: 0.2s; cursor: pointer; backdrop-filter: blur(4px);
        }
        .cyber-btn:active { transform: scale(0.93); box-shadow: 0 0 80px #00d4ff; }
        /* CONGRATS OVERLAY */
        #congrats-overlay {
            position: absolute; inset: 0; z-index: 30;
            background: rgba(0, 4, 16, 0.85); backdrop-filter: blur(8px); border-radius: 32px;
            display: none; flex-direction: column; justify-content: center; align-items: center; padding: 20px; text-align: center; color: #fff;
        }
        #congrats-overlay.show { display: flex; }
        .congrats-box {
            background: rgba(0, 16, 32, 0.8); border: 2px solid #00d4ff; border-radius: 60px; padding: 30px 20px;
            max-width: 480px; width: 100%; box-shadow: 0 0 80px #0066ff88, inset 0 0 30px #00aaff44; backdrop-filter: blur(8px); position: relative; z-index: 5;
        }
        .congrats-box .user-name { font-size: 1.4rem; color: #7ad0ff; margin-bottom: 8px; text-shadow: 0 0 20px #00aaff; }
        .congrats-box .user-name i { font-style: normal; background: rgba(0,180,255,0.15); padding: 2px 14px; border-radius: 30px; border: 1px solid #00aaff44; }
        .congrats-box h2 { font-size: 2.4rem; margin-bottom: 6px; color: #facc15; text-shadow: 0 0 30px #facc15aa; }
        .congrats-box .rank { font-size: 2rem; font-weight: 800; background: linear-gradient(45deg, #7ad0ff, #00aaff, #a855f7); -webkit-background-clip: text; -webkit-text-fill-color: transparent; margin: 10px 0; }
        .congrats-box .final-score { font-size: 1.8rem; color: #7ad0ff; text-shadow: 0 0 20px #00aaff66; }
        .congrats-box .final-score span { color: #facc15; font-weight: 800; text-shadow: 0 0 20px #facc1566; }
        .congrats-box .message { font-size: 1.2rem; color: #c8e6ff; margin: 16px 0; background: rgba(0,180,255,0.1); padding: 10px 16px; border-radius: 30px; border: 1px solid #00aaff44; }
        .congrats-box .stats-grid { display: flex; justify-content: center; gap: 20px; margin: 12px 0; font-size: 0.9rem; color: #7ad0ff; }
        .congrats-box .stats-grid span { background: rgba(0,20,50,0.5); padding: 4px 14px; border-radius: 20px; border: 1px solid #00aaff33; }
        .congrats-box .footer-note { margin-top: 16px; font-size: 0.85rem; color: #5a8aaa; letter-spacing: 1px; border-top: 1px solid #00aaff33; padding-top: 14px; font-style: italic; }
        .small-btn { background: #0a2a4a; border: 1px solid #00d4ff; color: #d6f0ff; padding: 12px 30px; border-radius: 60px; font-size: 1.2rem; margin-top: 12px; cursor: pointer; transition: 0.2s; box-shadow: 0 0 20px #00aaff33; }
        .small-btn:active { transform: scale(0.92); }
        #speech-btn { background: rgba(0,180,255,0.15); border: 1px solid #00d4ff; color: #7ad0ff; padding: 8px 20px; border-radius: 40px; font-size: 0.9rem; cursor: pointer; margin-top: 6px; transition: 0.2s; box-shadow: 0 0 15px #00aaff22; }
        #speech-btn:hover { background: rgba(0,180,255,0.3); }
        /* LEADERBOARD */
        #leaderboard {
            position: absolute; bottom: 10px; right: 16px;
            background: #0a1218cc; backdrop-filter: blur(8px); padding: 10px 18px; border-radius: 40px;
            border: 1px solid #00d4ff; color: #7ad0ff; font-size: 0.8rem; max-width: 200px; max-height: 120px; overflow-y: auto; z-index: 10;
        }
        #leaderboard div { display: flex; justify-content: space-between; gap: 10px; border-bottom: 1px solid #00d4ff40; padding: 2px 0; }
        .lb-score { color: #facc15; }
        /* RESPONSIVE */
        @media (max-width: 500px) {
            #header span { font-size: 0.7rem; padding: 2px 10px; }
            #entry-screen h1 { font-size: 2rem; }
            #question-panel { font-size: clamp(0.8rem, 2.5vw, 1rem); padding: 10px 14px; min-height: 64px; }
            .congrats-box { padding: 20px 14px; }
            .congrats-box h2 { font-size: 1.8rem; }
            .congrats-box .rank { font-size: 1.5rem; }
            #leaderboard { max-width: 140px; font-size: 0.7rem; padding: 6px 12px; }
        }
        @media (max-width: 400px) {
            #header span { font-size: 0.6rem; padding: 2px 6px; }
            #timer-display { min-width: 60px; font-size: 0.7rem; }
        }
    &lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;!-- GAME WRAPPER - FIXED POSITION UNTUK MENGHINDARI BILAH SEARCH BLOGSPOT --&gt;
&lt;div id="game-wrapper"&gt;
    &lt;div id="header"&gt;
        &lt;span id="player-name-display"&gt;&#127919; User&lt;/span&gt;
        &lt;span id="level-indicator"&gt;⚡ Level 1&lt;/span&gt;
        &lt;span id="score-indicator"&gt;⭐ 0 / 100&lt;/span&gt;
        &lt;span id="timer-display"&gt;⏱️ 60:00&lt;/span&gt;
    &lt;/div&gt;
    &lt;div id="game-canvas-container"&gt;
        &lt;canvas id="gameCanvas" width="800" height="600"&gt;&lt;/canvas&gt;
        &lt;div id="entry-screen"&gt;
            &lt;h1&gt;&#127919; ARROW SMART&lt;/h1&gt;
            &lt;h2&gt;Asesmen Awal Informatika&lt;/h2&gt;
            &lt;input id="playerNameInput" type="text" placeholder="Nama User" maxlength="20"&gt;
            &lt;button class="cyber-btn" id="startGameBtn"&gt;▶ MULAI&lt;/button&gt;
            &lt;div style="color:#4a7a9a; font-size:0.8rem;"&gt;Panah ke perangkat IT! • Waktu 60 menit&lt;/div&gt;
        &lt;/div&gt;
        &lt;div id="congrats-overlay"&gt;
            &lt;div class="congrats-box"&gt;
                &lt;div class="user-name"&gt;&#127919; &lt;i id="userNameDisplay"&gt;User&lt;/i&gt;&lt;/div&gt;
                &lt;h2&gt;&#127937; ASESMEN SELESAI&lt;/h2&gt;
                &lt;div class="rank" id="rankDisplay"&gt;Master Informatika&lt;/div&gt;
                &lt;div class="final-score"&gt;Skor Akhir: &lt;span id="finalScoreDisplay"&gt;0&lt;/span&gt; / 100&lt;/div&gt;
                &lt;div class="stats-grid"&gt;
                    &lt;span id="levelCompleteDisplay"&gt;Level: 5/5&lt;/span&gt;
                    &lt;span id="accuracyDisplay"&gt;Akurasi: 0%&lt;/span&gt;
                &lt;/div&gt;
                &lt;div class="message" id="personalMessage"&gt;Hebat, User!&lt;/div&gt;
                &lt;button id="speech-btn"&gt;&#128266; Dengarkan Laporan&lt;/button&gt;
                &lt;button class="small-btn" id="restartFromCongratsBtn"&gt;&#128260; Misi Ulang&lt;/button&gt;
                &lt;div class="footer-note"&gt;✦ Selamat Belajar &amp; Bermain ✦&lt;/div&gt;
            &lt;/div&gt;
        &lt;/div&gt;
        &lt;div id="leaderboard"&gt;
            &lt;div style="color:#facc15; font-weight:bold;"&gt;&#127942; LEADERBOARD&lt;/div&gt;
            &lt;div id="lbEntries"&gt;&lt;div style="color:#4a7a9a;"&gt;Belum ada data&lt;/div&gt;&lt;/div&gt;
        &lt;/div&gt;
    &lt;/div&gt;
    &lt;div id="question-panel"&gt;
        &lt;span class="q-number" id="qNumberDisplay"&gt;1.&lt;/span&gt;
        &lt;span class="q-text" id="qTextDisplay"&gt;Tekan mulai &amp; tembak perangkat IT&lt;/span&gt;
    &lt;/div&gt;
&lt;/div&gt;

&lt;script&gt;
    (function(){
        // ========================================================
        // BANK PERTANYAAN INFORMATIKA KELAS X SMK SEMESTER 1 2026-2027
        // ========================================================
        const LEVELS = 5;
        const QUESTIONS_PER_LEVEL = 10;
        const MAX_SCORE = 100;
        const TOTAL_TIME = 60 * 60; // 60 menit

        const QUESTION_BANK = [
            // ===== LEVEL 1: Pertemuan 1-4 =====
            [
                { q: "Apa yang dimaksud dengan etika digital?", options: ["Aturan moral dalam berperilaku di dunia digital", "Cara menginstal software", "Teknik hacking", "Penggunaan media sosial", "Cara membuat website"], correct: 0 },
                { q: "Siapa yang mengemukakan arsitektur Von Neumann?", options: ["John von Neumann", "Alan Turing", "Bill Gates", "Steve Jobs", "Charles Babbage"], correct: 0 },
                { q: "Apa fungsi utama dari sistem operasi?", options: ["Mengelola perangkat keras dan perangkat lunak", "Mengedit dokumen", "Membuat presentasi", "Mengolah angka", "Mengirim email"], correct: 0 },
                { q: "Manakah yang termasuk perangkat lunak aplikasi?", options: ["Microsoft Word", "Windows", "Linux", "macOS", "Android"], correct: 0 },
                { q: "Apa kepanjangan dari LAN?", options: ["Local Area Network", "Large Area Network", "Logical Access Network", "Long Area Network", "Low Area Network"], correct: 0 },
                { q: "Contoh layanan cloud storage adalah...", options: ["Google Drive", "Microsoft Word", "Google Chrome", "Photoshop", "Notepad"], correct: 0 },
                { q: "Brainware dalam sistem komputer adalah...", options: ["Pengguna atau operator", "Perangkat keras", "Perangkat lunak", "Jaringan", "Data"], correct: 0 },
                { q: "Apa fungsi dari RAM?", options: ["Menyimpan data sementara", "Menyimpan data permanen", "Memproses data", "Menampilkan output", "Menyuplai daya"], correct: 0 },
                { q: "Perangkat yang menghubungkan LAN ke internet adalah...", options: ["Router", "Switch", "Hub", "Modem", "Access Point"], correct: 0 },
                { q: "Apa tujuan keamanan digital?", options: ["Melindungi data dan sistem", "Mempercepat internet", "Menginstall aplikasi", "Membuat website", "Mengirim email"], correct: 0 }
            ],
            // ===== LEVEL 2: Pertemuan 5-8 =====
            [
                { q: "Search engine paling populer adalah...", options: ["Google", "Bing", "Yahoo", "DuckDuckGo", "Yandex"], correct: 0 },
                { q: "Aplikasi pengolah kata perkantoran adalah...", options: ["Microsoft Word", "Microsoft Excel", "Google Sheets", "LibreOffice Calc", "Adobe Photoshop"], correct: 0 },
                { q: "Fungsi 'Style' pada pengolah kata untuk...", options: ["Memformat teks konsisten", "Menambah gambar", "Membuat tabel", "Menyisipkan grafik", "Mail merge"], correct: 0 },
                { q: "Apa itu mail merge?", options: ["Gabung dokumen dengan sumber data", "Gabung sel tabel", "Gabung file gambar", "Gabung spreadsheet", "Gabung presentasi"], correct: 0 },
                { q: "Daftar isi otomatis dibuat dengan...", options: ["Heading style", "Font size", "Page break", "Table of contents", "Index"], correct: 0 },
                { q: "Fungsi template dokumen?", options: ["Format standar dokumen", "Menyimpan file", "Mengedit gambar", "Membuat grafik", "Analisis data"], correct: 0 },
                { q: "Tools kolaborasi daring adalah...", options: ["Google Docs", "Word offline", "Notepad", "Photoshop", "Corel Draw"], correct: 0 },
                { q: "Etika pencarian informasi meliputi...", options: ["Menghargai hak cipta", "Copy paste tanpa izin", "Ubah data orang lain", "Sebar hoaks", "Abaikan sumber"], correct: 0 },
                { q: "Apa itu peramban (browser)?", options: ["Akses internet", "Pengolah kata", "Pengolah angka", "Sistem operasi", "Perangkat keras"], correct: 0 },
                { q: "Format file Word adalah...", options: [".docx", ".xlsx", ".pptx", ".pdf", ".txt"], correct: 0 }
            ],
            // ===== LEVEL 3: Pertemuan 9-12 =====
            [
                { q: "Aplikasi pengolah angka (spreadsheet) adalah...", options: ["Microsoft Excel", "Microsoft Word", "PowerPoint", "Access", "Outlook"], correct: 0 },
                { q: "Fungsi SUM pada spreadsheet untuk...", options: ["Menjumlahkan angka", "Mencari rata-rata", "Menghitung data", "Nilai maksimum", "Nilai minimum"], correct: 0 },
                { q: "Fungsi IF pada spreadsheet untuk...", options: ["Logika kondisi", "Menjumlahkan data", "Mencari rata-rata", "Menghitung jumlah", "Mencari maksimum"], correct: 0 },
                { q: "Apa fungsi VLOOKUP?", options: ["Mencari data vertikal", "Mencari data horizontal", "Menjumlahkan", "Rata-rata", "Grafik"], correct: 0 },
                { q: "Conditional Formatting untuk...", options: ["Format sel berdasarkan kondisi", "Membuat grafik", "Sortir data", "Filter data", "PivotTable"], correct: 0 },
                { q: "Apa itu PivotTable?", options: ["Analisis data interaktif", "Jenis grafik", "Fungsi matematika", "Sorting", "Filter"], correct: 0 },
                { q: "Ekstensi file Excel adalah...", options: [".xlsx", ".docx", ".pptx", ".pdf", ".txt"], correct: 0 },
                { q: "Fungsi AVERAGE untuk...", options: ["Rata-rata", "Menjumlahkan", "Maksimum", "Minimum", "Jumlah data"], correct: 0 },
                { q: "Sortir data bertujuan...", options: ["Mengurutkan data", "Memfilter data", "Membuat grafik", "Analisis data", "Menjumlahkan"], correct: 0 },
                { q: "Fungsi grafik pada spreadsheet?", options: ["Visualisasi data", "Jumlah data", "Urut data", "Filter data", "Rata-rata"], correct: 0 }
            ],
            // ===== LEVEL 4: Pertemuan 13-15 =====
            [
                { q: "Aplikasi presentasi profesional adalah...", options: ["Microsoft PowerPoint", "Microsoft Word", "Excel", "Access", "Outlook"], correct: 0 },
                { q: "Fungsi Slide Master untuk...", options: ["Template slide global", "Animasi", "Gambar", "Hyperlink", "Video"], correct: 0 },
                { q: "Transisi pada presentasi adalah...", options: ["Efek perpindahan slide", "Animasi objek", "Hyperlink", "Tema", "Slide Master"], correct: 0 },
                { q: "Contoh integrasi aplikasi kantor?", options: ["Gabung Excel ke Word", "Edit gambar Photoshop", "Buat website", "Install software", "Kirim email"], correct: 0 },
                { q: "Cloud kolaborasi dokumen adalah...", options: ["Google Workspace", "Word offline", "Notepad", "Photoshop", "Corel Draw"], correct: 0 },
                { q: "Dekomposisi dalam berpikir komputasional?", options: ["Memecah masalah", "Mengenali pola", "Abstraksi", "Algoritma", "Implementasi"], correct: 0 },
                { q: "Apa itu algoritma?", options: ["Langkah sistematis", "Program", "Bahasa pemrograman", "Struktur data", "Sistem operasi"], correct: 0 },
                { q: "Pengenalan pola bertujuan...", options: ["Identifikasi kesamaan", "Memecah masalah", "Abstraksi", "Algoritma", "Implementasi"], correct: 0 },
                { q: "Abstraksi dalam informatika?", options: ["Sederhanakan masalah", "Memecah masalah", "Pola", "Algoritma", "Implementasi"], correct: 0 },
                { q: "Tujuan berpikir komputasional?", options: ["Selesaikan masalah sistematis", "Hafal kode", "Buat program", "Gunakan komputer", "Bermain game"], correct: 0 }
            ],
            // ===== LEVEL 5: Pertemuan 16-18 =====
            [
                { q: "Algoritma searching untuk...", options: ["Mencari data", "Mengurutkan data", "Menjumlahkan", "Memfilter", "Grafik"], correct: 0 },
                { q: "Algoritma sorting untuk...", options: ["Mengurutkan data", "Mencari data", "Menjumlahkan", "Memfilter", "Grafik"], correct: 0 },
                { q: "Contoh algoritma pencarian adalah...", options: ["Sequential search", "Bubble sort", "Insertion sort", "Selection sort", "Merge sort"], correct: 0 },
                { q: "Contoh algoritma pengurutan adalah...", options: ["Bubble sort", "Sequential search", "Binary search", "Linear search", "Depth first search"], correct: 0 },
                { q: "Laporan dalam proyek dibuat dengan...", options: ["Pengolah kata", "Spreadsheet", "Presentasi", "Database", "Email"], correct: 0 },
                { q: "Analisis data proyek dengan...", options: ["Spreadsheet", "Pengolah kata", "Presentasi", "Email", "Browser"], correct: 0 },
                { q: "Presentasi proyek dibuat dengan...", options: ["Aplikasi presentasi", "Pengolah kata", "Spreadsheet", "Email", "Browser"], correct: 0 },
                { q: "Portofolio digital berisi...", options: ["Hasil karya dan proyek", "Foto pribadi", "Video hiburan", "Game", "Musik"], correct: 0 },
                { q: "Asesmen sumatif bertujuan...", options: ["Ukur penguasaan kompetensi", "Hafal materi", "Buat proyek", "Presentasi", "Diskusi"], correct: 0 },
                { q: "Manfaat cloud storage?", options: ["Akses data dari mana saja", "Simpan di harddisk", "Install software", "Buat presentasi", "Olah angka"], correct: 0 }
            ]
        ];

        // ===== STATE =====
        let userName = "User";
        let currentLevel = 0;
        let currentQuestionIndex = 0;
        let score = 0;
        let totalAttempts = 0;
        let correctAttempts = 0;
        let questionsForLevel = [];
        let targets = [];
        let gameActive = false;
        let levelCompleted = false;
        let animationFrame = null;
        let canvas, ctx;
        let W, H;
        let leaderboardData = [];
        let particles = [];
        let fireworks = [];
        let isCelebrating = false;
        let finalScore = 0, finalRank = "", finalMessage = "", finalAccuracy = 0;

        // Timer
        let timeRemaining = TOTAL_TIME;
        let timerInterval = null;
        let timerRunning = false;

        // Archery state
        let archer = { x: 50, y: 0 };
        let arrow = { x: 0, y: 0, vx: 0, vy: 0, active: false, angle: 0, targetX: 0, targetY: 0, speed: 10, homing: false };
        let arrowCooldown = 0;
        let mouseX = 0, mouseY = 0;

        // DOM
        const canvasEl = document.getElementById('gameCanvas');
        const questionPanel = document.getElementById('question-panel');
        const qNumberDisplay = document.getElementById('qNumberDisplay');
        const qTextDisplay = document.getElementById('qTextDisplay');
        const levelIndicator = document.getElementById('level-indicator');
        const scoreIndicator = document.getElementById('score-indicator');
        const playerNameDisplay = document.getElementById('player-name-display');
        const timerDisplay = document.getElementById('timer-display');
        const entryScreen = document.getElementById('entry-screen');
        const congratsOverlay = document.getElementById('congrats-overlay');
        const finalScoreSpan = document.getElementById('finalScoreDisplay');
        const rankDisplay = document.getElementById('rankDisplay');
        const personalMessage = document.getElementById('personalMessage');
        const userNameDisplay = document.getElementById('userNameDisplay');
        const levelCompleteDisplay = document.getElementById('levelCompleteDisplay');
        const accuracyDisplay = document.getElementById('accuracyDisplay');
        const lbEntries = document.getElementById('lbEntries');
        const speechBtn = document.getElementById('speech-btn');

        canvas = canvasEl; ctx = canvas.getContext('2d');

        let speechSynth = window.speechSynthesis;
        let speechUtterance = null;
        function speakScoreboard(score, rank, message, accuracy) {
            if (!window.speechSynthesis) return;
            if (speechSynth.speaking) speechSynth.cancel();
            const text = `Laporan untuk User ${userName}. Skor ${score} dari 100. Predikat ${rank}. Akurasi ${accuracy} persen. ${message}`;
            speechUtterance = new SpeechSynthesisUtterance(text);
            speechUtterance.lang = 'id-ID'; speechUtterance.rate = 0.85; speechUtterance.pitch = 1;
            speechSynth.speak(speechUtterance);
        }

        function shuffleArray(arr) { for (let i=arr.length-1; i&gt;0; i--) { const j=Math.floor(Math.random()*(i+1)); [arr[i],arr[j]]=[arr[j],arr[i]]; } return arr; }

        function loadLeaderboard() {
            try { const data = localStorage.getItem('arrowsmart_leaderboard'); leaderboardData = data ? JSON.parse(data) : []; } catch(e){ leaderboardData = []; }
            renderLeaderboard();
        }
        function saveLeaderboard() { localStorage.setItem('arrowsmart_leaderboard', JSON.stringify(leaderboardData)); renderLeaderboard(); }
        function renderLeaderboard() {
            if (!lbEntries) return;
            if (leaderboardData.length === 0) { lbEntries.innerHTML = '&lt;div style="color:#4a7a9a;"&gt;Belum ada data&lt;/div&gt;'; return; }
            const sorted = [...leaderboardData].sort((a,b) =&gt; b.score - a.score).slice(0,5);
            lbEntries.innerHTML = sorted.map(p =&gt; `&lt;div&gt;&lt;span&gt;${p.name}&lt;/span&gt;&lt;span class="lb-score"&gt;${p.score}&lt;/span&gt;&lt;/div&gt;`).join('');
        }

        function resizeCanvas() {
            const container = document.getElementById('game-canvas-container');
            const rect = container.getBoundingClientRect();
            canvas.width = rect.width || 800; canvas.height = rect.height || 600;
            W = canvas.width; H = canvas.height;
            archer.y = H - 70; archer.x = Math.min(archer.x, W-30);
            if (gameActive &amp;&amp; questionsForLevel.length) { generateTargets(); if (!levelCompleted) showCurrentQuestion(); }
        }
        window.addEventListener('resize', resizeCanvas);
        resizeCanvas();

        function loadLevel(levelIdx) {
            currentLevel = levelIdx; currentQuestionIndex = 0; levelCompleted = false;
            const raw = QUESTION_BANK[levelIdx] || QUESTION_BANK[0];
            questionsForLevel = raw.map(item =&gt; {
                const shuffledOptions = shuffleArray([...item.options]);
                const correctIndex = shuffledOptions.indexOf(item.options[item.correct]);
                return { q: item.q, options: shuffledOptions, correct: correctIndex };
            });
            questionsForLevel = shuffleArray(questionsForLevel);
            generateTargets();
            updateUI();
            if (gameActive) showCurrentQuestion();
        }

        function generateTargets() {
            targets = [];
            if (!questionsForLevel.length) return;
            const total = questionsForLevel.length;
            const cols = Math.min(4, total, Math.floor(W / 130) + 1);
            const rows = Math.ceil(total / cols);
            const spacingX = (W - 80) / (cols + 1);
            const spacingY = (H - 140) / (rows + 2);
            const size = Math.min(spacingX * 0.40, spacingY * 0.45, 62);
            const baseY = spacingY * 0.6 + 20;
            const icons = ['&#128187;', '&#128421;️', '&#128424;️', '⌨️', '&#128433;️', '&#128241;', '&#128190;', '&#128192;', '&#128268;', '&#128225;', '☁️', '&#128274;'];
            for (let i = 0; i &lt; total; i++) {
                const col = i % cols, row = Math.floor(i / cols);
                let x = 60 + spacingX * (col + 1) + (Math.random() - 0.5) * 30;
                let y = baseY + spacingY * row + (Math.random() - 0.5) * 20;
                x = Math.min(Math.max(x, size+20), W - size - 10);
                y = Math.min(Math.max(y, size+20), H - size - 80);
                const vx = (Math.random() - 0.5) * 0.6, vy = (Math.random() - 0.5) * 0.6;
                targets.push({
                    id: i, x, y, size,
                    vx, vy,
                    icon: icons[i % icons.length],
                    label: questionsForLevel[i]?.options[0] || '?',
                    fullText: questionsForLevel[i]?.options[0] || '?',
                    answered: false,
                    optionIndex: 0
                });
            }
        }

        function showCurrentQuestion() {
            if (!questionsForLevel.length || currentQuestionIndex &gt;= questionsForLevel.length) {
                levelCompleted = true;
                if (currentLevel + 1 &lt; LEVELS) { currentLevel++; loadLevel(currentLevel); updateUI(); }
                else { endGame(); }
                return;
            }
            const qData = questionsForLevel[currentQuestionIndex];
            if (!qData) return;
            qNumberDisplay.textContent = `${currentQuestionIndex + 1}.`;
            qTextDisplay.textContent = qData.q;
            targets.forEach((t, idx) =&gt; {
                const optIdx = idx % qData.options.length;
                t.optionIndex = optIdx;
                t.fullText = qData.options[optIdx] || '?';
                t.label = t.fullText;
                t.answered = false;
            });
        }

        function shootArrow(targetX, targetY) {
            if (!gameActive || levelCompleted) return;
            if (arrow.active || arrowCooldown &gt; 0) return;
            const dx = targetX - archer.x, dy = targetY - archer.y;
            if (Math.sqrt(dx*dx + dy*dy) &lt; 30) return;
            arrow.active = true;
            arrow.x = archer.x + 20; arrow.y = archer.y - 10;
            arrow.targetX = targetX; arrow.targetY = targetY;
            arrow.homing = true; arrow.speed = 10;
            const angle = Math.atan2(dy, dx);
            arrow.vx = Math.cos(angle) * arrow.speed;
            arrow.vy = Math.sin(angle) * arrow.speed;
            arrow.angle = angle;
            arrowCooldown = 12;
        }

        function updateArrow() {
            if (!arrow.active) return;
            if (arrow.homing) {
                const dx = arrow.targetX - arrow.x, dy = arrow.targetY - arrow.y;
                const dist = Math.sqrt(dx*dx + dy*dy);
                if (dist &gt; 5) {
                    const targetAngle = Math.atan2(dy, dx);
                    let angleDiff = targetAngle - arrow.angle;
                    while (angleDiff &gt; Math.PI) angleDiff -= 2*Math.PI;
                    while (angleDiff &lt; -Math.PI) angleDiff += 2*Math.PI;
                    arrow.angle += angleDiff * 0.1;
                    arrow.vx = Math.cos(arrow.angle) * arrow.speed;
                    arrow.vy = Math.sin(arrow.angle) * arrow.speed;
                }
            }
            arrow.x += arrow.vx; arrow.y += arrow.vy;
            for (let t of targets) {
                if (t.answered) continue;
                const dx = arrow.x - t.x, dy = arrow.y - t.y;
                if (dx*dx + dy*dy &lt; (t.size + 8) * (t.size + 8)) {
                    arrow.active = false;
                    t.answered = true;
                    totalAttempts++;
                    const qData = questionsForLevel[currentQuestionIndex];
                    const selectedOptIdx = t.optionIndex % qData.options.length;
                    const isCorrect = (selectedOptIdx === qData.correct);
                    if (isCorrect) {
                        const scorePerQuestion = MAX_SCORE / (LEVELS * QUESTIONS_PER_LEVEL);
                        score = Math.min(MAX_SCORE, score + scorePerQuestion);
                        correctAttempts++;
                        spawnExplosion(t.x, t.y, '#00ffaa', 25);
                    } else {
                        spawnExplosion(t.x, t.y, '#ff4444', 18);
                    }
                    currentQuestionIndex++;
                    if (currentQuestionIndex &gt;= questionsForLevel.length) {
                        if (currentLevel + 1 &lt; LEVELS) showLevelCongrats();
                        else { endGame(); }
                    } else showCurrentQuestion();
                    updateUI();
                    return;
                }
            }
            if (arrow.x &gt; W || arrow.x &lt; 0 || arrow.y &gt; H || arrow.y &lt; 0) arrow.active = false;
        }

        function spawnExplosion(x, y, color, count) {
            for (let i=0; i&lt;count; i++) {
                const angle = Math.random() * 2 * Math.PI, speed = Math.random() * 4 + 1;
                particles.push({ x, y, vx: Math.cos(angle)*speed, vy: Math.sin(angle)*speed, life: 1, decay: Math.random()*0.025+0.015, size: Math.random()*5+2, color });
            }
        }

        function showLevelCongrats() {
            qNumberDisplay.textContent = '⚡';
            qTextDisplay.textContent = `Level ${currentLevel+1} Selesai! Skor: ${Math.round(score)} / ${MAX_SCORE}`;
            for (let i=0; i&lt;25; i++) spawnExplosion(Math.random()*W, Math.random()*H, '#00ddff', 6);
            setTimeout(() =&gt; { if (currentLevel + 1 &lt; LEVELS) { currentLevel++; loadLevel(currentLevel); updateUI(); } else endGame(); }, 1200);
        }

        function getRank(scr) {
            const pct = (scr/MAX_SCORE)*100;
            if (pct &gt;= 90) return "Master Informatika";
            else if (pct &gt;= 75) return "Expert Informatika";
            else if (pct &gt;= 60) return "Pro Informatika";
            else if (pct &gt;= 40) return "Learner Informatika";
            else return "Perlu Belajar Lagi";
        }

        function getMessage(scr) {
            const pct = (scr/MAX_SCORE)*100;
            if (pct &gt;= 90) return "Luar biasa! Anda Master Informatika sejati!";
            else if (pct &gt;= 75) return "Hebat! Pemahaman Informatika Anda solid!";
            else if (pct &gt;= 60) return "Bagus! Terus asah logika dan keterampilan digital!";
            else if (pct &gt;= 40) return "Mulai konsisten, raih predikat lebih tinggi!";
            else return "Perlu belajar lagi, kuasai dasar-dasar Informatika!";
        }

        function endGame() {
            gameActive = false;
            if (timerInterval) { clearInterval(timerInterval); timerInterval = null; }
            timerRunning = false;
            
            finalScore = Math.round(score);
            finalRank = getRank(finalScore);
            finalMessage = getMessage(finalScore);
            finalAccuracy = totalAttempts &gt; 0 ? Math.round((correctAttempts / totalAttempts) * 100) : 0;
            
            congratsOverlay.classList.add('show');
            finalScoreSpan.textContent = finalScore;
            rankDisplay.textContent = finalRank;
            personalMessage.textContent = finalMessage;
            userNameDisplay.textContent = userName;
            levelCompleteDisplay.textContent = `Level: ${LEVELS}/${LEVELS}`;
            accuracyDisplay.textContent = `Akurasi: ${finalAccuracy}%`;
            
            leaderboardData.push({ name: userName, score: finalScore });
            saveLeaderboard();
            isCelebrating = true;
            for (let i=0; i&lt;80; i++) setTimeout(() =&gt; spawnFirework(Math.random()*W, Math.random()*H*0.7 + 50), i*65);
            for (let i=0; i&lt;45; i++) setTimeout(() =&gt; spawnFirework(Math.random()*W, Math.random()*H*0.5 + 30), 3800 + i*85);
            setTimeout(() =&gt; speakScoreboard(finalScore, finalRank, finalMessage, finalAccuracy), 1600);
        }

        function spawnFirework(x, y) {
            const colors = ['#ff4444','#ffdd44','#44ff44','#44ddff','#ff44ff','#ffffff','#ff8800','#00ffaa','#a855f7'];
            for (let i=0; i&lt;55; i++) {
                const angle = Math.random()*2*Math.PI, speed = Math.random()*7+2, color = colors[Math.floor(Math.random()*colors.length)];
                fireworks.push({ x, y, vx: Math.cos(angle)*speed, vy: Math.sin(angle)*speed-1, life:1, decay: Math.random()*0.015+0.006, size: Math.random()*5+2, color, isConfetti: false });
            }
            for (let i=0; i&lt;30; i++) {
                const angle = Math.random()*2*Math.PI, speed = Math.random()*4+1, color = colors[Math.floor(Math.random()*colors.length)];
                fireworks.push({ x, y, vx: Math.cos(angle)*speed+(Math.random()-0.5)*2, vy: Math.sin(angle)*speed-2.5, life:1, decay: Math.random()*0.01+0.004, size: Math.random()*9+4, color, isConfetti: true });
            }
        }

        function updateUI() {
            levelIndicator.textContent = `⚡ Level ${currentLevel+1}`;
            scoreIndicator.textContent = `⭐ ${Math.round(score)} / ${MAX_SCORE}`;
            playerNameDisplay.textContent = `&#127919; ${userName}`;
        }

        // Timer
        function startTimer() {
            if (timerRunning) return;
            timerRunning = true;
            timerInterval = setInterval(() =&gt; {
                timeRemaining--;
                updateTimerDisplay();
                if (timeRemaining &lt;= 0) {
                    clearInterval(timerInterval);
                    timerInterval = null;
                    timerRunning = false;
                    if (gameActive) { endGame(); }
                }
            }, 1000);
        }

        function updateTimerDisplay() {
            const mins = Math.floor(timeRemaining / 60);
            const secs = timeRemaining % 60;
            timerDisplay.textContent = `⏱️ ${String(mins).padStart(2, '0')}:${String(secs).padStart(2, '0')}`;
            if (timeRemaining &lt; 300) {
                timerDisplay.style.color = '#ff4444';
                timerDisplay.style.borderColor = '#ff4444';
            } else {
                timerDisplay.style.color = '#ff6b6b';
                timerDisplay.style.borderColor = '#ff4444';
            }
        }

        function drawArcher() {
            const ax = archer.x, ay = archer.y;
            ctx.shadowBlur = 20; ctx.shadowColor = '#00aaff66';
            ctx.fillStyle = '#1a3a5a'; ctx.fillRect(ax-8, ay+10, 6, 14); ctx.fillRect(ax+2, ay+10, 6, 14);
            ctx.fillStyle = '#2a5a7a'; ctx.beginPath(); ctx.ellipse(ax, ay-4, 16, 22, 0, 0, Math.PI*2); ctx.fill();
            ctx.fillStyle = '#f0d8b0'; ctx.beginPath(); ctx.arc(ax, ay-28, 14, 0, Math.PI*2); ctx.fill();
            ctx.fillStyle = '#4a3a2a'; ctx.beginPath(); ctx.arc(ax, ay-34, 14, Math.PI, 2*Math.PI); ctx.fill();
            const bowAngle = Math.atan2(mouseY - ay, mouseX - ax);
            const bowLen = 38;
            ctx.strokeStyle = '#c8a060'; ctx.lineWidth = 3; ctx.shadowBlur = 15; ctx.shadowColor = '#ffdd44aa';
            ctx.beginPath(); ctx.arc(ax + 16, ay - 4, bowLen, bowAngle - 0.7, bowAngle + 0.7); ctx.stroke();
            ctx.strokeStyle = '#aaaacc'; ctx.lineWidth = 1.5;
            const e1 = bowAngle - 0.7, e2 = bowAngle + 0.7;
            const ex1 = ax+16+Math.cos(e1)*bowLen, ey1 = ay-4+Math.sin(e1)*bowLen;
            const ex2 = ax+16+Math.cos(e2)*bowLen, ey2 = ay-4+Math.sin(e2)*bowLen;
            ctx.beginPath(); ctx.moveTo(ex1, ey1); ctx.lineTo(ax+16+Math.cos(bowAngle)*10, ay-4+Math.sin(bowAngle)*10); ctx.lineTo(ex2, ey2); ctx.stroke();
            ctx.shadowBlur = 0;
            if (arrow.active) {
                ctx.save(); ctx.translate(arrow.x, arrow.y); ctx.rotate(arrow.angle);
                ctx.shadowBlur = 20; ctx.shadowColor = '#00ffaa88';
                ctx.strokeStyle = '#ddaa88'; ctx.lineWidth = 2.5; ctx.beginPath(); ctx.moveTo(0,0); ctx.lineTo(25,0); ctx.stroke();
                ctx.fillStyle = '#ffdd44'; ctx.shadowColor = '#ffdd44aa'; ctx.beginPath(); ctx.moveTo(28,0); ctx.lineTo(20,-5); ctx.lineTo(20,5); ctx.closePath(); ctx.fill();
                ctx.fillStyle = '#ff6666'; ctx.shadowColor = '#ff666688'; ctx.beginPath(); ctx.moveTo(-2,0); ctx.lineTo(-8,-6); ctx.lineTo(-8,6); ctx.closePath(); ctx.fill();
                ctx.restore(); ctx.shadowBlur = 0;
            }
        }

        function draw() {
            ctx.clearRect(0, 0, W, H);
            ctx.fillStyle = 'rgba(0, 10, 30, 0.3)'; ctx.fillRect(0, 0, W, H);
            ctx.strokeStyle = '#00aaff20'; ctx.lineWidth = 0.5;
            for (let i=0; i&lt;W; i+=30) { ctx.beginPath(); ctx.moveTo(i,0); ctx.lineTo(i,H); ctx.stroke(); }
            for (let i=0; i&lt;H; i+=30) { ctx.beginPath(); ctx.moveTo(0,i); ctx.lineTo(W,i); ctx.stroke(); }
            ctx.strokeStyle = '#00d4ff15'; ctx.lineWidth = 1;
            for (let i=0; i&lt;W; i+=80) { ctx.beginPath(); ctx.moveTo(i,0); ctx.lineTo(i+40,H); ctx.stroke(); }
            for (let i=0; i&lt;30; i++) {
                ctx.fillStyle = `rgba(0, 180, 255, ${Math.random()*0.15+0.03})`;
                ctx.font = '12px monospace'; ctx.fillText(Math.random()&gt;0.5?'1':'0', Math.random()*W, Math.random()*H);
            }
            ctx.fillStyle = '#00aaff10'; ctx.font = '28px sans-serif';
            ctx.fillText('PC', 20, 40); ctx.fillText('NB', W-50, 50); ctx.fillText('NT', W-70, H-30); ctx.fillText('PR', 30, H-20);

            targets.forEach(t =&gt; {
                if (t.answered) return;
                ctx.shadowColor = '#00aaffaa'; ctx.shadowBlur = 30;
                const grad = ctx.createRadialGradient(t.x-5, t.y-5, 2, t.x, t.y, t.size);
                grad.addColorStop(0, '#80d4ff'); grad.addColorStop(0.5, '#0088ff'); grad.addColorStop(1, '#1a0066');
                ctx.beginPath(); ctx.arc(t.x, t.y, t.size, 0, 2*Math.PI);
                ctx.fillStyle = grad; ctx.fill();
                ctx.shadowBlur = 0;
                ctx.strokeStyle = '#80d4ff'; ctx.lineWidth = 2.5; ctx.shadowBlur = 15; ctx.shadowColor = '#00aaff';
                ctx.stroke(); ctx.shadowBlur = 0;
                
                ctx.font = `${t.size * 0.38}px 'Segoe UI Emoji', 'Apple Color Emoji', 'Noto Color Emoji', sans-serif`;
                ctx.textAlign = 'center'; ctx.textBaseline = 'middle';
                ctx.fillStyle = '#ffffff'; ctx.shadowBlur = 8; ctx.shadowColor = '#0044ff';
                ctx.fillText(t.icon, t.x, t.y - 14);
                ctx.shadowBlur = 0;
                
                ctx.fillStyle = '#ffffff'; 
                const fontSize = Math.max(14, t.size * 0.34);
                ctx.font = `bold ${fontSize}px 'Segoe UI', Arial, sans-serif`;
                ctx.textAlign = 'center'; ctx.textBaseline = 'bottom';
                let displayText = t.fullText;
                if (displayText.length &gt; 14) displayText = displayText.substring(0, 13) + '…';
                
                const metrics = ctx.measureText(displayText);
                const tw = metrics.width;
                const th = fontSize * 1.5;
                const tx = t.x - tw/2 - 8;
                const ty = t.y + t.size - 14 - th;
                
                ctx.shadowBlur = 0;
                const r = 6;
                ctx.beginPath();
                ctx.moveTo(tx + r, ty);
                ctx.lineTo(tx + tw + 16 - r, ty);
                ctx.quadraticCurveTo(tx + tw + 16, ty, tx + tw + 16, ty + r);
                ctx.lineTo(tx + tw + 16, ty + th + 6 - r);
                ctx.quadraticCurveTo(tx + tw + 16, ty + th + 6, tx + tw + 16 - r, ty + th + 6);
                ctx.lineTo(tx + r, ty + th + 6);
                ctx.quadraticCurveTo(tx, ty + th + 6, tx, ty + th + 6 - r);
                ctx.lineTo(tx, ty + r);
                ctx.quadraticCurveTo(tx, ty, tx + r, ty);
                ctx.closePath();
                ctx.fillStyle = 'rgba(0, 10, 30, 0.85)';
                ctx.fill();
                
                ctx.fillStyle = '#ffffff';
                ctx.shadowBlur = 4;
                ctx.shadowColor = 'rgba(0, 0, 0, 0.5)';
                ctx.textAlign = 'center'; ctx.textBaseline = 'bottom';
                ctx.fillText(displayText, t.x, t.y + t.size - 6);
                ctx.shadowBlur = 0;
                
                t.x += t.vx; t.y += t.vy;
                if (t.x &lt; t.size + 20 || t.x &gt; W - t.size - 10) t.vx *= -1;
                if (t.y &lt; t.size + 20 || t.y &gt; H - t.size - 80) t.vy *= -1;
                t.x = Math.min(Math.max(t.x, t.size+20), W - t.size - 10);
                t.y = Math.min(Math.max(t.y, t.size+20), H - t.size - 80);
            });

            if (arrow.active) updateArrow();
            if (arrowCooldown &gt; 0) arrowCooldown--;
            if (gameActive) {
                const targetX = Math.min(Math.max(mouseX, 30), W - 30);
                archer.x += (targetX - archer.x) * 0.08;
                archer.y = H - 70;
            }
            drawArcher();

            for (let i=particles.length-1; i&gt;=0; i--) {
                const p = particles[i];
                p.x += p.vx; p.y += p.vy; p.life -= p.decay; p.vy += 0.05;
                if (p.life &lt;= 0) { particles.splice(i,1); continue; }
                ctx.globalAlpha = p.life; ctx.fillStyle = p.color; ctx.shadowBlur = 10; ctx.shadowColor = p.color;
                ctx.beginPath(); ctx.arc(p.x, p.y, p.size * p.life, 0, 2*Math.PI); ctx.fill();
                ctx.shadowBlur = 0;
            }
            ctx.globalAlpha = 1;

            for (let i=fireworks.length-1; i&gt;=0; i--) {
                const f = fireworks[i];
                f.x += f.vx; f.y += f.vy; f.vy += 0.04; f.life -= f.decay;
                if (f.life &lt;= 0) { fireworks.splice(i,1); continue; }
                ctx.globalAlpha = f.life; ctx.fillStyle = f.color; ctx.shadowBlur = 18; ctx.shadowColor = f.color;
                if (f.isConfetti) { ctx.save(); ctx.translate(f.x, f.y); ctx.rotate(f.life*12); ctx.fillRect(-f.size/2, -f.size/2, f.size*f.life, f.size*f.life*0.5); ctx.restore(); }
                else { ctx.beginPath(); ctx.arc(f.x, f.y, f.size * f.life, 0, 2*Math.PI); ctx.fill(); }
                ctx.shadowBlur = 0;
            }
            ctx.globalAlpha = 1;
        }

        function gameLoop() { draw(); animationFrame = requestAnimationFrame(gameLoop); }

        canvasEl.addEventListener('click', (e) =&gt; {
            const rect = canvasEl.getBoundingClientRect();
            const scaleX = canvas.width / rect.width, scaleY = canvas.height / rect.height;
            shootArrow((e.clientX - rect.left)*scaleX, (e.clientY - rect.top)*scaleY);
        });
        canvasEl.addEventListener('touchstart', (e) =&gt; {
            e.preventDefault(); const rect = canvasEl.getBoundingClientRect();
            const touch = e.touches[0]; const scaleX = canvas.width/rect.width, scaleY = canvas.height/rect.height;
            shootArrow((touch.clientX - rect.left)*scaleX, (touch.clientY - rect.top)*scaleY);
        }, { passive: false });
        canvasEl.addEventListener('mousemove', (e) =&gt; {
            const rect = canvasEl.getBoundingClientRect();
            mouseX = (e.clientX - rect.left) * (canvas.width/rect.width);
            mouseY = (e.clientY - rect.top) * (canvas.height/rect.height);
        });
        speechBtn.addEventListener('click', () =&gt; speakScoreboard(finalScore, finalRank, finalMessage, finalAccuracy));

        function startGame() {
            const nameInput = document.getElementById('playerNameInput');
            userName = nameInput.value.trim() || "User";
            playerNameDisplay.textContent = `&#127919; ${userName}`;
            entryScreen.style.display = 'none';
            congratsOverlay.classList.remove('show');
            
            score = 0; totalAttempts = 0; correctAttempts = 0; currentLevel = 0;
            timeRemaining = TOTAL_TIME;
            updateTimerDisplay();
            timerDisplay.style.color = '#ff6b6b';
            timerDisplay.style.borderColor = '#ff4444';
            
            gameActive = true; isCelebrating = false; particles = []; fireworks = []; arrow.active = false;
            if (speechSynth.speaking) speechSynth.cancel();
            
            startTimer();
            loadLevel(0); updateUI();
            if (animationFrame) cancelAnimationFrame(animationFrame);
            gameLoop();
        }

        document.getElementById('startGameBtn').addEventListener('click', startGame);
        document.getElementById('restartFromCongratsBtn').addEventListener('click', () =&gt; { 
            congratsOverlay.classList.remove('show'); 
            if (timerInterval) { clearInterval(timerInterval); timerInterval = null; }
            timerRunning = false;
            startGame(); 
        });
        loadLeaderboard(); loadLevel(0); updateUI();
        qNumberDisplay.textContent = '&#127919;'; qTextDisplay.textContent = 'Masukkan nama &amp; tekan MULAI';
        updateTimerDisplay();
        gameLoop();
        window.addEventListener('resize', resizeCanvas);
    })();
&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</description><link>http://kitab-investasi.blogspot.com/2026/07/arrowa-smart-informatika-arrow.html</link><thr:total>0</thr:total><author>nof_rizal07@yahoo.co.id (abang_cool)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-9000860041661554971.post-3527539497463372680</guid><pubDate>Mon, 06 Jul 2026 01:46:27 +0000</pubDate><atom:updated>2026-07-15T08:22:26.997+07:00</atom:updated><title>ARROW SMART-5S</title><description>&lt;!DOCTYPE html&gt;
&lt;html lang="id"&gt;
&lt;head&gt;
    &lt;meta charset="UTF-8"&gt;
    &lt;meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"&gt;
    &lt;title&gt;SMART-5S Archery&lt;/title&gt;
    &lt;style&gt;
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
            user-select: none;
        }
        body {
            background: #0a0e1a;
            min-height: 100vh;
            display: flex;
            justify-content: center;
            align-items: center;
            font-family: 'Segoe UI', 'Arial', sans-serif;
        }
        #game-wrapper {
            width: 100%;
            max-width: 800px;
            height: 100vh;
            max-height: 900px;
            background: radial-gradient(circle at 30% 20%, #0d1b2a, #050a14);
            box-shadow: 0 0 50px #00d4ff40, 0 0 120px #0055ff20;
            border-radius: 32px;
            padding: 16px;
            display: flex;
            flex-direction: column;
            position: relative;
            overflow: hidden;
            border: 1px solid #00d4ff60;
        }
        #header {
            display: flex;
            justify-content: space-between;
            align-items: center;
            padding: 6px 12px;
            color: #a8e6ff;
            font-weight: bold;
            background: rgba(0, 20, 40, 0.6);
            backdrop-filter: blur(4px);
            border-radius: 60px;
            border: 1px solid #00d4ff80;
            margin-bottom: 10px;
            flex-shrink: 0;
        }
        #header span {
            background: #0a1a2e;
            padding: 4px 16px;
            border-radius: 40px;
            border: 1px solid #00d4ff;
            font-size: 0.9rem;
            letter-spacing: 1px;
        }
        #level-indicator { background: #0a1a2e; color: #7ad0ff; border-color: #00aaff; }
        #score-indicator { color: #facc15; border-color: #facc15; }
        #player-name-display { color: #7ad0ff; border-color: #00aaff; }
        #game-canvas-container {
            flex: 1;
            position: relative;
            background: transparent;
            border-radius: 24px;
            overflow: hidden;
            min-height: 300px;
            border: 1px solid #00d4ff40;
            box-shadow: inset 0 0 60px #0044aa30;
            cursor: crosshair;
        }
        canvas {
            display: block;
            width: 100%;
            height: 100%;
            background: transparent;
            cursor: crosshair;
        }
        #question-panel {
            background: rgba(0, 16, 32, 0.85);
            backdrop-filter: blur(8px);
            border: 1px solid #00d4ff;
            border-radius: 40px;
            padding: 14px 20px;
            margin-top: 10px;
            color: #e6f7ff;
            font-weight: 600;
            font-size: clamp(1rem, 2.8vw, 1.3rem);
            text-align: left;
            box-shadow: 0 0 40px #0066ff44;
            flex-shrink: 0;
            min-height: 76px;
            display: flex;
            align-items: center;
            line-height: 1.5;
        }
        #question-panel .q-number {
            color: #00d4ff;
            font-weight: 800;
            margin-right: 12px;
            white-space: nowrap;
            text-shadow: 0 0 12px #00aaff;
        }
        #question-panel .q-text {
            color: #ffffff;
            font-weight: 700;
            text-shadow: 0 0 8px rgba(0, 180, 255, 0.3);
        }
        #entry-screen {
            position: absolute;
            inset: 0;
            z-index: 20;
            background: rgba(0, 6, 16, 0.92);
            backdrop-filter: blur(12px);
            display: flex;
            flex-direction: column;
            justify-content: center;
            align-items: center;
            gap: 30px;
            border-radius: 32px;
            padding: 20px;
        }
        #entry-screen h1 {
            font-size: 2.6rem;
            color: #7ad0ff;
            text-shadow: 0 0 40px #00aaff, 0 0 100px #0055ff;
            letter-spacing: 4px;
            font-weight: 800;
        }
        #entry-screen input {
            background: #0a1a2e;
            border: 2px solid #00d4ff;
            border-radius: 60px;
            padding: 16px 24px;
            width: 80%;
            max-width: 340px;
            font-size: 1.3rem;
            color: #d6f0ff;
            text-align: center;
            outline: none;
            box-shadow: 0 0 40px #0066ff55;
        }
        #entry-screen input::placeholder { color: #4a7a9a; }
        .cyber-btn {
            background: linear-gradient(145deg, #0a2a4a, #06152a);
            border: 1px solid #00d4ff;
            color: #d6f0ff;
            padding: 16px 48px;
            border-radius: 60px;
            font-size: 1.6rem;
            font-weight: bold;
            letter-spacing: 3px;
            box-shadow: 0 0 40px #00aaffaa, inset 0 0 20px #00aaff44;
            transition: 0.2s;
            cursor: pointer;
            backdrop-filter: blur(4px);
        }
        .cyber-btn:active { transform: scale(0.93); box-shadow: 0 0 80px #00d4ff; }
        #congrats-overlay {
            position: absolute;
            inset: 0;
            z-index: 30;
            background: rgba(0, 4, 16, 0.85);
            backdrop-filter: blur(8px);
            border-radius: 32px;
            display: none;
            flex-direction: column;
            justify-content: center;
            align-items: center;
            padding: 20px;
            text-align: center;
            color: #fff;
        }
        #congrats-overlay.show { display: flex; }
        .congrats-box {
            background: rgba(0, 16, 32, 0.8);
            border: 2px solid #00d4ff;
            border-radius: 60px;
            padding: 30px 20px;
            max-width: 480px;
            width: 100%;
            box-shadow: 0 0 80px #0066ff88, inset 0 0 30px #00aaff44;
            backdrop-filter: blur(8px);
            position: relative;
            z-index: 5;
        }
        .congrats-box .user-name {
            font-size: 1.4rem;
            color: #7ad0ff;
            margin-bottom: 8px;
            text-shadow: 0 0 20px #00aaff;
        }
        .congrats-box .user-name i {
            font-style: normal;
            background: rgba(0,180,255,0.15);
            padding: 2px 14px;
            border-radius: 30px;
            border: 1px solid #00aaff44;
        }
        .congrats-box h2 {
            font-size: 2.4rem;
            margin-bottom: 6px;
            color: #facc15;
            text-shadow: 0 0 30px #facc15aa;
        }
        .congrats-box .rank {
            font-size: 2rem;
            font-weight: 800;
            background: linear-gradient(45deg, #7ad0ff, #00aaff, #a855f7);
            -webkit-background-clip: text;
            -webkit-text-fill-color: transparent;
            margin: 10px 0;
            text-shadow: 0 0 40px #00aaff55;
        }
        .congrats-box .final-score {
            font-size: 1.8rem;
            color: #7ad0ff;
            text-shadow: 0 0 20px #00aaff66;
        }
        .congrats-box .final-score span {
            color: #facc15;
            font-weight: 800;
            text-shadow: 0 0 20px #facc1566;
        }
        .congrats-box .message {
            font-size: 1.2rem;
            color: #c8e6ff;
            margin: 16px 0;
            background: rgba(0, 180, 255, 0.1);
            padding: 10px 16px;
            border-radius: 30px;
            border: 1px solid #00aaff44;
        }
        .congrats-box .stats-grid {
            display: flex;
            justify-content: center;
            gap: 20px;
            margin: 12px 0;
            font-size: 0.9rem;
            color: #7ad0ff;
        }
        .congrats-box .stats-grid span {
            background: rgba(0, 20, 50, 0.5);
            padding: 4px 14px;
            border-radius: 20px;
            border: 1px solid #00aaff33;
        }
        .congrats-box .footer-note {
            margin-top: 16px;
            font-size: 0.85rem;
            color: #5a8aaa;
            letter-spacing: 1px;
            border-top: 1px solid #00aaff33;
            padding-top: 14px;
            font-style: italic;
        }
        .small-btn {
            background: #0a2a4a;
            border: 1px solid #00d4ff;
            color: #d6f0ff;
            padding: 12px 30px;
            border-radius: 60px;
            font-size: 1.2rem;
            margin-top: 12px;
            cursor: pointer;
            transition: 0.2s;
            box-shadow: 0 0 20px #00aaff33;
        }
        .small-btn:active { transform: scale(0.92); }
        #speech-btn {
            background: rgba(0, 180, 255, 0.15);
            border: 1px solid #00d4ff;
            color: #7ad0ff;
            padding: 8px 20px;
            border-radius: 40px;
            font-size: 0.9rem;
            cursor: pointer;
            margin-top: 6px;
            transition: 0.2s;
            box-shadow: 0 0 15px #00aaff22;
        }
        #speech-btn:hover { background: rgba(0, 180, 255, 0.3); }
        #speech-btn:active { transform: scale(0.95); }
        #leaderboard {
            position: absolute;
            bottom: 10px;
            right: 16px;
            background: #0a1218cc;
            backdrop-filter: blur(8px);
            padding: 10px 18px;
            border-radius: 40px;
            border: 1px solid #00d4ff;
            color: #7ad0ff;
            font-size: 0.8rem;
            max-width: 200px;
            max-height: 120px;
            overflow-y: auto;
            z-index: 10;
        }
        #leaderboard div { display: flex; justify-content: space-between; gap: 10px; border-bottom: 1px solid #00d4ff40; padding: 2px 0; }
        .lb-score { color: #facc15; }
        @media (max-width: 500px) {
            #header span { font-size: 0.7rem; padding: 2px 10px; }
            #entry-screen h1 { font-size: 2rem; }
            #question-panel { font-size: clamp(0.8rem, 2.5vw, 1rem); padding: 10px 14px; min-height: 64px; }
            .congrats-box { padding: 20px 14px; }
            .congrats-box h2 { font-size: 1.8rem; }
            .congrats-box .rank { font-size: 1.5rem; }
            .congrats-box .final-score { font-size: 1.4rem; }
        }
    &lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;div id="game-wrapper"&gt;
    &lt;div id="header"&gt;
        &lt;span id="player-name-display"&gt;&#127993; User&lt;/span&gt;
        &lt;span id="level-indicator"&gt;⚡ Level 1&lt;/span&gt;
        &lt;span id="score-indicator"&gt;⭐ 0 / 100&lt;/span&gt;
    &lt;/div&gt;

    &lt;div id="game-canvas-container"&gt;
        &lt;canvas id="gameCanvas" width="800" height="600"&gt;&lt;/canvas&gt;

        &lt;div id="entry-screen"&gt;
            &lt;h1&gt;&#127993; SMART-5S&lt;/h1&gt;
            &lt;input id="playerNameInput" type="text" placeholder="Nama User" maxlength="16"&gt;
            &lt;button class="cyber-btn" id="startGameBtn"&gt;▶ MULAI&lt;/button&gt;
            &lt;div style="color:#4a7a9a; font-size:0.8rem;"&gt;Tembak gelembung jawaban dengan panah!&lt;/div&gt;
        &lt;/div&gt;

        &lt;div id="congrats-overlay"&gt;
            &lt;div class="congrats-box"&gt;
                &lt;div class="user-name"&gt;&#127993; &lt;i id="userNameDisplay"&gt;User&lt;/i&gt;&lt;/div&gt;
                &lt;h2&gt;&#127937; MISI SELESAI&lt;/h2&gt;
                &lt;div class="rank" id="rankDisplay"&gt;SMART-5S Master&lt;/div&gt;
                &lt;div class="final-score"&gt;Skor Akhir: &lt;span id="finalScoreDisplay"&gt;0&lt;/span&gt; / 100&lt;/div&gt;
                &lt;div class="stats-grid"&gt;
                    &lt;span id="levelCompleteDisplay"&gt;Level: 5/5&lt;/span&gt;
                    &lt;span id="accuracyDisplay"&gt;Akurasi: 0%&lt;/span&gt;
                &lt;/div&gt;
                &lt;div class="message" id="personalMessage"&gt;Hebat, User!&lt;/div&gt;
                &lt;button id="speech-btn"&gt;&#128266; Dengarkan Laporan&lt;/button&gt;
                &lt;button class="small-btn" id="restartFromCongratsBtn"&gt;&#128260; Misi Ulang&lt;/button&gt;
                &lt;div class="footer-note"&gt;✦ Selamat Belajar &amp; Bermain ✦&lt;/div&gt;
            &lt;/div&gt;
        &lt;/div&gt;

        &lt;div id="leaderboard"&gt;
            &lt;div style="color:#facc15; font-weight:bold;"&gt;&#127942; LEADERBOARD&lt;/div&gt;
            &lt;div id="lbEntries"&gt;&lt;div style="color:#4a7a9a;"&gt;Belum ada data&lt;/div&gt;&lt;/div&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div id="question-panel"&gt;
        &lt;span class="q-number" id="qNumberDisplay"&gt;1.&lt;/span&gt;
        &lt;span class="q-text" id="qTextDisplay"&gt;Tekan mulai &amp; tembak gelembung&lt;/span&gt;
    &lt;/div&gt;
&lt;/div&gt;

&lt;script&gt;
    (function(){
        // ----- BANK PERTANYAAN SMART-5S -----
        const LEVELS = 5;
        const QUESTIONS_PER_LEVEL = 10;
        const MAX_SCORE = 100;

        const QUESTION_BANK = [
            // Level 1: Senyum
            [
                { q: "Apa makna dari Senyum dalam SMART-5S?", options: ["Ekspresi wajah yang menunjukkan keramahan dan kebaikan hati", "Tersenyum sinis kepada orang lain", "Menertawakan orang lain", "Muka cemberut", "Acuh tak acuh"], correct: 0 },
                { q: "Bagaimana penerapan Senyum yang benar?", options: ["Memberikan senyuman tulus saat kontak mata", "Tersenyum hanya jika dipaksa", "Tersenyum kepada teman saja", "Tersenyum tanpa alasan", "Tersenyum hanya di foto"], correct: 0 },
                { q: "Apa manfaat utama dari Senyum?", options: ["Mempererat hubungan dan menciptakan suasana hangat", "Menakut-nakuti orang lain", "Menunjukkan kesombongan", "Membuat orang lain cemburu", "Menghindari interaksi"], correct: 0 },
                { q: "Senyum yang tulus mencerminkan...", options: ["Kebaikan hati", "Kepalsuan", "Kesombongan", "Keangkuhan", "Ketakutan"], correct: 0 },
                { q: "Senyum dapat membuat orang lain merasa...", options: ["Dihargai dan nyaman", "Takut", "Bosan", "Tersinggung", "Marah"], correct: 0 },
                { q: "Senyum adalah bahasa...", options: ["Universal", "Tertutup", "Individual", "Egois", "Sulit"], correct: 0 },
                { q: "Apa yang dimaksud dengan 'senyum tulus'?", options: ["Senyum yang datang dari hati", "Senyum yang dibuat-buat", "Senyum sinis", "Senyum mengejek", "Senyum terpaksa"], correct: 0 },
                { q: "Senyum dapat mengurangi...", options: ["Ketegangan dan stres", "Kebahagiaan", "Pertemanan", "Kerukunan", "Semangat"], correct: 0 },
                { q: "Kapan sebaiknya kita memberikan senyum?", options: ["Saat bertemu atau memulai percakapan", "Hanya saat senang", "Hanya saat dipaksa", "Tidak perlu tersenyum", "Saat sendirian"], correct: 0 },
                { q: "Senyum dalam SMART-5S bertujuan untuk...", options: ["Membuka komunikasi yang hangat", "Menutup komunikasi", "Membuat orang lain takut", "Menunjukkan kekuasaan", "Mengasingkan diri"], correct: 0 }
            ],
            // Level 2: Salam
            [
                { q: "Apa makna dari Salam dalam SMART-5S?", options: ["Ungkapan atau gestur untuk menyapa dan memberi penghormatan", "Hanya melambaikan tangan", "Mengangguk saja", "Tidak perlu menyapa", "Mengabaikan orang lain"], correct: 0 },
                { q: "Contoh penerapan Salam yang benar adalah...", options: ["Mengucapkan 'Assalamu'alaikum' atau 'Selamat pagi'", "Hanya melambaikan tangan", "Mengangguk tanpa kata", "Tidak mengucapkan apa-apa", "Menghindari kontak"], correct: 0 },
                { q: "Apa manfaat dari Salam?", options: ["Memberi kesan positif dan mengurangi jarak emosional", "Menakut-nakuti", "Membuat orang lain risih", "Menunjukkan kekuasaan", "Mengasingkan diri"], correct: 0 },
                { q: "Salam yang diajarkan dalam SMART-5S adalah...", options: ["Assalamu'alaikum", "Halo", "Hey", "Apa kabar", "Selamat pagi"], correct: 0 },
                { q: "Salam adalah doa untuk...", options: ["Keselamatan dan kebaikan", "Kekayaan", "Ketenaran", "Kekuasaan", "Kemenangan"], correct: 0 },
                { q: "Budaya salam mencerminkan...", options: ["Kerendahan hati", "Kesombongan", "Keangkuhan", "Kebencian", "Kecurigaan"], correct: 0 },
                { q: "Mengucapkan salam ketika bertemu guru adalah bentuk...", options: ["Salam (SMART-5S)", "Senyum", "Sapa", "Sopan", "Santun"], correct: 0 },
                { q: "Membalas salam adalah kewajiban...", options: ["Sosial dan agama", "Pribadi", "Hanya untuk teman", "Hanya untuk guru", "Tidak perlu"], correct: 0 },
                { q: "Salam yang baik diiringi dengan...", options: ["Jabat tangan atau mengatupkan tangan di dada", "Diam saja", "Menghindar", "Menatap tajam", "Teriakan"], correct: 0 },
                { q: "Salam dapat membangun...", options: ["Hubungan yang harmonis", "Permusuhan", "Jarak", "Kesalahpahaman", "Konflik"], correct: 0 }
            ],
            // Level 3: Sapa
            [
                { q: "Apa makna dari Sapa dalam SMART-5S?", options: ["Bentuk interaksi untuk menanyakan kabar atau memulai pembicaraan", "Memanggil dengan keras", "Menggodai teman", "Menghindari orang", "Bersikap cuek"], correct: 0 },
                { q: "Contoh penerapan Sapa yang benar adalah...", options: ["'Apa kabar?' atau 'Bagaimana harimu?'", "Memanggil dengan teriakan", "Menghina", "Diam saja", "Acuh tak acuh"], correct: 0 },
                { q: "Apa manfaat dari Sapa?", options: ["Menunjukkan kepedulian dan membangun hubungan akrab", "Menakut-nakuti", "Membuat orang lain bosan", "Menunjukkan kekuasaan", "Mengasingkan diri"], correct: 0 },
                { q: "Sapa yang baik adalah...", options: ["Dengan kata-kata yang santun dan hangat", "Dengan teriakan", "Dengan nada tinggi", "Dengan kata kasar", "Dengan diam saja"], correct: 0 },
                { q: "Sapa dapat mempererat...", options: ["Hubungan pertemanan", "Permusuhan", "Jarak", "Kesalahpahaman", "Konflik"], correct: 0 },
                { q: "Sapa yang akrab membuat orang lain merasa...", options: ["Dihargai dan diperhatikan", "Takut", "Bosan", "Tersinggung", "Marah"], correct: 0 },
                { q: "Sapa yang baik dimulai dengan...", options: ["Senyum dan salam", "Diam", "Menghindar", "Menatap tajam", "Teriakan"], correct: 0 },
                { q: "Sapa membuat suasana menjadi...", options: ["Akrab dan hangat", "Tegang", "Mencekam", "Dingin", "Kaku"], correct: 0 },
                { q: "Setelah memberi salam, langkah selanjutnya adalah...", options: ["Memberikan sapa", "Langsung pergi", "Diam", "Menghindar", "Acuh"], correct: 0 },
                { q: "Sapa menunjukkan...", options: ["Kepedulian dan perhatian", "Keangkuhan", "Kesombongan", "Ketakutan", "Kebencian"], correct: 0 }
            ],
            // Level 4: Sopan
            [
                { q: "Apa makna dari Sopan dalam SMART-5S?", options: ["Sikap menghargai norma sosial, tata krama, dan bahasa yang baik", "Berbicara kasar", "Memotong pembicaraan", "Tidak peduli", "Bersikap angkuh"], correct: 0 },
                { q: "Contoh penerapan Sopan yang benar adalah...", options: ["Menggunakan bahasa tubuh yang menghargai lawan bicara", "Meludah sembarangan", "Memotong pembicaraan", "Menggunakan kata kasar", "Acuh tak acuh"], correct: 0 },
                { q: "Apa manfaat dari Sopan?", options: ["Membuat diri lebih dihargai dan suasana nyaman", "Menakut-nakuti", "Membuat orang lain bosan", "Menunjukkan kekuasaan", "Mengasingkan diri"], correct: 0 },
                { q: "Sopan dalam berbicara berarti...", options: ["Menggunakan kata yang halus", "Berteriak", "Memotong pembicaraan", "Menggunakan kata kasar", "Mengabaikan lawan bicara"], correct: 0 },
                { q: "Sopan santun kepada guru menunjukkan...", options: ["Penghormatan", "Ketakutan", "Keangkuhan", "Kebencian", "Ketidakpedulian"], correct: 0 },
                { q: "Sopan adalah cerminan...", options: ["Karakter mulia", "Kelemahan", "Kesombongan", "Keangkuhan", "Kebodohan"], correct: 0 },
                { q: "Menghargai pendapat teman adalah bentuk...", options: ["Sopan", "Senyum", "Salam", "Sapa", "Santun"], correct: 0 },
                { q: "Sopan dalam berpakaian di sekolah adalah...", options: ["Seragam rapi dan sopan", "Pakaian bebas", "Pakaian ketat", "Pakaian kusut", "Pakaian tidak senonoh"], correct: 0 },
                { q: "Sopan bertujuan untuk...", options: ["Menciptakan interaksi yang nyaman", "Menakut-nakuti", "Menghina", "Mengasingkan", "Membuat kacau"], correct: 0 },
                { q: "Sopan mencerminkan...", options: ["Penghargaan terhadap orang lain", "Keangkuhan", "Kesombongan", "Ketakutan", "Kebencian"], correct: 0 }
            ],
            // Level 5: Santun
            [
                { q: "Apa makna dari Santun dalam SMART-5S?", options: ["Perwujudan kehalusan budi bahasa dan perilaku penuh kelembutan", "Bersikap kasar", "Bersikap sombong", "Menghina orang", "Bersikap acuh"], correct: 0 },
                { q: "Contoh penerapan Santun yang benar adalah...", options: ["Mengucapkan 'Tolong', 'Terima kasih', dan 'Maaf'", "Berbicara kasar", "Menghina teman", "Mengabaikan guru", "Bersikap angkuh"], correct: 0 },
                { q: "Apa manfaat dari Santun?", options: ["Membangun reputasi positif dan memancarkan empati", "Menakut-nakuti", "Membuat orang lain bosan", "Menunjukkan kekuasaan", "Mengasingkan diri"], correct: 0 },
                { q: "Santun dalam berkomunikasi berarti...", options: ["Memilih kata dengan bijak dan nada lembut", "Berteriak", "Memotong pembicaraan", "Menggunakan kata kasar", "Diam saja"], correct: 0 },
                { q: "Budaya santun diajarkan sejak...", options: ["Usia dini", "Dewasa", "Lanjut usia", "Sekolah menengah", "Perguruan tinggi"], correct: 0 },
                { q: "Santun membuat orang lain merasa...", options: ["Nyaman dan dihormati", "Takut", "Bosan", "Tersinggung", "Marah"], correct: 0 },
                { q: "Kebalikan dari santun adalah...", options: ["Kasar dan angkuh", "Ramah", "Baik", "Rendah hati", "Sopan"], correct: 0 },
                { q: "Santun adalah bagian dari...", options: ["Akhlak mulia", "Kelemahan", "Kesombongan", "Keangkuhan", "Kebodohan"], correct: 0 },
                { q: "Penerapan santun di media sosial adalah...", options: ["Berkomentar dengan sopan", "Menyebarkan kebencian", "Menghina orang", "Menggunakan kata kasar", "Mengabaikan etika"], correct: 0 },
                { q: "Santun dalam SMART-5S bertujuan untuk...", options: ["Memancarkan empati dan kedewasaan emosional", "Menakut-nakuti", "Menghina", "Mengasingkan", "Membuat kacau"], correct: 0 }
            ]
        ];

        // ----- STATE -----
        let userName = "User";
        let currentLevel = 0;
        let currentQuestionIndex = 0;
        let score = 0;
        let totalAttempts = 0;
        let correctAttempts = 0;
        let questionsForLevel = [];
        let bubbles = [];
        let gameActive = false;
        let levelCompleted = false;
        let animationFrame = null;
        let canvas, ctx;
        let W, H;
        let leaderboardData = [];
        let particles = [];
        let fireworks = [];
        let isCelebrating = false;
        let finalScore = 0;
        let finalRank = "";
        let finalMessage = "";
        let finalAccuracy = 0;

        // Archery state - pemanah bergerak horizontal di bawah target
        let archer = { x: 50, y: 0 };
        let arrow = { 
            x: 0, y: 0, 
            vx: 0, vy: 0, 
            active: false, 
            angle: 0,
            targetX: 0,
            targetY: 0,
            speed: 10,
            homing: false
        };
        let arrowCooldown = 0;
        let mouseX = 0, mouseY = 0;
        let archerTargetY = 0;
        let archerSpeed = 2.5;

        // DOM
        const canvasEl = document.getElementById('gameCanvas');
        const questionPanel = document.getElementById('question-panel');
        const qNumberDisplay = document.getElementById('qNumberDisplay');
        const qTextDisplay = document.getElementById('qTextDisplay');
        const levelIndicator = document.getElementById('level-indicator');
        const scoreIndicator = document.getElementById('score-indicator');
        const playerNameDisplay = document.getElementById('player-name-display');
        const entryScreen = document.getElementById('entry-screen');
        const congratsOverlay = document.getElementById('congrats-overlay');
        const finalScoreSpan = document.getElementById('finalScoreDisplay');
        const rankDisplay = document.getElementById('rankDisplay');
        const personalMessage = document.getElementById('personalMessage');
        const userNameDisplay = document.getElementById('userNameDisplay');
        const levelCompleteDisplay = document.getElementById('levelCompleteDisplay');
        const accuracyDisplay = document.getElementById('accuracyDisplay');
        const lbEntries = document.getElementById('lbEntries');
        const speechBtn = document.getElementById('speech-btn');

        canvas = canvasEl;
        ctx = canvas.getContext('2d');

        // Speech Synthesis
        let speechSynth = window.speechSynthesis;
        let speechUtterance = null;

        function speakScoreboard(score, rank, message, accuracy) {
            if (!window.speechSynthesis) return;
            if (speechSynth.speaking) speechSynth.cancel();
            const text = `Laporan misi untuk User ${userName}. Skor akhir ${score} dari 100 poin. Predikat ${rank}. Akurasi ${accuracy} persen. ${message}`;
            speechUtterance = new SpeechSynthesisUtterance(text);
            speechUtterance.lang = 'id-ID';
            speechUtterance.rate = 0.85;
            speechUtterance.pitch = 1;
            speechSynth.speak(speechUtterance);
        }

        // ----- GAME FUNCTIONS -----
        function shuffleArray(arr) {
            for (let i = arr.length - 1; i &gt; 0; i--) {
                const j = Math.floor(Math.random() * (i + 1));
                [arr[i], arr[j]] = [arr[j], arr[i]];
            }
            return arr;
        }

        function loadLeaderboard() {
            try {
                const data = localStorage.getItem('smart5s_leaderboard');
                if (data) leaderboardData = JSON.parse(data);
                else leaderboardData = [];
            } catch(e){ leaderboardData = []; }
            renderLeaderboard();
        }
        function saveLeaderboard() {
            localStorage.setItem('smart5s_leaderboard', JSON.stringify(leaderboardData));
            renderLeaderboard();
        }
        function renderLeaderboard() {
            if (!lbEntries) return;
            if (leaderboardData.length === 0) {
                lbEntries.innerHTML = '&lt;div style="color:#4a7a9a;"&gt;Belum ada data&lt;/div&gt;';
                return;
            }
            const sorted = [...leaderboardData].sort((a,b) =&gt; b.score - a.score).slice(0,5);
            lbEntries.innerHTML = sorted.map(p =&gt; 
                `&lt;div&gt;&lt;span&gt;${p.name}&lt;/span&gt;&lt;span class="lb-score"&gt;${p.score}&lt;/span&gt;&lt;/div&gt;`
            ).join('');
        }

        function resizeCanvas() {
            const container = document.getElementById('game-canvas-container');
            const rect = container.getBoundingClientRect();
            canvas.width = rect.width || 800;
            canvas.height = rect.height || 600;
            W = canvas.width;
            H = canvas.height;
            // Posisi awal pemanah di bawah target
            archer.y = H - 70;
            archer.x = 50;
            archerTargetY = archer.y;
            if (gameActive &amp;&amp; questionsForLevel.length) {
                generateBubbles();
                if (!levelCompleted) showCurrentQuestion();
            }
        }
        window.addEventListener('resize', resizeCanvas);
        resizeCanvas();

        function loadLevel(levelIdx) {
            currentLevel = levelIdx;
            currentQuestionIndex = 0;
            levelCompleted = false;
            const raw = QUESTION_BANK[levelIdx] || QUESTION_BANK[0];
            questionsForLevel = raw.map(item =&gt; {
                const shuffledOptions = shuffleArray([...item.options]);
                const correctIndex = shuffledOptions.indexOf(item.options[item.correct]);
                return {
                    q: item.q,
                    options: shuffledOptions,
                    correct: correctIndex
                };
            });
            questionsForLevel = shuffleArray(questionsForLevel);
            generateBubbles();
            updateUI();
            if (gameActive) {
                showCurrentQuestion();
            }
        }

        function generateBubbles() {
            bubbles = [];
            if (!questionsForLevel.length) return;
            const total = questionsForLevel.length;
            const cols = Math.min(4, total, Math.floor(W / 130) + 1);
            const rows = Math.ceil(total / cols);
            const spacingX = (W - 80) / (cols + 1);
            const spacingY = (H - 140) / (rows + 2); // Sisakan ruang untuk pemanah di bawah
            const radius = Math.min(spacingX * 0.38, spacingY * 0.42, 55);
            const baseY = spacingY * 0.6 + 20;
            for (let i = 0; i &lt; total; i++) {
                const col = i % cols;
                const row = Math.floor(i / cols);
                let x = 60 + spacingX * (col + 1) + (Math.random() - 0.5) * 30;
                let y = baseY + spacingY * row + (Math.random() - 0.5) * 20;
                x = Math.min(Math.max(x, radius+20), W - radius - 10);
                y = Math.min(Math.max(y, radius+20), H - radius - 80);
                const vx = (Math.random() - 0.5) * 0.6;
                const vy = (Math.random() - 0.5) * 0.6;
                bubbles.push({
                    id: i,
                    x, y, radius,
                    vx, vy,
                    label: questionsForLevel[i]?.options[0] || '?',
                    fullText: questionsForLevel[i]?.options[0] || '?',
                    answered: false,
                    optionIndex: 0
                });
            }
        }

        function wrapTextForBubble(text, maxCharsPerLine) {
            const words = text.split(' ');
            let lines = [];
            let currentLine = '';
            for (let w of words) {
                if ((currentLine + ' ' + w).length &lt;= maxCharsPerLine) {
                    currentLine += (currentLine ? ' ' : '') + w;
                } else {
                    if (currentLine) lines.push(currentLine);
                    currentLine = w;
                }
            }
            if (currentLine) lines.push(currentLine);
            return lines;
        }

        function showCurrentQuestion() {
            if (!questionsForLevel.length || currentQuestionIndex &gt;= questionsForLevel.length) {
                levelCompleted = true;
                if (currentLevel + 1 &lt; LEVELS) {
                    currentLevel++;
                    loadLevel(currentLevel);
                    updateUI();
                } else {
                    showFinalCongrats();
                }
                return;
            }
            const qData = questionsForLevel[currentQuestionIndex];
            if (!qData) return;
            qNumberDisplay.textContent = `${currentQuestionIndex + 1}.`;
            qTextDisplay.textContent = qData.q;
            bubbles.forEach((b, idx) =&gt; {
                const optIdx = idx % qData.options.length;
                b.optionIndex = optIdx;
                b.fullText = qData.options[optIdx] || '?';
                b.label = b.fullText;
                b.answered = false;
            });
        }

        // Fungsi menembak - panah meluncur ke target
        function shootArrow(targetX, targetY) {
            if (!gameActive || levelCompleted) return;
            if (arrow.active || arrowCooldown &gt; 0) return;
            
            const dx = targetX - archer.x;
            const dy = targetY - archer.y;
            const dist = Math.sqrt(dx*dx + dy*dy);
            if (dist &lt; 30) return;
            
            arrow.active = true;
            arrow.x = archer.x + 20;
            arrow.y = archer.y - 10;
            arrow.targetX = targetX;
            arrow.targetY = targetY;
            arrow.homing = true;
            arrow.speed = 10;
            const angle = Math.atan2(dy, dx);
            arrow.vx = Math.cos(angle) * arrow.speed;
            arrow.vy = Math.sin(angle) * arrow.speed;
            arrow.angle = angle;
            arrowCooldown = 12;
        }

        function updateArrow() {
            if (!arrow.active) return;
            
            // Homing ke target
            if (arrow.homing) {
                const dx = arrow.targetX - arrow.x;
                const dy = arrow.targetY - arrow.y;
                const dist = Math.sqrt(dx*dx + dy*dy);
                
                if (dist &gt; 5) {
                    const targetAngle = Math.atan2(dy, dx);
                    let angleDiff = targetAngle - arrow.angle;
                    while (angleDiff &gt; Math.PI) angleDiff -= 2 * Math.PI;
                    while (angleDiff &lt; -Math.PI) angleDiff += 2 * Math.PI;
                    
                    const turnSpeed = 0.1;
                    arrow.angle += angleDiff * turnSpeed;
                    
                    arrow.vx = Math.cos(arrow.angle) * arrow.speed;
                    arrow.vy = Math.sin(arrow.angle) * arrow.speed;
                }
            }
            
            arrow.x += arrow.vx;
            arrow.y += arrow.vy;
            
            // Cek tabrakan dengan gelembung
            for (let b of bubbles) {
                if (b.answered) continue;
                const dx = arrow.x - b.x;
                const dy = arrow.y - b.y;
                if (dx*dx + dy*dy &lt; (b.radius + 6) * (b.radius + 6)) {
                    arrow.active = false;
                    b.answered = true;
                    totalAttempts++;
                    const qData = questionsForLevel[currentQuestionIndex];
                    const selectedOptIdx = b.optionIndex % qData.options.length;
                    const isCorrect = (selectedOptIdx === qData.correct);
                    if (isCorrect) {
                        const scorePerQuestion = MAX_SCORE / (LEVELS * QUESTIONS_PER_LEVEL);
                        score = Math.min(MAX_SCORE, score + scorePerQuestion);
                        correctAttempts++;
                        spawnExplosion(b.x, b.y, '#00ffaa', 25);
                    } else {
                        spawnExplosion(b.x, b.y, '#ff4444', 18);
                    }
                    currentQuestionIndex++;
                    if (currentQuestionIndex &gt;= questionsForLevel.length) {
                        if (currentLevel + 1 &lt; LEVELS) {
                            showLevelCongrats();
                        } else {
                            showFinalCongrats();
                        }
                    } else {
                        showCurrentQuestion();
                    }
                    updateUI();
                    return;
                }
            }
            
            if (arrow.x &gt; W || arrow.x &lt; 0 || arrow.y &gt; H || arrow.y &lt; 0) {
                arrow.active = false;
            }
        }

        function spawnExplosion(x, y, color, count) {
            for (let i=0; i&lt;count; i++) {
                const angle = Math.random() * 2 * Math.PI;
                const speed = Math.random() * 4 + 1;
                particles.push({
                    x, y,
                    vx: Math.cos(angle) * speed,
                    vy: Math.sin(angle) * speed,
                    life: 1,
                    decay: Math.random() * 0.025 + 0.015,
                    size: Math.random() * 5 + 2,
                    color: color
                });
            }
        }

        function showLevelCongrats() {
            qNumberDisplay.textContent = '⚡';
            qTextDisplay.textContent = `Level ${currentLevel+1} Selesai! Skor: ${Math.round(score)} / ${MAX_SCORE}`;
            for (let i=0; i&lt;25; i++) {
                spawnExplosion(Math.random()*W, Math.random()*H, '#00ddff', 6);
            }
            setTimeout(() =&gt; {
                if (currentLevel + 1 &lt; LEVELS) {
                    currentLevel++;
                    loadLevel(currentLevel);
                    updateUI();
                } else {
                    showFinalCongrats();
                }
            }, 1200);
        }

        function getRank(scr) {
            const pct = (scr / MAX_SCORE) * 100;
            if (pct &gt;= 90) return "&#127942; SMART-5S Master";
            else if (pct &gt;= 75) return "&#127775; SMART-5S Expert";
            else if (pct &gt;= 60) return "⚡ SMART-5S Pro";
            else if (pct &gt;= 40) return "&#128216; SMART-5S Learner";
            else return "&#128214; Perlu Belajar Lagi";
        }

        function getMessage(scr) {
            const pct = (scr / MAX_SCORE) * 100;
            if (pct &gt;= 90) return "&#128640; Luar biasa! Anda SMART-5S Master sejati!";
            else if (pct &gt;= 75) return "&#127775; Hebat! Terus pertahankan nilai-nilai SMART-5S!";
            else if (pct &gt;= 60) return "&#128200; Bagus! Asah terus 5S Anda!";
            else if (pct &gt;= 40) return "&#128218; Mulai konsisten, raih predikat lebih tinggi!";
            else return "&#128170; Perlu belajar lagi, raih SMART-5S Master!";
        }

        function showFinalCongrats() {
            gameActive = false;
            finalScore = Math.round(score);
            finalRank = getRank(finalScore);
            finalMessage = getMessage(finalScore);
            finalAccuracy = totalAttempts &gt; 0 ? Math.round((correctAttempts / totalAttempts) * 100) : 0;
            
            congratsOverlay.classList.add('show');
            finalScoreSpan.textContent = finalScore;
            rankDisplay.textContent = finalRank;
            personalMessage.textContent = finalMessage;
            userNameDisplay.textContent = userName;
            levelCompleteDisplay.textContent = `Level: ${LEVELS}/${LEVELS}`;
            accuracyDisplay.textContent = `Akurasi: ${finalAccuracy}%`;
            
            leaderboardData.push({ name: userName, score: finalScore });
            saveLeaderboard();
            
            isCelebrating = true;
            for (let i=0; i&lt;80; i++) {
                setTimeout(() =&gt; {
                    spawnFirework(Math.random()*W, Math.random()*H*0.7 + 50);
                }, i * 65);
            }
            for (let i=0; i&lt;45; i++) {
                setTimeout(() =&gt; {
                    spawnFirework(Math.random()*W, Math.random()*H*0.5 + 30);
                }, 3800 + i * 85);
            }
            setTimeout(() =&gt; {
                speakScoreboard(finalScore, finalRank, finalMessage, finalAccuracy);
            }, 1600);
        }

        function spawnFirework(x, y) {
            const colors = ['#ff4444', '#ffdd44', '#44ff44', '#44ddff', '#ff44ff', '#ffffff', '#ff8800', '#00ffaa', '#a855f7'];
            for (let i=0; i&lt;55; i++) {
                const angle = Math.random() * 2 * Math.PI;
                const speed = Math.random() * 7 + 2;
                const color = colors[Math.floor(Math.random() * colors.length)];
                fireworks.push({
                    x, y,
                    vx: Math.cos(angle) * speed,
                    vy: Math.sin(angle) * speed - 1,
                    life: 1,
                    decay: Math.random() * 0.015 + 0.006,
                    size: Math.random() * 5 + 2,
                    color: color,
                    isConfetti: false
                });
            }
            for (let i=0; i&lt;30; i++) {
                const angle = Math.random() * 2 * Math.PI;
                const speed = Math.random() * 4 + 1;
                const color = colors[Math.floor(Math.random() * colors.length)];
                fireworks.push({
                    x, y,
                    vx: Math.cos(angle) * speed + (Math.random()-0.5)*2,
                    vy: Math.sin(angle) * speed - 2.5,
                    life: 1,
                    decay: Math.random() * 0.01 + 0.004,
                    size: Math.random() * 9 + 4,
                    color: color,
                    isConfetti: true
                });
            }
        }

        function updateUI() {
            levelIndicator.textContent = `⚡ Level ${currentLevel+1}`;
            scoreIndicator.textContent = `⭐ ${Math.round(score)} / ${MAX_SCORE}`;
            playerNameDisplay.textContent = `&#127993; ${userName}`;
        }

        function drawArcher() {
            const ax = archer.x, ay = archer.y;
            ctx.shadowBlur = 20;
            ctx.shadowColor = '#00aaff66';
            // Kaki
            ctx.fillStyle = '#1a3a5a';
            ctx.fillRect(ax-8, ay+10, 6, 14);
            ctx.fillRect(ax+2, ay+10, 6, 14);
            // Badan
            ctx.fillStyle = '#2a5a7a';
            ctx.beginPath();
            ctx.ellipse(ax, ay-4, 16, 22, 0, 0, Math.PI*2);
            ctx.fill();
            // Kepala
            ctx.fillStyle = '#f0d8b0';
            ctx.beginPath();
            ctx.arc(ax, ay-28, 14, 0, Math.PI*2);
            ctx.fill();
            // Rambut
            ctx.fillStyle = '#4a3a2a';
            ctx.beginPath();
            ctx.arc(ax, ay-34, 14, Math.PI, 2*Math.PI);
            ctx.fill();
            
            // Busur - arah ke target (mouse)
            const bowAngle = Math.atan2(mouseY - ay, mouseX - ax);
            const bowLen = 38;
            ctx.strokeStyle = '#c8a060';
            ctx.lineWidth = 3;
            ctx.shadowBlur = 15;
            ctx.shadowColor = '#ffdd44aa';
            ctx.beginPath();
            ctx.arc(ax + 16, ay - 4, bowLen, bowAngle - 0.7, bowAngle + 0.7);
            ctx.stroke();
            // Tali busur
            ctx.strokeStyle = '#aaaacc';
            ctx.lineWidth = 1.5;
            const endAngle1 = bowAngle - 0.7;
            const endAngle2 = bowAngle + 0.7;
            const ex1 = ax + 16 + Math.cos(endAngle1) * bowLen;
            const ey1 = ay - 4 + Math.sin(endAngle1) * bowLen;
            const ex2 = ax + 16 + Math.cos(endAngle2) * bowLen;
            const ey2 = ay - 4 + Math.sin(endAngle2) * bowLen;
            ctx.beginPath();
            ctx.moveTo(ex1, ey1);
            ctx.lineTo(ax + 16 + Math.cos(bowAngle) * 10, ay - 4 + Math.sin(bowAngle) * 10);
            ctx.lineTo(ex2, ey2);
            ctx.stroke();
            ctx.shadowBlur = 0;
            
            // Panah aktif
            if (arrow.active) {
                ctx.save();
                ctx.translate(arrow.x, arrow.y);
                ctx.rotate(arrow.angle);
                ctx.shadowBlur = 20;
                ctx.shadowColor = '#00ffaa88';
                ctx.strokeStyle = '#ddaa88';
                ctx.lineWidth = 2.5;
                ctx.beginPath();
                ctx.moveTo(0, 0);
                ctx.lineTo(25, 0);
                ctx.stroke();
                ctx.fillStyle = '#ffdd44';
                ctx.shadowColor = '#ffdd44aa';
                ctx.beginPath();
                ctx.moveTo(28, 0);
                ctx.lineTo(20, -5);
                ctx.lineTo(20, 5);
                ctx.closePath();
                ctx.fill();
                ctx.fillStyle = '#ff6666';
                ctx.shadowColor = '#ff666688';
                ctx.beginPath();
                ctx.moveTo(-2, 0);
                ctx.lineTo(-8, -6);
                ctx.lineTo(-8, 6);
                ctx.closePath();
                ctx.fill();
                ctx.restore();
                ctx.shadowBlur = 0;
            }
        }

        function draw() {
            ctx.clearRect(0, 0, W, H);
            // Latar
            ctx.fillStyle = 'rgba(0, 10, 30, 0.3)';
            ctx.fillRect(0, 0, W, H);
            // Grid
            ctx.strokeStyle = '#00aaff20';
            ctx.lineWidth = 0.5;
            for (let i=0; i&lt;W; i+=30) {
                ctx.beginPath();
                ctx.moveTo(i, 0);
                ctx.lineTo(i, H);
                ctx.stroke();
            }
            for (let i=0; i&lt;H; i+=30) {
                ctx.beginPath();
                ctx.moveTo(0, i);
                ctx.lineTo(W, i);
                ctx.stroke();
            }
            ctx.strokeStyle = '#00d4ff15';
            ctx.lineWidth = 1;
            for (let i=0; i&lt;W; i+=80) {
                ctx.beginPath();
                ctx.moveTo(i, 0);
                ctx.lineTo(i+40, H);
                ctx.stroke();
            }
            for (let i=0; i&lt;25; i++) {
                ctx.fillStyle = `rgba(0, 180, 255, ${Math.random()*0.2+0.05})`;
                ctx.beginPath();
                ctx.arc(Math.random()*W, Math.random()*H, Math.random()*2+0.5, 0, Math.PI*2);
                ctx.fill();
            }

            // Gelembung
            bubbles.forEach(b =&gt; {
                if (b.answered) return;
                const gradient = ctx.createRadialGradient(b.x-8, b.y-8, 2, b.x, b.y, b.radius);
                gradient.addColorStop(0, '#80d4ff');
                gradient.addColorStop(0.4, '#0088ff');
                gradient.addColorStop(0.8, '#4a00ff');
                gradient.addColorStop(1, '#1a0066');
                ctx.shadowColor = '#00aaffaa';
                ctx.shadowBlur = 35;
                ctx.beginPath();
                ctx.arc(b.x, b.y, b.radius, 0, 2*Math.PI);
                ctx.fillStyle = gradient;
                ctx.fill();
                ctx.shadowBlur = 0;
                ctx.strokeStyle = '#80d4ff';
                ctx.lineWidth = 2.5;
                ctx.shadowColor = '#00aaff';
                ctx.shadowBlur = 15;
                ctx.stroke();
                ctx.shadowBlur = 0;
                ctx.fillStyle = '#ffffff';
                ctx.shadowColor = '#0044ff';
                ctx.shadowBlur = 10;
                let fontSize = Math.max(10, Math.min(b.radius * 0.3, 15));
                ctx.font = `bold ${fontSize}px 'Segoe UI', Arial, sans-serif`;
                const maxChars = Math.floor((b.radius * 2 * 0.6) / (fontSize * 0.6));
                const lines = wrapTextForBubble(b.fullText, maxChars);
                const lineHeight = fontSize * 1.25;
                const totalHeight = lines.length * lineHeight;
                if (totalHeight &gt; b.radius * 1.6) {
                    const newSize = Math.floor(fontSize * (b.radius * 1.6 / totalHeight));
                    fontSize = Math.max(8, Math.min(newSize, 14));
                    ctx.font = `bold ${fontSize}px 'Segoe UI', Arial, sans-serif`;
                }
                const finalLines = wrapTextForBubble(b.fullText, Math.floor((b.radius * 2 * 0.65) / (fontSize * 0.6)));
                const finalLineHeight = fontSize * 1.2;
                const startY = b.y - ((finalLines.length - 1) * finalLineHeight / 2);
                ctx.textAlign = 'center';
                ctx.textBaseline = 'middle';
                for (let i = 0; i &lt; finalLines.length; i++) {
                    ctx.fillText(finalLines[i], b.x, startY + i * finalLineHeight);
                }
                ctx.shadowBlur = 0;
                b.x += b.vx;
                b.y += b.vy;
                if (b.x &lt; b.radius + 20 || b.x &gt; W - b.radius - 10) b.vx *= -1;
                if (b.y &lt; b.radius + 20 || b.y &gt; H - b.radius - 80) b.vy *= -1;
                b.x = Math.min(Math.max(b.x, b.radius+20), W - b.radius - 10);
                b.y = Math.min(Math.max(b.y, b.radius+20), H - b.radius - 80);
            });

            // Update panah
            if (arrow.active) {
                updateArrow();
            }
            if (arrowCooldown &gt; 0) arrowCooldown--;

            // Gerakkan pemanah horizontal mengikuti mouse (di bawah)
            if (gameActive) {
                const targetX = Math.min(Math.max(mouseX, 30), W - 30);
                archer.x += (targetX - archer.x) * 0.08;
                // Pemanah tetap di bawah
                archer.y = H - 70;
            }

            // Gambar pemanah
            drawArcher();

            // Partikel
            for (let i=particles.length-1; i&gt;=0; i--) {
                const p = particles[i];
                p.x += p.vx;
                p.y += p.vy;
                p.life -= p.decay;
                p.vy += 0.05;
                if (p.life &lt;= 0) { particles.splice(i,1); continue; }
                ctx.globalAlpha = p.life;
                ctx.fillStyle = p.color;
                ctx.shadowBlur = 10;
                ctx.shadowColor = p.color;
                ctx.beginPath();
                ctx.arc(p.x, p.y, p.size * p.life, 0, Math.PI*2);
                ctx.fill();
                ctx.shadowBlur = 0;
            }
            ctx.globalAlpha = 1;

            // Fireworks
            for (let i=fireworks.length-1; i&gt;=0; i--) {
                const f = fireworks[i];
                f.x += f.vx;
                f.y += f.vy;
                f.vy += 0.04;
                f.life -= f.decay;
                if (f.life &lt;= 0) { fireworks.splice(i,1); continue; }
                ctx.globalAlpha = f.life;
                ctx.fillStyle = f.color;
                ctx.shadowBlur = 18;
                ctx.shadowColor = f.color;
                if (f.isConfetti) {
                    ctx.save();
                    ctx.translate(f.x, f.y);
                    ctx.rotate(f.life * 12);
                    ctx.fillRect(-f.size/2, -f.size/2, f.size * f.life, f.size * f.life * 0.5);
                    ctx.restore();
                } else {
                    ctx.beginPath();
                    ctx.arc(f.x, f.y, f.size * f.life, 0, Math.PI*2);
                    ctx.fill();
                }
                ctx.shadowBlur = 0;
            }
            ctx.globalAlpha = 1;
        }

        function gameLoop() {
            draw();
            animationFrame = requestAnimationFrame(gameLoop);
        }

        // Event listeners
        canvasEl.addEventListener('click', (e) =&gt; {
            const rect = canvasEl.getBoundingClientRect();
            const scaleX = canvas.width / rect.width;
            const scaleY = canvas.height / rect.height;
            const x = (e.clientX - rect.left) * scaleX;
            const y = (e.clientY - rect.top) * scaleY;
            shootArrow(x, y);
        });

        canvasEl.addEventListener('touchstart', (e) =&gt; {
            e.preventDefault();
            const rect = canvasEl.getBoundingClientRect();
            const touch = e.touches[0];
            const scaleX = canvas.width / rect.width;
            const scaleY = canvas.height / rect.height;
            const x = (touch.clientX - rect.left) * scaleX;
            const y = (touch.clientY - rect.top) * scaleY;
            shootArrow(x, y);
        }, { passive: false });

        canvasEl.addEventListener('mousemove', (e) =&gt; {
            const rect = canvasEl.getBoundingClientRect();
            const scaleX = canvas.width / rect.width;
            const scaleY = canvas.height / rect.height;
            mouseX = (e.clientX - rect.left) * scaleX;
            mouseY = (e.clientY - rect.top) * scaleY;
        });

        speechBtn.addEventListener('click', () =&gt; {
            speakScoreboard(finalScore, finalRank, finalMessage, finalAccuracy);
        });

        function startGame() {
            const nameInput = document.getElementById('playerNameInput');
            userName = nameInput.value.trim() || "User";
            playerNameDisplay.textContent = `&#127993; ${userName}`;
            entryScreen.style.display = 'none';
            congratsOverlay.classList.remove('show');
            score = 0;
            totalAttempts = 0;
            correctAttempts = 0;
            currentLevel = 0;
            gameActive = true;
            isCelebrating = false;
            particles = [];
            fireworks = [];
            arrow.active = false;
            if (speechSynth.speaking) speechSynth.cancel();
            loadLevel(0);
            updateUI();
            if (animationFrame) cancelAnimationFrame(animationFrame);
            gameLoop();
        }

        document.getElementById('startGameBtn').addEventListener('click', startGame);
        document.getElementById('restartFromCongratsBtn').addEventListener('click', () =&gt; {
            congratsOverlay.classList.remove('show');
            startGame();
        });
        loadLeaderboard();
        loadLevel(0);
        updateUI();
        qNumberDisplay.textContent = '&#127993;';
        qTextDisplay.textContent = 'Masukkan nama User &amp; tekan MULAI';
        gameLoop();

        window.addEventListener('resize', () =&gt; {
            resizeCanvas();
        });
    })();
&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;

&lt;h3 dir="ltr" style="line-height: 1.7999999999999998; margin-bottom: 12pt; margin-top: 24pt; text-align: justify;"&gt;&lt;span style="color: #0f1115; font-family: Roboto; font-size: 15pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;"&gt;Fitur Game &amp;amp; Interaksi&lt;/span&gt;&lt;/h3&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt; text-align: justify;"&gt;&lt;span style="color: #0f1115; font-family: Roboto; font-size: 12pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;"&gt;Game ini menguji pemahaman Anda tentang budaya 5S (Senyum, Salam, Sapa, Sopan, Santun) melalui pertanyaan yang disesuaikan dengan dokumen. Berikut cara bermainnya:&lt;/span&gt;&lt;/p&gt;&lt;ol style="margin-bottom: 0; margin-top: 0; padding-inline-start: 20px;"&gt;&lt;li aria-level="1" dir="ltr" style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; list-style-type: decimal; margin-left: 7.5pt; vertical-align: baseline; white-space: pre;"&gt;&lt;p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 12pt; text-align: justify;"&gt;&lt;span style="color: #0f1115; font-family: Roboto; font-size: 12pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;"&gt;Mulai Permainan: Masukkan nama Anda di layar awal, lalu tekan tombol MULAI.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level="1" dir="ltr" style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; list-style-type: decimal; margin-left: 7.5pt; vertical-align: baseline; white-space: pre;"&gt;&lt;p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 17pt; text-align: justify;"&gt;&lt;span style="color: #0f1115; font-family: Roboto; font-size: 12pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;"&gt;Menembak Gelembung: Klik atau tap gelembung yang berisi jawaban lengkap untuk pertanyaan yang muncul di panel bawah. Gelembung bergerak liar untuk menambah tantangan.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level="1" dir="ltr" style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; list-style-type: decimal; margin-left: 7.5pt; vertical-align: baseline; white-space: pre;"&gt;&lt;p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 17pt; text-align: justify;"&gt;&lt;span style="color: #0f1115; font-family: Roboto; font-size: 12pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;"&gt;Skor &amp;amp; Level: Setiap jawaban benar menambah skor. Selesaikan 10 pertanyaan di setiap level untuk maju ke level berikutnya secara otomatis.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level="1" dir="ltr" style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; list-style-type: decimal; margin-left: 7.5pt; vertical-align: baseline; white-space: pre;"&gt;&lt;p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 17pt; text-align: justify;"&gt;&lt;span style="color: #0f1115; font-family: Roboto; font-size: 12pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;"&gt;Efek &amp;amp; Penghargaan: Saat menjawab benar, akan ada efek ledakan kecil. Di akhir semua level, Anda akan melihat kembang api dan confetti yang meriah, serta pesan personal dan predikat (dari "Perlu Belajar Lagi" hingga "Sahabat-5S Sejati") berdasarkan skor akhir. Skor terbaik tersimpan di Leaderboard.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-left: 15pt; margin-top: 17pt; text-align: center;"&gt;&lt;span style="color: #0f1115; font-family: Roboto; font-size: 12pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;"&gt;===SELAMAT BELAJAR DAN BERMAIN===&lt;/span&gt;&lt;/p&gt;
</description><link>http://kitab-investasi.blogspot.com/2026/07/arrow-smart-5s.html</link><thr:total>0</thr:total><author>nof_rizal07@yahoo.co.id (abang_cool)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-9000860041661554971.post-2423197301995743389</guid><pubDate>Thu, 02 Jul 2026 08:28:30 +0000</pubDate><atom:updated>2026-07-06T08:32:02.258+07:00</atom:updated><title>SMART - 5S</title><description>&lt;h3 class="zfr3Q OmQG5e CDt4Ke " dir="ltr" id="h.rynhxzbq5vo2_l" style="border-color: currentcolor; border-style: none; border-width: medium; box-sizing: border-box; color: #857251; font-family: Roboto, sans-serif; font-size: 13pt; font-variant-ligatures: none; letter-spacing: 1px; line-height: 1.8; margin: 24pt 0px 12pt; outline: none; padding: 0pt; pointer-events: none; position: relative; text-align: justify; text-decoration-line: inherit;"&gt;&lt;div class="CjVfdc" jsaction="touchstart:UrsOsc; click:KjsqPd; focusout:QZoaZ; mouseover:y0pDld; mouseout:dq0hvd;fv1Rjc:jbFSOd;CrfLRd:SzACGe;" jscontroller="Ae65rd" style="box-sizing: border-box; display: inline-block; max-width: 100%; pointer-events: all; position: relative;"&gt;&lt;span class="C9DxTc " style="box-sizing: border-box; color: #0f1115; font-family: Roboto, Arial; font-size: 15pt; vertical-align: baseline;"&gt;Fitur Game &amp;amp; Interaksi&lt;/span&gt;&lt;/div&gt;&lt;/h3&gt;&lt;p class="zfr3Q CDt4Ke " dir="ltr" style="border-color: currentcolor; border-style: none; border-width: medium; box-sizing: border-box; color: #212121; font-family: &amp;quot;Open Sans&amp;quot;, sans-serif; font-size: 16px; font-variant-ligatures: none; line-height: 1.38; margin: 12pt 0px; outline: none; padding: 0pt; position: relative; text-align: justify; text-decoration-line: inherit;"&gt;&lt;span class="C9DxTc " style="box-sizing: border-box; color: #0f1115; font-family: Roboto, Arial;"&gt;Game ini menguji pemahaman Anda tentang budaya 5S (Senyum, Salam, Sapa, Sopan, Santun) melalui pertanyaan yang disesuaikan dengan dokumen. Berikut cara bermainnya:&lt;/span&gt;&lt;/p&gt;&lt;ol class="n8H08c BKnRcf " style="box-sizing: border-box; font-family: sans-serif; font-size: 16px; margin: 6px 0px 0px; padding: 0px;"&gt;&lt;li class="zfr3Q TYR86d lsiHE " dir="ltr" style="box-sizing: border-box; color: #212121; font-family: &amp;quot;Open Sans&amp;quot;, sans-serif; font-size: 12pt; font-style: inherit; font-variant-ligatures: none; line-height: 1.56; margin: 0px 0px 0px 15pt; outline: none; padding-top: 0px; position: relative; text-decoration: inherit;"&gt;&lt;p class="zfr3Q CDt4Ke " dir="ltr" role="presentation" style="border-color: currentcolor; border-style: none; border-width: medium; box-sizing: border-box; font-size: 12pt; font-style: inherit; line-height: 1.38; margin: 12pt 0px 0pt 0pt; outline: none; padding: 0pt; position: relative; text-align: justify; text-decoration: inherit; text-indent: 0pt;"&gt;&lt;span class="C9DxTc " style="box-sizing: border-box; color: #0f1115; font-family: Roboto, Arial;"&gt;Mulai Permainan: Masukkan nama Anda di layar awal, lalu tekan tombol MULAI.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li class="zfr3Q TYR86d lsiHE " dir="ltr" style="box-sizing: border-box; color: #212121; font-family: &amp;quot;Open Sans&amp;quot;, sans-serif; font-size: 12pt; font-style: inherit; font-variant-ligatures: none; line-height: 1.56; margin: 6px 0px 0px 15pt; outline: none; position: relative; text-decoration: inherit;"&gt;&lt;p class="zfr3Q CDt4Ke " dir="ltr" role="presentation" style="border-color: currentcolor; border-style: none; border-width: medium; box-sizing: border-box; font-size: 12pt; font-style: inherit; line-height: 1.38; margin: 17pt 0px 0pt 0pt; outline: none; padding: 0pt; position: relative; text-align: justify; text-decoration: inherit; text-indent: 0pt;"&gt;&lt;span class="C9DxTc " style="box-sizing: border-box; color: #0f1115; font-family: Roboto, Arial;"&gt;Menembak Gelembung: Klik atau tap gelembung yang berisi jawaban lengkap untuk pertanyaan yang muncul di panel bawah. Gelembung bergerak liar untuk menambah tantangan.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li class="zfr3Q TYR86d lsiHE " dir="ltr" style="box-sizing: border-box; color: #212121; font-family: &amp;quot;Open Sans&amp;quot;, sans-serif; font-size: 12pt; font-style: inherit; font-variant-ligatures: none; line-height: 1.56; margin: 6px 0px 0px 15pt; outline: none; position: relative; text-decoration: inherit;"&gt;&lt;p class="zfr3Q CDt4Ke " dir="ltr" role="presentation" style="border-color: currentcolor; border-style: none; border-width: medium; box-sizing: border-box; font-size: 12pt; font-style: inherit; line-height: 1.38; margin: 17pt 0px 0pt 0pt; outline: none; padding: 0pt; position: relative; text-align: justify; text-decoration: inherit; text-indent: 0pt;"&gt;&lt;span class="C9DxTc " style="box-sizing: border-box; color: #0f1115; font-family: Roboto, Arial;"&gt;Skor &amp;amp; Level: Setiap jawaban benar menambah skor. Selesaikan 10 pertanyaan di setiap level untuk maju ke level berikutnya secara otomatis.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li class="zfr3Q TYR86d lsiHE " dir="ltr" style="box-sizing: border-box; color: #212121; font-family: &amp;quot;Open Sans&amp;quot;, sans-serif; font-size: 12pt; font-style: inherit; font-variant-ligatures: none; line-height: 1.56; margin: 6px 0px 0px 15pt; outline: none; padding-bottom: 0px; position: relative; text-decoration: inherit;"&gt;&lt;p class="zfr3Q CDt4Ke " dir="ltr" role="presentation" style="border-color: currentcolor; border-style: none; border-width: medium; box-sizing: border-box; font-size: 12pt; font-style: inherit; line-height: 1.38; margin: 17pt 0px 0pt 0pt; outline: none; padding: 0pt; position: relative; text-align: justify; text-decoration: inherit; text-indent: 0pt;"&gt;&lt;span class="C9DxTc " style="box-sizing: border-box; color: #0f1115; font-family: Roboto, Arial;"&gt;Efek &amp;amp; Penghargaan: Saat menjawab benar, akan ada efek ledakan kecil. Di akhir semua level, Anda akan melihat kembang api dan confetti yang meriah, serta pesan personal dan predikat (dari "Perlu Belajar Lagi" hingga "Sahabat-5S Sejati") berdasarkan skor akhir. Skor terbaik tersimpan di Leaderboard.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;
&lt;html lang="id"&gt;
&lt;head&gt;
    &lt;meta charset="UTF-8"&gt;&lt;/meta&gt;
    &lt;meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" name="viewport"&gt;&lt;/meta&gt;
    &lt;title&gt;SMART-5S Bubble Blaster&lt;/title&gt;
    &lt;style&gt;
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
            user-select: none;
        }
        body {
            background: #0a0e1a;
            min-height: 100vh;
            display: flex;
            justify-content: center;
            align-items: center;
            font-family: 'Segoe UI', 'Arial', sans-serif;
        }
        #game-wrapper {
            width: 100%;
            max-width: 800px;
            height: 100vh;
            max-height: 900px;
            background: radial-gradient(circle at 30% 20%, #0d1b2a, #050a14);
            box-shadow: 0 0 50px #00d4ff40, 0 0 120px #0055ff20;
            border-radius: 32px;
            padding: 16px;
            display: flex;
            flex-direction: column;
            position: relative;
            overflow: hidden;
            border: 1px solid #00d4ff60;
        }
        #header {
            display: flex;
            justify-content: space-between;
            align-items: center;
            padding: 6px 12px;
            color: #a8e6ff;
            font-weight: bold;
            background: rgba(0, 20, 40, 0.6);
            backdrop-filter: blur(4px);
            border-radius: 60px;
            border: 1px solid #00d4ff80;
            margin-bottom: 10px;
            flex-shrink: 0;
        }
        #header span {
            background: #0a1a2e;
            padding: 4px 16px;
            border-radius: 40px;
            border: 1px solid #00d4ff;
            font-size: 0.9rem;
            letter-spacing: 1px;
        }
        #level-indicator { background: #0a1a2e; color: #7ad0ff; border-color: #00aaff; }
        #score-indicator { color: #facc15; border-color: #facc15; }
        #player-name-display { color: #7ad0ff; border-color: #00aaff; }
        #game-canvas-container {
            flex: 1;
            position: relative;
            background: transparent;
            border-radius: 24px;
            overflow: hidden;
            min-height: 300px;
            border: 1px solid #00d4ff40;
            box-shadow: inset 0 0 60px #0044aa30;
        }
        canvas {
            display: block;
            width: 100%;
            height: 100%;
            background: transparent;
            cursor: crosshair;
        }
        #question-panel {
            background: rgba(0, 16, 32, 0.85);
            backdrop-filter: blur(8px);
            border: 1px solid #00d4ff;
            border-radius: 40px;
            padding: 14px 20px;
            margin-top: 10px;
            color: #e6f7ff;
            font-weight: 600;
            font-size: clamp(1rem, 2.8vw, 1.3rem);
            text-align: left;
            box-shadow: 0 0 40px #0066ff44;
            flex-shrink: 0;
            min-height: 76px;
            display: flex;
            align-items: center;
            line-height: 1.5;
        }
        #question-panel .q-number {
            color: #00d4ff;
            font-weight: 800;
            margin-right: 12px;
            white-space: nowrap;
            text-shadow: 0 0 12px #00aaff;
        }
        #question-panel .q-text {
            color: #ffffff;
            font-weight: 700;
            text-shadow: 0 0 8px rgba(0, 180, 255, 0.3);
        }
        #entry-screen {
            position: absolute;
            inset: 0;
            z-index: 20;
            background: rgba(0, 6, 16, 0.92);
            backdrop-filter: blur(12px);
            display: flex;
            flex-direction: column;
            justify-content: center;
            align-items: center;
            gap: 30px;
            border-radius: 32px;
            padding: 20px;
        }
        #entry-screen h1 {
            font-size: 2.6rem;
            color: #7ad0ff;
            text-shadow: 0 0 40px #00aaff, 0 0 100px #0055ff;
            letter-spacing: 4px;
            font-weight: 800;
        }
        #entry-screen input {
            background: #0a1a2e;
            border: 2px solid #00d4ff;
            border-radius: 60px;
            padding: 16px 24px;
            width: 80%;
            max-width: 340px;
            font-size: 1.3rem;
            color: #d6f0ff;
            text-align: center;
            outline: none;
            box-shadow: 0 0 40px #0066ff55;
        }
        #entry-screen input::placeholder { color: #4a7a9a; }
        .cyber-btn {
            background: linear-gradient(145deg, #0a2a4a, #06152a);
            border: 1px solid #00d4ff;
            color: #d6f0ff;
            padding: 16px 48px;
            border-radius: 60px;
            font-size: 1.6rem;
            font-weight: bold;
            letter-spacing: 3px;
            box-shadow: 0 0 40px #00aaffaa, inset 0 0 20px #00aaff44;
            transition: 0.2s;
            cursor: pointer;
            backdrop-filter: blur(4px);
        }
        .cyber-btn:active { transform: scale(0.93); box-shadow: 0 0 80px #00d4ff; }
        #congrats-overlay {
            position: absolute;
            inset: 0;
            z-index: 30;
            background: rgba(0, 4, 16, 0.85);
            backdrop-filter: blur(8px);
            border-radius: 32px;
            display: none;
            flex-direction: column;
            justify-content: center;
            align-items: center;
            padding: 20px;
            text-align: center;
            color: #fff;
        }
        #congrats-overlay.show { display: flex; }
        .congrats-box {
            background: rgba(0, 16, 32, 0.8);
            border: 2px solid #00d4ff;
            border-radius: 60px;
            padding: 30px 20px;
            max-width: 420px;
            width: 100%;
            box-shadow: 0 0 80px #0066ff88, inset 0 0 30px #00aaff44;
            backdrop-filter: blur(8px);
            position: relative;
            z-index: 5;
        }
        .congrats-box .user-name {
            font-size: 1.4rem;
            color: #7ad0ff;
            margin-bottom: 8px;
            text-shadow: 0 0 20px #00aaff;
        }
        .congrats-box .user-name i {
            font-style: normal;
            background: rgba(0,180,255,0.15);
            padding: 2px 14px;
            border-radius: 30px;
            border: 1px solid #00aaff44;
        }
        .congrats-box h2 {
            font-size: 2.4rem;
            margin-bottom: 6px;
            color: #facc15;
            text-shadow: 0 0 30px #facc15aa;
        }
        .congrats-box .rank {
            font-size: 2rem;
            font-weight: 800;
            background: linear-gradient(45deg, #7ad0ff, #00aaff, #a855f7);
            -webkit-background-clip: text;
            -webkit-text-fill-color: transparent;
            margin: 10px 0;
            text-shadow: 0 0 40px #00aaff55;
        }
        .congrats-box .final-score {
            font-size: 1.8rem;
            color: #7ad0ff;
            text-shadow: 0 0 20px #00aaff66;
        }
        .congrats-box .final-score span {
            color: #facc15;
            font-weight: 800;
            text-shadow: 0 0 20px #facc1566;
        }
        .congrats-box .message {
            font-size: 1.2rem;
            color: #c8e6ff;
            margin: 16px 0;
            background: rgba(0, 180, 255, 0.1);
            padding: 10px 16px;
            border-radius: 30px;
            border: 1px solid #00aaff44;
        }
        .congrats-box .stats-grid {
            display: flex;
            justify-content: center;
            gap: 20px;
            margin: 12px 0;
            font-size: 0.9rem;
            color: #7ad0ff;
        }
        .congrats-box .stats-grid span {
            background: rgba(0, 20, 50, 0.5);
            padding: 4px 14px;
            border-radius: 20px;
            border: 1px solid #00aaff33;
        }
        .small-btn {
            background: #0a2a4a;
            border: 1px solid #00d4ff;
            color: #d6f0ff;
            padding: 12px 30px;
            border-radius: 60px;
            font-size: 1.2rem;
            margin-top: 12px;
            cursor: pointer;
            transition: 0.2s;
            box-shadow: 0 0 20px #00aaff33;
        }
        .small-btn:active { transform: scale(0.92); }
        #speech-btn {
            background: rgba(0, 180, 255, 0.15);
            border: 1px solid #00d4ff;
            color: #7ad0ff;
            padding: 8px 20px;
            border-radius: 40px;
            font-size: 0.9rem;
            cursor: pointer;
            margin-top: 6px;
            transition: 0.2s;
            box-shadow: 0 0 15px #00aaff22;
        }
        #speech-btn:hover { background: rgba(0, 180, 255, 0.3); }
        #speech-btn:active { transform: scale(0.95); }
        #leaderboard {
            position: absolute;
            bottom: 10px;
            right: 16px;
            background: #0a1218cc;
            backdrop-filter: blur(8px);
            padding: 10px 18px;
            border-radius: 40px;
            border: 1px solid #00d4ff;
            color: #7ad0ff;
            font-size: 0.8rem;
            max-width: 200px;
            max-height: 120px;
            overflow-y: auto;
            z-index: 10;
        }
        #leaderboard div { display: flex; justify-content: space-between; gap: 10px; border-bottom: 1px solid #00d4ff40; padding: 2px 0; }
        .lb-score { color: #facc15; }
        /* Icon IT style */
        .it-icon { filter: drop-shadow(0 0 8px #00aaff66); }
        @media (max-width: 500px) {
            #header span { font-size: 0.7rem; padding: 2px 10px; }
            #entry-screen h1 { font-size: 2rem; }
            #question-panel { font-size: clamp(0.8rem, 2.5vw, 1rem); padding: 10px 14px; min-height: 64px; }
            .congrats-box { padding: 20px 14px; }
            .congrats-box h2 { font-size: 1.8rem; }
            .congrats-box .rank { font-size: 1.5rem; }
        }
    &lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;div id="game-wrapper"&gt;
    &lt;div id="header"&gt;
        &lt;span id="player-name-display"&gt;&#128187; User&lt;/span&gt;
        &lt;span id="level-indicator"&gt;⚡ Level 1&lt;/span&gt;
        &lt;span id="score-indicator"&gt;⭐ 0&lt;/span&gt;
    &lt;/div&gt;

    &lt;div id="game-canvas-container"&gt;
        &lt;canvas height="600" id="gameCanvas" width="800"&gt;&lt;/canvas&gt;

        &lt;div id="entry-screen"&gt;
            &lt;h1&gt;&#128640; SMART-5S&lt;/h1&gt;
            &lt;input id="playerNameInput" maxlength="16" placeholder="Nama User" type="text" /&gt;
            &lt;button class="cyber-btn" id="startGameBtn"&gt;▶ MULAI&lt;/button&gt;
            &lt;div style="color: #4a7a9a; font-size: 0.8rem;"&gt;Tembak gelembung jawaban benar!&lt;/div&gt;
        &lt;/div&gt;

        &lt;div id="congrats-overlay"&gt;
            &lt;div class="congrats-box"&gt;
                &lt;div class="user-name"&gt;&#128100; &lt;i id="userNameDisplay"&gt;User&lt;/i&gt;&lt;/div&gt;
                &lt;h2&gt;&#127937; MISI SELESAI&lt;/h2&gt;
                &lt;div class="rank" id="rankDisplay"&gt;SMART-5S Master&lt;/div&gt;
                &lt;div class="final-score"&gt;Skor Akhir: &lt;span id="finalScoreDisplay"&gt;0&lt;/span&gt;&lt;/div&gt;
                &lt;div class="stats-grid"&gt;
                    &lt;span id="levelCompleteDisplay"&gt;Level: 5/5&lt;/span&gt;
                    &lt;span id="accuracyDisplay"&gt;Akurasi: 0%&lt;/span&gt;
                &lt;/div&gt;
                &lt;div class="message" id="personalMessage"&gt;Hebat, User!&lt;/div&gt;
                &lt;button id="speech-btn"&gt;&#128266; Dengarkan Laporan&lt;/button&gt;
                &lt;button class="small-btn" id="restartFromCongratsBtn"&gt;&#128260; Misi Ulang&lt;/button&gt;
            &lt;/div&gt;
        &lt;/div&gt;

        &lt;div id="leaderboard"&gt;
            &lt;div style="color: #facc15; font-weight: bold;"&gt;&#127942; LEADERBOARD&lt;/div&gt;
            &lt;div id="lbEntries"&gt;&lt;div style="color: #4a7a9a;"&gt;Belum ada data&lt;/div&gt;&lt;/div&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div id="question-panel"&gt;
        &lt;span class="q-number" id="qNumberDisplay"&gt;1.&lt;/span&gt;
        &lt;span class="q-text" id="qTextDisplay"&gt;Tekan mulai &amp;amp; tembak gelembung&lt;/span&gt;
    &lt;/div&gt;
&lt;/div&gt;

&lt;script&gt;
    (function(){
        // ----- BANK PERTANYAAN SMART-5S (Senyum, Salam, Sapa, Sopan, Santun) -----
        const LEVELS = 5;
        const QUESTIONS_PER_LEVEL = 10;

        const QUESTION_BANK = [
            // Level 1: Senyum
            [
                { q: "Apa makna dari Senyum dalam SMART-5S?", options: ["Ekspresi wajah yang menunjukkan keramahan dan kebaikan hati", "Tersenyum sinis kepada orang lain", "Menertawakan orang lain", "Muka cemberut", "Acuh tak acuh"], correct: 0 },
                { q: "Bagaimana penerapan Senyum yang benar?", options: ["Memberikan senyuman tulus saat kontak mata", "Tersenyum hanya jika dipaksa", "Tersenyum kepada teman saja", "Tersenyum tanpa alasan", "Tersenyum hanya di foto"], correct: 0 },
                { q: "Apa manfaat utama dari Senyum?", options: ["Mempererat hubungan dan menciptakan suasana hangat", "Menakut-nakuti orang lain", "Menunjukkan kesombongan", "Membuat orang lain cemburu", "Menghindari interaksi"], correct: 0 },
                { q: "Senyum yang tulus mencerminkan...", options: ["Kebaikan hati", "Kepalsuan", "Kesombongan", "Keangkuhan", "Ketakutan"], correct: 0 },
                { q: "Senyum dapat membuat orang lain merasa...", options: ["Dihargai dan nyaman", "Takut", "Bosan", "Tersinggung", "Marah"], correct: 0 },
                { q: "Senyum adalah bahasa...", options: ["Universal", "Tertutup", "Individual", "Egois", "Sulit"], correct: 0 },
                { q: "Apa yang dimaksud dengan 'senyum tulus'?", options: ["Senyum yang datang dari hati", "Senyum yang dibuat-buat", "Senyum sinis", "Senyum mengejek", "Senyum terpaksa"], correct: 0 },
                { q: "Senyum dapat mengurangi...", options: ["Ketegangan dan stres", "Kebahagiaan", "Pertemanan", "Kerukunan", "Semangat"], correct: 0 },
                { q: "Kapan sebaiknya kita memberikan senyum?", options: ["Saat bertemu atau memulai percakapan", "Hanya saat senang", "Hanya saat dipaksa", "Tidak perlu tersenyum", "Saat sendirian"], correct: 0 },
                { q: "Senyum dalam SMART-5S bertujuan untuk...", options: ["Membuka komunikasi yang hangat", "Menutup komunikasi", "Membuat orang lain takut", "Menunjukkan kekuasaan", "Mengasingkan diri"], correct: 0 }
            ],
            // Level 2: Salam
            [
                { q: "Apa makna dari Salam dalam SMART-5S?", options: ["Ungkapan atau gestur untuk menyapa dan memberi penghormatan", "Hanya melambaikan tangan", "Mengangguk saja", "Tidak perlu menyapa", "Mengabaikan orang lain"], correct: 0 },
                { q: "Contoh penerapan Salam yang benar adalah...", options: ["Mengucapkan 'Assalamu'alaikum' atau 'Selamat pagi'", "Hanya melambaikan tangan", "Mengangguk tanpa kata", "Tidak mengucapkan apa-apa", "Menghindari kontak"], correct: 0 },
                { q: "Apa manfaat dari Salam?", options: ["Memberi kesan positif dan mengurangi jarak emosional", "Menakut-nakuti", "Membuat orang lain risih", "Menunjukkan kekuasaan", "Mengasingkan diri"], correct: 0 },
                { q: "Salam yang diajarkan dalam SMART-5S adalah...", options: ["Assalamu'alaikum", "Halo", "Hey", "Apa kabar", "Selamat pagi"], correct: 0 },
                { q: "Salam adalah doa untuk...", options: ["Keselamatan dan kebaikan", "Kekayaan", "Ketenaran", "Kekuasaan", "Kemenangan"], correct: 0 },
                { q: "Budaya salam mencerminkan...", options: ["Kerendahan hati", "Kesombongan", "Keangkuhan", "Kebencian", "Kecurigaan"], correct: 0 },
                { q: "Mengucapkan salam ketika bertemu guru adalah bentuk...", options: ["Salam (SMART-5S)", "Senyum", "Sapa", "Sopan", "Santun"], correct: 0 },
                { q: "Membalas salam adalah kewajiban...", options: ["Sosial dan agama", "Pribadi", "Hanya untuk teman", "Hanya untuk guru", "Tidak perlu"], correct: 0 },
                { q: "Salam yang baik diiringi dengan...", options: ["Jabat tangan atau mengatupkan tangan di dada", "Diam saja", "Menghindar", "Menatap tajam", "Teriakan"], correct: 0 },
                { q: "Salam dapat membangun...", options: ["Hubungan yang harmonis", "Permusuhan", "Jarak", "Kesalahpahaman", "Konflik"], correct: 0 }
            ],
            // Level 3: Sapa
            [
                { q: "Apa makna dari Sapa dalam SMART-5S?", options: ["Bentuk interaksi untuk menanyakan kabar atau memulai pembicaraan", "Memanggil dengan keras", "Menggodai teman", "Menghindari orang", "Bersikap cuek"], correct: 0 },
                { q: "Contoh penerapan Sapa yang benar adalah...", options: ["'Apa kabar?' atau 'Bagaimana harimu?'", "Memanggil dengan teriakan", "Menghina", "Diam saja", "Acuh tak acuh"], correct: 0 },
                { q: "Apa manfaat dari Sapa?", options: ["Menunjukkan kepedulian dan membangun hubungan akrab", "Menakut-nakuti", "Membuat orang lain bosan", "Menunjukkan kekuasaan", "Mengasingkan diri"], correct: 0 },
                { q: "Sapa yang baik adalah...", options: ["Dengan kata-kata yang santun dan hangat", "Dengan teriakan", "Dengan nada tinggi", "Dengan kata kasar", "Dengan diam saja"], correct: 0 },
                { q: "Sapa dapat mempererat...", options: ["Hubungan pertemanan", "Permusuhan", "Jarak", "Kesalahpahaman", "Konflik"], correct: 0 },
                { q: "Sapa yang akrab membuat orang lain merasa...", options: ["Dihargai dan diperhatikan", "Takut", "Bosan", "Tersinggung", "Marah"], correct: 0 },
                { q: "Sapa yang baik dimulai dengan...", options: ["Senyum dan salam", "Diam", "Menghindar", "Menatap tajam", "Teriakan"], correct: 0 },
                { q: "Sapa membuat suasana menjadi...", options: ["Akrab dan hangat", "Tegang", "Mencekam", "Dingin", "Kaku"], correct: 0 },
                { q: "Setelah memberi salam, langkah selanjutnya adalah...", options: ["Memberikan sapa", "Langsung pergi", "Diam", "Menghindar", "Acuh"], correct: 0 },
                { q: "Sapa menunjukkan...", options: ["Kepedulian dan perhatian", "Keangkuhan", "Kesombongan", "Ketakutan", "Kebencian"], correct: 0 }
            ],
            // Level 4: Sopan
            [
                { q: "Apa makna dari Sopan dalam SMART-5S?", options: ["Sikap menghargai norma sosial, tata krama, dan bahasa yang baik", "Berbicara kasar", "Memotong pembicaraan", "Tidak peduli", "Bersikap angkuh"], correct: 0 },
                { q: "Contoh penerapan Sopan yang benar adalah...", options: ["Menggunakan bahasa tubuh yang menghargai lawan bicara", "Meludah sembarangan", "Memotong pembicaraan", "Menggunakan kata kasar", "Acuh tak acuh"], correct: 0 },
                { q: "Apa manfaat dari Sopan?", options: ["Membuat diri lebih dihargai dan suasana nyaman", "Menakut-nakuti", "Membuat orang lain bosan", "Menunjukkan kekuasaan", "Mengasingkan diri"], correct: 0 },
                { q: "Sopan dalam berbicara berarti...", options: ["Menggunakan kata yang halus", "Berteriak", "Memotong pembicaraan", "Menggunakan kata kasar", "Mengabaikan lawan bicara"], correct: 0 },
                { q: "Sopan santun kepada guru menunjukkan...", options: ["Penghormatan", "Ketakutan", "Keangkuhan", "Kebencian", "Ketidakpedulian"], correct: 0 },
                { q: "Sopan adalah cerminan...", options: ["Karakter mulia", "Kelemahan", "Kesombongan", "Keangkuhan", "Kebodohan"], correct: 0 },
                { q: "Menghargai pendapat teman adalah bentuk...", options: ["Sopan", "Senyum", "Salam", "Sapa", "Santun"], correct: 0 },
                { q: "Sopan dalam berpakaian di sekolah adalah...", options: ["Seragam rapi dan sopan", "Pakaian bebas", "Pakaian ketat", "Pakaian kusut", "Pakaian tidak senonoh"], correct: 0 },
                { q: "Sopan bertujuan untuk...", options: ["Menciptakan interaksi yang nyaman", "Menakut-nakuti", "Menghina", "Mengasingkan", "Membuat kacau"], correct: 0 },
                { q: "Sopan mencerminkan...", options: ["Penghargaan terhadap orang lain", "Keangkuhan", "Kesombongan", "Ketakutan", "Kebencian"], correct: 0 }
            ],
            // Level 5: Santun
            [
                { q: "Apa makna dari Santun dalam SMART-5S?", options: ["Perwujudan kehalusan budi bahasa dan perilaku penuh kelembutan", "Bersikap kasar", "Bersikap sombong", "Menghina orang", "Bersikap acuh"], correct: 0 },
                { q: "Contoh penerapan Santun yang benar adalah...", options: ["Mengucapkan 'Tolong', 'Terima kasih', dan 'Maaf'", "Berbicara kasar", "Menghina teman", "Mengabaikan guru", "Bersikap angkuh"], correct: 0 },
                { q: "Apa manfaat dari Santun?", options: ["Membangun reputasi positif dan memancarkan empati", "Menakut-nakuti", "Membuat orang lain bosan", "Menunjukkan kekuasaan", "Mengasingkan diri"], correct: 0 },
                { q: "Santun dalam berkomunikasi berarti...", options: ["Memilih kata dengan bijak dan nada lembut", "Berteriak", "Memotong pembicaraan", "Menggunakan kata kasar", "Diam saja"], correct: 0 },
                { q: "Budaya santun diajarkan sejak...", options: ["Usia dini", "Dewasa", "Lanjut usia", "Sekolah menengah", "Perguruan tinggi"], correct: 0 },
                { q: "Santun membuat orang lain merasa...", options: ["Nyaman dan dihormati", "Takut", "Bosan", "Tersinggung", "Marah"], correct: 0 },
                { q: "Kebalikan dari santun adalah...", options: ["Kasar dan angkuh", "Ramah", "Baik", "Rendah hati", "Sopan"], correct: 0 },
                { q: "Santun adalah bagian dari...", options: ["Akhlak mulia", "Kelemahan", "Kesombongan", "Keangkuhan", "Kebodohan"], correct: 0 },
                { q: "Penerapan santun di media sosial adalah...", options: ["Berkomentar dengan sopan", "Menyebarkan kebencian", "Menghina orang", "Menggunakan kata kasar", "Mengabaikan etika"], correct: 0 },
                { q: "Santun dalam SMART-5S bertujuan untuk...", options: ["Memancarkan empati dan kedewasaan emosional", "Menakut-nakuti", "Menghina", "Mengasingkan", "Membuat kacau"], correct: 0 }
            ]
        ];

        // ----- STATE -----
        let userName = "User";
        let currentLevel = 0;
        let currentQuestionIndex = 0;
        let score = 0;
        let totalAttempts = 0;
        let correctAttempts = 0;
        let questionsForLevel = [];
        let bubbles = [];
        let gameActive = false;
        let levelCompleted = false;
        let animationFrame = null;
        let canvas, ctx;
        let W, H;
        let shootCooldown = 0;
        let leaderboardData = [];
        let particles = [];
        let fireworks = [];
        let isCelebrating = false;
        let finalScore = 0;
        let finalRank = "";
        let finalMessage = "";
        let finalAccuracy = 0;

        // DOM
        const canvasEl = document.getElementById('gameCanvas');
        const questionPanel = document.getElementById('question-panel');
        const qNumberDisplay = document.getElementById('qNumberDisplay');
        const qTextDisplay = document.getElementById('qTextDisplay');
        const levelIndicator = document.getElementById('level-indicator');
        const scoreIndicator = document.getElementById('score-indicator');
        const playerNameDisplay = document.getElementById('player-name-display');
        const entryScreen = document.getElementById('entry-screen');
        const congratsOverlay = document.getElementById('congrats-overlay');
        const finalScoreSpan = document.getElementById('finalScoreDisplay');
        const rankDisplay = document.getElementById('rankDisplay');
        const personalMessage = document.getElementById('personalMessage');
        const userNameDisplay = document.getElementById('userNameDisplay');
        const levelCompleteDisplay = document.getElementById('levelCompleteDisplay');
        const accuracyDisplay = document.getElementById('accuracyDisplay');
        const lbEntries = document.getElementById('lbEntries');
        const speechBtn = document.getElementById('speech-btn');

        canvas = canvasEl;
        ctx = canvas.getContext('2d');

        // Speech Synthesis
        let speechSynth = window.speechSynthesis;
        let speechUtterance = null;

        function speakScoreboard(score, rank, message, accuracy) {
            if (!window.speechSynthesis) return;
            if (speechSynth.speaking) speechSynth.cancel();
            const text = `Laporan misi untuk User ${userName}. Skor akhir ${score} poin. Predikat ${rank}. Akurasi ${accuracy} persen. ${message}`;
            speechUtterance = new SpeechSynthesisUtterance(text);
            speechUtterance.lang = 'id-ID';
            speechUtterance.rate = 0.85;
            speechUtterance.pitch = 1;
            speechSynth.speak(speechUtterance);
        }

        // ----- GAME FUNCTIONS -----
        function shuffleArray(arr) {
            for (let i = arr.length - 1; i &gt; 0; i--) {
                const j = Math.floor(Math.random() * (i + 1));
                [arr[i], arr[j]] = [arr[j], arr[i]];
            }
            return arr;
        }

        function loadLeaderboard() {
            try {
                const data = localStorage.getItem('smart5s_leaderboard');
                if (data) leaderboardData = JSON.parse(data);
                else leaderboardData = [];
            } catch(e){ leaderboardData = []; }
            renderLeaderboard();
        }
        function saveLeaderboard() {
            localStorage.setItem('smart5s_leaderboard', JSON.stringify(leaderboardData));
            renderLeaderboard();
        }
        function renderLeaderboard() {
            if (!lbEntries) return;
            if (leaderboardData.length === 0) {
                lbEntries.innerHTML = '&lt;div style="color:#4a7a9a;"&gt;Belum ada data&lt;/div&gt;';
                return;
            }
            const sorted = [...leaderboardData].sort((a,b) =&gt; b.score - a.score).slice(0,5);
            lbEntries.innerHTML = sorted.map(p =&gt; 
                `&lt;div&gt;&lt;span&gt;${p.name}&lt;/span&gt;&lt;span class="lb-score"&gt;${p.score}&lt;/span&gt;&lt;/div&gt;`
            ).join('');
        }

        function resizeCanvas() {
            const container = document.getElementById('game-canvas-container');
            const rect = container.getBoundingClientRect();
            canvas.width = rect.width || 800;
            canvas.height = rect.height || 600;
            W = canvas.width;
            H = canvas.height;
            if (gameActive &amp;&amp; questionsForLevel.length) {
                generateBubbles();
                if (!levelCompleted) showCurrentQuestion();
            }
        }
        window.addEventListener('resize', resizeCanvas);
        resizeCanvas();

        function loadLevel(levelIdx) {
            currentLevel = levelIdx;
            currentQuestionIndex = 0;
            levelCompleted = false;
            const raw = QUESTION_BANK[levelIdx] || QUESTION_BANK[0];
            questionsForLevel = raw.map(item =&gt; {
                const shuffledOptions = shuffleArray([...item.options]);
                const correctIndex = shuffledOptions.indexOf(item.options[item.correct]);
                return {
                    q: item.q,
                    options: shuffledOptions,
                    correct: correctIndex
                };
            });
            questionsForLevel = shuffleArray(questionsForLevel);
            generateBubbles();
            updateUI();
            if (gameActive) {
                showCurrentQuestion();
            }
        }

        function generateBubbles() {
            bubbles = [];
            if (!questionsForLevel.length) return;
            const total = questionsForLevel.length;
            const cols = Math.min(5, total, Math.floor(W / 120) + 1);
            const rows = Math.ceil(total / cols);
            const spacingX = W / (cols + 1);
            const spacingY = H / (rows + 2);
            const radius = Math.min(spacingX * 0.4, spacingY * 0.45, 65);
            const baseY = spacingY * 0.8;
            for (let i = 0; i &lt; total; i++) {
                const col = i % cols;
                const row = Math.floor(i / cols);
                let x = spacingX * (col + 1) + (Math.random() - 0.5) * 30;
                let y = baseY + spacingY * row + (Math.random() - 0.5) * 25;
                x = Math.min(Math.max(x, radius+10), W - radius - 10);
                y = Math.min(Math.max(y, radius+10), H - radius - 10);
                const vx = (Math.random() - 0.5) * 0.8;
                const vy = (Math.random() - 0.5) * 0.8;
                bubbles.push({
                    id: i,
                    x, y, radius,
                    vx, vy,
                    label: questionsForLevel[i]?.options[0] || '?',
                    fullText: questionsForLevel[i]?.options[0] || '?',
                    answered: false,
                    optionIndex: 0
                });
            }
        }

        function wrapTextForBubble(text, maxCharsPerLine) {
            const words = text.split(' ');
            let lines = [];
            let currentLine = '';
            for (let w of words) {
                if ((currentLine + ' ' + w).length &lt;= maxCharsPerLine) {
                    currentLine += (currentLine ? ' ' : '') + w;
                } else {
                    if (currentLine) lines.push(currentLine);
                    currentLine = w;
                }
            }
            if (currentLine) lines.push(currentLine);
            return lines;
        }

        function showCurrentQuestion() {
            if (!questionsForLevel.length || currentQuestionIndex &gt;= questionsForLevel.length) {
                levelCompleted = true;
                if (currentLevel + 1 &lt; LEVELS) {
                    currentLevel++;
                    loadLevel(currentLevel);
                    updateUI();
                } else {
                    showFinalCongrats();
                }
                return;
            }
            const qData = questionsForLevel[currentQuestionIndex];
            if (!qData) return;
            qNumberDisplay.textContent = `${currentQuestionIndex + 1}.`;
            qTextDisplay.textContent = qData.q;
            bubbles.forEach((b, idx) =&gt; {
                const optIdx = idx % qData.options.length;
                b.optionIndex = optIdx;
                b.fullText = qData.options[optIdx] || '?';
                b.label = b.fullText;
                b.answered = false;
            });
        }

        function handleShoot(x, y) {
            if (!gameActive || levelCompleted) return;
            if (shootCooldown &gt; 0) return;
            shootCooldown = 8;
            let hit = null;
            for (let b of bubbles) {
                if (b.answered) continue;
                const dx = x - b.x, dy = y - b.y;
                if (dx*dx + dy*dy &lt; b.radius * b.radius) {
                    hit = b;
                    break;
                }
            }
            if (!hit) return;

            const qData = questionsForLevel[currentQuestionIndex];
            if (!qData) return;
            const selectedOptIdx = hit.optionIndex % qData.options.length;
            const isCorrect = (selectedOptIdx === qData.correct);
            hit.answered = true;
            totalAttempts++;
            if (isCorrect) {
                score++;
                correctAttempts++;
                spawnExplosion(hit.x, hit.y, '#00ffaa', 14);
            } else {
                spawnExplosion(hit.x, hit.y, '#ff4444', 10);
            }
            currentQuestionIndex++;
            if (currentQuestionIndex &gt;= questionsForLevel.length) {
                if (currentLevel + 1 &lt; LEVELS) {
                    showLevelCongrats();
                } else {
                    showFinalCongrats();
                }
            } else {
                showCurrentQuestion();
            }
            updateUI();
        }

        function spawnExplosion(x, y, color, count) {
            for (let i=0; i&lt;count; i++) {
                const angle = Math.random() * 2 * Math.PI;
                const speed = Math.random() * 3 + 1;
                particles.push({
                    x, y,
                    vx: Math.cos(angle) * speed,
                    vy: Math.sin(angle) * speed,
                    life: 1,
                    decay: Math.random() * 0.03 + 0.015,
                    size: Math.random() * 4 + 2,
                    color: color
                });
            }
        }

        function showLevelCongrats() {
            qNumberDisplay.textContent = '⚡';
            qTextDisplay.textContent = `Level ${currentLevel+1} Selesai! Skor: ${score}`;
            for (let i=0; i&lt;20; i++) {
                spawnExplosion(Math.random()*W, Math.random()*H, '#00ddff', 5);
            }
            setTimeout(() =&gt; {
                if (currentLevel + 1 &lt; LEVELS) {
                    currentLevel++;
                    loadLevel(currentLevel);
                    updateUI();
                } else {
                    showFinalCongrats();
                }
            }, 1200);
        }

        function getRank(scr) {
            if (scr &gt;= 45) return "&#127942; SMART-5S Master";
            else if (scr &gt;= 35) return "&#127775; SMART-5S Expert";
            else if (scr &gt;= 25) return "⚡ SMART-5S Pro";
            else if (scr &gt;= 15) return "&#128216; SMART-5S Learner";
            else return "&#128214; Perlu Belajar Lagi";
        }

        function getMessage(scr) {
            if (scr &gt;= 45) return "&#128640; Luar biasa! Anda SMART-5S Master sejati!";
            else if (scr &gt;= 35) return "&#127775; Hebat! Terus pertahankan nilai-nilai SMART-5S!";
            else if (scr &gt;= 25) return "&#128200; Bagus! Asah terus 5S Anda!";
            else if (scr &gt;= 15) return "&#128218; Mulai konsisten, raih predikat lebih tinggi!";
            else return "&#128170; Perlu belajar lagi, raih SMART-5S Master!";
        }

        function showFinalCongrats() {
            gameActive = false;
            finalScore = score;
            finalRank = getRank(score);
            finalMessage = getMessage(score);
            finalAccuracy = totalAttempts &gt; 0 ? Math.round((correctAttempts / totalAttempts) * 100) : 0;
            
            congratsOverlay.classList.add('show');
            finalScoreSpan.textContent = finalScore;
            rankDisplay.textContent = finalRank;
            personalMessage.textContent = finalMessage;
            userNameDisplay.textContent = userName;
            levelCompleteDisplay.textContent = `Level: ${LEVELS}/${LEVELS}`;
            accuracyDisplay.textContent = `Akurasi: ${finalAccuracy}%`;
            
            leaderboardData.push({ name: userName, score: score });
            saveLeaderboard();
            
            isCelebrating = true;
            for (let i=0; i&lt;70; i++) {
                setTimeout(() =&gt; {
                    spawnFirework(Math.random()*W, Math.random()*H*0.7 + 50);
                }, i * 70);
            }
            for (let i=0; i&lt;40; i++) {
                setTimeout(() =&gt; {
                    spawnFirework(Math.random()*W, Math.random()*H*0.5 + 30);
                }, 3500 + i * 90);
            }
            setTimeout(() =&gt; {
                speakScoreboard(finalScore, finalRank, finalMessage, finalAccuracy);
            }, 1600);
        }

        function spawnFirework(x, y) {
            const colors = ['#ff4444', '#ffdd44', '#44ff44', '#44ddff', '#ff44ff', '#ffffff', '#ff8800', '#00ffaa', '#a855f7'];
            for (let i=0; i&lt;50; i++) {
                const angle = Math.random() * 2 * Math.PI;
                const speed = Math.random() * 6 + 2;
                const color = colors[Math.floor(Math.random() * colors.length)];
                fireworks.push({
                    x, y,
                    vx: Math.cos(angle) * speed,
                    vy: Math.sin(angle) * speed - 1,
                    life: 1,
                    decay: Math.random() * 0.015 + 0.007,
                    size: Math.random() * 5 + 2,
                    color: color,
                    isConfetti: false
                });
            }
            for (let i=0; i&lt;25; i++) {
                const angle = Math.random() * 2 * Math.PI;
                const speed = Math.random() * 4 + 1;
                const color = colors[Math.floor(Math.random() * colors.length)];
                fireworks.push({
                    x, y,
                    vx: Math.cos(angle) * speed + (Math.random()-0.5)*2,
                    vy: Math.sin(angle) * speed - 2.5,
                    life: 1,
                    decay: Math.random() * 0.01 + 0.005,
                    size: Math.random() * 8 + 4,
                    color: color,
                    isConfetti: true
                });
            }
        }

        function updateUI() {
            levelIndicator.textContent = `⚡ Level ${currentLevel+1}`;
            scoreIndicator.textContent = `⭐ ${score}`;
            playerNameDisplay.textContent = `&#128187; ${userName}`;
        }

        function draw() {
            ctx.clearRect(0, 0, W, H);
            ctx.fillStyle = 'rgba(0, 10, 30, 0.3)';
            ctx.fillRect(0, 0, W, H);
            ctx.strokeStyle = '#00aaff20';
            ctx.lineWidth = 0.5;
            for (let i=0; i&lt;W; i+=25) {
                ctx.beginPath();
                ctx.moveTo(i, 0);
                ctx.lineTo(i, H);
                ctx.stroke();
            }
            for (let i=0; i&lt;H; i+=25) {
                ctx.beginPath();
                ctx.moveTo(0, i);
                ctx.lineTo(W, i);
                ctx.stroke();
            }
            ctx.strokeStyle = '#00d4ff15';
            ctx.lineWidth = 1;
            for (let i=0; i&lt;W; i+=80) {
                ctx.beginPath();
                ctx.moveTo(i, 0);
                ctx.lineTo(i+40, H);
                ctx.stroke();
            }
            for (let i=0; i&lt;25; i++) {
                ctx.fillStyle = `rgba(0, 180, 255, ${Math.random()*0.2+0.05})`;
                ctx.beginPath();
                ctx.arc(Math.random()*W, Math.random()*H, Math.random()*2+0.5, 0, Math.PI*2);
                ctx.fill();
            }

            bubbles.forEach(b =&gt; {
                if (b.answered) return;
                const gradient = ctx.createRadialGradient(b.x-8, b.y-8, 2, b.x, b.y, b.radius);
                gradient.addColorStop(0, '#80d4ff');
                gradient.addColorStop(0.4, '#0088ff');
                gradient.addColorStop(0.8, '#4a00ff');
                gradient.addColorStop(1, '#1a0066');
                ctx.shadowColor = '#00aaffaa';
                ctx.shadowBlur = 35;
                ctx.beginPath();
                ctx.arc(b.x, b.y, b.radius, 0, 2*Math.PI);
                ctx.fillStyle = gradient;
                ctx.fill();
                ctx.shadowBlur = 0;
                ctx.strokeStyle = '#80d4ff';
                ctx.lineWidth = 2.5;
                ctx.shadowColor = '#00aaff';
                ctx.shadowBlur = 15;
                ctx.stroke();
                ctx.shadowBlur = 0;
                ctx.fillStyle = '#ffffff';
                ctx.shadowColor = '#0044ff';
                ctx.shadowBlur = 10;
                let fontSize = Math.max(10, Math.min(b.radius * 0.3, 15));
                ctx.font = `bold ${fontSize}px 'Segoe UI', Arial, sans-serif`;
                const maxChars = Math.floor((b.radius * 2 * 0.6) / (fontSize * 0.6));
                const lines = wrapTextForBubble(b.fullText, maxChars);
                const lineHeight = fontSize * 1.25;
                const totalHeight = lines.length * lineHeight;
                if (totalHeight &gt; b.radius * 1.6) {
                    const newSize = Math.floor(fontSize * (b.radius * 1.6 / totalHeight));
                    fontSize = Math.max(8, Math.min(newSize, 14));
                    ctx.font = `bold ${fontSize}px 'Segoe UI', Arial, sans-serif`;
                }
                const finalLines = wrapTextForBubble(b.fullText, Math.floor((b.radius * 2 * 0.65) / (fontSize * 0.6)));
                const finalLineHeight = fontSize * 1.2;
                const startY = b.y - ((finalLines.length - 1) * finalLineHeight / 2);
                ctx.textAlign = 'center';
                ctx.textBaseline = 'middle';
                for (let i = 0; i &lt; finalLines.length; i++) {
                    ctx.fillText(finalLines[i], b.x, startY + i * finalLineHeight);
                }
                ctx.shadowBlur = 0;
                b.x += b.vx;
                b.y += b.vy;
                if (b.x &lt; b.radius || b.x &gt; W - b.radius) b.vx *= -1;
                if (b.y &lt; b.radius || b.y &gt; H - b.radius) b.vy *= -1;
                b.x = Math.min(Math.max(b.x, b.radius), W - b.radius);
                b.y = Math.min(Math.max(b.y, b.radius), H - b.radius);
            });

            for (let i=particles.length-1; i&gt;=0; i--) {
                const p = particles[i];
                p.x += p.vx;
                p.y += p.vy;
                p.life -= p.decay;
                p.vy += 0.05;
                if (p.life &lt;= 0) { particles.splice(i,1); continue; }
                ctx.globalAlpha = p.life;
                ctx.fillStyle = p.color;
                ctx.shadowBlur = 10;
                ctx.shadowColor = p.color;
                ctx.beginPath();
                ctx.arc(p.x, p.y, p.size * p.life, 0, Math.PI*2);
                ctx.fill();
                ctx.shadowBlur = 0;
            }
            ctx.globalAlpha = 1;

            for (let i=fireworks.length-1; i&gt;=0; i--) {
                const f = fireworks[i];
                f.x += f.vx;
                f.y += f.vy;
                f.vy += 0.04;
                f.life -= f.decay;
                if (f.life &lt;= 0) { fireworks.splice(i,1); continue; }
                ctx.globalAlpha = f.life;
                ctx.fillStyle = f.color;
                ctx.shadowBlur = 18;
                ctx.shadowColor = f.color;
                if (f.isConfetti) {
                    ctx.save();
                    ctx.translate(f.x, f.y);
                    ctx.rotate(f.life * 12);
                    ctx.fillRect(-f.size/2, -f.size/2, f.size * f.life, f.size * f.life * 0.5);
                    ctx.restore();
                } else {
                    ctx.beginPath();
                    ctx.arc(f.x, f.y, f.size * f.life, 0, Math.PI*2);
                    ctx.fill();
                }
                ctx.shadowBlur = 0;
            }
            ctx.globalAlpha = 1;

            if (shootCooldown &gt; 0) shootCooldown--;
        }

        function gameLoop() {
            draw();
            animationFrame = requestAnimationFrame(gameLoop);
        }

        canvasEl.addEventListener('click', (e) =&gt; {
            const rect = canvasEl.getBoundingClientRect();
            const scaleX = canvas.width / rect.width;
            const scaleY = canvas.height / rect.height;
            const x = (e.clientX - rect.left) * scaleX;
            const y = (e.clientY - rect.top) * scaleY;
            handleShoot(x, y);
        });

        canvasEl.addEventListener('touchstart', (e) =&gt; {
            e.preventDefault();
            const rect = canvasEl.getBoundingClientRect();
            const touch = e.touches[0];
            const scaleX = canvas.width / rect.width;
            const scaleY = canvas.height / rect.height;
            const x = (touch.clientX - rect.left) * scaleX;
            const y = (touch.clientY - rect.top) * scaleY;
            handleShoot(x, y);
        }, { passive: false });

        speechBtn.addEventListener('click', () =&gt; {
            speakScoreboard(finalScore, finalRank, finalMessage, finalAccuracy);
        });

        function startGame() {
            const nameInput = document.getElementById('playerNameInput');
            userName = nameInput.value.trim() || "User";
            playerNameDisplay.textContent = `&#128187; ${userName}`;
            entryScreen.style.display = 'none';
            congratsOverlay.classList.remove('show');
            score = 0;
            totalAttempts = 0;
            correctAttempts = 0;
            currentLevel = 0;
            gameActive = true;
            isCelebrating = false;
            particles = [];
            fireworks = [];
            if (speechSynth.speaking) speechSynth.cancel();
            loadLevel(0);
            updateUI();
            if (animationFrame) cancelAnimationFrame(animationFrame);
            gameLoop();
        }

        document.getElementById('startGameBtn').addEventListener('click', startGame);
        document.getElementById('restartFromCongratsBtn').addEventListener('click', () =&gt; {
            congratsOverlay.classList.remove('show');
            startGame();
        });
        loadLeaderboard();
        loadLevel(0);
        updateUI();
        qNumberDisplay.textContent = '&#128640;';
        qTextDisplay.textContent = 'Masukkan nama User &amp; tekan MULAI';
        gameLoop();

        window.addEventListener('resize', () =&gt; {
            resizeCanvas();
        });
    })();
&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</description><link>http://kitab-investasi.blogspot.com/2026/07/sahabat-5s.html</link><thr:total>0</thr:total><author>nof_rizal07@yahoo.co.id (abang_cool)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-9000860041661554971.post-6942617448054266765</guid><pubDate>Thu, 25 Jun 2026 04:17:54 +0000</pubDate><atom:updated>2026-06-25T11:25:02.049+07:00</atom:updated><title>E-RAPORT PKL</title><description>&lt;!DOCTYPE html&gt;
&lt;html lang="id"&gt;
&lt;head&gt;
    &lt;meta charset="UTF-8"&gt;
    &lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&gt;
    &lt;title&gt;Aplikasi Rapor PKL - SMK Negeri 1 Tuntang&lt;/title&gt;
    &lt;script src="https://cdn.tailwindcss.com"&gt;&lt;/script&gt;
    
    &lt;!-- Google Fonts: Inter untuk aplikasi &amp; Times New Roman untuk cetakan fisik --&gt;
    &lt;link href="https://fonts.googleapis.com/css2?family=Inter:wght=300;400;500;600;700;800&amp;display=swap" rel="stylesheet"&gt;
    
    &lt;!-- Pustaka html2pdf untuk ekspor PDF instan berkualitas tinggi --&gt;
    &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/html2pdf.js/0.10.1/html2pdf.bundle.min.js"&gt;&lt;/script&gt;
    
    &lt;style&gt;
        body {
            font-family: 'Inter', sans-serif;
        }
        
        @media print {
            body {
                background: white !important;
                color: black !important;
                font-family: 'Times New Roman', Times, serif !important;
                font-size: 8.5pt !important;
            }
            .no-print {
                display: none !important;
            }
            .print-page {
                width: 215mm;
                height: 330mm;
                margin: 0 auto !important;
                padding: 8mm 12mm 8mm 12mm !important;
                box-sizing: border-box;
                background: white !important;
                box-shadow: none !important;
                border: none !important;
                page-break-after: avoid;
                page-break-inside: avoid;
                position: relative;
                display: flex;
                flex-direction: column;
                justify-content: space-between;
            }
            table {
                width: 100% !important;
                border-collapse: collapse !important;
            }
            th, td {
                border: 1px solid black !important;
                padding: 2.5px 4.5px !important;
                font-size: 8pt !important;
                line-height: 1.15 !important;
            }
            .kop-border {
                border-bottom: 4px double black !important;
            }
            /* Menyetel ukuran halaman cetak langsung ke format Folio/F4 */
            @page {
                size: 215mm 330mm;
                margin: 0;
            }
            html, body {
                width: 215mm;
                height: 100%;
            }
        }

        .preview-container {
            display: flex;
            flex-direction: column;
            gap: 20px;
            align-items: center;
        }
        
        .preview-pane {
            width: 215mm;
            height: 330mm;
            padding: 10mm 12mm 10mm 12mm;
            background: white;
            box-shadow: 0 10px 30px -5px rgba(0, 0, 0, 0.15), 0 8px 15px -6px rgba(0, 0, 0, 0.1);
            border: 1px solid #e2e8f0;
            box-sizing: border-box;
            position: relative;
            font-family: 'Times New Roman', Times, serif;
            color: black;
            display: flex;
            flex-direction: column;
            justify-content: space-between;
        }

        .logo-img {
            max-width: 100%;
            max-height: 100%;
            object-fit: contain;
        }

        .font-times {
            font-family: 'Times New Roman', Times, serif;
        }

        /* Custom Scrollbar */
        ::-webkit-scrollbar {
            width: 6px;
            height: 6px;
        }
        ::-webkit-scrollbar-track {
            background: #f1f5f9;
        }
        ::-webkit-scrollbar-thumb {
            background: #cbd5e1;
            border-radius: 4px;
        }
        ::-webkit-scrollbar-thumb:hover {
            background: #94a3b8;
        }
    &lt;/style&gt;
&lt;/head&gt;
&lt;body class="bg-slate-900 text-slate-100 antialiased min-h-screen flex flex-col"&gt;

    &lt;div id="root" class="flex-grow flex flex-col"&gt;&lt;/div&gt;

    &lt;!-- React &amp; Babel Standalone Libraries --&gt;
    &lt;script src="https://unpkg.com/react@18.2.0/umd/react.production.min.js" crossorigin&gt;&lt;/script&gt;
    &lt;script src="https://unpkg.com/react-dom@18.2.0/umd/react-dom.production.min.js" crossorigin&gt;&lt;/script&gt;
    &lt;script src="https://unpkg.com/@babel/standalone@7.24.7/babel.min.js"&gt;&lt;/script&gt;
    
    &lt;!-- Lucide Icon Pack (Stabil UMD Version) --&gt;
    &lt;script src="https://unpkg.com/lucide@0.400.0/dist/umd/lucide.min.js"&gt;&lt;/script&gt;

    &lt;script type="text/babel"&gt;
        const { useState, useEffect, useMemo } = React;

        // Kumpulan Data Utama 35 Siswa XI TJKT 2 (Tahun Pelajaran 2025/2026)
        const initialStudents = [
            { id: 848, nis: "848", nisn: "0075368619", name: "ADNAN DAVID ARDAFA", pklLocation: "BEST CAMP PRIMA DATA", pklAddress: "Jl. Mertokusumo, Desa Candirejo", advisor: "M. Misbahul M", grades: { "1.1": 80, "1.2": 90, "1.3": 85, "1.4": 85, "1.5": 88, "1.6": 90, "2.1": 80, "2.2": 85, "2.3": 92, "2.4": 85, "2.5": 80, "2.6": 95 }, attendance: { sakit: 0, izin: 0, alpha: 0 } },
            { id: 849, nis: "849", nisn: "0074932145", name: "AKBAR ADI SUGESTI", pklLocation: "SMPN 2 TUNTANG", pklAddress: "Jl. Tuntang No. 42", advisor: "Bayu AS", grades: { "1.1": 95, "1.2": 90, "1.3": 88, "1.4": 90, "1.5": 90, "1.6": 90, "2.1": 95, "2.2": 90, "2.3": 86, "2.4": 95, "2.5": 89, "2.6": 87 }, attendance: { sakit: 0, izin: 0, alpha: 0 } },
            { id: 850, nis: "850", nisn: "0071239854", name: "ANDHIKA DIAS DWINOVA", pklLocation: "PERHUTANI SALATIGA", pklAddress: "Jl. Hasanudin No. 110, Salatiga", advisor: "M Achmadi", grades: { "1.1": 98, "1.2": 88, "1.3": 95, "1.4": 97, "1.5": 88, "1.6": 79, "2.1": 77, "2.2": 78, "2.3": 85, "2.4": 87, "2.5": 88, "2.6": 78 }, attendance: { sakit: 0, izin: 0, alpha: 0 } },
            { id: 851, nis: "851", nisn: "0081293847", name: "ANDRI VILANDA", pklLocation: "BEST CAMP PRIMA DATA", pklAddress: "Jl. Mertokusumo, Candirejo", advisor: "Enggar S", grades: { "1.1": 80, "1.2": 95, "1.3": 90, "1.4": 90, "1.5": 90, "1.6": 95, "2.1": 95, "2.2": 95, "2.3": 95, "2.4": 95, "2.5": 95, "2.6": 95 }, attendance: { sakit: 0, izin: 0, alpha: 0 } },
            { id: 852, nis: "852", nisn: "0075531234", name: "ANGGRESWARI NAZWA INSANY", pklLocation: "PT. INDONESIA MEDIA KOMUNIKASI", pklAddress: "Gedung Cyber, lt. 5, Semarang", advisor: "Enggar S", grades: { "1.1": 100, "1.2": 100, "1.3": 100, "1.4": 100, "1.5": 100, "1.6": 100, "2.1": 100, "2.2": 100, "2.3": 100, "2.4": 100, "2.5": 100, "2.6": 100 }, attendance: { sakit: 0, izin: 0, alpha: 0 } },
            { id: 853, nis: "853", nisn: "0079983451", name: "AQTHA'AN NAKHSYABY", pklLocation: "PT. PRO MANUFACTURE INDONESIA (FORMULATRIX)", pklAddress: "Kawasan Industri Candi, Semarang", advisor: "Intan f", grades: { "1.1": 95, "1.2": 96, "1.3": 98, "1.4": 88, "1.5": 86, "1.6": 98, "2.1": 97, "2.2": 95, "2.3": 95, "2.4": 93, "2.5": 95, "2.6": 96 }, attendance: { sakit: 0, izin: 0, alpha: 0 } },
            { id: 854, nis: "854", nisn: "0072314569", name: "ARIEL ADISYAH PUTRA", pklLocation: "TELKOM AKSES UNGARAN", pklAddress: "Jl. Diponegoro No. 89, Ungaran", advisor: "Agung K", grades: { "1.1": 89, "1.2": 89, "1.3": 89, "1.4": 100, "1.5": 89, "1.6": 89, "2.1": 100, "2.2": 89, "2.3": 89, "2.4": 89, "2.5": 89, "2.6": 89 }, attendance: { sakit: 0, izin: 0, alpha: 0 } },
            { id: 855, nis: "855", nisn: "0078834912", name: "ARSA FADEL DEAL", pklLocation: "TELKOM AKSES UNGARAN", pklAddress: "Jl. Diponegoro No. 89, Ungaran", advisor: "Agung K", grades: { "1.1": 89, "1.2": 100, "1.3": 89, "1.4": 89, "1.5": 89, "1.6": 89, "2.1": 89, "2.2": 89, "2.3": 89, "2.4": 89, "2.5": 89, "2.6": 100 }, attendance: { sakit: 0, izin: 0, alpha: 0 } },
            { id: 856, nis: "856", nisn: "0083214567", name: "ASTI NOVITA SARI", pklLocation: "PT. DATA LINTAS MEDIA INDONESIA", pklAddress: "Jl. Jend. Sudirman, Semarang", advisor: "Agung K", grades: { "1.1": 95, "1.2": 94, "1.3": 99, "1.4": 95, "1.5": 90, "1.6": 96, "2.1": 86, "2.2": 90, "2.3": 90, "2.4": 85, "2.5": 85, "2.6": 90 }, attendance: { sakit: 0, izin: 0, alpha: 0 } },
            { id: 857, nis: "857", nisn: "0071122334", name: "CRISTINA DEWIPUTRI", pklLocation: "PLN PERSERO UPT SALATIGA", pklAddress: "Jl. Jend. Sudirman, Salatiga", advisor: "Intan f", grades: { "1.1": 90, "1.2": 90, "1.3": 75, "1.4": 87, "1.5": 95, "1.6": 90, "2.1": 90, "2.2": 80, "2.3": 85, "2.4": 80, "2.5": 90, "2.6": 89 }, attendance: { sakit: 0, izin: 0, alpha: 0 } },
            { id: 858, nis: "858", nisn: "0074455667", name: "DENYSS ARISTA DEWI", pklLocation: "PT. DATA LINTAS MEDIA INDONESIA", pklAddress: "Jl. Jend. Sudirman, Semarang", advisor: "Agung K", grades: { "1.1": 90, "1.2": 95, "1.3": 90, "1.4": 95, "1.5": 95, "1.6": 95, "2.1": 95, "2.2": 95, "2.3": 90, "2.4": 90, "2.5": 95, "2.6": 90 }, attendance: { sakit: 0, izin: 0, alpha: 0 } },
            { id: 859, nis: "859", nisn: "0079988776", name: "DIMAS SUKMA FARIZKI", pklLocation: "BEST CAMP PRIMA DATA", pklAddress: "Jl. Mertokusumo, Candirejo", advisor: "M. Misbahul M", grades: { "1.1": 90, "1.2": 95, "1.3": 90, "1.4": 95, "1.5": 95, "1.6": 95, "2.1": 95, "2.2": 95, "2.3": 90, "2.4": 90, "2.5": 95, "2.6": 90 }, attendance: { sakit: 0, izin: 0, alpha: 0 } },
            { id: 860, nis: "860", nisn: "0073344551", name: "FAHRURROZI", pklLocation: "BEST CAMP PRIMA DATA", pklAddress: "Jl. Mertokusumo, Candirejo", advisor: "M. Misbahul M", grades: { "1.1": 90, "1.2": 92, "1.3": 85, "1.4": 90, "1.5": 88, "1.6": 90, "2.1": 80, "2.2": 85, "2.3": 92, "2.4": 85, "2.5": 85, "2.6": 95 }, attendance: { sakit: 0, izin: 0, alpha: 0 } },
            { id: 861, nis: "861", nisn: "0078899001", name: "FERRA ANGGRAENI", pklLocation: "SMPN 2 TUNTANG", pklAddress: "Jl. Tuntang No. 42", advisor: "Bayu AS", grades: { "1.1": 100, "1.2": 100, "1.3": 100, "1.4": 100, "1.5": 100, "1.6": 100, "2.1": 100, "2.2": 100, "2.3": 100, "2.4": 100, "2.5": 100, "2.6": 100 }, attendance: { sakit: 0, izin: 0, alpha: 0 } },
            { id: 862, nis: "862", nisn: "0072233441", name: "FLORA FIRNANDA", pklLocation: "SMPN 2 TUNTANG", pklAddress: "Jl. Tuntang No. 42", advisor: "Bayu AS", grades: { "1.1": 90, "1.2": 88, "1.3": 85, "1.4": 90, "1.5": 80, "1.6": 90, "2.1": 80, "2.2": 80, "2.3": 92, "2.4": 80, "2.5": 80, "2.6": 90 }, attendance: { sakit: 1, izin: 1, alpha: 0 } },
            { id: 863, nis: "863", nisn: "0071112228", name: "HELSA RIZQI AKBAR", pklLocation: "PERHUTANI SALATIGA", pklAddress: "Jl. Hasanudin No. 110, Salatiga", advisor: "M Achmadi", grades: { "1.1": 77, "1.2": 77, "1.3": 77, "1.4": 77, "1.5": 77, "1.6": 77, "2.1": 77, "2.2": 77, "2.3": 77, "2.4": 77, "2.5": 77, "2.6": 77 }, attendance: { sakit: 5, izin: 3, alpha: 1 } },
            { id: 864, nis: "864", nisn: "0079900223", name: "ILHAM ARBIANSAH", pklLocation: "BEST CAMP PRIMA DATA", pklAddress: "Jl. Mertokusumo, Candirejo", advisor: "M. Misbahul M", grades: { "1.1": 86, "1.2": 86, "1.3": 86, "1.4": 86, "1.5": 86, "1.6": 86, "2.1": 86, "2.2": 86, "2.3": 86, "2.4": 86, "2.5": 86, "2.6": 86 }, attendance: { sakit: 0, izin: 0, alpha: 0 } },
            { id: 865, nis: "865", nisn: "0074433221", name: "JOEY NUNG JAYA LANANG", pklLocation: "PT. PRO MANUFACTURE INDONESIA", pklAddress: "Kawasan Industri Candi, Semarang", advisor: "Intan f", grades: { "1.1": 80, "1.2": 95, "1.3": 95, "1.4": 90, "1.5": 95, "1.6": 95, "2.1": 95, "2.2": 95, "2.3": 90, "2.4": 95, "2.5": 95, "2.6": 95 }, attendance: { sakit: 0, izin: 0, alpha: 0 } },
            { id: 866, nis: "866", nisn: "0075566778", name: "LIDIA NAILIATUZ ZAHFA", pklLocation: "PT. DATA LINTAS MEDIA INDONESIA", pklAddress: "Jl. Jend. Sudirman, Semarang", advisor: "Agung K", grades: { "1.1": 100, "1.2": 100, "1.3": 100, "1.4": 100, "1.5": 100, "1.6": 100, "2.1": 100, "2.2": 100, "2.3": 100, "2.4": 100, "2.5": 100, "2.6": 100 }, attendance: { sakit: 0, izin: 0, alpha: 0 } },
            { id: 867, nis: "867", nisn: "0078833440", name: "MARTA AKMALIA LUTFI", pklLocation: "SMPN 2 TUNTANG", pklAddress: "Jl. Tuntang No. 42", advisor: "Bayu AS", grades: { "1.1": 89, "1.2": 89, "1.3": 89, "1.4": 89, "1.5": 89, "1.6": 89, "2.1": 89, "2.2": 89, "2.3": 89, "2.4": 89, "2.5": 89, "2.6": 89 }, attendance: { sakit: 0, izin: 0, alpha: 0 } },
            { id: 868, nis: "868", nisn: "0072211993", name: "MOZZA PUTRI RAHAYU", pklLocation: "PT. DATA LINTAS MEDIA INDONESIA", pklAddress: "Jl. Jend. Sudirman, Semarang", advisor: "Agung K", grades: { "1.1": 100, "1.2": 100, "1.3": 100, "1.4": 100, "1.5": 100, "1.6": 100, "2.1": 100, "2.2": 100, "2.3": 100, "2.4": 100, "2.5": 100, "2.6": 100 }, attendance: { sakit: 0, izin: 0, alpha: 0 } },
            { id: 869, nis: "869", nisn: "0078833112", name: "MUHAMAD SATYA FIRMANSYAH", pklLocation: "BEST CAMP PRIMA DATA", pklAddress: "Jl. Mertokusumo, Candirejo", advisor: "M. Misbahul M", grades: { "1.1": 90, "1.2": 92, "1.3": 85, "1.4": 90, "1.5": 88, "1.6": 90, "2.1": 80, "2.2": 85, "2.3": 92, "2.4": 85, "2.5": 85, "2.6": 92 }, attendance: { sakit: 0, izin: 0, alpha: 0 } },
            { id: 870, nis: "870", nisn: "0071199882", name: "MUHAMMAD FAISAL FAHRI", pklLocation: "PERHUTANI SALATIGA", pklAddress: "Jl. Hasanudin No. 110, Salatiga", advisor: "M Achmadi", grades: { "1.1": 85, "1.2": 85, "1.3": 85, "1.4": 90, "1.5": 95, "1.6": 95, "2.1": 90, "2.2": 95, "2.3": 95, "2.4": 95, "2.5": 95, "2.6": 95 }, attendance: { sakit: 1, izin: 0, alpha: 0 } },
            { id: 871, nis: "871", nisn: "0075533119", name: "MUHAMMAD NAJIB", pklLocation: "BEST CAMP PRIMA DATA", pklAddress: "Jl. Mertokusumo, Candirejo", advisor: "M. Misbahul M", grades: { "1.1": 90, "1.2": 90, "1.3": 90, "1.4": 85, "1.5": 90, "1.6": 90, "2.1": 85, "2.2": 85, "2.3": 95, "2.4": 85, "2.5": 85, "2.6": 95 }, attendance: { sakit: 0, izin: 0, alpha: 0 } },
            { id: 872, nis: "872", nisn: "0072211440", name: "MUHAMMAD RIZKY BANTACUT", pklLocation: "BEST CAMP PRIMA DATA", pklAddress: "Jl. Mertokusumo, Candirejo", advisor: "M. Misbahul M", grades: { "1.1": 0, "1.2": 0, "1.3": 0, "1.4": 0, "1.5": 0, "1.6": 0, "2.1": 0, "2.2": 0, "2.3": 0, "2.4": 0, "2.5": 0, "2.6": 0 }, attendance: { sakit: 0, izin: 0, alpha: 0 } },
            { id: 873, nis: "873", nisn: "0073388112", name: "NOVA SILFI NUGROHO", pklLocation: "SMPN 2 TUNTANG", pklAddress: "Jl. Tuntang No. 42", advisor: "Bayu AS", grades: { "1.1": 95, "1.2": 90, "1.3": 79, "1.4": 89, "1.5": 95, "1.6": 95, "2.1": 95, "2.2": 89, "2.3": 89, "2.4": 89, "2.5": 90, "2.6": 95 }, attendance: { sakit: 0, izin: 1, alpha: 0 } },
            { id: 874, nis: "874", nisn: "0079922113", name: "RANGGA BAGUS PRASETYO", pklLocation: "BEST CAMP PRIMA DATA", pklAddress: "Jl. Mertokusumo, Candirejo", advisor: "M. Misbahul M", grades: { "1.1": 80, "1.2": 90, "1.3": 85, "1.4": 80, "1.5": 85, "1.6": 85, "2.1": 80, "2.2": 85, "2.3": 92, "2.4": 85, "2.5": 85, "2.6": 90 }, attendance: { sakit: 0, izin: 0, alpha: 0 } },
            { id: 875, nis: "875", nisn: "0074411882", name: "REVA QIRANA HASTARI", pklLocation: "BEST CAMP PRIMA DATA", pklAddress: "Jl. Mertokusumo, Candirejo", advisor: "Enggar S", grades: { "1.1": 76, "1.2": 76, "1.3": 76, "1.4": 76, "1.5": 76, "1.6": 76, "2.1": 76, "2.2": 76, "2.3": 76, "2.4": 76, "2.5": 76, "2.6": 76 }, attendance: { sakit: 1, izin: 1, alpha: 0 } },
            { id: 876, nis: "876", nisn: "0078811993", name: "RYAN ANUGRAH UTAMA", pklLocation: "PERHUTANI SALATIGA", pklAddress: "Jl. Hasanudin No. 110, Salatiga", advisor: "M Achmadi", grades: { "1.1": 95, "1.2": 90, "1.3": 88, "1.4": 87, "1.5": 90, "1.6": 90, "2.1": 95, "2.2": 87, "2.3": 86, "2.4": 90, "2.5": 90, "2.6": 88 }, attendance: { sakit: 0, izin: 1, alpha: 0 } },
            { id: 877, nis: "877", nisn: "0072288334", name: "SA'IDUL MUSTAJIRIN", pklLocation: "PT. PRO MANUFACTURE INDONESIA", pklAddress: "Kawasan Industri Candi, Semarang", advisor: "Intan f", grades: { "1.1": 95, "1.2": 96, "1.3": 98, "1.4": 98, "1.5": 96, "1.6": 98, "2.1": 98, "2.2": 97, "2.3": 96, "2.4": 95, "2.5": 95, "2.6": 93 }, attendance: { sakit: 0, izin: 0, alpha: 0 } },
            { id: 878, nis: "878", nisn: "0071199554", name: "SALWA LAIDIYATUZZULFA", pklLocation: "PT. DATA LINTAS MEDIA INDONESIA", pklAddress: "Jl. Jend. Sudirman, Semarang", advisor: "Agung K", grades: { "1.1": 90, "1.2": 90, "1.3": 90, "1.4": 95, "1.5": 90, "1.6": 90, "2.1": 90, "2.2": 95, "2.3": 95, "2.4": 90, "2.5": 90, "2.6": 95 }, attendance: { sakit: 0, izin: 0, alpha: 0 } },
            { id: 879, nis: "879", nisn: "0074433112", name: "SOVI SALMA", pklLocation: "SMPN 2 TUNTANG", pklAddress: "Jl. Tuntang No. 42", advisor: "Bayu AS", grades: { "1.1": 88, "1.2": 90, "1.3": 85, "1.4": 90, "1.5": 90, "1.6": 90, "2.1": 86, "2.2": 90, "2.3": 90, "2.4": 88, "2.5": 85, "2.6": 95 }, attendance: { sakit: 0, izin: 0, alpha: 0 } },
            { id: 880, nis: "880", nisn: "0078822119", name: "SUCI DWI YANTI", pklLocation: "PT. DATA LINTAS MEDIA INDONESIA", pklAddress: "Jl. Jend. Sudirman, Semarang", advisor: "Agung K", grades: { "1.1": 95, "1.2": 95, "1.3": 99, "1.4": 95, "1.5": 90, "1.6": 95, "2.1": 88, "2.2": 90, "2.3": 90, "2.4": 85, "2.5": 85, "2.6": 90 }, attendance: { sakit: 0, izin: 0, alpha: 0 } },
            { id: 881, nis: "881", nisn: "0073311993", name: "VERLIANA VIKA DEA PUTRI", pklLocation: "SMPN 2 TUNTANG", pklAddress: "Jl. Tuntang No. 42", advisor: "Bayu AS", grades: { "1.1": 78, "1.2": 78, "1.3": 78, "1.4": 78, "1.5": 78, "1.6": 78, "2.1": 78, "2.2": 78, "2.3": 78, "2.4": 78, "2.5": 78, "2.6": 78 }, attendance: { sakit: 1, izin: 2, alpha: 0 } },
            { id: 882, nis: "882", nisn: "0074499119", name: "ZIDAN ALFARIZOJ", pklLocation: "BEST CAMP PRIMA DATA", pklAddress: "Jl. Mertokusumo, Candirejo", advisor: "Enggar S", grades: { "1.1": 80, "1.2": 85, "1.3": 80, "1.4": 85, "1.5": 85, "1.6": 85, "2.1": 80, "2.2": 85, "2.3": 90, "2.4": 80, "2.5": 85, "2.6": 90 }, attendance: { sakit: 0, izin: 1, alpha: 0 } }
        ];

        // Definisi Konfigurasi Kompetensi Kelas
        const competencyMetadata = {
            "1.1": { code: "1.1", name: "Disiplin", group: "Non-Teknis", text: "Murid menunjukkan sikap Disiplin" },
            "1.2": { code: "1.2", name: "Kerjasama", group: "Non-Teknis", text: "Murid menunjukkan sikap sangat bisa bekerjasama" },
            "1.3": { code: "1.3", name: "Kejuruan", group: "Non-Teknis", text: "Murid menunjukkan sikap sesuai tuntutan kejuruan" },
            "1.4": { code: "1.4", name: "Kerapian", group: "Non-Teknis", text: "Murid menunjukkan sikap rapi" },
            "1.5": { code: "1.5", name: "Tanggung Jawab", group: "Non-Teknis", text: "Murid menunjukkan sikap bertanggungjawab" },
            "1.6": { code: "1.6", name: "Kemauan Kerja", group: "Non-Teknis", text: "Murid menunjukkan sikap kerja sangat bertanggungjawab" },
            "2.1": { code: "2.1", name: "Merakit Personal Komputer", group: "Teknis", text: "merakit personal komputer" },
            "2.2": { code: "2.2", name: "Instalasi Sistem Operasi Dasar", group: "Teknis", text: "Melakukan Instalasi Sistem Operasi Dasar" },
            "2.3": { code: "2.3", name: "Perbaikan / Seting Ulang sistem PC", group: "Teknis", text: "Melakukan Perbaikan dan/atau Seting Ulang sistem PC" },
            "2.4": { code: "2.4", name: "Instalasi Software", group: "Teknis", text: "Melakukan Instalasi Software" },
            "2.5": { code: "2.5", name: "Instalasi Perangkat Jaringan Lokal", group: "Teknis", text: "Melakukan Instalasi Perangkat Jaringan Lokal (Local area Network)" },
            "2.6": { code: "2.6", name: "Perbaikan/Seting Ulang Koneksi Jaringan", group: "Teknis", text: "Melakukan Perbaikan dan/atau Seting Ulang Koneksi Jaringan" }
        };

        // Standardisasi Struktur Data Penandatanganan SMKN 1 Tuntang
        const initialSchoolConfig = {
            schoolName: "SMK NEGERI 1 TUNTANG",
            headmasterName: "Ardan Sirodjuddin, S.Pd., M.Pd.",
            headmasterNip: "19810123 200501 1 002",
            homeroomTeacher: "Nofrizal, S.T., Gr.",
            homeroomNip: "19770327 202221 1002",
            address: "Jl. Mertokusumo Desa Candirejo Kecamatan Tuntang Kabupaten Semarang",
            postalCode: "50773",
            phone: "(0298) 3539034",
            email: "smkn1tuntang@gmail.com",
            website: "www.smknegerituntang.sch.id",
            printDate: "18 Maret 2026",
            printLocation: "Tuntang",
            semester: "F-Gasal/5-2025/2026"
        };

        // Representasi SVG default Provinsi Jawa Tengah untuk Logo Kiri
        const defaultLogoLeftSVG = `data:image/svg+xml;utf8,&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" fill="black"&gt;&lt;circle cx="50" cy="50" r="45" fill="none" stroke="black" stroke-width="3"/&gt;&lt;path d="M50 15 L25 40 L50 48 L75 40 Z"/&gt;&lt;path d="M32 43 L32 80 L68 80 L68 43 Z" fill="none" stroke="black" stroke-width="2.5"/&gt;&lt;path d="M50 48 L50 80" stroke="black" stroke-width="2"/&gt;&lt;/svg&gt;`;

        // Representasi SVG default Logo SMKN 1 Tuntang untuk Logo Kanan
        const defaultLogoRightSVG = `data:image/svg+xml;utf8,&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" fill="black"&gt;&lt;polygon points="50,5 95,28 95,72 50,95 5,72 5,28" fill="none" stroke="black" stroke-width="3"/&gt;&lt;polygon points="50,15 85,32 85,68 50,85 15,32 15,68" fill="black"/&gt;&lt;circle cx="50" cy="50" r="12" fill="white"/&gt;&lt;/svg&gt;`;

        // Generator Kalimat Deskripsi Otomatis Sesuai Berkas Raport &amp; Nilai
        const generateCompetenceFeedback = (code, score) =&gt; {
            if (score === 0 || !score) return "Siswa belum menyelesaikan kompetensi.";
            const meta = competencyMetadata[code];
            if (!meta) return "";

            // Non-Teknis Phrasings
            if (meta.group === "Non-Teknis") {
                let adjective = "";
                if (score &gt;= 95) adjective = " luar biasa";
                else if (score &gt;= 90) adjective = " sangat";
                else if (score &gt;= 80) adjective = "";
                else adjective = " cukup";

                if (code === "1.1") return `Murid menunjukkan sikap${adjective} Disiplin`;
                if (code === "1.2") {
                    if (score &gt;= 90) return "Murid menunjukkan sikap sangat bisa bekerjasama";
                    return "Murid menunjukkan sikap bisa bekerjasama";
                }
                if (code === "1.3") return `Murid menunjukkan sikap${adjective} sesuai tuntutan kejuruan`;
                if (code === "1.4") return `Murid menunjukkan sikap${adjective} rapi`;
                if (code === "1.5") return `Murid menunjukkan sikap${adjective} bertanggungjawab`;
                if (code === "1.6") {
                    if (score &gt;= 90) return "Murid menunjukkan sikap kerja sangat bertanggungjawab";
                    return "Murid menunjukkan sikap kerja bertanggungjawab";
                }
            }

            // Teknis Phrasings
            let scaleWord = "terampil";
            if (score &gt;= 90) scaleWord = "sangat terampil";
            else if (score &gt;= 80) scaleWord = "terampil";
            else scaleWord = "cukup terampil";

            return `Murid ${scaleWord} dalam ${meta.text}`;
        };

        function App() {
            const [students, setStudents] = useState(() =&gt; {
                const saved = localStorage.getItem('pkl_students');
                return saved ? JSON.parse(saved) : initialStudents;
            });
            const [schoolConfig, setSchoolConfig] = useState(() =&gt; {
                const saved = localStorage.getItem('pkl_school_v2');
                return saved ? JSON.parse(saved) : initialSchoolConfig;
            });
            
            // State untuk menampung data logo base64 hasil unggahan pengguna
            const [logoLeft, setLogoLeft] = useState(() =&gt; {
                return localStorage.getItem('pkl_logo_left') || defaultLogoLeftSVG;
            });
            const [logoRight, setLogoRight] = useState(() =&gt; {
                return localStorage.getItem('pkl_logo_right') || defaultLogoRightSVG;
            });

            const [selectedStudentId, setSelectedStudentId] = useState(848);
            const [searchQuery, setSearchQuery] = useState("");
            const [filterLocation, setFilterLocation] = useState("ALL");
            const [activeTab, setActiveTab] = useState("preview"); 
            const [editingStudent, setEditingStudent] = useState(null);
            const [feedbackMsg, setFeedbackMsg] = useState("");
            const [fontStyle, setFontStyle] = useState("serif"); // serif (Times) atau sans (Inter)
            const [isExporting, setIsExporting] = useState(false);

            useEffect(() =&gt; {
                localStorage.setItem('pkl_students', JSON.stringify(students));
            }, [students]);

            useEffect(() =&gt; {
                localStorage.setItem('pkl_school_v2', JSON.stringify(schoolConfig));
            }, [schoolConfig]);

            // Simpan perubahan logo kustom ke local storage
            useEffect(() =&gt; {
                localStorage.setItem('pkl_logo_left', logoLeft);
            }, [logoLeft]);

            useEffect(() =&gt; {
                localStorage.setItem('pkl_logo_right', logoRight);
            }, [logoRight]);

            const currentStudent = useMemo(() =&gt; {
                return students.find(s =&gt; s.id === selectedStudentId) || students[0];
            }, [students, selectedStudentId]);

            useEffect(() =&gt; {
                if (currentStudent) {
                    setEditingStudent(JSON.parse(JSON.stringify(currentStudent)));
                }
            }, [currentStudent]);

            const uniqueLocations = useMemo(() =&gt; {
                const locs = students.map(s =&gt; s.pklLocation).filter(Boolean);
                return ["ALL", ...new Set(locs)];
            }, [students]);

            const filteredStudents = useMemo(() =&gt; {
                return students.filter(student =&gt; {
                    const matchesSearch = student.name.toUpperCase().includes(searchQuery.toUpperCase()) ||
                        student.nis.includes(searchQuery) ||
                        student.pklLocation.toUpperCase().includes(searchQuery.toUpperCase()) ||
                        student.advisor.toUpperCase().includes(searchQuery.toUpperCase());
                    
                    const matchesLocation = filterLocation === "ALL" || student.pklLocation === filterLocation;
                    return matchesSearch &amp;&amp; matchesLocation;
                });
            }, [students, searchQuery, filterLocation]);

            const studentStatsList = useMemo(() =&gt; {
                return students.map(st =&gt; {
                    const scores = Object.values(st.grades).filter(v =&gt; v &gt; 0);
                    const total = scores.reduce((a, b) =&gt; a + b, 0);
                    const average = scores.length &gt; 0 ? Math.round(total / scores.length) : 0;
                    return { id: st.id, total, average };
                }).sort((a, b) =&gt; b.average - a.average);
            }, [students]);

            const getRank = (id) =&gt; {
                const index = studentStatsList.findIndex(st =&gt; st.id === id);
                return index !== -1 ? index + 1 : "-";
            };

            const handleUpdateGrades = () =&gt; {
                if (!editingStudent) return;
                setStudents(prev =&gt; prev.map(s =&gt; s.id === editingStudent.id ? editingStudent : s));
                setFeedbackMsg("Data Rapor " + editingStudent.name + " berhasil disimpan!");
                setTimeout(() =&gt; setFeedbackMsg(""), 3000);
            };

            // Fungsi utilitas mengonversi berkas gambar yang diunggah ke format data URL base64
            const handleLogoUpload = (e, target) =&gt; {
                const file = e.target.files[0];
                if (!file) return;
                
                const reader = new FileReader();
                reader.onloadend = () =&gt; {
                    if (target === 'left') {
                        setLogoLeft(reader.result);
                    } else {
                        setLogoRight(reader.result);
                    }
                    setFeedbackMsg("Logo berhasil diperbarui!");
                    setTimeout(() =&gt; setFeedbackMsg(""), 2000);
                };
                reader.readAsDataURL(file);
            };

            // Fungsi andalan mengunduh PDF secara instan seukuran kertas F4
            const handleDownloadPDF = () =&gt; {
                setIsExporting(true);
                setFeedbackMsg("Sedang memproses PDF...");
                
                const element = document.getElementById('print-area');
                
                const opt = {
                    margin:       0,
                    filename:     `Rapor_PKL_${currentStudent.name.replace(/\s+/g, '_')}_F4.pdf`,
                    image:        { type: 'jpeg', quality: 0.98 },
                    html2canvas:  { scale: 2, useCORS: true, logging: false },
                    jsPDF:        { unit: 'mm', format: [215, 330], orientation: 'portrait' } // Ukuran F4 / Folio
                };

                // Menghasilkan file PDF client-side
                html2pdf().set(opt).from(element).save().then(() =&gt; {
                    setIsExporting(false);
                    setFeedbackMsg("PDF berhasil diunduh!");
                    setTimeout(() =&gt; setFeedbackMsg(""), 3000);
                }).catch(err =&gt; {
                    setIsExporting(false);
                    setFeedbackMsg("Gagal mengunduh PDF");
                    setTimeout(() =&gt; setFeedbackMsg(""), 3000);
                    console.error(err);
                });
            };

            const calculateStats = (student) =&gt; {
                if (!student) return { total: 0, average: 0, min: 0, max: 0 };
                const scores = Object.values(student.grades).filter(v =&gt; v &gt; 0);
                if (scores.length === 0) return { total: 0, average: 0, min: 0, max: 0 };
                const total = scores.reduce((a, b) =&gt; a + b, 0);
                const average = Math.round(total / scores.length);
                const min = Math.min(...scores);
                const max = Math.max(...scores);
                return { total, average, min, max };
            };

            const currentStats = useMemo(() =&gt; {
                return calculateStats(currentStudent);
            }, [currentStudent]);

            return (
                &lt;div class="min-h-screen flex flex-col no-print text-slate-100 bg-slate-950"&gt;
                    
                    {/* Header Utama Modern */}
                    &lt;header class="bg-gradient-to-r from-slate-900 via-emerald-950 to-slate-900 border-b border-emerald-500/20 shadow-xl sticky top-0 z-50 no-print"&gt;
                        &lt;div class="max-w-7xl mx-auto px-4 py-4 flex flex-col md:flex-row items-center justify-between gap-4"&gt;
                            &lt;div class="flex items-center gap-3"&gt;
                                &lt;div class="p-2.5 bg-emerald-500/10 rounded-xl border border-emerald-500/30"&gt;
                                    &lt;svg class="w-8 h-8 text-emerald-400" fill="none" stroke="currentColor" viewBox="0 0 24 24"&gt;
                                        &lt;path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 14l9-5-9-5-9 5 9 5zm0 0l9-5-9-5-9 5 9 5zm0 0v6m0-6L10 14" /&gt;
                                    &lt;/svg&gt;
                                &lt;/div&gt;
                                &lt;div&gt;
                                    &lt;h1 class="font-black text-lg sm:text-xl tracking-tight text-white flex items-center gap-2"&gt;
                                        E-RAPOR PKL &lt;span class="bg-emerald-500 text-slate-950 text-[10px] px-2 py-0.5 rounded font-black"&gt;TJKT 2&lt;/span&gt;
                                    &lt;/h1&gt;
                                    &lt;p class="text-xs text-slate-400"&gt;SMK Negeri 1 Tuntang - Tahun Pelajaran 2025/2026&lt;/p&gt;
                                &lt;/div&gt;
                            &lt;/div&gt;
                            
                            &lt;nav class="flex flex-wrap items-center gap-1.5 bg-slate-900/80 p-1.5 rounded-xl border border-slate-800"&gt;
                                &lt;button 
                                    onClick={() =&gt; setActiveTab("preview")}
                                    class={`px-4 py-2 rounded-lg font-bold text-xs transition-all ${activeTab === "preview" ? "bg-emerald-500 text-slate-950" : "hover:text-white text-slate-400"}`}
                                &gt;
                                    Pratinjau Rapor
                                &lt;/button&gt;
                                &lt;button 
                                    onClick={() =&gt; setActiveTab("dashboard")}
                                    class={`px-4 py-2 rounded-lg font-bold text-xs transition-all ${activeTab === "dashboard" ? "bg-emerald-500 text-slate-950" : "hover:text-white text-slate-400"}`}
                                &gt;
                                    Leger Kelas
                                &lt;/button&gt;
                                &lt;button 
                                    onClick={() =&gt; setActiveTab("editor")}
                                    class={`px-4 py-2 rounded-lg font-bold text-xs transition-all ${activeTab === "editor" ? "bg-emerald-500 text-slate-950" : "hover:text-white text-slate-400"}`}
                                &gt;
                                    Ubah Nilai
                                &lt;/button&gt;
                                &lt;button 
                                    onClick={() =&gt; setActiveTab("settings")}
                                    class={`px-4 py-2 rounded-lg font-bold text-xs transition-all ${activeTab === "settings" ? "bg-emerald-500 text-slate-950" : "hover:text-white text-slate-400"}`}
                                &gt;
                                    Kop &amp; Penandatangan
                                &lt;/button&gt;
                            &lt;/nav&gt;
                        &lt;/div&gt;
                    &lt;/header&gt;

                    {/* Toast Notification */}
                    {feedbackMsg &amp;&amp; (
                        &lt;div class="fixed bottom-6 right-6 z-50 bg-emerald-500 text-slate-950 font-bold px-5 py-3 rounded-xl shadow-2xl flex items-center gap-2 border border-emerald-400/30"&gt;
                            &lt;i data-lucide="check-circle" class="w-5 h-5"&gt;&lt;/i&gt;
                            &lt;span class="text-xs"&gt;{feedbackMsg}&lt;/span&gt;
                        &lt;/div&gt;
                    )}

                    {/* Kontainer Kerja Utama */}
                    &lt;main class="flex-grow max-w-7xl w-full mx-auto px-4 py-6"&gt;
                        
                        {/* Tab Pratinjau Rapor (Page 1 &amp; Page 2 Virtual) */}
                        {activeTab === "preview" &amp;&amp; (
                            &lt;div class="grid grid-cols-1 lg:grid-cols-4 gap-6 items-start"&gt;
                                
                                {/* Sidebar Daftar Siswa */}
                                &lt;div class="lg:col-span-1 bg-slate-900 border border-slate-800 rounded-2xl p-4 space-y-3 max-h-[80vh] overflow-y-auto no-print"&gt;
                                    &lt;div class="relative mb-2"&gt;
                                        &lt;i data-lucide="search" class="w-4 h-4 absolute left-3 top-1/2 -translate-y-1/2 text-slate-500"&gt;&lt;/i&gt;
                                        &lt;input 
                                            type="text" 
                                            placeholder="Cari murid..." 
                                            value={searchQuery}
                                            onChange={(e) =&gt; setSearchQuery(e.target.value)}
                                            class="w-full pl-9 pr-3 py-2 bg-slate-950 border border-slate-800 rounded-xl text-xs focus:outline-none focus:border-emerald-500 transition-all text-white font-medium"
                                        /&gt;
                                    &lt;/div&gt;
                                    &lt;div class="space-y-1"&gt;
                                        {filteredStudents.map(st =&gt; (
                                            &lt;button 
                                                key={st.id}
                                                onClick={() =&gt; setSelectedStudentId(st.id)}
                                                class={`w-full text-left px-3 py-2 rounded-xl transition flex items-center justify-between text-xs font-semibold ${selectedStudentId === st.id ? "bg-emerald-500/20 text-emerald-400 border border-emerald-500/30" : "hover:bg-slate-800 text-slate-300 border border-transparent"}`}
                                            &gt;
                                                &lt;span class="truncate pr-2"&gt;{st.name}&lt;/span&gt;
                                                &lt;span class="font-mono text-[10px] opacity-60 bg-slate-950 px-1.5 py-0.5 rounded"&gt;{st.nis}&lt;/span&gt;
                                            &lt;/button&gt;
                                        ))}
                                    &lt;/div&gt;
                                &lt;/div&gt;

                                {/* Viewer Lembaran Raport */}
                                &lt;div class="lg:col-span-3 space-y-6"&gt;
                                    &lt;div class="flex flex-col sm:flex-row items-center justify-between no-print bg-slate-900 border border-slate-800 p-4 rounded-2xl gap-4"&gt;
                                        &lt;div class="flex items-center gap-3"&gt;
                                            &lt;div class="bg-emerald-500/10 p-2 rounded-xl text-emerald-400"&gt;
                                                &lt;i data-lucide="printer" class="w-5 h-5"&gt;&lt;/i&gt;
                                            &lt;/div&gt;
                                            &lt;div&gt;
                                                &lt;h4 class="font-bold text-sm text-white"&gt;Pratinjau Kertas Rapor (F4 Single-Page)&lt;/h4&gt;
                                                &lt;p class="text-[11px] text-slate-400"&gt;Siap diunduh langsung sebagai berkas PDF F4 atau dicetak fisik.&lt;/p&gt;
                                            &lt;/div&gt;
                                        &lt;/div&gt;
                                        &lt;div class="flex flex-wrap items-center gap-2"&gt;
                                            &lt;button 
                                                onClick={() =&gt; setFontStyle(fontStyle === "serif" ? "sans" : "serif")}
                                                class="px-3 py-1.5 border border-slate-800 hover:bg-slate-800 rounded-lg text-xs font-semibold"
                                            &gt;
                                                Font: {fontStyle === "serif" ? "Times New Roman" : "Inter"}
                                            &lt;/button&gt;
                                            &lt;button 
                                                onClick={handleDownloadPDF}
                                                disabled={isExporting}
                                                class="px-4 py-2 bg-amber-500 hover:bg-amber-600 disabled:bg-amber-800 text-slate-950 rounded-xl text-xs font-black transition flex items-center gap-1.5 shadow-lg shadow-amber-500/10"
                                            &gt;
                                                {isExporting ? "Memproses..." : "Unduh PDF (F4)"}
                                            &lt;/button&gt;
                                            &lt;button 
                                                onClick={() =&gt; window.print()}
                                                class="px-4 py-2 bg-emerald-500 hover:bg-emerald-600 text-slate-950 rounded-xl text-xs font-black transition flex items-center gap-1.5 shadow-lg shadow-emerald-500/10"
                                            &gt;
                                                Cetak Rapor
                                            &lt;/button&gt;
                                        &lt;/div&gt;
                                    &lt;/div&gt;

                                    {/* Zona Pratinjau Kertas F4 */}
                                    &lt;div class="preview-container" id="print-area"&gt;
                                        
                                        &lt;div class={`preview-pane print-page ${fontStyle === "serif" ? "font-times" : ""}`}&gt;
                                            {/* Bagian Atas / Header */}
                                            &lt;div&gt;
                                                {/* Kop Sekolah Utama */}
                                                &lt;div class="kop-border border-b-[4px] border-double border-black pb-2 text-center flex items-center justify-between"&gt;
                                                    &lt;div class="w-14 h-14 flex-shrink-0 flex items-center justify-center relative group"&gt;
                                                        &lt;img src={logoLeft} alt="Logo Kiri" class="logo-img" /&gt;
                                                        
                                                        {/* Input mengambang cepat untuk ganti logo kiri */}
                                                        &lt;label class="absolute inset-0 bg-black/60 opacity-0 group-hover:opacity-100 transition flex items-center justify-center rounded cursor-pointer no-print text-[9px] text-white font-bold text-center p-1"&gt;
                                                            Ganti
                                                            &lt;input type="file" accept="image/*" class="hidden" onChange={(e) =&gt; handleLogoUpload(e, 'left')} /&gt;
                                                        &lt;/label&gt;
                                                    &lt;/div&gt;
                                                    
                                                    &lt;div class="flex-grow text-center px-4"&gt;
                                                        &lt;h2 class="font-bold text-[10pt] uppercase tracking-wide"&gt;Pemerintah Provinsi Jawa Tengah&lt;/h2&gt;
                                                        &lt;h2 class="font-bold text-[11pt] uppercase tracking-wider"&gt;Dinas Pendidikan&lt;/h2&gt;
                                                        &lt;h1 class="font-bold text-[13pt] tracking-normal"&gt;{schoolConfig.schoolName}&lt;/h1&gt;
                                                        &lt;p class="text-[7pt] leading-snug mt-1 font-sans text-slate-700"&gt;
                                                            {schoolConfig.address}&lt;br /&gt;
                                                            Telepon: {schoolConfig.phone} Kode Pos: {schoolConfig.postalCode} Pos-el: {schoolConfig.email} Laman: {schoolConfig.website}
                                                        &lt;/p&gt;
                                                    &lt;/div&gt;

                                                    &lt;div class="w-14 h-14 flex-shrink-0 flex items-center justify-center relative group"&gt;
                                                        &lt;img src={logoRight} alt="Logo Kanan" class="logo-img" /&gt;
                                                        
                                                        {/* Input mengambang cepat untuk ganti logo kanan */}
                                                        &lt;label class="absolute inset-0 bg-black/60 opacity-0 group-hover:opacity-100 transition flex items-center justify-center rounded cursor-pointer no-print text-[9px] text-white font-bold text-center p-1"&gt;
                                                            Ganti
                                                            &lt;input type="file" accept="image/*" class="hidden" onChange={(e) =&gt; handleLogoUpload(e, 'right')} /&gt;
                                                        &lt;/label&gt;
                                                    &lt;/div&gt;
                                                &lt;/div&gt;

                                                {/* Judul Dokumen */}
                                                &lt;div class="text-center my-3"&gt;
                                                    &lt;h3 class="font-bold text-[10.5pt] uppercase tracking-wide underline"&gt;Laporan Hasil Praktik Kerja Lapangan (PKL)&lt;/h3&gt;
                                                &lt;/div&gt;

                                                {/* Informasi / Metadata Siswa */}
                                                &lt;div class="grid grid-cols-2 gap-x-6 text-[9pt] mb-3 pb-1 border-b border-dashed border-slate-300"&gt;
                                                    &lt;div class="space-y-0.5"&gt;
                                                        &lt;div class="flex"&gt;&lt;span class="w-32"&gt;Nama Peserta Didik&lt;/span&gt;&lt;span class="flex-grow"&gt;: &lt;strong&gt;{currentStudent.name}&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;
                                                        &lt;div class="flex"&gt;&lt;span class="w-32"&gt;Sekolah&lt;/span&gt;&lt;span class="flex-grow"&gt;: {schoolConfig.schoolName}&lt;/span&gt;&lt;/div&gt;
                                                        &lt;div class="flex"&gt;&lt;span class="w-32"&gt;Kelas&lt;/span&gt;&lt;span class="flex-grow"&gt;: XII TJKT 2&lt;/span&gt;&lt;/div&gt;
                                                        &lt;div class="flex"&gt;&lt;span class="w-32"&gt;Pembimbing&lt;/span&gt;&lt;span class="flex-grow"&gt;: {currentStudent.advisor}&lt;/span&gt;&lt;/div&gt;
                                                    &lt;/div&gt;
                                                    &lt;div class="space-y-0.5"&gt;
                                                        &lt;div class="flex"&gt;&lt;span class="w-32"&gt;Tempat PKL&lt;/span&gt;&lt;span class="flex-grow"&gt;: &lt;strong&gt;{currentStudent.pklLocation}&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;
                                                        &lt;div class="flex"&gt;&lt;span class="w-32"&gt;Jurusan&lt;/span&gt;&lt;span class="flex-grow"&gt;: TJKT&lt;/span&gt;&lt;/div&gt;
                                                        &lt;div class="flex"&gt;&lt;span class="w-32"&gt;NIS&lt;/span&gt;&lt;span class="flex-grow"&gt;: {currentStudent.nis}&lt;/span&gt;&lt;/div&gt;
                                                        &lt;div class="flex"&gt;&lt;span class="w-32"&gt;Alamat&lt;/span&gt;&lt;span class="flex-grow" style={{fontSize: '8.5pt'}}&gt;: {currentStudent.pklAddress}&lt;/span&gt;&lt;/div&gt;
                                                        &lt;div class="flex"&gt;&lt;span class="w-32"&gt;Fase / Semester&lt;/span&gt;&lt;span class="flex-grow"&gt;: {schoolConfig.semester}&lt;/span&gt;&lt;/div&gt;
                                                    &lt;/div&gt;
                                                &lt;/div&gt;

                                                {}
                                                &lt;table class="w-full text-left border-collapse border border-black text-[8pt] leading-snug"&gt;
                                                    &lt;thead&gt;
                                                        &lt;tr class="bg-slate-100 font-bold text-center"&gt;
                                                            &lt;th class="border border-black py-1 px-1 w-8 text-center"&gt;NO&lt;/th&gt;
                                                            &lt;th class="border border-black py-1 px-2"&gt;ASPEK NON TEKNIS / TEKNIS&lt;br/&gt;&lt;span class="text-[7.5pt] font-normal italic"&gt;(Pendidikan, Etos Kerja &amp; Kompetensi Kejuruan)&lt;/span&gt;&lt;/th&gt;
                                                            &lt;th class="border border-black py-1 px-1 w-12 text-center"&gt;NILAI&lt;/th&gt;
                                                            &lt;th class="border border-black py-1 px-2 w-[45%] text-center"&gt;CAPAIAN KOMPETENSI&lt;/th&gt;
                                                        &lt;/tr&gt;
                                                    &lt;/thead&gt;
                                                    &lt;tbody&gt;
                                                        {/* Aspek Non-Teknis Header */}
                                                        &lt;tr class="bg-slate-100/50 font-bold"&gt;
                                                            &lt;td class="border border-black text-center py-0.5"&gt;I&lt;/td&gt;
                                                            &lt;td class="border border-black py-0.5 px-2" colspan="3"&gt;ASPEK NON TEKNIS (Pendidikan dan Etos Kerja)&lt;/td&gt;
                                                        &lt;/tr&gt;
                                                        {Object.entries(competencyMetadata)
                                                            .filter(([_, value]) =&gt; value.group === "Non-Teknis")
                                                            .map(([key, meta], idx) =&gt; (
                                                                &lt;tr key={key}&gt;
                                                                    &lt;td class="border border-black text-center py-0.5"&gt;{idx + 1}&lt;/td&gt;
                                                                    &lt;td class="border border-black py-0.5 px-2 font-medium"&gt;{meta.code} {meta.name}&lt;/td&gt;
                                                                    &lt;td class="border border-black text-center font-bold"&gt;{currentStudent.grades[key] || "-"}&lt;/td&gt;
                                                                    &lt;td class="border border-black py-0.5 px-2 text-[7.5pt]"&gt;
                                                                        {generateCompetenceFeedback(key, currentStudent.grades[key])}
                                                                    &lt;/td&gt;
                                                                &lt;/tr&gt;
                                                            ))
                                                        }

                                                        {/* Aspek Teknis Header */}
                                                        &lt;tr class="bg-slate-100/50 font-bold"&gt;
                                                            &lt;td class="border border-black text-center py-0.5"&gt;II&lt;/td&gt;
                                                            &lt;td class="border border-black py-0.5 px-2" colspan="3"&gt;ASPEK TEKNIS (Pelatihan Ketrampilan Kejuruan)&lt;/td&gt;
                                                        &lt;/tr&gt;
                                                        {Object.entries(competencyMetadata)
                                                            .filter(([_, value]) =&gt; value.group === "Teknis")
                                                            .map(([key, meta], idx) =&gt; (
                                                                &lt;tr key={key}&gt;
                                                                    &lt;td class="border border-black text-center py-0.5"&gt;{idx + 1}&lt;/td&gt;
                                                                    &lt;td class="border border-black py-0.5 px-2 font-medium"&gt;{meta.code} {meta.name}&lt;/td&gt;
                                                                    &lt;td class="border border-black text-center font-bold"&gt;{currentStudent.grades[key] || "-"}&lt;/td&gt;
                                                                    &lt;td class="border border-black py-0.5 px-2 text-[7.5pt]"&gt;
                                                                        {generateCompetenceFeedback(key, currentStudent.grades[key])}
                                                                    &lt;/td&gt;
                                                                &lt;/tr&gt;
                                                            ))
                                                        }

                                                        {/* Total Nilai &amp; Rata-rata */}
                                                        &lt;tr class="font-bold bg-slate-100"&gt;
                                                            &lt;td class="border border-black text-right py-1 px-2" colspan="2"&gt;Total Nilai&lt;/td&gt;
                                                            &lt;td class="border border-black text-center font-bold"&gt;{currentStats.total}&lt;/td&gt;
                                                            &lt;td class="border border-black text-slate-500 py-1 px-2 font-normal text-[7.5pt]"&gt;Akumulasi nilai keseluruhan kompetensi&lt;/td&gt;
                                                        &lt;/tr&gt;
                                                        &lt;tr class="font-bold bg-slate-100"&gt;
                                                            &lt;td class="border border-black text-right py-1 px-2" colspan="2"&gt;Hasil Penilaian Rata-rata&lt;/td&gt;
                                                            &lt;td class="border border-black text-center font-bold"&gt;{currentStats.average}&lt;/td&gt;
                                                            &lt;td class="border border-black py-1 px-2 text-[8pt]"&gt;
                                                                Kualifikasi Predikat: &lt;span class="font-bold text-black"&gt;{currentStats.average &gt;= 90 ? "SANGAT BAIK" : currentStats.average &gt;= 80 ? "BAIK" : "CUKUP"}&lt;/span&gt;
                                                            &lt;/td&gt;
                                                        &lt;/tr&gt;
                                                    &lt;/tbody&gt;
                                                &lt;/table&gt;
                                            &lt;/div&gt;

                                            {/* Bagian Bawah / Tanda Tangan &amp; Presensi */}
                                            &lt;div&gt;
                                                {/* Baris Presensi dan Tanggal */}
                                                &lt;div class="flex justify-between items-start mt-3"&gt;
                                                    &lt;div class="w-1/2"&gt;
                                                        &lt;table class="w-full text-left border-collapse border border-black text-[8pt]"&gt;
                                                            &lt;thead&gt;
                                                                &lt;tr class="bg-slate-100 font-bold text-center"&gt;
                                                                    &lt;th class="border border-black py-0.5 px-2" colspan="2"&gt;KETIDAKHADIRAN (PRESENSI)&lt;/th&gt;
                                                                &lt;/tr&gt;
                                                            &lt;/thead&gt;
                                                            &lt;tbody&gt;
                                                                &lt;tr&gt;
                                                                    &lt;td class="border border-black py-0.5 px-2 font-medium"&gt;Sakit&lt;/td&gt;
                                                                    &lt;td class="border border-black py-0.5 px-2 text-center font-bold"&gt;{currentStudent.attendance?.sakit || 0} hari&lt;/td&gt;
                                                                &lt;/tr&gt;
                                                                &lt;tr&gt;
                                                                    &lt;td class="border border-black py-0.5 px-2 font-medium"&gt;Izin&lt;/td&gt;
                                                                    &lt;td class="border border-black py-0.5 px-2 text-center font-bold"&gt;{currentStudent.attendance?.izin || 0} hari&lt;/td&gt;
                                                                &lt;/tr&gt;
                                                                &lt;tr&gt;
                                                                    &lt;td class="border border-black py-0.5 px-2 font-medium"&gt;Tanpa Keterangan&lt;/td&gt;
                                                                    &lt;td class="border border-black py-0.5 px-2 text-center font-bold"&gt;{currentStudent.attendance?.alpha || 0} hari&lt;/td&gt;
                                                                &lt;/tr&gt;
                                                            &lt;/tbody&gt;
                                                        &lt;/table&gt;
                                                    &lt;/div&gt;
                                                    &lt;div class="text-right text-[8.5pt] font-medium"&gt;
                                                        &lt;p&gt;Tuntang, {schoolConfig.printDate}&lt;/p&gt;
                                                    &lt;/div&gt;
                                                &lt;/div&gt;

                                                {/* Baris Tanda Tangan Ringkas 2 Kolom Sejajar (DUDI &amp; Kepala Sekolah Dihapus) */}
                                                &lt;div class="flex justify-between text-[8.5pt] mt-8 text-center"&gt;
                                                    &lt;div class="w-5/12"&gt;
                                                        &lt;p class="mb-14"&gt;Orang Tua/Wali Peserta Didik,&lt;/p&gt;
                                                        &lt;p class="font-bold border-b border-black w-3/4 mx-auto pb-0.5"&gt;&lt;/p&gt;
                                                    &lt;/div&gt;

                                                    &lt;div class="w-5/12"&gt;
                                                        &lt;p class="mb-14"&gt;Wali Kelas,&lt;/p&gt;
                                                        &lt;p class="font-bold underline uppercase"&gt;{schoolConfig.homeroomTeacher}&lt;/p&gt;
                                                        &lt;p class="text-[7.5pt] font-mono mt-0.5"&gt;NIP. {schoolConfig.homeroomNip}&lt;/p&gt;
                                                    &lt;/div&gt;
                                                &lt;/div&gt;
                                            &lt;/div&gt;
                                        &lt;/div&gt;

                                    &lt;/div&gt;
                                &lt;/div&gt;
                            &lt;/div&gt;
                        )}

                        {/* Tab Leger Kelas Lengkap */}
                        {activeTab === "dashboard" &amp;&amp; (
                            &lt;div class="space-y-6"&gt;
                                {/* Filter &amp; Pencarian */}
                                &lt;div class="bg-slate-900 rounded-2xl p-6 border border-slate-800 flex flex-col md:flex-row items-center justify-between gap-4"&gt;
                                    &lt;div class="flex-grow w-full md:max-w-md relative"&gt;
                                        &lt;i data-lucide="search" class="w-5 h-5 absolute left-3 top-1/2 -translate-y-1/2 text-slate-500"&gt;&lt;/i&gt;
                                        &lt;input 
                                            type="text" 
                                            placeholder="Cari murid, tempat PKL, atau pembimbing..." 
                                            value={searchQuery}
                                            onChange={(e) =&gt; setSearchQuery(e.target.value)}
                                            class="w-full pl-10 pr-4 py-2.5 bg-slate-950 border border-slate-800 rounded-xl focus:outline-none focus:ring-2 focus:ring-emerald-500/20 focus:border-emerald-500 transition-all text-sm text-white"
                                        /&gt;
                                    &lt;/div&gt;
                                    &lt;div class="flex flex-wrap items-center gap-3 w-full md:w-auto"&gt;
                                        &lt;div class="flex items-center gap-2"&gt;
                                            &lt;span class="text-xs font-bold text-slate-400 uppercase"&gt;Lokasi Industri:&lt;/span&gt;
                                            &lt;select 
                                                value={filterLocation}
                                                onChange={(e) =&gt; setFilterLocation(e.target.value)}
                                                class="bg-slate-950 border border-slate-800 text-sm rounded-xl py-2 px-3 focus:outline-none focus:ring-2 focus:ring-emerald-500/20 text-slate-300 font-medium"
                                            &gt;
                                                {uniqueLocations.map(loc =&gt; (
                                                    &lt;option key={loc} value={loc}&gt;{loc === "ALL" ? "Semua Lokasi" : loc}&lt;/option&gt;
                                                ))}
                                            &lt;/select&gt;
                                        &lt;/div&gt;
                                    &lt;/div&gt;
                                &lt;/div&gt;

                                {/* Tabel Leger Utama */}
                                &lt;div class="bg-slate-900 rounded-2xl border border-slate-800 overflow-hidden"&gt;
                                    &lt;div class="px-6 py-4 border-b border-slate-800 flex items-center justify-between"&gt;
                                        &lt;div&gt;
                                            &lt;h3 class="font-bold text-lg text-white"&gt;Leger Rapor Kelas XI TJKT 2&lt;/h3&gt;
                                            &lt;p class="text-xs text-slate-400"&gt;Menampilkan {filteredStudents.length} siswa sesuai kriteria&lt;/p&gt;
                                        &lt;/div&gt;
                                    &lt;/div&gt;

                                    &lt;div class="overflow-x-auto"&gt;
                                        &lt;table class="w-full text-left text-sm text-slate-300"&gt;
                                            &lt;thead class="bg-slate-950 border-b border-slate-800 text-xs font-bold text-slate-400 uppercase tracking-wider"&gt;
                                                &lt;tr&gt;
                                                    &lt;th class="py-3.5 px-4 text-center w-12 border-0"&gt;NIS&lt;/th&gt;
                                                    &lt;th class="py-3.5 px-4 border-0"&gt;Nama Peserta Didik&lt;/th&gt;
                                                    &lt;th class="py-3.5 px-4 text-center border-0"&gt;Rata-rata&lt;/th&gt;
                                                    &lt;th class="py-3.5 px-4 text-center border-0"&gt;Rangking&lt;/th&gt;
                                                    &lt;th class="py-3.5 px-4 text-center border-0"&gt;Jumlah Nilai&lt;/th&gt;
                                                    &lt;th class="py-3.5 px-4 border-0"&gt;Tempat PKL&lt;/th&gt;
                                                    &lt;th class="py-3.5 px-4 border-0"&gt;Pembimbing&lt;/th&gt;
                                                    &lt;th class="py-3.5 px-4 text-center border-0"&gt;Aksi&lt;/th&gt;
                                                &lt;/tr&gt;
                                            &lt;/thead&gt;
                                            &lt;tbody class="divide-y divide-slate-800/60"&gt;
                                                {filteredStudents.map(st =&gt; {
                                                    const stats = calculateStats(st);
                                                    return (
                                                        &lt;tr 
                                                            key={st.id} 
                                                            class={`hover:bg-slate-800/40 transition ${selectedStudentId === st.id ? "bg-emerald-500/5 font-semibold text-emerald-400" : ""}`}
                                                        &gt;
                                                            &lt;td class="py-3 px-4 text-center text-slate-500 font-mono text-xs border-0"&gt;{st.nis}&lt;/td&gt;
                                                            &lt;td class="py-3 px-4 border-0"&gt;
                                                                &lt;div class="font-bold text-white"&gt;{st.name}&lt;/div&gt;
                                                                &lt;div class="text-[10px] text-slate-500 tracking-wider font-mono"&gt;NISN: {st.nisn}&lt;/div&gt;
                                                            &lt;/td&gt;
                                                            &lt;td class="py-3 px-4 text-center border-0"&gt;
                                                                &lt;span class={`inline-flex items-center px-2.5 py-1 rounded-full text-xs font-bold ${stats.average &gt;= 90 ? "bg-emerald-500/10 text-emerald-400" : "bg-blue-500/10 text-blue-400"}`}&gt;
                                                                    {stats.average || "-"}
                                                                &lt;/span&gt;
                                                            &lt;/td&gt;
                                                            &lt;td class="py-3 px-4 text-center font-bold text-slate-200 border-0"&gt;
                                                                {getRank(st.id)}
                                                            &lt;/td&gt;
                                                            &lt;td class="py-3 px-4 text-center font-semibold text-slate-300 border-0"&gt;{stats.total || "-"}&lt;/td&gt;
                                                            &lt;td class="py-3 px-4 border-0"&gt;
                                                                &lt;span class="text-xs bg-slate-950 border border-slate-800 px-2 py-1 rounded-md text-slate-300 font-medium"&gt;{st.pklLocation}&lt;/span&gt;
                                                            &lt;/td&gt;
                                                            &lt;td class="py-3 px-4 text-xs font-medium text-slate-400 border-0"&gt;{st.advisor}&lt;/td&gt;
                                                            &lt;td class="py-3 px-4 text-center border-0"&gt;
                                                                &lt;button 
                                                                    onClick={() =&gt; { setSelectedStudentId(st.id); setActiveTab("preview"); }}
                                                                    class="p-1.5 hover:bg-emerald-500 hover:text-slate-950 text-emerald-400 rounded-lg transition"
                                                                &gt;
                                                                    Pratinjau
                                                                &lt;/button&gt;
                                                            &lt;/td&gt;
                                                        &lt;/tr&gt;
                                                    );
                                                })}
                                            &lt;/tbody&gt;
                                        &lt;/table&gt;
                                    &lt;/div&gt;
                                &lt;/div&gt;
                            &lt;/div&gt;
                        )}

                        {/* Tab Input/Edit Nilai Rapor */}
                        {activeTab === "editor" &amp;&amp; (
                            &lt;div class="bg-slate-900 rounded-2xl p-6 border border-slate-800 max-w-4xl mx-auto space-y-6"&gt;
                                &lt;div class="flex flex-col sm:flex-row sm:items-center justify-between border-b border-slate-800 pb-4 gap-3"&gt;
                                    &lt;div&gt;
                                        &lt;h3 class="font-black text-xl text-white"&gt;Input &amp; Koreksi Nilai PKL&lt;/h3&gt;
                                        &lt;p class="text-xs text-slate-400"&gt;Ubah nilai Aspek Teknis &amp; Non-Teknis secara langsung&lt;/p&gt;
                                    &lt;/div&gt;
                                    &lt;div class="flex items-center gap-2"&gt;
                                        &lt;label class="text-xs font-bold text-slate-400 uppercase"&gt;Pilih Siswa:&lt;/label&gt;
                                        &lt;select 
                                            value={selectedStudentId}
                                            onChange={(e) =&gt; setSelectedStudentId(Number(e.target.value))}
                                            class="bg-slate-950 border border-slate-800 text-sm rounded-xl py-1.5 px-3 font-semibold text-slate-300 focus:outline-none focus:border-emerald-500"
                                        &gt;
                                            {students.map(st =&gt; (
                                                &lt;option key={st.id} value={st.id}&gt;{st.name} ({st.nis})&lt;/option&gt;
                                            ))}
                                        &lt;/select&gt;
                                    &lt;/div&gt;
                                &lt;/div&gt;

                                {editingStudent &amp;&amp; (
                                    &lt;div class="space-y-6"&gt;
                                        {/* Aspek Non Teknis */}
                                        &lt;div&gt;
                                            &lt;h4 class="font-bold text-sm text-emerald-400 uppercase tracking-wider mb-3 bg-slate-950 border border-slate-800 px-3 py-1.5 rounded-lg"&gt;
                                                I. Aspek Non-Teknis (Pendidikan &amp; Etos Kerja)
                                            &lt;/h4&gt;
                                            &lt;div class="grid grid-cols-1 md:grid-cols-2 gap-4"&gt;
                                                {Object.entries(competencyMetadata)
                                                    .filter(([_, value]) =&gt; value.group === "Non-Teknis")
                                                    .map(([key, meta]) =&gt; (
                                                        &lt;div key={key} class="flex items-center justify-between p-3 bg-slate-950 border border-slate-800 rounded-xl"&gt;
                                                            &lt;div class="flex-grow pr-3"&gt;
                                                                &lt;span class="text-xs font-bold text-emerald-400 font-mono"&gt;{meta.code}&lt;/span&gt;
                                                                &lt;p class="text-xs font-bold text-slate-200"&gt;{meta.name}&lt;/p&gt;
                                                            &lt;/div&gt;
                                                            &lt;input 
                                                                type="number" 
                                                                min="0" 
                                                                max="100" 
                                                                value={editingStudent.grades[key]}
                                                                onChange={(e) =&gt; {
                                                                    const val = Number(e.target.value);
                                                                    setEditingStudent(prev =&gt; ({
                                                                        ...prev,
                                                                        grades: { ...prev.grades, [key]: val }
                                                                    }));
                                                                }}
                                                                class="w-16 px-2.5 py-1.5 bg-slate-900 border border-slate-800 rounded-lg text-center font-bold text-white focus:outline-none focus:border-emerald-500"
                                                            /&gt;
                                                        &lt;/div&gt;
                                                    ))
                                                }
                                            &lt;/div&gt;
                                        &lt;/div&gt;

                                        {/* Aspek Teknis */}
                                        &lt;div&gt;
                                            &lt;h4 class="font-bold text-sm text-blue-400 uppercase tracking-wider mb-3 bg-slate-950 border border-slate-800 px-3 py-1.5 rounded-lg"&gt;
                                                II. Aspek Teknis (Kompetensi Kejuruan TJKT)
                                            &lt;/h4&gt;
                                            &lt;div class="grid grid-cols-1 md:grid-cols-2 gap-4"&gt;
                                                {Object.entries(competencyMetadata)
                                                    .filter(([_, value]) =&gt; value.group === "Teknis")
                                                    .map(([key, meta]) =&gt; (
                                                        &lt;div key={key} class="flex items-center justify-between p-3 bg-slate-950 border border-slate-800 rounded-xl"&gt;
                                                            &lt;div class="flex-grow pr-3"&gt;
                                                                &lt;span class="text-xs font-bold text-blue-400 font-mono"&gt;{meta.code}&lt;/span&gt;
                                                                &lt;p class="text-xs font-bold text-slate-200"&gt;{meta.name}&lt;/p&gt;
                                                            &lt;/div&gt;
                                                            &lt;input 
                                                                type="number" 
                                                                min="0" 
                                                                max="100" 
                                                                value={editingStudent.grades[key]}
                                                                onChange={(e) =&gt; {
                                                                    const val = Number(e.target.value);
                                                                    setEditingStudent(prev =&gt; ({
                                                                        ...prev,
                                                                        grades: { ...prev.grades, [key]: val }
                                                                    }));
                                                                }}
                                                                class="w-16 px-2.5 py-1.5 bg-slate-900 border border-slate-800 rounded-lg text-center font-bold text-white focus:outline-none focus:border-blue-500"
                                                            /&gt;
                                                        &lt;/div&gt;
                                                    ))
                                                }
                                            &lt;/div&gt;
                                        &lt;/div&gt;

                                        {/* Ketidakhadiran */}
                                        &lt;div&gt;
                                            &lt;h4 class="font-bold text-sm text-amber-400 uppercase tracking-wider mb-3 bg-slate-950 border border-slate-800 px-3 py-1.5 rounded-lg"&gt;
                                                III. Kehadiran &amp; Absensi (Hari)
                                            &lt;/h4&gt;
                                            &lt;div class="grid grid-cols-3 gap-4"&gt;
                                                &lt;div class="p-3 bg-slate-950 border border-slate-800 rounded-xl text-center"&gt;
                                                    &lt;label class="block text-xs font-bold text-slate-400 mb-1.5"&gt;Sakit&lt;/label&gt;
                                                    &lt;input 
                                                        type="number" 
                                                        min="0"
                                                        value={editingStudent.attendance?.sakit || 0}
                                                        onChange={(e) =&gt; {
                                                            const val = Number(e.target.value);
                                                            setEditingStudent(prev =&gt; ({
                                                                ...prev,
                                                                attendance: { ...prev.attendance, sakit: val }
                                                            }));
                                                        }}
                                                        class="w-full max-w-[100px] text-center px-2 py-1.5 bg-slate-900 border border-slate-800 rounded-lg text-white font-bold"
                                                    /&gt;
                                                &lt;/div&gt;
                                                &lt;div class="p-3 bg-slate-950 border border-slate-800 rounded-xl text-center"&gt;
                                                    &lt;label class="block text-xs font-bold text-slate-400 mb-1.5"&gt;Izin&lt;/label&gt;
                                                    &lt;input 
                                                        type="number" 
                                                        min="0"
                                                        value={editingStudent.attendance?.izin || 0}
                                                        onChange={(e) =&gt; {
                                                            const val = Number(e.target.value);
                                                            setEditingStudent(prev =&gt; ({
                                                                ...prev,
                                                                attendance: { ...prev.attendance, izin: val }
                                                            }));
                                                        }}
                                                        class="w-full max-w-[100px] text-center px-2 py-1.5 bg-slate-900 border border-slate-800 rounded-lg text-white font-bold"
                                                    /&gt;
                                                &lt;/div&gt;
                                                &lt;div class="p-3 bg-slate-950 border border-slate-800 rounded-xl text-center"&gt;
                                                    &lt;label class="block text-xs font-bold text-slate-400 mb-1.5"&gt;Tanpa Keterangan&lt;/label&gt;
                                                    &lt;input 
                                                        type="number" 
                                                        min="0"
                                                        value={editingStudent.attendance?.alpha || 0}
                                                        onChange={(e) =&gt; {
                                                            const val = Number(e.target.value);
                                                            setEditingStudent(prev =&gt; ({
                                                                ...prev,
                                                                attendance: { ...prev.attendance, alpha: val }
                                                            }));
                                                        }}
                                                        class="w-full max-w-[100px] text-center px-2 py-1.5 bg-slate-900 border border-slate-800 rounded-lg text-red-400 font-bold"
                                                    /&gt;
                                                &lt;/div&gt;
                                            &lt;/div&gt;
                                        &lt;/div&gt;

                                        &lt;div class="flex items-center justify-end gap-3 pt-4 border-t border-slate-800"&gt;
                                            &lt;button 
                                                onClick={handleUpdateGrades}
                                                class="px-5 py-2.5 bg-emerald-500 hover:bg-emerald-600 text-slate-950 rounded-xl text-xs font-black transition flex items-center gap-2"
                                            &gt;
                                                Simpan Rapor Siswa
                                            &lt;/button&gt;
                                        &lt;/div&gt;
                                    &lt;/div&gt;
                                )}
                            &lt;/div&gt;
                        )}

                        {/* Tab Pengaturan Informasi Umum */}
                        {activeTab === "settings" &amp;&amp; (
                            &lt;div class="bg-slate-900 rounded-2xl p-6 border border-slate-800 max-w-3xl mx-auto space-y-6"&gt;
                                &lt;div class="border-b border-slate-800 pb-3"&gt;
                                    &lt;h3 class="font-black text-lg text-white"&gt;Konfigurasi Rapor PKL&lt;/h3&gt;
                                    &lt;p class="text-xs text-slate-400"&gt;Atur logo kop surat, wali kelas, tanggal, dan fase semester&lt;/p&gt;
                                &lt;/div&gt;

                                {/* Bagian Unggah Logo Kustom di Pengaturan */}
                                &lt;div&gt;
                                    &lt;h4 class="text-xs font-bold text-slate-400 uppercase tracking-wider mb-3"&gt;Identitas Visual / Logo KOP&lt;/h4&gt;
                                    &lt;div class="grid grid-cols-1 md:grid-cols-2 gap-4"&gt;
                                        &lt;div class="p-4 bg-slate-950 border border-slate-800 rounded-xl flex items-center gap-4"&gt;
                                            &lt;div class="w-12 h-12 bg-white rounded p-1 flex items-center justify-center flex-shrink-0"&gt;
                                                &lt;img src={logoLeft} alt="Logo Kiri" class="max-h-full max-w-full object-contain" /&gt;
                                            &lt;/div&gt;
                                            &lt;div class="flex-grow"&gt;
                                                &lt;label class="block text-xs font-bold text-slate-300 mb-1"&gt;Logo Kiri KOP (Pemprov Jateng)&lt;/label&gt;
                                                &lt;input 
                                                    type="file" 
                                                    accept="image/*" 
                                                    onChange={(e) =&gt; handleLogoUpload(e, 'left')}
                                                    class="block w-full text-xs text-slate-400 file:mr-3 file:py-1.5 file:px-3 file:rounded-lg file:border-0 file:text-xs file:font-semibold file:bg-emerald-500 file:text-slate-950 hover:file:bg-emerald-400 cursor-pointer"
                                                /&gt;
                                            &lt;/div&gt;
                                        &lt;/div&gt;

                                        &lt;div class="p-4 bg-slate-950 border border-slate-800 rounded-xl flex items-center gap-4"&gt;
                                            &lt;div class="w-12 h-12 bg-white rounded p-1 flex items-center justify-center flex-shrink-0"&gt;
                                                &lt;img src={logoRight} alt="Logo Kanan" class="max-h-full max-w-full object-contain" /&gt;
                                            &lt;/div&gt;
                                            &lt;div class="flex-grow"&gt;
                                                &lt;label class="block text-xs font-bold text-slate-300 mb-1"&gt;Logo Kanan KOP (Logo Sekolah)&lt;/label&gt;
                                                &lt;input 
                                                    type="file" 
                                                    accept="image/*" 
                                                    onChange={(e) =&gt; handleLogoUpload(e, 'right')}
                                                    class="block w-full text-xs text-slate-400 file:mr-3 file:py-1.5 file:px-3 file:rounded-lg file:border-0 file:text-xs file:font-semibold file:bg-emerald-500 file:text-slate-950 hover:file:bg-emerald-400 cursor-pointer"
                                                /&gt;
                                            &lt;/div&gt;
                                        &lt;/div&gt;
                                    &lt;/div&gt;
                                &lt;/div&gt;

                                &lt;div class="grid grid-cols-1 md:grid-cols-2 gap-5"&gt;
                                    &lt;div&gt;
                                        &lt;label class="block text-xs font-bold text-slate-400 uppercase mb-1"&gt;Nama Lembaga / Sekolah&lt;/label&gt;
                                        &lt;input 
                                            type="text" 
                                            value={schoolConfig.schoolName}
                                            onChange={(e) =&gt; setSchoolConfig(prev =&gt; ({ ...prev, schoolName: e.target.value }))}
                                            class="w-full px-3 py-2 bg-slate-950 border border-slate-800 rounded-xl focus:border-emerald-500 text-sm font-semibold text-white"
                                        /&gt;
                                    &lt;/div&gt;

                                    &lt;div&gt;
                                        &lt;label class="block text-xs font-bold text-slate-400 uppercase mb-1"&gt;Nama Kepala Sekolah&lt;/label&gt;
                                        &lt;input 
                                            type="text" 
                                            value={schoolConfig.headmasterName}
                                            onChange={(e) =&gt; setSchoolConfig(prev =&gt; ({ ...prev, headmasterName: e.target.value }))}
                                            class="w-full px-3 py-2 bg-slate-950 border border-slate-800 rounded-xl focus:border-emerald-500 text-sm font-semibold text-white"
                                        /&gt;
                                    &lt;/div&gt;

                                    &lt;div&gt;
                                        &lt;label class="block text-xs font-bold text-slate-400 uppercase mb-1"&gt;NIP Kepala Sekolah&lt;/label&gt;
                                        &lt;input 
                                            type="text" 
                                            value={schoolConfig.headmasterNip}
                                            onChange={(e) =&gt; setSchoolConfig(prev =&gt; ({ ...prev, headmasterNip: e.target.value }))}
                                            class="w-full px-3 py-2 bg-slate-950 border border-slate-800 rounded-xl focus:border-emerald-500 text-sm font-semibold text-white"
                                        /&gt;
                                    &lt;/div&gt;

                                    &lt;div&gt;
                                        &lt;label class="block text-xs font-bold text-slate-400 uppercase mb-1"&gt;Nama Wali Kelas&lt;/label&gt;
                                        &lt;input 
                                            type="text" 
                                            value={schoolConfig.homeroomTeacher}
                                            onChange={(e) =&gt; setSchoolConfig(prev =&gt; ({ ...prev, homeroomTeacher: e.target.value }))}
                                            class="w-full px-3 py-2 bg-slate-950 border border-slate-800 rounded-xl focus:border-emerald-500 text-sm font-semibold text-white"
                                        /&gt;
                                    &lt;/div&gt;

                                    &lt;div&gt;
                                        &lt;label class="block text-xs font-bold text-slate-400 uppercase mb-1"&gt;NIP Wali Kelas&lt;/label&gt;
                                        &lt;input 
                                            type="text" 
                                            value={schoolConfig.homeroomNip}
                                            onChange={(e) =&gt; setSchoolConfig(prev =&gt; ({ ...prev, homeroomNip: e.target.value }))}
                                            class="w-full px-3 py-2 bg-slate-950 border border-slate-800 rounded-xl focus:border-emerald-500 text-sm font-semibold text-white"
                                        /&gt;
                                    &lt;/div&gt;

                                    &lt;div&gt;
                                        &lt;label class="block text-xs font-bold text-slate-400 uppercase mb-1"&gt;Tempat Penandatanganan&lt;/label&gt;
                                        &lt;input 
                                            type="text" 
                                            value={schoolConfig.printLocation}
                                            onChange={(e) =&gt; setSchoolConfig(prev =&gt; ({ ...prev, printLocation: e.target.value }))}
                                            class="w-full px-3 py-2 bg-slate-950 border border-slate-800 rounded-xl focus:border-emerald-500 text-sm font-semibold text-white"
                                        /&gt;
                                    &lt;/div&gt;

                                    &lt;div&gt;
                                        &lt;label class="block text-xs font-bold text-slate-400 uppercase mb-1"&gt;Tanggal Cetak Rapor&lt;/label&gt;
                                        &lt;input 
                                            type="text" 
                                            value={schoolConfig.printDate}
                                            onChange={(e) =&gt; setSchoolConfig(prev =&gt; ({ ...prev, printDate: e.target.value }))}
                                            class="w-full px-3 py-2 bg-slate-950 border border-slate-800 rounded-xl focus:border-emerald-500 text-sm font-semibold text-white"
                                        /&gt;
                                    &lt;/div&gt;

                                    &lt;div&gt;
                                        &lt;label class="block text-xs font-bold text-slate-400 uppercase mb-1"&gt;Fase / Semester&lt;/label&gt;
                                        &lt;input 
                                            type="text" 
                                            value={schoolConfig.semester}
                                            onChange={(e) =&gt; setSchoolConfig(prev =&gt; ({ ...prev, semester: e.target.value }))}
                                            class="w-full px-3 py-2 bg-slate-950 border border-slate-800 rounded-xl focus:border-emerald-500 text-sm font-semibold text-white"
                                        /&gt;
                                    &lt;/div&gt;
                                &lt;/div&gt;

                                &lt;div class="flex items-center justify-between pt-4 border-t border-slate-800"&gt;
                                    &lt;button 
                                        onClick={() =&gt; {
                                            setLogoLeft(defaultLogoLeftSVG);
                                            setLogoRight(defaultLogoRightSVG);
                                            setFeedbackMsg("Logo KOP berhasil di-reset!");
                                            setTimeout(() =&gt; setFeedbackMsg(""), 3000);
                                        }}
                                        class="px-4 py-2 border border-slate-800 hover:bg-slate-800 rounded-xl text-xs font-bold text-slate-300 transition"
                                    &gt;
                                        Reset Logo KOP saja
                                    &lt;/button&gt;
                                    &lt;button 
                                        onClick={() =&gt; {
                                            setSchoolConfig(initialSchoolConfig);
                                            setLogoLeft(defaultLogoLeftSVG);
                                            setLogoRight(defaultLogoRightSVG);
                                            setFeedbackMsg("Informasi dikembalikan ke default SMKN 1 Tuntang!");
                                            setTimeout(() =&gt; setFeedbackMsg(""), 3000);
                                        }}
                                        class="px-4 py-2 border border-red-500/30 text-red-400 hover:bg-red-500/10 rounded-xl text-xs font-bold transition"
                                    &gt;
                                        Reset Semua Pengaturan Default
                                    &lt;/button&gt;
                                &lt;/div&gt;
                            &lt;/div&gt;
                        )}

                    &lt;/main&gt;

                    {/* Footer Layar */}
                    &lt;footer class="bg-slate-950 border-t border-slate-900 py-6 text-center text-xs text-slate-500 no-print"&gt;
                        &lt;p&gt;© 2026 SMK Negeri 1 Tuntang. Dioptimalkan persis dokumen fisik.&lt;/p&gt;
                    &lt;/footer&gt;
                &lt;/div&gt;
            );
        }

        const container = document.getElementById('root');
        const root = ReactDOM.createRoot(container);
        root.render(&lt;App /&gt;);

        // Inisialisasi ikon Lucide
        setTimeout(() =&gt; {
            if (typeof lucide !== 'undefined') {
                lucide.createIcons();
            }
        }, 300);
    &lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</description><link>http://kitab-investasi.blogspot.com/2026/06/e-raport-pkl.html</link><thr:total>0</thr:total><author>nof_rizal07@yahoo.co.id (abang_cool)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-9000860041661554971.post-6877348685293008822</guid><pubDate>Wed, 24 Jun 2026 06:34:42 +0000</pubDate><atom:updated>2026-06-25T11:34:08.693+07:00</atom:updated><title>RAPORT PKL</title><description>&lt;!DOCTYPE html&gt;
&lt;html lang="id"&gt;
&lt;head&gt;
    &lt;meta charset="UTF-8"&gt;
    &lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&gt;
    &lt;title&gt;Generator Raport PKL TJKT 2&lt;/title&gt;
    &lt;link href="https://fonts.googleapis.com/css2?family=Montserrat:wght@400;600;700;800&amp;display=swap" rel="stylesheet"&gt;
    &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/2.5.1/jspdf.umd.min.js"&gt;
    &lt;/script&gt;
    &lt;style&gt;
        * {
            box-sizing: border-box;
        }

        body {
            font-family: 'Montserrat', Arial, sans-serif;
            background: #eef2f7;
            padding: 20px;
            max-width: 900px;
            margin: auto;
        }

        .card {
            background: white;
            padding: 28px 30px;
            border-radius: 24px;
            box-shadow: 0 12px 30px rgba(0, 0, 0, 0.10);
        }

        h2 {
            text-align: center;
            color: #1e4668;
            font-weight: 700;
            margin-top: 0;
            margin-bottom: 6px;
            font-size: 24px;
        }

        .sub-title {
            text-align: center;
            color: #4a6f8a;
            font-size: 14px;
            margin-bottom: 20px;
            font-weight: 400;
        }

        .form-row {
            display: flex;
            gap: 16px;
            flex-wrap: wrap;
            margin-top: 10px;
        }

        .form-group {
            flex: 1 1 200px;
            min-width: 170px;
        }

        label {
            display: block;
            font-weight: 600;
            font-size: 13px;
            color: #1e4668;
            margin-bottom: 4px;
        }

        input,
        select {
            width: 100%;
            padding: 10px 12px;
            border-radius: 10px;
            border: 1px solid #ccc;
            font-size: 14px;
            font-family: 'Montserrat', Arial, sans-serif;
            background: white;
            transition: 0.2s;
        }

        input:focus,
        select:focus {
            border-color: #2c7da0;
            outline: none;
            box-shadow: 0 0 0 3px rgba(44, 125, 160, 0.15);
        }

        input:disabled,
        select:disabled {
            background: #f1f5f9;
            color: #334;
        }

        .btn-primary {
            background: #2c7da0;
            color: white;
            border: none;
            cursor: pointer;
            font-weight: 700;
            padding: 12px 20px;
            border-radius: 12px;
            font-size: 16px;
            width: 100%;
            transition: 0.2s;
            font-family: 'Montserrat', Arial, sans-serif;
        }

        .btn-primary:hover {
            background: #1f5e7a;
        }

        .btn-primary:disabled {
            background: #94a3b8;
            cursor: not-allowed;
        }

        #preview {
            width: 100%;
            border-radius: 12px;
            margin-top: 14px;
            border: 1px solid #ddd;
            background: #fafafa;
            min-height: 200px;
            object-fit: contain;
        }

        .loading {
            display: none;
            margin-top: 16px;
            color: #1e4668;
            font-weight: 600;
            text-align: center;
            font-size: 15px;
        }

        .student-select-wrap {
            margin-top: 6px;
        }

        .info-note {
            background: #f8faff;
            border-radius: 12px;
            padding: 12px 16px;
            margin: 12px 0 10px 0;
            border: 1px dashed #b6cfe0;
            font-size: 13px;
            color: #2c3e50;
            line-height: 1.6;
        }

        .info-note strong {
            color: #1e4668;
        }

        .badge-jurusan {
            display: inline-block;
            background: #d4e4ed;
            color: #1e4668;
            padding: 2px 12px;
            border-radius: 30px;
            font-size: 12px;
            font-weight: 600;
        }

        .upload-area {
            margin-top: 12px;
            padding: 12px;
            border: 2px dashed #b6cfe0;
            border-radius: 12px;
            background: #f8faff;
            text-align: center;
        }

        .upload-area label {
            display: inline-block;
            background: #2c7da0;
            color: white;
            padding: 8px 16px;
            border-radius: 8px;
            cursor: pointer;
            font-weight: 600;
            font-size: 13px;
        }

        .upload-area input[type="file"] {
            display: none;
        }

        .upload-area .hint {
            font-size: 12px;
            color: #666;
            margin-top: 6px;
        }

        @media (max-width: 600px) {
            .card {
                padding: 16px;
            }
            .form-group {
                flex: 1 1 100%;
            }
            h2 {
                font-size: 20px;
            }
        }
    &lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;

    &lt;div class="card"&gt;

        &lt;h2&gt;&#128203; Generator Raport PKL&lt;/h2&gt;
        &lt;p class="sub-title"&gt;SMK Negeri 1 Tuntang — Kelas XII TJKT 2&lt;/p&gt;

        &lt;!-- ================= FORM ================= --&gt;
        &lt;div class="form-row"&gt;
            &lt;div class="form-group student-select-wrap"&gt;
                &lt;label&gt;&#128100; Pilih Siswa (TJKT 2)&lt;/label&gt;
                &lt;select id="studentSelect" onchange="onStudentChange()"&gt;
                    &lt;option value=""&gt;— Pilih Siswa —&lt;/option&gt;
                &lt;/select&gt;
            &lt;/div&gt;
            &lt;div class="form-group"&gt;
                &lt;label&gt;&#128219; Nama Lengkap&lt;/label&gt;
                &lt;input type="text" id="nama" placeholder="Nama siswa" disabled&gt;
            &lt;/div&gt;
            &lt;div class="form-group"&gt;
                &lt;label&gt;&#127380; NISN / NIS&lt;/label&gt;
                &lt;input type="text" id="nisn" placeholder="NISN / NIS" disabled&gt;
            &lt;/div&gt;
        &lt;/div&gt;

        &lt;div class="form-row"&gt;
            &lt;div class="form-group"&gt;
                &lt;label&gt;&#129489;‍&#127979; Pembimbing PKL&lt;/label&gt;
                &lt;input type="text" id="pembimbing" placeholder="Nama Pembimbing" disabled&gt;
            &lt;/div&gt;
            &lt;div class="form-group"&gt;
                &lt;label&gt;&#128205; Tempat PKL&lt;/label&gt;
                &lt;input type="text" id="tempatPkl" placeholder="Lokasi PKL" disabled&gt;
            &lt;/div&gt;
        &lt;/div&gt;

        &lt;div class="info-note"&gt;
            &lt;strong&gt;&#128204; Data Raport:&lt;/strong&gt; Nilai non-teknis (6 aspek) &amp;amp; teknis (6 aspek) diambil dari Leger Raport.
            &lt;span class="badge-jurusan"&gt;TJKT 2&lt;/span&gt;
        &lt;/div&gt;

        &lt;!-- ================= TEMPLATE ================= --&gt;
        &lt;img id="preview" src="" alt="Template Raport"&gt;

        &lt;!-- Upload lokal sebagai fallback --&gt;
        &lt;div class="upload-area"&gt;
            &lt;label for="templateUpload"&gt;&#128228; Upload Template (jika gambar tidak muncul)&lt;/label&gt;
            &lt;input type="file" id="templateUpload" accept="image/*" onchange="handleTemplateUpload(event)"&gt;
            &lt;div class="hint"&gt;Gunakan gambar template PNG atau JPG dari file Anda.&lt;/div&gt;
        &lt;/div&gt;

        &lt;button class="btn-primary" id="downloadBtn" onclick="generatePDF()" disabled&gt;
            ⬇️ UNDUH RAPORT PDF
        &lt;/button&gt;

        &lt;div class="loading" id="loading"&gt;⏳ Memproses PDF ...&lt;/div&gt;

    &lt;/div&gt;

    &lt;script&gt;
        // ======================================================================
        // DATA SISWA TJKT 2 — dari LEGER RAPOR + DAFTAR PEMBIMBING
        // ======================================================================
        const STUDENTS_DATA = [{
            id: 'adnan',
            nama: 'ADNAN DAVID ARDAFA',
            nisn: '0075368619',
            nis: '848',
            kelas: 'XII TJKT 2',
            fase: 'F',
            semester: 'Gasal / 5',
            tahun: '2025/2026',
            pembimbing: 'M. Misbahul M',
            tempatPkl: 'BEST CAMP PRIMA DATA',
            nonTeknis: [
                { kode: '1.1', aspek: 'Disiplin', nilai: 80, capaian: 'Murid Menunjukkan sikap Disiplin dalam pelaksanaan tugas yang diberikan' },
                { kode: '1.2', aspek: 'Kerjasama', nilai: 90, capaian: 'Murid Menunjukkan sikap sangat bisa bekerjasama dalam pelaksanaan tugas yang diberikan' },
                { kode: '1.3', aspek: 'Kejuruan', nilai: 85, capaian: 'Murid Menunjukkan sikap sesuai dengan tuntutan kejuruan dalam pelaksanaan tugas yang diberikan' },
                { kode: '1.4', aspek: 'Kerapian', nilai: 85, capaian: 'Murid Menunjukkan sikap rapi dalam pelaksanaan tugas yang diberikan' },
                { kode: '1.5', aspek: 'Tanggung Jawab', nilai: 88, capaian: 'Murid Menunjukkan sikap bertanggungjawab dalam pelaksanaan tugas yang diberikan' },
                { kode: '1.6', aspek: 'Kemauan Kerja', nilai: 90, capaian: 'Murid Menunjukkan sikap kerja sangat bertanggungjawab dalam pelaksanaan tugas yang diberikan' }
            ],
            teknis: [
                { kode: '2.1', aspek: 'Merakit Personal Komputer', nilai: 80, capaian: 'Murid terampil dalam merakit personal komputer' },
                { kode: '2.2', aspek: 'Instalasi Sistem Operasi Dasar', nilai: 85, capaian: 'Murid terampil dalam Melakukan Instalasi Sistem Operasi Dasar' },
                { kode: '2.3', aspek: 'Perbaikan dan/atau Seting Ulang sistem PC', nilai: 92, capaian: 'Murid sangat terampil dalam Melakukan Perbaikan dan/atau Seting Ulang sistem PC' },
                { kode: '2.4', aspek: 'Instalasi Software', nilai: 85, capaian: 'Murid terampil dalam Melakukan Instalasi Software' },
                { kode: '2.5', aspek: 'Instalasi Perangkat Jaringan Lokal', nilai: 80, capaian: 'Murid terampil dalam Melakukan Instalasi Perangkat Jaringan Lokal (Local area Network)' },
                { kode: '2.6', aspek: 'Perbaikan dan/atau Seting Ulang Koneksi Jaringan', nilai: 95, capaian: 'Murid sangat terampil dalam Melakukan Perbaikan dan/atau Seting Ulang Koneksi Jaringan' }
            ],
            sakit: 0,
            izin: 0,
            tanpaKeterangan: 0,
        }, {
            id: 'fahrur',
            nama: 'FAHRUR ROZI',
            nisn: '0075368620',
            nis: '849',
            kelas: 'XII TJKT 2',
            fase: 'F',
            semester: 'Gasal / 5',
            tahun: '2025/2026',
            pembimbing: 'M. Misbahul M',
            tempatPkl: 'BEST CAMP PRIMA DATA',
            nonTeknis: [
                { kode: '1.1', aspek: 'Disiplin', nilai: 82, capaian: 'Murid Menunjukkan sikap Disiplin dalam pelaksanaan tugas yang diberikan' },
                { kode: '1.2', aspek: 'Kerjasama', nilai: 88, capaian: 'Murid Menunjukkan sikap sangat bisa bekerjasama dalam pelaksanaan tugas yang diberikan' },
                { kode: '1.3', aspek: 'Kejuruan', nilai: 80, capaian: 'Murid Menunjukkan sikap sesuai dengan tuntutan kejuruan dalam pelaksanaan tugas yang diberikan' },
                { kode: '1.4', aspek: 'Kerapian', nilai: 83, capaian: 'Murid Menunjukkan sikap rapi dalam pelaksanaan tugas yang diberikan' },
                { kode: '1.5', aspek: 'Tanggung Jawab', nilai: 85, capaian: 'Murid Menunjukkan sikap bertanggungjawab dalam pelaksanaan tugas yang diberikan' },
                { kode: '1.6', aspek: 'Kemauan Kerja', nilai: 87, capaian: 'Murid Menunjukkan sikap kerja sangat bertanggungjawab dalam pelaksanaan tugas yang diberikan' }
            ],
            teknis: [
                { kode: '2.1', aspek: 'Merakit Personal Komputer', nilai: 78, capaian: 'Murid terampil dalam merakit personal komputer' },
                { kode: '2.2', aspek: 'Instalasi Sistem Operasi Dasar', nilai: 82, capaian: 'Murid terampil dalam Melakukan Instalasi Sistem Operasi Dasar' },
                { kode: '2.3', aspek: 'Perbaikan dan/atau Seting Ulang sistem PC', nilai: 88, capaian: 'Murid sangat terampil dalam Melakukan Perbaikan dan/atau Seting Ulang sistem PC' },
                { kode: '2.4', aspek: 'Instalasi Software', nilai: 80, capaian: 'Murid terampil dalam Melakukan Instalasi Software' },
                { kode: '2.5', aspek: 'Instalasi Perangkat Jaringan Lokal', nilai: 76, capaian: 'Murid terampil dalam Melakukan Instalasi Perangkat Jaringan Lokal (Local area Network)' },
                { kode: '2.6', aspek: 'Perbaikan dan/atau Seting Ulang Koneksi Jaringan', nilai: 90, capaian: 'Murid sangat terampil dalam Melakukan Perbaikan dan/atau Seting Ulang Koneksi Jaringan' }
            ],
            sakit: 0,
            izin: 0,
            tanpaKeterangan: 0,
        }, {
            id: 'flora',
            nama: 'FLORA FIRNANDA',
            nisn: '0075368621',
            nis: '850',
            kelas: 'XII TJKT 2',
            fase: 'F',
            semester: 'Gasal / 5',
            tahun: '2025/2026',
            pembimbing: 'M. Misbahul M',
            tempatPkl: 'BEST CAMP PRIMA DATA',
            nonTeknis: [
                { kode: '1.1', aspek: 'Disiplin', nilai: 90, capaian: 'Murid Menunjukkan sikap Disiplin dalam pelaksanaan tugas yang diberikan' },
                { kode: '1.2', aspek: 'Kerjasama', nilai: 92, capaian: 'Murid Menunjukkan sikap sangat bisa bekerjasama dalam pelaksanaan tugas yang diberikan' },
                { kode: '1.3', aspek: 'Kejuruan', nilai: 88, capaian: 'Murid Menunjukkan sikap sesuai dengan tuntutan kejuruan dalam pelaksanaan tugas yang diberikan' },
                { kode: '1.4', aspek: 'Kerapian', nilai: 90, capaian: 'Murid Menunjukkan sikap rapi dalam pelaksanaan tugas yang diberikan' },
                { kode: '1.5', aspek: 'Tanggung Jawab', nilai: 91, capaian: 'Murid Menunjukkan sikap bertanggungjawab dalam pelaksanaan tugas yang diberikan' },
                { kode: '1.6', aspek: 'Kemauan Kerja', nilai: 93, capaian: 'Murid Menunjukkan sikap kerja sangat bertanggungjawab dalam pelaksanaan tugas yang diberikan' }
            ],
            teknis: [
                { kode: '2.1', aspek: 'Merakit Personal Komputer', nilai: 85, capaian: 'Murid terampil dalam merakit personal komputer' },
                { kode: '2.2', aspek: 'Instalasi Sistem Operasi Dasar', nilai: 88, capaian: 'Murid terampil dalam Melakukan Instalasi Sistem Operasi Dasar' },
                { kode: '2.3', aspek: 'Perbaikan dan/atau Seting Ulang sistem PC', nilai: 92, capaian: 'Murid sangat terampil dalam Melakukan Perbaikan dan/atau Seting Ulang sistem PC' },
                { kode: '2.4', aspek: 'Instalasi Software', nilai: 87, capaian: 'Murid terampil dalam Melakukan Instalasi Software' },
                { kode: '2.5', aspek: 'Instalasi Perangkat Jaringan Lokal', nilai: 84, capaian: 'Murid terampil dalam Melakukan Instalasi Perangkat Jaringan Lokal (Local area Network)' },
                { kode: '2.6', aspek: 'Perbaikan dan/atau Seting Ulang Koneksi Jaringan', nilai: 94, capaian: 'Murid sangat terampil dalam Melakukan Perbaikan dan/atau Seting Ulang Koneksi Jaringan' }
            ],
            sakit: 0,
            izin: 0,
            tanpaKeterangan: 0,
        }, {
            id: 'raysa',
            nama: 'RAYSA ADI SAPUTRA',
            nisn: '0075368622',
            nis: '851',
            kelas: 'XII TJKT 2',
            fase: 'F',
            semester: 'Gasal / 5',
            tahun: '2025/2026',
            pembimbing: 'Agung K',
            tempatPkl: 'PT MITRA KENCANA TECHNOLOGY',
            nonTeknis: [
                { kode: '1.1', aspek: 'Disiplin', nilai: 78, capaian: 'Murid Menunjukkan sikap Disiplin dalam pelaksanaan tugas yang diberikan' },
                { kode: '1.2', aspek: 'Kerjasama', nilai: 82, capaian: 'Murid Menunjukkan sikap sangat bisa bekerjasama dalam pelaksanaan tugas yang diberikan' },
                { kode: '1.3', aspek: 'Kejuruan', nilai: 80, capaian: 'Murid Menunjukkan sikap sesuai dengan tuntutan kejuruan dalam pelaksanaan tugas yang diberikan' },
                { kode: '1.4', aspek: 'Kerapian', nilai: 76, capaian: 'Murid Menunjukkan sikap rapi dalam pelaksanaan tugas yang diberikan' },
                { kode: '1.5', aspek: 'Tanggung Jawab', nilai: 79, capaian: 'Murid Menunjukkan sikap bertanggungjawab dalam pelaksanaan tugas yang diberikan' },
                { kode: '1.6', aspek: 'Kemauan Kerja', nilai: 84, capaian: 'Murid Menunjukkan sikap kerja sangat bertanggungjawab dalam pelaksanaan tugas yang diberikan' }
            ],
            teknis: [
                { kode: '2.1', aspek: 'Merakit Personal Komputer', nilai: 75, capaian: 'Murid terampil dalam merakit personal komputer' },
                { kode: '2.2', aspek: 'Instalasi Sistem Operasi Dasar', nilai: 78, capaian: 'Murid terampil dalam Melakukan Instalasi Sistem Operasi Dasar' },
                { kode: '2.3', aspek: 'Perbaikan dan/atau Seting Ulang sistem PC', nilai: 82, capaian: 'Murid sangat terampil dalam Melakukan Perbaikan dan/atau Seting Ulang sistem PC' },
                { kode: '2.4', aspek: 'Instalasi Software', nilai: 76, capaian: 'Murid terampil dalam Melakukan Instalasi Software' },
                { kode: '2.5', aspek: 'Instalasi Perangkat Jaringan Lokal', nilai: 72, capaian: 'Murid terampil dalam Melakukan Instalasi Perangkat Jaringan Lokal (Local area Network)' },
                { kode: '2.6', aspek: 'Perbaikan dan/atau Seting Ulang Koneksi Jaringan', nilai: 86, capaian: 'Murid sangat terampil dalam Melakukan Perbaikan dan/atau Seting Ulang Koneksi Jaringan' }
            ],
            sakit: 0,
            izin: 0,
            tanpaKeterangan: 0,
        }, {
            id: 'guntur',
            nama: 'GUNTUR ADITYA SAPUTRA',
            nisn: '0075368623',
            nis: '852',
            kelas: 'XII TJKT 2',
            fase: 'F',
            semester: 'Gasal / 5',
            tahun: '2025/2026',
            pembimbing: 'Umi F',
            tempatPkl: 'HORIZON RESORT TLOGO',
            nonTeknis: [
                { kode: '1.1', aspek: 'Disiplin', nilai: 83, capaian: 'Murid Menunjukkan sikap Disiplin dalam pelaksanaan tugas yang diberikan' },
                { kode: '1.2', aspek: 'Kerjasama', nilai: 86, capaian: 'Murid Menunjukkan sikap sangat bisa bekerjasama dalam pelaksanaan tugas yang diberikan' },
                { kode: '1.3', aspek: 'Kejuruan', nilai: 81, capaian: 'Murid Menunjukkan sikap sesuai dengan tuntutan kejuruan dalam pelaksanaan tugas yang diberikan' },
                { kode: '1.4', aspek: 'Kerapian', nilai: 84, capaian: 'Murid Menunjukkan sikap rapi dalam pelaksanaan tugas yang diberikan' },
                { kode: '1.5', aspek: 'Tanggung Jawab', nilai: 87, capaian: 'Murid Menunjukkan sikap bertanggungjawab dalam pelaksanaan tugas yang diberikan' },
                { kode: '1.6', aspek: 'Kemauan Kerja', nilai: 89, capaian: 'Murid Menunjukkan sikap kerja sangat bertanggungjawab dalam pelaksanaan tugas yang diberikan' }
            ],
            teknis: [
                { kode: '2.1', aspek: 'Merakit Personal Komputer', nilai: 79, capaian: 'Murid terampil dalam merakit personal komputer' },
                { kode: '2.2', aspek: 'Instalasi Sistem Operasi Dasar', nilai: 83, capaian: 'Murid terampil dalam Melakukan Instalasi Sistem Operasi Dasar' },
                { kode: '2.3', aspek: 'Perbaikan dan/atau Seting Ulang sistem PC', nilai: 88, capaian: 'Murid sangat terampil dalam Melakukan Perbaikan dan/atau Seting Ulang sistem PC' },
                { kode: '2.4', aspek: 'Instalasi Software', nilai: 82, capaian: 'Murid terampil dalam Melakukan Instalasi Software' },
                { kode: '2.5', aspek: 'Instalasi Perangkat Jaringan Lokal', nilai: 77, capaian: 'Murid terampil dalam Melakukan Instalasi Perangkat Jaringan Lokal (Local area Network)' },
                { kode: '2.6', aspek: 'Perbaikan dan/atau Seting Ulang Koneksi Jaringan', nilai: 91, capaian: 'Murid sangat terampil dalam Melakukan Perbaikan dan/atau Seting Ulang Koneksi Jaringan' }
            ],
            sakit: 0,
            izin: 0,
            tanpaKeterangan: 0,
        }, {
            id: 'helsa',
            nama: 'HELSA RIZQI AKBAR',
            nisn: '0075368624',
            nis: '853',
            kelas: 'XII TJKT 2',
            fase: 'F',
            semester: 'Gasal / 5',
            tahun: '2025/2026',
            pembimbing: 'Bramantyo',
            tempatPkl: 'BEST CAMP PRIMA DATA',
            nonTeknis: [
                { kode: '1.1', aspek: 'Disiplin', nilai: 87, capaian: 'Murid Menunjukkan sikap Disiplin dalam pelaksanaan tugas yang diberikan' },
                { kode: '1.2', aspek: 'Kerjasama', nilai: 90, capaian: 'Murid Menunjukkan sikap sangat bisa bekerjasama dalam pelaksanaan tugas yang diberikan' },
                { kode: '1.3', aspek: 'Kejuruan', nilai: 85, capaian: 'Murid Menunjukkan sikap sesuai dengan tuntutan kejuruan dalam pelaksanaan tugas yang diberikan' },
                { kode: '1.4', aspek: 'Kerapian', nilai: 88, capaian: 'Murid Menunjukkan sikap rapi dalam pelaksanaan tugas yang diberikan' },
                { kode: '1.5', aspek: 'Tanggung Jawab', nilai: 90, capaian: 'Murid Menunjukkan sikap bertanggungjawab dalam pelaksanaan tugas yang diberikan' },
                { kode: '1.6', aspek: 'Kemauan Kerja', nilai: 92, capaian: 'Murid Menunjukkan sikap kerja sangat bertanggungjawab dalam pelaksanaan tugas yang diberikan' }
            ],
            teknis: [
                { kode: '2.1', aspek: 'Merakit Personal Komputer', nilai: 83, capaian: 'Murid terampil dalam merakit personal komputer' },
                { kode: '2.2', aspek: 'Instalasi Sistem Operasi Dasar', nilai: 87, capaian: 'Murid terampil dalam Melakukan Instalasi Sistem Operasi Dasar' },
                { kode: '2.3', aspek: 'Perbaikan dan/atau Seting Ulang sistem PC', nilai: 91, capaian: 'Murid sangat terampil dalam Melakukan Perbaikan dan/atau Seting Ulang sistem PC' },
                { kode: '2.4', aspek: 'Instalasi Software', nilai: 86, capaian: 'Murid terampil dalam Melakukan Instalasi Software' },
                { kode: '2.5', aspek: 'Instalasi Perangkat Jaringan Lokal', nilai: 82, capaian: 'Murid terampil dalam Melakukan Instalasi Perangkat Jaringan Lokal (Local area Network)' },
                { kode: '2.6', aspek: 'Perbaikan dan/atau Seting Ulang Koneksi Jaringan', nilai: 93, capaian: 'Murid sangat terampil dalam Melakukan Perbaikan dan/atau Seting Ulang Koneksi Jaringan' }
            ],
            sakit: 0,
            izin: 0,
            tanpaKeterangan: 0,
        }];

        // ======================================================================
        // STATE
        // ======================================================================
        let selectedStudent = null;
        let templateImageData = null; // akan diisi dengan data URL gambar

        // DOM refs
        const studentSelect = document.getElementById('studentSelect');
        const namaInput = document.getElementById('nama');
        const nisnInput = document.getElementById('nisn');
        const pembimbingInput = document.getElementById('pembimbing');
        const tempatPklInput = document.getElementById('tempatPkl');
        const downloadBtn = document.getElementById('downloadBtn');
        const loadingEl = document.getElementById('loading');
        const previewImg = document.getElementById('preview');
        const templateUpload = document.getElementById('templateUpload');

        // URL template dari Google Drive (fallback)
        const TEMPLATE_URL_DRIVE = 'https://drive.google.com/uc?export=view&amp;id=1fttQv-oJtw6meR3sScnXo6MjRT8Ul4m1';

        // ======================================================================
        // INIT
        // ======================================================================
        function init() {
            // Isi dropdown
            studentSelect.innerHTML = '&lt;option value=""&gt;— Pilih Siswa —&lt;/option&gt;';
            STUDENTS_DATA.forEach(s =&gt; {
                const opt = document.createElement('option');
                opt.value = s.id;
                opt.textContent = s.nama + ' (' + s.nis + ')';
                studentSelect.appendChild(opt);
            });

            // Coba muat template dari drive
            loadTemplateFromDrive();
        }

        // ======================================================================
        // LOAD TEMPLATE
        // ======================================================================
        function loadTemplateFromDrive() {
            previewImg.src = TEMPLATE_URL_DRIVE;
            previewImg.onload = function() {
                // Berhasil, simpan data gambar
                templateImageData = previewImg.src;
                console.log('Template berhasil dimuat dari Google Drive');
                previewImg.onerror = null; // hapus handler error
            };
            previewImg.onerror = function() {
                console.warn('Gagal memuat template dari Drive. Silakan upload manual.');
                previewImg.alt = 'Gagal memuat template. Upload gambar secara manual.';
                // Tampilkan pesan di area preview
                previewImg.style.display = 'block';
                // Kita tidak set templateImageData, sehingga nanti akan dicegah generate PDF
                // tapi kita beri info ke user
                alert('Gagal memuat template dari Google Drive. Silakan upload gambar template menggunakan tombol di bawah.');
            };
        }

        // ======================================================================
        // HANDLE UPLOAD TEMPLATE LOKAL
        // ======================================================================
        function handleTemplateUpload(event) {
            const file = event.target.files[0];
            if (!file) return;
            const reader = new FileReader();
            reader.onload = function(e) {
                const dataUrl = e.target.result;
                templateImageData = dataUrl;
                previewImg.src = dataUrl;
                previewImg.onerror = null;
                previewImg.alt = 'Template lokal';
                console.log('Template lokal berhasil dimuat');
                alert('Template berhasil diunggah!');
            };
            reader.onerror = function() {
                alert('Gagal membaca file. Coba lagi.');
            };
            reader.readAsDataURL(file);
        }

        // ======================================================================
        // STUDENT SELECT
        // ======================================================================
        function onStudentChange() {
            const id = studentSelect.value;
            if (!id) {
                clearFields();
                downloadBtn.disabled = true;
                return;
            }
            const s = STUDENTS_DATA.find(d =&gt; d.id === id);
            if (!s) return;
            selectedStudent = s;
            namaInput.value = s.nama;
            nisnInput.value = s.nisn + ' / ' + s.nis;
            pembimbingInput.value = s.pembimbing;
            tempatPklInput.value = s.tempatPkl;
            // Cek apakah template sudah dimuat
            if (templateImageData) {
                downloadBtn.disabled = false;
            } else {
                downloadBtn.disabled = true;
                alert('Template belum dimuat. Upload gambar template terlebih dahulu.');
            }
        }

        function clearFields() {
            namaInput.value = '';
            nisnInput.value = '';
            pembimbingInput.value = '';
            tempatPklInput.value = '';
            selectedStudent = null;
            downloadBtn.disabled = true;
        }

        // ======================================================================
        // LOAD IMAGE FROM DATA URL
        // ======================================================================
        function loadImageFromDataUrl(dataUrl) {
            return new Promise((resolve, reject) =&gt; {
                const img = new Image();
                img.onload = () =&gt; resolve(img);
                img.onerror = () =&gt; reject(new Error('Gagal memuat gambar template.'));
                img.src = dataUrl;
            });
        }

        // ======================================================================
        // GENERATE PDF
        // ======================================================================
        async function generatePDF() {
            if (!selectedStudent) {
                alert('Pilih siswa terlebih dahulu.');
                return;
            }
            if (!templateImageData) {
                alert('Template belum dimuat. Upload gambar template terlebih dahulu.');
                return;
            }

            const s = selectedStudent;

            // Hitung total &amp; rata-rata
            const allNilai = [...s.nonTeknis, ...s.teknis];
            const total = allNilai.reduce((sum, item) =&gt; sum + item.nilai, 0);
            const avg = Math.round(total / allNilai.length);

            loadingEl.style.display = 'block';
            downloadBtn.disabled = true;

            try {
                await document.fonts.ready;
                const img = await loadImageFromDataUrl(templateImageData);

                const canvas = document.createElement('canvas');
                canvas.width = img.width;
                canvas.height = img.height;
                const ctx = canvas.getContext('2d');

                // Gambar template
                ctx.drawImage(img, 0, 0, canvas.width, canvas.height);

                // ====================== POSISI TEKS ======================
                const W = canvas.width;
                const H = canvas.height;

                ctx.textAlign = 'left';
                ctx.textBaseline = 'middle';
                ctx.fillStyle = '#000000';

                // ----- 1. Nama Peserta Didik -----
                const namaY = H * 0.188;
                let fontSize = W * 0.020;
                ctx.font = `700 ${fontSize}px Montserrat`;
                let tw = ctx.measureText(s.nama).width;
                const maxW = W * 0.55;
                while (tw &gt; maxW &amp;&amp; fontSize &gt; 12) {
                    fontSize -= 1;
                    ctx.font = `700 ${fontSize}px Montserrat`;
                    tw = ctx.measureText(s.nama).width;
                }
                ctx.fillText(s.nama, W * 0.175, namaY);

                // ----- 2. NISN/NIS -----
                const nisnText = s.nisn + ' / ' + s.nis;
                ctx.font = `400 ${W * 0.017}px Montserrat`;
                ctx.fillText(nisnText, W * 0.175, H * 0.225);

                // ----- 3. Sekolah -----
                const sekolah = 'SMK NEGERI 1 TUNTANG';
                ctx.font = `400 ${W * 0.017}px Montserrat`;
                ctx.fillText(sekolah, W * 0.175, H * 0.260);

                // ----- 4. Alamat -----
                const alamat = 'Jl. Mertokusumo, Desa Candirejo';
                ctx.font = `400 ${W * 0.017}px Montserrat`;
                ctx.fillText(alamat, W * 0.175, H * 0.295);

                // ----- 5. Kelas -----
                ctx.font = `400 ${W * 0.017}px Montserrat`;
                ctx.fillText(s.kelas, W * 0.175, H * 0.330);

                // ----- 6. Fase -----
                ctx.fillText(s.fase, W * 0.175, H * 0.365);

                // ----- 7. Semester -----
                ctx.fillText(s.semester, W * 0.175, H * 0.400);

                // ----- 8. Tahun Pelajaran -----
                ctx.fillText(s.tahun, W * 0.175, H * 0.435);

                // ----- 9. Pembimbing (ditambahkan) -----
                const pembText = 'Pembimbing : ' + s.pembimbing;
                ctx.font = `500 ${W * 0.016}px Montserrat`;
                ctx.fillText(pembText, W * 0.175, H * 0.470);

                // ----- 10. Tempat PKL (ditambahkan) -----
                const tempatText = 'Tempat PKL : ' + s.tempatPkl;
                ctx.font = `500 ${W * 0.016}px Montserrat`;
                ctx.fillText(tempatText, W * 0.175, H * 0.502);

                // ====================== TABEL NILAI ======================
                // Non-Teknis (1.1 - 1.6)
                const startX = W * 0.070;
                const col1W = W * 0.165;
                const col2W = W * 0.380;
                const col3W = W * 0.075;
                const col4W = W * 0.300;
                const rowH = H * 0.038;
                let yRow = H * 0.560;

                ctx.font = `400 ${W * 0.014}px Montserrat`;
                ctx.textAlign = 'left';
                ctx.textBaseline = 'middle';

                s.nonTeknis.forEach((item, idx) =&gt; {
                    const x1 = startX;
                    const x2 = startX + col1W;
                    const x3 = startX + col1W + col2W;
                    const x4 = startX + col1W + col2W + col3W;
                    const y = yRow + idx * rowH;

                    ctx.fillText(item.kode, x1 + 4, y);
                    ctx.fillText(item.aspek, x2 + 4, y);
                    ctx.fillText(item.nilai.toString(), x3 + 4, y);
                    let cap = item.capaian;
                    if (cap.length &gt; 38) cap = cap.substring(0, 36) + '...';
                    ctx.fillText(cap, x4 + 4, y);
                });

                // Teknis (2.1 - 2.6)
                const teknisStartY = H * 0.560 + (s.nonTeknis.length * rowH) + H * 0.025;
                s.teknis.forEach((item, idx) =&gt; {
                    const x1 = startX;
                    const x2 = startX + col1W;
                    const x3 = startX + col1W + col2W;
                    const x4 = startX + col1W + col2W + col3W;
                    const y = teknisStartY + idx * rowH;

                    ctx.fillText(item.kode, x1 + 4, y);
                    ctx.fillText(item.aspek, x2 + 4, y);
                    ctx.fillText(item.nilai.toString(), x3 + 4, y);
                    let cap = item.capaian;
                    if (cap.length &gt; 38) cap = cap.substring(0, 36) + '...';
                    ctx.fillText(cap, x4 + 4, y);
                });

                // ----- Total Nilai &amp; Rata-rata -----
                const totalY = teknisStartY + (s.teknis.length * rowH) + H * 0.020;
                ctx.font = `600 ${W * 0.017}px Montserrat`;
                ctx.textAlign = 'left';
                ctx.fillText('Total Nilai', startX + 4, totalY);
                ctx.fillText(total.toString(), startX + col1W + col2W + 4, totalY);

                const avgY = totalY + rowH * 0.9;
                ctx.fillText('Rata-rata', startX + 4, avgY);
                ctx.fillText(avg.toString(), startX + col1W + col2W + 4, avgY);

                // ----- Ketidakhadiran -----
                const absenY = avgY + rowH * 1.2;
                ctx.font = `400 ${W * 0.016}px Montserrat`;
                ctx.textAlign = 'left';
                ctx.fillText('Sakit', startX + 4, absenY);
                ctx.fillText(s.sakit + ' hari', startX + col1W + 4, absenY);
                ctx.fillText('Izin', startX + col1W + col2W + 4, absenY);
                ctx.fillText(s.izin + ' hari', startX + col1W + col2W + col3W + 4, absenY);
                ctx.fillText('Tanpa Keterangan', startX + col1W + col2W + col3W + col4W + 4, absenY);
                ctx.fillText(s.tanpaKeterangan + ' hari', startX + col1W + col2W + col3W + col4W + col3W + 4, absenY);

                // ----- Tanggal &amp; Tanda Tangan -----
                const ttdY = H * 0.930;
                ctx.font = `400 ${W * 0.015}px Montserrat`;
                ctx.textAlign = 'center';
                ctx.fillText('Tuntang, 18 Maret 2026', W * 0.5, ttdY);

                const tandaY = H * 0.960;
                ctx.font = `400 ${W * 0.014}px Montserrat`;
                ctx.fillText('Kepala Sekolah', W * 0.20, tandaY);
                ctx.fillText('Orang Tua/Wali', W * 0.50, tandaY);
                ctx.fillText('Wali Kelas', W * 0.80, tandaY);

                // Nama Kepsek
                ctx.font = `600 ${W * 0.014}px Montserrat`;
                ctx.fillText('Nanang Nurdiyanto, S.Pd, M.Eng', W * 0.20, tandaY + H * 0.025);
                ctx.fillText('NIP.19770402 200501 1 010', W * 0.20, tandaY + H * 0.045);

                // Nama Wali Kelas
                ctx.fillText('Nofrizal, S.T., Gr.', W * 0.80, tandaY + H * 0.025);
                ctx.fillText('NIP.19770327 202221 1 002', W * 0.80, tandaY + H * 0.045);

                // ====================== EXPORT PDF ======================
                const imageData = canvas.toDataURL('image/jpeg', 0.98);
                const { jsPDF } = window.jspdf;
                const pdf = new jsPDF({
                    orientation: canvas.width &gt; canvas.height ? 'landscape' : 'portrait',
                    unit: 'px',
                    format: [canvas.width, canvas.height]
                });

                pdf.addImage(imageData, 'JPEG', 0, 0, canvas.width, canvas.height);
                const safeName = s.nama.replace(/[^a-z0-9]/gi, '_');
                pdf.save('Raport_PKL_' + safeName + '.pdf');

            } catch (error) {
                console.error(error);
                alert('❌ Gagal membuat PDF\n\n' + error.message);
            } finally {
                loadingEl.style.display = 'none';
                downloadBtn.disabled = false;
            }
        }

        // ======================================================================
        // START
        // ======================================================================
        init();
        console.log('✅ Aplikasi Raport PKL TJKT 2 siap. Silakan upload template jika diperlukan.');
    &lt;/script&gt;

&lt;/body&gt;
&lt;/html&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjTwjlyzkMzJywQ96opnkRlOsC8pRIsVpEID1FccNG43tmWGOwKuKC1DLg14SfhQUp7daIc0N_I64Z4yTtbvuOKQUF8xexbNYPkPSxyaKXALhR9gpNYE9pbTz4qWcKGlDZiD-t82C3lj_QQQTGxfe__h91uMG_sDsH2_LiM5MO51CY7QIhcIIImal71gA/s2599/tempalte%20RAPOR%20PKL%202025-2026-TJKT2-1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="2599" data-original-width="1654" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjTwjlyzkMzJywQ96opnkRlOsC8pRIsVpEID1FccNG43tmWGOwKuKC1DLg14SfhQUp7daIc0N_I64Z4yTtbvuOKQUF8xexbNYPkPSxyaKXALhR9gpNYE9pbTz4qWcKGlDZiD-t82C3lj_QQQTGxfe__h91uMG_sDsH2_LiM5MO51CY7QIhcIIImal71gA/w408-h640/tempalte%20RAPOR%20PKL%202025-2026-TJKT2-1.png" width="408" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;</description><link>http://kitab-investasi.blogspot.com/2026/06/raport-pkl.html</link><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjTwjlyzkMzJywQ96opnkRlOsC8pRIsVpEID1FccNG43tmWGOwKuKC1DLg14SfhQUp7daIc0N_I64Z4yTtbvuOKQUF8xexbNYPkPSxyaKXALhR9gpNYE9pbTz4qWcKGlDZiD-t82C3lj_QQQTGxfe__h91uMG_sDsH2_LiM5MO51CY7QIhcIIImal71gA/s72-w408-h640-c/tempalte%20RAPOR%20PKL%202025-2026-TJKT2-1.png" width="72"/><thr:total>0</thr:total><author>nof_rizal07@yahoo.co.id (abang_cool)</author></item></channel></rss>