@ds-mo/ui 13.17.0 → 13.18.1

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 (236) hide show
  1. package/dist/.package-ready.json +1 -1
  2. package/dist/agent-patterns.json +2 -2
  3. package/dist/agent.json +274 -25
  4. package/dist/angular/ds-filter-menu.d.ts +44 -0
  5. package/dist/angular/ds-filter-menu.js +57 -0
  6. package/dist/angular/ds-select.d.ts +12 -1
  7. package/dist/angular/ds-select.js +10 -4
  8. package/dist/angular/ds-table.d.ts +1 -4
  9. package/dist/angular/ds-table.js +2 -5
  10. package/dist/angular/index.d.ts +1 -1
  11. package/dist/angular/index.js +1 -0
  12. package/dist/angular/proxies.d.ts +1 -0
  13. package/dist/angular/proxies.js +1 -0
  14. package/dist/components/ds-agent-activity.js +1 -1
  15. package/dist/components/ds-agent-questionnaire.js +1 -1
  16. package/dist/components/ds-agent-response.js +1 -1
  17. package/dist/components/ds-agent-source-list.js +1 -1
  18. package/dist/components/ds-agent-tool-call.js +1 -1
  19. package/dist/components/ds-attachment-list.js +1 -1
  20. package/dist/components/ds-badge.js +1 -1
  21. package/dist/components/ds-banner.js +1 -1
  22. package/dist/components/ds-bar-nav.js +1 -1
  23. package/dist/components/ds-bar-title.js +1 -1
  24. package/dist/components/ds-bar-workflow.js +1 -1
  25. package/dist/components/ds-bar-workflow.js.map +1 -1
  26. package/dist/components/ds-breadcrumb.js +1 -1
  27. package/dist/components/ds-button-filled.js +1 -1
  28. package/dist/components/ds-button-unfilled.js +1 -1
  29. package/dist/components/ds-card-chart.js +1 -1
  30. package/dist/components/ds-card-overview.js +1 -1
  31. package/dist/components/ds-card-overview.js.map +1 -1
  32. package/dist/components/ds-card-setting.js +1 -1
  33. package/dist/components/ds-chart-legend.js +1 -1
  34. package/dist/components/ds-chart.js +1 -1
  35. package/dist/components/ds-checkbox.js +1 -1
  36. package/dist/components/ds-chip.js +1 -1
  37. package/dist/components/ds-code-block.js +1 -1
  38. package/dist/components/ds-conversation-list-item.js +1 -1
  39. package/dist/components/ds-conversation-list-item.js.map +1 -1
  40. package/dist/components/ds-conversation-list-section.js +1 -1
  41. package/dist/components/ds-empty-state.js +1 -1
  42. package/dist/components/ds-field.js +1 -1
  43. package/dist/components/ds-filter-menu.d.ts +11 -0
  44. package/dist/components/ds-filter-menu.js +2 -0
  45. package/dist/components/ds-filter-menu.js.map +1 -0
  46. package/dist/components/ds-input.js +1 -1
  47. package/dist/components/ds-input.js.map +1 -1
  48. package/dist/components/ds-markdown.js +1 -1
  49. package/dist/components/ds-menu.js +1 -1
  50. package/dist/components/ds-message-actions.js +1 -1
  51. package/dist/components/ds-message-bubble.js +1 -1
  52. package/dist/components/ds-message-composer.js +1 -1
  53. package/dist/components/ds-message-scroller.js +1 -1
  54. package/dist/components/ds-message.js +1 -1
  55. package/dist/components/ds-mobile-bar-nav.js +1 -1
  56. package/dist/components/ds-mobile-header.js +1 -1
  57. package/dist/components/ds-mobile-section-switcher.js +1 -1
  58. package/dist/components/ds-mobile-sheet-nav.js +1 -1
  59. package/dist/components/ds-modal.js +1 -1
  60. package/dist/components/ds-modal.js.map +1 -1
  61. package/dist/components/ds-panel-nav.js +1 -1
  62. package/dist/components/ds-panel-sub-nav.js +1 -1
  63. package/dist/components/ds-panel-tool-header.js +1 -1
  64. package/dist/components/ds-panel-tool-search.js +1 -1
  65. package/dist/components/ds-panel-tools.js +1 -1
  66. package/dist/components/ds-radio.js +1 -1
  67. package/dist/components/ds-scroll-overlay.js +1 -1
  68. package/dist/components/ds-select.js +1 -1
  69. package/dist/components/ds-select.js.map +1 -1
  70. package/dist/components/ds-shell-app.js +1 -1
  71. package/dist/components/ds-shell-app.js.map +1 -1
  72. package/dist/components/ds-shell-page.js +1 -1
  73. package/dist/components/ds-shell-tools.js +1 -1
  74. package/dist/components/ds-skeleton.js +1 -1
  75. package/dist/components/ds-slider.js +1 -1
  76. package/dist/components/ds-swatch-picker.js +1 -1
  77. package/dist/components/ds-switch.js +1 -1
  78. package/dist/components/ds-tab-group.js +1 -1
  79. package/dist/components/ds-table.js +1 -1
  80. package/dist/components/ds-table.js.map +1 -1
  81. package/dist/components/ds-tag.js +1 -1
  82. package/dist/components/ds-text.js +1 -1
  83. package/dist/components/ds-toast.js +1 -1
  84. package/dist/components/ds-tooltip-chart.js +1 -1
  85. package/dist/components/ds-tooltip.js +1 -1
  86. package/dist/components/ds-typing-indicator.js +1 -1
  87. package/dist/components/p-B-CVaYE6.js +2 -0
  88. package/dist/components/{p-D9FdOR_m.js.map → p-B-CVaYE6.js.map} +1 -1
  89. package/dist/components/p-BAgjMUt3.js +2 -0
  90. package/dist/components/p-BAgjMUt3.js.map +1 -0
  91. package/dist/components/{p-CdKz-QT2.js → p-BCfgU8Fh.js} +2 -2
  92. package/dist/components/{p-CsXC1cHI.js → p-BDsAON4I.js} +2 -2
  93. package/dist/components/{p-GWUTrIlk.js → p-BOCrvs-v.js} +2 -2
  94. package/dist/components/{p-B69Re7HW.js → p-BOjGzd5N.js} +2 -2
  95. package/dist/components/{p-BAAjiAIF.js → p-BQkZ8FIl.js} +2 -2
  96. package/dist/components/p-BUAJ5TD7.js +2 -0
  97. package/dist/components/p-BUAJ5TD7.js.map +1 -0
  98. package/dist/components/p-BaiGt_o6.js +2 -0
  99. package/dist/components/{p-D4jQy3Ps.js.map → p-BaiGt_o6.js.map} +1 -1
  100. package/dist/components/p-BhOjnMLG.js +2 -0
  101. package/dist/components/p-BhOjnMLG.js.map +1 -0
  102. package/dist/components/p-BqFKxWVl.js +2 -0
  103. package/dist/components/p-BqFKxWVl.js.map +1 -0
  104. package/dist/components/p-ByNAXs5X.js +2 -0
  105. package/dist/components/p-ByNAXs5X.js.map +1 -0
  106. package/dist/components/p-C25Nmifd.js +2 -0
  107. package/dist/components/{p-m5CSrx_s.js.map → p-C25Nmifd.js.map} +1 -1
  108. package/dist/components/{p-00or0yGw.js → p-C7ywYAzN.js} +2 -2
  109. package/dist/components/p-CBTGKnIy.js +2 -0
  110. package/dist/components/{p-B94M62Tx.js.map → p-CBTGKnIy.js.map} +1 -1
  111. package/dist/components/{p-Dbobj7DI.js → p-CXYjqJwC.js} +2 -2
  112. package/dist/components/{p-D4j0deyd.js → p-C_tqXl5P.js} +2 -2
  113. package/dist/components/{p-CnIvWEVm.js → p-Ca0npbVt.js} +2 -2
  114. package/dist/components/p-ChGkNsWu.js +2 -0
  115. package/dist/components/p-ChGkNsWu.js.map +1 -0
  116. package/dist/components/p-CswBI711.js +2 -0
  117. package/dist/components/{p-CnUq7E8S.js.map → p-CswBI711.js.map} +1 -1
  118. package/dist/components/p-CtSxm6PI.js +2 -0
  119. package/dist/components/{p-DyqLVdJp.js.map → p-CtSxm6PI.js.map} +1 -1
  120. package/dist/components/p-D0-VdNjl.js +2 -0
  121. package/dist/components/{p-BMAZWEDa.js.map → p-D0-VdNjl.js.map} +1 -1
  122. package/dist/components/{p-dEouiXJ8.js → p-D8nnhQNJ.js} +2 -2
  123. package/dist/components/{p-D4AfoIu6.js → p-DGhSz9Fo.js} +2 -2
  124. package/dist/components/{p-DStd98dM.js → p-DGvAZk-D.js} +2 -2
  125. package/dist/components/p-DGvAZk-D.js.map +1 -0
  126. package/dist/components/p-DQK2ZH60.js +2 -0
  127. package/dist/components/{p-D5sIwLjA.js.map → p-DQK2ZH60.js.map} +1 -1
  128. package/dist/components/p-DTMxwYQj.js +2 -0
  129. package/dist/components/{p-B2SoinWf.js.map → p-DTMxwYQj.js.map} +1 -1
  130. package/dist/components/{p-C891ueIx.js → p-DYoCb_sj.js} +2 -2
  131. package/dist/components/{p-Dhx_3_tf.js → p-DZFilC--.js} +2 -2
  132. package/dist/components/p-DZFilC--.js.map +1 -0
  133. package/dist/components/{p-GbTasczF.js → p-Dcnd5ZX5.js} +2 -2
  134. package/dist/components/{p-BRze4tRe.js → p-DeBto13S.js} +2 -2
  135. package/dist/components/p-NdahPypA.js +2 -0
  136. package/dist/components/p-NdahPypA.js.map +1 -0
  137. package/dist/components/{p-CqDJRVT8.js → p-NzOcZg8r.js} +2 -2
  138. package/dist/components/p-PzI11fs8.js +2 -0
  139. package/dist/components/p-PzI11fs8.js.map +1 -0
  140. package/dist/components/{p-Cohb8T7G.js → p-QdI17bl-.js} +2 -2
  141. package/dist/components/{p-chA2WA5x.js → p-Qzh-wyTg.js} +2 -2
  142. package/dist/components/{p-DrvEhJhO.js → p-eu5AZEuT.js} +2 -2
  143. package/dist/components/{p-Qf-os3lG.js → p-oyZjjoYV.js} +2 -2
  144. package/dist/components/p-tR8INOIN.js +2 -0
  145. package/dist/components/p-tR8INOIN.js.map +1 -0
  146. package/dist/docs/components.json +1294 -114
  147. package/dist/lib/utils/choice-list.d.ts +10 -0
  148. package/dist/lib/utils/index.js +4 -1
  149. package/dist/lib/utils/index.js.map +2 -2
  150. package/dist/lib/utils/token-defaults.d.ts +2 -0
  151. package/dist/mcp-data/registry/agent-source-list.json +2 -2
  152. package/dist/mcp-data/registry/bar-nav.json +2 -2
  153. package/dist/mcp-data/registry/breadcrumb.json +2 -2
  154. package/dist/mcp-data/registry/button-unfilled.json +6 -6
  155. package/dist/mcp-data/registry/filter-menu.json +644 -0
  156. package/dist/mcp-data/registry/menu.json +11 -8
  157. package/dist/mcp-data/registry/modal.json +3 -3
  158. package/dist/mcp-data/registry/panel-tool-header.json +1 -1
  159. package/dist/mcp-data/registry/registry.json +276 -24
  160. package/dist/mcp-data/registry/select.json +132 -7
  161. package/dist/mcp-data/registry/shell-app.json +1 -1
  162. package/dist/mcp-data/registry/shell-tools.json +1 -1
  163. package/dist/mcp-data/registry/table.json +12 -26
  164. package/dist/mcp-data/registry/text.json +2 -2
  165. package/dist/react/components.d.ts +1 -0
  166. package/dist/react/components.js +1 -0
  167. package/dist/react/ds-filter-menu.d.ts +17 -0
  168. package/dist/react/ds-filter-menu.js +19 -0
  169. package/dist/react/ds-select.d.ts +3 -1
  170. package/dist/react/ds-select.js +3 -1
  171. package/dist/react/ds-table.d.ts +1 -2
  172. package/dist/react/ds-table.js +0 -1
  173. package/dist/styles/prose.css +19 -3
  174. package/dist/styles/table.css +7 -5
  175. package/dist/types/components/ButtonUnfilled/ButtonUnfilled.d.ts +2 -2
  176. package/dist/types/components/FilterMenu/FilterMenu.d.ts +137 -0
  177. package/dist/types/components/Menu/Menu.d.ts +1 -1
  178. package/dist/types/components/Menu/menu-types.d.ts +9 -0
  179. package/dist/types/components/Modal/Modal.d.ts +1 -0
  180. package/dist/types/components/Select/Select.d.ts +34 -0
  181. package/dist/types/components/Table/Table.d.ts +2 -3
  182. package/dist/types/components/Table/index.d.ts +1 -1
  183. package/dist/types/components/Table/table-model.d.ts +1 -2
  184. package/dist/types/components/Table/table-types.d.ts +1 -4
  185. package/dist/types/components.d.ts +374 -10
  186. package/dist/types/utils/choice-list-parts.d.ts +17 -0
  187. package/dist/types/utils/choice-list.d.ts +10 -0
  188. package/dist/types/utils/select-controller.d.ts +2 -0
  189. package/dist/types/utils/token-defaults.d.ts +2 -0
  190. package/package.json +2 -1
  191. package/dist/components/p-B2SoinWf.js +0 -2
  192. package/dist/components/p-B53Vpuqq.js +0 -2
  193. package/dist/components/p-B53Vpuqq.js.map +0 -1
  194. package/dist/components/p-B94M62Tx.js +0 -2
  195. package/dist/components/p-BMAZWEDa.js +0 -2
  196. package/dist/components/p-BtUgncSJ.js +0 -2
  197. package/dist/components/p-BtUgncSJ.js.map +0 -1
  198. package/dist/components/p-CMbcRN92.js +0 -2
  199. package/dist/components/p-CMbcRN92.js.map +0 -1
  200. package/dist/components/p-CXduurfd.js +0 -2
  201. package/dist/components/p-CXduurfd.js.map +0 -1
  202. package/dist/components/p-CnUq7E8S.js +0 -2
  203. package/dist/components/p-D4jQy3Ps.js +0 -2
  204. package/dist/components/p-D5sIwLjA.js +0 -2
  205. package/dist/components/p-D9CDoQBx.js +0 -2
  206. package/dist/components/p-D9CDoQBx.js.map +0 -1
  207. package/dist/components/p-D9FdOR_m.js +0 -2
  208. package/dist/components/p-DO5-fplZ.js +0 -2
  209. package/dist/components/p-DO5-fplZ.js.map +0 -1
  210. package/dist/components/p-DStd98dM.js.map +0 -1
  211. package/dist/components/p-Dhx_3_tf.js.map +0 -1
  212. package/dist/components/p-DyqLVdJp.js +0 -2
  213. package/dist/components/p-NQOI5gN1.js +0 -2
  214. package/dist/components/p-NQOI5gN1.js.map +0 -1
  215. package/dist/components/p-m5CSrx_s.js +0 -2
  216. package/dist/components/p-ymtdhOU5.js +0 -2
  217. package/dist/components/p-ymtdhOU5.js.map +0 -1
  218. /package/dist/components/{p-CdKz-QT2.js.map → p-BCfgU8Fh.js.map} +0 -0
  219. /package/dist/components/{p-CsXC1cHI.js.map → p-BDsAON4I.js.map} +0 -0
  220. /package/dist/components/{p-GWUTrIlk.js.map → p-BOCrvs-v.js.map} +0 -0
  221. /package/dist/components/{p-B69Re7HW.js.map → p-BOjGzd5N.js.map} +0 -0
  222. /package/dist/components/{p-BAAjiAIF.js.map → p-BQkZ8FIl.js.map} +0 -0
  223. /package/dist/components/{p-00or0yGw.js.map → p-C7ywYAzN.js.map} +0 -0
  224. /package/dist/components/{p-Dbobj7DI.js.map → p-CXYjqJwC.js.map} +0 -0
  225. /package/dist/components/{p-D4j0deyd.js.map → p-C_tqXl5P.js.map} +0 -0
  226. /package/dist/components/{p-CnIvWEVm.js.map → p-Ca0npbVt.js.map} +0 -0
  227. /package/dist/components/{p-dEouiXJ8.js.map → p-D8nnhQNJ.js.map} +0 -0
  228. /package/dist/components/{p-D4AfoIu6.js.map → p-DGhSz9Fo.js.map} +0 -0
  229. /package/dist/components/{p-C891ueIx.js.map → p-DYoCb_sj.js.map} +0 -0
  230. /package/dist/components/{p-GbTasczF.js.map → p-Dcnd5ZX5.js.map} +0 -0
  231. /package/dist/components/{p-BRze4tRe.js.map → p-DeBto13S.js.map} +0 -0
  232. /package/dist/components/{p-CqDJRVT8.js.map → p-NzOcZg8r.js.map} +0 -0
  233. /package/dist/components/{p-Cohb8T7G.js.map → p-QdI17bl-.js.map} +0 -0
  234. /package/dist/components/{p-chA2WA5x.js.map → p-Qzh-wyTg.js.map} +0 -0
  235. /package/dist/components/{p-DrvEhJhO.js.map → p-eu5AZEuT.js.map} +0 -0
  236. /package/dist/components/{p-Qf-os3lG.js.map → p-oyZjjoYV.js.map} +0 -0
@@ -1 +1 @@
1
- {"schemaVersion":1,"package":"@ds-mo/ui","version":"13.17.0","components":67,"digest":"a6c128fce85797535428b952be8a688c63b0428cd08a7d397bc6f55efa69fc1b","completedAt":"2026-08-13T04:50:27.513Z"}
1
+ {"schemaVersion":1,"package":"@ds-mo/ui","version":"13.18.1","components":68,"digest":"943b777548a2aff51ce6f378f3ab2c9d6b138fa96024c36c4bb53c348321babd","completedAt":"2026-08-14T02:46:41.912Z"}
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schemaVersion": "1.0.0",
3
3
  "package": "@ds-mo/ui",
4
- "packageVersion": "13.17.0",
4
+ "packageVersion": "13.18.1",
5
5
  "kind": "patterns",
6
6
  "entries": [
7
7
  {
@@ -449,7 +449,7 @@
449
449
  "stateOwnership": [
450
450
  "The application owns the selected command or view value and derives the trigger label and each item's isSelected state from it.",
451
451
  "The application synchronizes one open boolean to the trigger's expanded prop and Menu.open.",
452
- "An open popup is a transient pressed state, not a selected one. The trigger holds its pressed wash for the popup's rendered lifecycle from expanded alone, so never also set isActive to represent an open menu.",
452
+ "An open popup is a transient pressed state, not a selected one. The trigger holds only its pressed wash for the popup's rendered lifecycle from expanded alone, without changing foreground, so never also set isActive to represent an open menu.",
453
453
  "Menu owns popup placement and keyboard navigation; the application never calculates popup coordinates or applies positional CSS.",
454
454
  "On dsSelect, update the selected value, close the Menu, and restore focus to the trigger.",
455
455
  "On dsClose, synchronize the application open state to false."
package/dist/agent.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schemaVersion": "1.0.0",
3
3
  "package": "@ds-mo/ui",
4
- "packageVersion": "13.17.0",
4
+ "packageVersion": "13.18.1",
5
5
  "kind": "components",
6
6
  "entries": [
7
7
  {
@@ -1828,7 +1828,7 @@
1828
1828
  ],
1829
1829
  "accessibility": [
1830
1830
  "Provide an explicit accessible name for every icon-only action.",
1831
- "Set hasMenu when the button triggers a Menu; it implies aria-haspopup of menu. Pass controls with the Menu id and expanded from the same open state given to Menu. Expanded popup triggers hold the pressed visual while open; expanded disclosure controls without popup semantics retain the normal resting appearance.",
1831
+ "Set hasMenu when the button triggers a Menu; it implies aria-haspopup of menu. Pass controls with the Menu id and expanded from the same open state given to Menu. Expanded popup triggers hold only the pressed wash while open, without changing their resting foreground; expanded disclosure controls without popup semantics retain the normal resting appearance.",
1832
1832
  "Give an icon-only menu button an accessible name that states the role, such as More options, because no visible label or chevron carries it.",
1833
1833
  "Use haspopup directly for a non-menu popup such as a listbox or dialog; those cases get no chevron.",
1834
1834
  "Use pressed only for a genuine toggle button; it supplies aria-pressed and dsChange intent. Use isActive only for owner-controlled visual emphasis inside a composite whose selection semantics live on the owner.",
@@ -1851,7 +1851,7 @@
1851
1851
  "Icon and icon-label loading replace the icon in place. Label-only loading centers the loader while preserving the button's measured width.",
1852
1852
  "hasMenu covers two distinct menu-button shapes and the variant selects between them. With label or icon-label the action has a menu, and a trailing chevron carries the affordance. With icon the button is a menu, meaning the overflow or more-options control, and no chevron is added.",
1853
1853
  "Because the icon-only shape has no chevron, its glyph must convey the menu on its own; use Ellipses. Never pair hasMenu with an icon-only glyph that does not read as a menu.",
1854
- "An open popup is a transient pressed state rather than a selected one. While expanded is true and haspopup or hasMenu identifies a popup, the pressed wash is held for the popup's complete rendered lifecycle and survives hover, including when chrome opts out of selected fills with activeFill set to false. Expanded disclosure buttons without popup semantics remain visually neutral."
1854
+ "An open popup is a transient pressed state rather than a selected one. While expanded is true and haspopup or hasMenu identifies a popup, the pressed wash is held for the popup's complete rendered lifecycle and survives hover without promoting foreground or selected fill, including when chrome opts out of selected fills with activeFill set to false. Expanded disclosure buttons without popup semantics remain visually neutral."
1855
1855
  ],
1856
1856
  "responsiveBehavior": [
1857
1857
  "The consuming layout decides when an icon-label action becomes icon-only and must provide an explicit accessible name after changing variants.",
@@ -3624,6 +3624,221 @@
3624
3624
  "text"
3625
3625
  ]
3626
3626
  },
3627
+ {
3628
+ "id": "component:ds-filter-menu",
3629
+ "tag": "ds-filter-menu",
3630
+ "name": "filter-menu",
3631
+ "title": "FilterMenu",
3632
+ "summary": "Controlled two-pane filter select with menu-recipe category navigation, single- and multiple-choice, boolean, and date filters, selected counts, and a clear action.",
3633
+ "intentStatus": "complete",
3634
+ "intent": {
3635
+ "audience": "general",
3636
+ "status": "stable",
3637
+ "summary": "Controlled two-pane filter select with menu-recipe category navigation, single- and multiple-choice, boolean, and date filters, selected counts, and a clear action.",
3638
+ "useWhen": [
3639
+ "A compact trigger must expose several filter families without turning the toolbar into many separate controls.",
3640
+ "Users need to move between persistent filter categories while editing the selected category in a second pane."
3641
+ ],
3642
+ "avoidWhen": [
3643
+ "The user is selecting one form value; use Select.",
3644
+ "The popup contains contextual commands rather than filtering controls; use Menu.",
3645
+ "The workflow requires confirmation or several ordered steps; use Modal."
3646
+ ],
3647
+ "alternatives": [
3648
+ {
3649
+ "when": "One known value is selected for a form field.",
3650
+ "component": "component:ds-select",
3651
+ "reason": "Select owns compact form-value and listbox semantics."
3652
+ },
3653
+ {
3654
+ "when": "A trigger reveals commands or row actions.",
3655
+ "component": "component:ds-menu",
3656
+ "reason": "Menu provides the appropriate action-menu semantics and keyboard model."
3657
+ }
3658
+ ],
3659
+ "commonlyComposedWith": [
3660
+ "component:ds-select",
3661
+ "component:ds-table",
3662
+ "component:ds-checkbox"
3663
+ ],
3664
+ "accessibility": [
3665
+ "The built-in select trigger exposes combobox semantics with a dialog popup, synchronizes expanded state, holds the pressed interaction wash without changing resting foreground while open, and restores focus after dismissal.",
3666
+ "The category pane is a vertical tab list. Arrow Up and Arrow Down wrap, Home and End jump, Arrow Right enters the option pane, and Arrow Left returns to the active category.",
3667
+ "Escape and outside activation close the popup and restore trigger focus. Tab moves through option controls and closes only when it leaves the popup boundary.",
3668
+ "The trigger count reports active filter categories. Category counts and the footer report individual selected criteria; none replace visible selected-state indication."
3669
+ ],
3670
+ "states": [
3671
+ "The application owns filters, values, activeFilterId, and open. Replace controlled objects and arrays after dsChange, dsActiveFilterChange, dsClear, or dsClose.",
3672
+ "Single filters return a string, multiple filters return ordered string arrays, boolean filters return a boolean, and date filters return a YYYY-MM-DD string.",
3673
+ "Selection applies immediately and does not close the popup.",
3674
+ "Changing category replaces the option-pane subtree so checkbox and other option visuals mount in their new state instead of transitioning from the previous category's row state.",
3675
+ "The trigger reports how many filter categories have selections, while the footer appears when values are selected and reports the total selected criteria."
3676
+ ],
3677
+ "responsiveBehavior": [
3678
+ "The popup defaults to the large menu-width token and clamps to the viewport.",
3679
+ "Both panes remain visible at narrow widths, with a smaller category minimum and reduced option-pane padding.",
3680
+ "Treat side as preferred placement; the popup flips and clamps when viewport collision requires it."
3681
+ ],
3682
+ "frameworkCaveats": {
3683
+ "customElements": [
3684
+ "Assign filters and values as JavaScript properties after the element is defined."
3685
+ ],
3686
+ "react": [
3687
+ "Pass filters and values as controlled props and handle onDsChange, onDsActiveFilterChange, onDsClear, and onDsClose."
3688
+ ],
3689
+ "angular": [
3690
+ "Use property bindings for filters and values and event bindings for dsChange, dsActiveFilterChange, dsClear, and dsClose."
3691
+ ]
3692
+ },
3693
+ "references": [
3694
+ {
3695
+ "label": "Storybook example",
3696
+ "path": "src/wc/components/FilterMenu/FilterMenu.stories.ts"
3697
+ }
3698
+ ]
3699
+ },
3700
+ "api": {
3701
+ "props": {
3702
+ "activeFill": {
3703
+ "type": "boolean",
3704
+ "required": false
3705
+ },
3706
+ "activeFilterId": {
3707
+ "type": "string | undefined",
3708
+ "required": false
3709
+ },
3710
+ "align": {
3711
+ "type": "AnchoredAlign",
3712
+ "required": false
3713
+ },
3714
+ "alignOffset": {
3715
+ "type": "number | string",
3716
+ "required": false
3717
+ },
3718
+ "anchor": {
3719
+ "type": "HTMLElement | undefined",
3720
+ "required": false
3721
+ },
3722
+ "anchorId": {
3723
+ "type": "string | undefined",
3724
+ "required": false
3725
+ },
3726
+ "ariaLabel": {
3727
+ "type": "string | null",
3728
+ "required": false
3729
+ },
3730
+ "categoriesLabel": {
3731
+ "type": "string",
3732
+ "required": false
3733
+ },
3734
+ "clearLabel": {
3735
+ "type": "string",
3736
+ "required": false
3737
+ },
3738
+ "filters": {
3739
+ "type": "FilterMenuFilter[]",
3740
+ "required": false
3741
+ },
3742
+ "hasBorder": {
3743
+ "type": "boolean",
3744
+ "required": false
3745
+ },
3746
+ "icon": {
3747
+ "type": "string | undefined",
3748
+ "required": false
3749
+ },
3750
+ "initialFocusVisible": {
3751
+ "type": "boolean",
3752
+ "required": false
3753
+ },
3754
+ "inputId": {
3755
+ "type": "string | undefined",
3756
+ "required": false
3757
+ },
3758
+ "menuLabel": {
3759
+ "type": "string",
3760
+ "required": false
3761
+ },
3762
+ "menuWidth": {
3763
+ "type": "string",
3764
+ "required": false
3765
+ },
3766
+ "open": {
3767
+ "type": "boolean",
3768
+ "required": false
3769
+ },
3770
+ "side": {
3771
+ "type": "AnchoredSide",
3772
+ "required": false
3773
+ },
3774
+ "sideOffset": {
3775
+ "type": "number | string",
3776
+ "required": false
3777
+ },
3778
+ "size": {
3779
+ "type": "FilterMenuSize",
3780
+ "required": false
3781
+ },
3782
+ "triggerLabel": {
3783
+ "type": "string",
3784
+ "required": false
3785
+ },
3786
+ "values": {
3787
+ "type": "FilterMenuValues",
3788
+ "required": false
3789
+ },
3790
+ "width": {
3791
+ "type": "FilterMenuWidth",
3792
+ "required": false
3793
+ }
3794
+ },
3795
+ "events": [
3796
+ {
3797
+ "name": "dsActiveFilterChange",
3798
+ "detail": "string"
3799
+ },
3800
+ {
3801
+ "name": "dsAfterClose",
3802
+ "detail": "void"
3803
+ },
3804
+ {
3805
+ "name": "dsChange",
3806
+ "detail": "FilterMenuChangeDetail"
3807
+ },
3808
+ {
3809
+ "name": "dsClear",
3810
+ "detail": "void"
3811
+ },
3812
+ {
3813
+ "name": "dsClose",
3814
+ "detail": "void"
3815
+ },
3816
+ {
3817
+ "name": "dsOpenChange",
3818
+ "detail": "boolean"
3819
+ }
3820
+ ],
3821
+ "slots": []
3822
+ },
3823
+ "exports": {
3824
+ "customElement": "ds-filter-menu",
3825
+ "react": "DsFilterMenu",
3826
+ "angular": "DsFilterMenu"
3827
+ },
3828
+ "dependencies": [
3829
+ "@ds-mo/ui",
3830
+ "@ds-mo/tokens",
3831
+ "@ds-mo/icons"
3832
+ ],
3833
+ "componentDependencies": [
3834
+ "button-unfilled",
3835
+ "checkbox",
3836
+ "icon",
3837
+ "tag",
3838
+ "text",
3839
+ "tooltip"
3840
+ ]
3841
+ },
3627
3842
  {
3628
3843
  "id": "component:ds-icon",
3629
3844
  "tag": "ds-icon",
@@ -4150,15 +4365,15 @@
4150
4365
  "tag": "ds-menu",
4151
4366
  "name": "menu",
4152
4367
  "title": "Menu",
4153
- "summary": "Anchored action menu with flat commands, grouped sections, single-selection choices, supplemental notification dots, switches, and destructive actions.",
4368
+ "summary": "Anchored action menu with flat commands, grouped sections, single-selection choices, supplemental notification dots or trailing tags, switches, and destructive actions.",
4154
4369
  "intentStatus": "complete",
4155
4370
  "intent": {
4156
4371
  "audience": "general",
4157
4372
  "status": "stable",
4158
- "summary": "Anchored action menu with flat commands, grouped sections, single-selection choices, supplemental notification dots, switches, and destructive actions.",
4373
+ "summary": "Anchored action menu with flat commands, grouped sections, single-selection choices, supplemental notification dots or trailing tags, switches, and destructive actions.",
4159
4374
  "useWhen": [
4160
4375
  "A trigger reveals a short contextual list of commands or state-changing actions.",
4161
- "Actions need grouping, mutually exclusive selected state, supplemental notification dots, switch rows, or destructive treatment."
4376
+ "Actions need grouping, mutually exclusive selected state, supplemental notification dots or trailing tags, switch rows, or destructive treatment."
4162
4377
  ],
4163
4378
  "avoidWhen": [
4164
4379
  "The user is selecting a value for a form field.",
@@ -4198,7 +4413,8 @@
4198
4413
  "Switch rows use menuitemcheckbox semantics on the row; the nested ds-switch is an aria-hidden presentation indicator at the same density as the menu.",
4199
4414
  "Single-selection menus use menuitemradio semantics and aria-checked on each row, but render no nested radio control; selected interaction fill and primary foreground provide the visual state.",
4200
4415
  "A swatch-picker section changes the popup to a non-modal dialog so its radio group and ordinary preference buttons keep valid nested semantics; Tab moves between its controls, then leaves and closes at the popup boundary.",
4201
- "Use notification dots only as supplemental status and not as the sole indication of important information."
4416
+ "Use notification dots only as supplemental status and not as the sole indication of important information.",
4417
+ "Trailing tags are non-interactive supplemental content; their visible label remains part of the menu item's accessible name."
4202
4418
  ],
4203
4419
  "states": [
4204
4420
  "The host owns open state and responds to selection and close events.",
@@ -4207,7 +4423,8 @@
4207
4423
  "For selectionMode single, keep exactly one item isSelected and replace the items or sections array after dsSelect; Menu never mutates consumer-owned selection data.",
4208
4424
  "Arrays, objects, and element anchors must be assigned as JavaScript properties.",
4209
4425
  "Use a swatch-picker section for a small curated visual preference and apply dsSwatchSelect immediately without closing the popup.",
4210
- "Ordinary rows, section headings, and supporting text consume the Menu size. At xs, both the primary label and supporting text use caption metrics."
4426
+ "Ordinary rows, section headings, and supporting text consume the Menu size. At xs, both the primary label and supporting text use caption metrics.",
4427
+ "A trailing tag resolves one density smaller than its menu row so it nests without changing row height. Do not combine tag, dot, and switch suffixes on one item."
4211
4428
  ],
4212
4429
  "responsiveBehavior": [
4213
4430
  "Keep the default choice-cell anchor alignment so the first or last interactive row edge aligns with its trigger, matching Select; use popup-frame only for deliberate custom frame geometry.",
@@ -4336,6 +4553,7 @@
4336
4553
  "badge",
4337
4554
  "swatch-picker",
4338
4555
  "switch",
4556
+ "tag",
4339
4557
  "text"
4340
4558
  ]
4341
4559
  },
@@ -5328,7 +5546,7 @@
5328
5546
  ],
5329
5547
  "states": [
5330
5548
  "The owner opens the modal through the open property and responds to the typed dsClose detail for application state synchronization or dismissal analytics.",
5331
- "The component mutates open to false for Close, Escape, and backdrop dismissal while retaining its rendered surface through exit motion.",
5549
+ "The component mutates open to false for Close, Escape, and backdrop dismissal while retaining its rendered surface through exit motion. The close timer begins only after the closing class has rendered, so the dialog surface and backdrop enter together and exit together before the native top layer closes across browsers.",
5332
5550
  "The default slot owns task content; the named footer slot is optional and is hidden when no actions are assigned.",
5333
5551
  "The optional header description remains stacked beneath the title with the shared compact-header rhythm; longer task content belongs in the default slot.",
5334
5552
  "Primary actions use a bold filled button with semantic intent. Secondary and cancel actions use bordered label-only unfilled buttons.",
@@ -6485,12 +6703,12 @@
6485
6703
  "tag": "ds-select",
6486
6704
  "name": "select",
6487
6705
  "title": "Select",
6488
- "summary": "Form-associated select for one value or several independent values through the multiple mode, with listbox semantics, local search, grouped sections, loading, clearing, and surface-aware trigger chrome.",
6706
+ "summary": "Form-associated select for one value or several independent values through the multiple mode, with listbox semantics for ordinary choices, grid semantics for choices with contextual actions, local search, grouped sections, loading, clearing, and surface-aware trigger chrome.",
6489
6707
  "intentStatus": "complete",
6490
6708
  "intent": {
6491
6709
  "audience": "general",
6492
6710
  "status": "stable",
6493
- "summary": "Form-associated select for one value or several independent values through the multiple mode, with listbox semantics, local search, grouped sections, loading, clearing, and surface-aware trigger chrome.",
6711
+ "summary": "Form-associated select for one value or several independent values through the multiple mode, with listbox semantics for ordinary choices, grid semantics for choices with contextual actions, local search, grouped sections, loading, clearing, and surface-aware trigger chrome.",
6494
6712
  "useWhen": [
6495
6713
  "The user must choose one value from a finite set.",
6496
6714
  "The user may choose several independent values when multiple is enabled.",
@@ -6522,11 +6740,12 @@
6522
6740
  ],
6523
6741
  "accessibility": [
6524
6742
  "In forms, provide a persistent visible external field label; placeholder text is guidance and must not be the field's only label. In a compact filter bar, the trigger's visible text may supply the accessible name.",
6525
- "The trigger uses combobox semantics and the popup uses listbox and option semantics; do not replace them with menu roles.",
6743
+ "The trigger uses combobox semantics. Ordinary choices use a listbox with options; when any choice has a contextual action, the popup promotes to a grid with selectable rows, a choice cell, and an action cell. Do not replace either popup with menu roles.",
6526
6744
  "Multiple mode adds aria-multiselectable, exposes independent aria-selected state, and uses presentation-only checkbox indicators while each option remains the sole interaction target.",
6527
6745
  "Disabled options remain visible, expose aria-disabled, and are skipped by keyboard navigation and typeahead.",
6528
6746
  "Keyboard navigation keeps the aria-activedescendant option scrolled into the visible listbox viewport.",
6529
6747
  "Selected options rely on active fill and foreground treatment without a redundant trailing check icon.",
6748
+ "A contextual option action is a sibling gridcell rather than an interactive descendant of the selectable choice cell. Pointer hover, focus, ArrowRight, and Shift+F10 make the ellipsis action reachable without changing the selected value.",
6530
6749
  "Local search moves focus into the search field while preserving the active option through aria-activedescendant.",
6531
6750
  "Use errorMessage with error so the trigger is described by the rendered alert."
6532
6751
  ],
@@ -6540,14 +6759,18 @@
6540
6759
  "Clearing emits dsChange with an empty string or empty array according to mode plus dsClear, keeps the popup open, and restores useful focus.",
6541
6760
  "Loading keeps the trigger visible, replaces its prefix icon, marks the control busy, and makes selection interaction temporarily unavailable without presenting the control as inactive. When the popup is open, its single loader is centered vertically and horizontally within the loading region.",
6542
6761
  "The trigger label stays left-aligned at every width. The default size is md in both forms and filter bars; smaller sizes require an explicit density need.",
6762
+ "In scalar mode, triggerLabel may provide compact trigger-only copy while the popup continues to show the selected option's full label. Set triggerLabelPlaceholder when that copy represents the default or browse state and should retain secondary placeholder emphasis despite a real selected value. Use dot for a supplemental changed or attention state without appending status prose to the label.",
6543
6763
  "Use option icons only when they help users differentiate choices. Icons render only when every option in the complete list provides one; mixed icon data falls back to the text-only row layout.",
6544
6764
  "Create sections only for categories that are meaningful to customers, not merely to break a long list into arbitrary chunks.",
6545
6765
  "When any option supplies subtext, every row uses the same subtext structure and missing values render an em dash. Subtext should disambiguate or add decision-helpful information.",
6546
6766
  "Option labels and the selected trigger label stay on one line and truncate when constrained. Option subtext may wrap to at most two lines.",
6767
+ "Use an option action only for a contextual menu about that user-managed option. The fixed ellipsis action appears on hover, keyboard activity, focus, and touch; expanded keeps it visible while its controlled menu is open. Activating it emits dsOptionAction without selecting the option or closing the Select popup.",
6547
6768
  "The optional prefix icon and chevron always use the parent surface's secondary foreground color, including when a selected value promotes the label to primary.",
6769
+ "While the popup is open, the trigger holds the pressed interaction wash without changing its resting foreground or selected-value treatment.",
6548
6770
  "The shared popup search control follows the Select density, using the same text, icon, and internal spacing as a borderless trigger. Its container uses menu-item padding on every side and owns a 1px bottom divider that becomes a 1.5px bold-brand stroke while search has focus. Search placeholder text is secondary at rest and quaternary while focused because it becomes decorative once the editable field is active.",
6549
6771
  "When search contains text, the shared control shows a rounded icon-only ButtonUnfilled with the CrossCircle icon and no border, sized to remain inset within the current row density. It clears the local term, stays hidden for an empty term, and returns focus to search.",
6550
- "The shared clear footer mirrors the owning density: menu-item padding surrounds a borderless density row, and the Clear label uses the same row and label insets as option text. The outer footer owns a 1px top divider.",
6772
+ "The shared clear footer mirrors the owning density: menu-item padding surrounds a borderless density row, and the Clear label uses the same row and label insets as option text. The clear action never wraps. In multiple mode, the selected summary stays on one line and collapses to its numeric count when the full localized phrase would compete with the clear action. The outer footer owns a 1px top divider.",
6773
+ "Use footerActionLabel for one product-owned text action beneath the option list. It replaces the clear affordance, stays aligned with option labels, uses the shared brand text-action treatment with a matching brand underline on hover, emits dsFooterAction, and closes the popup when activated.",
6551
6774
  "An empty filtered list composes the message-only body variant of EmptyState. Keep the default neutral no-results message unless localized product guidance makes the outcome clearer.",
6552
6775
  "Enable searchable for more than roughly 20 options, user-managed listings, large domains such as addresses, or sets users cannot efficiently scan. Local matching includes option labels, subtext, and section headings; the owner resolves remote data before assigning options.",
6553
6776
  "Validation timing belongs to the form owner and may be immediate or deferred until blur or submit; the Select exposes validity and error presentation without imposing that policy.",
@@ -6559,6 +6782,7 @@
6559
6782
  "responsiveBehavior": [
6560
6783
  "Use width fill for form fields and width hug for compact filter bars. Override those defaults only when the owning layout has a clear constraint.",
6561
6784
  "The popup matches the trigger minimum width, may grow for content, and clamps to the viewport.",
6785
+ "Keep popupAlign at start for ordinary fields and filters. Use end when a control sits against a right layout edge and the popup should grow inward.",
6562
6786
  "Long option collections scroll inside the popup; virtualization and remote search are not part of this component."
6563
6787
  ],
6564
6788
  "frameworkCaveats": {
@@ -6566,7 +6790,7 @@
6566
6790
  "Assign options, sections, and multiple-mode array values through JavaScript properties because arrays and objects cannot be represented safely as attributes."
6567
6791
  ],
6568
6792
  "react": [
6569
- "Pass options or sections as wrapper props, set multiple for array values, and handle onDsChange, onDsClear, and onDsOpenChange."
6793
+ "Pass options or sections as wrapper props, set multiple for array values, and handle onDsChange, onDsClear, onDsOpenChange, onDsFooterAction, and onDsOptionAction."
6570
6794
  ],
6571
6795
  "angular": [
6572
6796
  "Import DsSelect and SelectValueAccessor when integrating with Angular Forms; bind options and sections as properties."
@@ -6617,6 +6841,10 @@
6617
6841
  "type": "boolean",
6618
6842
  "required": false
6619
6843
  },
6844
+ "dot": {
6845
+ "type": "boolean",
6846
+ "required": false
6847
+ },
6620
6848
  "error": {
6621
6849
  "type": "boolean",
6622
6850
  "required": false
@@ -6625,6 +6853,10 @@
6625
6853
  "type": "string | undefined",
6626
6854
  "required": false
6627
6855
  },
6856
+ "footerActionLabel": {
6857
+ "type": "string | undefined",
6858
+ "required": false
6859
+ },
6628
6860
  "hasBorder": {
6629
6861
  "type": "boolean",
6630
6862
  "required": false
@@ -6673,6 +6905,10 @@
6673
6905
  "type": "string",
6674
6906
  "required": false
6675
6907
  },
6908
+ "popupAlign": {
6909
+ "type": "SelectPopupAlign",
6910
+ "required": false
6911
+ },
6676
6912
  "required": {
6677
6913
  "type": "boolean",
6678
6914
  "required": false
@@ -6701,6 +6937,14 @@
6701
6937
  "type": "SelectSize",
6702
6938
  "required": false
6703
6939
  },
6940
+ "triggerLabel": {
6941
+ "type": "string | undefined",
6942
+ "required": false
6943
+ },
6944
+ "triggerLabelPlaceholder": {
6945
+ "type": "boolean",
6946
+ "required": false
6947
+ },
6704
6948
  "value": {
6705
6949
  "type": "SelectValue",
6706
6950
  "required": false
@@ -6719,9 +6963,17 @@
6719
6963
  "name": "dsClear",
6720
6964
  "detail": "void"
6721
6965
  },
6966
+ {
6967
+ "name": "dsFooterAction",
6968
+ "detail": "void"
6969
+ },
6722
6970
  {
6723
6971
  "name": "dsOpenChange",
6724
6972
  "detail": "boolean"
6973
+ },
6974
+ {
6975
+ "name": "dsOptionAction",
6976
+ "detail": "SelectOptionActionDetail"
6725
6977
  }
6726
6978
  ],
6727
6979
  "slots": []
@@ -6737,6 +6989,7 @@
6737
6989
  "@ds-mo/icons"
6738
6990
  ],
6739
6991
  "componentDependencies": [
6992
+ "badge",
6740
6993
  "button-unfilled",
6741
6994
  "checkbox",
6742
6995
  "empty-state",
@@ -8102,7 +8355,7 @@
8102
8355
  ],
8103
8356
  "accessibility": [
8104
8357
  "The rendered structure uses a native table, caption, column headers, row groups, and data cells; keep the caption non-empty. The native caption remains visually hidden as the table's accessible name. When caption visibility is enabled, a 48px header bar renders as component chrome outside the horizontal scrollport. It defaults to a presentational caption title that does not duplicate the accessible name. Application-owned labeled controls supplied through the single named header slot replace that fallback and receive the complete content width inside the component-owned 8px inset, so the application can compose its own control groups and alignment without table-defined leading or trailing zones.",
8105
- "Sorting controls remain buttons inside column headers. Member-row sort uses aria-sort, while independent group order is described by the grouped header control.",
8358
+ "Sorting controls remain buttons inside column headers and expose the table's one controlled member-row sort through aria-sort. Grouping never adds a second sort indicator or header control; the application supplies groups in its fixed product order.",
8106
8359
  "Selection controls expose checkbox semantics and explicit row names; select-all affects selectable loaded rows only and preserves selected identities outside the loaded window. When grouping is active with multi-selection, each group section header also exposes a checkbox that selects or clears that group's selectable loaded rows.",
8107
8360
  "Interactive rows are focusable as native rows, activate with Enter or Space, and do not steal activation from their nested selection or action controls.",
8108
8361
  "Scrollable table regions become keyboard focusable and named only when overflow exists.",
@@ -8110,9 +8363,9 @@
8110
8363
  "An optional result summary footer appears below the table frame when both displayedCount and totalCount are finite, formatting Displaying {displayed} of {total} in text-body-medium secondary. The footer slot can replace that copy, while footer-leading and footer-trailing compose actions into the same compact-bar anatomy. Authored footer content can also opt into the 48px footer without controlled counts."
8111
8364
  ],
8112
8365
  "states": [
8113
- "Columns, rows, groups, grouping, sorting, selected row IDs, collapsed group IDs, displayedCount, totalCount, and lazy-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 copy and action composition. 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.",
8114
- "Grouping supports one level. The application supplies ordered groups and ordered member rows; group order and member-row sort are independent controls. Group section headers show an emphasized text-body-medium label followed by a rounded sm Tag containing only the numeric count. The Tag uses the group's faint intent surface (neutral when intent is absent) and a small-elevation, button-hugging wrapper; a localized countLabel remains available to assistive technology. 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; the final collapsed section does not duplicate the terminal table edge. 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 remains 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.",
8115
- "An active member sort toggles only between ascending and descending; activating a different sortable label moves sorting to that key. Applications may still clear the controlled sort state explicitly. The grouped column toggles ascending and descending group order without clearing member sort.",
8366
+ "Columns, rows, groups, grouping, sorting, selected row IDs, collapsed group IDs, displayedCount, totalCount, and lazy-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 the controlled result summary 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.",
8367
+ "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 rounded sm Tag containing only the numeric count. The Tag uses the group's faint intent surface (neutral when intent is absent) and a small-elevation, button-hugging wrapper; a localized countLabel remains available to assistive technology. 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; the final collapsed section does not duplicate the terminal table edge. 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 remains 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.",
8368
+ "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.",
8116
8369
  "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.",
8117
8370
  "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.",
8118
8371
  "Lazy loading replaces pagination. The application owns requests, cancellation, cursors, deduplication, appended records, and query identity; loadIdentity resets the component request guard.",
@@ -8134,11 +8387,11 @@
8134
8387
  "frameworkCaveats": {
8135
8388
  "customElements": [
8136
8389
  "Assign columns, rows, groups, grouping, sort, selectedRowIds, collapsedGroupIds, displayedCount, and totalCount through JavaScript properties rather than HTML attribute strings.",
8137
- "Replace controlled property values in response to dsSortChange, dsGroupingChange, dsGroupCollapseChange, dsSelectionChange, and dsLoadMore; route dsRowActivate in the application owner."
8390
+ "Replace controlled property values in response to dsSortChange, dsGroupCollapseChange, dsSelectionChange, and dsLoadMore; route dsRowActivate in the application owner."
8138
8391
  ],
8139
8392
  "react": [
8140
8393
  "Pass new array and state-object references when the controlled data or query state changes.",
8141
- "Apply emitted sort, grouping, collapse, selection, action, or loading detail to application state and perform data transformations in the owning layer."
8394
+ "Apply emitted sort, collapse, selection, action, or loading detail to application state and perform data transformations in the owning layer."
8142
8395
  ],
8143
8396
  "angular": [
8144
8397
  "Bind complex table inputs as properties and update the controlled values from the corresponding output events.",
@@ -8328,10 +8581,6 @@
8328
8581
  "name": "dsGroupCollapseChange",
8329
8582
  "detail": "TableGroupCollapseChangeDetail"
8330
8583
  },
8331
- {
8332
- "name": "dsGroupingChange",
8333
- "detail": "TableGroupingChangeDetail"
8334
- },
8335
8584
  {
8336
8585
  "name": "dsLoadMore",
8337
8586
  "detail": "TableLoadMoreDetail"
@@ -8594,7 +8843,7 @@
8594
8843
  "Omitted color inherits currentColor without imposing a host color declaration, so an owning component may apply its semantic foreground directly without depending on stylesheet order. Explicit semantic aliases or CSS-variable references are used when Text has an independent color role.",
8595
8844
  "Prefer the owning control's isInactive or native disabled state over manually selecting tertiary or quaternary so visual treatment and inactive semantics remain synchronized.",
8596
8845
  "Line truncation and wrapping require an owner-supplied width constraint and content-aware composition decision.",
8597
- "Solid underline is the default link affordance; brand-blue links may omit it at rest. Dotted underline communicates hidden or supplemental interaction such as a tooltip. Decoration does not make Text interactive by itself.",
8846
+ "Solid underline is the default link affordance; brand-blue links may omit it at rest. Solid and dotted underlines share the tokenized decoration thickness and offset. Dotted underline communicates hidden or supplemental interaction such as a tooltip. Decoration does not make Text interactive by itself.",
8598
8847
  "Tabular numbers are for changing numeric values or aligned numeric columns where stable glyph width matters.",
8599
8848
  "Shimmer is reserved for visible generating/loading status text whose owner provides status semantics; reduced motion keeps static readable text."
8600
8849
  ],
@@ -0,0 +1,44 @@
1
+ import { ChangeDetectorRef, ElementRef, NgZone, EventEmitter } from '@angular/core';
2
+ import type { Components } from '@ds-mo/ui/components';
3
+ import type { DsFilterMenuCustomEvent } from '@ds-mo/ui/components';
4
+ import type { FilterMenuChangeDetail as IDsFilterMenuFilterMenuChangeDetail } from '@ds-mo/ui/components';
5
+ import * as i0 from "@angular/core";
6
+ export declare class DsFilterMenu {
7
+ protected z: NgZone;
8
+ protected el: HTMLDsFilterMenuElement;
9
+ dsChange: EventEmitter<DsFilterMenuCustomEvent<IDsFilterMenuFilterMenuChangeDetail>>;
10
+ dsClear: EventEmitter<DsFilterMenuCustomEvent<void>>;
11
+ dsActiveFilterChange: EventEmitter<DsFilterMenuCustomEvent<string>>;
12
+ dsClose: EventEmitter<DsFilterMenuCustomEvent<void>>;
13
+ dsOpenChange: EventEmitter<DsFilterMenuCustomEvent<boolean>>;
14
+ dsAfterClose: EventEmitter<DsFilterMenuCustomEvent<void>>;
15
+ constructor(c: ChangeDetectorRef, r: ElementRef, z: NgZone);
16
+ static ɵfac: i0.ɵɵFactoryDeclaration<DsFilterMenu, never>;
17
+ static ɵcmp: i0.ɵɵComponentDeclaration<DsFilterMenu, "ds-filter-menu", never, { "activeFill": { "alias": "activeFill"; "required": false; }; "activeFilterId": { "alias": "activeFilterId"; "required": false; }; "align": { "alias": "align"; "required": false; }; "alignOffset": { "alias": "alignOffset"; "required": false; }; "anchor": { "alias": "anchor"; "required": false; }; "anchorId": { "alias": "anchorId"; "required": false; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; }; "categoriesLabel": { "alias": "categoriesLabel"; "required": false; }; "clearLabel": { "alias": "clearLabel"; "required": false; }; "filters": { "alias": "filters"; "required": false; }; "hasBorder": { "alias": "hasBorder"; "required": false; }; "icon": { "alias": "icon"; "required": false; }; "initialFocusVisible": { "alias": "initialFocusVisible"; "required": false; }; "inputId": { "alias": "inputId"; "required": false; }; "menuLabel": { "alias": "menuLabel"; "required": false; }; "menuWidth": { "alias": "menuWidth"; "required": false; }; "open": { "alias": "open"; "required": false; }; "side": { "alias": "side"; "required": false; }; "sideOffset": { "alias": "sideOffset"; "required": false; }; "size": { "alias": "size"; "required": false; }; "triggerLabel": { "alias": "triggerLabel"; "required": false; }; "values": { "alias": "values"; "required": false; }; "width": { "alias": "width"; "required": false; }; }, { "dsChange": "dsChange"; "dsClear": "dsClear"; "dsActiveFilterChange": "dsActiveFilterChange"; "dsClose": "dsClose"; "dsOpenChange": "dsOpenChange"; "dsAfterClose": "dsAfterClose"; }, never, ["*"], true, never>;
18
+ }
19
+ export declare interface DsFilterMenu extends Components.DsFilterMenu {
20
+ /**
21
+ * Requests a controlled value replacement without closing the popup.
22
+ */
23
+ dsChange: EventEmitter<DsFilterMenuCustomEvent<IDsFilterMenuFilterMenuChangeDetail>>;
24
+ /**
25
+ * Requests that the consumer clear every filter value.
26
+ */
27
+ dsClear: EventEmitter<DsFilterMenuCustomEvent<void>>;
28
+ /**
29
+ * Requests a controlled active-category replacement.
30
+ */
31
+ dsActiveFilterChange: EventEmitter<DsFilterMenuCustomEvent<string>>;
32
+ /**
33
+ * Requests that the controlled popup close.
34
+ */
35
+ dsClose: EventEmitter<DsFilterMenuCustomEvent<void>>;
36
+ /**
37
+ * Emitted whenever internal select-trigger activation changes popup visibility.
38
+ */
39
+ dsOpenChange: EventEmitter<DsFilterMenuCustomEvent<boolean>>;
40
+ /**
41
+ * Emitted after exit motion and rendered popup removal complete.
42
+ */
43
+ dsAfterClose: EventEmitter<DsFilterMenuCustomEvent<void>>;
44
+ }