# Table changelog Read the complete [LICENSE](https://snowui.dev/LICENSE) for the installed version before use. Reviewed against Chinese source SHA-256 `1b2d555263cf618d8b65fa607fecd9eb34e99a7057f9bb0fa7a5639260989c5b`. For version differences, check the installed package as well. ### v2.7.1 (2026-10-23) - Double-click column fitting includes the actual gap of the sort button along with the existing icon budget. Minimum/maximum widths, original-width restoration for wrapping columns, and other column widths remain unchanged. ### v2.7.0 (2026-10-21) - The shared responsive controller allocates the action budget, caches More and padding measurements, and preserves scrolling at very narrow widths. - 2026-10-07: Fade applies only to content. A separate content layer transitions position and visible width as columns collapse and return. Removed temporary fixed layout and zero-width last-column interpolation; backgrounds, dividers, and outer edges remain intact, and rapid reversals start from current geometry. - 2026-10-07: Column collapse now has a continuous opacity transition within a fixed-width interval, synchronized with container width and supporting reverse restoration and reduced-motion preference. - 2026-10-07: Standardized at least 8px at the table outer edges and 8px between adjacent column content (4px internally on each side). Outer spacing is redistributed after a column collapses. - 2026-10-07: Fixed or automatically locked fractional column widths and integer viewport widths now use the same half-pixel tolerance, preventing sufficient space from incorrectly forcing cell and action-overlay padding to minimum values. - 2026-10-07: Raised minimum responsive cell padding on each side from 2px to 4px, leaving at least 8px between adjacent column content. - 2026-10-07: v2.6.0 added horizontalScroll and auto role layout. Role collapse, spacing compression, right-to-left hiding, and scroll fallback are unified; original column widths return and visible edges update. - 2026-10-07: v2.5.3 aligned transparent regions for in-row and header Checkboxes to their actual right edges, using a fixed `--size-5` (nominally 20px) soft transition rightward. It follows control size and responsive spacing, not column width. Explicit start/end overrides remain. - 2026-10-07: Synchronized TableCell v1.10.2 documentation for cross-column fading and visible-viewport positioning. The default transparent area meets the button’s actual left edge, with a fixed 20px Token transition to the left. Table’s public API is unchanged. - 2026-09-21: Unified the usage guide, source property table, and Site / AI reading entry points. Documentation only; component behavior is unchanged. - 2026-09-02: v2.5.2 moved the continuous Hover layer into Table’s local horizontal viewport and clips it there. Hidden columns in wide tables no longer paint row backgrounds beyond the current visible edge. - 2026-09-01: v2.5.1 fixed a bottom-docked horizontal scrollbar becoming unusable when overlapping data rows. Continuous Hover had raised table to `z-index: 1` while the track remained at the default layer. Table now keeps the horizontal track above content, verified with real hit and drag regression checks. - 2026-09-01: v2.5.0 added a local horizontal viewport and a viewport-bottom overlay track. With no explicit width, minimum table width sums each column’s min-content and Cell padding, preserving the longest unbreakable word or fragment. - 2026-09-01: v2.4.1 adjusted the container response curve so narrow tables reach 2px padding per side at common mobile widths; minimum visual spacing between native adjacent columns is fixed at 4px. - 2026-08-14: v2.4.0 made the Table viewport an inline-size container. TableHead / TableCell horizontal padding flows from the default 12px to a minimum of 2px based on the table’s own width; DataTable compositions inherit this naturally. - 2026-08-06: v2.3.0 added a semantic fast path for dense tables and table-level single-frame truncation batching. Default cells no longer initialize per-cell Frame runtimes or size observers, and disabled role capabilities skip inactive overlay DOM/styles. Visuals and fallback to full capabilities remain unchanged. - 2026-08-06: v2.2.0 allowed dragging to resize TableHead on ordinary data columns by default. Fixed columns can explicitly pass `resizable={false}`; existing sorting data rules remain unchanged. - 2026-08-03: v2.1.2 made the extra 1px on a 17px selection Checkbox a fixed `0.0625rem` special case, rather than using `--border-2` in its size calculation. - 2026-08-03: v2.1.1 made Table’s built-in selection Checkbox a Token-calculated 17px composition variant, leaving 16px above and below it in odd-height data rows. The Checkbox component’s global default remains 16px. - 2026-08-03: TableRow gained an externally controlled `active` state. Its persistent `--black-4` background can layer with continuous hover and is independent of selected / Checkbox state. - 2026-07-07: Reduced first-screen work: ordinary cells no longer queue an extra per-cell rAF on mount. Overlay role blocks measure and observe position only on hover, focus, selection, or forced preview; idle rows perform no layout reads. - 2026-07-07: v2.1.0 clarified that Table only presents tabular data. DataTable owns loading more, selection/actions role columns, sorting, filtering, pagination, and search. - 2026-07-05: v2.0.0 moved checkbox selection and button action columns to DataTable. Plain Table removed selection and role-layout Props. - 2026-07-01: v1.14.0 batches data-row registration in a microtask, so replacing all rows for pagination no longer recalculates selection after each row. - 2026-06-30: v1.13.0 automatically locks current natural column widths before the first incremental load. Wider new content can no longer trigger `table-layout:auto` reflow that shifts existing rows sideways; explicit columnWidths or dragged widths still take precedence. - 2026-06-30: v1.12.0 moved DataTable new-row opacity fades from entire rows to ordinary TableCell, avoiding a second parent opacity layer on selection/actions overlays. Selection content mask is fixed at about 16px → 60px and header mask at about 14px → 26px, matching the first demo table instead of varying with column width. - 2026-06-30: v1.11.1 corrected DataTable automatic-load threshold direction: by default it triggers after scrolling 80px past the table bottom, rather than loading 80px early. - 2026-06-30: v1.11.0 moved DataTable automatic loading inside the component, which manages the end-of-table sentinel, 80px bottom threshold, and 500ms request throttle. Pages need no scroll observer. - 2026-06-30: v1.10.6 documented the 500ms dwell confirmation for page-scroll automatic loading. Scrolling upward out of the trigger area cancels it; remaining there or scrolling farther down loads. - 2026-06-30: v1.10.5 adapted to Frame `while*` semantics for all visual channels; DataTable row fade no longer needs a scale: undefined counter-override. - 2026-06-30: v1.10.4 changed DataTable new-row entrance to a pure opacity fade, explicitly removing scale from Frame’s general appear preset. - 2026-06-30: v1.10.3 avoids zero-duration timers when DataTable row display spacing is zero, so local rows in one batch commit in the same turn. The demo server now returns the whole batch after one request delay, preventing server yield spacing from affecting component display spacing. - 2026-06-30: v1.10.2 fixed new rows failing to enter Frame’s `Appear` state, which prevented their opacity fade. Per-row commit spacing returned to 100ms; each row still fades for 1000ms with overlap allowed. - 2026-06-30: v1.10.1 extended opacity fade for streamed new rows to 1000ms to make the per-row animation path easier to verify. - 2026-06-30: v1.10.0 integrated DataTable’s internal streamed-load protocol. TableRow automatically consumes new rows with a 250ms fade; pages no longer maintain new-row state manually. - 2026-06-30: v1.9.0 added a Spinner row while existing data loads. It centers the shared Spinner in a real spanning cell, defaulting to 16×16px, and added the `loadingSpinnerSize` size entry point. - 2026-06-30: v1.8.0 added the initial-load Skeleton rows composition protocol. TableHead registers public column structure, TableBody creates semantic skeleton rows by column, and DataTable can enable them automatically through Context when initially loading empty data. - 2026-06-30: v1.7.3 keeps striped data-row corners at all times. Divided hover background transitions only on entry and disappears immediately on exit, avoiding a fading background remaining while corners return to square. - 2026-06-30: v1.7.2 made default divided headers and static data rows square. Data rows gain 12px outer corners only on hover or `data-force-hover`, while dividers adjacent to the hovered surface are fully hidden. Corners on odd striped background rows are unchanged. - 2026-06-29: v1.7.1 fixed a broken actions fade mask. Mask generation based on measured row-level button width moved from the Table root to the adjacent content TableCell, where descendant CSS variables resolve. It still reuses `edge-fade`. - 2026-06-27: v1.7.0 extracted overlay content-edge fading into shared `edge-fade` (`createEdgeFadeMaskImage`). Table root generates checkbox/header masks; adjacent content TableCell generates the actions mask where measured row button width is available; TableCell / TableHead hover rules consume shared CSS variables. All three retain configurable fade-start / fade-end / coverage / feather overrides. Added `--snowui-table-actions-fade-feather-override` (default 3) for the action-column soft tail. Floating action-layer positioning remains a table-layout responsibility. - 2026-06-27: v1.6.3 updated documentation to actual parameters: action-column fade coverage defaults to `0.9`, soft-tail end to `× 3` (a tail twice the transparent-area length for a slower transition). It also fixed stale example defaults for checkbox `15% → 60%` and header `50% → 100%`. - 2026-06-27: v1.6.2 reduced default total action-fade coverage from `1` to `0.8`: mask width equals measured button width × 0.8, narrowing the whole mask and moving the soft tail inward without a gap. Coverage is a general percentage of button width; smaller values make it narrower. - 2026-06-27: v1.6.1 softened the action-column fade like the long checkbox-side transition. Its tail end moved from transparent area × 1.2 to × 1.5, making the tail half as long as the transparent area and avoiding a hard edge. The fully transparent area still equals measured button width, adaptively and minimally hiding content behind buttons. - 2026-06-27: v1.6.0 made action-column fading **adapt to measured button width**. JavaScript measures each row’s button group including right padding and writes `--snowui-table-role-overlay-content-width` on the row. Edge fade then shrinks to cover the buttons plus a 20% soft transition; one-button and multibutton tables need no override column width. `--snowui-table-actions-fade-coverage-override` now defaults to `1` (button-fitting). Background blur defaults to `0rem`; progressive blur is opt-in through `--snowui-table-role-overlay-blur-override`. Both Table-Demo tables removed inline styles and use component defaults. - 2026-06-27: v1.5.4 made the action-column fade’s soft transition a **fixed** `1.5rem`. Previously it was 20% of coverage and could disappear as coverage shrank or become a hard edge when gradient stops differed. Transparent width now equals overlay-column width × `--snowui-table-actions-fade-coverage-override` (default `0.75`), with a visible 1.5rem transition at any coverage. Reduce `--snowui-table-role-overlay-width-override` for a narrower specific table. - 2026-06-27: v1.5.3 gave action-column fading one shared ratio control: `--snowui-table-actions-fade-coverage-override` (default `0.8`) sets fully transparent button-covering width as overlay-column width × ratio, followed by a fixed 20% soft fade. Removed the old `--snowui-table-actions-fade-start-override` / `--snowui-table-actions-fade-end-override`: their transparent zone had been hard-coded to the whole column and could not be narrowed with one value. The ratio scales with each table’s column width and can be set once on an ancestor. - 2026-06-27: v1.5.2 scaled the actions fade with overlay-column width. By default the fully transparent area equals that width, just covering all buttons, and soft fade ends at width × 1.2 (about 20% wider than the action column). Buttons hide underlying content regardless of column width; set `--snowui-table-role-overlay-width-override` near button-group width. - 2026-06-27: v1.5.1 changed fade defaults: first header column `50%` → `100%`, checkbox column `15%` → `60%`; actions remain overlay-column width × 0.1 → × 0.6. It clarified that the fully transparent start of actions fade should approximate button-group width: about × 0.1 for one button or × 0.5 for several with fixed column width. - 2026-06-27: v1.5.0 split fixed overlay hover edge-fade parameters into three independent overridable CSS-variable pairs: first header column `--snowui-table-head-fade-start-override` / `--snowui-table-head-fade-end-override` (defaults 4% / 60%), checkbox column `--snowui-table-selection-fade-start-override` / `--snowui-table-selection-fade-end-override` (4% / 60%), and action column `--snowui-table-actions-fade-start-override` / `--snowui-table-actions-fade-end-override` (overlay width × 0.1 / × 0.6). Added row-level `data-force-hover="true"` for static hover-state demos or visual review. All three are recorded in ComponentStyleSheet.md table 3 and components/src/styles/components.css. - 2026-06-27: v1.4.4 aligned first-header-title (Date column) hover edge-fade triggers exactly with the header select-all Checkbox: fade only on data-row hover, that column-header hover, hover/focus of the select-all overlay, or an existing selection. The header no longer fades while select-all is absent; it previously faded whenever the pointer entered the table. - 2026-06-27: v1.4.3 fixed two issues. (1) Narrowed the header select-all Checkbox reveal to hovering any data row, the first data-column header (Date beneath the overlay), hovering/focusing select-all itself, or an existing selection; other header columns such as Stores no longer reveal it. (2) Restored hover feedback on overlay action icon buttons by wrapping them in `.snowui-table-role-overlay-controls` and applying the table visibility gradient to wrapper `opacity`, not the buttons. This preserves bare actions’ muted 40% rest / 100% hover opacity because the two opacity layers multiply rather than conflict on one element. Since 2026-08-09, `emphasis="muted"` must be explicit. - 2026-06-27: v1.4.2 changed header select-all reveal from pointer entry into `.snowui-table-viewport:hover` to hover over any table row (`.snowui-table-viewport:has(.snowui-table-row:hover)`), keyboard focus within a row, or an existing selection, matching in-row Checkbox timing. The header is itself a row, so moving the pointer from data to header keeps select-all visible and clickable. - 2026-06-27: v1.4.1 fixed first data columns such as Date / Stores being blocked by the select-all overlay in overlay mode, preventing sort clicks, resize drags, and hover. The `.snowui-table-selection-control` matched a non-overlay `[data-as="selection"]` hover rule (specificity 0,3,0), forcing `pointer-events:auto` on table hover; its 14rem width and `z-index:4` intercepted pointers over covered columns. Restricted that rule to non-overlay layouts with `:not([data-role-layout="overlay"])`. In overlay mode the header select-all container always has `pointer-events:none`; only its Checkbox receives `pointer-events:auto` on hover, and container width shrank to `2rem`. - 2026-06-27: v1.3.2 fixed overlay-role blur base tint at `white/100%` and added `--snowui-table-role-overlay-tint-opacity-override` (default `0%`) to adjust the white frosted layer over background blur. - 2026-06-27: v1.3.1 added `roleOverlayUniformFeather` for `uniform` background blur, allowing a gradient mask to soften the hard boundary of one blur layer. - 2026-06-27: v1.3.0 added `roleOverlayLayers` and `roleOverlayBlurMode` for overlay-role blur. Table context distributes blur layer count and mode; selection/actions blur blocks in headers and cells share one controller. `uniform` mode reuses the new `createUniformBlurStyles` for comparison with ordinary background blur. - 2026-06-25: v1.2.1 documented overlay selection’s fixed overlay layer, progressive blur, stacking, and click fallback. The Checkbox covers the first column while links and empty-row clicks still work. - 2026-06-23: v1.2.0 added `roleLayout="overlay"`. Selection/actions role blocks can cover the left and right table edges with reversed multilayer transparent blur-gradient masks that keep controls clear. Action buttons now appear only on row hover. - 2026-06-23: v1.1.0 added explicit selection/actions role columns. Selection includes a Checkbox and select-all protocol for currently rendered rows; actions retain custom button content. - 2026-06-22: v1.0.1 clarified that wide tables contribute to the page’s intrinsic width and the page container owns horizontal scrolling; registered composite management layout. - 2026-06-19: v1.0.0 added semantic tables and column-width context. [Component guide](https://snowui.dev/llms/en/components/table.md) · [Full reference](https://snowui.dev/llms/en/components/table/reference.md)