@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
@@ -0,0 +1,301 @@
1
+ {
2
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
+ "name": "table-group",
4
+ "title": "TableGroup",
5
+ "description": "Two-panel toolbar control for choosing one table grouping data point and the ascending or descending order of its group sections.",
6
+ "type": "registry:ui",
7
+ "meta": {
8
+ "library": "@ds-mo/ui",
9
+ "distribution": "npm",
10
+ "storybook": "https://zainadeel.github.io/compomo/?path=/story/table-group",
11
+ "source": "src/wc/components/TableGroup/TableGroup.tsx",
12
+ "intentStatus": "complete",
13
+ "intent": {
14
+ "audience": "general",
15
+ "status": "stable",
16
+ "summary": "Two-panel toolbar control for choosing one table grouping data point and the ascending or descending order of its group sections.",
17
+ "useWhen": [
18
+ "A table toolbar needs explicit control of one grouping level and its section order.",
19
+ "Grouping data-point labels differ from compact table-header labels."
20
+ ],
21
+ "avoidWhen": [
22
+ "The table is not groupable.",
23
+ "The application expects the component to rearrange rows or create group sections internally."
24
+ ],
25
+ "alternatives": [
26
+ {
27
+ "when": "The choice is one submitted form value with no dependent order pane.",
28
+ "component": "component:ds-select",
29
+ "reason": "Select owns form-value semantics rather than table grouping state."
30
+ }
31
+ ],
32
+ "commonlyComposedWith": [
33
+ "component:ds-table",
34
+ "component:ds-table-toolbar",
35
+ "component:ds-table-filter",
36
+ "component:ds-table-sort"
37
+ ],
38
+ "patterns": [
39
+ "pattern:menu-trigger"
40
+ ],
41
+ "accessibility": [
42
+ "The trigger opens a named non-modal dialog. Data and Order are independently named single-selection listboxes.",
43
+ "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.",
44
+ "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."
45
+ ],
46
+ "states": [
47
+ "options and grouping are controlled. dsGroupChange reports a complete TableGroupingState and dsClear requests null grouping without mutating either input.",
48
+ "Selecting a new data point starts its order at ascending. Re-selecting the active data point preserves its direction.",
49
+ "Selecting a data point or direction applies immediately and leaves the dialog open so the other pane can be changed."
50
+ ],
51
+ "responsiveBehavior": [
52
+ "Use in the trailing region of ds-table-toolbar.",
53
+ "The trigger uses the shared caption-control button behavior and becomes icon-only in compact named table containers.",
54
+ "Both panes remain present and their choice lists scroll within the collision-constrained popup."
55
+ ],
56
+ "frameworkCaveats": {
57
+ "customElements": [
58
+ "Assign options and grouping as JavaScript properties and replace grouping from dsGroupChange or dsClear."
59
+ ],
60
+ "react": [
61
+ "Keep grouping in application state and replace it from dsGroupChange; set it to null from dsClear."
62
+ ],
63
+ "angular": [
64
+ "Import the generated DsTableGroup adapter and bind options and grouping as properties."
65
+ ]
66
+ },
67
+ "references": [
68
+ {
69
+ "label": "Review states",
70
+ "path": "src/wc/components/TableGroup/TableGroup.stories.ts"
71
+ },
72
+ {
73
+ "label": "Toolbar composition owner",
74
+ "path": "src/wc/components/TableToolbar/TableToolbar.agent.json"
75
+ }
76
+ ]
77
+ },
78
+ "api": {
79
+ "props": {
80
+ "ariaLabel": {
81
+ "type": "string | null",
82
+ "resolvedType": "null | string",
83
+ "attribute": "aria-label",
84
+ "default": "null",
85
+ "required": false,
86
+ "mutable": false,
87
+ "description": "Accessible name for the trigger and non-modal dialog."
88
+ },
89
+ "clearLabel": {
90
+ "type": "string",
91
+ "resolvedType": "string",
92
+ "attribute": "clear-label",
93
+ "default": "'Clear'",
94
+ "required": false,
95
+ "mutable": false,
96
+ "description": "Clear action label."
97
+ },
98
+ "emptyMessage": {
99
+ "type": "string",
100
+ "resolvedType": "string",
101
+ "attribute": "empty-message",
102
+ "default": "'Select a group to choose its order.'",
103
+ "required": false,
104
+ "mutable": false,
105
+ "description": "Empty message kept in the order pane until a grouping data point is selected."
106
+ },
107
+ "grouping": {
108
+ "type": "TableGroupingState | null",
109
+ "resolvedType": "TableGroupingState | null",
110
+ "default": "null",
111
+ "required": false,
112
+ "mutable": false,
113
+ "description": "Controlled grouping field and the order of its group sections."
114
+ },
115
+ "open": {
116
+ "type": "boolean",
117
+ "resolvedType": "boolean",
118
+ "attribute": "open",
119
+ "default": "false",
120
+ "required": false,
121
+ "mutable": true,
122
+ "description": "Controlled popup visibility."
123
+ },
124
+ "options": {
125
+ "type": "TableGroupOption[]",
126
+ "resolvedType": "TableGroupOption[]",
127
+ "default": "[]",
128
+ "required": false,
129
+ "mutable": false,
130
+ "description": "Product-owned data points that may group the table."
131
+ }
132
+ },
133
+ "events": [
134
+ {
135
+ "name": "dsClear",
136
+ "detail": "void",
137
+ "bubbles": true,
138
+ "cancelable": true,
139
+ "composed": true,
140
+ "description": "Requests removal of the controlled grouping state."
141
+ },
142
+ {
143
+ "name": "dsGroupChange",
144
+ "detail": "TableGroupingState",
145
+ "bubbles": true,
146
+ "cancelable": true,
147
+ "composed": true,
148
+ "description": "Requests replacement of the complete controlled grouping state."
149
+ },
150
+ {
151
+ "name": "dsOpenChange",
152
+ "detail": "boolean",
153
+ "bubbles": true,
154
+ "cancelable": true,
155
+ "composed": true,
156
+ "description": "Reports controlled popup visibility changes."
157
+ }
158
+ ],
159
+ "methods": [],
160
+ "slots": []
161
+ },
162
+ "props": {
163
+ "ariaLabel": {
164
+ "type": "string | null",
165
+ "resolvedType": "null | string",
166
+ "attribute": "aria-label",
167
+ "default": "null",
168
+ "required": false,
169
+ "mutable": false,
170
+ "description": "Accessible name for the trigger and non-modal dialog."
171
+ },
172
+ "clearLabel": {
173
+ "type": "string",
174
+ "resolvedType": "string",
175
+ "attribute": "clear-label",
176
+ "default": "'Clear'",
177
+ "required": false,
178
+ "mutable": false,
179
+ "description": "Clear action label."
180
+ },
181
+ "emptyMessage": {
182
+ "type": "string",
183
+ "resolvedType": "string",
184
+ "attribute": "empty-message",
185
+ "default": "'Select a group to choose its order.'",
186
+ "required": false,
187
+ "mutable": false,
188
+ "description": "Empty message kept in the order pane until a grouping data point is selected."
189
+ },
190
+ "grouping": {
191
+ "type": "TableGroupingState | null",
192
+ "resolvedType": "TableGroupingState | null",
193
+ "default": "null",
194
+ "required": false,
195
+ "mutable": false,
196
+ "description": "Controlled grouping field and the order of its group sections."
197
+ },
198
+ "open": {
199
+ "type": "boolean",
200
+ "resolvedType": "boolean",
201
+ "attribute": "open",
202
+ "default": "false",
203
+ "required": false,
204
+ "mutable": true,
205
+ "description": "Controlled popup visibility."
206
+ },
207
+ "options": {
208
+ "type": "TableGroupOption[]",
209
+ "resolvedType": "TableGroupOption[]",
210
+ "default": "[]",
211
+ "required": false,
212
+ "mutable": false,
213
+ "description": "Product-owned data points that may group the table."
214
+ }
215
+ },
216
+ "events": [
217
+ {
218
+ "name": "dsClear",
219
+ "detail": "void",
220
+ "bubbles": true,
221
+ "cancelable": true,
222
+ "composed": true,
223
+ "description": "Requests removal of the controlled grouping state."
224
+ },
225
+ {
226
+ "name": "dsGroupChange",
227
+ "detail": "TableGroupingState",
228
+ "bubbles": true,
229
+ "cancelable": true,
230
+ "composed": true,
231
+ "description": "Requests replacement of the complete controlled grouping state."
232
+ },
233
+ {
234
+ "name": "dsOpenChange",
235
+ "detail": "boolean",
236
+ "bubbles": true,
237
+ "cancelable": true,
238
+ "composed": true,
239
+ "description": "Reports controlled popup visibility changes."
240
+ }
241
+ ],
242
+ "methods": [],
243
+ "slots": [],
244
+ "exports": {
245
+ "customElement": "ds-table-group",
246
+ "react": "DsTableGroup",
247
+ "vue": "DsTableGroup",
248
+ "angular": "DsTableGroup"
249
+ },
250
+ "consumption": {
251
+ "install": "npm install @ds-mo/ui @ds-mo/tokens @ds-mo/icons",
252
+ "cssSetup": "import '@ds-mo/tokens';\nimport '@ds-mo/tokens/reset';\nimport '@ds-mo/tokens/globals';",
253
+ "customElements": {
254
+ "import": "import '@ds-mo/ui/dist/components/ds-table-group.js';",
255
+ "example": "<ds-table-group></ds-table-group>"
256
+ },
257
+ "react": {
258
+ "import": "import { DsTableGroup } from '@ds-mo/ui/react';",
259
+ "example": "<DsTableGroup />"
260
+ },
261
+ "vue": {
262
+ "import": "import { DsTableGroup } from '@ds-mo/ui/vue';",
263
+ "example": "<DsTableGroup />"
264
+ },
265
+ "angular": {
266
+ "import": "import { DsTableGroup } from '@ds-mo/ui/angular/ds-table-group';",
267
+ "example": "<ds-table-group></ds-table-group>"
268
+ },
269
+ "complexPropertyNote": "Assign these non-primitive values as JavaScript properties: grouping, options.",
270
+ "peerDependencies": {
271
+ "required": [
272
+ "@ds-mo/tokens ^6.5.0",
273
+ "@ds-mo/icons ^7.0.0"
274
+ ],
275
+ "frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
276
+ }
277
+ }
278
+ },
279
+ "dependencies": [
280
+ "@ds-mo/ui",
281
+ "@ds-mo/tokens"
282
+ ],
283
+ "registryDependencies": [
284
+ "button-unfilled",
285
+ "empty-state",
286
+ "input",
287
+ "text"
288
+ ],
289
+ "files": [
290
+ {
291
+ "path": "src/wc/components/TableGroup/TableGroup.css",
292
+ "content": "@import '../../utils/choice-list.css';\n@import '../../utils/control-parts.css';\n@import '../../utils/table-caption-control.css';\n\n:host {\n display: inline-flex;\n min-inline-size: 0;\n max-inline-size: var(--dimension-menu-width-xs);\n}\n\n:host([hidden]) {\n display: none;\n}\n\n.table-group__body {\n display: grid;\n grid-template-columns: var(--dimension-menu-width-xs) var(--dimension-menu-width-sm);\n min-height: calc(var(--dimension-size-800) * 4 + var(--dimension-space-150));\n max-height: calc(100vh - var(--dimension-size-800) - var(--dimension-size-600));\n}\n\n.table-group__data-pane,\n.table-group__order-pane {\n display: flex;\n min-width: 0;\n min-height: 0;\n flex-direction: column;\n}\n\n.table-group__data-pane {\n border-inline-end: var(--dimension-stroke-width-012) solid var(--color-border-tertiary);\n}\n\n.table-group__list {\n flex: 1 1 auto;\n}\n\n.table-group__empty {\n flex: 1 1 auto;\n}\n\n.table-group__footer {\n flex: 0 0 auto;\n}\n\n.table-group__footer .ds-choice-footer__content {\n justify-content: flex-start;\n}\n\n.table-group__footer[aria-hidden='true']::before {\n visibility: hidden;\n}\n\n.table-group__footer[aria-hidden='true'] .ds-choice-footer__content {\n visibility: hidden;\n}\n\n@media (forced-colors: active) {\n .table-group__data-pane {\n border-inline-end-color: var(--ds-forced-color-content);\n }\n}\n",
293
+ "type": "registry:ui"
294
+ },
295
+ {
296
+ "path": "src/wc/components/TableGroup/TableGroup.tsx",
297
+ "content": "import {\n Component,\n Element,\n Event,\n EventEmitter,\n h,\n Host,\n Listen,\n Prop,\n State,\n Watch,\n} from '@stencil/core';\nimport {\n resolveChoicePopupAlignOffset,\n resolveCssLengthPx,\n resolveMotionTimeMs,\n TOKEN_CSS_LENGTHS,\n TOKEN_DEFAULTS,\n} from '../../utils';\nimport { AnchoredPositionController } from '../../utils/anchored-position-controller';\nimport { AnchoredOverlayInteractionController } from '../../utils/anchored-overlay-interaction-controller';\nimport { resolveAnchoredOverlayBoundaryRect } from '../../utils/anchored-overlay-boundary';\nimport { ChoiceListSection, ChoiceOptionRow } from '../../utils/choice-list-parts';\nimport type { TableGroupingState, TableSortDirection } from '../Table/table-types';\n\nexport interface TableGroupOption {\n label: string;\n value: string;\n description?: string;\n isInactive?: boolean;\n}\n\nlet tableGroupSeq = 0;\n\n@Component({\n tag: 'ds-table-group',\n styleUrl: 'TableGroup.css',\n scoped: true,\n})\nexport class TableGroup {\n @Element() private el!: HTMLElement;\n\n /** Product-owned data points that may group the table. */\n @Prop() options: TableGroupOption[] = [];\n /** Controlled grouping field and the order of its group sections. */\n @Prop() grouping: TableGroupingState | null = null;\n /** Accessible name for the trigger and non-modal dialog. */\n @Prop({ attribute: 'aria-label' }) ariaLabel: string | null = null;\n /** Controlled popup visibility. */\n @Prop({ mutable: true }) open = false;\n /** Empty message kept in the order pane until a grouping data point is selected. */\n @Prop() emptyMessage = 'Select a group to choose its order.';\n /** Clear action label. */\n @Prop() clearLabel = 'Clear';\n\n /** Requests replacement of the complete controlled grouping state. */\n @Event() dsGroupChange!: EventEmitter<TableGroupingState>;\n /** Requests removal of the controlled grouping state. */\n @Event() dsClear!: EventEmitter<void>;\n /** Reports controlled popup visibility changes. */\n @Event() dsOpenChange!: EventEmitter<boolean>;\n\n @State() private shouldRender = false;\n @State() private closing = false;\n @State() private positionReady = false;\n @State() private pos = { x: 0, y: 0 };\n @State() private focusRingVisible = false;\n\n private readonly componentId = `ds-table-group-${++tableGroupSeq}`;\n private readonly triggerId = `${this.componentId}-trigger`;\n private readonly popupId = `${this.componentId}-popup`;\n private triggerElement: HTMLElement | null = null;\n private pendingInitialFocusVisible = false;\n private closeTimer: ReturnType<typeof setTimeout> | null = null;\n\n private readonly position = new AnchoredPositionController({\n getAnchor: () => this.triggerElement,\n getPopup: () => this.el.querySelector<HTMLElement>('.table-group-popup'),\n getOwnerDocument: () => this.el.ownerDocument,\n measure: (anchor, popup) => {\n if (!this.open) return null;\n const sectionInsetPx = resolveCssLengthPx(TOKEN_DEFAULTS.space050, TOKEN_DEFAULTS.space050);\n return {\n anchorRect: anchor.getBoundingClientRect(),\n popupWidth: popup.offsetWidth || this.popupFallbackWidth,\n popupHeight: popup.offsetHeight || this.popupFallbackHeight,\n side: 'bottom',\n align: 'end',\n sideOffsetPx: resolveCssLengthPx(TOKEN_CSS_LENGTHS.space050, TOKEN_DEFAULTS.space050),\n alignOffsetPx: resolveChoicePopupAlignOffset({\n align: 'end',\n alignOffsetPx: 0,\n sectionInsetPx,\n }),\n viewportPadPx: resolveCssLengthPx(TOKEN_DEFAULTS.space050, TOKEN_DEFAULTS.space050),\n viewportWidth: window.innerWidth,\n viewportHeight: window.innerHeight,\n collisionRect: resolveAnchoredOverlayBoundaryRect(anchor),\n };\n },\n apply: ({ x, y }) => {\n this.pos = { x, y };\n },\n onReady: () => {\n this.positionReady = true;\n },\n liveUpdate: 'double-frame',\n observeResize: true,\n topLayer: true,\n });\n\n private readonly interaction = new AnchoredOverlayInteractionController({\n getAnchor: () => this.triggerElement,\n getPopup: () => this.el.querySelector<HTMLElement>('.table-group-popup'),\n getOwnerDocument: () => this.el.ownerDocument,\n onOutsideActivation: () => this.close(),\n });\n\n componentDidLoad() {\n if (this.open) this.onOpenChange(true);\n }\n\n disconnectedCallback() {\n this.position.unobserve();\n this.interaction.disconnect();\n if (this.closeTimer) clearTimeout(this.closeTimer);\n }\n\n @Watch('open')\n onOpenChange(isOpen: boolean) {\n if (isOpen) {\n this.teardown();\n this.shouldRender = true;\n this.closing = false;\n this.positionReady = false;\n this.focusRingVisible = this.pendingInitialFocusVisible;\n this.interaction.connect();\n this.position.observe();\n this.position.schedule(() => this.focusInitialDataPoint());\n return;\n }\n if (!this.shouldRender) return;\n this.position.cancel();\n this.closing = true;\n this.interaction.disconnect();\n this.position.unobserve();\n const duration = resolveMotionTimeMs(\n TOKEN_DEFAULTS.motionShort2,\n TOKEN_DEFAULTS.animationDurationShort3\n );\n if (duration <= 0) this.finishClose();\n else this.closeTimer = setTimeout(() => this.finishClose(), duration);\n }\n\n @Listen('keydown')\n handleKeyDown(event: KeyboardEvent) {\n if (!this.shouldRender || this.closing) return;\n if (event.key === 'Escape') {\n event.preventDefault();\n this.close();\n return;\n }\n if (event.key !== 'Tab' || !this.interaction.tabLeavesPopup(event)) return;\n event.preventDefault();\n this.close(false);\n this.interaction.moveFocusAfterTab(event.shiftKey);\n }\n\n private get popupFallbackWidth(): number {\n return resolveCssLengthPx(TOKEN_DEFAULTS.menuWidthLg, TOKEN_DEFAULTS.menuWidthLg);\n }\n\n private get popupFallbackHeight(): number {\n return resolveCssLengthPx(TOKEN_DEFAULTS.menuFallbackHeight, TOKEN_DEFAULTS.menuFallbackHeight);\n }\n\n private teardown() {\n this.position.unobserve();\n this.interaction.disconnect();\n if (this.closeTimer) {\n clearTimeout(this.closeTimer);\n this.closeTimer = null;\n }\n }\n\n private toggle(fromKeyboard = false) {\n if (this.open) {\n this.close();\n return;\n }\n this.pendingInitialFocusVisible = fromKeyboard;\n this.open = true;\n this.dsOpenChange.emit(true);\n this.onOpenChange(true);\n }\n\n private close(restoreFocus = true) {\n if (restoreFocus) this.interaction.focusAnchor();\n this.open = false;\n this.dsOpenChange.emit(false);\n this.onOpenChange(false);\n }\n\n private finishClose() {\n const popup = this.el.querySelector<HTMLElement>('.table-group-popup');\n if (popup?.matches(':popover-open')) popup.hidePopover();\n this.shouldRender = false;\n this.closing = false;\n this.closeTimer = null;\n }\n\n private focusInitialDataPoint() {\n requestAnimationFrame(() => {\n const selected = this.grouping\n ? this.el.querySelector<HTMLElement>(\n `[data-group-value=\"${CSS.escape(this.grouping.columnId)}\"] [role=\"option\"]`\n )\n : null;\n const initial =\n selected ??\n this.el.querySelector<HTMLElement>(\n '[data-group-value] [role=\"option\"]:not([aria-disabled=\"true\"])'\n );\n initial?.focus();\n this.pendingInitialFocusVisible = false;\n });\n }\n\n private selectData(option: TableGroupOption) {\n if (option.isInactive) return;\n this.dsGroupChange.emit({\n columnId: option.value,\n direction: this.grouping?.columnId === option.value ? this.grouping.direction : 'asc',\n });\n }\n\n private selectDirection(direction: TableSortDirection) {\n if (!this.grouping || this.grouping.direction === direction) return;\n this.dsGroupChange.emit({ ...this.grouping, direction });\n }\n\n private moveFocus(\n event: KeyboardEvent,\n selector: string,\n currentIndex: number,\n oppositeSelector?: string\n ) {\n if (oppositeSelector && (event.key === 'ArrowLeft' || event.key === 'ArrowRight')) {\n event.preventDefault();\n this.focusRingVisible = true;\n this.el.querySelector<HTMLElement>(oppositeSelector)?.focus();\n return;\n }\n if (!['ArrowDown', 'ArrowUp', 'Home', 'End'].includes(event.key)) return;\n event.preventDefault();\n const items = Array.from(this.el.querySelectorAll<HTMLElement>(selector)).filter(\n item => item.getAttribute('aria-disabled') !== 'true'\n );\n if (!items.length) return;\n let next: number;\n if (event.key === 'Home') next = 0;\n else if (event.key === 'End') next = items.length - 1;\n else next = (currentIndex + (event.key === 'ArrowDown' ? 1 : -1) + items.length) % items.length;\n this.focusRingVisible = true;\n items[next]?.focus();\n }\n\n private renderDataOption(option: TableGroupOption, index: number) {\n const selected = option.value === this.grouping?.columnId;\n return (\n <ChoiceOptionRow\n id={`${this.componentId}-data-${index}`}\n option={{ ...option }}\n selected={selected}\n active={selected}\n focusRingVisible={this.focusRingVisible}\n usesSubtext={Boolean(option.description)}\n tabIndex={selected || (!this.grouping && index === 0) ? 0 : -1}\n onHover={() => {\n this.focusRingVisible = false;\n }}\n onSelect={() => this.selectData(option)}\n onKeyDown={(event: KeyboardEvent) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n this.selectData(option);\n return;\n }\n this.moveFocus(\n event,\n '[data-group-value] [role=\"option\"]',\n this.options\n .filter(candidate => !candidate.isInactive)\n .findIndex(candidate => candidate.value === option.value),\n this.grouping\n ? `[data-group-direction=\"${this.grouping.direction}\"] [role=\"option\"]`\n : undefined\n );\n }}\n />\n );\n }\n\n private renderDirection(direction: TableSortDirection, label: string, index: number) {\n const selected = direction === this.grouping?.direction;\n return (\n <ChoiceOptionRow\n id={`${this.componentId}-direction-${direction}`}\n option={{ label, value: direction }}\n selected={selected}\n active={selected}\n focusRingVisible={this.focusRingVisible}\n usesSubtext={false}\n tabIndex={selected ? 0 : -1}\n onHover={() => {\n this.focusRingVisible = false;\n }}\n onSelect={() => this.selectDirection(direction)}\n onKeyDown={(event: KeyboardEvent) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n this.selectDirection(direction);\n return;\n }\n this.moveFocus(\n event,\n '[data-group-direction] [role=\"option\"]',\n index,\n `[data-group-value=\"${CSS.escape(this.grouping?.columnId ?? '')}\"] [role=\"option\"]`\n );\n }}\n />\n );\n }\n\n render() {\n const name = this.ariaLabel?.trim() || 'Group table';\n const popupStyle: Record<string, string> = {\n position: 'fixed',\n left: '0',\n top: '0',\n transform: `translate(${Math.round(this.pos.x)}px, ${Math.round(this.pos.y)}px)`,\n zIndex: '9998',\n visibility: this.positionReady ? 'visible' : 'hidden',\n };\n\n return (\n <Host hidden={this.options.length === 0 ? true : undefined}>\n {this.options.length ? (\n <ds-button-unfilled\n ref={element => {\n this.triggerElement = (element as HTMLElement) ?? null;\n }}\n id={this.triggerId}\n variant=\"icon-label\"\n size=\"md\"\n icon=\"SectionList\"\n label=\"Group\"\n labelEmphasis={false}\n pressScale={false}\n aria-label={name}\n hasMenu={true}\n collapseLabel={true}\n expanded={this.open}\n controls={this.popupId}\n onDsClick={(event: CustomEvent<MouseEvent>) => this.toggle(event.detail.detail === 0)}\n />\n ) : null}\n\n {this.shouldRender ? (\n <div\n id={this.popupId}\n popover=\"manual\"\n class={{\n 'table-group-popup': true,\n 'ds-choice-popup': true,\n 'ds-choice-popup--closing': this.closing,\n }}\n style={popupStyle}\n role=\"dialog\"\n aria-label={name}\n >\n <div class=\"table-group__body\">\n <div class=\"table-group__data-pane\">\n <ChoiceListSection\n heading=\"Data\"\n ariaLabel=\"Group data\"\n className=\"table-group__list\"\n >\n {this.options.map((option, index) => (\n <div data-group-value={option.value}>\n {this.renderDataOption(option, index)}\n </div>\n ))}\n </ChoiceListSection>\n <div\n class=\"table-group__footer ds-choice-footer\"\n aria-hidden={!this.grouping ? 'true' : undefined}\n >\n <div class=\"ds-choice-footer__content ds-control--md\">\n {this.grouping ? (\n <button\n class=\"ds-choice-footer__clear ds-text-action ds-focus-ring\"\n type=\"button\"\n onClick={() => this.dsClear.emit()}\n >\n <ds-text as=\"span\" variant=\"text-body-medium\" color=\"inherit\">\n {this.clearLabel}\n </ds-text>\n </button>\n ) : null}\n </div>\n </div>\n </div>\n\n <div class=\"table-group__order-pane\">\n {this.grouping ? (\n <ChoiceListSection\n heading=\"Order\"\n ariaLabel=\"Group order\"\n className=\"table-group__list\"\n >\n <div data-group-direction=\"asc\">\n {this.renderDirection('asc', 'Ascending', 0)}\n </div>\n <div data-group-direction=\"desc\">\n {this.renderDirection('desc', 'Descending', 1)}\n </div>\n </ChoiceListSection>\n ) : (\n <div class=\"table-group__empty ds-choice-empty ds-empty-region\">\n <ds-empty-state body={this.emptyMessage} />\n </div>\n )}\n </div>\n </div>\n </div>\n ) : null}\n </Host>\n );\n }\n}\n",
298
+ "type": "registry:ui"
299
+ }
300
+ ]
301
+ }