@ds-mo/ui 13.16.1 → 13.18.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 (222) hide show
  1. package/dist/.package-ready.json +1 -1
  2. package/dist/agent-patterns.json +1 -1
  3. package/dist/agent.json +268 -17
  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/index.d.ts +1 -1
  9. package/dist/angular/index.js +1 -0
  10. package/dist/angular/proxies.d.ts +1 -0
  11. package/dist/angular/proxies.js +1 -0
  12. package/dist/components/ds-agent-activity.js +1 -1
  13. package/dist/components/ds-agent-questionnaire.js +1 -1
  14. package/dist/components/ds-agent-response.js +1 -1
  15. package/dist/components/ds-agent-source-list.js +1 -1
  16. package/dist/components/ds-agent-tool-call.js +1 -1
  17. package/dist/components/ds-attachment-list.js +1 -1
  18. package/dist/components/ds-badge.js +1 -1
  19. package/dist/components/ds-banner.js +1 -1
  20. package/dist/components/ds-bar-nav.js +1 -1
  21. package/dist/components/ds-bar-title.js +1 -1
  22. package/dist/components/ds-bar-workflow.js +1 -1
  23. package/dist/components/ds-bar-workflow.js.map +1 -1
  24. package/dist/components/ds-breadcrumb.js +1 -1
  25. package/dist/components/ds-button-filled.js +1 -1
  26. package/dist/components/ds-button-unfilled.js +1 -1
  27. package/dist/components/ds-card-chart.js +1 -1
  28. package/dist/components/ds-card-overview.js +1 -1
  29. package/dist/components/ds-card-overview.js.map +1 -1
  30. package/dist/components/ds-card-setting.js +1 -1
  31. package/dist/components/ds-chart-legend.js +1 -1
  32. package/dist/components/ds-chart.js +1 -1
  33. package/dist/components/ds-checkbox.js +1 -1
  34. package/dist/components/ds-chip.js +1 -1
  35. package/dist/components/ds-code-block.js +1 -1
  36. package/dist/components/ds-conversation-list-item.js +1 -1
  37. package/dist/components/ds-conversation-list-item.js.map +1 -1
  38. package/dist/components/ds-conversation-list-section.js +1 -1
  39. package/dist/components/ds-empty-state.js +1 -1
  40. package/dist/components/ds-field.js +1 -1
  41. package/dist/components/ds-filter-menu.d.ts +11 -0
  42. package/dist/components/ds-filter-menu.js +2 -0
  43. package/dist/components/ds-filter-menu.js.map +1 -0
  44. package/dist/components/ds-input.js +1 -1
  45. package/dist/components/ds-input.js.map +1 -1
  46. package/dist/components/ds-markdown.js +1 -1
  47. package/dist/components/ds-menu.js +1 -1
  48. package/dist/components/ds-message-actions.js +1 -1
  49. package/dist/components/ds-message-bubble.js +1 -1
  50. package/dist/components/ds-message-composer.js +1 -1
  51. package/dist/components/ds-message-scroller.js +1 -1
  52. package/dist/components/ds-message.js +1 -1
  53. package/dist/components/ds-mobile-bar-nav.js +1 -1
  54. package/dist/components/ds-mobile-header.js +1 -1
  55. package/dist/components/ds-mobile-section-switcher.js +1 -1
  56. package/dist/components/ds-mobile-sheet-nav.js +1 -1
  57. package/dist/components/ds-modal.js +1 -1
  58. package/dist/components/ds-modal.js.map +1 -1
  59. package/dist/components/ds-panel-nav.js +1 -1
  60. package/dist/components/ds-panel-sub-nav.js +1 -1
  61. package/dist/components/ds-panel-tool-header.js +1 -1
  62. package/dist/components/ds-panel-tool-search.js +1 -1
  63. package/dist/components/ds-panel-tools.js +1 -1
  64. package/dist/components/ds-radio.js +1 -1
  65. package/dist/components/ds-scroll-overlay.js +1 -1
  66. package/dist/components/ds-select.js +1 -1
  67. package/dist/components/ds-select.js.map +1 -1
  68. package/dist/components/ds-shell-app.js +1 -1
  69. package/dist/components/ds-shell-app.js.map +1 -1
  70. package/dist/components/ds-shell-page.js +1 -1
  71. package/dist/components/ds-shell-tools.js +1 -1
  72. package/dist/components/ds-skeleton.js +1 -1
  73. package/dist/components/ds-slider.js +1 -1
  74. package/dist/components/ds-swatch-picker.js +1 -1
  75. package/dist/components/ds-switch.js +1 -1
  76. package/dist/components/ds-tab-group.js +1 -1
  77. package/dist/components/ds-table.js +1 -1
  78. package/dist/components/ds-table.js.map +1 -1
  79. package/dist/components/ds-tag.js +1 -1
  80. package/dist/components/ds-text.js +1 -1
  81. package/dist/components/ds-toast.js +1 -1
  82. package/dist/components/ds-tooltip-chart.js +1 -1
  83. package/dist/components/ds-tooltip.js +1 -1
  84. package/dist/components/ds-typing-indicator.js +1 -1
  85. package/dist/components/p-5uI3i2vg.js +2 -0
  86. package/dist/components/p-5uI3i2vg.js.map +1 -0
  87. package/dist/components/p-BAgjMUt3.js +2 -0
  88. package/dist/components/p-BAgjMUt3.js.map +1 -0
  89. package/dist/components/{p-CdKz-QT2.js → p-BCfgU8Fh.js} +2 -2
  90. package/dist/components/{p-CsXC1cHI.js → p-BDsAON4I.js} +2 -2
  91. package/dist/components/p-BMq4DJWh.js +2 -0
  92. package/dist/components/{p-D9FdOR_m.js.map → p-BMq4DJWh.js.map} +1 -1
  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-BaiGt_o6.js +2 -0
  97. package/dist/components/{p-D4jQy3Ps.js.map → p-BaiGt_o6.js.map} +1 -1
  98. package/dist/components/p-BqFKxWVl.js +2 -0
  99. package/dist/components/p-BqFKxWVl.js.map +1 -0
  100. package/dist/components/p-BtY2nJW4.js +2 -0
  101. package/dist/components/{p-m5CSrx_s.js.map → p-BtY2nJW4.js.map} +1 -1
  102. package/dist/components/{p-DStd98dM.js → p-BxQlH4gl.js} +2 -2
  103. package/dist/components/{p-DStd98dM.js.map → p-BxQlH4gl.js.map} +1 -1
  104. package/dist/components/{p-00or0yGw.js → p-C7ywYAzN.js} +2 -2
  105. package/dist/components/p-C8keZ4k6.js +2 -0
  106. package/dist/components/{p-BMAZWEDa.js.map → p-C8keZ4k6.js.map} +1 -1
  107. package/dist/components/p-CB8iBV_M.js +2 -0
  108. package/dist/components/p-CB8iBV_M.js.map +1 -0
  109. package/dist/components/p-CP2W8qxB.js +2 -0
  110. package/dist/components/{p-D5sIwLjA.js.map → p-CP2W8qxB.js.map} +1 -1
  111. package/dist/components/p-CUQTEeLp.js +2 -0
  112. package/dist/components/{p-B94M62Tx.js.map → p-CUQTEeLp.js.map} +1 -1
  113. package/dist/components/{p-D4j0deyd.js → p-C_tqXl5P.js} +2 -2
  114. package/dist/components/p-Csq6XDgm.js +2 -0
  115. package/dist/components/{p-D9CDoQBx.js.map → p-Csq6XDgm.js.map} +1 -1
  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-dEouiXJ8.js → p-D8nnhQNJ.js} +2 -2
  121. package/dist/components/p-DTMxwYQj.js +2 -0
  122. package/dist/components/{p-B2SoinWf.js.map → p-DTMxwYQj.js.map} +1 -1
  123. package/dist/components/{p-C891ueIx.js → p-DYoCb_sj.js} +2 -2
  124. package/dist/components/{p-Dhx_3_tf.js → p-DZFilC--.js} +2 -2
  125. package/dist/components/p-DZFilC--.js.map +1 -0
  126. package/dist/components/{p-GbTasczF.js → p-Dcnd5ZX5.js} +2 -2
  127. package/dist/components/{p-BRze4tRe.js → p-DeBto13S.js} +2 -2
  128. package/dist/components/p-DtvJTPds.js +2 -0
  129. package/dist/components/{p-B53Vpuqq.js.map → p-DtvJTPds.js.map} +1 -1
  130. package/dist/components/{p-DrvEhJhO.js → p-N4m0evkj.js} +2 -2
  131. package/dist/components/p-NdahPypA.js +2 -0
  132. package/dist/components/p-NdahPypA.js.map +1 -0
  133. package/dist/components/{p-D4AfoIu6.js → p-NuRg_IoA.js} +2 -2
  134. package/dist/components/{p-CqDJRVT8.js → p-NzOcZg8r.js} +2 -2
  135. package/dist/components/p-PzI11fs8.js +2 -0
  136. package/dist/components/p-PzI11fs8.js.map +1 -0
  137. package/dist/components/{p-Cohb8T7G.js → p-QdI17bl-.js} +2 -2
  138. package/dist/components/{p-chA2WA5x.js → p-Qzh-wyTg.js} +2 -2
  139. package/dist/components/{p-CnIvWEVm.js → p-Xr9OO-Ao.js} +2 -2
  140. package/dist/components/{p-Qf-os3lG.js → p-oyZjjoYV.js} +2 -2
  141. package/dist/components/{p-Dbobj7DI.js → p-smzwm_EW.js} +2 -2
  142. package/dist/components/p-tR8INOIN.js +2 -0
  143. package/dist/components/p-tR8INOIN.js.map +1 -0
  144. package/dist/docs/components.json +1299 -93
  145. package/dist/lib/utils/choice-list.d.ts +10 -0
  146. package/dist/lib/utils/index.js +4 -1
  147. package/dist/lib/utils/index.js.map +2 -2
  148. package/dist/lib/utils/token-defaults.d.ts +2 -0
  149. package/dist/mcp-data/registry/agent-source-list.json +2 -2
  150. package/dist/mcp-data/registry/bar-nav.json +2 -2
  151. package/dist/mcp-data/registry/breadcrumb.json +2 -2
  152. package/dist/mcp-data/registry/filter-menu.json +643 -0
  153. package/dist/mcp-data/registry/menu.json +11 -8
  154. package/dist/mcp-data/registry/modal.json +3 -3
  155. package/dist/mcp-data/registry/registry.json +270 -16
  156. package/dist/mcp-data/registry/select.json +131 -7
  157. package/dist/mcp-data/registry/table.json +8 -8
  158. package/dist/mcp-data/registry/text.json +2 -2
  159. package/dist/react/components.d.ts +1 -0
  160. package/dist/react/components.js +1 -0
  161. package/dist/react/ds-filter-menu.d.ts +17 -0
  162. package/dist/react/ds-filter-menu.js +19 -0
  163. package/dist/react/ds-select.d.ts +3 -1
  164. package/dist/react/ds-select.js +3 -1
  165. package/dist/styles/prose.css +19 -3
  166. package/dist/styles/table.css +106 -3
  167. package/dist/types/components/FilterMenu/FilterMenu.d.ts +137 -0
  168. package/dist/types/components/Menu/Menu.d.ts +1 -1
  169. package/dist/types/components/Menu/menu-types.d.ts +9 -0
  170. package/dist/types/components/Modal/Modal.d.ts +1 -0
  171. package/dist/types/components/Select/Select.d.ts +34 -0
  172. package/dist/types/components/Table/Table.d.ts +2 -3
  173. package/dist/types/components/Table/table-layout-controller.d.ts +0 -3
  174. package/dist/types/components.d.ts +368 -2
  175. package/dist/types/utils/choice-list-parts.d.ts +17 -0
  176. package/dist/types/utils/choice-list.d.ts +10 -0
  177. package/dist/types/utils/select-controller.d.ts +2 -0
  178. package/dist/types/utils/token-defaults.d.ts +2 -0
  179. package/package.json +2 -1
  180. package/dist/components/p-B2SoinWf.js +0 -2
  181. package/dist/components/p-B53Vpuqq.js +0 -2
  182. package/dist/components/p-B94M62Tx.js +0 -2
  183. package/dist/components/p-BMAZWEDa.js +0 -2
  184. package/dist/components/p-BtUgncSJ.js +0 -2
  185. package/dist/components/p-BtUgncSJ.js.map +0 -1
  186. package/dist/components/p-CMbcRN92.js +0 -2
  187. package/dist/components/p-CMbcRN92.js.map +0 -1
  188. package/dist/components/p-CXduurfd.js +0 -2
  189. package/dist/components/p-CXduurfd.js.map +0 -1
  190. package/dist/components/p-CnUq7E8S.js +0 -2
  191. package/dist/components/p-D4jQy3Ps.js +0 -2
  192. package/dist/components/p-D5sIwLjA.js +0 -2
  193. package/dist/components/p-D9CDoQBx.js +0 -2
  194. package/dist/components/p-D9FdOR_m.js +0 -2
  195. package/dist/components/p-DO5-fplZ.js +0 -2
  196. package/dist/components/p-DO5-fplZ.js.map +0 -1
  197. package/dist/components/p-Dhx_3_tf.js.map +0 -1
  198. package/dist/components/p-DyqLVdJp.js +0 -2
  199. package/dist/components/p-NQOI5gN1.js +0 -2
  200. package/dist/components/p-NQOI5gN1.js.map +0 -1
  201. package/dist/components/p-m5CSrx_s.js +0 -2
  202. package/dist/components/p-ymtdhOU5.js +0 -2
  203. package/dist/components/p-ymtdhOU5.js.map +0 -1
  204. /package/dist/components/{p-CdKz-QT2.js.map → p-BCfgU8Fh.js.map} +0 -0
  205. /package/dist/components/{p-CsXC1cHI.js.map → p-BDsAON4I.js.map} +0 -0
  206. /package/dist/components/{p-GWUTrIlk.js.map → p-BOCrvs-v.js.map} +0 -0
  207. /package/dist/components/{p-B69Re7HW.js.map → p-BOjGzd5N.js.map} +0 -0
  208. /package/dist/components/{p-BAAjiAIF.js.map → p-BQkZ8FIl.js.map} +0 -0
  209. /package/dist/components/{p-00or0yGw.js.map → p-C7ywYAzN.js.map} +0 -0
  210. /package/dist/components/{p-D4j0deyd.js.map → p-C_tqXl5P.js.map} +0 -0
  211. /package/dist/components/{p-dEouiXJ8.js.map → p-D8nnhQNJ.js.map} +0 -0
  212. /package/dist/components/{p-C891ueIx.js.map → p-DYoCb_sj.js.map} +0 -0
  213. /package/dist/components/{p-GbTasczF.js.map → p-Dcnd5ZX5.js.map} +0 -0
  214. /package/dist/components/{p-BRze4tRe.js.map → p-DeBto13S.js.map} +0 -0
  215. /package/dist/components/{p-DrvEhJhO.js.map → p-N4m0evkj.js.map} +0 -0
  216. /package/dist/components/{p-D4AfoIu6.js.map → p-NuRg_IoA.js.map} +0 -0
  217. /package/dist/components/{p-CqDJRVT8.js.map → p-NzOcZg8r.js.map} +0 -0
  218. /package/dist/components/{p-Cohb8T7G.js.map → p-QdI17bl-.js.map} +0 -0
  219. /package/dist/components/{p-chA2WA5x.js.map → p-Qzh-wyTg.js.map} +0 -0
  220. /package/dist/components/{p-CnIvWEVm.js.map → p-Xr9OO-Ao.js.map} +0 -0
  221. /package/dist/components/{p-Qf-os3lG.js.map → p-oyZjjoYV.js.map} +0 -0
  222. /package/dist/components/{p-Dbobj7DI.js.map → p-smzwm_EW.js.map} +0 -0
@@ -1 +1 @@
1
- {"schemaVersion":1,"package":"@ds-mo/ui","version":"13.16.1","components":67,"digest":"0ff7f761112558b5a32bed4cabe2bdea0391a9ca9755bdaf54a2697a39fe8b30","completedAt":"2026-08-13T02:34:39.498Z"}
1
+ {"schemaVersion":1,"package":"@ds-mo/ui","version":"13.18.0","components":68,"digest":"da9617973f2183c74efc1698c90e70ca2c4d660afcb87911d54ed9154573a9b3","completedAt":"2026-08-14T00:28:14.055Z"}
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schemaVersion": "1.0.0",
3
3
  "package": "@ds-mo/ui",
4
- "packageVersion": "13.16.1",
4
+ "packageVersion": "13.18.0",
5
5
  "kind": "patterns",
6
6
  "entries": [
7
7
  {
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.16.1",
4
+ "packageVersion": "13.18.0",
5
5
  "kind": "components",
6
6
  "entries": [
7
7
  {
@@ -3624,6 +3624,220 @@
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, 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
+ "The trigger reports how many filter categories have selections, while the footer appears when values are selected and reports the total selected criteria."
3675
+ ],
3676
+ "responsiveBehavior": [
3677
+ "The popup defaults to the large menu-width token and clamps to the viewport.",
3678
+ "Both panes remain visible at narrow widths, with a smaller category minimum and reduced option-pane padding.",
3679
+ "Treat side as preferred placement; the popup flips and clamps when viewport collision requires it."
3680
+ ],
3681
+ "frameworkCaveats": {
3682
+ "customElements": [
3683
+ "Assign filters and values as JavaScript properties after the element is defined."
3684
+ ],
3685
+ "react": [
3686
+ "Pass filters and values as controlled props and handle onDsChange, onDsActiveFilterChange, onDsClear, and onDsClose."
3687
+ ],
3688
+ "angular": [
3689
+ "Use property bindings for filters and values and event bindings for dsChange, dsActiveFilterChange, dsClear, and dsClose."
3690
+ ]
3691
+ },
3692
+ "references": [
3693
+ {
3694
+ "label": "Storybook example",
3695
+ "path": "src/wc/components/FilterMenu/FilterMenu.stories.ts"
3696
+ }
3697
+ ]
3698
+ },
3699
+ "api": {
3700
+ "props": {
3701
+ "activeFill": {
3702
+ "type": "boolean",
3703
+ "required": false
3704
+ },
3705
+ "activeFilterId": {
3706
+ "type": "string | undefined",
3707
+ "required": false
3708
+ },
3709
+ "align": {
3710
+ "type": "AnchoredAlign",
3711
+ "required": false
3712
+ },
3713
+ "alignOffset": {
3714
+ "type": "number | string",
3715
+ "required": false
3716
+ },
3717
+ "anchor": {
3718
+ "type": "HTMLElement | undefined",
3719
+ "required": false
3720
+ },
3721
+ "anchorId": {
3722
+ "type": "string | undefined",
3723
+ "required": false
3724
+ },
3725
+ "ariaLabel": {
3726
+ "type": "string | null",
3727
+ "required": false
3728
+ },
3729
+ "categoriesLabel": {
3730
+ "type": "string",
3731
+ "required": false
3732
+ },
3733
+ "clearLabel": {
3734
+ "type": "string",
3735
+ "required": false
3736
+ },
3737
+ "filters": {
3738
+ "type": "FilterMenuFilter[]",
3739
+ "required": false
3740
+ },
3741
+ "hasBorder": {
3742
+ "type": "boolean",
3743
+ "required": false
3744
+ },
3745
+ "icon": {
3746
+ "type": "string | undefined",
3747
+ "required": false
3748
+ },
3749
+ "initialFocusVisible": {
3750
+ "type": "boolean",
3751
+ "required": false
3752
+ },
3753
+ "inputId": {
3754
+ "type": "string | undefined",
3755
+ "required": false
3756
+ },
3757
+ "menuLabel": {
3758
+ "type": "string",
3759
+ "required": false
3760
+ },
3761
+ "menuWidth": {
3762
+ "type": "string",
3763
+ "required": false
3764
+ },
3765
+ "open": {
3766
+ "type": "boolean",
3767
+ "required": false
3768
+ },
3769
+ "side": {
3770
+ "type": "AnchoredSide",
3771
+ "required": false
3772
+ },
3773
+ "sideOffset": {
3774
+ "type": "number | string",
3775
+ "required": false
3776
+ },
3777
+ "size": {
3778
+ "type": "FilterMenuSize",
3779
+ "required": false
3780
+ },
3781
+ "triggerLabel": {
3782
+ "type": "string",
3783
+ "required": false
3784
+ },
3785
+ "values": {
3786
+ "type": "FilterMenuValues",
3787
+ "required": false
3788
+ },
3789
+ "width": {
3790
+ "type": "FilterMenuWidth",
3791
+ "required": false
3792
+ }
3793
+ },
3794
+ "events": [
3795
+ {
3796
+ "name": "dsActiveFilterChange",
3797
+ "detail": "string"
3798
+ },
3799
+ {
3800
+ "name": "dsAfterClose",
3801
+ "detail": "void"
3802
+ },
3803
+ {
3804
+ "name": "dsChange",
3805
+ "detail": "FilterMenuChangeDetail"
3806
+ },
3807
+ {
3808
+ "name": "dsClear",
3809
+ "detail": "void"
3810
+ },
3811
+ {
3812
+ "name": "dsClose",
3813
+ "detail": "void"
3814
+ },
3815
+ {
3816
+ "name": "dsOpenChange",
3817
+ "detail": "boolean"
3818
+ }
3819
+ ],
3820
+ "slots": []
3821
+ },
3822
+ "exports": {
3823
+ "customElement": "ds-filter-menu",
3824
+ "react": "DsFilterMenu",
3825
+ "angular": "DsFilterMenu"
3826
+ },
3827
+ "dependencies": [
3828
+ "@ds-mo/ui",
3829
+ "@ds-mo/tokens",
3830
+ "@ds-mo/icons"
3831
+ ],
3832
+ "componentDependencies": [
3833
+ "button-unfilled",
3834
+ "checkbox",
3835
+ "icon",
3836
+ "tag",
3837
+ "text",
3838
+ "tooltip"
3839
+ ]
3840
+ },
3627
3841
  {
3628
3842
  "id": "component:ds-icon",
3629
3843
  "tag": "ds-icon",
@@ -4150,15 +4364,15 @@
4150
4364
  "tag": "ds-menu",
4151
4365
  "name": "menu",
4152
4366
  "title": "Menu",
4153
- "summary": "Anchored action menu with flat commands, grouped sections, single-selection choices, supplemental notification dots, switches, and destructive actions.",
4367
+ "summary": "Anchored action menu with flat commands, grouped sections, single-selection choices, supplemental notification dots or trailing tags, switches, and destructive actions.",
4154
4368
  "intentStatus": "complete",
4155
4369
  "intent": {
4156
4370
  "audience": "general",
4157
4371
  "status": "stable",
4158
- "summary": "Anchored action menu with flat commands, grouped sections, single-selection choices, supplemental notification dots, switches, and destructive actions.",
4372
+ "summary": "Anchored action menu with flat commands, grouped sections, single-selection choices, supplemental notification dots or trailing tags, switches, and destructive actions.",
4159
4373
  "useWhen": [
4160
4374
  "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."
4375
+ "Actions need grouping, mutually exclusive selected state, supplemental notification dots or trailing tags, switch rows, or destructive treatment."
4162
4376
  ],
4163
4377
  "avoidWhen": [
4164
4378
  "The user is selecting a value for a form field.",
@@ -4198,7 +4412,8 @@
4198
4412
  "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
4413
  "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
4414
  "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."
4415
+ "Use notification dots only as supplemental status and not as the sole indication of important information.",
4416
+ "Trailing tags are non-interactive supplemental content; their visible label remains part of the menu item's accessible name."
4202
4417
  ],
4203
4418
  "states": [
4204
4419
  "The host owns open state and responds to selection and close events.",
@@ -4207,7 +4422,8 @@
4207
4422
  "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
4423
  "Arrays, objects, and element anchors must be assigned as JavaScript properties.",
4209
4424
  "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."
4425
+ "Ordinary rows, section headings, and supporting text consume the Menu size. At xs, both the primary label and supporting text use caption metrics.",
4426
+ "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
4427
  ],
4212
4428
  "responsiveBehavior": [
4213
4429
  "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 +4552,7 @@
4336
4552
  "badge",
4337
4553
  "swatch-picker",
4338
4554
  "switch",
4555
+ "tag",
4339
4556
  "text"
4340
4557
  ]
4341
4558
  },
@@ -5328,7 +5545,7 @@
5328
5545
  ],
5329
5546
  "states": [
5330
5547
  "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.",
5548
+ "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
5549
  "The default slot owns task content; the named footer slot is optional and is hidden when no actions are assigned.",
5333
5550
  "The optional header description remains stacked beneath the title with the shared compact-header rhythm; longer task content belongs in the default slot.",
5334
5551
  "Primary actions use a bold filled button with semantic intent. Secondary and cancel actions use bordered label-only unfilled buttons.",
@@ -6485,12 +6702,12 @@
6485
6702
  "tag": "ds-select",
6486
6703
  "name": "select",
6487
6704
  "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.",
6705
+ "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
6706
  "intentStatus": "complete",
6490
6707
  "intent": {
6491
6708
  "audience": "general",
6492
6709
  "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.",
6710
+ "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
6711
  "useWhen": [
6495
6712
  "The user must choose one value from a finite set.",
6496
6713
  "The user may choose several independent values when multiple is enabled.",
@@ -6522,11 +6739,12 @@
6522
6739
  ],
6523
6740
  "accessibility": [
6524
6741
  "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.",
6742
+ "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
6743
  "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
6744
  "Disabled options remain visible, expose aria-disabled, and are skipped by keyboard navigation and typeahead.",
6528
6745
  "Keyboard navigation keeps the aria-activedescendant option scrolled into the visible listbox viewport.",
6529
6746
  "Selected options rely on active fill and foreground treatment without a redundant trailing check icon.",
6747
+ "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
6748
  "Local search moves focus into the search field while preserving the active option through aria-activedescendant.",
6531
6749
  "Use errorMessage with error so the trigger is described by the rendered alert."
6532
6750
  ],
@@ -6540,14 +6758,17 @@
6540
6758
  "Clearing emits dsChange with an empty string or empty array according to mode plus dsClear, keeps the popup open, and restores useful focus.",
6541
6759
  "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
6760
  "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.",
6761
+ "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
6762
  "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
6763
  "Create sections only for categories that are meaningful to customers, not merely to break a long list into arbitrary chunks.",
6545
6764
  "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
6765
  "Option labels and the selected trigger label stay on one line and truncate when constrained. Option subtext may wrap to at most two lines.",
6766
+ "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
6767
  "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.",
6548
6768
  "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
6769
  "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.",
6770
+ "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.",
6771
+ "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
6772
  "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
6773
  "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
6774
  "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 +6780,7 @@
6559
6780
  "responsiveBehavior": [
6560
6781
  "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
6782
  "The popup matches the trigger minimum width, may grow for content, and clamps to the viewport.",
6783
+ "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
6784
  "Long option collections scroll inside the popup; virtualization and remote search are not part of this component."
6563
6785
  ],
6564
6786
  "frameworkCaveats": {
@@ -6566,7 +6788,7 @@
6566
6788
  "Assign options, sections, and multiple-mode array values through JavaScript properties because arrays and objects cannot be represented safely as attributes."
6567
6789
  ],
6568
6790
  "react": [
6569
- "Pass options or sections as wrapper props, set multiple for array values, and handle onDsChange, onDsClear, and onDsOpenChange."
6791
+ "Pass options or sections as wrapper props, set multiple for array values, and handle onDsChange, onDsClear, onDsOpenChange, onDsFooterAction, and onDsOptionAction."
6570
6792
  ],
6571
6793
  "angular": [
6572
6794
  "Import DsSelect and SelectValueAccessor when integrating with Angular Forms; bind options and sections as properties."
@@ -6617,6 +6839,10 @@
6617
6839
  "type": "boolean",
6618
6840
  "required": false
6619
6841
  },
6842
+ "dot": {
6843
+ "type": "boolean",
6844
+ "required": false
6845
+ },
6620
6846
  "error": {
6621
6847
  "type": "boolean",
6622
6848
  "required": false
@@ -6625,6 +6851,10 @@
6625
6851
  "type": "string | undefined",
6626
6852
  "required": false
6627
6853
  },
6854
+ "footerActionLabel": {
6855
+ "type": "string | undefined",
6856
+ "required": false
6857
+ },
6628
6858
  "hasBorder": {
6629
6859
  "type": "boolean",
6630
6860
  "required": false
@@ -6673,6 +6903,10 @@
6673
6903
  "type": "string",
6674
6904
  "required": false
6675
6905
  },
6906
+ "popupAlign": {
6907
+ "type": "SelectPopupAlign",
6908
+ "required": false
6909
+ },
6676
6910
  "required": {
6677
6911
  "type": "boolean",
6678
6912
  "required": false
@@ -6701,6 +6935,14 @@
6701
6935
  "type": "SelectSize",
6702
6936
  "required": false
6703
6937
  },
6938
+ "triggerLabel": {
6939
+ "type": "string | undefined",
6940
+ "required": false
6941
+ },
6942
+ "triggerLabelPlaceholder": {
6943
+ "type": "boolean",
6944
+ "required": false
6945
+ },
6704
6946
  "value": {
6705
6947
  "type": "SelectValue",
6706
6948
  "required": false
@@ -6719,9 +6961,17 @@
6719
6961
  "name": "dsClear",
6720
6962
  "detail": "void"
6721
6963
  },
6964
+ {
6965
+ "name": "dsFooterAction",
6966
+ "detail": "void"
6967
+ },
6722
6968
  {
6723
6969
  "name": "dsOpenChange",
6724
6970
  "detail": "boolean"
6971
+ },
6972
+ {
6973
+ "name": "dsOptionAction",
6974
+ "detail": "SelectOptionActionDetail"
6725
6975
  }
6726
6976
  ],
6727
6977
  "slots": []
@@ -6737,6 +6987,7 @@
6737
6987
  "@ds-mo/icons"
6738
6988
  ],
6739
6989
  "componentDependencies": [
6990
+ "badge",
6740
6991
  "button-unfilled",
6741
6992
  "checkbox",
6742
6993
  "empty-state",
@@ -8101,7 +8352,7 @@
8101
8352
  "component:ds-icon"
8102
8353
  ],
8103
8354
  "accessibility": [
8104
- "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 named header slot replace that fallback. header-leading and header-trailing place actions in the matching compact-bar zones without transferring ownership of the bar's outer or copy padding to the application. Their slot outlets remain mounted so dynamically shown selection and filtering summaries cannot briefly enter the table's outer flow or move its frame.",
8355
+ "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
8356
  "Sorting controls remain buttons inside column headers. Member-row sort uses aria-sort, while independent group order is described by the grouped header control.",
8106
8357
  "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
8358
  "Interactive rows are focusable as native rows, activate with Enter or Space, and do not steal activation from their nested selection or action controls.",
@@ -8110,8 +8361,8 @@
8110
8361
  "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
8362
  ],
8112
8363
  "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 and footer slots are composable table-local bars: the component owns their 48px chrome, 8px outer inset, md copy-container padding, balanced text inset, action zones, and sticky placement while the application owns its controls, labels, filtering behavior, and action handling. 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 section header scrolls with its group, pins directly below the column header when reached, and yields when the next section arrives. It also stays pinned to the visible horizontal scrollport and spans the smaller of the visible viewport or table width.",
8364
+ "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.",
8365
+ "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
8366
  "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.",
8116
8367
  "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
8368
  "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.",
@@ -8124,7 +8375,7 @@
8124
8375
  "responsiveBehavior": [
8125
8376
  "The table keeps native semantics at narrow widths and scrolls horizontally instead of transforming into cards.",
8126
8377
  "stickyHeader follows the active vertical scroll owner: a maxHeight, height, or fitViewport table keeps its native header and group sections inside one bounded table scrollport, while a document-flow table retains a semantic native header and renders a sticky control header whose columns follow the body's native inline scroll timeline. Consumers set --ds-table-sticky-header-offset when page chrome occupies an unbounded document scrollport edge. When the 48px table header bar is visible, it sticks at that external offset and the column header stacks immediately below it.",
8127
- "fitViewport uses viewportInsetBlockStart and viewportInsetBlockEnd to describe compact surrounding chrome and page gutters relative to the nearest vertical scroll owner. Before the table reaches that compact position, its host reserves the eventual height while the visible composition grows and vertical input remains owned by the outer page. Once settled, the internal table viewport becomes the vertical scroll owner. In both bounded and document-flow modes, native row-group headers remain the semantic source while one table-owned visual sticky lane is clamped to the active row group's ending boundary, so each incoming section pushes the previous section away without duplicate overlap.",
8378
+ "fitViewport uses viewportInsetBlockStart and viewportInsetBlockEnd to describe compact surrounding chrome and page gutters relative to the nearest vertical scroll owner. Before the table reaches that compact position, its host reserves the eventual height while the visible composition grows and vertical input remains owned by the outer page. Once settled, the internal table viewport becomes the vertical scroll owner. Bounded grouped tables use browser-native sticky section rows inside real block row-group boundaries, so scroll and resize do not run component JavaScript or trigger reactive section swaps. Document-flow tables retain the synchronized visual lane required by their separate horizontal scrollport.",
8128
8379
  "Without maxHeight the table grows the document and automatic lazy loading observes the browser viewport. Horizontal scrolling chains vertical wheel and trackpad movement to the page instead of trapping it.",
8129
8380
  "Explicit column sizes establish the horizontal overflow width; unsized columns share remaining space.",
8130
8381
  "Prefer the named xs through xl column sizes, which resolve through TokoMo's table-column width tokens; numeric pixel sizes remain an escape hatch for exceptional application-owned widths.",
@@ -8594,7 +8845,7 @@
8594
8845
  "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
8846
  "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
8847
  "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.",
8848
+ "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
8849
  "Tabular numbers are for changing numeric values or aligned numeric columns where stable glyph width matters.",
8599
8850
  "Shimmer is reserved for visible generating/loading status text whose owner provides status semantics; reduced motion keeps static readable text."
8600
8851
  ],
@@ -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
+ }
@@ -0,0 +1,57 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ /* tslint:disable */
8
+ /* auto-generated angular directive proxies */
9
+ import { ChangeDetectionStrategy, Component, EventEmitter, Output } from '@angular/core';
10
+ import { ProxyCmp } from './angular-component-lib/utils.js';
11
+ import { defineCustomElement as defineDsFilterMenu } from '@ds-mo/ui/components/ds-filter-menu.js';
12
+ import * as i0 from "@angular/core";
13
+ let DsFilterMenu = class DsFilterMenu {
14
+ constructor(c, r, z) {
15
+ this.z = z;
16
+ this.dsChange = new EventEmitter();
17
+ this.dsClear = new EventEmitter();
18
+ this.dsActiveFilterChange = new EventEmitter();
19
+ this.dsClose = new EventEmitter();
20
+ this.dsOpenChange = new EventEmitter();
21
+ this.dsAfterClose = new EventEmitter();
22
+ c.detach();
23
+ this.el = r.nativeElement;
24
+ }
25
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.0", ngImport: i0, type: DsFilterMenu, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.ElementRef }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component }); }
26
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.1.0", type: DsFilterMenu, isStandalone: true, selector: "ds-filter-menu", inputs: { activeFill: "activeFill", activeFilterId: "activeFilterId", align: "align", alignOffset: "alignOffset", anchor: "anchor", anchorId: "anchorId", ariaLabel: "ariaLabel", categoriesLabel: "categoriesLabel", clearLabel: "clearLabel", filters: "filters", hasBorder: "hasBorder", icon: "icon", initialFocusVisible: "initialFocusVisible", inputId: "inputId", menuLabel: "menuLabel", menuWidth: "menuWidth", open: "open", side: "side", sideOffset: "sideOffset", size: "size", triggerLabel: "triggerLabel", values: "values", width: "width" }, outputs: { dsChange: "dsChange", dsClear: "dsClear", dsActiveFilterChange: "dsActiveFilterChange", dsClose: "dsClose", dsOpenChange: "dsOpenChange", dsAfterClose: "dsAfterClose" }, ngImport: i0, template: '<ng-content></ng-content>', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
27
+ };
28
+ DsFilterMenu = __decorate([
29
+ ProxyCmp({
30
+ defineCustomElementFn: defineDsFilterMenu,
31
+ inputs: ['activeFill', 'activeFilterId', 'align', 'alignOffset', 'anchor', 'anchorId', 'ariaLabel', 'categoriesLabel', 'clearLabel', 'filters', 'hasBorder', 'icon', 'initialFocusVisible', 'inputId', 'menuLabel', 'menuWidth', 'open', 'side', 'sideOffset', 'size', 'triggerLabel', 'values', 'width']
32
+ })
33
+ ], DsFilterMenu);
34
+ export { DsFilterMenu };
35
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.0", ngImport: i0, type: DsFilterMenu, decorators: [{
36
+ type: Component,
37
+ args: [{
38
+ selector: 'ds-filter-menu',
39
+ changeDetection: ChangeDetectionStrategy.OnPush,
40
+ template: '<ng-content></ng-content>',
41
+ // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property
42
+ inputs: ['activeFill', 'activeFilterId', 'align', 'alignOffset', 'anchor', 'anchorId', 'ariaLabel', 'categoriesLabel', 'clearLabel', 'filters', 'hasBorder', 'icon', 'initialFocusVisible', 'inputId', 'menuLabel', 'menuWidth', 'open', 'side', 'sideOffset', 'size', 'triggerLabel', 'values', 'width'],
43
+ outputs: ['dsChange', 'dsClear', 'dsActiveFilterChange', 'dsClose', 'dsOpenChange', 'dsAfterClose'],
44
+ }]
45
+ }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i0.ElementRef }, { type: i0.NgZone }], propDecorators: { dsChange: [{
46
+ type: Output
47
+ }], dsClear: [{
48
+ type: Output
49
+ }], dsActiveFilterChange: [{
50
+ type: Output
51
+ }], dsClose: [{
52
+ type: Output
53
+ }], dsOpenChange: [{
54
+ type: Output
55
+ }], dsAfterClose: [{
56
+ type: Output
57
+ }] } });