@ds-mo/ui 14.20.0 → 14.22.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 (310) hide show
  1. package/dist/.package-ready.json +1 -1
  2. package/dist/agent-patterns.json +8 -4
  3. package/dist/agent.json +447 -44
  4. package/dist/angular/ds-bar-title.d.ts +1 -1
  5. package/dist/angular/ds-bar-title.js +3 -3
  6. package/dist/angular/ds-chip.d.ts +1 -1
  7. package/dist/angular/ds-chip.js +3 -3
  8. package/dist/angular/ds-filter-menu.d.ts +7 -1
  9. package/dist/angular/ds-filter-menu.js +7 -4
  10. package/dist/angular/ds-input.d.ts +1 -1
  11. package/dist/angular/ds-input.js +3 -3
  12. package/dist/angular/ds-panel-nav.d.ts +7 -1
  13. package/dist/angular/ds-panel-nav.js +7 -4
  14. package/dist/angular/ds-shell-app.d.ts +7 -1
  15. package/dist/angular/ds-shell-app.js +7 -4
  16. package/dist/angular/ds-shell-page.d.ts +1 -1
  17. package/dist/angular/ds-shell-page.js +3 -3
  18. package/dist/angular/ds-tab-group.d.ts +1 -1
  19. package/dist/angular/ds-tab-group.js +3 -3
  20. package/dist/angular/ds-table-filter.d.ts +7 -1
  21. package/dist/angular/ds-table-filter.js +7 -4
  22. package/dist/angular/ds-table-group.d.ts +29 -0
  23. package/dist/angular/ds-table-group.js +48 -0
  24. package/dist/angular/ds-table-search.d.ts +20 -0
  25. package/dist/angular/ds-table-search.js +49 -0
  26. package/dist/angular/ds-table.d.ts +1 -1
  27. package/dist/angular/ds-table.js +3 -3
  28. package/dist/angular/index.d.ts +1 -1
  29. package/dist/angular/index.js +2 -0
  30. package/dist/angular/proxies.d.ts +2 -0
  31. package/dist/angular/proxies.js +2 -0
  32. package/dist/components/ds-agent-activity.js +1 -1
  33. package/dist/components/ds-agent-questionnaire.js +1 -1
  34. package/dist/components/ds-agent-response.js +1 -1
  35. package/dist/components/ds-agent-source-list.js +1 -1
  36. package/dist/components/ds-agent-tool-call.js +1 -1
  37. package/dist/components/ds-attachment-list.js +1 -1
  38. package/dist/components/ds-badge.js +1 -1
  39. package/dist/components/ds-banner.js +1 -1
  40. package/dist/components/ds-bar-action.js +1 -1
  41. package/dist/components/ds-bar-nav.js +1 -1
  42. package/dist/components/ds-bar-title.js +1 -1
  43. package/dist/components/ds-bar-workflow.js +1 -1
  44. package/dist/components/ds-breadcrumb.js +1 -1
  45. package/dist/components/ds-button-filled.js +1 -1
  46. package/dist/components/ds-button-unfilled.js +1 -1
  47. package/dist/components/ds-card-chart.js +1 -1
  48. package/dist/components/ds-card-overview.js +1 -1
  49. package/dist/components/ds-card-setting.js +1 -1
  50. package/dist/components/ds-chart-legend.js +1 -1
  51. package/dist/components/ds-chart.js +1 -1
  52. package/dist/components/ds-checkbox.js +1 -1
  53. package/dist/components/ds-chip.js +1 -1
  54. package/dist/components/ds-chip.js.map +1 -1
  55. package/dist/components/ds-code-block.js +1 -1
  56. package/dist/components/ds-conversation-list-item.js +1 -1
  57. package/dist/components/ds-conversation-list-section.js +1 -1
  58. package/dist/components/ds-empty-state.js +1 -1
  59. package/dist/components/ds-field.js +1 -1
  60. package/dist/components/ds-filter-menu.js +1 -1
  61. package/dist/components/ds-input.js +1 -1
  62. package/dist/components/ds-markdown.js +1 -1
  63. package/dist/components/ds-menu.js +1 -1
  64. package/dist/components/ds-message-actions.js +1 -1
  65. package/dist/components/ds-message-composer.js +1 -1
  66. package/dist/components/ds-message-scroller.js +1 -1
  67. package/dist/components/ds-message-scroller.js.map +1 -1
  68. package/dist/components/ds-message.js +1 -1
  69. package/dist/components/ds-mobile-bar-nav.js +1 -1
  70. package/dist/components/ds-mobile-header.js +1 -1
  71. package/dist/components/ds-mobile-section-switcher.js +1 -1
  72. package/dist/components/ds-mobile-sheet-nav.js +1 -1
  73. package/dist/components/ds-modal.js +1 -1
  74. package/dist/components/ds-pagination.js +1 -1
  75. package/dist/components/ds-panel-nav.js +1 -1
  76. package/dist/components/ds-panel-sub-nav.js +1 -1
  77. package/dist/components/ds-panel-tool-header.js +1 -1
  78. package/dist/components/ds-panel-tool-search.js +1 -1
  79. package/dist/components/ds-panel-tool-search.js.map +1 -1
  80. package/dist/components/ds-panel-tools.js +1 -1
  81. package/dist/components/ds-paper-texture.js +1 -1
  82. package/dist/components/ds-radio.js +1 -1
  83. package/dist/components/ds-select.js +1 -1
  84. package/dist/components/ds-shell-app.js +1 -1
  85. package/dist/components/ds-shell-app.js.map +1 -1
  86. package/dist/components/ds-shell-page.js +1 -1
  87. package/dist/components/ds-shell-tools.js +1 -1
  88. package/dist/components/ds-slider.js +1 -1
  89. package/dist/components/ds-swatch-picker.js +1 -1
  90. package/dist/components/ds-tab-group.js +1 -1
  91. package/dist/components/ds-table-filter.js +1 -1
  92. package/dist/components/ds-table-filter.js.map +1 -1
  93. package/dist/components/ds-table-group.d.ts +11 -0
  94. package/dist/components/ds-table-group.js +2 -0
  95. package/dist/components/ds-table-group.js.map +1 -0
  96. package/dist/components/ds-table-saved-views.js +1 -1
  97. package/dist/components/ds-table-search.d.ts +11 -0
  98. package/dist/components/ds-table-search.js +2 -0
  99. package/dist/components/ds-table-search.js.map +1 -0
  100. package/dist/components/ds-table-sort.js +1 -1
  101. package/dist/components/ds-table-sort.js.map +1 -1
  102. package/dist/components/ds-table-toolbar.js +1 -1
  103. package/dist/components/ds-table-toolbar.js.map +1 -1
  104. package/dist/components/ds-table.js +1 -1
  105. package/dist/components/ds-table.js.map +1 -1
  106. package/dist/components/ds-tag.js +1 -1
  107. package/dist/components/ds-text.js +1 -1
  108. package/dist/components/ds-toast.js +1 -1
  109. package/dist/components/ds-tooltip-chart.js +1 -1
  110. package/dist/components/ds-tooltip.js +1 -1
  111. package/dist/components/ds-typing-indicator.js +1 -1
  112. package/dist/components/{p-Bf7PZJPT.js → p-5Z4oYuiK.js} +2 -2
  113. package/dist/components/{p-DIlScMvI.js → p-6rB0eAda.js} +2 -2
  114. package/dist/components/{p-CptSB-tA.js → p-9ykZwPlI.js} +2 -2
  115. package/dist/components/p-B0OZx3JB.js +2 -0
  116. package/dist/components/p-B0OZx3JB.js.map +1 -0
  117. package/dist/components/{p-BHhmB9-4.js → p-B0kSlcaw.js} +2 -2
  118. package/dist/components/{p-DWjTOoXs.js → p-B1wMpt1z.js} +2 -2
  119. package/dist/components/p-BEttT0UB.js +2 -0
  120. package/dist/components/p-BEttT0UB.js.map +1 -0
  121. package/dist/components/p-BFit8o0r.js +2 -0
  122. package/dist/components/p-BFit8o0r.js.map +1 -0
  123. package/dist/components/{p-fRDzpfi9.js → p-BXv6RpoF.js} +2 -2
  124. package/dist/components/{p-D7QlTWbN.js → p-BbG7nOcz.js} +2 -2
  125. package/dist/components/{p-Bx5BSd6F.js → p-BcxidW9k.js} +2 -2
  126. package/dist/components/{p-1UAVanY9.js → p-Bd8I2oXN.js} +2 -2
  127. package/dist/components/{p-DGe5oXR0.js → p-Bjq1KP_Y.js} +2 -2
  128. package/dist/components/p-Bjq1KP_Y.js.map +1 -0
  129. package/dist/components/{p-DW5Ita-P.js → p-BnTPuV3x.js} +2 -2
  130. package/dist/components/{p-DW5Ita-P.js.map → p-BnTPuV3x.js.map} +1 -1
  131. package/dist/components/p-BqVXMEJm.js +2 -0
  132. package/dist/components/p-BqVXMEJm.js.map +1 -0
  133. package/dist/components/p-CB3fv_Oh.js +2 -0
  134. package/dist/components/p-CB3fv_Oh.js.map +1 -0
  135. package/dist/components/{p-DdH7b4JF.js → p-CBymzuOO.js} +2 -2
  136. package/dist/components/{p-BjRD57w3.js → p-CE2b5GPu.js} +2 -2
  137. package/dist/components/{p-DBYv7fRq.js → p-CFkZSDwI.js} +2 -2
  138. package/dist/components/{p-Bb4KnRy0.js → p-CTH3dSYg.js} +2 -2
  139. package/dist/components/{p-BmssRAEZ.js → p-CZ144LS5.js} +2 -2
  140. package/dist/components/{p-B-HsfQOK.js → p-Cd1JnnVK.js} +2 -2
  141. package/dist/components/p-CeKa4VbU.js +2 -0
  142. package/dist/components/{p-AtUP95E_.js.map → p-CeKa4VbU.js.map} +1 -1
  143. package/dist/components/{p-CDw_WEVt.js → p-Cnsvgx1M.js} +2 -2
  144. package/dist/components/{p-BYFS2qWb.js → p-CpeJMKJ5.js} +2 -2
  145. package/dist/components/{p-DM1Z_hh0.js → p-D36EmETH.js} +2 -2
  146. package/dist/components/p-D9wZlB_N.js +2 -0
  147. package/dist/components/p-D9wZlB_N.js.map +1 -0
  148. package/dist/components/{p-DFC0sRM-.js → p-DI8DUozc.js} +2 -2
  149. package/dist/components/{p-v4oqkJms.js → p-DSy1oOnd.js} +2 -2
  150. package/dist/components/{p-v4oqkJms.js.map → p-DSy1oOnd.js.map} +1 -1
  151. package/dist/components/{p-DQBT1Jkf.js → p-DbLLH3hr.js} +2 -2
  152. package/dist/components/{p-B2FT4Da6.js → p-De0qjzPu.js} +2 -2
  153. package/dist/components/{p-B6rSDhJY.js → p-Dit6JmAK.js} +2 -2
  154. package/dist/components/p-DnZ7DNaz.js +2 -0
  155. package/dist/components/p-DnZ7DNaz.js.map +1 -0
  156. package/dist/components/{p-caLOcQUK.js → p-DzPtYdXy.js} +2 -2
  157. package/dist/components/{p-Do8wbFff.js → p-XaCYqck3.js} +2 -2
  158. package/dist/components/{p-L8IIeDXM.js → p-_C-XRpCB.js} +2 -2
  159. package/dist/components/{p-CyZqk196.js → p-bHnk8t5I.js} +2 -2
  160. package/dist/components/p-hYjmOPCI.js +2 -0
  161. package/dist/components/p-hYjmOPCI.js.map +1 -0
  162. package/dist/components/{p-ChfVRPHw.js → p-pUOA3iDG.js} +2 -2
  163. package/dist/components/{p-DLbHgbVj.js → p-pnO8tAYB.js} +2 -2
  164. package/dist/components/{p-CCmgtju-.js → p-pxN8JGEh.js} +2 -2
  165. package/dist/components/p-pxN8JGEh.js.map +1 -0
  166. package/dist/components/{p-B4wTnsUL.js → p-w9fkkwL2.js} +2 -2
  167. package/dist/components/p-x5u5Ueli.js +2 -0
  168. package/dist/components/{p-BeA6Jv-3.js.map → p-x5u5Ueli.js.map} +1 -1
  169. package/dist/docs/components.json +1582 -45
  170. package/dist/lib/components/BarTitle/bar-title-types.d.ts +1 -0
  171. package/dist/lib/components/Menu/menu-placement.d.ts +13 -0
  172. package/dist/lib/components/PanelNav/panel-nav-types.d.ts +19 -0
  173. package/dist/lib/components/ShellApp/shell-app-types.d.ts +1 -0
  174. package/dist/lib/components/ShellPage/shell-page-types.d.ts +1 -0
  175. package/dist/lib/shell/index.d.ts +3 -3
  176. package/dist/lib/shell/index.js.map +2 -2
  177. package/dist/mcp-data/registry/bar-title.json +25 -4
  178. package/dist/mcp-data/registry/button-filled.json +1 -0
  179. package/dist/mcp-data/registry/button-unfilled.json +1 -0
  180. package/dist/mcp-data/registry/chip.json +39 -2
  181. package/dist/mcp-data/registry/filter-menu.json +84 -11
  182. package/dist/mcp-data/registry/input.json +54 -2
  183. package/dist/mcp-data/registry/menu.json +1 -1
  184. package/dist/mcp-data/registry/panel-nav.json +71 -10
  185. package/dist/mcp-data/registry/panel-tool-search.json +4 -5
  186. package/dist/mcp-data/registry/registry.json +452 -43
  187. package/dist/mcp-data/registry/select.json +1 -0
  188. package/dist/mcp-data/registry/shell-app.json +47 -5
  189. package/dist/mcp-data/registry/shell-page.json +25 -5
  190. package/dist/mcp-data/registry/tab-group.json +21 -2
  191. package/dist/mcp-data/registry/table-filter.json +79 -9
  192. package/dist/mcp-data/registry/table-group.json +301 -0
  193. package/dist/mcp-data/registry/table-search.json +343 -0
  194. package/dist/mcp-data/registry/table-sort.json +1 -1
  195. package/dist/mcp-data/registry/table-toolbar.json +7 -6
  196. package/dist/mcp-data/registry/table.json +55 -17
  197. package/dist/react/components.d.ts +2 -0
  198. package/dist/react/components.js +2 -0
  199. package/dist/react/ds-filter-menu.d.ts +2 -1
  200. package/dist/react/ds-filter-menu.js +1 -0
  201. package/dist/react/ds-panel-nav.d.ts +2 -1
  202. package/dist/react/ds-panel-nav.js +1 -0
  203. package/dist/react/ds-shell-app.d.ts +2 -1
  204. package/dist/react/ds-shell-app.js +1 -0
  205. package/dist/react/ds-table-filter.d.ts +2 -1
  206. package/dist/react/ds-table-filter.js +1 -0
  207. package/dist/react/ds-table-group.d.ts +14 -0
  208. package/dist/react/ds-table-group.js +16 -0
  209. package/dist/react/ds-table-search.d.ts +14 -0
  210. package/dist/react/ds-table-search.js +16 -0
  211. package/dist/styles/table.css +46 -0
  212. package/dist/types/components/BarTitle/BarTitle.d.ts +4 -1
  213. package/dist/types/components/BarTitle/bar-title-types.d.ts +1 -0
  214. package/dist/types/components/BarTitle/index.d.ts +1 -1
  215. package/dist/types/components/Chip/Chip.d.ts +5 -0
  216. package/dist/types/components/FilterMenu/FilterMenu.d.ts +26 -0
  217. package/dist/types/components/Input/Input.d.ts +6 -0
  218. package/dist/types/components/Menu/menu-placement.d.ts +13 -0
  219. package/dist/types/components/PanelNav/PanelNav.d.ts +29 -2
  220. package/dist/types/components/PanelNav/index.d.ts +2 -2
  221. package/dist/types/components/PanelNav/panel-nav-types.d.ts +19 -0
  222. package/dist/types/components/PanelNav/panel-nav-utils.d.ts +10 -2
  223. package/dist/types/components/ShellApp/ShellApp.d.ts +11 -1
  224. package/dist/types/components/ShellApp/shell-app-types.d.ts +1 -0
  225. package/dist/types/components/ShellPage/ShellPage.d.ts +6 -1
  226. package/dist/types/components/ShellPage/index.d.ts +1 -1
  227. package/dist/types/components/ShellPage/shell-page-types.d.ts +1 -0
  228. package/dist/types/components/TabGroup/TabGroup.d.ts +2 -0
  229. package/dist/types/components/Table/Table.d.ts +6 -0
  230. package/dist/types/components/Table/index.d.ts +1 -1
  231. package/dist/types/components/Table/table-cell-model.d.ts +11 -1
  232. package/dist/types/components/Table/table-highlight.d.ts +12 -0
  233. package/dist/types/components/Table/table-model.d.ts +6 -5
  234. package/dist/types/components/Table/table-render-model.d.ts +1 -1
  235. package/dist/types/components/Table/table-row-view.d.ts +4 -1
  236. package/dist/types/components/Table/table-types.d.ts +22 -4
  237. package/dist/types/components/Table/table-virtual-model.d.ts +2 -0
  238. package/dist/types/components/TableFilter/TableFilter.d.ts +9 -1
  239. package/dist/types/components/TableGroup/TableGroup.d.ts +60 -0
  240. package/dist/types/components/TableSearch/TableSearch.d.ts +56 -0
  241. package/dist/types/components/TableSearch/table-search-model.d.ts +10 -0
  242. package/dist/types/components/TableSearch/table-search-types.d.ts +10 -0
  243. package/dist/types/components.d.ts +459 -14
  244. package/dist/types/shell/index.d.ts +3 -3
  245. package/dist/types/utils/choice-list-parts.d.ts +11 -1
  246. package/dist/types/utils/select-controller.d.ts +1 -1
  247. package/dist/vue/components.d.ts +2 -0
  248. package/dist/vue/components.js +2 -0
  249. package/dist/vue/ds-bar-title.js +1 -0
  250. package/dist/vue/ds-chip.js +2 -0
  251. package/dist/vue/ds-filter-menu.js +5 -0
  252. package/dist/vue/ds-input.js +3 -0
  253. package/dist/vue/ds-panel-nav.js +4 -0
  254. package/dist/vue/ds-shell-app.js +3 -0
  255. package/dist/vue/ds-shell-page.js +1 -0
  256. package/dist/vue/ds-tab-group.js +1 -0
  257. package/dist/vue/ds-table-filter.js +5 -0
  258. package/dist/vue/ds-table-group.d.ts +3 -0
  259. package/dist/vue/ds-table-group.js +20 -0
  260. package/dist/vue/ds-table-search.d.ts +3 -0
  261. package/dist/vue/ds-table-search.js +22 -0
  262. package/dist/vue/ds-table.js +2 -0
  263. package/package.json +1 -1
  264. package/dist/components/p-AtUP95E_.js +0 -2
  265. package/dist/components/p-B5-R5mb8.js +0 -2
  266. package/dist/components/p-B5-R5mb8.js.map +0 -1
  267. package/dist/components/p-BUexfjjg.js +0 -2
  268. package/dist/components/p-BUexfjjg.js.map +0 -1
  269. package/dist/components/p-BeA6Jv-3.js +0 -2
  270. package/dist/components/p-BkelrY4-.js +0 -2
  271. package/dist/components/p-BkelrY4-.js.map +0 -1
  272. package/dist/components/p-CCmgtju-.js.map +0 -1
  273. package/dist/components/p-DA5H_Iq_.js +0 -2
  274. package/dist/components/p-DA5H_Iq_.js.map +0 -1
  275. package/dist/components/p-DGe5oXR0.js.map +0 -1
  276. package/dist/components/p-DKt_8s-U.js +0 -2
  277. package/dist/components/p-DKt_8s-U.js.map +0 -1
  278. package/dist/components/p-DfDoqOlx.js +0 -2
  279. package/dist/components/p-DfDoqOlx.js.map +0 -1
  280. package/dist/components/p-rw0ZxIE4.js +0 -2
  281. package/dist/components/p-rw0ZxIE4.js.map +0 -1
  282. /package/dist/components/{p-Bf7PZJPT.js.map → p-5Z4oYuiK.js.map} +0 -0
  283. /package/dist/components/{p-DIlScMvI.js.map → p-6rB0eAda.js.map} +0 -0
  284. /package/dist/components/{p-CptSB-tA.js.map → p-9ykZwPlI.js.map} +0 -0
  285. /package/dist/components/{p-BHhmB9-4.js.map → p-B0kSlcaw.js.map} +0 -0
  286. /package/dist/components/{p-DWjTOoXs.js.map → p-B1wMpt1z.js.map} +0 -0
  287. /package/dist/components/{p-fRDzpfi9.js.map → p-BXv6RpoF.js.map} +0 -0
  288. /package/dist/components/{p-D7QlTWbN.js.map → p-BbG7nOcz.js.map} +0 -0
  289. /package/dist/components/{p-Bx5BSd6F.js.map → p-BcxidW9k.js.map} +0 -0
  290. /package/dist/components/{p-1UAVanY9.js.map → p-Bd8I2oXN.js.map} +0 -0
  291. /package/dist/components/{p-DdH7b4JF.js.map → p-CBymzuOO.js.map} +0 -0
  292. /package/dist/components/{p-BjRD57w3.js.map → p-CE2b5GPu.js.map} +0 -0
  293. /package/dist/components/{p-DBYv7fRq.js.map → p-CFkZSDwI.js.map} +0 -0
  294. /package/dist/components/{p-Bb4KnRy0.js.map → p-CTH3dSYg.js.map} +0 -0
  295. /package/dist/components/{p-BmssRAEZ.js.map → p-CZ144LS5.js.map} +0 -0
  296. /package/dist/components/{p-B-HsfQOK.js.map → p-Cd1JnnVK.js.map} +0 -0
  297. /package/dist/components/{p-CDw_WEVt.js.map → p-Cnsvgx1M.js.map} +0 -0
  298. /package/dist/components/{p-BYFS2qWb.js.map → p-CpeJMKJ5.js.map} +0 -0
  299. /package/dist/components/{p-DM1Z_hh0.js.map → p-D36EmETH.js.map} +0 -0
  300. /package/dist/components/{p-DFC0sRM-.js.map → p-DI8DUozc.js.map} +0 -0
  301. /package/dist/components/{p-DQBT1Jkf.js.map → p-DbLLH3hr.js.map} +0 -0
  302. /package/dist/components/{p-B2FT4Da6.js.map → p-De0qjzPu.js.map} +0 -0
  303. /package/dist/components/{p-B6rSDhJY.js.map → p-Dit6JmAK.js.map} +0 -0
  304. /package/dist/components/{p-caLOcQUK.js.map → p-DzPtYdXy.js.map} +0 -0
  305. /package/dist/components/{p-Do8wbFff.js.map → p-XaCYqck3.js.map} +0 -0
  306. /package/dist/components/{p-L8IIeDXM.js.map → p-_C-XRpCB.js.map} +0 -0
  307. /package/dist/components/{p-CyZqk196.js.map → p-bHnk8t5I.js.map} +0 -0
  308. /package/dist/components/{p-ChfVRPHw.js.map → p-pUOA3iDG.js.map} +0 -0
  309. /package/dist/components/{p-DLbHgbVj.js.map → p-pnO8tAYB.js.map} +0 -0
  310. /package/dist/components/{p-B4wTnsUL.js.map → p-w9fkkwL2.js.map} +0 -0
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": "14.20.0",
4
+ "packageVersion": "14.22.0",
5
5
  "kind": "components",
6
6
  "entries": [
7
7
  {
@@ -1256,6 +1256,7 @@
1256
1256
  ],
1257
1257
  "commonlyComposedWith": [
1258
1258
  "component:ds-shell-page",
1259
+ "component:ds-shell-app",
1259
1260
  "component:ds-button-filled",
1260
1261
  "component:ds-button-unfilled",
1261
1262
  "component:ds-breadcrumb",
@@ -1280,11 +1281,13 @@
1280
1281
  "The overflow trigger uses its bordered treatment whenever the primary action is visible beside it; overflow-only and auto-collapsed-primary presentations keep the trigger borderless.",
1281
1282
  "expanded renders the larger heading, optional description, inset divider, and a full-width caption breadcrumb row above the title. The breadcrumb begins after 32px top padding; the following title and right-side actions share one top alignment. Compact renders 48px chrome with the existing icon Back action; constrained uses compact chrome and moves an auto-collapse primary action into overflow.",
1282
1283
  "primaryAction collapse defaults to auto. Use never for exceptional actions whose hierarchy must remain visible in constrained layouts.",
1283
- "showDivider=false removes the bottom divider when the surrounding page composition supplies the boundary; showCompactDivider can independently restore or remove that boundary in compact and constrained variants."
1284
+ "showDivider=false removes the bottom divider when the surrounding page composition supplies the boundary; showCompactDivider can independently restore or remove that boundary in compact and constrained variants.",
1285
+ "placement=shell-bar is reserved for ShellApp panel section navigation. It remains compact, omits description and breadcrumb presentation, and preserves applicable Back, section, primary, and overflow controls."
1284
1286
  ],
1285
1287
  "responsiveBehavior": [
1286
1288
  "BarTitle does not observe viewport, shell, scroll, or container state. Its owner selects an explicit variant.",
1287
1289
  "ShellPage is the standard owner for automatic expanded, compact, and constrained selection.",
1290
+ "ShellApp owns shell-bar placement and always selects compact presentation there; mobile continues to use MobileHeader.",
1288
1291
  "When ShellPage owns BarTitle on a secondary desktop or tablet page, its expanded, compact, and constrained presentations all match that canvas; the separate MobileHeader component remains primary.",
1289
1292
  "Compact titles use the shared compact-header geometry and md control inset so top-level headings align with BarNav and inline Back geometry aligns with PanelToolHeader. Long headings and section labels truncate independently while Back and action controls retain complete hit targets and accessible names.",
1290
1293
  "A never-collapse primary action remains visible in constrained mode; the title and section label yield space first."
@@ -1352,6 +1355,10 @@
1352
1355
  "type": "string",
1353
1356
  "required": true
1354
1357
  },
1358
+ "placement": {
1359
+ "type": "BarTitlePlacement",
1360
+ "required": false
1361
+ },
1355
1362
  "primaryAction": {
1356
1363
  "type": "BarTitlePrimaryAction | null",
1357
1364
  "required": false
@@ -1766,6 +1773,7 @@
1766
1773
  ],
1767
1774
  "states": [
1768
1775
  "Every size applies one complete control-density recipe across frame height, inline padding, icon zone, text-container inset, gap, and radius.",
1776
+ "Every button has a minimum inline size equal to its resolved height. Short labels therefore form a square control while longer labels continue to hug their content.",
1769
1777
  "Set isInset only when the button is nested inside a same-size control. The default single inset removes 4px overall; insetDepth double removes 8px overall so the parent can add 4px per edge while preserving its outer alignment box. Double inset falls back to single at xs to protect minimum icon geometry.",
1770
1778
  "Use only one filled action per local decision area; render all secondary actions with ButtonUnfilled.",
1771
1779
  "Choose brand or neutral for general commands. Reserve positive, negative, warning, and caution for matching action consequences, and AI, guide, or walkthrough for actions that enter those feature experiences.",
@@ -1980,6 +1988,7 @@
1980
1988
  ],
1981
1989
  "states": [
1982
1990
  "Every size applies one complete control-density recipe across frame height, inline padding, icon zone, text-container inset, gap, and radius.",
1991
+ "Every button has a minimum inline size equal to its resolved height. Short labels therefore form a square control while longer labels continue to hug their content.",
1983
1992
  "Set isInset only when the button is nested inside a same-size control. The default single inset removes 4px overall; insetDepth double removes 8px overall so the parent can add 4px per edge while preserving its outer alignment box. Double inset falls back to single at xs to protect minimum icon geometry.",
1984
1993
  "A true pressed toggle and owner-controlled isActive emphasis share the selected visual treatment, but only pressed supplies toggle semantics and dsChange.",
1985
1994
  "General content UI keeps the selected interaction fill and border for pressed or active emphasis.",
@@ -3049,6 +3058,7 @@
3049
3058
  "The dismiss action is the chip's only interaction, and the parent owns data mutation after dsRemove.",
3050
3059
  "Long labels remain on one line and truncate only when the consuming layout supplies a maximum width; otherwise the chip sizes to its content.",
3051
3060
  "Rounded shape is a visual choice and does not change semantics or interaction.",
3061
+ "isInset opts into reduced outer geometry only when Chip is nested inside a control of the same density. The dismiss button applies the same inset depth again inside the Chip's already-reduced height, and its trailing padding matches the resulting top and bottom space. The default single inset removes 4px overall; insetDepth double removes 8px overall and falls back to single at xs.",
3052
3062
  "Chip is designed only for primary surfaces and has no surface-context API."
3053
3063
  ],
3054
3064
  "responsiveBehavior": [
@@ -3075,10 +3085,18 @@
3075
3085
  },
3076
3086
  "api": {
3077
3087
  "props": {
3088
+ "insetDepth": {
3089
+ "type": "ControlInsetDepth",
3090
+ "required": false
3091
+ },
3078
3092
  "isInactive": {
3079
3093
  "type": "boolean",
3080
3094
  "required": false
3081
3095
  },
3096
+ "isInset": {
3097
+ "type": "boolean",
3098
+ "required": false
3099
+ },
3082
3100
  "label": {
3083
3101
  "type": "string",
3084
3102
  "required": true
@@ -3800,12 +3818,12 @@
3800
3818
  "tag": "ds-filter-menu",
3801
3819
  "name": "filter-menu",
3802
3820
  "title": "FilterMenu",
3803
- "summary": "Controlled two-pane filter select with menu-recipe category navigation, single- and multiple-choice, boolean, semantic relative-date and fixed-range filters, selected counts, and a clear action.",
3821
+ "summary": "Controlled two-pane filter select with menu-recipe category navigation, local option search for non-date categories, single- and multiple-choice, boolean, semantic relative-date and fixed-range filters, selected counts, and a clear action.",
3804
3822
  "intentStatus": "complete",
3805
3823
  "intent": {
3806
3824
  "audience": "general",
3807
3825
  "status": "stable",
3808
- "summary": "Controlled two-pane filter select with menu-recipe category navigation, single- and multiple-choice, boolean, semantic relative-date and fixed-range filters, selected counts, and a clear action.",
3826
+ "summary": "Controlled two-pane filter select with menu-recipe category navigation, local option search for non-date categories, single- and multiple-choice, boolean, semantic relative-date and fixed-range filters, selected counts, and a clear action.",
3809
3827
  "useWhen": [
3810
3828
  "A compact trigger must expose several filter families without turning the toolbar into many separate controls.",
3811
3829
  "Users need to move between persistent filter categories while editing the selected category in a second pane."
@@ -3835,17 +3853,20 @@
3835
3853
  "accessibility": [
3836
3854
  "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.",
3837
3855
  "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.",
3856
+ "Every non-date category begins with a labelled search field. Arrow Down and Arrow Up enter the first or last visible option, while Left and Right retain native text-caret behavior. Search matches option labels and descriptions without changing selected values.",
3838
3857
  "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.",
3839
- "Date filters expose Range and Relative tabs in a compact header. Relative presets use listbox semantics; the range calendar exposes a labelled grid, one tab stop, arrow-key day navigation, Home and End week navigation, and Page Up or Page Down month navigation.",
3858
+ "Date filters expose containerless Range and Relative tabs in a secondary-background header with 4px padding around the 32px medium control. Relative presets use listbox semantics; the range calendar exposes a labelled grid, one tab stop, arrow-key day navigation, Home and End week navigation, and Page Up or Page Down month navigation. After a range start is chosen, pointer hover and keyboard focus preview the possible inclusive range without changing selection semantics.",
3840
3859
  "When an external trigger is inside an open shadow tree, pass its HTMLElement through anchor so outside activation, focus return, and Tab continuation use the composed tree.",
3841
3860
  "The trigger count reports active filter categories. Multiple-choice category tags report individual selected criteria, while an applied Date category uses a visual dot because its value is singular. The default summary footer announces the total; the categories-clear footer recipe reserves a visually empty category-pane action row and exposes its divider and only Clear when criteria are active."
3842
3861
  ],
3843
3862
  "states": [
3844
- "The application owns filters, values, activeFilterId, and open. Replace controlled objects and arrays after dsChange, dsActiveFilterChange, dsClear, or dsClose.",
3863
+ "The application owns filters, values, matchModes, activeFilterId, and open. Replace controlled objects and arrays after dsChange, dsMatchModeChange, dsActiveFilterChange, dsClear, or dsClose.",
3845
3864
  "Single filters return a string, multiple filters return ordered string arrays, boolean filters return a boolean, and date filters return a serializable semantic string.",
3865
+ "Multiple filters expose a right-pane footer reading Limit results to any or all selected. any is the default OR mode. Activating the blue mode word requests the opposite controlled mode through dsMatchModeChange; the application owns the corresponding query semantics.",
3866
+ "Non-date option search is internal, scoped independently per category while the popup remains open, and reset after the popup closes. An unmatched query shows the configurable noResultsText empty state. Date uses its Relative and Range modes instead of option search.",
3846
3867
  "Date values are serializable semantic strings: relative:<preset> preserves a relative choice for future resolution and range:<start>/<end> preserves fixed inclusive ISO calendar dates. A legacy YYYY-MM-DD value is interpreted as a one-day range.",
3847
3868
  "Relative presets are Today, Yesterday, and the last 7, 14, 30, 60, or 90 inclusive calendar days. Applications resolve them against their current product date and time-zone policy by using resolveDateFilterRange from @ds-mo/ui/utils.",
3848
- "Range selection applies the first date immediately as a one-day range; a second activation completes an ordered inclusive range. A new activation after completion starts a replacement range.",
3869
+ "Range selection applies the first date immediately as a one-day range; while an end is pending, that selected start retains its bold treatment and hovering or focusing another day paints the rest of the provisional inclusive span faint without emitting a value. A second activation completes an ordered inclusive range and gives both edges the bold treatment. A new activation after completion starts a replacement range.",
3849
3870
  "Selection applies immediately and does not close the popup.",
3850
3871
  "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.",
3851
3872
  "The trigger reports how many filter categories have selections. footerLayout=summary adds a full-width selected-count footer only while values are selected; footerLayout=categories-clear always reserves the category-pane footer height while keeping its inactive divider hidden, then reveals the divider and only its left-aligned Clear action while values are selected."
@@ -3858,13 +3879,13 @@
3858
3879
  ],
3859
3880
  "frameworkCaveats": {
3860
3881
  "customElements": [
3861
- "Assign filters and values as JavaScript properties after the element is defined."
3882
+ "Assign filters, values, and matchModes as JavaScript properties after the element is defined."
3862
3883
  ],
3863
3884
  "react": [
3864
- "Pass filters and values as controlled props and handle onDsChange, onDsActiveFilterChange, onDsClear, and onDsClose."
3885
+ "Pass filters, values, and matchModes as controlled props and handle onDsChange, onDsMatchModeChange, onDsActiveFilterChange, onDsClear, and onDsClose."
3865
3886
  ],
3866
3887
  "angular": [
3867
- "Use property bindings for filters and values and event bindings for dsChange, dsActiveFilterChange, dsClear, and dsClose."
3888
+ "Use property bindings for filters, values, and matchModes and event bindings for dsChange, dsMatchModeChange, dsActiveFilterChange, dsClear, and dsClose."
3868
3889
  ]
3869
3890
  },
3870
3891
  "references": [
@@ -3944,6 +3965,10 @@
3944
3965
  "type": "string | undefined",
3945
3966
  "required": false
3946
3967
  },
3968
+ "matchModes": {
3969
+ "type": "FilterMenuMatchModes",
3970
+ "required": false
3971
+ },
3947
3972
  "menuLabel": {
3948
3973
  "type": "string",
3949
3974
  "required": false
@@ -3952,10 +3977,18 @@
3952
3977
  "type": "string",
3953
3978
  "required": false
3954
3979
  },
3980
+ "noResultsText": {
3981
+ "type": "string",
3982
+ "required": false
3983
+ },
3955
3984
  "open": {
3956
3985
  "type": "boolean",
3957
3986
  "required": false
3958
3987
  },
3988
+ "searchPlaceholder": {
3989
+ "type": "string",
3990
+ "required": false
3991
+ },
3959
3992
  "showSelectedCount": {
3960
3993
  "type": "boolean",
3961
3994
  "required": false
@@ -4006,6 +4039,10 @@
4006
4039
  "name": "dsClose",
4007
4040
  "detail": "void"
4008
4041
  },
4042
+ {
4043
+ "name": "dsMatchModeChange",
4044
+ "detail": "FilterMenuMatchModeChangeDetail"
4045
+ },
4009
4046
  {
4010
4047
  "name": "dsOpenChange",
4011
4048
  "detail": "boolean"
@@ -4028,7 +4065,9 @@
4028
4065
  "badge",
4029
4066
  "button-unfilled",
4030
4067
  "checkbox",
4068
+ "empty-state",
4031
4069
  "icon",
4070
+ "input",
4032
4071
  "tab-group",
4033
4072
  "tag",
4034
4073
  "text",
@@ -4210,10 +4249,12 @@
4210
4249
  ],
4211
4250
  "states": [
4212
4251
  "Every size applies one complete control-density recipe across frame height, inline padding, icon zones, text-container inset, gap, and radius; supporting error content follows the shared 4px field flow.",
4213
- "The normal field boundary uses the shared secondary inset border. Focus promotes it to the thicker bold-brand inset stroke, while error uses the thicker bold-negative inset stroke without changing geometry. Set hasBorder to false only in chrome that supplies enough surrounding structure; the control then remains borderless at rest, while focused, and while invalid, with semantics and supporting error copy unchanged.",
4252
+ "The normal field boundary uses the shared secondary inset border. Focus promotes it to the thicker bold-brand inset stroke, while error uses the thicker bold-negative inset stroke without changing geometry. Set hasBorder to false only in chrome that supplies enough surrounding structure; set hasInteractionFill to false when that containing chrome also owns hover and pressed feedback.",
4214
4253
  "Placeholder text is secondary at rest and quaternary while the editable field is focused because it becomes decorative once typing begins. Single-line placeholder and entered value text truncate with an ellipsis when the field is narrower than its content.",
4215
4254
  "Entered values use the parent surface's primary foreground; prefix icons, suffix content, and resting placeholder text use its secondary foreground.",
4216
4255
  "Search fields show a standard borderless CrossCircle icon action only while they contain a value. Clearing emits the empty value and restores focus to the native field.",
4256
+ "Search fields disable browser autocomplete history, automatic capitalization, autocorrection, and spellchecking by default so browser-owned suggestions do not compete with product-owned results. Consumers can explicitly provide autoComplete when a different native history behavior is required.",
4257
+ "Search fields used with owned result sets forward aria-controls and aria-activedescendant to the native field so keyboard focus can remain in the query while assistive technology tracks the active result.",
4217
4258
  "The suffix slot is for compact units or decorations. The optional leading icon is decorative and does not replace the field label.",
4218
4259
  "Use autoComplete, inputMode, and enterKeyHint to provide browser and virtual-keyboard hints without changing the value's semantic type.",
4219
4260
  "Number fields preserve native spinbutton semantics, keyboard stepping, and min/max constraint behavior while dsChange continues to report the native string value. Two borderless inset chevron actions split the available inner height, disable independently at their numeric bound, and restore focus to the spinbutton after pointer activation.",
@@ -4254,6 +4295,14 @@
4254
4295
  },
4255
4296
  "api": {
4256
4297
  "props": {
4298
+ "ariaActiveDescendant": {
4299
+ "type": "string | undefined",
4300
+ "required": false
4301
+ },
4302
+ "ariaControls": {
4303
+ "type": "string | undefined",
4304
+ "required": false
4305
+ },
4257
4306
  "ariaDescribedby": {
4258
4307
  "type": "string | undefined",
4259
4308
  "required": false
@@ -4302,6 +4351,10 @@
4302
4351
  "type": "boolean",
4303
4352
  "required": false
4304
4353
  },
4354
+ "hasInteractionFill": {
4355
+ "type": "boolean",
4356
+ "required": false
4357
+ },
4305
4358
  "icon": {
4306
4359
  "type": "string | undefined",
4307
4360
  "required": false
@@ -6082,12 +6135,12 @@
6082
6135
  "tag": "ds-panel-nav",
6083
6136
  "name": "panel-nav",
6084
6137
  "title": "PanelNav",
6085
- "summary": "The single persistent primary navigation for an application, providing grouped top-level destinations, active-route state, standard dashboard/settings switching, user access, and collapsible desktop and tablet presentation.",
6138
+ "summary": "The single persistent primary navigation for an application, providing grouped destinations, optional nested route sections, active-route state, standard dashboard/settings switching, user access, and collapsible desktop and tablet presentation.",
6086
6139
  "intentStatus": "complete",
6087
6140
  "intent": {
6088
6141
  "audience": "specialized",
6089
6142
  "status": "stable",
6090
- "summary": "The single persistent primary navigation for an application, providing grouped top-level destinations, active-route state, standard dashboard/settings switching, user access, and collapsible desktop and tablet presentation.",
6143
+ "summary": "The single persistent primary navigation for an application, providing grouped destinations, optional nested route sections, active-route state, standard dashboard/settings switching, user access, and collapsible desktop and tablet presentation.",
6091
6144
  "useWhen": [
6092
6145
  "Building the one primary navigation surface for an application that uses the CompoMo system.",
6093
6146
  "Top-level destinations must remain consistently available while the application's page content changes.",
@@ -6095,14 +6148,14 @@
6095
6148
  ],
6096
6149
  "avoidWhen": [
6097
6150
  "A second navigation surface is needed within the same application; an application must have only one PanelNav.",
6098
- "The choices represent sections within the active primary destination; use BarNav instead.",
6151
+ "Route sections belong in the shell bar for the application's selected navigation mode; use flat PanelNav with BarNav rather than mixing both section presentations.",
6099
6152
  "The choices switch local content without changing the application's primary destination; use TabGroup instead.",
6100
6153
  "The interaction performs a command or presents temporary contextual choices; use a button or Menu instead.",
6101
6154
  "Building navigation below the mobile breakpoint; use the application's dedicated mobile navigation component instead."
6102
6155
  ],
6103
6156
  "alternatives": [
6104
6157
  {
6105
- "when": "The choices represent route sections within the active primary destination.",
6158
+ "when": "The application uses the standard flat primary-navigation mode and route sections belong in the shell bar.",
6106
6159
  "component": "component:ds-bar-nav",
6107
6160
  "reason": "BarNav owns secondary section navigation within the destination selected by PanelNav."
6108
6161
  },
@@ -6130,6 +6183,7 @@
6130
6183
  "Give every primary destination a concise visible label and an icon that supports rather than replaces that label.",
6131
6184
  "Provide localized dashboard, settings, account, navigation, collapse, and expand labels.",
6132
6185
  "Preserve accessible destination names when the panel is collapsed to icon-only presentation.",
6186
+ "In nested presentation, expose parent expansion state, give only the active child aria-current, and focus the selected or first enabled child when a keyboard-opened flyout appears.",
6133
6187
  "Use notification dots as supplemental status and never as the only indication of important information.",
6134
6188
  "When the destination body overflows, it becomes a localized keyboard-focusable scroll region in addition to the roving destination controls.",
6135
6189
  "Keep the standard dashboard/settings switch and user/account entry available in the footer."
@@ -6138,7 +6192,13 @@
6138
6192
  "Render exactly one PanelNav per application; it owns primary application destinations and no other navigation role.",
6139
6193
  "The host router owns the current route; prefer currentUrl for active destination matching and use activeId only when route matching is unavailable.",
6140
6194
  "Use anchor mode for native links or routers that intercept anchors; use event mode when the host performs navigation from dsNavSelect.",
6141
- "Groups visually organize top-level destinations only and must not be interpreted as nested or expandable navigation.",
6195
+ "Groups visually organize top-level destinations. Use presentation=nested only when parent children replace BarNav route sections.",
6196
+ "A parent with children is not a standalone page: activating it while expanded resolves to the first enabled child; route state keeps that parent expanded and gives both parent and child selected styling.",
6197
+ "While one parent is expanded in nested presentation, other top-level destinations retain secondary foreground; flat and collapsed presentations keep their existing foreground treatment.",
6198
+ "Within a multi-item group, an expanded nested branch is bounded beside its siblings: the first branch adds a divider after its children, a middle branch adds dividers before its parent and after its children, and the final branch adds a divider before its parent. Single-item groups add neither. Divider space expands on the nested section-height timing while the line fades in, with equal visible spacing on both sides; collapsing the full rail contracts and fades the divider on the rail-collapse timing.",
6199
+ "Expanded nested branches animate to their full required height over 500ms while fixed-size child rows progressively fade over 500ms after a 250ms wait, with each row starting 50ms after the previous row. On close, child rows fade out in reverse order with secondary foreground and the height contraction waits 250ms; reduced-motion preferences collapse those transitions to the instant motion token.",
6200
+ "Collapsing the full navigation rail keeps the active nested branch mounted through the rail transition and contracts its height over the same duration, so following destinations reposition without snapping.",
6201
+ "Collapsed nested presentation opens a child-only flyout from the parent icon without navigating; the parent holds the transient pressed wash while the flyout is rendered, activates again to close, and emits navigation intent only after a child selection.",
6142
6202
  "Dashboard presents day-to-day operational destinations; Settings presents administrative and configuration destinations.",
6143
6203
  "The standard footer switches the entire destination collection and navStyle between Dashboard and Settings and exposes the user/account entry.",
6144
6204
  "The host owns the external user menu opened from dsNavUserAction.",
@@ -6152,7 +6212,8 @@
6152
6212
  "Below 768px, the consuming application replaces PanelNav with a dedicated mobile navigation component; PanelNav does not own mobile navigation.",
6153
6213
  "Managed ShellApp permanently owns responsive composition: it determines shell mode, enforces tablet collapse, and presents MobileSheetNav below 768px.",
6154
6214
  "When the viewport is below breakpoint, PanelNav locks collapsed, disables its header toggle affordance, and preserves the persisted desktop collapse preference.",
6155
- "Collapsed presentation must preserve destination ordering, active state, notification status, and accessible names."
6215
+ "Collapsed presentation must preserve destination ordering, active state, notification status, and accessible names.",
6216
+ "Nested parents expose child routes inline while expanded and in an anchored flyout while collapsed; mobile navigation remains owned by ShellApp."
6156
6217
  ],
6157
6218
  "frameworkCaveats": {
6158
6219
  "customElements": [
@@ -6194,6 +6255,10 @@
6194
6255
  "type": "boolean",
6195
6256
  "required": false
6196
6257
  },
6258
+ "activeChildId": {
6259
+ "type": "string",
6260
+ "required": false
6261
+ },
6197
6262
  "activeId": {
6198
6263
  "type": "string",
6199
6264
  "required": false
@@ -6242,6 +6307,10 @@
6242
6307
  "type": "string",
6243
6308
  "required": false
6244
6309
  },
6310
+ "presentation": {
6311
+ "type": "PanelNavPresentation",
6312
+ "required": false
6313
+ },
6245
6314
  "routerMode": {
6246
6315
  "type": "PanelNavRouterMode",
6247
6316
  "required": false
@@ -6276,6 +6345,10 @@
6276
6345
  "name": "dsChromeTransitionStart",
6277
6346
  "detail": "ChromeTransitionDetail"
6278
6347
  },
6348
+ {
6349
+ "name": "dsNavChildSelect",
6350
+ "detail": "PanelNavChildSelectDetail"
6351
+ },
6279
6352
  {
6280
6353
  "name": "dsNavFooterAction",
6281
6354
  "detail": "void"
@@ -6310,6 +6383,7 @@
6310
6383
  "badge",
6311
6384
  "button-unfilled",
6312
6385
  "icon",
6386
+ "menu",
6313
6387
  "text",
6314
6388
  "tooltip"
6315
6389
  ]
@@ -6691,13 +6765,12 @@
6691
6765
  },
6692
6766
  "dependencies": [
6693
6767
  "@ds-mo/ui",
6694
- "@ds-mo/tokens",
6695
- "@ds-mo/icons"
6768
+ "@ds-mo/tokens"
6696
6769
  ],
6697
6770
  "componentDependencies": [
6698
6771
  "button-unfilled",
6699
6772
  "divider",
6700
- "icon",
6773
+ "input",
6701
6774
  "text",
6702
6775
  "tooltip"
6703
6776
  ]
@@ -7538,6 +7611,7 @@
7538
7611
  "checkbox",
7539
7612
  "empty-state",
7540
7613
  "icon",
7614
+ "input",
7541
7615
  "loader",
7542
7616
  "text",
7543
7617
  "tooltip"
@@ -7567,6 +7641,7 @@
7567
7641
  "commonlyComposedWith": [
7568
7642
  "component:ds-panel-nav",
7569
7643
  "component:ds-bar-nav",
7644
+ "component:ds-bar-title",
7570
7645
  "component:ds-panel-tools",
7571
7646
  "component:ds-shell-tools",
7572
7647
  "component:ds-mobile-sheet-nav",
@@ -7596,6 +7671,10 @@
7596
7671
  "The application router owns the current route, authorization filtering, Dashboard or Settings context, destination collections, section collections, and localized content labels.",
7597
7672
  "ShellApp renders the lower-level desktop, tablet, and mobile chrome, coordinates layout, gradient alignment, transitions, shortcuts, global surfaces, optional Inbox state, focus restoration, and mobile-stage visibility.",
7598
7673
  "The application router owns authorization, current URLs, history, and route execution; ShellApp forwards navigation and page intent events without routing.",
7674
+ "sectionNavigation is an application-controlled preference: bar keeps route sections in BarNav, while panel renders them as nested PanelNav children and places compact BarTitle in the shell bar.",
7675
+ "Managed ShellApp derives ShellPage desktop header placement from sectionNavigation. Panel mode removes page-local title geometry, restores the standard responsive top gutter, and preserves full-bleed page content without requiring route-specific navigation branches.",
7676
+ "Switch sectionNavigation at runtime without replacing routed content or tool owners; the application owns preference storage and defaults new users to bar unless product policy says otherwise.",
7677
+ "In panel mode, supply the same route sections as children on their PanelNav parent and handle dsNavChildSelect as structured parent, child, and href navigation intent.",
7599
7678
  "The application supplies each routed content owner and tool view once. ShellApp changes visibility, inert state, and presentation without recreating those nodes.",
7600
7679
  "The optional banner slot accepts one application-owned ds-banner above the complete shell row. The application owns its open state, orientation for the current shell capacity, action consequences, dismissal persistence, and resolution when several messages compete.",
7601
7680
  "Use composition=slotted only for advanced application architectures that intentionally own all lower-level chrome wiring.",
@@ -7605,15 +7684,18 @@
7605
7684
  "Dashboard represents day-to-day operational work while Settings represents administrative and configuration work; route state selects the context.",
7606
7685
  "Replace navigation and pageChrome together from one completed route state.",
7607
7686
  "When pageChrome.showBack marks a detail depth, mobile chrome keeps the page heading as its identity and presents only local subsections; peer route tabs remain in desktop BarNav rather than replacing the detail heading.",
7608
- "Managed ShellApp keeps BarNav and ShellPage presentations present and owns page header stickiness and the content scroller.",
7609
- "Route-owned pageChrome independently selects ShellPage contentInset, roomy and compact top seams, scroll compaction, expanded and compact header-divider visibility, and contentSurface; ShellApp forwards them without making page-specific layout or surface decisions.",
7687
+ "Managed ShellApp keeps the selected desktop section-navigation presentation and ShellPage present and owns page header stickiness and the content scroller.",
7688
+ "Route-owned pageChrome independently selects ShellPage contentInset, page-header seams, scroll compaction, expanded and compact header-divider visibility, and contentSurface. ShellApp forwards them while resolving whether desktop title geometry is page-local or shell-bar-owned.",
7610
7689
  "The application filters unauthorized destinations, sections, and tools before passing them into shell components."
7611
7690
  ],
7612
7691
  "responsiveBehavior": [
7613
7692
  "ShellApp owns the fixed system breakpoints and resolves desktop at 1200px and wider, tablet from 768px through 1199px, and mobile below 768px.",
7614
7693
  "On desktop, PanelNav defaults expanded, permits user collapse or expansion, and respects the locally persisted desktop preference.",
7615
7694
  "On tablet, ShellApp keeps PanelNav permanently collapsed and prevents user expansion without overwriting the desktop preference.",
7695
+ "On desktop and tablet, panel section navigation replaces BarNav with compact BarTitle; collapsed PanelNav exposes child sections through its anchored flyout.",
7696
+ "When panel section navigation moves BarTitle into the shell bar, routed content starts at the standard 32px desktop or 16px tablet gutter and ShellPage reports no page-local sticky-header height.",
7616
7697
  "On mobile, ShellApp hides and inerts desktop chrome, uses a solid primary stage, and composes MobileHeader, MobileSheetNav, ShellTools, and the persistent MobileBarNav around the same application-owned content.",
7698
+ "Changing sectionNavigation never changes mobile chrome; the preference may still be edited by an application Settings page.",
7617
7699
  "Opening MobileSheetNav temporarily overlays the active routed page or global tool; closing it without selecting an area restores that same destination and its nested state. The sheet exposes the router-derived current area only while the routed area owns the mobile stage, so a global tool never leaves an underlying route highlighted.",
7618
7700
  "Selecting Help from the managed mobile sheet activates the configured Help tool and promotes Help to the primary mobile destination instead of forwarding it as route navigation.",
7619
7701
  "Set navigation.showMobileAccount to false when the Settings destination collection already includes account and user preferences.",
@@ -7698,6 +7780,10 @@
7698
7780
  "type": "PaperTextureConfig",
7699
7781
  "required": false
7700
7782
  },
7783
+ "sectionNavigation": {
7784
+ "type": "ShellSectionNavigation",
7785
+ "required": false
7786
+ },
7701
7787
  "shortcutsEnabled": {
7702
7788
  "type": "boolean",
7703
7789
  "required": false
@@ -7724,6 +7810,10 @@
7724
7810
  "name": "dsHeaderBack",
7725
7811
  "detail": "{ tool: PanelToolsToolId }"
7726
7812
  },
7813
+ {
7814
+ "name": "dsNavChildSelect",
7815
+ "detail": "PanelNavChildSelectDetail"
7816
+ },
7727
7817
  {
7728
7818
  "name": "dsNavFooterAction",
7729
7819
  "detail": "void"
@@ -7837,7 +7927,7 @@
7837
7927
  ],
7838
7928
  "accessibility": [
7839
7929
  "ShellPage exposes the routed page as the main landmark; render exactly one active ShellPage inside ShellApp.",
7840
- "Provide one BarTitle or BarWorkflow through the desktop header slot and one MobileHeader through mobile-header when the page participates in the mobile shell.",
7930
+ "Provide one BarTitle or BarWorkflow through the desktop header slot when desktopHeaderPlacement=page, and one MobileHeader through mobile-header when the page participates in the mobile shell.",
7841
7931
  "Keep loading, empty, validation, error, progress, success, and failure communication in the default product-content slot.",
7842
7932
  "Responsive variant changes preserve the same heading, controls, accessible names, and keyboard focus targets."
7843
7933
  ],
@@ -7845,6 +7935,7 @@
7845
7935
  "headerCapacity=roomy, compact, or constrained is supplied before paint by the owning application shell and describes the page-header space available after viewport and shell-chrome policy are applied.",
7846
7936
  "headerPresentation=auto selects the matching header variant from headerCapacity and scroll position.",
7847
7937
  "expanded, compact, and constrained are explicit overrides for exceptional layouts and deterministic examples.",
7938
+ "desktopHeaderPlacement=page preserves page-local sticky title geometry. shell-bar declares that desktop and tablet title chrome is external and compact, restores the responsive top gutter, reports zero page-header block size, and disables page-header scroll compaction while preserving downstream compact-header behavior and full-bleed content.",
7848
7939
  "contentInset=default supplies standard page gutters; none permits maps, canvases, and other full-bleed content.",
7849
7940
  "contentInsetBlockStart=none removes only the gutter adjacent to the page header while retaining the responsive inline and bottom gutters.",
7850
7941
  "contentInsetBlockStartSize can provide an exact roomy top seam, while compactContentInsetBlockStartSize independently defines the compact and constrained seam. ShellPage exposes their resolved sticky-header offset through --ds-shell-page-content-block-start-offset for viewport-fitted descendants.",
@@ -7861,6 +7952,7 @@
7861
7952
  "responsiveMode=mobile hides and inerts the desktop header, exposes mobile-header, and disables desktop scroll-compaction geometry.",
7862
7953
  "Update headerCapacity synchronously with shell layout state so opening tools or crossing application breakpoints cannot briefly render the wrong presentation.",
7863
7954
  "The default content inset is balanced on every side: 32px in desktop mode and 16px in tablet and mobile modes.",
7955
+ "When desktopHeaderPlacement=shell-bar, desktop and tablet ignore page-header-specific block-start seam overrides and expose --ds-shell-page-content-block-start-offset as the responsive gutter only; mobile keeps its MobileHeader geometry and existing seam.",
7864
7956
  "contentInsetBlockStart can independently remove the top gutter for table and canvas pages that should meet the sticky header; exact roomy and compact block-start sizes support pages whose seam changes with header capacity.",
7865
7957
  "The selected content surface persists unchanged across desktop, tablet, and mobile modes.",
7866
7958
  "On a secondary desktop or tablet page, BarTitle matches the page canvas across capacity and scroll-driven variant changes; the separate mobile-header presentation remains primary.",
@@ -7872,7 +7964,7 @@
7872
7964
  ],
7873
7965
  "frameworkCaveats": {
7874
7966
  "customElements": [
7875
- "Import ShellPage with BarTitle or BarWorkflow in slot=header and MobileHeader in slot=mobile-header, then render route content as default children.",
7967
+ "Import ShellPage with BarTitle or BarWorkflow in slot=header when desktopHeaderPlacement=page and MobileHeader in slot=mobile-header, then render route content as default children.",
7876
7968
  "Do not set BarTitle.variant while ShellPage owns headerPresentation."
7877
7969
  ],
7878
7970
  "react": [
@@ -7921,6 +8013,10 @@
7921
8013
  "type": "ShellPageContentSurface",
7922
8014
  "required": false
7923
8015
  },
8016
+ "desktopHeaderPlacement": {
8017
+ "type": "ShellPageDesktopHeaderPlacement",
8018
+ "required": false
8019
+ },
7924
8020
  "headerCapacity": {
7925
8021
  "type": "ShellPageCapacity",
7926
8022
  "required": false
@@ -8811,6 +8907,7 @@
8811
8907
  "A missing, empty, inactive, or unknown selected value is invalid when enabled tabs exist; the component does not choose a fallback selection.",
8812
8908
  "Selection is singular and follows keyboard focus.",
8813
8909
  "Width follows the shared control contract: hug keeps the track content-sized, while fill occupies the parent width and distributes available space equally across selectable segments; dividers remain fixed-width separators.",
8910
+ "hasContainer defaults to true. Set it to false only when a parent surface owns the track background and boundary; the outer fill, border, and inset disappear while selected-pill, interaction, focus, density, and keyboard behavior remain unchanged.",
8814
8911
  "Small, medium, and large use the shared 24px, 32px, and 40px control-density recipes for the outer track. Each segment uses the same-size inset recipe at 20px, 28px, and 36px while preserving that density's typography, icon, gap, and label metrics.",
8815
8912
  "Use one consistent content variant across every selectable tab in a group.",
8816
8913
  "Omitted background is for primary and secondary surfaces; pass the faint context explicitly on faint surfaces.",
@@ -8855,6 +8952,10 @@
8855
8952
  "type": "TabBackground | undefined",
8856
8953
  "required": false
8857
8954
  },
8955
+ "hasContainer": {
8956
+ "type": "boolean",
8957
+ "required": false
8958
+ },
8858
8959
  "size": {
8859
8960
  "type": "TabGroupSize",
8860
8961
  "required": false
@@ -8902,12 +9003,12 @@
8902
9003
  "tag": "ds-table",
8903
9004
  "name": "table",
8904
9005
  "title": "Table",
8905
- "summary": "Semantic, controlled data table with durable visual primitives for cell geometry, grouping, sorting, multi-selection, sticky overflow, incremental loading, top-level pagination, and optional row virtualization.",
9006
+ "summary": "Semantic, controlled data table with durable visual primitives for cell geometry, wrapping multiple-Tag cells, grouping, sorting, multi-selection, sticky overflow, incremental loading, top-level pagination, and optional row virtualization.",
8906
9007
  "intentStatus": "complete",
8907
9008
  "intent": {
8908
9009
  "audience": "general",
8909
9010
  "status": "stable",
8910
- "summary": "Semantic, controlled data table with durable visual primitives for cell geometry, grouping, sorting, multi-selection, sticky overflow, incremental loading, top-level pagination, and optional row virtualization.",
9011
+ "summary": "Semantic, controlled data table with durable visual primitives for cell geometry, wrapping multiple-Tag cells, grouping, sorting, multi-selection, sticky overflow, incremental loading, top-level pagination, and optional row virtualization.",
8911
9012
  "useWhen": [
8912
9013
  "A structured dataset needs native row and column relationships, optional one-level grouping, or comparable values across records.",
8913
9014
  "An application needs controlled sorting, loaded-row selection, infinite loading, pagination, virtual row recycling, or opted-in table-owned data-mode and column controls while retaining ownership of the data query, catalog, and persistence.",
@@ -8942,15 +9043,16 @@
8942
9043
  "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 data 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 share one horizontal caption overflow row with table-owned actions inside the component-owned 8px inset. Table caption buttons keep pressed interaction paint without physically scaling. When columnCustomizer is enabled, the table adds a trailing Customize control named Customize table. Its label uses regular weight and its resting foreground remains neutral when hidden or reordered columns differ from the catalog default. The control is icon-label at typical widths and the icon-only Table menu button below 900px, where a tooltip preserves the Customize label. The always-icon-only table-variant control also exposes its label through a tooltip. Otherwise the header slot receives the complete content width.",
8943
9044
  "The data-mode switcher is the shared Menu of the table's supported infinite, pagination, and virtual modes. It uses an Ellipses trigger. The switcher is the final caption-bar action; when the column customizer is also present, a decorative vertical divider separates the two controls. dataMode remains controlled, and the application responds to change intent by supplying the matching records, pagination state, loading behavior, and query consequences. Escape, dismissal, and selection return focus to the trigger.",
8944
9045
  "The column customizer is the shared Menu of switch rows, not a table-owned dialog. Data columns can be shown, hidden, and reordered. Action columns and the selection checkbox never appear in the menu. The last remaining visible data column cannot be hidden, but it stays focusable so it can still be reordered. Escape and outside click restore focus to the trigger. Persistence stays in the application.",
8945
- "Sorting controls remain buttons inside column headers and expose the table's one controlled member-row sort through aria-sort. ds-table-sort in the toolbar trailing cluster is the matching menu of Data and Direction sections; it emits the same dsSortChange shape so header clicks and menu choices stay in sync. Grouping never adds a second sort indicator or header control; the application supplies groups in its fixed product order. Optional column help underlines the header label with the shared dotted decoration and shows ds-tooltip from that label; it does not add a second header control or replace the column name.",
9046
+ "Sorting controls remain buttons inside column headers and expose the table's one controlled member-row sort through aria-sort. ds-table-sort in the toolbar trailing cluster is the matching menu of Data and Direction sections; it emits the same dsSortChange shape so header clicks and menu choices stay in sync. Grouping never adds a second sort indicator or header control; ds-table-group controls the grouping data point and ascending or descending group-section order while the application supplies the resulting groups. Optional column help underlines the header label with the shared dotted decoration and shows ds-tooltip from that label; it does not add a second header control or replace the column name.",
8946
9047
  "Selection controls expose checkbox semantics and explicit row names; select-all affects selectable loaded rows only and preserves selected identities outside the loaded window. In virtual mode the supplied in-memory rows are that loaded set, including rows whose DOM is recycled. When grouping is active with multi-selection, each group section header also exposes a checkbox that selects or clears that group's selectable loaded rows.",
8947
9048
  "Interactive rows are focusable as native rows, activate with Enter or Space, and do not steal activation from their nested selection, action, overflow-menu, or primary-text link controls.",
8948
9049
  "Scrollable table regions become keyboard focusable and named only when overflow exists.",
8949
9050
  "Incremental loading, newly appended row counts, failures, and end-of-results transitions are announced through a polite status region without replacing visible state. In grouped tables, announcements name the independently loading group.",
9051
+ "Applications may pass their controlled literal search terms through highlightTerms after applying their own filtering. When TableSearch scopes the query, pass the same selected field identities through highlightFieldIds. A compound column maps its ordered headerSegments to primary, secondary-run, and tertiary-run data points; simple columns map their column ID to every owned text track. With no highlightFieldIds every text track remains eligible. Matching text is rendered with semantic mark elements, so the emphasis is identifiable independently of its faint-brand background and bold-brand foreground. Highlight markup preserves source order, the cell's complete accessible text, and does not create extra announcements.",
8950
9052
  "Static and infinite tables may show an optional result summary footer when displayedCount and totalCount are finite. Virtual mode shows a total-only summary and ignores displayedCount. Pagination mode instead renders a named Pagination control with a compact selected-size total, vertical divider, and page position; range changes are announced independently with complete phrasing. Unmodified Left and Right Arrow request the adjacent page while focus is inside a paginated table or on a containing page scroller that owns it; editable fields, choice controls, sliders, open menus, and modified key combinations retain their own keyboard behavior. A table-owned footer slot can replace summary copy, while footer-leading and footer-trailing remain available in the same compact-bar anatomy. Nested dialog footers are ignored."
8951
9053
  ],
8952
9054
  "states": [
8953
- "Columns, rows, groups, grouping, sorting, selected row IDs, collapsed group IDs, hiddenColumnIds, columnOrder, dataMode, pagination, displayedCount, totalCount, and incremental-loading state are controlled inputs. Events communicate intent and never mutate those inputs. The optional header is one composable table-local surface: the component owns its 48px chrome, 8px inset on every side, and sticky placement while the application owns the leading slot's internal layout, controls, labels, filtering behavior, and action handling. Opting into dataModeSwitcher and columnCustomizer adds their trailing Menu triggers and requires caption visibility. When both are present, Customize precedes a decorative divider and the data-mode trigger remains the final action. The Customize trigger keeps one stable label and neutral resting foreground whether or not hiddenColumnIds or columnOrder differ from the catalog default; the configured state remains visible inside the Menu. The table closes one trailing Menu before opening the other. The footer retains its compact-bar composition: application-owned leading status sits left while a controlled result summary or Pagination aligns right, before any trailing action. Content-sized tables remain natural for sparse or fixed-count results. height bounds the complete header, frame, and footer composition. fitViewport reserves the compact-state composition height in the nearest vertical scrollport while growing the visible table into that reservation as surrounding page chrome collapses.",
9055
+ "Columns, rows, groups, grouping, sorting, selected row IDs, collapsed group IDs, highlightTerms, highlightFieldIds, hiddenColumnIds, columnOrder, dataMode, pagination, displayedCount, totalCount, and incremental-loading state are controlled inputs. Events communicate intent and never mutate those inputs. The optional header is one composable table-local surface: the component owns its 48px chrome, 8px inset on every side, and sticky placement while the application owns the leading slot's internal layout, controls, labels, filtering behavior, and action handling. highlightTerms only marks matching table-owned text and never filters rows, changes query semantics, or highlights Tag labels. highlightFieldIds optionally narrows that marking to matching column IDs or compound header-segment sort keys. Opting into dataModeSwitcher and columnCustomizer adds their trailing Menu triggers and requires caption visibility. When both are present, Customize precedes a decorative divider and the data-mode trigger remains the final action. The Customize trigger keeps one stable label and neutral resting foreground whether or not hiddenColumnIds or columnOrder differ from the catalog default; the configured state remains visible inside the Menu. The table closes one trailing Menu before opening the other. The footer retains its compact-bar composition: application-owned leading status sits left while a controlled result summary or Pagination aligns right, before any trailing action. Content-sized tables remain natural for sparse or fixed-count results. height bounds the complete header, frame, and footer composition. fitViewport reserves the compact-state composition height in the nearest vertical scrollport while growing the visible table into that reservation as surrounding page chrome collapses.",
8954
9056
  "Grouping supports one level. The application supplies groups in a fixed product-defined order and supplies ordered member rows independently. Group section headers show an emphasized text-body-medium label followed by a middle dot and plain secondary loaded progress, for example Critical · 50 of 166. The loaded value comes from the supplied member rows and the total comes from totalCount. A localized countLabel total phrase remains available for the complete assistive progress announcement. Virtual mode shows totals only, for example Critical · 166, because there is no loaded window. Groups may declare an optional intent (brand, neutral, negative, warning, caution, positive) that paints an LTR gradient from the faint intent surface at the label edge into faint neutral at the trailing edge, plus a bold intent title color. Neutral groups remain solid faint neutral. Section separators are painted inside that viewport-width surface so translucent border tokens composite with each intent background. Internal sections keep their separators; a collapsed or empty section header yields its separator only when it is the table's final rendered item. A trailing visually neutral icon-only ButtonUnfilled uses the 24px md double-inset action recipe and toggles controlled collapsedGroupIds, showing ChevronUp while expanded and ChevronDown while collapsed. While any group is expanded, a ChevronDownUp action uses the xs sort-control recipe widened to a table-owned 24px lane and collapses every group. It appears at the inline-end edge of the trailing column declared with kind action when one exists; otherwise a button-hugging 24px by 16px medium-elevation surface floats at the visible scrollport's header edge so the action remains reachable while member columns scroll beneath it. With stickyHeader enabled, each contained section uses its one real section row as a native sticky header inside its real row-group boundary. The browser therefore owns pinning, push-off, scrolling, and resize layout in one pass without a duplicated lane, active-section state, transforms, or scroll-time geometry. Shared grid tracks retain exact header and member-cell alignment. The section surface also stays pinned to the visible horizontal scrollport and spans the smaller of the visible viewport or table width. Virtual grouped tables flatten headers and members into that same scrollport; expanding a section never introduces an inner scroller.",
8955
9057
  "When columnCustomizer is false, columns render in catalog order. When it is true, columns remains the catalog: hiddenColumnIds and columnOrder control visibility and data-column sequence, action columns stay last, cannot be hidden, and remain absent from the customizer Menu, and dsColumnsConfigChange reports the next hidden ids and data-column order without mutating those inputs. The customizer Menu live-applies show/hide and data-column reorder. The table does not persist preferences.",
8956
9058
  "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.",
@@ -8960,7 +9062,7 @@
8960
9062
  "When pagination enables Fit to page on a bounded table, the table proposes the number of complete top-level rows that fit below its column header. Grouped tables count group headers only; member rows never affect capacity. Selecting Fit captures that numeric snapshot. A changed fitIdentity requests one fresh snapshot for a new query shape, while viewport resizing alone does not change the active controlled page size.",
8961
9063
  "Rows opt into complete-row activation with interactive and emit dsRowActivate without owning navigation. Selection paints through the shared selected ::before layer; interactive hover and press paint through the shared ::after layer.",
8962
9064
  "Row selection owns the single sticky start lane. One explicitly sized application column can own the sticky end lane, or the start lane when selection is absent. Each sticky boundary owns one fixed divider and a row-clipped directional shadow that paints into the adjacent scrolling columns only while more inline content remains beyond that edge.",
8963
- "Cells accept scalar content, standard primary-and-secondary or dual-primary text primitives, declarative Tag, icon-only, icon-and-text, 16:9 Image, or ButtonUnfilled Action content, or explicit Empty and Blank absence values. Text objects may declare an optional href (and target) on the primary track only; the table renders a native anchor with the shared brand text-action treatment when the URL is safe, and leaves scalars unlinked. Standard secondary copy defaults to the secondary foreground and may declare a semantic Text color when the application data carries intent; an optional tertiary track uses the same subdued body-small recipe as secondary. Secondary and tertiary may also be a short list of colorable runs, rendered on one line with the table's middle-dot separator. Dual-primary copy keeps both tracks primary unless explicitly colored and does not gain a tertiary track. Body data cells share 8px outer padding; header and group rows keep their own geometry. Text tracks, including Empty, keep 4px inline padding so copy lines up with column-header labels; Tag and icon-only tracks stay on the 8px cell chrome alone. Icon-and-text cells (`kind: 'icon-text'`) place one md prefix icon beside the same copy stack as a text cell. The icon slot takes 2px padding on every side, then a 2px flex gap before the copy; text-track padding stays on the copy. Omit iconLabel when the glyph is decorative. 20px content (body-medium text, md icon, and the row checkbox) sits in a 24px track so it stays optically aligned with 24px Tag and Action content. Single-track text, selection, tag-only, icon-only, icon-and-text, Action, Empty, Blank, and 1-track Image cells resolve a 40px base contract while two-track cells grow to 62px and three-track cells grow to 84px. Tracks stack with a 2px gap. Wrapping primary on a 1-track cell uses that same rhythm: two wrapped lines share the 62px row and three wrapped lines share the 84px row. Wrapping secondary keeps primary on the first track and consumes later tracks: two secondary lines share the 84px row and three secondary lines share a 106px fourth track. Keep the same track count in every row of a table or group when those rows should share one height. Tag cells use the inset Tag recipe: md double-inset is a 24px control for tag-only and tag-with-text, while text-with-tag uses sm single-inset at 20px so the second-track pill fills the body-small slot. Action cells primarily use an icon-only Ellipses treatment, render a 24px small ButtonUnfilled, default to unbordered, and emit row, column, and action identities through dsCellAction. When an action cell declares items, that Ellipses trigger opens the shared ds-menu for commands, dividers, inactive rows, and destructive rows instead of emitting on click; choosing a command emits dsCellAction with that item's actionId. Omit items to keep a single-shot control. Image cells declare tracks 1, 2, or 3 so the 16:9 bordered preview fills that body-row content box (cell height minus 8px padding) and the column hugs the resulting width; omit tracks for the 1-track recipe, and keep image tracks aligned with the other cells in the table or group. Image cells fall back to an accessible placeholder when no source is supplied. Empty means the data applies but has no value and renders an em dash with localized assistive text; Blank means the data is not applicable and renders no content. Nullish values remain backward-compatible Empty values. Stable type and variant hooks keep every cell family independently styleable.",
9065
+ "Cells accept scalar content, standard primary-and-secondary or dual-primary text primitives, declarative Tag, wrapping multiple-Tag content, icon-only, icon-and-text, 16:9 Image, or ButtonUnfilled Action content, or explicit Empty and Blank absence values. Text objects may declare an optional href (and target) on the primary track only; the table renders a native anchor with the shared brand text-action treatment when the URL is safe, and leaves scalars unlinked. Standard secondary copy defaults to the secondary foreground and may declare a semantic Text color when the application data carries intent; an optional tertiary track uses the same subdued body-small recipe as secondary. Secondary and tertiary may also be a short list of colorable runs, rendered on one line with the table's middle-dot separator. Dual-primary copy keeps both tracks primary unless explicitly colored and does not gain a tertiary track. Body data cells share 8px outer padding; header and group rows keep their own geometry. Text tracks, including Empty, keep 4px inline padding so copy lines up with column-header labels; Tag and icon-only tracks stay on the 8px cell chrome alone. Icon-and-text cells (`kind: 'icon-text'`) place one md prefix icon beside the same copy stack as a text cell. The icon slot takes 2px padding on every side, then a 2px flex gap before the copy; text-track padding stays on the copy. Omit iconLabel when the glyph is decorative. 20px content (body-medium text, md icon, and the row checkbox) sits in a 24px track so it stays optically aligned with 24px Tag and Action content. Single-track text, selection, tag-only, icon-only, icon-and-text, Action, Empty, Blank, and 1-track Image cells resolve a 40px base contract while two-track cells grow to 62px and three-track cells grow to 84px. Every later track adds 22px, so four tracks resolve to 106px, five to 128px, and the sequence may continue. Tracks stack with a 2px gap. Wrapping primary on a 1-track cell uses that same rhythm: two wrapped lines share the 62px row and three wrapped lines share the 84px row. Wrapping secondary keeps primary on the first track and consumes later tracks: two secondary lines share the 84px row and three secondary lines share a 106px fourth track. Keep the same track count in every row of a table or group when those rows should share one height. Tag cells use the inset Tag recipe: md double-inset is a 24px control for tag-only and tag-with-text, while text-with-tag uses sm single-inset at 20px so the second-track pill fills the body-small slot. Multiple-Tag cells use `kind: 'tags'`, a positive `tracks` count, and small single-inset Tags that wrap naturally at the column edge. Their 2px block inset creates the 24px first track and each later wrapped line adds a 20px track plus the shared 2px gap. The tallest cell establishes the native row height, so all sibling cells match even at four, five, or more tracks; virtual tables use the declared count as the initial estimate and measure responsive wrapping after paint. Action cells primarily use an icon-only Ellipses treatment, render a 24px small ButtonUnfilled, default to unbordered, and emit row, column, and action identities through dsCellAction. When an action cell declares items, that Ellipses trigger opens the shared ds-menu for commands, dividers, inactive rows, and destructive rows instead of emitting on click; choosing a command emits dsCellAction with that item's actionId. Omit items to keep a single-shot control. Image cells declare tracks 1, 2, or 3 so the 16:9 bordered preview fills that body-row content box (cell height minus 8px padding) and the column hugs the resulting width; omit tracks for the 1-track recipe, and keep image tracks aligned with the other cells in the table or group. Image cells fall back to an accessible placeholder when no source is supplied. Empty means the data applies but has no value and renders an em dash with localized assistive text; Blank means the data is not applicable and renders no content. Nullish values remain backward-compatible Empty values. Stable type, variant, and track-count hooks keep every cell family independently styleable.",
8964
9066
  "The public @ds-mo/ui/table.css export is the authoritative zero-specificity visual recipe. Override its --ds-table-* properties or target its stable element classes for product-specific styling."
8965
9067
  ],
8966
9068
  "responsiveBehavior": [
@@ -8969,14 +9071,14 @@
8969
9071
  "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.",
8970
9072
  "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.",
8971
9073
  "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.",
8972
- "Explicit column sizes establish the horizontal overflow width; unsized columns share remaining space. Set imageTracks on an image column to derive its fixed width from the matching 1-, 2-, or 3-track 16:9 image geometry plus table cell padding instead of copying a numeric width.",
9074
+ "Explicit column sizes establish the horizontal overflow width; unsized columns share remaining space. When every visible data column is explicitly sized, one internal presentational spacer absorbs unused inline space without stretching the final data column and collapses to zero when those widths introduce horizontal overflow. The spacer sits before trailing action and sticky-end lanes so those controls remain at the visible edge. Set imageTracks on an image column to derive its fixed width from the matching 1-, 2-, or 3-track 16:9 image geometry plus table cell padding instead of copying a numeric width.",
8973
9075
  "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.",
8974
- "Column headers use one 32px geometry. Body rows use a 40px single-track minimum with shared 8px cell padding; additional tracks grow downward. Image previews fill the same content box as their declared track count. The second text track and the third text track share one subdued body-small recipe so line 3 lines up with line 2.",
9076
+ "Column headers use one 32px geometry. Body rows use a 40px single-track minimum with shared 8px cell padding; every additional track adds 22px and grows the complete native row so sibling cells match. Image previews fill the same content box as their declared track count. Wrapping multiple-Tag cells may declare any positive track count. The second text track and the third text track share one subdued body-small recipe so line 3 lines up with line 2.",
8975
9077
  "Long content truncates to one line by default. Hover (or keyboard-focus a primary link) shows the omitted value in one table-owned tooltip when that track overflows. maxLines 2 or 3 wrap onto the named 2-track and 3-track row heights, then ellipsize with the same tooltip. wrap: true remains unlimited and does not show a truncation tooltip. Wrapping 1-track primary occupies the named 2-track and 3-track row heights instead of a private line-height scale. Wrapping secondary on a 2-track cell occupies the named 3-track row and a 106px fourth track for three lines."
8976
9078
  ],
8977
9079
  "frameworkCaveats": {
8978
9080
  "customElements": [
8979
- "Assign columns, rows, groups, grouping, sort, selectedRowIds, collapsedGroupIds, hiddenColumnIds, columnOrder, pagination, displayedCount, and totalCount through JavaScript properties rather than HTML attribute strings.",
9081
+ "Assign columns, rows, groups, grouping, sort, selectedRowIds, collapsedGroupIds, highlightTerms, highlightFieldIds, hiddenColumnIds, columnOrder, pagination, displayedCount, and totalCount through JavaScript properties rather than HTML attribute strings.",
8980
9082
  "dataMode=virtual recycles row DOM over the supplied in-memory rows or groups and requires height, maxHeight, or fitViewport. It does not fetch or paginate.",
8981
9083
  "When an action cell supplies items, the table opens one shared ds-menu from the Ellipses trigger; dsCellAction fires for the selected command, not for opening or closing the menu.",
8982
9084
  "When columnCustomizer is enabled, the Table trigger opens the same shared ds-menu of reorderable switch rows; toggling a switch or reordering a row emits dsColumnsConfigChange and does not close the menu.",
@@ -9133,6 +9235,14 @@
9133
9235
  "type": "string[]",
9134
9236
  "required": false
9135
9237
  },
9238
+ "highlightFieldIds": {
9239
+ "type": "string[]",
9240
+ "required": false
9241
+ },
9242
+ "highlightTerms": {
9243
+ "type": "string[]",
9244
+ "required": false
9245
+ },
9136
9246
  "infiniteModeLabel": {
9137
9247
  "type": "string",
9138
9248
  "required": false
@@ -9317,12 +9427,12 @@
9317
9427
  "tag": "ds-table-filter",
9318
9428
  "name": "table-filter",
9319
9429
  "title": "TableFilter",
9320
- "summary": "Standard table-toolbar Filter control that owns the shared trigger, filter menu UI, accessible defaults, and compact-caption behavior while the application controls data and values.",
9430
+ "summary": "Standard table-toolbar Filter control that owns the shared trigger, searchable non-date filter options, accessible defaults, and compact-caption behavior while the application controls data and values.",
9321
9431
  "intentStatus": "complete",
9322
9432
  "intent": {
9323
9433
  "audience": "general",
9324
9434
  "status": "stable",
9325
- "summary": "Standard table-toolbar Filter control that owns the shared trigger, filter menu UI, accessible defaults, and compact-caption behavior while the application controls data and values.",
9435
+ "summary": "Standard table-toolbar Filter control that owns the shared trigger, searchable non-date filter options, accessible defaults, and compact-caption behavior while the application controls data and values.",
9326
9436
  "useWhen": [
9327
9437
  "A table toolbar should expose the standard singular Filter control and shared filter-menu interaction.",
9328
9438
  "A product supplies filter definitions and controlled values but should not recreate the toolbar trigger, category navigation, or responsive treatment."
@@ -9352,12 +9462,14 @@
9352
9462
  "accessibility": [
9353
9463
  "The trigger is an icon-label combobox named Filter table unless a product aria-label supplies the table context. Compact caption widths preserve that accessible name after the visible label and chevron are omitted.",
9354
9464
  "The popup retains ds-filter-menu category navigation, option semantics, focus entry, dismissal, and focus return, and aligns its start edge with the trigger.",
9355
- "Localize label, menuLabel, categoriesLabel, and clearLabel together so visible and accessible wording remains consistent."
9465
+ "Localize label, menuLabel, categoriesLabel, clearLabel, searchPlaceholder, and noResultsText together so visible and accessible wording remains consistent."
9356
9466
  ],
9357
9467
  "states": [
9358
- "filters, values, and activeFilterId are controlled. dsChange, dsClear, and dsActiveFilterChange report intent without changing those inputs; the application applies query consequences and returns replacement values.",
9468
+ "filters, values, matchModes, and activeFilterId are controlled. dsChange, dsMatchModeChange, dsClear, and dsActiveFilterChange report intent without changing those inputs; the application applies query consequences and returns replacement values.",
9359
9469
  "The visible trigger label stays singular Filter without appending an active-count suffix. Active criteria promote only the visible label from secondary to primary, matching the other table caption controls without redefining generic button active semantics.",
9360
9470
  "The popup reserves a visually empty footer row inside the category pane for every state. Active criteria reveal its divider and only a left-aligned Clear action, without adding popup height or showing redundant selected-count copy; the option pane retains its full column.",
9471
+ "Every multiple-choice category exposes a right-pane footer where the blue any or all word toggles its controlled match mode. any is the default OR mode; the application applies the requested mode to its query.",
9472
+ "Every non-date category exposes a 40px secondary-background search header that filters its displayed option labels and descriptions without changing controlled filter values. Date retains only its Relative and Range header.",
9361
9473
  "Date categories use the shared compact-header Range and Relative experience. Persist relative values semantically and resolve them from the product's current date whenever rows or saved views are applied.",
9362
9474
  "Popup visibility follows the same mutable open and dsOpenChange contract as ds-filter-menu."
9363
9475
  ],
@@ -9367,13 +9479,13 @@
9367
9479
  ],
9368
9480
  "frameworkCaveats": {
9369
9481
  "customElements": [
9370
- "Assign filters, values, and activeFilterId as JavaScript properties. Replace controlled values in response to dsChange and dsClear."
9482
+ "Assign filters, values, matchModes, and activeFilterId as JavaScript properties. Replace controlled values and modes in response to dsChange, dsMatchModeChange, and dsClear."
9371
9483
  ],
9372
9484
  "react": [
9373
- "Keep filters and values in application state and replace values from the typed dsChange and dsClear events."
9485
+ "Keep filters, values, and matchModes in application state and replace them from the typed dsChange, dsMatchModeChange, and dsClear events."
9374
9486
  ],
9375
9487
  "angular": [
9376
- "Import the generated DsTableFilter adapter, bind filters and values, and handle dsChange, dsClear, and dsActiveFilterChange."
9488
+ "Import the generated DsTableFilter adapter, bind filters, values, and matchModes, and handle dsChange, dsMatchModeChange, dsClear, and dsActiveFilterChange."
9377
9489
  ]
9378
9490
  },
9379
9491
  "references": [
@@ -9413,14 +9525,26 @@
9413
9525
  "type": "string",
9414
9526
  "required": false
9415
9527
  },
9528
+ "matchModes": {
9529
+ "type": "FilterMenuMatchModes",
9530
+ "required": false
9531
+ },
9416
9532
  "menuLabel": {
9417
9533
  "type": "string | null",
9418
9534
  "required": false
9419
9535
  },
9536
+ "noResultsText": {
9537
+ "type": "string",
9538
+ "required": false
9539
+ },
9420
9540
  "open": {
9421
9541
  "type": "boolean",
9422
9542
  "required": false
9423
9543
  },
9544
+ "searchPlaceholder": {
9545
+ "type": "string",
9546
+ "required": false
9547
+ },
9424
9548
  "values": {
9425
9549
  "type": "FilterMenuValues",
9426
9550
  "required": false
@@ -9447,6 +9571,10 @@
9447
9571
  "name": "dsClose",
9448
9572
  "detail": "void"
9449
9573
  },
9574
+ {
9575
+ "name": "dsMatchModeChange",
9576
+ "detail": "FilterMenuMatchModeChangeDetail"
9577
+ },
9450
9578
  {
9451
9579
  "name": "dsOpenChange",
9452
9580
  "detail": "boolean"
@@ -9468,6 +9596,138 @@
9468
9596
  "filter-menu"
9469
9597
  ]
9470
9598
  },
9599
+ {
9600
+ "id": "component:ds-table-group",
9601
+ "tag": "ds-table-group",
9602
+ "name": "table-group",
9603
+ "title": "TableGroup",
9604
+ "summary": "Two-panel toolbar control for choosing one table grouping data point and the ascending or descending order of its group sections.",
9605
+ "intentStatus": "complete",
9606
+ "intent": {
9607
+ "audience": "general",
9608
+ "status": "stable",
9609
+ "summary": "Two-panel toolbar control for choosing one table grouping data point and the ascending or descending order of its group sections.",
9610
+ "useWhen": [
9611
+ "A table toolbar needs explicit control of one grouping level and its section order.",
9612
+ "Grouping data-point labels differ from compact table-header labels."
9613
+ ],
9614
+ "avoidWhen": [
9615
+ "The table is not groupable.",
9616
+ "The application expects the component to rearrange rows or create group sections internally."
9617
+ ],
9618
+ "alternatives": [
9619
+ {
9620
+ "when": "The choice is one submitted form value with no dependent order pane.",
9621
+ "component": "component:ds-select",
9622
+ "reason": "Select owns form-value semantics rather than table grouping state."
9623
+ }
9624
+ ],
9625
+ "commonlyComposedWith": [
9626
+ "component:ds-table",
9627
+ "component:ds-table-toolbar",
9628
+ "component:ds-table-filter",
9629
+ "component:ds-table-sort"
9630
+ ],
9631
+ "patterns": [
9632
+ "pattern:menu-trigger"
9633
+ ],
9634
+ "accessibility": [
9635
+ "The trigger opens a named non-modal dialog. Data and Order are independently named single-selection listboxes.",
9636
+ "Up and Down move within the focused pane. Right moves from Data to Order when a group is active, Left returns to the selected Data row, and Escape closes the dialog and restores trigger focus.",
9637
+ "The right pane remains present before a group is active as one complete empty state without the Order heading, and explains that a group must be selected."
9638
+ ],
9639
+ "states": [
9640
+ "options and grouping are controlled. dsGroupChange reports a complete TableGroupingState and dsClear requests null grouping without mutating either input.",
9641
+ "Selecting a new data point starts its order at ascending. Re-selecting the active data point preserves its direction.",
9642
+ "Selecting a data point or direction applies immediately and leaves the dialog open so the other pane can be changed."
9643
+ ],
9644
+ "responsiveBehavior": [
9645
+ "Use in the trailing region of ds-table-toolbar.",
9646
+ "The trigger uses the shared caption-control button behavior and becomes icon-only in compact named table containers.",
9647
+ "Both panes remain present and their choice lists scroll within the collision-constrained popup."
9648
+ ],
9649
+ "frameworkCaveats": {
9650
+ "customElements": [
9651
+ "Assign options and grouping as JavaScript properties and replace grouping from dsGroupChange or dsClear."
9652
+ ],
9653
+ "react": [
9654
+ "Keep grouping in application state and replace it from dsGroupChange; set it to null from dsClear."
9655
+ ],
9656
+ "angular": [
9657
+ "Import the generated DsTableGroup adapter and bind options and grouping as properties."
9658
+ ]
9659
+ },
9660
+ "references": [
9661
+ {
9662
+ "label": "Review states",
9663
+ "path": "src/wc/components/TableGroup/TableGroup.stories.ts"
9664
+ },
9665
+ {
9666
+ "label": "Toolbar composition owner",
9667
+ "path": "src/wc/components/TableToolbar/TableToolbar.agent.json"
9668
+ }
9669
+ ]
9670
+ },
9671
+ "api": {
9672
+ "props": {
9673
+ "ariaLabel": {
9674
+ "type": "string | null",
9675
+ "required": false
9676
+ },
9677
+ "clearLabel": {
9678
+ "type": "string",
9679
+ "required": false
9680
+ },
9681
+ "emptyMessage": {
9682
+ "type": "string",
9683
+ "required": false
9684
+ },
9685
+ "grouping": {
9686
+ "type": "TableGroupingState | null",
9687
+ "required": false
9688
+ },
9689
+ "open": {
9690
+ "type": "boolean",
9691
+ "required": false
9692
+ },
9693
+ "options": {
9694
+ "type": "TableGroupOption[]",
9695
+ "required": false
9696
+ }
9697
+ },
9698
+ "events": [
9699
+ {
9700
+ "name": "dsClear",
9701
+ "detail": "void"
9702
+ },
9703
+ {
9704
+ "name": "dsGroupChange",
9705
+ "detail": "TableGroupingState"
9706
+ },
9707
+ {
9708
+ "name": "dsOpenChange",
9709
+ "detail": "boolean"
9710
+ }
9711
+ ],
9712
+ "slots": []
9713
+ },
9714
+ "exports": {
9715
+ "customElement": "ds-table-group",
9716
+ "react": "DsTableGroup",
9717
+ "vue": "DsTableGroup",
9718
+ "angular": "DsTableGroup"
9719
+ },
9720
+ "dependencies": [
9721
+ "@ds-mo/ui",
9722
+ "@ds-mo/tokens"
9723
+ ],
9724
+ "componentDependencies": [
9725
+ "button-unfilled",
9726
+ "empty-state",
9727
+ "input",
9728
+ "text"
9729
+ ]
9730
+ },
9471
9731
  {
9472
9732
  "id": "component:ds-table-saved-views",
9473
9733
  "tag": "ds-table-saved-views",
@@ -9616,6 +9876,148 @@
9616
9876
  "select"
9617
9877
  ]
9618
9878
  },
9879
+ {
9880
+ "id": "component:ds-table-search",
9881
+ "tag": "ds-table-search",
9882
+ "name": "table-search",
9883
+ "title": "TableSearch",
9884
+ "summary": "Controlled table-search editor with slash-invoked field scoping, removable inset field Chips, and an input-focused listbox keyboard model.",
9885
+ "intentStatus": "complete",
9886
+ "intent": {
9887
+ "audience": "general",
9888
+ "status": "stable",
9889
+ "summary": "Controlled table-search editor with slash-invoked field scoping, removable inset field Chips, and an input-focused listbox keyboard model.",
9890
+ "useWhen": [
9891
+ "A data-table search needs optional field-specific scopes without replacing the application's filtering logic.",
9892
+ "People should be able to add one or more searchable data points through a slash command while continuing to type one free-text query."
9893
+ ],
9894
+ "avoidWhen": [
9895
+ "A plain global text search is sufficient; use Input with type search.",
9896
+ "The choices are persistent filters with independent values; use TableFilter or Select instead.",
9897
+ "The component is expected to inspect records, build a search index, or filter rows internally."
9898
+ ],
9899
+ "commonlyComposedWith": [
9900
+ "component:ds-table",
9901
+ "component:ds-table-toolbar",
9902
+ "component:ds-chip",
9903
+ "component:ds-button-unfilled",
9904
+ "component:ds-icon"
9905
+ ],
9906
+ "accessibility": [
9907
+ "The native search input remains the one Tab stop and exposes combobox, expanded, controls, and active-descendant relationships to the field listbox.",
9908
+ "Typing slash opens the field listbox without inserting slash into the table query. Text typed while it is open filters data points by complete label, Up and Down change the active match, Enter selects it, Escape closes it, and Left and Right retain native text-cursor behavior because focus never leaves the input. Backspace edits the field-picker query first and closes the listbox when that query is empty.",
9909
+ "The query disables browser autocomplete history, automatic capitalization, autocorrection, and spellchecking so browser-owned suggestions never obscure the product-owned field menu or table results.",
9910
+ "Selected field Chips have individually labeled remove actions and are also described by the search input. Polite announcements report additions, removals, and clearing without duplicating the visible query.",
9911
+ "The slash suffix is a labeled double-inset md button excluded from sequential keyboard navigation; the search input exposes the same action through aria-keyshortcuts and its description.",
9912
+ "The clear action removes both free text and every selected field. It restores focus to the search input; each Chip's own remove action remains scoped to that field."
9913
+ ],
9914
+ "states": [
9915
+ "value and selectedFieldIds are controlled. columns supplies the same table catalog used by Table and TableSort; dataLabel provides the complete out-of-context name while header and header segment label may remain compact. dsChange reports query edits, dsFieldsChange reports the next ordered field identities, and dsClear reports a complete clear. The component never filters rows or mutates consumer inputs.",
9916
+ "The field menu excludes already-selected identities and closes after one selection. Typing slash again reopens the remaining fields so multiple scopes can be added.",
9917
+ "Selected scopes render as neutral md Chips using the double-inset recipe so they remain 24px high inside the 32px md search control and each can be removed directly.",
9918
+ "Backspace edits a non-empty field-picker query, then closes the open slash listbox when that query is empty. When the table query is empty and the listbox is already closed, the next Backspace removes the last selected field. Ordinary Backspace edits table query text when the listbox is closed.",
9919
+ "Duplicate, blank, and unknown field identities are ignored for presentation. Selected fields preserve the consumer's order.",
9920
+ "Inactive search leaves the tab order, closes the field listbox, and does not emit query or field changes."
9921
+ ],
9922
+ "responsiveBehavior": [
9923
+ "The control fills the available inline size supplied by the table toolbar search slot. Selected Chips and the editable query share one horizontal editor lane so the md control does not grow vertically.",
9924
+ "The field popup enters the top layer, aligns its first choice cell with the search control, flips or clamps to the viewport or nearest overlay boundary, and scrolls internally when its catalog is taller than available space.",
9925
+ "Long selected field labels truncate inside their Chips while the input remains available at the inline end of the editor lane. Both suffix actions resolve to the same 24px height as selected Chips. Clear follows the standard md Input recipe—a non-inset sm icon button—while slash is a double-inset md label button. Slash remains rightmost; when query text exposes Clear, a vertical divider separates the two actions."
9926
+ ],
9927
+ "frameworkCaveats": {
9928
+ "customElements": [
9929
+ "Assign columns and selectedFieldIds through JavaScript properties and replace controlled values from dsChange and dsFieldsChange.",
9930
+ "Keep field IDs aligned with the application search index; the component treats IDs as opaque values."
9931
+ ],
9932
+ "react": [
9933
+ "Pass new array references for columns and selectedFieldIds and update controlled state from onDsChange and onDsFieldsChange."
9934
+ ],
9935
+ "angular": [
9936
+ "Import DsTableSearch, bind columns, selectedFieldIds, and value, then update application signals from dsChange and dsFieldsChange."
9937
+ ]
9938
+ },
9939
+ "references": [
9940
+ {
9941
+ "label": "Storybook interaction states",
9942
+ "path": "src/wc/components/TableSearch/TableSearch.stories.ts"
9943
+ },
9944
+ {
9945
+ "label": "Toolbar composition owner",
9946
+ "path": "src/wc/components/TableToolbar/TableToolbar.agent.json"
9947
+ }
9948
+ ]
9949
+ },
9950
+ "api": {
9951
+ "props": {
9952
+ "ariaLabel": {
9953
+ "type": "string",
9954
+ "required": false
9955
+ },
9956
+ "clearLabel": {
9957
+ "type": "string",
9958
+ "required": false
9959
+ },
9960
+ "columns": {
9961
+ "type": "TableColumn[]",
9962
+ "required": false
9963
+ },
9964
+ "fieldMenuLabel": {
9965
+ "type": "string",
9966
+ "required": false
9967
+ },
9968
+ "isInactive": {
9969
+ "type": "boolean",
9970
+ "required": false
9971
+ },
9972
+ "placeholder": {
9973
+ "type": "string",
9974
+ "required": false
9975
+ },
9976
+ "selectedFieldIds": {
9977
+ "type": "string[]",
9978
+ "required": false
9979
+ },
9980
+ "value": {
9981
+ "type": "string",
9982
+ "required": false
9983
+ }
9984
+ },
9985
+ "events": [
9986
+ {
9987
+ "name": "dsChange",
9988
+ "detail": "string"
9989
+ },
9990
+ {
9991
+ "name": "dsClear",
9992
+ "detail": "void"
9993
+ },
9994
+ {
9995
+ "name": "dsFieldsChange",
9996
+ "detail": "TableSearchFieldsChangeDetail"
9997
+ }
9998
+ ],
9999
+ "slots": []
10000
+ },
10001
+ "exports": {
10002
+ "customElement": "ds-table-search",
10003
+ "react": "DsTableSearch",
10004
+ "vue": "DsTableSearch",
10005
+ "angular": "DsTableSearch"
10006
+ },
10007
+ "dependencies": [
10008
+ "@ds-mo/ui",
10009
+ "@ds-mo/tokens",
10010
+ "@ds-mo/icons"
10011
+ ],
10012
+ "componentDependencies": [
10013
+ "button-unfilled",
10014
+ "chip",
10015
+ "divider",
10016
+ "empty-state",
10017
+ "icon",
10018
+ "text"
10019
+ ]
10020
+ },
9619
10021
  {
9620
10022
  "id": "component:ds-table-sort",
9621
10023
  "tag": "ds-table-sort",
@@ -9756,6 +10158,7 @@
9756
10158
  "component:ds-divider",
9757
10159
  "component:ds-input",
9758
10160
  "component:ds-table-filter",
10161
+ "component:ds-table-group",
9759
10162
  "component:ds-select",
9760
10163
  "component:ds-table-sort",
9761
10164
  "component:ds-button-unfilled"
@@ -9769,24 +10172,24 @@
9769
10172
  "states": [
9770
10173
  "The component owns layout only. It never mutates slotted control props, values, menus, loading, persistence, or consequences. Use ds-table-saved-views and ds-table-filter when those interactions need the shared CompoMo behavior while application data and persistence remain external.",
9771
10174
  "Buttons in the toolbar keep their hover and pressed interaction paint without physically scaling, so pointer feedback does not disturb the stable caption geometry.",
9772
- "The start cluster is followed by a decorative vertical divider, then Search, optional leading controls, and one trailing action cluster. The start cluster and divider hide when nothing is projected. Search is a dedicated slot that hides when nothing is projected. Empty leading or trailing clusters add no placeholder chrome. Search is the only toolbar region that shrinks; all action controls retain their control geometry and align directly before the table-owned actions.",
10175
+ "The start cluster is followed by a decorative vertical divider, then Search, optional leading controls, and one trailing action cluster. The start cluster and divider hide when nothing is projected. Search is a dedicated slot that hides when nothing is projected and grows to consume available row space. Empty leading or trailing clusters add no placeholder chrome. Search is the only toolbar region that grows and shrinks; all action controls retain their control geometry and align directly before the table-owned actions.",
9773
10176
  "Column customizer and data-mode switching stay table-owned caption actions. Do not recreate those menus in the toolbar. When slotted into a table header, the table caption owns overflow for the complete toolbar and table-owned action row."
9774
10177
  ],
9775
10178
  "responsiveBehavior": [
9776
10179
  "The start cluster, search, trailing Filter/Sort/Group, and table caption trailing actions stay on one line. Saved views hug their current trigger content up to the compact menu-width token rather than reserving that full width; long names truncate while the dirty dot stays visible. Filter, Sort, and Group triggers cap at the same token, and Sort and Group popups keep that compact menu-width floor. A standalone toolbar owns its horizontal scrolling; inside a table, the complete caption row is the single overflow owner so table-owned actions never remain pinned over scrolling toolbar controls.",
9777
- "Inside a named ds-table container narrower than 900px, Search retains its standard maximum width and flexes smaller only when the complete row needs space. ds-table-filter and ds-table-sort omit their labels and chevrons, and Group controls explicitly opted into collapseLabel become icon-only; each exposes its label through a hover and keyboard-focus tooltip. Empty leading and trailing slot groups do not add spacing. Active filtering or grouping promotes the prefix icon to primary. Sort keeps resting secondary chrome. Table-owned Customize also becomes the icon-only Table menu button at that width with the same tooltip behavior.",
10180
+ "Search consumes the row space left between fixed control groups and flexes smaller when the complete row needs space. Inside a named ds-table container narrower than 900px, ds-table-filter, ds-table-group, and ds-table-sort omit their labels and chevrons; each exposes its label through a hover and keyboard-focus tooltip. Empty leading and trailing slot groups do not add spacing. Active filtering promotes its prefix icon to primary. Group and Sort keep resting secondary chrome. Table-owned Customize also becomes the icon-only Table menu button at that width with the same tooltip behavior.",
9778
10181
  "The scrollbar is visually suppressed without removing touch, trackpad, mouse-wheel, or keyboard scrolling from the overflow container.",
9779
10182
  "Trailing controls remain grouped after leading controls; the toolbar does not collapse controls into an application-specific overflow menu."
9780
10183
  ],
9781
10184
  "frameworkCaveats": {
9782
10185
  "customElements": [
9783
- "Project saved views through slot=start, search through slot=search, additional left-side middle controls through slot=leading, and ds-table-filter, Group, and ds-table-sort through slot=trailing. Set collapseLabel on the Group control and provide contextual accessible names when Table controls is insufficient."
10186
+ "Project saved views through slot=start, search through slot=search, additional left-side middle controls through slot=leading, and ds-table-filter, ds-table-group, and ds-table-sort through slot=trailing. Provide contextual accessible names when Table controls is insufficient."
9784
10187
  ],
9785
10188
  "react": [
9786
- "Set slot=start, slot=search, slot=leading, or slot=trailing on each child control. Use ds-table-filter for the standard Filter recipe, opt Group into collapseLabel, and keep values and event handlers in the application."
10189
+ "Set slot=start, slot=search, slot=leading, or slot=trailing on each child control. Use ds-table-filter and ds-table-group for the standard Filter and Group recipes, and keep values and event handlers in the application."
9787
10190
  ],
9788
10191
  "angular": [
9789
- "Set slot=start, slot=search, slot=leading, or slot=trailing on each child control, use DsTableFilter for the standard Filter recipe, opt Group into collapseLabel, and import the generated adapters."
10192
+ "Set slot=start, slot=search, slot=leading, or slot=trailing on each child control, use DsTableFilter and DsTableGroup for the standard Filter and Group recipes, and import the generated adapters."
9790
10193
  ]
9791
10194
  },
9792
10195
  "references": [