# Changelog - Dog Table

Semua perubahan signifikan pada proyek ini akan didokumentasikan di file ini.

## [Unreleased]
### Added
* **Column Visibility API:** Menambahkan dukungan `hidden: true`, `showColumn()`, `hideColumn()`, `toggleColumn()`, dan state `columnVisibility` yang ikut tersimpan.
* **Saved Views:** Menambahkan `saveView()`, `loadView()`, dan `deleteView()` berbasis persistence storage dengan fallback in-memory.
* **URL State Sync:** Menambahkan opsi `urlState: true` untuk sinkronisasi search, page, pageSize, sort, hidden columns, dan filters ke query string.
* **Structured Filters & Filter Row:** Menambahkan `setFilters()`, `setFilter()`, `clearFilters()`, `filterRow`, `filterType`, dan `filterOptions` untuk filter field-specific lokal maupun remote.
* **Remote-Friendly APIs:** Menambahkan cursor pagination remote, `addRow()`, `updateRow()`, `removeRow()`, dan `optimisticUpdates` untuk create/edit remote.
* **Column Layout Controls:** Menambahkan `stickyHeader`, `stickyColumns`, `resizableColumns`, dan `columnReorder` dengan state widths/order yang bisa dipersist.
* **Light/Dark Themes:** Menambahkan preset `light` dan `dark`, auto-detection dari `localStorage` / `sessionStorage`, serta override eksplisit lewat `theme: "dark"` saat inisialisasi.
* **Aggregates:** Menambahkan `footerAggregates` dan `groupAggregates` dengan helper `sum`, `avg`, `min`, `max`, dan `count`.
* **Event & Plugin APIs:** Menambahkan `table.on()`, `table.off()`, standard events, `DogTable.use()`, dan `plugins: []`.

### Changed
* **Docs Runtime:** Dokumentasi utama kembali memakai halaman HTML statis tanpa runtime Svelte.
* **Display Row Memoization:** Cache `buildDisplayRows()` sekarang mengikuti urutan row yang sedang dirender plus konfigurasi grouping, sehingga pagination lokal tidak memakai wrapper baris dari halaman sebelumnya.
* **Request-Key Deduplication:** Remote fetch identik yang masih in-flight sekarang berbagi promise berdasarkan request URL, sementara request berbeda tetap bisa menggantikan pekerjaan lama melalui abort path.
* **Render Queue:** `update()` sekarang memakai satu promise render terjadwal per frame. Panggilan berulang tidak lagi polling frame-to-frame, dan `updateSync()` berbagi promise update aktif untuk menjaga koordinasi state.
* **Debounced Fetch Awaiting:** Saat `fetchDebounce` aktif, `update()` menunggu fetch yang sudah didebounce sebelum memproses data agar render tidak memakai payload lama.
* **Keyed Body Rendering:** Group rows, data rows, dan detail rows sekarang dilacak dengan key internal. Urutan baris yang tidak berubah di-update in place, sedangkan perubahan urutan atau expansion state rebuild melalui `DocumentFragment`.
* **Opt-in Virtual Scrolling:** Menambahkan opsi `virtualScroll` untuk mendelegasikan body rendering ke viewport renderer pada tabel lokal besar.
* **Opt-in Data Worker:** Menambahkan opsi `dataWorker` untuk filtering/sorting lokal dataset besar yang eligible di Web Worker, dengan hasil berupa row indexes agar referensi row utama tetap stabil.
* **Lazy Column Paint Hints:** Menambahkan opsi `lazyColumns` untuk memberi browser-native lazy painting hints pada header/body cells di tabel lebar.
* **Lookup Cache:** Column lookup dan row-id lookup sekarang memakai `Map` internal untuk menghindari repeated linear scans pada sort, visibility toggle, dan inline editing.

### Fixed
* **Global Search and Sort Flags:** Opsi setup `sortable: false` sekarang menonaktifkan sorting untuk seluruh tabel, termasuk initial/persisted/URL sort state. `searchable: false` sekarang benar-benar menyembunyikan toolbar tanpa ditimpa CSS dan mengabaikan search state. Default keduanya tetap `true` untuk backward compatibility, sementara opsi per-column tetap didukung.

### Docs
* **README:** Ditulis ulang sebagai front page yang merangkum API dari source code terbaru.
* **Static Docs:** `docs.html` kembali menjadi dokumentasi utama, `docs-v1.html` tetap menjadi dokumentasi legacy, dan `docs/` diarahkan ke docs statis.
* **Wiki:** Diperbarui untuk mencakup visibility, views, URL state, filters, cursor pagination, mutations, layout controls, aggregates, events, dan plugins.
* **Performance Examples:** Contoh query cache, fetch debounce, pagination guard, grouping, virtual scroll, data worker, dan lazy columns sekarang menjadi materi pada docs statis.
* **Wiki:** Menambahkan dokumentasi display-row cache, request-key deduplication, rAF render batching, `fetchDebounce`, `virtualScroll`, `dataWorker`, dan `lazyColumns`.
* **Execution Tracker:** Menandai semua fase performance plan sebagai selesai.

## [1.5.1] — 2026-05-20
### Added
* **Request Debouncing:** Menambahkan opsi `fetchDebounce` untuk menunda request remote secara konfigurabel, mencegah spam fetch saat perubahan state cepat (pagination, search, sort). Default `0` (disabled) untuk backward compatibility.
* **Request Deduplication:** In-flight fetch request sekarang di-deduplicate. Panggilan `update()` bersamaan akan berbagi promise yang sama, bukan membuat banyak request yang kemudian di-abort.
* **Virtual Scrolling Module:** Menambahkan `src/core/VirtualScroller.js` untuk merender hanya baris yang terlihat di viewport. Cocok untuk dataset besar dengan page size 100+ baris.
* **New Public Methods:**
  * `table.fetchNow()` - Bypass debounce dan langsung eksekusi fetch
  * `table.updateSync()` - Update tanpa rAF batching untuk kasus yang butuh render langsung
* **Fetch Timeout:** Menambahkan opsi `fetchTimeout` pada remote config dengan default 15 detik. Request yang melebihi batas akan di-abort otomatis.

### Changed
* **Memoized Display Rows:** `buildDisplayRows()` sekarang di-cache berdasarkan `rawData` reference dan `groupBy` config. Tidak rebuild wrapper rows jika data tidak berubah.
* **Precomputed Sort Keys:** Sorting sekarang pre-extract sort values sebelum comparison, mengurangi property access dari O(n log n) menjadi O(n).
* **rAF-Batched Renders:** `update()` sekarang di-schedule via `requestAnimationFrame`, mencegah multiple render dalam satu frame saat state berubah cepat.
* **DOM Diffing:** `TableRenderer.renderBody()` sekarang melacak row nodes via `Map` dan hanya rebuild baris yang berubah, bukan `innerHTML` penuh setiap siklus.
* **Optimized escapeHtml():** Implementasi `escapeHtml()` sekarang menggunakan single regex dengan lookup map, lebih cepat untuk hot path rendering.
* **CSS Content-Visibility:** Group rows sekarang memakai `content-visibility: auto` dengan `contain-intrinsic-size`, browser skip rendering off-screen groups secara native.
* **Map/Set Lookup Optimization:** Selection dan grouping logic menggunakan `Set` untuk O(1) lookups, sudah diterapkan di `TableState` untuk `selectedRows` dan `expandedRowIds`.
* **Hook Payload Standardization:** `onUpdate` hook sekarang menerima `processed` object langsung (bukan `{ state, columns }`), dengan defensive guards untuk semua properti.

### Fixed
* **Live Sync Loading Stuck:** Memperbaiki bug kritis di mana auto-refresh (`autoRefresh`) akan stuck pada skeleton loading saat payload response identik dengan sebelumnya. Penyebabnya: `renderLoading()` menghancurkan DOM rows tapi `_rowNodes` cache masih memegang referensi ke node yang sudah detached. Fix: cache dibersihkan sebelum `tbody.innerHTML` overwrite, dan `renderBody()` sekarang memeriksa `parentNode` pada cached nodes.
* **Live Polling Overlap:** Menambahkan guard `state.loading` pada `LivePlugin.scheduleNext()` untuk mencegah polling baru saat fetch masih berjalan.
* **Hook Payload Safety:** Menambahkan defensive guards di `emitHooks()` dan `getProcessedData()` untuk mencegah `TypeError` saat `processed` undefined atau null.
* **MetaRenderer Safety:** Menambahkan fallback untuk `options.language.showing`, `noResults`, `emptyState` di `renderMeta()`.
* **PaginationRenderer Safety:** Menambahkan nullish coalescing untuk `currentPage`, `totalPages`, dan safe fallbacks untuk `language.page`, `previous`, `next`.
* **Demo Fixes:** Memperbaiki `advanced-features.html` dan `pagination-guard.html` yang menggunakan signature hook lama.

### Performance
* **Data Pipeline:** Memoization cache untuk `buildDisplayRows()` mengurangi rebuild overhead saat data tidak berubah.
* **Sort Efficiency:** Precomputed sort keys mengurangi property access dan function call selama sorting.
* **Render Batching:** `requestAnimationFrame` batching mencegah layout thrashing saat multiple `update()` dipanggil bersamaan.
* **DOM Reuse:** DOM diffing mempertahankan existing row nodes, mengurangi DOM creation/destruction overhead.
* **Network Efficiency:** Request deduplication dan debouncing mengurangi jumlah fetch yang tidak perlu.

### Docs
* **README:** Diperbarui dengan tag v1.5.1-beta dan ringkasan performance optimizations.
* **index.html:** Eyebrow version diperbarui ke v1.5.1-beta.
* **PLAN.md:** Menambahkan dokumen performance improvement plan dengan 12 saran optimasi terorganisir dalam 4 fase.
* **wiki/Examples.md:** Menambahkan halaman contoh lengkap dengan 10 contoh penggunaan, API reference, hooks, dan konfigurasi.
* **docs.html:** Diperbarui dengan 10 examples section, performance notes, dan VirtualScroller documentation.

## [1.5.1-beta] — 2026-05-01
### Added
* **Optional Pagination Disablement:** Menambahkan opsi `pagination: false` untuk menonaktifkan slicing per halaman dan menyembunyikan kontrol pagination pada tabel lokal maupun remote.

### Changed
* **Remote Query Behavior:** Saat `pagination: false`, request remote tidak lagi mengirim parameter `page` dan `pageSize`, sehingga endpoint bisa mengembalikan seluruh dataset yang tersedia.
* **Guardrail Handling:** `paginationGuard` sekarang diabaikan sepenuhnya saat `pagination: false`, dan library akan menampilkan `console.warn` untuk menandai mismatch konfigurasi.
* **Documentation:** README dan wiki configuration reference diperbarui dengan penjelasan opsi `pagination` baru beserta contoh penggunaannya.

## [1.5.0] — 2026-04-30
### Changed
* ** Modular Refactor:** `DogTable` sekarang menjadi orchestrator tipis yang mendelegasikan state, data processing, rendering, event binding, remote fetching, dan plugin bootstrap ke modul terpisah.
* **State Layer:** Menambahkan `src/core/TableState.js` untuk menangani `currentPage`, `pageSize`, `searchQuery`, `sortKey`, dan guard pagination secara terpusat.
* **Data Layer:** Menambahkan `src/core/DataEngine.js` untuk filtering, sorting, pagination slicing, serta cache pipeline yang sebelumnya tertanam di kelas utama.
* **Query Cache:** Remote query context sekarang menyimpan pagination secara terpisah per query, sementara dataset identik di-alias ke base cache yang sama agar tidak diduplikasi di memori.
* **Renderer Split:** UI tabel dipisahkan ke `src/renderers/TableRenderer.js`, `src/renderers/PaginationRenderer.js`, dan `src/renderers/MetaRenderer.js` agar render lebih idempoten dan tidak tercampur dengan business logic.
* **Remote & Events:** Menambahkan `src/data/RemoteAdapter.js` dan `src/core/EventBinder.js` untuk memisahkan fetch remote dari UI serta memusatkan bind/unbind event DOM.
* **Plugin Bootstrap:** Inisialisasi plugin sekarang diisolasi di `src/plugin/PluginManager.js` tanpa mengubah API publik yang ada.

### Docs
* README, wiki architecture, dan dokumentasi terkait diperbarui agar mencerminkan struktur modular  baru.
* `index.html` dan `docs.html` diperbarui untuk menampilkan arsitektur modular , termasuk penjelasan layer internal dan alur update baru.

## [1.5.0] — 2026-04-30
### Changed
* **Phase 1 Modular Refactor:** `DogTable` sekarang menjadi orchestrator tipis yang mendelegasikan state, data processing, rendering, event binding, remote fetching, dan plugin bootstrap ke modul terpisah.
* **State Layer:** Menambahkan `src/core/TableState.js` untuk menangani `currentPage`, `pageSize`, `searchQuery`, `sortKey`, dan guard pagination secara terpusat.
* **Data Layer:** Menambahkan `src/core/DataEngine.js` untuk filtering, sorting, pagination slicing, serta cache pipeline yang sebelumnya tertanam di kelas utama.
* **Renderer Split:** UI tabel dipisahkan ke `src/renderers/TableRenderer.js`, `src/renderers/PaginationRenderer.js`, dan `src/renderers/MetaRenderer.js` agar render lebih idempoten dan tidak tercampur dengan business logic.
* **Remote & Events:** Menambahkan `src/data/RemoteAdapter.js` dan `src/core/EventBinder.js` untuk memisahkan fetch remote dari UI serta memusatkan bind/unbind event DOM.
* **Plugin Bootstrap:** Inisialisasi plugin sekarang diisolasi di `src/plugin/PluginManager.js` tanpa mengubah API publik yang ada.

### Docs
* README, wiki architecture, dan dokumentasi terkait diperbarui agar mencerminkan struktur modular Phase 1 baru.
* `index.html` dan `docs.html` diperbarui untuk menampilkan arsitektur modular Phase 1, termasuk penjelasan layer internal dan alur update baru.

## [1.4.1] — 2026-04-29
### Added
* **Demo navigation:** Added Previous/Next navigation links across all demo pages based on the Demo Map order.
* **Remote API Standardization:** Migrated the entire demo suite (Custom Cells, Grouping, Advanced, Formatting, Live Sync, Pagination Guard) to use the unified `https://api.rahmaanms.my.id/api/employees` remote endpoint.
* **Performance Optimizations:** Comprehensive efficiency overhaul across the library core and plugins.
    * **Core Engine:** Implemented a memoized data processing pipeline (filter/sort caching), sort hoisting, and centralized event delegation for better UI responsiveness.
    * **Theme Engine:** Optimized class merging and added a selector cache to minimize DOM querying overhead.
    * **Plugin Layer:** Added `Intl` object caching in `FormatterPlugin`, throttled storage writes in `PersistencePlugin`, and O(1) row lookups in `EditorPlugin`.
    * **Selection:** Improved "Select All" to handle multi-page selection for local data and added support for the `indeterminate` checkbox state in the header.
* **Create Record Overhaul:** Comprehensive UI/UX redesign of the record creation workflow with glassmorphism, backdrop blur, and horizontal row grid layouts.

### Fixed
* **Search Input:** Implemented trimming and case-normalization in `setSearch` to prevent redundant network requests when inputs only differ by whitespace.
* **Pagination Sync:** Fixed a critical bug where UI state could become out-of-sync with remote data if the dataset size decreased (e.g. during live sync). The engine now automatically clamps the current page and triggers a corrective re-fetch.
* **Redundant Fetches:** Added idempotency guards to `setPage` and `setPageSize` to avoid unnecessary remote calls when inputs result in the same state.


## [1.4.0] — 2026-04-28
### Changed
* **Primary Constructor Rename:** API utama kini memakai `new DogTable(container, options)` sebagai konstruktor publik.
* **Backward Compatibility Alias:** `DataTable` tetap diekspor sebagai alias agar integrasi lama tidak langsung rusak.
* **Naming Consistency in Examples:** Snippet README, wiki, landing page, dan semua demo HTML diperbarui ke `DogTable`.

### Docs
* **Versioned Documentation Pages:** `docs.html` sekarang menjadi docs versi terbaru (`DogTable`) dan halaman legacy baru tersedia di `docs-v1.html` (`DataTable`).
* **Version Switcher:** Menambahkan dropdown pemilih versi docs pada `docs.html` dan `docs-v1.html` untuk memudahkan pindah dokumentasi versi lama/baru.

## [1.3.4] — 2026-04-27
### Added
* **Optional Pagination Guardrails:** Menambahkan opsi baru `paginationGuard` untuk membatasi `currentPage` dan `pageSize` secara opsional.
* **Default Guard Preset:** Saat `paginationGuard: true`, guard memakai default `maxPage: 25`, `minPageSize: 1`, dan `maxPageSize: 100`.
* **Pagination Guard Demo:** Menambahkan demo baru untuk menunjukkan perilaku clamp page/pageSize saat guard aktif.

### Changed
* **State Sanitization:** Nilai `currentPage` dan `pageSize` sekarang dinormalisasi juga setelah persistence load agar tetap valid terhadap guard config.
* **Pagination Processing:** Perhitungan total halaman mengikuti batas `maxPage` saat guard aktif, termasuk pada render kontrol pagination.
* **Pagination Visual Tuning:** Radius tombol pagination default dikurangi (tidak lagi pill penuh) agar tampilan navigasi halaman terasa lebih tegas dan tidak terlalu rounded.

### Docs
* README dan docs diperbarui dengan dokumentasi `paginationGuard`, contoh konfigurasi, dan tautan demo guardrails.

## [1.3.2] — 2026-04-23
### Added
* **Create Workflow Module:** Menambahkan `CreatePlugin` dengan tombol toolbar "New Record", modal input bawaan, validasi field wajib, toast konfirmasi, dan highlight baris setelah data berhasil ditambahkan.
* **Authenticated Mutation Requests:** Menambahkan helper request baru di `src/core/request.js` untuk mendukung request `POST`/`PUT` dengan custom header wajib, termasuk pola autentikasi seperti CSRF token dan JWT.
* **Remote Create & Update Config:** Menambahkan dukungan `remote.create` dan `remote.update`, termasuk `headers`, `credentials`, `buildBody`, dan `mapResponse` agar sinkronisasi create/edit bisa langsung terhubung ke API.
* **Create API & Docs:** README diperbarui dengan dokumentasi opsi `create`, konfigurasi field create form, hook baru untuk create/update, serta contoh konfigurasi request terautentikasi.
* **GitHub Wiki Draft Docs:** Menambahkan set dokumentasi markdown baru di folder `wiki/` untuk Home, Getting Started, Configuration Reference, API Reference, Guides, FAQ, Architecture, dan Contributing agar dokumentasi panjang bisa dipisahkan dari README.

### Changed
* **Inline Editing Sync Flow:** `EditorPlugin` sekarang bisa menjalankan update remote terautentikasi, menampilkan status sync "Saving/Saved/Sync Failed", dan menjaga feedback UI tetap konsisten setelah edit berhasil atau gagal.
* **Data Fetcher Request Layer:** Fetch remote sekarang memakai helper request bersama agar perilaku header, credentials, dan parsing response lebih konsisten antara fetch biasa dan mutation.
* **Default UI Enhancements:** Stylesheet default diperbarui dengan styling untuk sync status, modal create, toast notification, dan efek highlight baris.
* **Build Output Cleanup:** File minified yang ter-generate seperti `src/data-table-min.js`, `src/data-table.min.css`, dan modul `*-min.js` internal tidak lagi disimpan di `src/`; build sekarang menghasilkan aset minified langsung ke `dist/` dan dokumentasi package entry point diselaraskan ke struktur baru ini.
* **README Restructure:** README diringkas menjadi front page yang lebih cepat dipahami, berisi badge, quick start 5 menit, feature highlights, package entry points, dan tautan ke dokumentasi lengkap.
* **Landing Page Refresh:** `index.html` diperbarui dengan palet sky-blue yang lebih dingin dan footer baru bergaya project/library standar agar landing page terasa lebih rapi dan konsisten sebagai halaman proyek open-source.

### Fixed
* **Optional Live Sync UI:** Tombol live sync tidak lagi dirender pada semua tabel secara default. Status button sekarang hanya tampil saat `autoRefresh` benar-benar aktif atau ketika ada status sinkronisasi sementara yang relevan.

## [1.3.1] — 2026-04-22
### Added
* **Demo Setup Snippets:** Menambahkan panel "Library setup" pada setiap demo utama agar pola import CSS, import module, dan konfigurasi awal bisa langsung disalin.

### Changed
* **Demo Gallery Refresh:** Memperbarui `demo/index.html` dengan layout gallery yang lebih informatif dan ringkas untuk membantu menjelajahi semua demo.
* **Formatting Demo Consistency:** Menyelaraskan `demo/formatting.html` dengan gaya demo lain dan mengubah contoh konfigurasi ke format kolom berbasis `key`.
* **Documentation Alignment:** README diperbarui agar referensi demo, preferensi konfigurasi kolom, dan dokumentasi penggunaan lebih konsisten dengan contoh terbaru.
* **Source Folder Cleanup:** Modul internal yang sebelumnya bercampur di root `src/` dipindahkan ke `src/core/` dan `src/utils/`, sementara entry point publik difokuskan pada source utama di `src/` dan output build di `dist/`.
 
## [1.3.0] — 2026-04-20
### Added
* **Formatter Engine ():** Menambahkan sistem formatting cerdas berbasis **Intl API** untuk otomatisasi tampilan mata uang (`money`), tanggal (`datetime`), dan angka (`number`).
* **Inline Editor (Phase 2):** Implementasi plugin `EditorPlugin` yang memungkinkan pengeditan data langsung di sel tabel dengan dukungan callback `onCellSave`.
* **Live Sync (Phase 3):** Menambahkan fitur `autoRefresh` untuk sinkronisasi data otomatis secara berkala (polling) dilengkapi dengan UI indicator "Live/Paused" yang interaktif.
* **Hook Lifecycle (Phase 4):** Penambahan hook baru `onBeforeRefresh` (sebelum polling) dan `onDataUpdated` (saat data mentah berubah melalui fetch atau edit).
* **Column Accessor Support:** Mendukung properti `accessor` pada kolom (semua metode engine sekarang kompatibel dengan `key` maupun `accessor`).
* **Demo Updates:** Menambahkan demo `demo/formatting.html`, `demo/inline-editing.html`, dan `demo/live-sync.html`.

---

## [1.2.3] — 2026-04-20
### Changed
* **Architectural Refactor:** Memisahkan fitur Persistence, Selection, dan Export ke dalam sistem plugin di folder `src/plugin`.
* **Code Cleanliness:** Menguraikan logika engine utama menjadi modul yang lebih kecil dan maintainable.
* **Utilities:** Memindahkan fungsi bantuan (`escapeHtml`, `debounce`) ke modul utilitas yang sekarang berada di folder `src/utils/`.

---

## [1.2.0] — 2026-04-20
### Added
* **: State Persistence & URL Sync:** Menambahkan dukungan penyimpanan state tabel ke `localStorage`, `sessionStorage`, atau URL Query Parameters.
* **Phase 2: Selection & Bulk Actions:** Menambahkan fitur multi-select dengan kolom checkbox otomatis dan API `getSelectedData()`.
* **Phase 3: Column Visibility & Export:** Menambahkan API `toggleColumnVisibility` dan fitur ekspor data ke format CSV (`exportCSV`).
* **Advanced Features Demo:** Menambahkan demo baru di `demo/advanced-features.html` yang menggabungkan fitur persistence, selection, dan export.

### Changed
* **Internal:** Sinkronisasi state sekarang memicu `saveState` otomatis di setiap siklus `update()`.

### Fixed
* **Selection Sync:** Memperbaiki sinkronisasi *Select All* checkbox di header agar akurat terhadap data yang tampil.
* **Search Persistence:** Memperbaiki input pencarian agar terisi otomatis saat memuat state dari URL/Storage.
* **Row Detail Visibility:** Memperbaiki konflik event listener yang sempat menyebabkan *detail row* tidak bisa dibuka.
* **Colspan Calculation:** Memperbaiki perhitungan lebar kolom pada *detail row* dan *empty state* saat fitur seleksi aktif.

---

## [1.2.0-beta.3] — 2026-04-20
### Added
* **Localization Support:** Menambahkan opsi `language` untuk menyesuaikan semua teks yang tampil di UI (search placeholder, empty state, pagination, dll).
* **Predefined Locales:** Menambahkan file lokalisasi bawaan untuk bahasa Inggris, Spanyol, Prancis, Jerman, Mandarin (Sederhana), dan Indonesia di dalam folder `src/locale`.
* **Dynamic Content Interpolation:** Mendukung placeholder seperti `{start}`, `{end}`, `{total}`, dan `{page}` pada teks lokalisasi.
* **API setLanguage:** Menambahkan metode `setLanguage(lang)` untuk mengganti bahasa tabel secara dinamis tanpa inisialisasi ulang.
* **Demo Localization V2:** Memperbarui demo `demo/localization.html` dengan fitur *language switcher* interaktif.

### Changed
* **Internal Structure:** Memindahkan opsi teks individual (`searchPlaceholder`, `emptyStateText`, dll) ke dalam objek `language` yang terpusat.
* **Package Exports:** Menambahkan sub-path exports pada `package.json` agar file locale bisa di-import langsung (`dog-table/locale/id`).

---

## [1.2.0-beta.2] — 2026-04-20
### Added
* **UX Improvements:** Implementasi *loading skeletons* animatif untuk meningkatkan feedback visual saat data sedang dimuat (remote).
* **Theme Support:** Menambahkan slot `skeleton` pada `ThemeManager` agar skeleton loading konsisten dengan preset Tailwind dan Bootstrap.

### Changed
* **Loading State:** `renderLoading()` sekarang merender baris skeleton berdasarkan `pageSize` saat ini, menggantikan teks loading statis.

---

## [1.2.0-beta.1] — 2026-04-20
### Added
* **Row Grouping:** Menambahkan dukungan `groupBy` dan `groupLabel` untuk menyisipkan header grup di dalam `<tbody>` setelah data diproses.
* **Expandable Row Detail:** Menambahkan `rowDetail.render()` dengan tombol toggle per baris, lazy rendering, dan API publik `toggleRowDetail`, `expandRowDetail`, serta `collapseRowDetail`.
* **Row Identity Support:** Menambahkan opsi `rowKey` agar state expand/collapse stabil saat sorting, filtering, dan pagination berubah.
* **Keyboard Sorting:** Header yang sortable sekarang bisa diaktifkan lewat tombol `Enter` dan `Space`, melengkapi atribut `aria-sort`.
* **Demo Coverage:** Menambahkan demo baru untuk grouping dan detail rows di `demo/grouping-detail.html`.

### Changed
* **Body Rendering Pipeline:** Transformasi render sekarang mendukung kombinasi grouping, detail rows, local processing, dan remote data.
* **Documentation:** README diperbarui untuk mendokumentasikan API grouping, row detail, hook baru `onRowToggle`, dan demo gallery yang diperluas.

### Fixed
* **Row Detail Colspan:** Loading, empty state, error state, dan detail rows sekarang menghitung jumlah kolom tampil secara benar saat kolom detail aktif.

## [1.1.0-beta.1] — 2024-05-20
### Added
* **Theme Engine (MVP 2 - Point 1):** Penambahan sistem *adapter* untuk styling. Sekarang library mendukung pergantian class secara dinamis.
* **Preset Support:** Menambahkan preset class bawaan untuk **Tailwind CSS** dan **Bootstrap 5**.
* **Class Mapping:** User sekarang bisa melakukan *override* class pada elemen spesifik (`table`, `thead`, `th`, `tr`, `td`) melalui konfigurasi awal.

---

## [1.0.0] — 2024-05-15
### Added (MVP 1 - Core Features)
* **Vanilla Core Engine:** Arsitektur berbasis Class JS yang ringan dan tanpa *dependency* luar.
* **Client-side Processing:** Pipeline pengolahan data otomatis (Filter -> Sort -> Paginate).
* **Interactive Sorting:** Dukungan pengurutan data untuk tipe string, number, dan date secara reaktif.
* **Global Search:** Fitur pencarian teks di seluruh kolom dengan performa yang dioptimalkan.
* **Pagination:** Navigasi halaman fungsional dengan kontrol *page size*.
* **Custom Cell Renderers:** Kemampuan untuk memformat konten cell menggunakan fungsi kustom (callback).
* **Type Safety:** Implementasi JSDoc/TypeScript interfaces untuk meminimalisir error pada input data.

### Fixed
* Memperbaiki isu *memory leak* pada event listener saat tabel di-render ulang.
* Sinkronisasi state pagination yang melompat saat melakukan filtering.

---

## [Planned] - Next Steps
