@ds-mo/ui 14.2.0 → 14.3.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.
- package/dist/.package-ready.json +1 -1
- package/dist/agent-patterns.json +1 -1
- package/dist/agent.json +144 -19
- package/dist/angular/ds-pagination.d.ts +19 -0
- package/dist/angular/ds-pagination.js +42 -0
- package/dist/angular/ds-table.d.ts +4 -1
- package/dist/angular/ds-table.js +7 -4
- package/dist/angular/index.d.ts +1 -1
- package/dist/angular/index.js +1 -0
- package/dist/angular/proxies.d.ts +1 -0
- package/dist/angular/proxies.js +1 -0
- package/dist/components/ds-agent-questionnaire.js +1 -1
- package/dist/components/ds-agent-response.js +1 -1
- package/dist/components/ds-banner.js +1 -1
- package/dist/components/ds-bar-nav.js +1 -1
- package/dist/components/ds-bar-title.js +1 -1
- package/dist/components/ds-bar-workflow.js +1 -1
- package/dist/components/ds-bar-workflow.js.map +1 -1
- package/dist/components/ds-card-overview.js +1 -1
- package/dist/components/ds-checkbox.js +1 -1
- package/dist/components/ds-code-block.js +1 -1
- package/dist/components/ds-filter-menu.js +1 -1
- package/dist/components/ds-input.js +1 -1
- package/dist/components/ds-markdown.js +1 -1
- package/dist/components/ds-menu.js +1 -1
- package/dist/components/ds-message-actions.js +1 -1
- package/dist/components/ds-message-composer.js +1 -1
- package/dist/components/ds-message-scroller.js +1 -1
- package/dist/components/ds-mobile-header.js +1 -1
- package/dist/components/ds-mobile-section-switcher.js +1 -1
- package/dist/components/ds-mobile-sheet-nav.js +1 -1
- package/dist/components/ds-modal.js +1 -1
- package/dist/components/ds-pagination.d.ts +11 -0
- package/dist/components/ds-pagination.js +2 -0
- package/dist/components/ds-pagination.js.map +1 -0
- package/dist/components/ds-panel-nav.js +1 -1
- package/dist/components/ds-panel-tool-header.js +1 -1
- package/dist/components/ds-panel-tool-search.js +1 -1
- package/dist/components/ds-panel-tools.js +1 -1
- package/dist/components/ds-radio.js +1 -1
- package/dist/components/ds-select.js +1 -1
- package/dist/components/ds-select.js.map +1 -1
- package/dist/components/ds-shell-app.js +1 -1
- package/dist/components/ds-shell-page.js +1 -1
- package/dist/components/ds-shell-tools.js +1 -1
- package/dist/components/ds-slider.js +1 -1
- package/dist/components/ds-swatch-picker.js +1 -1
- package/dist/components/ds-switch.js +1 -1
- package/dist/components/ds-table.js +1 -1
- package/dist/components/ds-table.js.map +1 -1
- package/dist/components/ds-toast.js +1 -1
- package/dist/components/ds-tooltip.js +1 -1
- package/dist/components/ds-typing-indicator.js +1 -1
- package/dist/components/index.d.ts +7 -0
- package/dist/components/{p-D2xWcVv6.js → p-B8q-6a03.js} +2 -2
- package/dist/components/{p-DYzjeIAT.js → p-BHjw0x3L.js} +2 -2
- package/dist/components/{p-CTVMXN9s.js → p-BSBQ5kGe.js} +2 -2
- package/dist/components/{p-DmZupC1-.js → p-BiBXCjjo.js} +2 -2
- package/dist/components/{p-BOCrvs-v.js → p-Btxwp4lJ.js} +2 -2
- package/dist/components/{p-DmwMiaWL.js → p-Bxe6532y.js} +2 -2
- package/dist/components/{p-DD5OCVXx.js → p-C5TrNd31.js} +2 -2
- package/dist/components/{p-ChlRsQYY.js → p-C68-8tlp.js} +2 -2
- package/dist/components/{p-BnPcWBA8.js → p-CW3sRYuf.js} +2 -2
- package/dist/components/{p-DJ_FsLCc.js → p-CWsziQQY.js} +2 -2
- package/dist/components/{p-CRjpqqAI.js → p-Cjf54_Cq.js} +2 -2
- package/dist/components/{p-NTU5jrG_.js → p-CkWVI16a.js} +2 -2
- package/dist/components/{p-BDCrM8-1.js → p-Cpqd69kg.js} +2 -2
- package/dist/components/p-CtOK5oZ1.js +2 -0
- package/dist/components/p-CtOK5oZ1.js.map +1 -0
- package/dist/components/p-D1ZI_10t.js +2 -0
- package/dist/components/p-D1ZI_10t.js.map +1 -0
- package/dist/components/{p-C-GNvCk0.js → p-Dh_TVLnz.js} +2 -2
- package/dist/components/{p-BiOfbCke.js → p-DkPNCBA8.js} +2 -2
- package/dist/components/{p-DT4WdAup.js → p-Dkkid-rh.js} +2 -2
- package/dist/components/p-DwqUW4Rg.js +2 -0
- package/dist/components/p-DwqUW4Rg.js.map +1 -0
- package/dist/components/{p-eKARJmWs.js → p-nImbYpwo.js} +2 -2
- package/dist/components/{p-BMJcBo8B.js → p-ohWEVGHg.js} +2 -2
- package/dist/components/{p-c9QiNOc7.js → p-qA4eKZkW.js} +2 -2
- package/dist/docs/components.json +470 -34
- package/dist/mcp-data/registry/pagination.json +295 -0
- package/dist/mcp-data/registry/registry.json +146 -18
- package/dist/mcp-data/registry/table.json +69 -37
- package/dist/mcp-data/registry/tooltip.json +2 -1
- package/dist/react/components.d.ts +1 -0
- package/dist/react/components.js +1 -0
- package/dist/react/ds-pagination.d.ts +12 -0
- package/dist/react/ds-pagination.js +12 -0
- package/dist/react/ds-table.d.ts +2 -1
- package/dist/react/ds-table.js +1 -0
- package/dist/styles/table.css +9 -3
- package/dist/types/components/Pagination/Pagination.d.ts +28 -0
- package/dist/types/components/Pagination/index.d.ts +3 -0
- package/dist/types/components/Pagination/pagination-model.d.ts +13 -0
- package/dist/types/components/Pagination/pagination-types.d.ts +25 -0
- package/dist/types/components/Table/Table.d.ts +10 -3
- package/dist/types/components/Table/index.d.ts +1 -1
- package/dist/types/components/Table/table-render-model.d.ts +1 -1
- package/dist/types/components/Table/table-types.d.ts +5 -1
- package/dist/types/components/Tooltip/Tooltip.d.ts +3 -0
- package/dist/types/components.d.ts +148 -13
- package/package.json +1 -1
- package/dist/components/p-CtSxm6PI.js +0 -2
- package/dist/components/p-CtSxm6PI.js.map +0 -1
- /package/dist/components/{p-D2xWcVv6.js.map → p-B8q-6a03.js.map} +0 -0
- /package/dist/components/{p-DYzjeIAT.js.map → p-BHjw0x3L.js.map} +0 -0
- /package/dist/components/{p-CTVMXN9s.js.map → p-BSBQ5kGe.js.map} +0 -0
- /package/dist/components/{p-DmZupC1-.js.map → p-BiBXCjjo.js.map} +0 -0
- /package/dist/components/{p-BOCrvs-v.js.map → p-Btxwp4lJ.js.map} +0 -0
- /package/dist/components/{p-DmwMiaWL.js.map → p-Bxe6532y.js.map} +0 -0
- /package/dist/components/{p-DD5OCVXx.js.map → p-C5TrNd31.js.map} +0 -0
- /package/dist/components/{p-ChlRsQYY.js.map → p-C68-8tlp.js.map} +0 -0
- /package/dist/components/{p-BnPcWBA8.js.map → p-CW3sRYuf.js.map} +0 -0
- /package/dist/components/{p-DJ_FsLCc.js.map → p-CWsziQQY.js.map} +0 -0
- /package/dist/components/{p-CRjpqqAI.js.map → p-Cjf54_Cq.js.map} +0 -0
- /package/dist/components/{p-NTU5jrG_.js.map → p-CkWVI16a.js.map} +0 -0
- /package/dist/components/{p-BDCrM8-1.js.map → p-Cpqd69kg.js.map} +0 -0
- /package/dist/components/{p-C-GNvCk0.js.map → p-Dh_TVLnz.js.map} +0 -0
- /package/dist/components/{p-BiOfbCke.js.map → p-DkPNCBA8.js.map} +0 -0
- /package/dist/components/{p-DT4WdAup.js.map → p-Dkkid-rh.js.map} +0 -0
- /package/dist/components/{p-eKARJmWs.js.map → p-nImbYpwo.js.map} +0 -0
- /package/dist/components/{p-BMJcBo8B.js.map → p-ohWEVGHg.js.map} +0 -0
- /package/dist/components/{p-c9QiNOc7.js.map → p-qA4eKZkW.js.map} +0 -0
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://ui.shadcn.com/schema/registry-item.json",
|
|
3
|
+
"name": "pagination",
|
|
4
|
+
"title": "Pagination",
|
|
5
|
+
"description": "Controlled page-size, range, and first/previous/next/last navigation for application-owned data windows.",
|
|
6
|
+
"type": "registry:ui",
|
|
7
|
+
"meta": {
|
|
8
|
+
"library": "@ds-mo/ui",
|
|
9
|
+
"distribution": "npm",
|
|
10
|
+
"storybook": "https://zainadeel.github.io/compomo/?path=/story/pagination",
|
|
11
|
+
"source": "src/wc/components/Pagination/Pagination.tsx",
|
|
12
|
+
"intentStatus": "complete",
|
|
13
|
+
"intent": {
|
|
14
|
+
"audience": "general",
|
|
15
|
+
"status": "stable",
|
|
16
|
+
"summary": "Controlled page-size, range, and first/previous/next/last navigation for application-owned data windows.",
|
|
17
|
+
"useWhen": [
|
|
18
|
+
"A result set is divided into discrete pages and the application owns fetching or slicing each page.",
|
|
19
|
+
"A table or list needs a compact page-size selector, result range, and boundary-aware navigation."
|
|
20
|
+
],
|
|
21
|
+
"avoidWhen": [
|
|
22
|
+
"More results append to one continuous list; use the owning component's incremental-loading behavior instead.",
|
|
23
|
+
"Only previous and next navigation is meaningful and the total result count is unknown."
|
|
24
|
+
],
|
|
25
|
+
"commonlyComposedWith": [
|
|
26
|
+
"component:ds-table",
|
|
27
|
+
"component:ds-select",
|
|
28
|
+
"component:ds-button-unfilled"
|
|
29
|
+
],
|
|
30
|
+
"accessibility": [
|
|
31
|
+
"The component renders a named navigation region, labels its page-size combobox, and gives every icon-only boundary control an explicit page action name.",
|
|
32
|
+
"The visible range and page position use tabular numerals and are repeated in a polite atomic status update with the localized item noun.",
|
|
33
|
+
"Inactive boundary controls and every control during loading remain non-interactive while retaining their accessible names."
|
|
34
|
+
],
|
|
35
|
+
"states": [
|
|
36
|
+
"pageIndex, pageSize, totalItems, and pageSizeOptions are controlled inputs. dsChange reports the complete next pagination state, previous index and size, and whether the request changed the page or page size; it never mutates controlled inputs.",
|
|
37
|
+
"Page-size changes request the first page. Out-of-range page indexes and invalid numeric inputs normalize only for presentation; the owner remains authoritative.",
|
|
38
|
+
"Zero results display 0–0 of 0 and Page 1 of 1. A partial final page caps the visible range at totalItems.",
|
|
39
|
+
"loading preserves the full pagination surface, applies aria-busy to the navigation region, and prevents page or page-size requests."
|
|
40
|
+
],
|
|
41
|
+
"responsiveBehavior": [
|
|
42
|
+
"The compact controls remain on one line. When inline space is insufficient, the pagination surface scrolls horizontally rather than wrapping labels away from their controls."
|
|
43
|
+
],
|
|
44
|
+
"frameworkCaveats": {
|
|
45
|
+
"customElements": [
|
|
46
|
+
"Assign pageSizeOptions through the JavaScript property and replace controlled values in response to dsChange."
|
|
47
|
+
],
|
|
48
|
+
"react": [
|
|
49
|
+
"Replace pageIndex and pageSize from the emitted detail before supplying the requested data window."
|
|
50
|
+
],
|
|
51
|
+
"angular": [
|
|
52
|
+
"Bind numeric inputs as properties and update the owning signals from the dsChange output."
|
|
53
|
+
]
|
|
54
|
+
},
|
|
55
|
+
"references": [
|
|
56
|
+
{
|
|
57
|
+
"label": "Storybook review states",
|
|
58
|
+
"path": "src/wc/components/Pagination/Pagination.stories.ts"
|
|
59
|
+
}
|
|
60
|
+
]
|
|
61
|
+
},
|
|
62
|
+
"api": {
|
|
63
|
+
"props": {
|
|
64
|
+
"itemLabel": {
|
|
65
|
+
"type": "string",
|
|
66
|
+
"resolvedType": "string",
|
|
67
|
+
"attribute": "item-label",
|
|
68
|
+
"default": "'items'",
|
|
69
|
+
"required": false,
|
|
70
|
+
"mutable": false,
|
|
71
|
+
"description": "Localized plural noun used by assistive range announcements."
|
|
72
|
+
},
|
|
73
|
+
"label": {
|
|
74
|
+
"type": "string",
|
|
75
|
+
"resolvedType": "string",
|
|
76
|
+
"attribute": "label",
|
|
77
|
+
"default": "'Pagination'",
|
|
78
|
+
"required": false,
|
|
79
|
+
"mutable": false,
|
|
80
|
+
"description": "Accessible name for the pagination navigation region."
|
|
81
|
+
},
|
|
82
|
+
"loading": {
|
|
83
|
+
"type": "boolean",
|
|
84
|
+
"resolvedType": "boolean",
|
|
85
|
+
"attribute": "loading",
|
|
86
|
+
"default": "false",
|
|
87
|
+
"required": false,
|
|
88
|
+
"mutable": false,
|
|
89
|
+
"description": "Prevent interaction while the owner replaces the current data page."
|
|
90
|
+
},
|
|
91
|
+
"pageIndex": {
|
|
92
|
+
"type": "number",
|
|
93
|
+
"resolvedType": "number",
|
|
94
|
+
"attribute": "page-index",
|
|
95
|
+
"default": "0",
|
|
96
|
+
"required": false,
|
|
97
|
+
"mutable": false,
|
|
98
|
+
"description": "Controlled zero-based page index."
|
|
99
|
+
},
|
|
100
|
+
"pageSize": {
|
|
101
|
+
"type": "number",
|
|
102
|
+
"resolvedType": "number",
|
|
103
|
+
"attribute": "page-size",
|
|
104
|
+
"default": "25",
|
|
105
|
+
"required": false,
|
|
106
|
+
"mutable": false,
|
|
107
|
+
"description": "Controlled number of top-level items on a full page."
|
|
108
|
+
},
|
|
109
|
+
"pageSizeLabel": {
|
|
110
|
+
"type": "string",
|
|
111
|
+
"resolvedType": "string",
|
|
112
|
+
"attribute": "page-size-label",
|
|
113
|
+
"default": "'Items per page'",
|
|
114
|
+
"required": false,
|
|
115
|
+
"mutable": false,
|
|
116
|
+
"description": "Visible page-size control label."
|
|
117
|
+
},
|
|
118
|
+
"pageSizeOptions": {
|
|
119
|
+
"type": "number[]",
|
|
120
|
+
"resolvedType": "number[]",
|
|
121
|
+
"default": "[25, 50, 100, 200]",
|
|
122
|
+
"required": false,
|
|
123
|
+
"mutable": false,
|
|
124
|
+
"description": "Available page sizes. Assign arrays through JavaScript."
|
|
125
|
+
},
|
|
126
|
+
"totalItems": {
|
|
127
|
+
"type": "number",
|
|
128
|
+
"resolvedType": "number",
|
|
129
|
+
"attribute": "total-items",
|
|
130
|
+
"default": "0",
|
|
131
|
+
"required": false,
|
|
132
|
+
"mutable": false,
|
|
133
|
+
"description": "Controlled total number of top-level items across every page."
|
|
134
|
+
}
|
|
135
|
+
},
|
|
136
|
+
"events": [
|
|
137
|
+
{
|
|
138
|
+
"name": "dsChange",
|
|
139
|
+
"detail": "PaginationChangeDetail",
|
|
140
|
+
"bubbles": true,
|
|
141
|
+
"cancelable": true,
|
|
142
|
+
"composed": true,
|
|
143
|
+
"description": "Emits the complete next controlled state after a page or page-size request."
|
|
144
|
+
}
|
|
145
|
+
],
|
|
146
|
+
"methods": [],
|
|
147
|
+
"slots": []
|
|
148
|
+
},
|
|
149
|
+
"props": {
|
|
150
|
+
"itemLabel": {
|
|
151
|
+
"type": "string",
|
|
152
|
+
"resolvedType": "string",
|
|
153
|
+
"attribute": "item-label",
|
|
154
|
+
"default": "'items'",
|
|
155
|
+
"required": false,
|
|
156
|
+
"mutable": false,
|
|
157
|
+
"description": "Localized plural noun used by assistive range announcements."
|
|
158
|
+
},
|
|
159
|
+
"label": {
|
|
160
|
+
"type": "string",
|
|
161
|
+
"resolvedType": "string",
|
|
162
|
+
"attribute": "label",
|
|
163
|
+
"default": "'Pagination'",
|
|
164
|
+
"required": false,
|
|
165
|
+
"mutable": false,
|
|
166
|
+
"description": "Accessible name for the pagination navigation region."
|
|
167
|
+
},
|
|
168
|
+
"loading": {
|
|
169
|
+
"type": "boolean",
|
|
170
|
+
"resolvedType": "boolean",
|
|
171
|
+
"attribute": "loading",
|
|
172
|
+
"default": "false",
|
|
173
|
+
"required": false,
|
|
174
|
+
"mutable": false,
|
|
175
|
+
"description": "Prevent interaction while the owner replaces the current data page."
|
|
176
|
+
},
|
|
177
|
+
"pageIndex": {
|
|
178
|
+
"type": "number",
|
|
179
|
+
"resolvedType": "number",
|
|
180
|
+
"attribute": "page-index",
|
|
181
|
+
"default": "0",
|
|
182
|
+
"required": false,
|
|
183
|
+
"mutable": false,
|
|
184
|
+
"description": "Controlled zero-based page index."
|
|
185
|
+
},
|
|
186
|
+
"pageSize": {
|
|
187
|
+
"type": "number",
|
|
188
|
+
"resolvedType": "number",
|
|
189
|
+
"attribute": "page-size",
|
|
190
|
+
"default": "25",
|
|
191
|
+
"required": false,
|
|
192
|
+
"mutable": false,
|
|
193
|
+
"description": "Controlled number of top-level items on a full page."
|
|
194
|
+
},
|
|
195
|
+
"pageSizeLabel": {
|
|
196
|
+
"type": "string",
|
|
197
|
+
"resolvedType": "string",
|
|
198
|
+
"attribute": "page-size-label",
|
|
199
|
+
"default": "'Items per page'",
|
|
200
|
+
"required": false,
|
|
201
|
+
"mutable": false,
|
|
202
|
+
"description": "Visible page-size control label."
|
|
203
|
+
},
|
|
204
|
+
"pageSizeOptions": {
|
|
205
|
+
"type": "number[]",
|
|
206
|
+
"resolvedType": "number[]",
|
|
207
|
+
"default": "[25, 50, 100, 200]",
|
|
208
|
+
"required": false,
|
|
209
|
+
"mutable": false,
|
|
210
|
+
"description": "Available page sizes. Assign arrays through JavaScript."
|
|
211
|
+
},
|
|
212
|
+
"totalItems": {
|
|
213
|
+
"type": "number",
|
|
214
|
+
"resolvedType": "number",
|
|
215
|
+
"attribute": "total-items",
|
|
216
|
+
"default": "0",
|
|
217
|
+
"required": false,
|
|
218
|
+
"mutable": false,
|
|
219
|
+
"description": "Controlled total number of top-level items across every page."
|
|
220
|
+
}
|
|
221
|
+
},
|
|
222
|
+
"events": [
|
|
223
|
+
{
|
|
224
|
+
"name": "dsChange",
|
|
225
|
+
"detail": "PaginationChangeDetail",
|
|
226
|
+
"bubbles": true,
|
|
227
|
+
"cancelable": true,
|
|
228
|
+
"composed": true,
|
|
229
|
+
"description": "Emits the complete next controlled state after a page or page-size request."
|
|
230
|
+
}
|
|
231
|
+
],
|
|
232
|
+
"methods": [],
|
|
233
|
+
"slots": [],
|
|
234
|
+
"exports": {
|
|
235
|
+
"customElement": "ds-pagination",
|
|
236
|
+
"react": "DsPagination",
|
|
237
|
+
"angular": "DsPagination"
|
|
238
|
+
},
|
|
239
|
+
"consumption": {
|
|
240
|
+
"install": "npm install @ds-mo/ui @ds-mo/tokens @ds-mo/icons",
|
|
241
|
+
"cssSetup": "import '@ds-mo/tokens';\nimport '@ds-mo/tokens/reset';\nimport '@ds-mo/tokens/globals';",
|
|
242
|
+
"customElements": {
|
|
243
|
+
"import": "import '@ds-mo/ui/dist/components/ds-pagination.js';",
|
|
244
|
+
"example": "<ds-pagination></ds-pagination>"
|
|
245
|
+
},
|
|
246
|
+
"react": {
|
|
247
|
+
"import": "import { DsPagination } from '@ds-mo/ui/react';",
|
|
248
|
+
"example": "<DsPagination />"
|
|
249
|
+
},
|
|
250
|
+
"angular": {
|
|
251
|
+
"import": "import { DsPagination } from '@ds-mo/ui/angular/ds-pagination';",
|
|
252
|
+
"example": "<ds-pagination></ds-pagination>"
|
|
253
|
+
},
|
|
254
|
+
"complexPropertyNote": "Assign these non-primitive values as JavaScript properties: pageSizeOptions.",
|
|
255
|
+
"peerDependencies": {
|
|
256
|
+
"required": [
|
|
257
|
+
"@ds-mo/tokens ^6.2.2",
|
|
258
|
+
"@ds-mo/icons ^7.0.0"
|
|
259
|
+
],
|
|
260
|
+
"frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
},
|
|
264
|
+
"dependencies": [
|
|
265
|
+
"@ds-mo/ui",
|
|
266
|
+
"@ds-mo/tokens"
|
|
267
|
+
],
|
|
268
|
+
"registryDependencies": [
|
|
269
|
+
"button-unfilled",
|
|
270
|
+
"select",
|
|
271
|
+
"text"
|
|
272
|
+
],
|
|
273
|
+
"files": [
|
|
274
|
+
{
|
|
275
|
+
"path": "src/wc/components/Pagination/Pagination.css",
|
|
276
|
+
"content": "@import '../../utils/visually-hidden.css';\n\n:host {\n display: block;\n box-sizing: border-box;\n min-width: 0;\n max-width: 100%;\n overflow-x: auto;\n scrollbar-width: none;\n}\n\n:host::-webkit-scrollbar {\n display: none;\n}\n\n.pagination,\n.pagination__page-size,\n.pagination__navigation {\n display: flex;\n align-items: center;\n box-sizing: border-box;\n}\n\n.pagination {\n width: max-content;\n min-width: 100%;\n gap: var(--dimension-space-200);\n}\n\n.pagination__page-size,\n.pagination__navigation {\n flex: 0 0 auto;\n gap: var(--dimension-space-050);\n}\n\n.pagination__range,\n.pagination__page,\n.pagination__label {\n display: inline-flex;\n align-items: center;\n flex: 0 0 auto;\n white-space: nowrap;\n}\n\n.pagination__page {\n justify-content: center;\n min-inline-size: calc(var(--dimension-size-800) + var(--dimension-space-200));\n padding-inline: var(--dimension-space-050);\n}\n",
|
|
277
|
+
"type": "registry:ui"
|
|
278
|
+
},
|
|
279
|
+
{
|
|
280
|
+
"path": "src/wc/components/Pagination/Pagination.tsx",
|
|
281
|
+
"content": "import { Component, Event, EventEmitter, h, Host, Prop } from '@stencil/core';\nimport { resolvePaginationState } from './pagination-model';\nimport type { PaginationChangeDetail } from './pagination-types';\n\nlet paginationId = 0;\n\n@Component({\n tag: 'ds-pagination',\n styleUrl: 'Pagination.css',\n scoped: true,\n})\nexport class Pagination {\n /** Controlled zero-based page index. */\n @Prop() pageIndex: number = 0;\n /** Controlled number of top-level items on a full page. */\n @Prop() pageSize: number = 25;\n /** Controlled total number of top-level items across every page. */\n @Prop() totalItems: number = 0;\n /** Available page sizes. Assign arrays through JavaScript. */\n @Prop() pageSizeOptions: number[] = [25, 50, 100, 200];\n /** Localized plural noun used by assistive range announcements. */\n @Prop() itemLabel: string = 'items';\n /** Visible page-size control label. */\n @Prop() pageSizeLabel: string = 'Items per page';\n /** Accessible name for the pagination navigation region. */\n @Prop() label: string = 'Pagination';\n /** Prevent interaction while the owner replaces the current data page. */\n @Prop() loading: boolean = false;\n\n /** Emits the complete next controlled state after a page or page-size request. */\n @Event() dsChange!: EventEmitter<PaginationChangeDetail>;\n\n private readonly pageSizeControlId = `ds-pagination-${++paginationId}-page-size`;\n\n private requestPage(pageIndex: number): void {\n const state = this.resolvedState;\n if (this.loading || pageIndex === state.pageIndex || pageIndex < 0 || pageIndex >= state.totalPages) {\n return;\n }\n this.dsChange.emit({\n pageIndex,\n pageSize: state.pageSize,\n totalItems: state.totalItems,\n pageSizeOptions: state.pageSizeOptions,\n itemLabel: this.itemLabel,\n pageSizeLabel: this.pageSizeLabel,\n ariaLabel: this.label,\n previousPageIndex: state.pageIndex,\n previousPageSize: state.pageSize,\n reason: 'page',\n });\n }\n\n private requestPageSize(value: string | string[]): void {\n if (this.loading || typeof value !== 'string') return;\n const pageSize = Number(value);\n const state = this.resolvedState;\n if (!Number.isFinite(pageSize) || pageSize <= 0 || pageSize === state.pageSize) return;\n this.dsChange.emit({\n pageIndex: 0,\n pageSize: Math.trunc(pageSize),\n totalItems: state.totalItems,\n pageSizeOptions: state.pageSizeOptions,\n itemLabel: this.itemLabel,\n pageSizeLabel: this.pageSizeLabel,\n ariaLabel: this.label,\n previousPageIndex: state.pageIndex,\n previousPageSize: state.pageSize,\n reason: 'page-size',\n });\n }\n\n private get resolvedState() {\n return resolvePaginationState({\n pageIndex: this.pageIndex,\n pageSize: this.pageSize,\n totalItems: this.totalItems,\n pageSizeOptions: this.pageSizeOptions,\n });\n }\n\n render() {\n const state = this.resolvedState;\n const atStart = state.pageIndex === 0;\n const atEnd = state.pageIndex === state.totalPages - 1;\n const range = `${state.firstItem}–${state.lastItem} of ${state.totalItems}`;\n const page = `Page ${state.pageIndex + 1} of ${state.totalPages}`;\n\n return (\n <Host>\n <nav class=\"pagination\" aria-label={this.label} aria-busy={this.loading ? 'true' : undefined}>\n <div class=\"pagination__page-size\">\n <ds-text\n id={`${this.pageSizeControlId}-label`}\n class=\"pagination__label\"\n as=\"span\"\n variant=\"text-body-medium\"\n color=\"secondary\"\n >\n {this.pageSizeLabel}\n </ds-text>\n <ds-select\n size=\"md\"\n inputId={this.pageSizeControlId}\n ariaLabelledby={`${this.pageSizeControlId}-label`}\n options={state.pageSizeOptions.map(value => ({ label: String(value), value: String(value) }))}\n value={String(state.pageSize)}\n allowClear={false}\n activeFill={false}\n isInactive={this.loading}\n onDsChange={event => {\n event.stopPropagation();\n this.requestPageSize(event.detail);\n }}\n />\n </div>\n <ds-text\n class=\"pagination__range\"\n as=\"span\"\n variant=\"text-body-medium\"\n color=\"secondary\"\n fontFeature=\"tabular-nums\"\n >\n {range}\n </ds-text>\n <div class=\"pagination__navigation\">\n <ds-button-unfilled\n variant=\"icon\"\n size=\"md\"\n icon=\"ChevronLeftDouble\"\n ariaLabel=\"First page\"\n hasBorder={false}\n isInactive={this.loading || atStart}\n onDsClick={() => this.requestPage(0)}\n />\n <ds-button-unfilled\n variant=\"icon\"\n size=\"md\"\n icon=\"ChevronLeft\"\n ariaLabel=\"Previous page\"\n hasBorder={false}\n isInactive={this.loading || atStart}\n onDsClick={() => this.requestPage(state.pageIndex - 1)}\n />\n <ds-text\n class=\"pagination__page\"\n as=\"span\"\n variant=\"text-body-medium\"\n color=\"secondary\"\n fontFeature=\"tabular-nums\"\n >\n {page}\n </ds-text>\n <ds-button-unfilled\n variant=\"icon\"\n size=\"md\"\n icon=\"ChevronRight\"\n ariaLabel=\"Next page\"\n hasBorder={false}\n isInactive={this.loading || atEnd}\n onDsClick={() => this.requestPage(state.pageIndex + 1)}\n />\n <ds-button-unfilled\n variant=\"icon\"\n size=\"md\"\n icon=\"ChevronRightDouble\"\n ariaLabel=\"Last page\"\n hasBorder={false}\n isInactive={this.loading || atEnd}\n onDsClick={() => this.requestPage(state.totalPages - 1)}\n />\n </div>\n <span class=\"ds-visually-hidden\" role=\"status\" aria-live=\"polite\" aria-atomic=\"true\">\n {range} {this.itemLabel}. {page}.\n </span>\n </nav>\n </Host>\n );\n }\n}\n",
|
|
282
|
+
"type": "registry:ui"
|
|
283
|
+
},
|
|
284
|
+
{
|
|
285
|
+
"path": "src/wc/components/Pagination/pagination-model.ts",
|
|
286
|
+
"content": "import type { PaginationState } from './pagination-types';\n\nexport const DEFAULT_PAGE_SIZE_OPTIONS = [25, 50, 100, 200] as const;\n\nexport interface ResolvedPaginationState {\n pageIndex: number;\n pageSize: number;\n totalItems: number;\n totalPages: number;\n firstItem: number;\n lastItem: number;\n pageSizeOptions: number[];\n}\n\nfunction nonNegativeInteger(value: number): number {\n return Number.isFinite(value) ? Math.max(0, Math.trunc(value)) : 0;\n}\n\nfunction positiveInteger(value: number, fallback: number): number {\n return Number.isFinite(value) && value > 0 ? Math.trunc(value) : fallback;\n}\n\nexport function resolvePaginationState(\n state: Pick<PaginationState, 'pageIndex' | 'pageSize' | 'totalItems' | 'pageSizeOptions'>,\n): ResolvedPaginationState {\n const pageSize = positiveInteger(state.pageSize, DEFAULT_PAGE_SIZE_OPTIONS[0]);\n const totalItems = nonNegativeInteger(state.totalItems);\n const totalPages = Math.max(1, Math.ceil(totalItems / pageSize));\n const pageIndex = Math.min(nonNegativeInteger(state.pageIndex), totalPages - 1);\n const options = (state.pageSizeOptions?.length\n ? state.pageSizeOptions\n : DEFAULT_PAGE_SIZE_OPTIONS\n )\n .map(value => positiveInteger(value, 0))\n .filter(value => value > 0);\n const pageSizeOptions = [...new Set([...options, pageSize])].sort((left, right) => left - right);\n const firstItem = totalItems === 0 ? 0 : pageIndex * pageSize + 1;\n const lastItem = totalItems === 0 ? 0 : Math.min(totalItems, firstItem + pageSize - 1);\n\n return {\n pageIndex,\n pageSize,\n totalItems,\n totalPages,\n firstItem,\n lastItem,\n pageSizeOptions,\n };\n}\n",
|
|
287
|
+
"type": "registry:ui"
|
|
288
|
+
},
|
|
289
|
+
{
|
|
290
|
+
"path": "src/wc/components/Pagination/pagination-types.ts",
|
|
291
|
+
"content": "export type PaginationChangeReason = 'page' | 'page-size';\n\n/** Controlled pagination state shared by Pagination and pagination-aware consumers. */\nexport interface PaginationState {\n /** Zero-based page index. */\n pageIndex: number;\n /** Number of top-level items on a full page. */\n pageSize: number;\n /** Total number of top-level items across every page. */\n totalItems: number;\n /** Available page sizes. Defaults to 25, 50, 100, and 200. */\n pageSizeOptions?: number[];\n /** Localized plural noun used by assistive range announcements. */\n itemLabel?: string;\n /** Visible label for the page-size selector. */\n pageSizeLabel?: string;\n /** Accessible name for the pagination navigation region. */\n ariaLabel?: string;\n}\n\n/** Complete next controlled state emitted for a page or page-size request. */\nexport interface PaginationChangeDetail extends PaginationState {\n previousPageIndex: number;\n previousPageSize: number;\n reason: PaginationChangeReason;\n}\n",
|
|
292
|
+
"type": "registry:ui"
|
|
293
|
+
}
|
|
294
|
+
]
|
|
295
|
+
}
|
|
@@ -5931,6 +5931,123 @@
|
|
|
5931
5931
|
"tooltip"
|
|
5932
5932
|
]
|
|
5933
5933
|
},
|
|
5934
|
+
{
|
|
5935
|
+
"name": "pagination",
|
|
5936
|
+
"title": "Pagination",
|
|
5937
|
+
"description": "Controlled page-size, range, and first/previous/next/last navigation for application-owned data windows.",
|
|
5938
|
+
"type": "registry:ui",
|
|
5939
|
+
"meta": {
|
|
5940
|
+
"library": "@ds-mo/ui",
|
|
5941
|
+
"distribution": "npm",
|
|
5942
|
+
"storybook": "https://zainadeel.github.io/compomo/?path=/story/pagination",
|
|
5943
|
+
"source": "src/wc/components/Pagination/Pagination.tsx",
|
|
5944
|
+
"intentStatus": "complete",
|
|
5945
|
+
"intent": {
|
|
5946
|
+
"audience": "general",
|
|
5947
|
+
"status": "stable",
|
|
5948
|
+
"summary": "Controlled page-size, range, and first/previous/next/last navigation for application-owned data windows.",
|
|
5949
|
+
"useWhen": [
|
|
5950
|
+
"A result set is divided into discrete pages and the application owns fetching or slicing each page.",
|
|
5951
|
+
"A table or list needs a compact page-size selector, result range, and boundary-aware navigation."
|
|
5952
|
+
],
|
|
5953
|
+
"avoidWhen": [
|
|
5954
|
+
"More results append to one continuous list; use the owning component's incremental-loading behavior instead.",
|
|
5955
|
+
"Only previous and next navigation is meaningful and the total result count is unknown."
|
|
5956
|
+
],
|
|
5957
|
+
"commonlyComposedWith": [
|
|
5958
|
+
"component:ds-table",
|
|
5959
|
+
"component:ds-select",
|
|
5960
|
+
"component:ds-button-unfilled"
|
|
5961
|
+
],
|
|
5962
|
+
"accessibility": [
|
|
5963
|
+
"The component renders a named navigation region, labels its page-size combobox, and gives every icon-only boundary control an explicit page action name.",
|
|
5964
|
+
"The visible range and page position use tabular numerals and are repeated in a polite atomic status update with the localized item noun.",
|
|
5965
|
+
"Inactive boundary controls and every control during loading remain non-interactive while retaining their accessible names."
|
|
5966
|
+
],
|
|
5967
|
+
"states": [
|
|
5968
|
+
"pageIndex, pageSize, totalItems, and pageSizeOptions are controlled inputs. dsChange reports the complete next pagination state, previous index and size, and whether the request changed the page or page size; it never mutates controlled inputs.",
|
|
5969
|
+
"Page-size changes request the first page. Out-of-range page indexes and invalid numeric inputs normalize only for presentation; the owner remains authoritative.",
|
|
5970
|
+
"Zero results display 0–0 of 0 and Page 1 of 1. A partial final page caps the visible range at totalItems.",
|
|
5971
|
+
"loading preserves the full pagination surface, applies aria-busy to the navigation region, and prevents page or page-size requests."
|
|
5972
|
+
],
|
|
5973
|
+
"responsiveBehavior": [
|
|
5974
|
+
"The compact controls remain on one line. When inline space is insufficient, the pagination surface scrolls horizontally rather than wrapping labels away from their controls."
|
|
5975
|
+
],
|
|
5976
|
+
"frameworkCaveats": {
|
|
5977
|
+
"customElements": [
|
|
5978
|
+
"Assign pageSizeOptions through the JavaScript property and replace controlled values in response to dsChange."
|
|
5979
|
+
],
|
|
5980
|
+
"react": [
|
|
5981
|
+
"Replace pageIndex and pageSize from the emitted detail before supplying the requested data window."
|
|
5982
|
+
],
|
|
5983
|
+
"angular": [
|
|
5984
|
+
"Bind numeric inputs as properties and update the owning signals from the dsChange output."
|
|
5985
|
+
]
|
|
5986
|
+
},
|
|
5987
|
+
"references": [
|
|
5988
|
+
{
|
|
5989
|
+
"label": "Storybook review states",
|
|
5990
|
+
"path": "src/wc/components/Pagination/Pagination.stories.ts"
|
|
5991
|
+
}
|
|
5992
|
+
]
|
|
5993
|
+
},
|
|
5994
|
+
"props": {
|
|
5995
|
+
"itemLabel": {
|
|
5996
|
+
"type": "string",
|
|
5997
|
+
"required": false
|
|
5998
|
+
},
|
|
5999
|
+
"label": {
|
|
6000
|
+
"type": "string",
|
|
6001
|
+
"required": false
|
|
6002
|
+
},
|
|
6003
|
+
"loading": {
|
|
6004
|
+
"type": "boolean",
|
|
6005
|
+
"required": false
|
|
6006
|
+
},
|
|
6007
|
+
"pageIndex": {
|
|
6008
|
+
"type": "number",
|
|
6009
|
+
"required": false
|
|
6010
|
+
},
|
|
6011
|
+
"pageSize": {
|
|
6012
|
+
"type": "number",
|
|
6013
|
+
"required": false
|
|
6014
|
+
},
|
|
6015
|
+
"pageSizeLabel": {
|
|
6016
|
+
"type": "string",
|
|
6017
|
+
"required": false
|
|
6018
|
+
},
|
|
6019
|
+
"pageSizeOptions": {
|
|
6020
|
+
"type": "number[]",
|
|
6021
|
+
"required": false
|
|
6022
|
+
},
|
|
6023
|
+
"totalItems": {
|
|
6024
|
+
"type": "number",
|
|
6025
|
+
"required": false
|
|
6026
|
+
}
|
|
6027
|
+
},
|
|
6028
|
+
"events": [
|
|
6029
|
+
{
|
|
6030
|
+
"name": "dsChange",
|
|
6031
|
+
"detail": "PaginationChangeDetail"
|
|
6032
|
+
}
|
|
6033
|
+
],
|
|
6034
|
+
"slots": [],
|
|
6035
|
+
"exports": {
|
|
6036
|
+
"customElement": "ds-pagination",
|
|
6037
|
+
"react": "DsPagination",
|
|
6038
|
+
"angular": "DsPagination"
|
|
6039
|
+
}
|
|
6040
|
+
},
|
|
6041
|
+
"dependencies": [
|
|
6042
|
+
"@ds-mo/ui",
|
|
6043
|
+
"@ds-mo/tokens"
|
|
6044
|
+
],
|
|
6045
|
+
"registryDependencies": [
|
|
6046
|
+
"button-unfilled",
|
|
6047
|
+
"select",
|
|
6048
|
+
"text"
|
|
6049
|
+
]
|
|
6050
|
+
},
|
|
5934
6051
|
{
|
|
5935
6052
|
"name": "panel-nav",
|
|
5936
6053
|
"title": "PanelNav",
|
|
@@ -8669,7 +8786,7 @@
|
|
|
8669
8786
|
{
|
|
8670
8787
|
"name": "table",
|
|
8671
8788
|
"title": "Table",
|
|
8672
|
-
"description": "Semantic, controlled data table with durable visual primitives for cell geometry,
|
|
8789
|
+
"description": "Semantic, controlled data table with durable visual primitives for cell geometry, grouping, sorting, multi-selection, sticky overflow, incremental loading, and top-level pagination.",
|
|
8673
8790
|
"type": "registry:ui",
|
|
8674
8791
|
"meta": {
|
|
8675
8792
|
"library": "@ds-mo/ui",
|
|
@@ -8680,22 +8797,23 @@
|
|
|
8680
8797
|
"intent": {
|
|
8681
8798
|
"audience": "general",
|
|
8682
8799
|
"status": "stable",
|
|
8683
|
-
"summary": "Semantic, controlled data table with durable visual primitives for cell geometry,
|
|
8800
|
+
"summary": "Semantic, controlled data table with durable visual primitives for cell geometry, grouping, sorting, multi-selection, sticky overflow, incremental loading, and top-level pagination.",
|
|
8684
8801
|
"useWhen": [
|
|
8685
8802
|
"A structured dataset needs native row and column relationships, optional one-level grouping, or comparable values across records.",
|
|
8686
|
-
"An application needs controlled sorting, loaded-row selection, or
|
|
8803
|
+
"An application needs controlled sorting, loaded-row selection, infinite loading, or pagination while retaining ownership of the data query and transformations.",
|
|
8687
8804
|
"A product table needs a token-backed recipe whose individual header, group, row, cell, selection, state, and load-more layers remain easy to restyle."
|
|
8688
8805
|
],
|
|
8689
8806
|
"avoidWhen": [
|
|
8690
8807
|
"Content is primarily editorial prose; use semantic product-owned markup with the prose recipe instead.",
|
|
8691
8808
|
"A small label/value set reads more clearly as a list, description list, or card.",
|
|
8692
|
-
"The interface requires tree-grid behavior, nested grouping, inline cell editing, row reordering, multiple pinned columns per edge, or virtualization; those
|
|
8693
|
-
"The application expects the component to fetch,
|
|
8809
|
+
"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.",
|
|
8810
|
+
"The application expects the component to fetch, slice pages, sort, group, or mutate records internally."
|
|
8694
8811
|
],
|
|
8695
8812
|
"commonlyComposedWith": [
|
|
8696
8813
|
"component:ds-empty-state",
|
|
8697
8814
|
"component:ds-skeleton",
|
|
8698
8815
|
"component:ds-loader",
|
|
8816
|
+
"component:ds-pagination",
|
|
8699
8817
|
"component:ds-bar-action",
|
|
8700
8818
|
"component:ds-button-unfilled",
|
|
8701
8819
|
"component:ds-tag",
|
|
@@ -8708,15 +8826,15 @@
|
|
|
8708
8826
|
"Interactive rows are focusable as native rows, activate with Enter or Space, and do not steal activation from their nested selection or action controls.",
|
|
8709
8827
|
"Scrollable table regions become keyboard focusable and named only when overflow exists.",
|
|
8710
8828
|
"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.",
|
|
8711
|
-
"
|
|
8829
|
+
"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, whose range changes are announced independently. The footer slot can replace summary copy, while footer-leading and footer-trailing remain available in the same compact-bar anatomy."
|
|
8712
8830
|
],
|
|
8713
8831
|
"states": [
|
|
8714
|
-
"Columns, rows, groups, grouping, sorting, selected row IDs, collapsed group IDs, displayedCount, totalCount, and
|
|
8715
|
-
"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
|
|
8832
|
+
"Columns, rows, groups, grouping, sorting, selected row IDs, collapsed group IDs, dataMode, pagination, displayedCount, totalCount, and incremental-loading state are controlled inputs. Events communicate intent and never mutate those inputs. The optional header is one full-width composable table-local surface: the component owns its 48px chrome, 8px inset on every side, and sticky placement while the application owns all internal layout, controls, labels, filtering behavior, and action handling. 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.",
|
|
8833
|
+
"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.",
|
|
8716
8834
|
"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.",
|
|
8717
8835
|
"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.",
|
|
8718
|
-
"Initial loading uses row-shaped skeletons that preserve the standard single-line cell padding, row dividers, column dividers, selection lane, and sticky-lane boundaries. 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; the global bottom-of-table loader is not rendered.",
|
|
8719
|
-
"
|
|
8836
|
+
"Initial loading uses row-shaped skeletons that preserve the standard single-line cell padding, row dividers, column dividers, selection lane, and sticky-lane boundaries. 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.",
|
|
8837
|
+
"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.",
|
|
8720
8838
|
"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.",
|
|
8721
8839
|
"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.",
|
|
8722
8840
|
"Cells accept scalar content, standard primary-and-secondary or dual-primary text primitives, declarative Tag, icon-only, 16:9 Image, or ButtonUnfilled Action content, or explicit Empty and Blank absence values. Standard secondary copy defaults to the secondary foreground and may declare a semantic Text color when the application data carries intent; dual-primary copy keeps both tracks primary unless explicitly colored. Single-track text, selection, tag-only, icon-only, Action, Empty, and Blank cells resolve a 40px base contract while multi-track cells grow downward. Tag cells use the double-inset Tag recipe; the md tag-only recipe is 24px inside 8px padding, while compound tag tracks preserve their peer text alignment. Action cells primarily use an icon-only Ellipses treatment, render a 24px small ButtonUnfilled inside 8px padding, default to unbordered, and emit row, column, and action identities through dsCellAction. Image cells render a 48px-high 16:9 bordered preview inside 8px outer padding, establishing a 64px row and a 102px column recipe, and fall back to an accessible placeholder when no source is supplied. Empty means the data applies but has no value and renders an em dash with localized assistive text; Blank means the data is not applicable and renders no content. Nullish values remain backward-compatible Empty values. Stable type and variant hooks keep every cell family independently styleable.",
|
|
@@ -8734,16 +8852,16 @@
|
|
|
8734
8852
|
],
|
|
8735
8853
|
"frameworkCaveats": {
|
|
8736
8854
|
"customElements": [
|
|
8737
|
-
"Assign columns, rows, groups, grouping, sort, selectedRowIds, collapsedGroupIds, displayedCount, and totalCount through JavaScript properties rather than HTML attribute strings.",
|
|
8738
|
-
"Replace controlled property values in response to dsSortChange, dsGroupCollapseChange, dsSelectionChange, dsLoadMore, and
|
|
8855
|
+
"Assign columns, rows, groups, grouping, sort, selectedRowIds, collapsedGroupIds, pagination, displayedCount, and totalCount through JavaScript properties rather than HTML attribute strings.",
|
|
8856
|
+
"Replace controlled property values in response to dsSortChange, dsGroupCollapseChange, dsSelectionChange, dsLoadMore, dsGroupLoadMore, and dsPaginationChange; route dsRowActivate in the application owner."
|
|
8739
8857
|
],
|
|
8740
8858
|
"react": [
|
|
8741
8859
|
"Pass new array and state-object references when the controlled data or query state changes.",
|
|
8742
|
-
"Apply emitted sort, collapse, selection, action, or global/group loading detail to application state and perform data transformations in the owning layer."
|
|
8860
|
+
"Apply emitted sort, collapse, selection, action, pagination, or global/group loading detail to application state and perform data transformations in the owning layer."
|
|
8743
8861
|
],
|
|
8744
8862
|
"angular": [
|
|
8745
8863
|
"Bind complex table inputs as properties and update the controlled values from the corresponding output events.",
|
|
8746
|
-
"Keep server cursor, query lifecycle, and cell-action handling in the owning service or container."
|
|
8864
|
+
"Keep server cursor, page slicing, query lifecycle, and cell-action handling in the owning service or container."
|
|
8747
8865
|
]
|
|
8748
8866
|
},
|
|
8749
8867
|
"references": [
|
|
@@ -8774,6 +8892,10 @@
|
|
|
8774
8892
|
"type": "TableColumn[]",
|
|
8775
8893
|
"required": false
|
|
8776
8894
|
},
|
|
8895
|
+
"dataMode": {
|
|
8896
|
+
"type": "TableDataMode",
|
|
8897
|
+
"required": false
|
|
8898
|
+
},
|
|
8777
8899
|
"displayedCount": {
|
|
8778
8900
|
"type": "number | undefined",
|
|
8779
8901
|
"required": false
|
|
@@ -8850,10 +8972,6 @@
|
|
|
8850
8972
|
"type": "string | number | undefined",
|
|
8851
8973
|
"required": false
|
|
8852
8974
|
},
|
|
8853
|
-
"lazyLoading": {
|
|
8854
|
-
"type": "boolean",
|
|
8855
|
-
"required": false
|
|
8856
|
-
},
|
|
8857
8975
|
"loadIdentity": {
|
|
8858
8976
|
"type": "string | number",
|
|
8859
8977
|
"required": false
|
|
@@ -8890,6 +9008,10 @@
|
|
|
8890
9008
|
"type": "string | number | undefined",
|
|
8891
9009
|
"required": false
|
|
8892
9010
|
},
|
|
9011
|
+
"pagination": {
|
|
9012
|
+
"type": "TablePaginationState | null",
|
|
9013
|
+
"required": false
|
|
9014
|
+
},
|
|
8893
9015
|
"resultSummaryLabel": {
|
|
8894
9016
|
"type": "string",
|
|
8895
9017
|
"required": false
|
|
@@ -8960,6 +9082,10 @@
|
|
|
8960
9082
|
"name": "dsLoadMore",
|
|
8961
9083
|
"detail": "TableLoadMoreDetail"
|
|
8962
9084
|
},
|
|
9085
|
+
{
|
|
9086
|
+
"name": "dsPaginationChange",
|
|
9087
|
+
"detail": "PaginationChangeDetail"
|
|
9088
|
+
},
|
|
8963
9089
|
{
|
|
8964
9090
|
"name": "dsRowActivate",
|
|
8965
9091
|
"detail": "TableRowActivateDetail"
|
|
@@ -8991,6 +9117,7 @@
|
|
|
8991
9117
|
"empty-state",
|
|
8992
9118
|
"icon",
|
|
8993
9119
|
"loader",
|
|
9120
|
+
"pagination",
|
|
8994
9121
|
"skeleton",
|
|
8995
9122
|
"tag",
|
|
8996
9123
|
"text"
|
|
@@ -9548,6 +9675,7 @@
|
|
|
9548
9675
|
"The first hover or keyboard focus waits for delay; moving to another tooltip shortly after dismissal opens it immediately.",
|
|
9549
9676
|
"An empty or whitespace-only label suppresses the popup while preserving the wrapper.",
|
|
9550
9677
|
"Only one tooltip remains active globally; warm handoff removes the previous popup before showing the next.",
|
|
9678
|
+
"Disconnecting and reinserting the tooltip host rebinds the current slotted trigger.",
|
|
9551
9679
|
"The preferred side flips when it cannot fit, then alignment is clamped to viewport padding.",
|
|
9552
9680
|
"Reduced motion removes enter and exit fades while retaining the final visible or hidden state."
|
|
9553
9681
|
],
|