@ds-mo/ui 14.16.0 → 14.17.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.
Files changed (130) hide show
  1. package/dist/.package-ready.json +1 -1
  2. package/dist/agent-patterns.json +1 -1
  3. package/dist/agent.json +167 -11
  4. package/dist/angular/ds-table-filter.d.ts +44 -0
  5. package/dist/angular/ds-table-filter.js +57 -0
  6. package/dist/angular/index.d.ts +1 -1
  7. package/dist/angular/index.js +1 -0
  8. package/dist/angular/proxies.d.ts +1 -0
  9. package/dist/angular/proxies.js +1 -0
  10. package/dist/components/ds-agent-questionnaire.js +1 -1
  11. package/dist/components/ds-agent-response.js +1 -1
  12. package/dist/components/ds-banner.js +1 -1
  13. package/dist/components/ds-bar-nav.js +1 -1
  14. package/dist/components/ds-bar-title.js +1 -1
  15. package/dist/components/ds-bar-workflow.js +1 -1
  16. package/dist/components/ds-button-unfilled.js +1 -1
  17. package/dist/components/ds-card-chart.js +1 -1
  18. package/dist/components/ds-card-overview.js +1 -1
  19. package/dist/components/ds-card-setting.js +1 -1
  20. package/dist/components/ds-chart.js +1 -1
  21. package/dist/components/ds-code-block.js +1 -1
  22. package/dist/components/ds-filter-menu.js +1 -1
  23. package/dist/components/ds-filter-menu.js.map +1 -1
  24. package/dist/components/ds-input.js +1 -1
  25. package/dist/components/ds-markdown.js +1 -1
  26. package/dist/components/ds-menu.js +1 -1
  27. package/dist/components/ds-message-actions.js +1 -1
  28. package/dist/components/ds-message-composer.js +1 -1
  29. package/dist/components/ds-message-scroller.js +1 -1
  30. package/dist/components/ds-mobile-header.js +1 -1
  31. package/dist/components/ds-mobile-section-switcher.js +1 -1
  32. package/dist/components/ds-mobile-sheet-nav.js +1 -1
  33. package/dist/components/ds-modal.js +1 -1
  34. package/dist/components/ds-pagination.js +1 -1
  35. package/dist/components/ds-panel-nav.js +1 -1
  36. package/dist/components/ds-panel-tool-header.js +1 -1
  37. package/dist/components/ds-panel-tool-search.js +1 -1
  38. package/dist/components/ds-panel-tools.js +1 -1
  39. package/dist/components/ds-select.js +1 -1
  40. package/dist/components/ds-shell-app.js +1 -1
  41. package/dist/components/ds-shell-tools.js +1 -1
  42. package/dist/components/ds-table-filter.d.ts +11 -0
  43. package/dist/components/ds-table-filter.js +2 -0
  44. package/dist/components/ds-table-filter.js.map +1 -0
  45. package/dist/components/ds-table-saved-views.js +1 -1
  46. package/dist/components/ds-table-sort.js +1 -1
  47. package/dist/components/ds-table-sort.js.map +1 -1
  48. package/dist/components/ds-table-toolbar.js +1 -1
  49. package/dist/components/ds-table-toolbar.js.map +1 -1
  50. package/dist/components/ds-table.js +1 -1
  51. package/dist/components/ds-toast.js +1 -1
  52. package/dist/components/ds-tooltip-chart.js +1 -1
  53. package/dist/components/ds-tooltip.js +1 -1
  54. package/dist/components/ds-typing-indicator.js +1 -1
  55. package/dist/components/{p-3dYwA4i_.js → p-Asi9h3pa.js} +2 -2
  56. package/dist/components/p-BFSLT0yc.js +2 -0
  57. package/dist/components/p-BFSLT0yc.js.map +1 -0
  58. package/dist/components/{p-C4p2i59V.js → p-BHz78C8h.js} +2 -2
  59. package/dist/components/{p-Dcnd5ZX5.js → p-BKp__CQX.js} +2 -2
  60. package/dist/components/{p-Ct2GVdSI.js → p-Be1sY58w.js} +2 -2
  61. package/dist/components/{p-vzxD117T.js → p-Bh67XbfB.js} +2 -2
  62. package/dist/components/{p-C_TOgX82.js → p-Bn8NryHK.js} +2 -2
  63. package/dist/components/{p-CaAZ-D08.js → p-C4TgWJi9.js} +2 -2
  64. package/dist/components/{p-COVcyUAA.js → p-CKmfuK7k.js} +2 -2
  65. package/dist/components/p-CKmfuK7k.js.map +1 -0
  66. package/dist/components/{p-EWI6ccs-.js → p-CMFvaY05.js} +2 -2
  67. package/dist/components/{p-BK-JjdoN.js → p-D4K9CE8a.js} +2 -2
  68. package/dist/components/{p-CxBE3l74.js → p-DEjh3klB.js} +2 -2
  69. package/dist/components/{p-NdahPypA.js → p-DFQ9mcbK.js} +2 -2
  70. package/dist/components/{p-WGZWqh-B.js → p-DHuyj-9J.js} +2 -2
  71. package/dist/components/{p-BUhShHfb.js → p-DIEK54fV.js} +2 -2
  72. package/dist/components/p-DOqnJVos.js +2 -0
  73. package/dist/components/{p-CwkcFMMe.js.map → p-DOqnJVos.js.map} +1 -1
  74. package/dist/components/{p-DRBTr6TS.js → p-DZ55e3j9.js} +2 -2
  75. package/dist/components/{p-MxptXwlW.js → p-DsJW5W3W.js} +2 -2
  76. package/dist/components/p-JPTkZ3Ji.js.map +1 -1
  77. package/dist/components/{p-DAV32g35.js → p-NzGRAPcF.js} +2 -2
  78. package/dist/components/p-NzGRAPcF.js.map +1 -0
  79. package/dist/components/{p-BUrbVZJU.js → p-ZZzC52Ea.js} +2 -2
  80. package/dist/components/{p-C91izpHV.js → p-__lNIImO.js} +2 -2
  81. package/dist/components/{p-0IbKxhqM.js → p-rrFMAZkj.js} +2 -2
  82. package/dist/components/{p-Cr2VT5zv.js → p-ruPTIV6t.js} +2 -2
  83. package/dist/docs/components.json +435 -6
  84. package/dist/mcp-data/registry/button-unfilled.json +3 -3
  85. package/dist/mcp-data/registry/filter-menu.json +5 -5
  86. package/dist/mcp-data/registry/loader.json +2 -1
  87. package/dist/mcp-data/registry/registry.json +169 -10
  88. package/dist/mcp-data/registry/select.json +1 -1
  89. package/dist/mcp-data/registry/table-filter.json +399 -0
  90. package/dist/mcp-data/registry/table-saved-views.json +1 -1
  91. package/dist/mcp-data/registry/table-sort.json +2 -2
  92. package/dist/mcp-data/registry/table-toolbar.json +9 -9
  93. package/dist/mcp-data/registry/table.json +1 -0
  94. package/dist/react/components.d.ts +1 -0
  95. package/dist/react/components.js +1 -0
  96. package/dist/react/ds-table-filter.d.ts +17 -0
  97. package/dist/react/ds-table-filter.js +19 -0
  98. package/dist/types/components/ButtonUnfilled/ButtonUnfilled.d.ts +2 -0
  99. package/dist/types/components/FilterMenu/FilterMenu.d.ts +2 -0
  100. package/dist/types/components/Select/Select.d.ts +2 -0
  101. package/dist/types/components/TableFilter/TableFilter.d.ts +37 -0
  102. package/dist/types/components/TableToolbar/TableToolbar.d.ts +0 -6
  103. package/dist/types/components.d.ts +160 -4
  104. package/dist/vue/components.d.ts +1 -0
  105. package/dist/vue/components.js +1 -0
  106. package/dist/vue/ds-table-filter.d.ts +3 -0
  107. package/dist/vue/ds-table-filter.js +29 -0
  108. package/package.json +1 -1
  109. package/dist/components/p-COVcyUAA.js.map +0 -1
  110. package/dist/components/p-CwkcFMMe.js +0 -2
  111. package/dist/components/p-DAV32g35.js.map +0 -1
  112. /package/dist/components/{p-3dYwA4i_.js.map → p-Asi9h3pa.js.map} +0 -0
  113. /package/dist/components/{p-C4p2i59V.js.map → p-BHz78C8h.js.map} +0 -0
  114. /package/dist/components/{p-Dcnd5ZX5.js.map → p-BKp__CQX.js.map} +0 -0
  115. /package/dist/components/{p-Ct2GVdSI.js.map → p-Be1sY58w.js.map} +0 -0
  116. /package/dist/components/{p-vzxD117T.js.map → p-Bh67XbfB.js.map} +0 -0
  117. /package/dist/components/{p-C_TOgX82.js.map → p-Bn8NryHK.js.map} +0 -0
  118. /package/dist/components/{p-CaAZ-D08.js.map → p-C4TgWJi9.js.map} +0 -0
  119. /package/dist/components/{p-EWI6ccs-.js.map → p-CMFvaY05.js.map} +0 -0
  120. /package/dist/components/{p-BK-JjdoN.js.map → p-D4K9CE8a.js.map} +0 -0
  121. /package/dist/components/{p-CxBE3l74.js.map → p-DEjh3klB.js.map} +0 -0
  122. /package/dist/components/{p-NdahPypA.js.map → p-DFQ9mcbK.js.map} +0 -0
  123. /package/dist/components/{p-WGZWqh-B.js.map → p-DHuyj-9J.js.map} +0 -0
  124. /package/dist/components/{p-BUhShHfb.js.map → p-DIEK54fV.js.map} +0 -0
  125. /package/dist/components/{p-DRBTr6TS.js.map → p-DZ55e3j9.js.map} +0 -0
  126. /package/dist/components/{p-MxptXwlW.js.map → p-DsJW5W3W.js.map} +0 -0
  127. /package/dist/components/{p-BUrbVZJU.js.map → p-ZZzC52Ea.js.map} +0 -0
  128. /package/dist/components/{p-C91izpHV.js.map → p-__lNIImO.js.map} +0 -0
  129. /package/dist/components/{p-0IbKxhqM.js.map → p-rrFMAZkj.js.map} +0 -0
  130. /package/dist/components/{p-Cr2VT5zv.js.map → p-ruPTIV6t.js.map} +0 -0
@@ -0,0 +1,399 @@
1
+ {
2
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
+ "name": "table-filter",
4
+ "title": "TableFilter",
5
+ "description": "Standard table-toolbar Filter control that owns the shared trigger, filter menu UI, accessible defaults, and compact-caption behavior while the application controls data and values.",
6
+ "type": "registry:ui",
7
+ "meta": {
8
+ "library": "@ds-mo/ui",
9
+ "distribution": "npm",
10
+ "storybook": "https://zainadeel.github.io/compomo/?path=/story/table-filter",
11
+ "source": "src/wc/components/TableFilter/TableFilter.tsx",
12
+ "intentStatus": "complete",
13
+ "intent": {
14
+ "audience": "general",
15
+ "status": "stable",
16
+ "summary": "Standard table-toolbar Filter control that owns the shared trigger, filter menu UI, accessible defaults, and compact-caption behavior while the application controls data and values.",
17
+ "useWhen": [
18
+ "A table toolbar should expose the standard singular Filter control and shared filter-menu interaction.",
19
+ "A product supplies filter definitions and controlled values but should not recreate the toolbar trigger, selected count, category navigation, or responsive treatment."
20
+ ],
21
+ "avoidWhen": [
22
+ "Filtering is unrelated to a table or structured result set; use ds-filter-menu directly.",
23
+ "The application expects the component to filter, fetch, persist, or otherwise transform rows.",
24
+ "A filter requires a product-specific editor that the shared filter category kinds cannot represent."
25
+ ],
26
+ "alternatives": [
27
+ {
28
+ "when": "A non-table surface needs the generic filter interaction or custom trigger recipe.",
29
+ "component": "component:ds-filter-menu",
30
+ "reason": "FilterMenu exposes generic trigger geometry and popup positioning rather than the fixed table-toolbar recipe."
31
+ }
32
+ ],
33
+ "commonlyComposedWith": [
34
+ "component:ds-table",
35
+ "component:ds-table-toolbar",
36
+ "component:ds-table-saved-views",
37
+ "component:ds-table-sort",
38
+ "component:ds-filter-menu"
39
+ ],
40
+ "patterns": [
41
+ "pattern:menu-trigger"
42
+ ],
43
+ "accessibility": [
44
+ "The trigger is an icon-label combobox named Filter table unless a product aria-label supplies the table context. Compact caption widths preserve that accessible name after the visible label and chevron are omitted.",
45
+ "The popup retains ds-filter-menu category navigation, option semantics, focus entry, dismissal, and focus return.",
46
+ "Localize label, menuLabel, categoriesLabel, and clearLabel together so visible and accessible wording remains consistent."
47
+ ],
48
+ "states": [
49
+ "filters, values, and activeFilterId are controlled. dsChange, dsClear, and dsActiveFilterChange report intent without changing those inputs; the application applies query consequences and returns replacement values.",
50
+ "The visible trigger label defaults to singular Filter and appends the selected criterion count. The trigger uses resting secondary chrome at typical widths; active criteria promote only the visible label, without redefining generic button active semantics.",
51
+ "Popup visibility follows the same mutable open and dsOpenChange contract as ds-filter-menu."
52
+ ],
53
+ "responsiveBehavior": [
54
+ "Place the control in the trailing region of ds-table-toolbar.",
55
+ "Inside a named ds-table container narrower than 900px, the trigger becomes icon-only and active criteria promote the Filters icon to primary."
56
+ ],
57
+ "frameworkCaveats": {
58
+ "customElements": [
59
+ "Assign filters, values, and activeFilterId as JavaScript properties. Replace controlled values in response to dsChange and dsClear."
60
+ ],
61
+ "react": [
62
+ "Keep filters and values in application state and replace values from the typed dsChange and dsClear events."
63
+ ],
64
+ "angular": [
65
+ "Import the generated DsTableFilter adapter, bind filters and values, and handle dsChange, dsClear, and dsActiveFilterChange."
66
+ ]
67
+ },
68
+ "references": [
69
+ {
70
+ "label": "Storybook review states",
71
+ "path": "src/wc/components/TableFilter/TableFilter.stories.ts"
72
+ },
73
+ {
74
+ "label": "Toolbar composition owner",
75
+ "path": "src/wc/components/TableToolbar/TableToolbar.agent.json"
76
+ }
77
+ ]
78
+ },
79
+ "api": {
80
+ "props": {
81
+ "activeFilterId": {
82
+ "type": "string | undefined",
83
+ "resolvedType": "string | undefined",
84
+ "attribute": "active-filter-id",
85
+ "required": false,
86
+ "mutable": false,
87
+ "description": "Controlled category shown in the option pane."
88
+ },
89
+ "ariaLabel": {
90
+ "type": "string | null",
91
+ "resolvedType": "null | string",
92
+ "attribute": "aria-label",
93
+ "default": "null",
94
+ "required": false,
95
+ "mutable": false,
96
+ "description": "Accessible name for the trigger. Defaults to Filter table."
97
+ },
98
+ "categoriesLabel": {
99
+ "type": "string",
100
+ "resolvedType": "string",
101
+ "attribute": "categories-label",
102
+ "default": "'Filter categories'",
103
+ "required": false,
104
+ "mutable": false,
105
+ "description": "Accessible name for the category tab list."
106
+ },
107
+ "clearLabel": {
108
+ "type": "string",
109
+ "resolvedType": "string",
110
+ "attribute": "clear-label",
111
+ "default": "'Clear'",
112
+ "required": false,
113
+ "mutable": false,
114
+ "description": "Footer action and date-clear accessible label."
115
+ },
116
+ "filters": {
117
+ "type": "FilterMenuFilter[]",
118
+ "resolvedType": "FilterMenuFilter[]",
119
+ "default": "[]",
120
+ "required": false,
121
+ "mutable": false,
122
+ "description": "Product-owned filter categories and option definitions."
123
+ },
124
+ "label": {
125
+ "type": "string",
126
+ "resolvedType": "string",
127
+ "attribute": "label",
128
+ "default": "'Filter'",
129
+ "required": false,
130
+ "mutable": false,
131
+ "description": "Visible trigger label."
132
+ },
133
+ "menuLabel": {
134
+ "type": "string | null",
135
+ "resolvedType": "null | string",
136
+ "attribute": "menu-label",
137
+ "default": "null",
138
+ "required": false,
139
+ "mutable": false,
140
+ "description": "Accessible name for the non-modal filter dialog. Defaults to the trigger name."
141
+ },
142
+ "open": {
143
+ "type": "boolean",
144
+ "resolvedType": "boolean",
145
+ "attribute": "open",
146
+ "default": "false",
147
+ "required": false,
148
+ "mutable": true,
149
+ "description": "Controlled popup visibility."
150
+ },
151
+ "values": {
152
+ "type": "FilterMenuValues",
153
+ "resolvedType": "{ [x: string]: FilterMenuValue | undefined; }",
154
+ "default": "{}",
155
+ "required": false,
156
+ "mutable": false,
157
+ "description": "Controlled values keyed by filter id."
158
+ }
159
+ },
160
+ "events": [
161
+ {
162
+ "name": "dsActiveFilterChange",
163
+ "detail": "string",
164
+ "bubbles": true,
165
+ "cancelable": true,
166
+ "composed": true,
167
+ "description": "Requests a controlled active-category replacement."
168
+ },
169
+ {
170
+ "name": "dsAfterClose",
171
+ "detail": "void",
172
+ "bubbles": true,
173
+ "cancelable": true,
174
+ "composed": true,
175
+ "description": "Emitted after exit motion and rendered popup removal complete."
176
+ },
177
+ {
178
+ "name": "dsChange",
179
+ "detail": "FilterMenuChangeDetail",
180
+ "bubbles": true,
181
+ "cancelable": true,
182
+ "composed": true,
183
+ "description": "Requests a controlled value replacement without closing the popup."
184
+ },
185
+ {
186
+ "name": "dsClear",
187
+ "detail": "void",
188
+ "bubbles": true,
189
+ "cancelable": true,
190
+ "composed": true,
191
+ "description": "Requests that the consumer clear every filter value."
192
+ },
193
+ {
194
+ "name": "dsClose",
195
+ "detail": "void",
196
+ "bubbles": true,
197
+ "cancelable": true,
198
+ "composed": true,
199
+ "description": "Requests that the controlled popup close."
200
+ },
201
+ {
202
+ "name": "dsOpenChange",
203
+ "detail": "boolean",
204
+ "bubbles": true,
205
+ "cancelable": true,
206
+ "composed": true,
207
+ "description": "Emitted whenever trigger activation changes popup visibility."
208
+ }
209
+ ],
210
+ "methods": [],
211
+ "slots": []
212
+ },
213
+ "props": {
214
+ "activeFilterId": {
215
+ "type": "string | undefined",
216
+ "resolvedType": "string | undefined",
217
+ "attribute": "active-filter-id",
218
+ "required": false,
219
+ "mutable": false,
220
+ "description": "Controlled category shown in the option pane."
221
+ },
222
+ "ariaLabel": {
223
+ "type": "string | null",
224
+ "resolvedType": "null | string",
225
+ "attribute": "aria-label",
226
+ "default": "null",
227
+ "required": false,
228
+ "mutable": false,
229
+ "description": "Accessible name for the trigger. Defaults to Filter table."
230
+ },
231
+ "categoriesLabel": {
232
+ "type": "string",
233
+ "resolvedType": "string",
234
+ "attribute": "categories-label",
235
+ "default": "'Filter categories'",
236
+ "required": false,
237
+ "mutable": false,
238
+ "description": "Accessible name for the category tab list."
239
+ },
240
+ "clearLabel": {
241
+ "type": "string",
242
+ "resolvedType": "string",
243
+ "attribute": "clear-label",
244
+ "default": "'Clear'",
245
+ "required": false,
246
+ "mutable": false,
247
+ "description": "Footer action and date-clear accessible label."
248
+ },
249
+ "filters": {
250
+ "type": "FilterMenuFilter[]",
251
+ "resolvedType": "FilterMenuFilter[]",
252
+ "default": "[]",
253
+ "required": false,
254
+ "mutable": false,
255
+ "description": "Product-owned filter categories and option definitions."
256
+ },
257
+ "label": {
258
+ "type": "string",
259
+ "resolvedType": "string",
260
+ "attribute": "label",
261
+ "default": "'Filter'",
262
+ "required": false,
263
+ "mutable": false,
264
+ "description": "Visible trigger label."
265
+ },
266
+ "menuLabel": {
267
+ "type": "string | null",
268
+ "resolvedType": "null | string",
269
+ "attribute": "menu-label",
270
+ "default": "null",
271
+ "required": false,
272
+ "mutable": false,
273
+ "description": "Accessible name for the non-modal filter dialog. Defaults to the trigger name."
274
+ },
275
+ "open": {
276
+ "type": "boolean",
277
+ "resolvedType": "boolean",
278
+ "attribute": "open",
279
+ "default": "false",
280
+ "required": false,
281
+ "mutable": true,
282
+ "description": "Controlled popup visibility."
283
+ },
284
+ "values": {
285
+ "type": "FilterMenuValues",
286
+ "resolvedType": "{ [x: string]: FilterMenuValue | undefined; }",
287
+ "default": "{}",
288
+ "required": false,
289
+ "mutable": false,
290
+ "description": "Controlled values keyed by filter id."
291
+ }
292
+ },
293
+ "events": [
294
+ {
295
+ "name": "dsActiveFilterChange",
296
+ "detail": "string",
297
+ "bubbles": true,
298
+ "cancelable": true,
299
+ "composed": true,
300
+ "description": "Requests a controlled active-category replacement."
301
+ },
302
+ {
303
+ "name": "dsAfterClose",
304
+ "detail": "void",
305
+ "bubbles": true,
306
+ "cancelable": true,
307
+ "composed": true,
308
+ "description": "Emitted after exit motion and rendered popup removal complete."
309
+ },
310
+ {
311
+ "name": "dsChange",
312
+ "detail": "FilterMenuChangeDetail",
313
+ "bubbles": true,
314
+ "cancelable": true,
315
+ "composed": true,
316
+ "description": "Requests a controlled value replacement without closing the popup."
317
+ },
318
+ {
319
+ "name": "dsClear",
320
+ "detail": "void",
321
+ "bubbles": true,
322
+ "cancelable": true,
323
+ "composed": true,
324
+ "description": "Requests that the consumer clear every filter value."
325
+ },
326
+ {
327
+ "name": "dsClose",
328
+ "detail": "void",
329
+ "bubbles": true,
330
+ "cancelable": true,
331
+ "composed": true,
332
+ "description": "Requests that the controlled popup close."
333
+ },
334
+ {
335
+ "name": "dsOpenChange",
336
+ "detail": "boolean",
337
+ "bubbles": true,
338
+ "cancelable": true,
339
+ "composed": true,
340
+ "description": "Emitted whenever trigger activation changes popup visibility."
341
+ }
342
+ ],
343
+ "methods": [],
344
+ "slots": [],
345
+ "exports": {
346
+ "customElement": "ds-table-filter",
347
+ "react": "DsTableFilter",
348
+ "vue": "DsTableFilter",
349
+ "angular": "DsTableFilter"
350
+ },
351
+ "consumption": {
352
+ "install": "npm install @ds-mo/ui @ds-mo/tokens @ds-mo/icons",
353
+ "cssSetup": "import '@ds-mo/tokens';\nimport '@ds-mo/tokens/reset';\nimport '@ds-mo/tokens/globals';",
354
+ "customElements": {
355
+ "import": "import '@ds-mo/ui/dist/components/ds-table-filter.js';",
356
+ "example": "<ds-table-filter></ds-table-filter>"
357
+ },
358
+ "react": {
359
+ "import": "import { DsTableFilter } from '@ds-mo/ui/react';",
360
+ "example": "<DsTableFilter />"
361
+ },
362
+ "vue": {
363
+ "import": "import { DsTableFilter } from '@ds-mo/ui/vue';",
364
+ "example": "<DsTableFilter />"
365
+ },
366
+ "angular": {
367
+ "import": "import { DsTableFilter } from '@ds-mo/ui/angular/ds-table-filter';",
368
+ "example": "<ds-table-filter></ds-table-filter>"
369
+ },
370
+ "complexPropertyNote": "Assign these non-primitive values as JavaScript properties: filters, values.",
371
+ "peerDependencies": {
372
+ "required": [
373
+ "@ds-mo/tokens ^6.5.0",
374
+ "@ds-mo/icons ^7.0.0"
375
+ ],
376
+ "frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
377
+ }
378
+ }
379
+ },
380
+ "dependencies": [
381
+ "@ds-mo/ui",
382
+ "@ds-mo/tokens"
383
+ ],
384
+ "registryDependencies": [
385
+ "filter-menu"
386
+ ],
387
+ "files": [
388
+ {
389
+ "path": "src/wc/components/TableFilter/TableFilter.css",
390
+ "content": ":host {\n display: inline-flex;\n min-inline-size: 0;\n max-inline-size: var(--dimension-menu-width-xs);\n}\n\nds-filter-menu {\n min-inline-size: 0;\n max-inline-size: 100%;\n --ds-choice-popup-min-inline-size: var(--dimension-menu-width-xs);\n}\n",
391
+ "type": "registry:ui"
392
+ },
393
+ {
394
+ "path": "src/wc/components/TableFilter/TableFilter.tsx",
395
+ "content": "import { Component, Event, EventEmitter, h, Host, Prop } from '@stencil/core';\nimport type {\n FilterMenuChangeDetail,\n FilterMenuFilter,\n FilterMenuValues,\n} from '../FilterMenu/FilterMenu';\n\n@Component({\n tag: 'ds-table-filter',\n styleUrl: 'TableFilter.css',\n scoped: true,\n})\nexport class TableFilter {\n /** Controlled popup visibility. */\n @Prop({ mutable: true }) open: boolean = false;\n /** Product-owned filter categories and option definitions. */\n @Prop() filters: FilterMenuFilter[] = [];\n /** Controlled values keyed by filter id. */\n @Prop() values: FilterMenuValues = {};\n /** Controlled category shown in the option pane. */\n @Prop() activeFilterId: string | undefined;\n /** Visible trigger label. */\n @Prop() label: string = 'Filter';\n /** Accessible name for the trigger. Defaults to Filter table. */\n @Prop({ attribute: 'aria-label' }) ariaLabel: string | null = null;\n /** Accessible name for the non-modal filter dialog. Defaults to the trigger name. */\n @Prop() menuLabel: string | null = null;\n /** Accessible name for the category tab list. */\n @Prop() categoriesLabel: string = 'Filter categories';\n /** Footer action and date-clear accessible label. */\n @Prop() clearLabel: string = 'Clear';\n\n /** Requests a controlled value replacement without closing the popup. */\n @Event() dsChange!: EventEmitter<FilterMenuChangeDetail>;\n /** Requests that the consumer clear every filter value. */\n @Event() dsClear!: EventEmitter<void>;\n /** Requests a controlled active-category replacement. */\n @Event() dsActiveFilterChange!: EventEmitter<string>;\n /** Requests that the controlled popup close. */\n @Event() dsClose!: EventEmitter<void>;\n /** Emitted whenever trigger activation changes popup visibility. */\n @Event() dsOpenChange!: EventEmitter<boolean>;\n /** Emitted after exit motion and rendered popup removal complete. */\n @Event() dsAfterClose!: EventEmitter<void>;\n\n render() {\n const name = this.ariaLabel?.trim() || 'Filter table';\n const menuName = this.menuLabel?.trim() || name;\n\n return (\n <Host>\n <ds-filter-menu\n open={this.open}\n triggerLabel={this.label}\n icon=\"Filters\"\n size=\"md\"\n width=\"hug\"\n hasBorder={true}\n activeFill={false}\n collapseLabel={true}\n aria-label={name}\n filters={this.filters}\n values={this.values}\n activeFilterId={this.activeFilterId}\n menuLabel={menuName}\n categoriesLabel={this.categoriesLabel}\n clearLabel={this.clearLabel}\n onDsChange={event => this.forward(event, this.dsChange)}\n onDsClear={event => this.forward(event, this.dsClear)}\n onDsActiveFilterChange={event => this.forward(event, this.dsActiveFilterChange)}\n onDsClose={event => this.forward(event, this.dsClose)}\n onDsOpenChange={event => {\n event.stopPropagation();\n this.open = event.detail;\n this.dsOpenChange.emit(event.detail);\n }}\n onDsAfterClose={event => this.forward(event, this.dsAfterClose)}\n />\n </Host>\n );\n }\n\n private forward<T>(event: CustomEvent<T>, emitter: EventEmitter<T>): void {\n event.stopPropagation();\n emitter.emit(event.detail);\n }\n}\n",
396
+ "type": "registry:ui"
397
+ }
398
+ ]
399
+ }
@@ -43,7 +43,7 @@
43
43
  "The default view is a non-editable template. Application-owned custom views appear in a separate section with Rename and Remove actions. New view opens the naming dialog. When an editable selected view is dirty, that view row shows Save and negative Discard supporting actions while the footer remains dedicated to New view. The application decides which table state to capture, restore, and persist."
44
44
  ],
45
45
  "responsiveBehavior": [
46
- "The control remains a single toolbar item and relies on Select, Menu, and Modal collision and viewport behavior. Its trigger is capped at the compact menu-width token so long view names truncate while the dirty dot stays visible. Its choice popup keeps that same token as the minimum width.",
46
+ "The control remains a single toolbar item and relies on Select, Menu, and Modal collision and viewport behavior. Its trigger hugs short view names and is capped at the compact menu-width token so long names truncate while the dirty dot stays visible. Its choice popup keeps that same token as the minimum width.",
47
47
  "Place it in the start region of ds-table-toolbar so the middle region can keep left-side and right-side controls on one spanning cluster."
48
48
  ],
49
49
  "frameworkCaveats": {
@@ -33,7 +33,7 @@
33
33
  "commonlyComposedWith": [
34
34
  "component:ds-table",
35
35
  "component:ds-table-toolbar",
36
- "component:ds-filter-menu",
36
+ "component:ds-table-filter",
37
37
  "component:ds-select",
38
38
  "component:ds-button-unfilled",
39
39
  "component:ds-menu"
@@ -222,7 +222,7 @@
222
222
  },
223
223
  {
224
224
  "path": "src/wc/components/TableSort/table-sort-menu.ts",
225
- "content": "import type { MenuItemData, MenuSection } from '../Menu/menu-types';\nimport { isTableActionColumn } from '../Table/table-column-customizer';\nimport type { TableColumn, TableSortState } from '../Table/table-types';\n\nexport const TABLE_SORT_DIRECTION_ASC = 'direction:asc';\nexport const TABLE_SORT_DIRECTION_DESC = 'direction:desc';\n\nexport interface TableSortField {\n id: string;\n label: string;\n}\n\n/** Sortable data fields from the catalog, including compound header segments. */\nexport function tableSortFields(columns: readonly TableColumn[]): TableSortField[] {\n const fields: TableSortField[] = [];\n const seen = new Set<string>();\n\n for (const column of columns) {\n if (isTableActionColumn(column) || !column.sortable) continue;\n const segments = column.headerSegments?.filter(segment => segment.sortKey.trim()) ?? [];\n if (segments.length > 0) {\n for (const segment of segments) {\n if (seen.has(segment.sortKey)) continue;\n seen.add(segment.sortKey);\n fields.push({\n id: segment.sortKey,\n label: segment.label.trim() || segment.sortKey,\n });\n }\n continue;\n }\n if (seen.has(column.id)) continue;\n seen.add(column.id);\n fields.push({\n id: column.id,\n label: column.header.trim() || column.headerLabel?.trim() || column.id,\n });\n }\n\n return fields;\n}\n\nexport function tableSortMenuSections(\n columns: readonly TableColumn[],\n sort: TableSortState | null | undefined\n): MenuSection[] {\n const fields = tableSortFields(columns);\n return [\n {\n header: 'Data',\n items: fields.map(field => ({\n label: field.label,\n value: field.id,\n isSelected: sort?.columnId === field.id,\n })),\n },\n {\n header: 'Direction',\n items: [\n {\n label: 'Ascending',\n value: TABLE_SORT_DIRECTION_ASC,\n icon: 'ArrowUp',\n isSelected: sort?.direction === 'asc',\n },\n {\n label: 'Descending',\n value: TABLE_SORT_DIRECTION_DESC,\n icon: 'ArrowDown',\n isSelected: sort?.direction === 'desc',\n },\n ],\n },\n ];\n}\n\nexport function tableSortStatesEqual(\n left: TableSortState | null | undefined,\n right: TableSortState | null | undefined\n): boolean {\n if (left === right) return true;\n if (!left || !right) return false;\n return left.columnId === right.columnId && left.direction === right.direction;\n}\n\n/** Next controlled sort from a Sort menu selection. Does not toggle like a header click. */\nexport function nextTableSortStateFromMenuItem(\n columns: readonly TableColumn[],\n current: TableSortState | null | undefined,\n item: MenuItemData\n): TableSortState | null {\n const fields = tableSortFields(columns);\n if (fields.length === 0) return current ?? null;\n\n if (item.value === TABLE_SORT_DIRECTION_ASC || item.value === TABLE_SORT_DIRECTION_DESC) {\n const direction = item.value === TABLE_SORT_DIRECTION_ASC ? 'asc' : 'desc';\n const columnId = current?.columnId ?? fields[0]!.id;\n return { columnId, direction };\n }\n\n if (!item.value || !fields.some(field => field.id === item.value)) return current ?? null;\n if (current?.columnId === item.value) return current ?? null;\n return { columnId: item.value, direction: current?.direction ?? 'asc' };\n}\n",
225
+ "content": "import type { MenuItemData, MenuSection } from '../Menu/menu-types';\nimport { isTableActionColumn } from '../Table/table-column-customizer';\nimport type { TableColumn, TableSortState } from '../Table/table-types';\n\nexport const TABLE_SORT_DIRECTION_ASC = 'direction:asc';\nexport const TABLE_SORT_DIRECTION_DESC = 'direction:desc';\nconst TABLE_SORT_FIELD_PREFIX = 'field:';\n\nexport interface TableSortField {\n id: string;\n label: string;\n}\n\n/** Sortable data fields from the catalog, including compound header segments. */\nexport function tableSortFields(columns: readonly TableColumn[]): TableSortField[] {\n const fields: TableSortField[] = [];\n const seen = new Set<string>();\n\n for (const column of columns) {\n if (isTableActionColumn(column) || !column.sortable) continue;\n const segments = column.headerSegments?.filter(segment => segment.sortKey.trim()) ?? [];\n if (segments.length > 0) {\n for (const segment of segments) {\n if (seen.has(segment.sortKey)) continue;\n seen.add(segment.sortKey);\n fields.push({\n id: segment.sortKey,\n label: segment.label.trim() || segment.sortKey,\n });\n }\n continue;\n }\n if (seen.has(column.id)) continue;\n seen.add(column.id);\n fields.push({\n id: column.id,\n label: column.header.trim() || column.headerLabel?.trim() || column.id,\n });\n }\n\n return fields;\n}\n\nexport function tableSortMenuSections(\n columns: readonly TableColumn[],\n sort: TableSortState | null | undefined\n): MenuSection[] {\n const fields = tableSortFields(columns);\n return [\n {\n header: 'Data',\n items: fields.map(field => ({\n label: field.label,\n value: `${TABLE_SORT_FIELD_PREFIX}${encodeURIComponent(field.id)}`,\n isSelected: sort?.columnId === field.id,\n })),\n },\n {\n header: 'Direction',\n items: [\n {\n label: 'Ascending',\n value: TABLE_SORT_DIRECTION_ASC,\n icon: 'ArrowUp',\n isSelected: sort?.direction === 'asc',\n },\n {\n label: 'Descending',\n value: TABLE_SORT_DIRECTION_DESC,\n icon: 'ArrowDown',\n isSelected: sort?.direction === 'desc',\n },\n ],\n },\n ];\n}\n\nexport function tableSortStatesEqual(\n left: TableSortState | null | undefined,\n right: TableSortState | null | undefined\n): boolean {\n if (left === right) return true;\n if (!left || !right) return false;\n return left.columnId === right.columnId && left.direction === right.direction;\n}\n\n/** Next controlled sort from a Sort menu selection. Does not toggle like a header click. */\nexport function nextTableSortStateFromMenuItem(\n columns: readonly TableColumn[],\n current: TableSortState | null | undefined,\n item: MenuItemData\n): TableSortState | null {\n const fields = tableSortFields(columns);\n if (fields.length === 0) return current ?? null;\n\n if (item.value === TABLE_SORT_DIRECTION_ASC || item.value === TABLE_SORT_DIRECTION_DESC) {\n const direction = item.value === TABLE_SORT_DIRECTION_ASC ? 'asc' : 'desc';\n const columnId = fields.some(field => field.id === current?.columnId)\n ? current!.columnId\n : fields[0]!.id;\n return { columnId, direction };\n }\n\n if (!item.value?.startsWith(TABLE_SORT_FIELD_PREFIX)) return current ?? null;\n let columnId: string;\n try {\n columnId = decodeURIComponent(item.value.slice(TABLE_SORT_FIELD_PREFIX.length));\n } catch {\n return current ?? null;\n }\n if (!fields.some(field => field.id === columnId)) return current ?? null;\n if (current?.columnId === columnId) return current ?? null;\n return { columnId, direction: current?.direction ?? 'asc' };\n}\n",
226
226
  "type": "registry:ui"
227
227
  }
228
228
  ]
@@ -28,7 +28,7 @@
28
28
  "component:ds-table-saved-views",
29
29
  "component:ds-divider",
30
30
  "component:ds-input",
31
- "component:ds-filter-menu",
31
+ "component:ds-table-filter",
32
32
  "component:ds-select",
33
33
  "component:ds-table-sort",
34
34
  "component:ds-button-unfilled"
@@ -40,25 +40,25 @@
40
40
  "Tab order follows authored DOM order. The toolbar does not add roving focus because it may contain heterogeneous form and popup controls."
41
41
  ],
42
42
  "states": [
43
- "The component owns layout only. Slotted controls, values, menus, loading, persistence, and consequences remain controlled by the application. Use ds-table-saved-views when saved-view interaction needs the shared CompoMo behavior while application storage remains external.",
43
+ "The component owns layout only. It never mutates slotted control props, values, menus, loading, persistence, or consequences. Use ds-table-saved-views and ds-table-filter when those interactions need the shared CompoMo behavior while application data and persistence remain external.",
44
44
  "The start cluster is followed by a decorative vertical divider, then the spanning middle region. The start cluster and divider hide when nothing is projected. Search is a dedicated slot that hides when nothing is projected. Empty leading or trailing clusters add no placeholder chrome. The middle region occupies remaining width so trailing controls stay at its inline end.",
45
45
  "Column customizer and data-mode switching stay table-owned caption actions. Do not recreate those menus in the toolbar."
46
46
  ],
47
47
  "responsiveBehavior": [
48
- "The start cluster, search, trailing Filter/Group/Sort, and table caption trailing actions stay on one line. Saved views, Filter, Group, and Sort triggers cap at the compact menu-width token and truncate their labels, keeping a saved-view dirty dot visible. Group and Sort popups keep that same compact menu-width floor. The toolbar horizontally scrolls when its complete controls no longer fit.",
49
- "Inside a named ds-table container narrower than 900px, Filter, Group, and Sort omit their labels and chevrons and become icon-only. Active filtering or grouping promotes the prefix icon to primary. Sort keeps resting secondary chrome. Table-owned Customize also becomes the icon-only Table menu button at that width.",
48
+ "The start cluster, search, trailing Filter/Group/Sort, and table caption trailing actions stay on one line. Saved views hug their current trigger content up to the compact menu-width token rather than reserving that full width; long names truncate while the dirty dot stays visible. Filter, Group, and Sort triggers cap at the same token, and Group and Sort popups keep that compact menu-width floor. The toolbar horizontally scrolls when its complete controls no longer fit.",
49
+ "Inside a named ds-table container narrower than 900px, ds-table-filter and ds-table-sort omit their labels and chevrons and become icon-only. Group controls explicitly opt into the same treatment with collapseLabel. Active filtering or grouping promotes the prefix icon to primary. Sort keeps resting secondary chrome. Table-owned Customize also becomes the icon-only Table menu button at that width.",
50
50
  "The scrollbar is visually suppressed without removing touch, trackpad, mouse-wheel, or keyboard scrolling from the overflow container.",
51
51
  "Trailing controls remain grouped after leading controls; the toolbar does not collapse controls into an application-specific overflow menu."
52
52
  ],
53
53
  "frameworkCaveats": {
54
54
  "customElements": [
55
- "Project saved views through slot=start, search through slot=search, additional left-side middle controls through slot=leading, and Filter, Group, and Sort through slot=trailing. Provide a label that names their table context when Table controls is insufficient."
55
+ "Project saved views through slot=start, search through slot=search, additional left-side middle controls through slot=leading, and ds-table-filter, Group, and ds-table-sort through slot=trailing. Set collapseLabel on the Group control and provide contextual accessible names when Table controls is insufficient."
56
56
  ],
57
57
  "react": [
58
- "Set slot=start, slot=search, slot=leading, or slot=trailing on each child control; keep values and event handlers in the application."
58
+ "Set slot=start, slot=search, slot=leading, or slot=trailing on each child control. Use ds-table-filter for the standard Filter recipe, opt Group into collapseLabel, and keep values and event handlers in the application."
59
59
  ],
60
60
  "angular": [
61
- "Set slot=start, slot=search, slot=leading, or slot=trailing on each child control and import the generated DsTableToolbar adapter alongside those controls."
61
+ "Set slot=start, slot=search, slot=leading, or slot=trailing on each child control, use DsTableFilter for the standard Filter recipe, opt Group into collapseLabel, and import the generated adapters."
62
62
  ]
63
63
  },
64
64
  "references": [
@@ -146,12 +146,12 @@
146
146
  "files": [
147
147
  {
148
148
  "path": "src/wc/components/TableToolbar/TableToolbar.css",
149
- "content": ":host {\n display: block;\n min-inline-size: 0;\n max-inline-size: 100%;\n}\n\n.table-toolbar {\n box-sizing: border-box;\n display: flex;\n align-items: center;\n inline-size: 100%;\n min-inline-size: 0;\n gap: var(--dimension-space-100);\n overflow-x: auto;\n overflow-y: hidden;\n scrollbar-width: none;\n}\n\n.table-toolbar::-webkit-scrollbar {\n display: none;\n}\n\n.table-toolbar__start,\n.table-toolbar__search,\n.table-toolbar__main,\n.table-toolbar__leading,\n.table-toolbar__trailing {\n display: flex;\n align-items: center;\n min-inline-size: 0;\n gap: var(--dimension-space-100);\n}\n\n.table-toolbar__start {\n flex: 0 1 var(--dimension-menu-width-xs);\n min-inline-size: 0;\n max-inline-size: var(--dimension-menu-width-xs);\n overflow: hidden;\n}\n\n.table-toolbar__rule {\n flex: 0 0 auto;\n}\n\n.table-toolbar__main {\n flex: 1 1 auto;\n min-inline-size: min-content;\n}\n\n.table-toolbar__search {\n flex: 0 1 var(--dimension-panel-width-xs);\n max-inline-size: var(--dimension-panel-width-xs);\n}\n\n:host(:not(:has([slot='search']))) .table-toolbar__search {\n display: none;\n}\n\n:host(:not(:has([slot='start']))) .table-toolbar__start,\n:host(:not(:has([slot='start']))) .table-toolbar__rule {\n display: none;\n}\n\n.table-toolbar__leading {\n flex: 1 0 auto;\n}\n\n.table-toolbar__trailing {\n flex: 0 0 auto;\n margin-inline-start: auto;\n}\n\n.table-toolbar__trailing > *,\n.table-toolbar [slot='start'],\n.table-toolbar ds-filter-menu,\n.table-toolbar ds-select,\n.table-toolbar ds-table-sort {\n min-inline-size: 0;\n max-inline-size: var(--dimension-menu-width-xs);\n --ds-choice-popup-min-inline-size: var(--dimension-menu-width-xs);\n}\n\n.table-toolbar__start slot,\n.table-toolbar__search slot,\n.table-toolbar__leading slot,\n.table-toolbar__trailing slot {\n display: contents;\n}\n",
149
+ "content": ":host {\n display: block;\n min-inline-size: 0;\n max-inline-size: 100%;\n}\n\n.table-toolbar {\n box-sizing: border-box;\n display: flex;\n align-items: center;\n inline-size: 100%;\n min-inline-size: 0;\n gap: var(--dimension-space-100);\n overflow-x: auto;\n overflow-y: hidden;\n scrollbar-width: none;\n}\n\n.table-toolbar::-webkit-scrollbar {\n display: none;\n}\n\n.table-toolbar__start,\n.table-toolbar__search,\n.table-toolbar__main,\n.table-toolbar__leading,\n.table-toolbar__trailing {\n display: flex;\n align-items: center;\n min-inline-size: 0;\n gap: var(--dimension-space-100);\n}\n\n.table-toolbar__start {\n flex: 0 0 auto;\n min-inline-size: 0;\n max-inline-size: var(--dimension-menu-width-xs);\n overflow: hidden;\n}\n\n.table-toolbar__rule {\n flex: 0 0 auto;\n}\n\n.table-toolbar__main {\n flex: 1 1 auto;\n min-inline-size: min-content;\n}\n\n.table-toolbar__search {\n flex: 0 1 var(--dimension-panel-width-xs);\n max-inline-size: var(--dimension-panel-width-xs);\n}\n\n:host(:not(:has([slot='search']))) .table-toolbar__search {\n display: none;\n}\n\n:host(:not(:has([slot='start']))) .table-toolbar__start,\n:host(:not(:has([slot='start']))) .table-toolbar__rule {\n display: none;\n}\n\n.table-toolbar__leading {\n flex: 1 0 auto;\n}\n\n.table-toolbar__trailing {\n flex: 0 0 auto;\n margin-inline-start: auto;\n}\n\n.table-toolbar__trailing > *,\n.table-toolbar [slot='start'],\n.table-toolbar ds-table-filter,\n.table-toolbar ds-filter-menu,\n.table-toolbar ds-select,\n.table-toolbar ds-table-sort {\n min-inline-size: 0;\n max-inline-size: var(--dimension-menu-width-xs);\n --ds-choice-popup-min-inline-size: var(--dimension-menu-width-xs);\n}\n\n.table-toolbar__start slot,\n.table-toolbar__search slot,\n.table-toolbar__leading slot,\n.table-toolbar__trailing slot {\n display: contents;\n}\n",
150
150
  "type": "registry:ui"
151
151
  },
152
152
  {
153
153
  "path": "src/wc/components/TableToolbar/TableToolbar.tsx",
154
- "content": "import { Component, Element, h, Host, Prop } from '@stencil/core';\n\nconst CAPTION_CONTROL_SELECTOR = 'ds-filter-menu, ds-select';\n\n@Component({\n tag: 'ds-table-toolbar',\n styleUrl: 'TableToolbar.css',\n scoped: true,\n})\nexport class TableToolbar {\n @Element() private el!: HTMLElement;\n\n /** Accessible name for the grouped table controls. */\n @Prop() label: string = 'Table controls';\n\n private captionControlObserver: MutationObserver | undefined;\n\n componentDidLoad(): void {\n this.connectCaptionControlObserver();\n }\n\n disconnectedCallback(): void {\n this.captionControlObserver?.disconnect();\n }\n\n render() {\n return (\n <Host>\n <div class=\"table-toolbar\" role=\"toolbar\" aria-label={this.label}>\n <div class=\"table-toolbar__start\">\n <slot name=\"start\" />\n </div>\n <ds-divider class=\"table-toolbar__rule\" orientation=\"vertical\" length=\"32px\" />\n <div class=\"table-toolbar__main\">\n <div class=\"table-toolbar__search\">\n <slot name=\"search\" />\n </div>\n <div class=\"table-toolbar__leading\">\n <slot name=\"leading\" />\n </div>\n <div class=\"table-toolbar__trailing\">\n <slot name=\"trailing\" />\n </div>\n </div>\n </div>\n </Host>\n );\n }\n\n private connectCaptionControlObserver(): void {\n if (this.captionControlObserver || typeof MutationObserver === 'undefined') return;\n this.captionControlObserver = new MutationObserver(this.syncCaptionControls);\n this.captionControlObserver.observe(this.el, { childList: true, subtree: true });\n this.syncCaptionControls();\n }\n\n private syncCaptionControls = () => {\n for (const control of this.el.querySelectorAll<\n HTMLElement & { collapseLabel?: boolean }\n >(CAPTION_CONTROL_SELECTOR)) {\n if (control.closest('ds-table-saved-views')) continue;\n if (control.collapseLabel) continue;\n control.collapseLabel = true;\n }\n };\n}\n",
154
+ "content": "import { Component, h, Host, Prop } from '@stencil/core';\n\n@Component({\n tag: 'ds-table-toolbar',\n styleUrl: 'TableToolbar.css',\n scoped: true,\n})\nexport class TableToolbar {\n /** Accessible name for the grouped table controls. */\n @Prop() label: string = 'Table controls';\n\n render() {\n return (\n <Host>\n <div class=\"table-toolbar\" role=\"toolbar\" aria-label={this.label}>\n <div class=\"table-toolbar__start\">\n <slot name=\"start\" />\n </div>\n <ds-divider class=\"table-toolbar__rule\" orientation=\"vertical\" length=\"32px\" />\n <div class=\"table-toolbar__main\">\n <div class=\"table-toolbar__search\">\n <slot name=\"search\" />\n </div>\n <div class=\"table-toolbar__leading\">\n <slot name=\"leading\" />\n </div>\n <div class=\"table-toolbar__trailing\">\n <slot name=\"trailing\" />\n </div>\n </div>\n </div>\n </Host>\n );\n }\n}\n",
155
155
  "type": "registry:ui"
156
156
  }
157
157
  ]
@@ -32,6 +32,7 @@
32
32
  "component:ds-pagination",
33
33
  "component:ds-table-toolbar",
34
34
  "component:ds-table-saved-views",
35
+ "component:ds-table-filter",
35
36
  "component:ds-table-sort",
36
37
  "component:ds-bar-action",
37
38
  "component:ds-button-unfilled",
@@ -66,6 +66,7 @@ export { DsSlider } from "./ds-slider.js";
66
66
  export { DsSwatchPicker } from "./ds-swatch-picker.js";
67
67
  export { DsSwitch } from "./ds-switch.js";
68
68
  export { DsTabGroup } from "./ds-tab-group.js";
69
+ export { DsTableFilter } from "./ds-table-filter.js";
69
70
  export { DsTableSavedViews } from "./ds-table-saved-views.js";
70
71
  export { DsTableSort } from "./ds-table-sort.js";
71
72
  export { DsTableToolbar } from "./ds-table-toolbar.js";
@@ -67,6 +67,7 @@ export { DsSlider } from "./ds-slider.js";
67
67
  export { DsSwatchPicker } from "./ds-swatch-picker.js";
68
68
  export { DsSwitch } from "./ds-switch.js";
69
69
  export { DsTabGroup } from "./ds-tab-group.js";
70
+ export { DsTableFilter } from "./ds-table-filter.js";
70
71
  export { DsTableSavedViews } from "./ds-table-saved-views.js";
71
72
  export { DsTableSort } from "./ds-table-sort.js";
72
73
  export { DsTableToolbar } from "./ds-table-toolbar.js";
@@ -0,0 +1,17 @@
1
+ /**
2
+ * This file was automatically generated by the Stencil React Output Target.
3
+ * Changes to this file may cause incorrect behavior and will be lost if the code is regenerated.
4
+ */
5
+ import type { EventName, StencilReactComponent } from './react-runtime.js';
6
+ import { type DsTableFilterCustomEvent, type FilterMenuChangeDetail } from "@ds-mo/ui";
7
+ import type { Components } from "@ds-mo/ui/dist/components";
8
+ import { DsTableFilter as DsTableFilterElement } from "@ds-mo/ui/dist/components/ds-table-filter.js";
9
+ export type DsTableFilterEvents = {
10
+ onDsChange: EventName<DsTableFilterCustomEvent<FilterMenuChangeDetail>>;
11
+ onDsClear: EventName<DsTableFilterCustomEvent<void>>;
12
+ onDsActiveFilterChange: EventName<DsTableFilterCustomEvent<string>>;
13
+ onDsClose: EventName<DsTableFilterCustomEvent<void>>;
14
+ onDsOpenChange: EventName<DsTableFilterCustomEvent<boolean>>;
15
+ onDsAfterClose: EventName<DsTableFilterCustomEvent<void>>;
16
+ };
17
+ export declare const DsTableFilter: StencilReactComponent<DsTableFilterElement, DsTableFilterEvents, Components.DsTableFilter>;
@@ -0,0 +1,19 @@
1
+ 'use client';
2
+ import { createComponent } from './react-runtime.js';
3
+ import React from 'react';
4
+ import { DsTableFilter as DsTableFilterElement, defineCustomElement as defineDsTableFilter } from "@ds-mo/ui/dist/components/ds-table-filter.js";
5
+ export const DsTableFilter = /*@__PURE__*/ createComponent({
6
+ tagName: 'ds-table-filter',
7
+ elementClass: DsTableFilterElement,
8
+ // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project.
9
+ react: React,
10
+ events: {
11
+ onDsChange: 'dsChange',
12
+ onDsClear: 'dsClear',
13
+ onDsActiveFilterChange: 'dsActiveFilterChange',
14
+ onDsClose: 'dsClose',
15
+ onDsOpenChange: 'dsOpenChange',
16
+ onDsAfterClose: 'dsAfterClose'
17
+ },
18
+ defineCustomElement: defineDsTableFilter
19
+ });
@@ -100,7 +100,9 @@ export declare class ButtonUnfilled {
100
100
  private captionCompact;
101
101
  private buttonEl;
102
102
  private captionCompactDisconnect;
103
+ private hasLoaded;
103
104
  componentDidLoad(): void;
105
+ connectedCallback(): void;
104
106
  disconnectedCallback(): void;
105
107
  onCollapseLabelChange(): void;
106
108
  setFocus(): Promise<void>;
@@ -104,9 +104,11 @@ export declare class FilterMenu {
104
104
  private pendingInitialFocusVisible;
105
105
  private closeTimer;
106
106
  private captionCompactDisconnect;
107
+ private hasLoaded;
107
108
  private closingSnapshot;
108
109
  private readonly position;
109
110
  componentDidLoad(): void;
111
+ connectedCallback(): void;
110
112
  disconnectedCallback(): void;
111
113
  onCollapseLabelChange(): void;
112
114
  onOpenChange(isOpen: boolean): void;
@@ -133,9 +133,11 @@ export declare class Select {
133
133
  private observedFooterContentElement?;
134
134
  private footerMeasurementFrame?;
135
135
  private captionCompactDisconnect;
136
+ private hasLoaded;
136
137
  private createController;
137
138
  componentWillLoad(): void;
138
139
  componentDidLoad(): void;
140
+ connectedCallback(): void;
139
141
  componentDidRender(): void;
140
142
  disconnectedCallback(): void;
141
143
  onCollapseLabelChange(): void;