@ds-mo/ui 14.9.0 → 14.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
1
  {
2
- "timestamp": "2026-08-21T17:59:41",
2
+ "timestamp": "2026-08-21T20:51:35",
3
3
  "compiler": {
4
4
  "name": "@stencil/core",
5
5
  "version": "4.43.5",
@@ -25070,10 +25070,10 @@
25070
25070
  },
25071
25071
  {
25072
25072
  "name": "dataMode",
25073
- "type": "\"infinite\" | \"pagination\"",
25073
+ "type": "\"infinite\" | \"pagination\" | \"virtual\"",
25074
25074
  "complexType": {
25075
25075
  "original": "TableDataMode",
25076
- "resolved": "\"infinite\" | \"pagination\"",
25076
+ "resolved": "\"infinite\" | \"pagination\" | \"virtual\"",
25077
25077
  "references": {
25078
25078
  "TableDataMode": {
25079
25079
  "location": "import",
@@ -25086,7 +25086,7 @@
25086
25086
  "mutable": false,
25087
25087
  "attr": "data-mode",
25088
25088
  "reflectToAttr": false,
25089
- "docs": "Top-level data-window strategy. Group member loading remains group-owned.",
25089
+ "docs": "Top-level data-window strategy. Virtual mode recycles row DOM only.",
25090
25090
  "docsTags": [
25091
25091
  {
25092
25092
  "name": "default",
@@ -25102,6 +25102,10 @@
25102
25102
  {
25103
25103
  "value": "pagination",
25104
25104
  "type": "string"
25105
+ },
25106
+ {
25107
+ "value": "virtual",
25108
+ "type": "string"
25105
25109
  }
25106
25110
  ],
25107
25111
  "optional": false,
@@ -25207,7 +25211,7 @@
25207
25211
  "mutable": false,
25208
25212
  "attr": "displayed-count",
25209
25213
  "reflectToAttr": false,
25210
- "docs": "Optional result summary footer. When both `displayedCount` and `totalCount`\nare finite numbers, the table shows “Displaying {displayed} of {total}”.",
25214
+ "docs": "Optional result summary footer. When both `displayedCount` and `totalCount`\nare finite numbers, infinite mode shows “Displaying {displayed} of {total}”.\nVirtual mode ignores `displayedCount` and shows a total-only summary.",
25211
25215
  "docsTags": [],
25212
25216
  "values": [
25213
25217
  {
@@ -26185,6 +26189,35 @@
26185
26189
  "getter": false,
26186
26190
  "setter": false
26187
26191
  },
26192
+ {
26193
+ "name": "resultTotalSummaryLabel",
26194
+ "type": "string",
26195
+ "complexType": {
26196
+ "original": "string",
26197
+ "resolved": "string",
26198
+ "references": {}
26199
+ },
26200
+ "mutable": false,
26201
+ "attr": "result-total-summary-label",
26202
+ "reflectToAttr": false,
26203
+ "docs": "Supports the {total} placeholder. Used when dataMode is virtual.",
26204
+ "docsTags": [
26205
+ {
26206
+ "name": "default",
26207
+ "text": "'{total} items'"
26208
+ }
26209
+ ],
26210
+ "default": "'{total} items'",
26211
+ "values": [
26212
+ {
26213
+ "type": "string"
26214
+ }
26215
+ ],
26216
+ "optional": false,
26217
+ "required": false,
26218
+ "getter": false,
26219
+ "setter": false
26220
+ },
26188
26221
  {
26189
26222
  "name": "retryLabel",
26190
26223
  "type": "string",
@@ -26558,6 +26591,35 @@
26558
26591
  "required": false,
26559
26592
  "getter": false,
26560
26593
  "setter": false
26594
+ },
26595
+ {
26596
+ "name": "virtualModeLabel",
26597
+ "type": "string",
26598
+ "complexType": {
26599
+ "original": "string",
26600
+ "resolved": "string",
26601
+ "references": {}
26602
+ },
26603
+ "mutable": false,
26604
+ "attr": "virtual-mode-label",
26605
+ "reflectToAttr": false,
26606
+ "docs": "",
26607
+ "docsTags": [
26608
+ {
26609
+ "name": "default",
26610
+ "text": "'Virtual scroll'"
26611
+ }
26612
+ ],
26613
+ "default": "'Virtual scroll'",
26614
+ "values": [
26615
+ {
26616
+ "type": "string"
26617
+ }
26618
+ ],
26619
+ "optional": false,
26620
+ "required": false,
26621
+ "getter": false,
26622
+ "setter": false
26561
26623
  }
26562
26624
  ],
26563
26625
  "methods": [],
@@ -30762,7 +30824,7 @@
30762
30824
  "path": "src/wc/components/Table/table-types.ts"
30763
30825
  },
30764
30826
  "src/wc/components/Table/table-types.ts::TableDataMode": {
30765
- "declaration": "export type TableDataMode = 'infinite' | 'pagination';",
30827
+ "declaration": "export type TableDataMode = 'infinite' | 'pagination' | 'virtual';",
30766
30828
  "docstring": "",
30767
30829
  "path": "src/wc/components/Table/table-types.ts"
30768
30830
  },
@@ -8834,7 +8834,7 @@
8834
8834
  {
8835
8835
  "name": "table",
8836
8836
  "title": "Table",
8837
- "description": "Semantic, controlled data table with durable visual primitives for cell geometry, grouping, sorting, multi-selection, sticky overflow, incremental loading, and top-level pagination.",
8837
+ "description": "Semantic, controlled data table with durable visual primitives for cell geometry, grouping, sorting, multi-selection, sticky overflow, incremental loading, top-level pagination, and optional row virtualization.",
8838
8838
  "type": "registry:ui",
8839
8839
  "meta": {
8840
8840
  "library": "@ds-mo/ui",
@@ -8845,16 +8845,16 @@
8845
8845
  "intent": {
8846
8846
  "audience": "general",
8847
8847
  "status": "stable",
8848
- "summary": "Semantic, controlled data table with durable visual primitives for cell geometry, grouping, sorting, multi-selection, sticky overflow, incremental loading, and top-level pagination.",
8848
+ "summary": "Semantic, controlled data table with durable visual primitives for cell geometry, grouping, sorting, multi-selection, sticky overflow, incremental loading, top-level pagination, and optional row virtualization.",
8849
8849
  "useWhen": [
8850
8850
  "A structured dataset needs native row and column relationships, optional one-level grouping, or comparable values across records.",
8851
- "An application needs controlled sorting, loaded-row selection, infinite loading, pagination, or opted-in table-owned data-mode and column controls while retaining ownership of the data query, catalog, and persistence.",
8851
+ "An application needs controlled sorting, loaded-row selection, infinite loading, pagination, virtual row recycling, or opted-in table-owned data-mode and column controls while retaining ownership of the data query, catalog, and persistence.",
8852
8852
  "A product table needs a token-backed recipe whose individual header, group, row, cell, selection, state, and load-more layers remain easy to restyle."
8853
8853
  ],
8854
8854
  "avoidWhen": [
8855
8855
  "Content is primarily editorial prose; use semantic product-owned markup with the prose recipe instead.",
8856
8856
  "A small label/value set reads more clearly as a list, description list, or card.",
8857
- "The interface requires tree-grid behavior, nested grouping, inline cell editing, row reordering, multiple pinned columns per edge, or virtualization; those remain outside the contract.",
8857
+ "The interface requires tree-grid behavior, nested grouping, inline cell editing, row reordering, multiple pinned columns per edge, or column virtualization; those remain outside the contract.",
8858
8858
  "The application expects the component to fetch, slice pages, sort, group, or mutate records internally."
8859
8859
  ],
8860
8860
  "commonlyComposedWith": [
@@ -8876,23 +8876,23 @@
8876
8876
  ],
8877
8877
  "accessibility": [
8878
8878
  "The rendered structure uses a native table, caption, column headers, row groups, and data cells; keep the caption non-empty. The native caption remains visually hidden as the table's accessible name. When caption visibility is enabled, a 48px header bar renders as component chrome outside the horizontal scrollport. It defaults to a presentational caption title that does not duplicate the accessible name. Application-owned labeled controls supplied through the single named header slot replace that fallback and occupy the leading content width inside the component-owned 8px inset. When columnCustomizer is enabled, the table adds a trailing Preferences control named Customize table; otherwise the header slot receives the complete content width.",
8879
- "The data-mode switcher is the shared Menu of the table's supported infinite and pagination modes. It is the final caption-bar action; when the column customizer is also present, a decorative vertical divider separates the two controls. dataMode remains controlled, and the application responds to change intent by supplying the matching records, pagination state, loading behavior, and query consequences. Escape, dismissal, and selection return focus to the trigger.",
8879
+ "The data-mode switcher is the shared Menu of the table's supported infinite, pagination, and virtual modes. The switcher is the final caption-bar action; when the column customizer is also present, a decorative vertical divider separates the two controls. dataMode remains controlled, and the application responds to change intent by supplying the matching records, pagination state, loading behavior, and query consequences. Escape, dismissal, and selection return focus to the trigger.",
8880
8880
  "The column customizer is the shared Menu of switch rows, not a table-owned dialog. Data columns can be shown, hidden, and reordered. Locked action columns stay visible, inactive, and last. The selection checkbox is not a column and never appears. The last remaining visible data column cannot be hidden, but it stays focusable so it can still be reordered. Escape and outside click restore focus to the trigger. Persistence stays in the application.",
8881
8881
  "Sorting controls remain buttons inside column headers and expose the table's one controlled member-row sort through aria-sort. Grouping never adds a second sort indicator or header control; the application supplies groups in its fixed product order. Optional column help underlines the header label with the shared dotted decoration and shows ds-tooltip from that label; it does not add a second header control or replace the column name.",
8882
- "Selection controls expose checkbox semantics and explicit row names; select-all affects selectable loaded rows only and preserves selected identities outside the loaded window. When grouping is active with multi-selection, each group section header also exposes a checkbox that selects or clears that group's selectable loaded rows.",
8882
+ "Selection controls expose checkbox semantics and explicit row names; select-all affects selectable loaded rows only and preserves selected identities outside the loaded window. In virtual mode the supplied in-memory rows are that loaded set, including rows whose DOM is recycled. When grouping is active with multi-selection, each group section header also exposes a checkbox that selects or clears that group's selectable loaded rows.",
8883
8883
  "Interactive rows are focusable as native rows, activate with Enter or Space, and do not steal activation from their nested selection, action, overflow-menu, or primary-text link controls.",
8884
8884
  "Scrollable table regions become keyboard focusable and named only when overflow exists.",
8885
8885
  "Incremental loading, newly appended row counts, failures, and end-of-results transitions are announced through a polite status region without replacing visible state. In grouped tables, announcements name the independently loading group.",
8886
- "Static and infinite tables may show an optional result summary footer when displayedCount and totalCount are finite. Pagination mode instead renders a named Pagination control with a compact selected-size total, vertical divider, and page position; range changes are announced independently with complete phrasing. While focus is anywhere inside a paginated table, unmodified Left and Right Arrow request the adjacent page; editable fields, choice controls, sliders, and modified key combinations retain their own keyboard behavior. The footer slot can replace summary copy, while footer-leading and footer-trailing remain available in the same compact-bar anatomy."
8886
+ "Static and infinite tables may show an optional result summary footer when displayedCount and totalCount are finite. Virtual mode shows a total-only summary and ignores displayedCount. Pagination mode instead renders a named Pagination control with a compact selected-size total, vertical divider, and page position; range changes are announced independently with complete phrasing. While focus is anywhere inside a paginated table, unmodified Left and Right Arrow request the adjacent page; editable fields, choice controls, sliders, and modified key combinations retain their own keyboard behavior. The footer slot can replace summary copy, while footer-leading and footer-trailing remain available in the same compact-bar anatomy."
8887
8887
  ],
8888
8888
  "states": [
8889
8889
  "Columns, rows, groups, grouping, sorting, selected row IDs, collapsed group IDs, hiddenColumnIds, columnOrder, dataMode, pagination, displayedCount, totalCount, and incremental-loading state are controlled inputs. Events communicate intent and never mutate those inputs. The optional header is one composable table-local surface: the component owns its 48px chrome, 8px inset on every side, and sticky placement while the application owns the leading slot's internal layout, controls, labels, filtering behavior, and action handling. Opting into dataModeSwitcher and columnCustomizer adds their trailing Menu triggers and requires caption visibility. When both are present, Customize table precedes a decorative divider and the data-mode trigger remains the final action. The table closes one trailing Menu before opening the other. The footer retains its compact-bar composition: application-owned leading status sits left while a controlled result summary or Pagination aligns right, before any trailing action. Content-sized tables remain natural for sparse or fixed-count results. height bounds the complete header, frame, and footer composition. fitViewport reserves the compact-state composition height in the nearest vertical scrollport while growing the visible table into that reservation as surrounding page chrome collapses.",
8890
- "Grouping supports one level. The application supplies groups in a fixed product-defined order and supplies ordered member rows independently. Group section headers show an emphasized text-body-medium label followed by a middle dot and plain secondary loaded progress, for example Critical · 50 of 166. The loaded value comes from the supplied member rows and the total comes from totalCount. A localized countLabel total phrase remains available for the complete assistive progress announcement. Groups may declare an optional intent (brand, neutral, negative, warning, caution, positive) that paints an LTR gradient from the faint intent surface at the label edge into faint neutral at the trailing edge, plus a bold intent title color. Neutral groups remain solid faint neutral. Section separators are painted inside that viewport-width surface so translucent border tokens composite with each intent background. Internal sections keep their separators; a collapsed or empty section header yields its separator only when it is the table's final rendered item. A trailing visually neutral icon-only ButtonUnfilled uses the 24px md double-inset action recipe and toggles controlled collapsedGroupIds, showing ChevronUp while expanded and ChevronDown while collapsed. While any group is expanded, a ChevronDownUp action uses the xs sort-control recipe widened to a table-owned 24px lane and collapses every group. It appears at the inline-end edge of the trailing column declared with kind action when one exists; otherwise a button-hugging 24px by 16px medium-elevation surface floats at the visible scrollport's header edge so the action remains reachable while member columns scroll beneath it. With stickyHeader enabled, each contained section uses its one real section row as a native sticky header inside its real row-group boundary. The browser therefore owns pinning, push-off, scrolling, and resize layout in one pass without a duplicated lane, active-section state, transforms, or scroll-time geometry. Shared grid tracks retain exact header and member-cell alignment. The section surface also stays pinned to the visible horizontal scrollport and spans the smaller of the visible viewport or table width.",
8890
+ "Grouping supports one level. The application supplies groups in a fixed product-defined order and supplies ordered member rows independently. Group section headers show an emphasized text-body-medium label followed by a middle dot and plain secondary loaded progress, for example Critical · 50 of 166. The loaded value comes from the supplied member rows and the total comes from totalCount. A localized countLabel total phrase remains available for the complete assistive progress announcement. Virtual mode shows totals only, for example Critical · 166, because there is no loaded window. Groups may declare an optional intent (brand, neutral, negative, warning, caution, positive) that paints an LTR gradient from the faint intent surface at the label edge into faint neutral at the trailing edge, plus a bold intent title color. Neutral groups remain solid faint neutral. Section separators are painted inside that viewport-width surface so translucent border tokens composite with each intent background. Internal sections keep their separators; a collapsed or empty section header yields its separator only when it is the table's final rendered item. A trailing visually neutral icon-only ButtonUnfilled uses the 24px md double-inset action recipe and toggles controlled collapsedGroupIds, showing ChevronUp while expanded and ChevronDown while collapsed. While any group is expanded, a ChevronDownUp action uses the xs sort-control recipe widened to a table-owned 24px lane and collapses every group. It appears at the inline-end edge of the trailing column declared with kind action when one exists; otherwise a button-hugging 24px by 16px medium-elevation surface floats at the visible scrollport's header edge so the action remains reachable while member columns scroll beneath it. With stickyHeader enabled, each contained section uses its one real section row as a native sticky header inside its real row-group boundary. The browser therefore owns pinning, push-off, scrolling, and resize layout in one pass without a duplicated lane, active-section state, transforms, or scroll-time geometry. Shared grid tracks retain exact header and member-cell alignment. The section surface also stays pinned to the visible horizontal scrollport and spans the smaller of the visible viewport or table width. Virtual grouped tables flatten headers and members into that same scrollport; expanding a section never introduces an inner scroller.",
8891
8891
  "When columnCustomizer is false, columns render in catalog order. When it is true, columns remains the catalog: hiddenColumnIds and columnOrder control visibility and data-column sequence, action columns stay last and cannot be hidden, and dsColumnsConfigChange reports the next hidden ids and data-column order without mutating those inputs. The customizer Menu live-applies show/hide and data-column reorder. The table does not persist preferences.",
8892
8892
  "An active member sort toggles only between ascending and descending; activating a different sortable label moves the one sorting state to that key. Applications may still clear the controlled sort state explicitly. Grouping does not introduce another interactive direction.",
8893
8893
  "Compound headers can expose multiple related labels with independent sort keys. Each label owns only its content-width interaction target while the active direction remains in the column's alignment-aware sort lane.",
8894
8894
  "Initial loading defaults to ten row-shaped skeletons and preserves row dividers, column dividers, selection lanes, and sticky boundaries. A selectable table renders a checkbox-sized control skeleton in its selection lane so loading geometry matches the real checkbox instead of a generic icon. Each column may declare representative text, multiline text, image, Tag, icon, icon-and-text, action, or intentionally blank loading geometry; the table applies the matching resolved-cell padding and track anatomy so the placeholder row has the same height and rhythm as its data row. Columns without a declaration use one text line, while action columns infer an icon action placeholder. Empty and initial error replace only the body with ds-empty-state, using Inbox or ErrorTriangle plus the table heading and body copy. In height-bounded and maxHeight tables that region fills the remaining viewport below the column header; content-sized tables keep a minimum empty-region height. Empty, initial error, load-more, retry, loading-more, and terminal bands remain fixed to the visible table width while data columns scroll horizontally beneath them. Incremental loading retains existing rows and supports automatic sentinel, manual load-more, retry, and terminal states. When grouping is active, each expanded group owns its load band at the end of its member rows; internal group load bands keep their bottom divider, while a terminal group load band yields it to the table edge or footer. The global bottom-of-table loader is not rendered.",
8895
- "dataMode selects the top-level window: infinite appends ungrouped rows through dsLoadMore when hasMore is true, and pagination renders the controlled page supplied by the application and emits dsPaginationChange. Infinite mode also covers fixed result sets by leaving hasMore false. In a grouped paginated table, pagination counts and windows only parent groups; each expanded parent can still append its own members through dsGroupLoadMore. The application owns requests, cancellation, cursors, deduplication, slicing, and query identity.",
8895
+ "dataMode selects the top-level window: infinite appends ungrouped rows through dsLoadMore when hasMore is true, pagination renders the controlled page supplied by the application and emits dsPaginationChange, and virtual recycles row DOM over the full in-memory rows or groups the application already supplied. Infinite mode also covers fixed result sets by leaving hasMore false. In a grouped paginated table, pagination counts and windows only parent groups; each expanded parent can still append its own members through dsGroupLoadMore. Virtual mode does not fetch, ignores hasMore and load bands, and requires a bounded viewport (height, maxHeight, or fitViewport with a definite block size). Without that height it fails visibly instead of mounting every row. The application owns requests, cancellation, cursors, deduplication, slicing, and query identity.",
8896
8896
  "When pagination enables Fit to page on a bounded table, the table proposes the number of complete top-level rows that fit below its column header. Grouped tables count group headers only; member rows never affect capacity. Selecting Fit captures that numeric snapshot. A changed fitIdentity requests one fresh snapshot for a new query shape, while viewport resizing alone does not change the active controlled page size.",
8897
8897
  "Rows opt into complete-row activation with interactive and emit dsRowActivate without owning navigation. Selection paints through the shared selected ::before layer; interactive hover and press paint through the shared ::after layer.",
8898
8898
  "Row selection owns the single sticky start lane. One explicitly sized application column can own the sticky end lane, or the start lane when selection is absent. Each sticky boundary owns one fixed divider and a row-clipped directional shadow that paints into the adjacent scrolling columns only while more inline content remains beyond that edge.",
@@ -8912,6 +8912,7 @@
8912
8912
  "frameworkCaveats": {
8913
8913
  "customElements": [
8914
8914
  "Assign columns, rows, groups, grouping, sort, selectedRowIds, collapsedGroupIds, hiddenColumnIds, columnOrder, pagination, displayedCount, and totalCount through JavaScript properties rather than HTML attribute strings.",
8915
+ "dataMode=virtual recycles row DOM over the supplied in-memory rows or groups and requires height, maxHeight, or fitViewport. It does not fetch or paginate.",
8915
8916
  "When an action cell supplies items, the table opens one shared ds-menu from the Ellipses trigger; dsCellAction fires for the selected command, not for opening or closing the menu.",
8916
8917
  "When columnCustomizer is enabled, the Preferences trigger opens the same shared ds-menu of reorderable switch rows; toggling a switch or reordering a row emits dsColumnsConfigChange and does not close the menu.",
8917
8918
  "Overflowing text tracks present one shared ds-tooltip with the omitted value. Unlimited wrapping tracks and disabled rows never show it. The tooltip is not linked with aria-describedby because the full string remains in the cell.",
@@ -9114,6 +9115,10 @@
9114
9115
  "type": "string",
9115
9116
  "required": false
9116
9117
  },
9118
+ "resultTotalSummaryLabel": {
9119
+ "type": "string",
9120
+ "required": false
9121
+ },
9117
9122
  "retryLabel": {
9118
9123
  "type": "string",
9119
9124
  "required": false
@@ -9161,6 +9166,10 @@
9161
9166
  "viewportInsetBlockStart": {
9162
9167
  "type": "string | number",
9163
9168
  "required": false
9169
+ },
9170
+ "virtualModeLabel": {
9171
+ "type": "string",
9172
+ "required": false
9164
9173
  }
9165
9174
  },
9166
9175
  "events": [