# Changelog

All notable changes to `kview/ui-data` are documented here.

## [Unreleased]

- Added an `adaptive` pivot summary position: collapsed groups blend their
  identity and aggregate cells into one row, while expanded groups render the
  same aggregate once after their detail rows. Existing fixed header and footer
  behavior remains unchanged.
- Added optional sortable pivot columns with stable, type-aware sorting inside
  each existing row group and across explicit group-key `sortValues`,
  APG-compatible header buttons/`aria-sort`, collision-safe disclosure IDs,
  and accessible Expand all / Collapse all group commands.
- Added the public `KviewPivotTable` analytical table with typed ERP cells,
  accessible collapsible row groups, header/footer summaries, keyboard row
  activation, host-link routing and the shared persistent horizontal-scroll
  foundation. Aggregation and formatting remain host-owned.
- Kept the compact `KviewCrudTable` page-size menu readable by relying on its
  selected background instead of reserving space for a decorative checkmark.
- Added a localized, focusable native horizontal-scroll proxy to
  `KviewCrudTable`. It stays inside the table shell at the lowest visible edge,
  immediately before the footer, synchronizes scroll progress in both
  directions, observes viewport/table width changes, and avoids a nested
  vertical scroller; touch-only devices retain the native swipe path instead.
  Consumers can override its accessible name through the optional
  `labels.horizontalScroll` entry.
- Restored CRUD-index parity at constrained desktop widths: selection
  checkboxes are centered and quiet until hover/focus/selection. Pointer and
  touch layouts now reserve the same real sticky `44px` leading gutter, so a
  checkbox never covers the first header/value; its header surface remains
  continuous and a soft depth shadow appears only with a visible checkbox over
  horizontally scrolled content. Row actions reserve no table column and receive an opaque quiet
  veil only on hover/focus, and the Vue footer keeps count, page size, and
  pagination on one compact row whenever their actual content fits. Add now
  uses the shared secondary icon-link surface, while Previous/Next use
  localized accessible chevrons instead of repeating long visible labels.
  Export, Delete, and Add also share the same toolbar control radius.
- Removed the redundant outer padding from teleported CRUD filter panels; the
  filter header, body, and action bar remain the single owners of their insets.
- Added an explicit centered `year` presentation for Fund vintage values with
  a minimum width that preserves the full heading, sort, and filter controls
  even when an older narrower width exists in local table preferences.
- Aligned the Blade and Vue CRUD toolbar contract as Export, contextual
  selection count/Delete, then Create; the selection count is quiet plain text,
  Delete reuses the shared transparent danger icon command, and all constrained
  icon commands share a stable 38px square. Create reuses the shared icon-link
  primitive instead of a bespoke button. The pointer-only row-action overlay
  becomes opaque only directly beneath visible commands, and the footer wraps
  from its actual content instead of a viewport or container breakpoint.
- Added accessible option-driven multiselect column filters to
  `KviewCrudTable`; they emit the shared `{ operator: 'in', value: 'a,b' }`
  server contract through the existing filter intent.
- Added the public `#header-actions` slot, forwarded to the shared resource
  header action area for host-owned commands.
- Unified restored, pointer, keyboard, rendered and ARIA column-resize bounds:
  the effective minimum is `max(88px, minWidth)` and the maximum is `800px`.

## [0.2.0] - 2026-07-20

- Added the public `KviewCrudTable` Vue index engine to `@kview/ui-data/vue`:
  server-owned search, sort (asc/desc/none), per-column operator filters and
  pagination emitted as intents; locally-owned column visibility/order/width
  (shared localStorage contract), keyboard reorder/resize, row selection with
  an indeterminate select-all, client-side CSV/XLSX export, and destructive
  confirmations through host-rendered native forms.
- Added a conservative shared CSV formula-injection mitigation: direct
  formula/control triggers (including tab, CR and LF), formulas hidden after
  leading whitespace/BOM, and full-width look-alikes are prefixed as text;
  every CSV field is quoted so alternate delimiters cannot split a value into
  a fresh cell. XLSX cells remain explicit inline strings; CSV is not claimed
  universally safe across every spreadsheet and re-save workflow.
- Made every generic `KviewCrudTable` control string localizable through a
  `labels` prop (English defaults, nested operator overrides and
  `:name`/`:count`/`:format` placeholders), while retaining explicit props as
  backwards-compatible host overrides.
- Extracted `table-export` and `table-view-state` as shared modules used by
  both the Blade and Vue engines.
- On touch, `KviewCrudTable` hides the trailing per-row action column (row tap
  navigates to the detail page); the column stays on pointer devices.

- Added the optional `@kview/ui-data/vue` entry with typed cells, related-record
  tables, primitive-backed row actions, and an accessible preview drawer.
- Kept CRUD-table empty and filtered no-results states centered in the visible
  table viewport instead of clipping them inside the wide data grid; initial
  empty collections omit the meaningless selection rail, while filtered
  no-results states extend their bottom divider beneath the fixed rail.

## [0.1.0] - 2026-07-16

- Added column and cell registries, pagination options, ERP CRUD/detail tables,
  row actions, filters, export popovers, preview drawers, and smart tables.
- Added the complete ERP CSS and JavaScript ownership surface.
- Added configurable export branding, storage prefixes, translations, and
  localized client-generated table feedback.
