# 📦 Release Notes — LINTAS-QR

> Riwayat rilis resmi portal **LINTAS-QR (Layanan Informasi Terpadu dan Akses Cepat dengan QR-Code)** — Pengadilan Agama Atambua.
>
> **Skema versi:**
> - **v1.x** — era situs lama (Google Sites): [https://sites.google.com/view/lintas-qr-pa-atambua/](https://sites.google.com/view/lintas-qr-pa-atambua/)
> - **v2.x** — era situs baru berbasis repo git ini. **v2.0.0 = commit pertama (git init)**. Perubahan kecil → **v2.0.1, v2.0.2, …** dan seterusnya.
>
> Sumber: riwayat commit `git log` (71 commit, dimulai 10 Juli 2026).

---

## v2.20.2 — 2026-08-12 · Fix Data MONEV Tidak Terbaca di Production (CSP)
- **Akar masalah**: URL CSV Google Sheets (published) me-**redirect 302** ke `doc-XX-1g-sheets.googleusercontent.com`, sedangkan header CSP di `vercel.json` hanya mengizinkan `connect-src` `docs.google.com`/`script.googleusercontent.com` → browser **memblokir redirect** → semua fetch data monev gagal di production. Localhost berjalan normal karena tidak ada CSP.
- **Fix**: `connect-src` ditambah **`https://*.googleusercontent.com`** (mencakup semua host redirect). Catatan penting: `https://*.sheets.googleusercontent.com` **tidak cocok** dengan `doc-XX-1g-sheets.googleusercontent.com` karena label host-nya adalah `doc-XX-1g-sheets` (bukan `sheets`).
- **Verifikasi**: header CSP dicek langsung; halaman monev diuji **headless browser** (`msedge --headless --dump-dom --virtual-time-budget`): badge **"Periode Juli 2026"**, statper (KPI 66.7%, 9 baris), PSP (16 baris), keuangan (filter "Juli 2026"), survei — semua render.
- **Tooling deploy**: `vercel link`, `vercel ls`, `vercel inspect`; `.vercel/` & `.env*` masuk `.gitignore`.
- **Dokumentasi proses lengkap**: `docs/DEPLOYMENT.md`.

## v2.20.1 — 2026-08-12 · Perbaikan & Otomasi Modul MONEV KEPAN
- **Badge Periode otomatis** (`pages/monev.html`): badge `Periode Juni 2026` kini dihitung otomatis dari data **Keuangan Perkara** (kolom `BULAN` pada CSV Google Sheets) — selalu menampilkan **bulan closing terakhir** tanpa edit manual; bila fetch gagal, teks statis dipertahankan.
- **Fix navigasi periode/tab Survei** (`pages/monev/survei.html`): `changePeriod` & `switchTab` dideklarasikan di module scope sehingga tidak bisa diakses tombol inline `onclick` — kini diekspos ke `window` (ganti triwulan/tab kembali berfungsi).
- **Fix data MONEV tidak tuntas di admin** (`pages/admin.html`): `modMonev.load()` memanggil API tanpa `size` sehingga hanya 20 baris pertama yang tampil — kini mengirim `{ size: 100 }` agar seluruh riwayat (statper, DIPA 04, keuangan, PSP, masalah, survei) terbaca.
- **Fix status PSP** (`pages/monev/psp.html`): baris dengan `Keterangan` kosong tapi `Jumlah Sisa Panjar` > 0 sebelumnya dihitung "Sudah Diambil" sehingga grafik/angka **Belum Diambil selalu kosong** — kini sisa panjar positif + keterangan kosong dianggap **belum diambil** (dan jumlahnya diakumulasi).
- **Fix parse Statistik Perkara** (`pages/monev/statper.html`): baris sisa kosong dari spreadsheet (mis. `,,,,,,0,0`) ikut ter-render sebagai baris kosong di tabel — kini disaring saat `parseCSV`.

## v2.20.0 — 2026-08-10 · LINTAS-AI (Asisten Virtual)
- **Fitur baru LINTAS-AI** — asisten virtual PA Atambua (halaman `pages/layanan/lintas-ai.html`): chat real-time dengan bubble user/bot (Markdown via `marked`), indikator mengetik, pesan sambutan, tombol reset obrolan, dan disclaimer verifikasi informasi.
- **Backend proxy** `api/chat.js` (Vercel serverless): permintaan diteruskan ke **Google Gemini model `gemini-3-flash-preview`** — kunci dibaca dari file lokal **`api/_keys/gemini.js`** (folder di-.gitignore, tidak ikut repo publik) sebagai **array `GEMINI_API_KEYS`**: **rotasi round-robin** + **fallback otomatis** saat satu kunci kena quota/rate limit (429 / 403 RESOURCE_EXHAUSTED); model opsional `GEMINI_MODEL`, default `gemini-3-flash-preview`. System prompt berbahasa Indonesia khusus layanan pengadilan agama, riwayat 10 pesan terakhir, rate-limit per sesi (15 permintaan/menit), timeout 30 dtk, serta penanganan 400/405/429/500/502 selaras kontrak PHP asli yang diadaptasi.
- **Riwayat chat di localStorage** (`lintasqr_chat_history_<session_id>`) — site statis tanpa database server; sesi baru dibuat saat reset.
- **Integrasi navigasi**: navbar mega menu & drawer mobile grup **Aplikasi Digital** (count 2→3), kartu di direktori `layanan.html` (count 13→14), kartu ketiga di seksi **Aplikasi Unggulan** beranda (`soft-grid--2` → `--3`).
- **CSS chat** theme-aware (light/dark) di `styles-v2/components.css` (`.chat-card`, `.chat-row`, `.chat-bubble`, `.typing-dot`, `.msg-enter`, markdown styling) — mengikuti aesthetic Warm TUI (sudut 2px, bayangan flat offset).
- **Konfigurasi sebelum aktif** (pilih salah satu): (a) **env var Vercel** — isi `GEMINI_API_KEYS` (JSON array `["AIza...", ...]` atau dipisah koma) di dashboard Vercel → Settings → Environment Variables, opsional `GEMINI_MODEL` & `ALLOWED_ORIGINS`; atau (b) isi `GEMINI_API_KEYS` di file **`api/_keys/gemini.js`** (folder `api/_keys/` di-.gitignore sehingga tidak ikut repo publik) lalu deploy via **`vercel deploy` CLI** (deploy via push GitHub tidak menyertakan file yang di-gitignore). Env var lebih utama dari file kunci.
- **Hardening keamanan** (audit): (1) **XSS** di render markdown chat diperbaiki — `marked` + sanitasi `DOMPurify` (versi dipin: `marked@18.0.9`, `dompurify@3.4.13`) + fallback escape HTML; (2) **`/api/chat` kini hanya menerima browser same-origin** (validasi Origin, allowlist `ALLOWED_ORIGINS` opsional di file kunci) + **rate limit dua lapis** (per-IP 60/menit dari `x-forwarded-for` Vercel + per-sesi 15/menit); (3) **header keamanan di `vercel.json`** untuk semua halaman: Content-Security-Policy (allowlist eksplisit sumber eksternal, `frame-ancestors 'none'`, `object-src 'none'`), X-Frame-Options DENY, nosniff, Referrer-Policy, HSTS, Permissions-Policy, Cross-Origin-Resource-Policy; (4) **CDN dipin penuh** — `chart.js@3.9.1` di 4 halaman monev (dulu melayang); (5) guard privasi di system prompt (tidak meminta NIK/data pribadi, arahkan ke PTSP/Posbakum) + **disclaimer privasi** di bawah kolom chat (riwayat tersimpan di perangkat & terkirim ke penyedia AI).

## v2.19.0 — 2026-08-08 · Tombol Salin & Bagikan Tautan per Bagian
- **Komponen generik `copy-url`** (baru `scripts/src/copy-url.js`, di-bootstrap `main.js`): binding **ter-delegasi** untuk `[data-copy-url]` (salin URL absolut + `#hash` ke clipboard, umpan balik ikon link → centang 2 dtk) dan `[data-share-wa]` (bagikan bagian via WhatsApp `wa.me/?text=` dengan label `data-share-text`) — halaman lain cukup pasang markup + class, tanpa duplikasi logika. Guard idempoten + delegasi membuat tombol dinamis (Alpine/fetch) ikut berfungsi.
- **Deep-link `#hash`**: membuka URL bagian → scroll halus ke kartu target (offset navbar, via Lenis bila tersedia) + highlight sekilas (`.url-state-target`) untuk elemen ber-id apa pun.
- **Terpasang di 7 halaman layanan (47 kartu/langkah)**: syarat (9), prosedur (7 alur), sekata (6 fitur), e-siap (6 fitur + 3 langkah), e-court (4 fitur + 4 langkah), gugatan-mandiri (4 langkah), produk-pengadilan (4 produk).
- CSS generik `.copy-url-btn` / `.copy-url-actions` (+ varian pojok `.copy-url-actions--corner` untuk kartu grid tanpa header flex), `scroll-margin-top` pada kartu ber-id agar lompatan anchor tidak tertutup navbar.
- Demo & dokumentasi komponen ditambahkan di `docs/components.html`.

## v2.18.1 — 2026-08-08 · Keterangan Fotokopi & Nazegelen
- `syarat.html`: catatan pada tiap jenis perkara bahwa bukti dokumen wajib difotokopi dan **dinazegelen** (dicap/disahkan) di kantor pos; keterangan fotokopi bermeterai + softcopy pada dokumen umum.

## v2.18.0 — 2026-08-05 · Halaman 404 & Redirect
- **Halaman 404 kustom** (`public/404.html`): self-contained (navbar & footer inline — file `public/` disalin mentah tanpa partial), hero 404 ber-CTA, 6 pintasan layanan, info bantuan + WhatsApp.
- **Redirect permanen** di `vercel.json` untuk halaman yang dihapus: `galeri(.html)` → `berita.html`, `tracking(.html)` & `daftar-perkara(.html)` → `perkara-terdaftar.html`.
- **Guard klien** inline di 404 (jaring pengaman bila redirect server tidak sempat).

## v2.17.0 — 2026-08-05 · AOS Fallback: Konten Tak Pernah Tertahan
- Penambahan fallback animasi (AOS) agar konten tidak pernah tertahan `opacity: 0` bila library animasi gagal dimuat.

## v2.16.0 — 2026-08-05 · Perbaikan Bug Hero Tidak Tampil
- Audit hero di seluruh halaman: ditemukan konflik **GSAP + AOS** pada `.dashboard__hero` (dua sistem berebut `opacity`/`transform` → hero bisa tertahan `opacity: 0`).
- `data-aos="fade-up"` dihapus dari hero di 9 file (bantuan, changelog, download, informasi-publik, monev, pengaturan, tentang, offline, docs/components) — entrance hero kini murni milik GSAP.
- Aturan baku dituliskan di `docs/DESIGN.md` §7.1 item 6: **hero tidak boleh memakai `data-aos`**.

## v2.15.0 — 2026-08-05 · Automasi Update Dataset Putusan
- GitHub Actions baru `.github/workflows/update-putusan-data.yml`: crawl dataset putusan **otomatis mingguan** (cron Senin 02:30 UTC) + trigger manual (`workflow_dispatch`).
- Workflow menjalankan `npm run crawl:putusan`, memvalidasi dataset, lalu commit & push otomatis bila ada putusan baru.
- Dokumentasi automasi di `docs/PUTUSAN_DATA.md` §2.2.

## v2.14.0 — 2026-08-05 · Penyimpanan Permanen Data Putusan
- Crawler `scripts/crawl-putusan.cjs`: crawl **semua halaman pagination** Direktori Putusan MA (`page/N.html` via Jina Reader, stop otomatis saat kosong/duplikat, retries + rate-limit, dedupe per `detailUrl`).
- Dataset statis **`public/data/putusan.json`** — 341 putusan PA Atambua (2015–2026) di-commit ke git (~152 KB).
- Halaman `putusan.html` kini membaca file statis (tanpa request runtime ke Jina); fallback `/api/putusan` bila file gagal.
- Script `npm run crawl:putusan` + dokumentasi `docs/PUTUSAN_DATA.md`.

## v2.13.0 — 2026-08-05 · Pengembangan Halaman Putusan
- Fix bug parser: `formatTanggal(putus[1])` → `formatTanggal(putus)` (tanggal putus fallback salah).
- Kolom **Para Pihak** ditampilkan (sebelumnya di-parse tapi tidak tampil).
- Section **Ringkasan Direktori**: 4 kartu statistik (Total, Gugatan, Permohonan, Tahun Terbaru).
- Cache client localStorage (`lintasqr-putusan-v1`, TTL 10 menit).
- Test parser baru `scripts/test-putusan-parser.cjs` di-wire ke `npm test`.

## v2.12.0 — 2026-08-05 · Halaman Changelog
- Halaman baru `pages/changelog.html`: hero ber-CTA, timeline versi, filter v1.x/v2.x.
- Penyeragaman hero beberapa halaman ke pola ber-CTA.

## v2.11.0 — 2026-08-05 · Halaman Direktori Putusan
- Halaman baru `pages/layanan/putusan.html`: direktori putusan PA Atambua dari Direktori Putusan Mahkamah Agung (via `/api/putusan` → Jina Reader).
- Parser markdown ke JSON: nomor, jenis, pihak, kategori, tanggal putus/register, link detail.

## v2.10.0 — 2026-08-05 · Penyeragaman Hero Ber-CTA
- Audit hero seluruh halaman: 19 halaman sudah ber-CTA; 4 halaman diselaraskan (bantuan, download, monev, pengaturan).
- Pola baku hero: `btn--hero-primary`/`btn--hero-outline` + tooltip + ikon lucide.

## v2.9.0 — 2026-08-05 · Halaman Tentang & Informasi Publik Dipisah
- `tentang.html` ditulis ulang (About LINTAS-QR + ekosistem inovasi: LINTAS-AI, E-SIAP, RESLOKA, PANDA-AI, LANTIP).
- Halaman baru `informasi-publik.html` (transparansi & keterbukaan informasi).
- Menu dropdown "Lainnya" dipisah: Tentang dan Informasi Publik masing-masing punya halaman sendiri.

## v2.8.0 — 2026-08-05 · Kategorisasi Menu Navbar & Drawer
- Mega menu **Layanan** dikategorikan (Perkara & Data, Pendaftaran & Panduan, Bantuan Hukum, Aplikasi Digital) + count per kategori.
- Dropdown **Lainnya** (Profil, Informasi Publik, Download, Bantuan) diberi kategori serupa.

## v2.7.0 — 2026-08-05 · Pembersihan Infrastruktur GAS
- Import `api.js` dihapus dari `main.js`; ENDPOINTS mati di `config.js` dibersihkan.
- Sisa infrastruktur GAS frontend dihapus; seluruh data publik kini statis/parsing.

## v2.6.0 — 2026-08-05 · Halaman Berita & Artikel/Pengumuman
- Parser berita PA Atambua **tanpa GAS** (`/api/berita`), pagination `?start=`.
- Halaman baru `artikel-pengumuman.html` (artikel & pengumuman resmi, tanpa thumbnail, sumber `artikel-dan-pengumuman`).

## v2.5.0 — 2026-08-05 · Direktori Halaman Layanan
- `layanan.html` ditulis ulang: hero ber-CTA, grid Layanan Utama, **direktori Semua Layanan berkategori** (mencakup seluruh 12 sub-halaman), accordion informasi, tanpa hydration GAS.
- Halaman `perkara-terdaftar.html` & `jadwal-sidang.html` diselaraskan dengan pola Warm TUI.

## v2.4.0 — 2026-08-05 · Pengayaan Halaman Layanan
- `produk-pengadilan.html`, `prosedur.html`, `syarat.html` diperkaya dengan riset kewenangan absolut Pengadilan Agama (UU No. 7/1989 jo UU No. 3/2006 jo UU No. 50/2009).

## v2.3.0 — 2026-08-05 · Statistik Perkara SIPP
- Halaman baru `layanan/statistik-perkara.html`: parsing tabel laporan statistik perkara dari SIPP (`/statistik_perkara`), pilih periode bulan/tahun, chart dataset Warm TUI (pie klasifikasi + chart di atas tabel).

## v2.2.0 — 2026-08-05 · Halaman Perkara & Jadwal
- Halaman baru `perkara-terdaftar.html` (daftar perkara dari SIPP, search + filter + pagination) — menggantikan fitur tracking.
- Halaman `jadwal-sidang.html` + section Jadwal Sidang Hari Ini di beranda (parsing SIPP tanpa GAS).

## v2.1.0 — 2026-08-04 · Berita & Artikel Parsing Tanpa GAS
- Sistem berita parsing dari `pa-atambua.go.id` (pagination `?start=`), halaman `berita.html` + `artikel-pengumuman.html`.

## v2.0.9 — 2026-08-04 · Footer Konsisten
- Footer partial dipindah ke luar `</main>` di 22 halaman (sticky footer benar); pola baku didokumentasikan.
- Icon sosmed footer diperbaiki; link eksternal E-Court & Gugatan Mandiri langsung ke sumber.

## v2.0.8 — 2026-08-04 · Warm TUI Komponen Lengkap
- Dropdown navbar diseragamkan; status bar, pagination, skeleton, tabs, tabel MONEV Warm TUI; sticky footer.

## v2.0.7 — 2026-08-04 · Warm TUI Form & Komponen
- Form/select/modal/toast di-remap ke Warm TUI; dropdown navbar + footer di-restyle.

## v2.0.6 — 2026-08-04 · Warm TUI Konversi Awal
- Remap token global (tokens.css/theme.css), top bar + mega menu + drawer, hero/kartu/tabel/tombol bracket, badge, logo favicon.

## v2.0.5 — 2026-08-04 · Migrasi Navigasi: Sidebar → Top Bar
- Sidebar dihapus; navigasi pindah ke **top bar** (navbar + mega menu) + drawer mobile.
- `NAV_MIGRATION_PLAN.md` + pembersihan localStorage usang (`sidebar`).

## v2.0.4 — 2026-07-13 · Persiapan Backend GAS
- Persiapan backend Google Apps Script (Auth, Main, Config, Validator, Services, SCHEMA) — nantinya dihapus setelah semua data menjadi statis/parsing.

## v2.0.3 — 2026-07-12 · Perbaikan UI/UX
- 7 seri perbaikan UI/UX (12–14 Juli), termasuk perbaikan ikon Search di navbar.

## v2.0.2 — 2026-07-11 · PWA & Restrukturisasi Dashboard
- **PWA**: manifest, service worker, offline page.
- Restrukturisasi + pengembangan dashboard (hero, kartu layanan, quick actions).

## v2.0.1 — 2026-07-11 · Modul MONEV
- Modul **MONEV KEPAN** (Monitoring & Evaluasi Kinerja Kepaniteraan): PSP, Statper, Survei, DIPA 04, Masalah, Keuangan + glass UI.

## v2.0.0 — 2026-07-10 · Git Init — Awal Situs Baru
- **Commit pertama** — fondasi situs LINTAS-QR baru (repo git ini).
- 3 `Initial commit` (10–11 Juli 2026) + setup struktur proyek (Vite, Tailwind, PWA).
- Menggantikan situs lama v1.x (Google Sites).

---

## v1.0.0 — Situs Lama (Google Sites)

Rilis awal LINTAS-QR sebagai situs statis Google Sites:
[https://sites.google.com/view/lintas-qr-pa-atambua/](https://sites.google.com/view/lintas-qr-pa-atambua/)

Portal informasi layanan PTSP Pengadilan Agama Atambua dengan akses via QR-Code. Era ini tidak dikelola di repo git ini; seluruh pengembangan aktif dilanjutkan pada **v2.x** (repo ini).

---

## Panduan Penomoran Versi

| Kenaikan | Kapan | Contoh |
|---|---|---|
| **Patch (v2.x.y → v2.x.y+1)** | Perubahan kecil / perbaikan bug / penyempurnaan kecil | v2.0.1 → v2.0.2 |
| **Minor (v2.x → v2.x+1)** | Kelompok pembaruan/fitur yang lebih besar (milestone) | v2.0.0 → v2.1.0 |
| **Mayor (v2 → v3)** | Pergantian arsitektur/fondasi besar | — |

> Catatan: halaman **Changelog** (`pages/changelog.html`) menampilkan timeline konversi design system (v1.x–v2.x Warm TUI). Dokumen ini adalah **sumber resmi riwayat rilis** lengkap situs sejak git init.
