@ds-mo/ui 15.6.0 → 15.8.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 (297) hide show
  1. package/dist/.package-ready.json +1 -1
  2. package/dist/agent-patterns.json +1 -1
  3. package/dist/agent.json +328 -5
  4. package/dist/angular/ds-navigation-tab-group.d.ts +15 -0
  5. package/dist/angular/ds-navigation-tab-group.js +42 -0
  6. package/dist/angular/ds-select-toggle.d.ts +15 -0
  7. package/dist/angular/ds-select-toggle.js +42 -0
  8. package/dist/angular/ds-table.d.ts +1 -1
  9. package/dist/angular/ds-table.js +3 -3
  10. package/dist/angular/index.d.ts +1 -1
  11. package/dist/angular/index.js +2 -0
  12. package/dist/angular/proxies.d.ts +2 -0
  13. package/dist/angular/proxies.js +2 -0
  14. package/dist/components/ds-agent-activity.js +1 -1
  15. package/dist/components/ds-agent-questionnaire.js +1 -1
  16. package/dist/components/ds-agent-response.js +1 -1
  17. package/dist/components/ds-agent-source-list.js +1 -1
  18. package/dist/components/ds-agent-tool-call.js +1 -1
  19. package/dist/components/ds-attachment-list.js +1 -1
  20. package/dist/components/ds-avatar.js +1 -1
  21. package/dist/components/ds-avatar.js.map +1 -1
  22. package/dist/components/ds-badge.js +1 -1
  23. package/dist/components/ds-banner.js +1 -1
  24. package/dist/components/ds-bar-action.js +1 -1
  25. package/dist/components/ds-bar-action.js.map +1 -1
  26. package/dist/components/ds-bar-nav.js +1 -1
  27. package/dist/components/ds-bar-page-title.js +1 -1
  28. package/dist/components/ds-bar-title.js +1 -1
  29. package/dist/components/ds-bar-workflow.js +1 -1
  30. package/dist/components/ds-bar-workflow.js.map +1 -1
  31. package/dist/components/ds-breadcrumb.js +1 -1
  32. package/dist/components/ds-button-filled.js +1 -1
  33. package/dist/components/ds-button-inverted.js +1 -1
  34. package/dist/components/ds-button-unfilled.js +1 -1
  35. package/dist/components/ds-calendar.js +1 -1
  36. package/dist/components/ds-card-action-center.js +1 -1
  37. package/dist/components/ds-card-chart.js +1 -1
  38. package/dist/components/ds-card-navigation.js +1 -1
  39. package/dist/components/ds-card-overview.js +1 -1
  40. package/dist/components/ds-card-setting.js +1 -1
  41. package/dist/components/ds-card-settings-scope.js +1 -1
  42. package/dist/components/ds-chart-legend.js +1 -1
  43. package/dist/components/ds-chart.js +1 -1
  44. package/dist/components/ds-checkbox-group.js +1 -1
  45. package/dist/components/ds-checkbox.js +1 -1
  46. package/dist/components/ds-chip.js +1 -1
  47. package/dist/components/ds-code-block.js +1 -1
  48. package/dist/components/ds-conversation-list-item.js +1 -1
  49. package/dist/components/ds-conversation-list-item.js.map +1 -1
  50. package/dist/components/ds-conversation-list-section.js +1 -1
  51. package/dist/components/ds-conversation-list.js +1 -1
  52. package/dist/components/ds-data-customize.js +1 -1
  53. package/dist/components/ds-data-filter.js +1 -1
  54. package/dist/components/ds-data-group.js +1 -1
  55. package/dist/components/ds-data-preferences.js +1 -1
  56. package/dist/components/ds-data-preferences.js.map +1 -1
  57. package/dist/components/ds-data-saved-views.js +1 -1
  58. package/dist/components/ds-data-search.js +1 -1
  59. package/dist/components/ds-data-search.js.map +1 -1
  60. package/dist/components/ds-data-sort.js +1 -1
  61. package/dist/components/ds-data-toolbar.js +1 -1
  62. package/dist/components/ds-empty-state.js +1 -1
  63. package/dist/components/ds-field.js +1 -1
  64. package/dist/components/ds-filter-menu.js +1 -1
  65. package/dist/components/ds-icon.js +1 -1
  66. package/dist/components/ds-inline-banner-settings.js +1 -1
  67. package/dist/components/ds-input-date.js +1 -1
  68. package/dist/components/ds-input-time.js +1 -1
  69. package/dist/components/ds-input.js +1 -1
  70. package/dist/components/ds-map-cluster-marker.js +1 -1
  71. package/dist/components/ds-map-entity-marker.js +1 -1
  72. package/dist/components/ds-markdown.js +1 -1
  73. package/dist/components/ds-menu.js +1 -1
  74. package/dist/components/ds-message-actions.js +1 -1
  75. package/dist/components/ds-message-composer.js +1 -1
  76. package/dist/components/ds-message-scroller.js +1 -1
  77. package/dist/components/ds-message.js +1 -1
  78. package/dist/components/ds-mobile-bar-nav.js +1 -1
  79. package/dist/components/ds-mobile-header.js +1 -1
  80. package/dist/components/ds-mobile-section-switcher.js +1 -1
  81. package/dist/components/ds-mobile-sheet-nav.js +1 -1
  82. package/dist/components/ds-modal.js +1 -1
  83. package/dist/components/ds-navigation-tab-group.d.ts +11 -0
  84. package/dist/components/ds-navigation-tab-group.js +2 -0
  85. package/dist/components/ds-navigation-tab-group.js.map +1 -0
  86. package/dist/components/ds-pagination.js +1 -1
  87. package/dist/components/ds-panel-nav.js +1 -1
  88. package/dist/components/ds-panel-sub-nav.js +1 -1
  89. package/dist/components/ds-panel-tool-header.js +1 -1
  90. package/dist/components/ds-panel-tool-search.js +1 -1
  91. package/dist/components/ds-panel-tool-search.js.map +1 -1
  92. package/dist/components/ds-panel-tools.js +1 -1
  93. package/dist/components/ds-paper-texture.js +1 -1
  94. package/dist/components/ds-radio-tile.js +1 -1
  95. package/dist/components/ds-radio.js +1 -1
  96. package/dist/components/ds-score.js +1 -1
  97. package/dist/components/ds-select-toggle.d.ts +11 -0
  98. package/dist/components/ds-select-toggle.js +2 -0
  99. package/dist/components/ds-select-toggle.js.map +1 -0
  100. package/dist/components/ds-select.js +1 -1
  101. package/dist/components/ds-setting-row-checkbox.js +1 -1
  102. package/dist/components/ds-setting-row-radio.js +1 -1
  103. package/dist/components/ds-setting-row-radio.js.map +1 -1
  104. package/dist/components/ds-setting-row-toggle.js +1 -1
  105. package/dist/components/ds-shell-app.js +1 -1
  106. package/dist/components/ds-shell-app.js.map +1 -1
  107. package/dist/components/ds-shell-page.js +1 -1
  108. package/dist/components/ds-shell-tools.js +1 -1
  109. package/dist/components/ds-skeleton.js +1 -1
  110. package/dist/components/ds-slider.js +1 -1
  111. package/dist/components/ds-slider.js.map +1 -1
  112. package/dist/components/ds-swatch-picker.js +1 -1
  113. package/dist/components/ds-switch.js +1 -1
  114. package/dist/components/ds-tab-group.js +1 -1
  115. package/dist/components/ds-table.js +1 -1
  116. package/dist/components/ds-table.js.map +1 -1
  117. package/dist/components/ds-tag.js +1 -1
  118. package/dist/components/ds-text.js +1 -1
  119. package/dist/components/ds-textarea.js +1 -1
  120. package/dist/components/ds-time-picker.js +1 -1
  121. package/dist/components/ds-toast.js +1 -1
  122. package/dist/components/ds-tooltip-chart.js +1 -1
  123. package/dist/components/ds-tooltip.js +1 -1
  124. package/dist/components/ds-typing-indicator.js +1 -1
  125. package/dist/components/{p--pJyciTI.js → p--_bPiNCd.js} +2 -2
  126. package/dist/components/{p-UJMEz8_O.js → p-3SCy1PHa.js} +2 -2
  127. package/dist/components/{p-kwS-vkau.js → p-5aZVNYQz.js} +2 -2
  128. package/dist/components/{p-BVxK8ce0.js → p-B1dnisok.js} +2 -2
  129. package/dist/components/{p-BZY40-pE.js → p-B7EfrM6C.js} +2 -2
  130. package/dist/components/{p-DObhRLBa.js → p-B9ZhRwE3.js} +2 -2
  131. package/dist/components/{p-Dr5rkAhe.js → p-BAcdqJaa.js} +2 -2
  132. package/dist/components/{p-DbW8S5qe.js → p-BJf49edB.js} +2 -2
  133. package/dist/components/{p-S1Ct3FJV.js → p-BNN9KkXe.js} +2 -2
  134. package/dist/components/{p-7MwoWtTJ.js → p-BREDkBUv.js} +2 -2
  135. package/dist/components/p-BREDkBUv.js.map +1 -0
  136. package/dist/components/{p-pPtjNRqC.js → p-BVsVUnAw.js} +2 -2
  137. package/dist/components/p-BVsVUnAw.js.map +1 -0
  138. package/dist/components/{p-CwdRaJER.js → p-BWJb2rih.js} +2 -2
  139. package/dist/components/{p-d76Ry5nh.js → p-BWnL2SWn.js} +2 -2
  140. package/dist/components/{p-D8OWhnID.js → p-BbvAWFJA.js} +2 -2
  141. package/dist/components/p-BcmJBzB6.js +2 -0
  142. package/dist/components/{p-5-gQbIIz.js.map → p-BcmJBzB6.js.map} +1 -1
  143. package/dist/components/p-BjD1eFx6.js +2 -0
  144. package/dist/components/{p-DYtVsnDS.js.map → p-BjD1eFx6.js.map} +1 -1
  145. package/dist/components/{p-DKGW3gRa.js → p-Bjm-Rk_x.js} +2 -2
  146. package/dist/components/{p-CSxwWcwW.js → p-Bls48_RF.js} +2 -2
  147. package/dist/components/{p-OJ5WeR05.js → p-BqZWKYsS.js} +2 -2
  148. package/dist/components/p-C2e7BkNn.js +2 -0
  149. package/dist/components/p-C2e7BkNn.js.map +1 -0
  150. package/dist/components/p-C4YUkrr0.js +2 -0
  151. package/dist/components/{p-CUYLGe5d.js.map → p-C4YUkrr0.js.map} +1 -1
  152. package/dist/components/{p-BnuNaXR2.js → p-C4t7HnfZ.js} +2 -2
  153. package/dist/components/p-C62g3d5y.js +2 -0
  154. package/dist/components/{p-DdFeWC-e.js.map → p-C62g3d5y.js.map} +1 -1
  155. package/dist/components/p-C6EXrs1S.js +2 -0
  156. package/dist/components/{p-B3o9zn3Y.js.map → p-C6EXrs1S.js.map} +1 -1
  157. package/dist/components/{p-C1ZfBbJ_.js → p-C7_awFtr.js} +2 -2
  158. package/dist/components/p-CCoJ7CBB.js +2 -0
  159. package/dist/components/{p-BNarCFJZ.js.map → p-CCoJ7CBB.js.map} +1 -1
  160. package/dist/components/p-CG4vPDhg.js +2 -0
  161. package/dist/components/{p-BR9Pjp15.js.map → p-CG4vPDhg.js.map} +1 -1
  162. package/dist/components/{p-CElsKlxj.js → p-CJSIvfpo.js} +2 -2
  163. package/dist/components/{p-CElsKlxj.js.map → p-CJSIvfpo.js.map} +1 -1
  164. package/dist/components/p-CJuc20pQ.js +2 -0
  165. package/dist/components/p-CJuc20pQ.js.map +1 -0
  166. package/dist/components/{p-DVsGfz7J.js → p-CWAeg9jl.js} +2 -2
  167. package/dist/components/p-CWc6Blcp.js +2 -0
  168. package/dist/components/{p-B95UP66y.js.map → p-CWc6Blcp.js.map} +1 -1
  169. package/dist/components/{p-BmIllmq2.js → p-CantpOo3.js} +2 -2
  170. package/dist/components/p-D-TeAVxE.js +2 -0
  171. package/dist/components/{p-DcxY_pdJ.js.map → p-D-TeAVxE.js.map} +1 -1
  172. package/dist/components/{p-YC7UM4jH.js → p-D1tmszmN.js} +2 -2
  173. package/dist/components/p-D3JCih82.js +2 -0
  174. package/dist/components/{p-wXKIVUTn.js.map → p-D3JCih82.js.map} +1 -1
  175. package/dist/components/p-DHpcv_Os.js +2 -0
  176. package/dist/components/{p-xMBaOeKa.js.map → p-DHpcv_Os.js.map} +1 -1
  177. package/dist/components/p-DWXpMWIp.js +2 -0
  178. package/dist/components/{p-DP07JCed.js.map → p-DWXpMWIp.js.map} +1 -1
  179. package/dist/components/{p-C6kUn-vb.js → p-DagrkX2v.js} +2 -2
  180. package/dist/components/{p-CaFXrn_8.js → p-DcMbWqTd.js} +2 -2
  181. package/dist/components/{p-B-pkoIX9.js → p-DiyL2sI5.js} +2 -2
  182. package/dist/components/p-Dkh_40bl.js +2 -0
  183. package/dist/components/p-Dkh_40bl.js.map +1 -0
  184. package/dist/components/{p-DXL5D30P.js → p-Du8LT8JS.js} +2 -2
  185. package/dist/components/p-Dvw7N7TH.js +2 -0
  186. package/dist/components/{p-CgQB8Ct5.js.map → p-Dvw7N7TH.js.map} +1 -1
  187. package/dist/components/{p-DfMTDFcE.js → p-IfsszNF0.js} +2 -2
  188. package/dist/components/{p-CbCN9ew9.js → p-QGtBlTMt.js} +2 -2
  189. package/dist/components/p-QU4czL2k.js +2 -0
  190. package/dist/components/p-QU4czL2k.js.map +1 -0
  191. package/dist/components/{p-leZFu-cd.js → p-SXaH5TeC.js} +2 -2
  192. package/dist/components/{p-leZFu-cd.js.map → p-SXaH5TeC.js.map} +1 -1
  193. package/dist/components/p-Tf6odBOV.js +2 -0
  194. package/dist/components/{p-DYGllrVT.js.map → p-Tf6odBOV.js.map} +1 -1
  195. package/dist/components/p-UWU23pbX.js +2 -0
  196. package/dist/components/{p-KA8srEed.js.map → p-UWU23pbX.js.map} +1 -1
  197. package/dist/components/p-YFjXYN8s.js +2 -0
  198. package/dist/components/{p-Ouk6FCxc.js.map → p-YFjXYN8s.js.map} +1 -1
  199. package/dist/components/{p-B9y6azEw.js → p-eKnJNQtL.js} +2 -2
  200. package/dist/components/p-kL4EOsx5.js +2 -0
  201. package/dist/components/p-kL4EOsx5.js.map +1 -0
  202. package/dist/components/{p-DSmDyI2o.js → p-n_OBbh94.js} +2 -2
  203. package/dist/components/{p-CIMyD_6H.js → p-topqlGsI.js} +2 -2
  204. package/dist/components/{p-HfZ1gI2q.js → p-zopMP2ze.js} +2 -2
  205. package/dist/components/{p-HfZ1gI2q.js.map → p-zopMP2ze.js.map} +1 -1
  206. package/dist/docs/components.json +683 -7
  207. package/dist/lib/shell/index.js.map +2 -2
  208. package/dist/lib/shell/shell-responsive.d.ts +2 -0
  209. package/dist/lint/index.js +1 -1
  210. package/dist/mcp-data/registry/data-preferences.json +1 -1
  211. package/dist/mcp-data/registry/data-sort.json +1 -1
  212. package/dist/mcp-data/registry/navigation-tab-group.json +279 -0
  213. package/dist/mcp-data/registry/registry.json +333 -4
  214. package/dist/mcp-data/registry/select-toggle.json +351 -0
  215. package/dist/mcp-data/registry/shell-app.json +2 -1
  216. package/dist/mcp-data/registry/slider.json +6 -5
  217. package/dist/mcp-data/registry/switch.json +2 -2
  218. package/dist/mcp-data/registry/tab-group.json +14 -8
  219. package/dist/mcp-data/registry/table.json +22 -3
  220. package/dist/react/components.d.ts +2 -0
  221. package/dist/react/components.js +2 -0
  222. package/dist/react/ds-navigation-tab-group.d.ts +12 -0
  223. package/dist/react/ds-navigation-tab-group.js +12 -0
  224. package/dist/react/ds-select-toggle.d.ts +12 -0
  225. package/dist/react/ds-select-toggle.js +12 -0
  226. package/dist/styles/table.css +8 -0
  227. package/dist/types/components/NavigationTabGroup/NavigationTabGroup.d.ts +16 -0
  228. package/dist/types/components/SelectToggle/SelectToggle.d.ts +46 -0
  229. package/dist/types/components/ShellApp/ShellApp.d.ts +1 -0
  230. package/dist/types/components/Slider/Slider.d.ts +1 -1
  231. package/dist/types/components/TabGroup/TabGroup.d.ts +2 -2
  232. package/dist/types/components/Table/Table.d.ts +3 -0
  233. package/dist/types/components.d.ts +237 -15
  234. package/dist/types/shell/shell-responsive.d.ts +2 -0
  235. package/dist/vue/components.d.ts +2 -0
  236. package/dist/vue/components.js +2 -0
  237. package/dist/vue/ds-navigation-tab-group.d.ts +3 -0
  238. package/dist/vue/ds-navigation-tab-group.js +16 -0
  239. package/dist/vue/ds-select-toggle.d.ts +3 -0
  240. package/dist/vue/ds-select-toggle.js +19 -0
  241. package/dist/vue/ds-table.js +1 -0
  242. package/package.json +1 -1
  243. package/dist/components/p-5-gQbIIz.js +0 -2
  244. package/dist/components/p-7MwoWtTJ.js.map +0 -1
  245. package/dist/components/p-B3o9zn3Y.js +0 -2
  246. package/dist/components/p-B95UP66y.js +0 -2
  247. package/dist/components/p-BNarCFJZ.js +0 -2
  248. package/dist/components/p-BR9Pjp15.js +0 -2
  249. package/dist/components/p-Bf-BphXP.js +0 -2
  250. package/dist/components/p-Bf-BphXP.js.map +0 -1
  251. package/dist/components/p-BqipGGua.js +0 -2
  252. package/dist/components/p-BqipGGua.js.map +0 -1
  253. package/dist/components/p-CUYLGe5d.js +0 -2
  254. package/dist/components/p-CgGcgMjs.js +0 -2
  255. package/dist/components/p-CgGcgMjs.js.map +0 -1
  256. package/dist/components/p-CgQB8Ct5.js +0 -2
  257. package/dist/components/p-DP07JCed.js +0 -2
  258. package/dist/components/p-DYGllrVT.js +0 -2
  259. package/dist/components/p-DYtVsnDS.js +0 -2
  260. package/dist/components/p-DcxY_pdJ.js +0 -2
  261. package/dist/components/p-DdFeWC-e.js +0 -2
  262. package/dist/components/p-DlCLfwP4.js +0 -2
  263. package/dist/components/p-DlCLfwP4.js.map +0 -1
  264. package/dist/components/p-KA8srEed.js +0 -2
  265. package/dist/components/p-Ouk6FCxc.js +0 -2
  266. package/dist/components/p-pPtjNRqC.js.map +0 -1
  267. package/dist/components/p-wXKIVUTn.js +0 -2
  268. package/dist/components/p-xMBaOeKa.js +0 -2
  269. /package/dist/components/{p--pJyciTI.js.map → p--_bPiNCd.js.map} +0 -0
  270. /package/dist/components/{p-UJMEz8_O.js.map → p-3SCy1PHa.js.map} +0 -0
  271. /package/dist/components/{p-kwS-vkau.js.map → p-5aZVNYQz.js.map} +0 -0
  272. /package/dist/components/{p-BVxK8ce0.js.map → p-B1dnisok.js.map} +0 -0
  273. /package/dist/components/{p-BZY40-pE.js.map → p-B7EfrM6C.js.map} +0 -0
  274. /package/dist/components/{p-DObhRLBa.js.map → p-B9ZhRwE3.js.map} +0 -0
  275. /package/dist/components/{p-Dr5rkAhe.js.map → p-BAcdqJaa.js.map} +0 -0
  276. /package/dist/components/{p-DbW8S5qe.js.map → p-BJf49edB.js.map} +0 -0
  277. /package/dist/components/{p-S1Ct3FJV.js.map → p-BNN9KkXe.js.map} +0 -0
  278. /package/dist/components/{p-CwdRaJER.js.map → p-BWJb2rih.js.map} +0 -0
  279. /package/dist/components/{p-d76Ry5nh.js.map → p-BWnL2SWn.js.map} +0 -0
  280. /package/dist/components/{p-D8OWhnID.js.map → p-BbvAWFJA.js.map} +0 -0
  281. /package/dist/components/{p-DKGW3gRa.js.map → p-Bjm-Rk_x.js.map} +0 -0
  282. /package/dist/components/{p-CSxwWcwW.js.map → p-Bls48_RF.js.map} +0 -0
  283. /package/dist/components/{p-OJ5WeR05.js.map → p-BqZWKYsS.js.map} +0 -0
  284. /package/dist/components/{p-BnuNaXR2.js.map → p-C4t7HnfZ.js.map} +0 -0
  285. /package/dist/components/{p-C1ZfBbJ_.js.map → p-C7_awFtr.js.map} +0 -0
  286. /package/dist/components/{p-DVsGfz7J.js.map → p-CWAeg9jl.js.map} +0 -0
  287. /package/dist/components/{p-BmIllmq2.js.map → p-CantpOo3.js.map} +0 -0
  288. /package/dist/components/{p-YC7UM4jH.js.map → p-D1tmszmN.js.map} +0 -0
  289. /package/dist/components/{p-C6kUn-vb.js.map → p-DagrkX2v.js.map} +0 -0
  290. /package/dist/components/{p-CaFXrn_8.js.map → p-DcMbWqTd.js.map} +0 -0
  291. /package/dist/components/{p-B-pkoIX9.js.map → p-DiyL2sI5.js.map} +0 -0
  292. /package/dist/components/{p-DXL5D30P.js.map → p-Du8LT8JS.js.map} +0 -0
  293. /package/dist/components/{p-DfMTDFcE.js.map → p-IfsszNF0.js.map} +0 -0
  294. /package/dist/components/{p-CbCN9ew9.js.map → p-QGtBlTMt.js.map} +0 -0
  295. /package/dist/components/{p-B9y6azEw.js.map → p-eKnJNQtL.js.map} +0 -0
  296. /package/dist/components/{p-DSmDyI2o.js.map → p-n_OBbh94.js.map} +0 -0
  297. /package/dist/components/{p-CIMyD_6H.js.map → p-topqlGsI.js.map} +0 -0
@@ -0,0 +1,351 @@
1
+ {
2
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
+ "name": "select-toggle",
4
+ "title": "SelectToggle",
5
+ "description": "Compact cycling choice control with a vertical position indicator.",
6
+ "type": "registry:ui",
7
+ "meta": {
8
+ "library": "@ds-mo/ui",
9
+ "distribution": "npm",
10
+ "storybook": "https://zainadeel.github.io/compomo/?path=/story/select-toggle",
11
+ "source": "src/wc/components/SelectToggle/SelectToggle.tsx",
12
+ "intentStatus": "complete",
13
+ "intent": {
14
+ "audience": "general",
15
+ "status": "experimental",
16
+ "summary": "Compact cycling choice control with a vertical position indicator.",
17
+ "useWhen": [
18
+ "Two or three local view modes should cycle through one compact button without opening a popup.",
19
+ "The current choice should update its label and/or icon while a small vertical dot indicator shows its position."
20
+ ],
21
+ "avoidWhen": [
22
+ "The full choice set must remain visible at once; use TabGroup instead.",
23
+ "The user must inspect or search more than three options; use Select instead.",
24
+ "The value must participate in native form submission; this initial component is a local cycling control, not a form-associated select."
25
+ ],
26
+ "alternatives": [
27
+ {
28
+ "when": "Every choice should be visible and individually selectable.",
29
+ "component": "component:ds-tab-group",
30
+ "reason": "TabGroup exposes all choices and owns segmented keyboard selection."
31
+ },
32
+ {
33
+ "when": "The option list exceeds three choices or needs a dropdown.",
34
+ "component": "component:ds-select",
35
+ "reason": "Select provides a popup and the complete form-select contract."
36
+ }
37
+ ],
38
+ "commonlyComposedWith": [
39
+ "component:ds-text",
40
+ "component:ds-icon"
41
+ ],
42
+ "accessibility": [
43
+ "A single native button owns focus and activation by pointer, Enter, or Space; the dots are decorative and hidden from assistive technology.",
44
+ "Each option supplies a nonempty label, including icon-only choices. The button name announces the current label, position, and next choice; aria-label adds stable context.",
45
+ "An inactive button is natively disabled. Do not use aria-pressed because this is a multi-choice cycle, not a binary toggle."
46
+ ],
47
+ "states": [
48
+ "The application supplies exactly two or three uniquely valued options and may set value; invalid values resolve to the first choice without emitting a user-change event.",
49
+ "Activation advances to the next choice, wraps after the last, updates the mutable value, and emits dsChange once with the next value.",
50
+ "Variant selects label, icon, or icon-label content; the trailing slot scales with control density and displays the same number of vertical dots as choices.",
51
+ "Both treatments use transparent unfilled chrome; hasBorder removes only the inset stroke while preserving control geometry."
52
+ ],
53
+ "responsiveBehavior": [
54
+ "Hug follows the current content; fill uses the parent width and truncates a long label without moving the trailing indicator.",
55
+ "When collapseLabel is enabled in a table caption or data toolbar narrower than 900px, icon-label choices display only the icon while preserving the changing accessible name. Explicit icon and label variants are unchanged.",
56
+ "Small, medium, and large use shared control-density heights and matching dot-slot geometry."
57
+ ],
58
+ "frameworkCaveats": {
59
+ "customElements": [
60
+ "Assign options as a JavaScript property and listen for dsChange to observe user cycling."
61
+ ],
62
+ "react": [
63
+ "Pass options as an array and handle onDsChange to observe user cycling."
64
+ ],
65
+ "vue": [
66
+ "Bind options as an array and handle dsChange to update application state."
67
+ ],
68
+ "angular": [
69
+ "Bind options as an array and handle dsChange to update application state."
70
+ ]
71
+ },
72
+ "references": [
73
+ {
74
+ "label": "Storybook examples",
75
+ "path": "src/wc/components/SelectToggle/SelectToggle.stories.ts"
76
+ },
77
+ {
78
+ "label": "Rendered behavior and geometry",
79
+ "path": "tests/e2e/select-toggle.spec.ts"
80
+ }
81
+ ],
82
+ "styling": {
83
+ "rationale": "The component owns one density-sized unfilled button, changing choice content, and a fixed trailing position indicator; applications own surrounding layout and the choice data.",
84
+ "protected": [
85
+ {
86
+ "properties": [
87
+ "height",
88
+ "padding",
89
+ "gap",
90
+ "border-radius",
91
+ "background",
92
+ "border",
93
+ "color"
94
+ ],
95
+ "reason": "Control density and the indicator slot stay aligned across the supported variants.",
96
+ "props": [
97
+ "size",
98
+ "variant",
99
+ "width",
100
+ "hasBorder"
101
+ ]
102
+ }
103
+ ],
104
+ "customProperties": []
105
+ }
106
+ },
107
+ "api": {
108
+ "props": {
109
+ "ariaLabel": {
110
+ "type": "string | null",
111
+ "resolvedType": "null | string",
112
+ "attribute": "aria-label",
113
+ "default": "null",
114
+ "required": false,
115
+ "mutable": false,
116
+ "description": "Optional stable context prepended to the changing accessible choice name."
117
+ },
118
+ "collapseLabel": {
119
+ "type": "boolean",
120
+ "resolvedType": "boolean",
121
+ "attribute": "collapse-label",
122
+ "default": "false",
123
+ "required": false,
124
+ "mutable": false,
125
+ "description": "Collapse an icon-label choice to its icon in a narrow table caption or data toolbar."
126
+ },
127
+ "hasBorder": {
128
+ "type": "boolean",
129
+ "resolvedType": "boolean",
130
+ "attribute": "has-border",
131
+ "default": "true",
132
+ "required": false,
133
+ "mutable": false,
134
+ "description": "Show an inset border; both treatments keep the transparent unfilled surface."
135
+ },
136
+ "isInactive": {
137
+ "type": "boolean",
138
+ "resolvedType": "boolean",
139
+ "attribute": "is-inactive",
140
+ "default": "false",
141
+ "required": false,
142
+ "mutable": false,
143
+ "description": "Prevent interaction."
144
+ },
145
+ "options": {
146
+ "type": "SelectToggleOption[]",
147
+ "resolvedType": "SelectToggleOption[]",
148
+ "default": "[]",
149
+ "required": false,
150
+ "mutable": false,
151
+ "description": "Exactly two or three choices, each with a unique value and accessible label."
152
+ },
153
+ "size": {
154
+ "type": "SelectToggleSize",
155
+ "resolvedType": "\"lg\" | \"md\" | \"sm\"",
156
+ "attribute": "size",
157
+ "default": "'md'",
158
+ "required": false,
159
+ "mutable": false,
160
+ "description": "Control density: small, medium, or large; the trailing indicator scales with it."
161
+ },
162
+ "value": {
163
+ "type": "string",
164
+ "resolvedType": "string",
165
+ "attribute": "value",
166
+ "default": "''",
167
+ "required": false,
168
+ "mutable": true,
169
+ "description": "Current choice. User activation updates this value and emits dsChange."
170
+ },
171
+ "variant": {
172
+ "type": "SelectToggleVariant",
173
+ "resolvedType": "\"icon\" | \"icon-label\" | \"label\"",
174
+ "attribute": "variant",
175
+ "default": "'label'",
176
+ "required": false,
177
+ "mutable": false,
178
+ "description": "Show the current label, icon, or both. Icon variants require an icon on each choice."
179
+ },
180
+ "width": {
181
+ "type": "ControlWidth",
182
+ "resolvedType": "\"fill\" | \"hug\"",
183
+ "attribute": "width",
184
+ "default": "'hug'",
185
+ "required": false,
186
+ "mutable": false,
187
+ "description": "Hug the content or fill the parent."
188
+ }
189
+ },
190
+ "events": [
191
+ {
192
+ "name": "dsChange",
193
+ "detail": "string",
194
+ "bubbles": true,
195
+ "cancelable": true,
196
+ "composed": true
197
+ }
198
+ ],
199
+ "methods": [],
200
+ "slots": []
201
+ },
202
+ "props": {
203
+ "ariaLabel": {
204
+ "type": "string | null",
205
+ "resolvedType": "null | string",
206
+ "attribute": "aria-label",
207
+ "default": "null",
208
+ "required": false,
209
+ "mutable": false,
210
+ "description": "Optional stable context prepended to the changing accessible choice name."
211
+ },
212
+ "collapseLabel": {
213
+ "type": "boolean",
214
+ "resolvedType": "boolean",
215
+ "attribute": "collapse-label",
216
+ "default": "false",
217
+ "required": false,
218
+ "mutable": false,
219
+ "description": "Collapse an icon-label choice to its icon in a narrow table caption or data toolbar."
220
+ },
221
+ "hasBorder": {
222
+ "type": "boolean",
223
+ "resolvedType": "boolean",
224
+ "attribute": "has-border",
225
+ "default": "true",
226
+ "required": false,
227
+ "mutable": false,
228
+ "description": "Show an inset border; both treatments keep the transparent unfilled surface."
229
+ },
230
+ "isInactive": {
231
+ "type": "boolean",
232
+ "resolvedType": "boolean",
233
+ "attribute": "is-inactive",
234
+ "default": "false",
235
+ "required": false,
236
+ "mutable": false,
237
+ "description": "Prevent interaction."
238
+ },
239
+ "options": {
240
+ "type": "SelectToggleOption[]",
241
+ "resolvedType": "SelectToggleOption[]",
242
+ "default": "[]",
243
+ "required": false,
244
+ "mutable": false,
245
+ "description": "Exactly two or three choices, each with a unique value and accessible label."
246
+ },
247
+ "size": {
248
+ "type": "SelectToggleSize",
249
+ "resolvedType": "\"lg\" | \"md\" | \"sm\"",
250
+ "attribute": "size",
251
+ "default": "'md'",
252
+ "required": false,
253
+ "mutable": false,
254
+ "description": "Control density: small, medium, or large; the trailing indicator scales with it."
255
+ },
256
+ "value": {
257
+ "type": "string",
258
+ "resolvedType": "string",
259
+ "attribute": "value",
260
+ "default": "''",
261
+ "required": false,
262
+ "mutable": true,
263
+ "description": "Current choice. User activation updates this value and emits dsChange."
264
+ },
265
+ "variant": {
266
+ "type": "SelectToggleVariant",
267
+ "resolvedType": "\"icon\" | \"icon-label\" | \"label\"",
268
+ "attribute": "variant",
269
+ "default": "'label'",
270
+ "required": false,
271
+ "mutable": false,
272
+ "description": "Show the current label, icon, or both. Icon variants require an icon on each choice."
273
+ },
274
+ "width": {
275
+ "type": "ControlWidth",
276
+ "resolvedType": "\"fill\" | \"hug\"",
277
+ "attribute": "width",
278
+ "default": "'hug'",
279
+ "required": false,
280
+ "mutable": false,
281
+ "description": "Hug the content or fill the parent."
282
+ }
283
+ },
284
+ "events": [
285
+ {
286
+ "name": "dsChange",
287
+ "detail": "string",
288
+ "bubbles": true,
289
+ "cancelable": true,
290
+ "composed": true
291
+ }
292
+ ],
293
+ "methods": [],
294
+ "slots": [],
295
+ "exports": {
296
+ "customElement": "ds-select-toggle",
297
+ "react": "DsSelectToggle",
298
+ "vue": "DsSelectToggle",
299
+ "angular": "DsSelectToggle"
300
+ },
301
+ "consumption": {
302
+ "install": "npm install @ds-mo/ui @ds-mo/tokens @ds-mo/icons",
303
+ "cssSetup": "import '@ds-mo/tokens';\nimport '@ds-mo/tokens/reset';\nimport '@ds-mo/tokens/globals';",
304
+ "customElements": {
305
+ "import": "import '@ds-mo/ui/dist/components/ds-select-toggle.js';",
306
+ "example": "<ds-select-toggle></ds-select-toggle>"
307
+ },
308
+ "react": {
309
+ "import": "import { DsSelectToggle } from '@ds-mo/ui/react';",
310
+ "example": "<DsSelectToggle />"
311
+ },
312
+ "vue": {
313
+ "import": "import { DsSelectToggle } from '@ds-mo/ui/vue';",
314
+ "example": "<DsSelectToggle />"
315
+ },
316
+ "angular": {
317
+ "import": "import { DsSelectToggle } from '@ds-mo/ui/angular/ds-select-toggle';",
318
+ "example": "<ds-select-toggle></ds-select-toggle>"
319
+ },
320
+ "complexPropertyNote": "Assign these non-primitive values as JavaScript properties: options.",
321
+ "peerDependencies": {
322
+ "required": [
323
+ "@ds-mo/tokens ^6.7.0",
324
+ "@ds-mo/icons ^8.1.1"
325
+ ],
326
+ "frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
327
+ }
328
+ }
329
+ },
330
+ "dependencies": [
331
+ "@ds-mo/ui",
332
+ "@ds-mo/tokens",
333
+ "@ds-mo/icons"
334
+ ],
335
+ "registryDependencies": [
336
+ "icon",
337
+ "text"
338
+ ],
339
+ "files": [
340
+ {
341
+ "path": "src/wc/components/SelectToggle/SelectToggle.css",
342
+ "content": "@import '../../utils/radius.css';\n@import '../../utils/control-density.css';\n@import '../../utils/control-parts.css';\n@import '../../utils/control-width.css';\n@import '../../utils/focus-ring.css';\n@import '../../utils/interaction-fill.css';\n@import '../../utils/control-inactive.css';\n\n:host {\n display: inline-flex;\n min-inline-size: 0;\n --_select-toggle-dot-position: var(--dimension-size-050);\n --_select-toggle-dot-idle: var(--dimension-space-025);\n --_select-toggle-dot-active: var(--_select-toggle-dot-idle);\n --_select-toggle-dot-gap: var(--dimension-space-012);\n}\n\n:host(.ds-control--sm) {\n --_select-toggle-dot-position: calc(var(--dimension-size-050) * 3 / 4);\n --_select-toggle-dot-idle: var(--dimension-space-012);\n}\n\n:host(.ds-control--lg) {\n --_select-toggle-dot-position: calc(var(--dimension-size-050) * 5 / 4);\n --_select-toggle-dot-idle: calc(var(--dimension-size-050) * 3 / 4);\n --_select-toggle-dot-gap: var(--dimension-space-025);\n}\n\n:host(.ds-control-width--fill) {\n display: flex;\n width: 100%;\n}\n\n.trigger {\n appearance: none;\n min-inline-size: 0;\n max-inline-size: 100%;\n justify-content: space-between;\n background: var(--color-background-transparent);\n border: 0;\n color: var(--color-foreground-secondary);\n font-family: inherit;\n -webkit-user-select: none;\n user-select: none;\n}\n\n.trigger--bordered {\n --ds-interaction-border-width: var(--dimension-stroke-width-012);\n --ds-interaction-border-color: var(--color-border-tertiary);\n}\n\n:host(.ds-control-width--fill) .trigger {\n width: 100%;\n}\n\n.trigger__content {\n display: inline-flex;\n align-items: center;\n flex: 1 1 auto;\n gap: var(--ds-control-gap);\n min-width: 0;\n overflow: hidden;\n}\n\n.trigger__label {\n min-width: 0;\n overflow: hidden;\n text-align: left;\n}\n\n.trigger__indicator {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n flex: 0 0 calc(var(--ds-control-icon) - var(--dimension-size-100));\n width: calc(var(--ds-control-icon) - var(--dimension-size-100));\n height: var(--ds-control-icon);\n gap: var(--_select-toggle-dot-gap);\n}\n\n.trigger__dot-position {\n display: grid;\n place-items: center;\n flex: 0 0 var(--_select-toggle-dot-position);\n width: var(--_select-toggle-dot-position);\n height: var(--_select-toggle-dot-position);\n}\n\n.trigger__dot {\n width: var(--_select-toggle-dot-idle);\n height: var(--_select-toggle-dot-idle);\n border-radius: var(--dimension-radius-half);\n background: var(--color-foreground-quaternary);\n}\n\n.trigger__dot--active {\n width: var(--_select-toggle-dot-active);\n height: var(--_select-toggle-dot-active);\n background: var(--color-foreground-secondary);\n}\n\n@media (forced-colors: active) {\n .trigger {\n outline: var(--dimension-stroke-width-012) solid var(--ds-forced-color-control-boundary);\n outline-offset: calc(-1 * var(--dimension-stroke-width-012));\n }\n\n .trigger__dot {\n background: var(--ds-forced-color-content);\n }\n\n .trigger__dot--active {\n background: var(--ds-forced-color-selected);\n }\n}\n",
343
+ "type": "registry:ui"
344
+ },
345
+ {
346
+ "path": "src/wc/components/SelectToggle/SelectToggle.tsx",
347
+ "content": "import {\n Component,\n Element,\n Event,\n EventEmitter,\n h,\n Host,\n Prop,\n State,\n Watch,\n} from '@stencil/core';\nimport { controlWidthClass, CONTROL_TEXT_VARIANT, type ControlWidth } from '../../utils';\nimport { observeTableCaptionCompact } from '../../utils/table-caption-compact';\n\nexport interface SelectToggleOption {\n value: string;\n label: string;\n icon?: string;\n}\n\nexport type SelectToggleVariant = 'label' | 'icon' | 'icon-label';\nexport type SelectToggleSize = 'sm' | 'md' | 'lg';\n\n@Component({ tag: 'ds-select-toggle', styleUrl: 'SelectToggle.css', scoped: true })\nexport class SelectToggle {\n @Element() el!: HTMLElement;\n\n /** Exactly two or three choices, each with a unique value and accessible label. */\n @Prop() options: SelectToggleOption[] = [];\n\n /** Current choice. User activation updates this value and emits dsChange. */\n @Prop({ mutable: true }) value: string = '';\n\n /** Show the current label, icon, or both. Icon variants require an icon on each choice. */\n @Prop() variant: SelectToggleVariant = 'label';\n\n /** Collapse an icon-label choice to its icon in a narrow table caption or data toolbar. */\n @Prop({ reflect: true }) collapseLabel: boolean = false;\n\n /** Control density: small, medium, or large; the trailing indicator scales with it. */\n @Prop() size: SelectToggleSize = 'md';\n\n /** Hug the content or fill the parent. */\n @Prop() width: ControlWidth = 'hug';\n\n /** Show an inset border; both treatments keep the transparent unfilled surface. */\n @Prop() hasBorder: boolean = true;\n\n /** Prevent interaction. */\n @Prop() isInactive: boolean = false;\n\n /** Optional stable context prepended to the changing accessible choice name. */\n @Prop({ attribute: 'aria-label' }) ariaLabel: string | null = null;\n\n @Event() dsChange!: EventEmitter<string>;\n\n @State() private captionCompact = false;\n\n private captionCompactDisconnect: (() => void) | undefined;\n private hasLoaded = false;\n\n componentWillLoad() {\n this.reconcileValue();\n }\n\n componentDidLoad(): void {\n this.hasLoaded = true;\n this.syncCaptionCompactObserver();\n }\n\n connectedCallback(): void {\n if (this.hasLoaded) this.syncCaptionCompactObserver();\n }\n\n disconnectedCallback(): void {\n this.disconnectCaptionCompactObserver();\n }\n\n @Watch('collapseLabel')\n onCollapseLabelChange(): void {\n this.syncCaptionCompactObserver();\n }\n\n @Watch('options')\n @Watch('value')\n reconcileValue() {\n const choices = this.validOptions;\n if (choices.length && !choices.some(option => option.value === this.value)) {\n this.value = choices[0].value;\n }\n }\n\n private get validOptions(): SelectToggleOption[] {\n if (this.options.length < 2 || this.options.length > 3) return [];\n if (\n this.options.some(option => !option.value || !option.label) ||\n new Set(this.options.map(option => option.value)).size !== this.options.length\n ) {\n return [];\n }\n return this.options;\n }\n\n private advance = () => {\n const choices = this.validOptions;\n if (this.isInactive || !choices.length) return;\n const current = Math.max(\n 0,\n choices.findIndex(option => option.value === this.value)\n );\n const next = choices[(current + 1) % choices.length];\n this.value = next.value;\n this.dsChange.emit(next.value);\n };\n\n private syncCaptionCompactObserver(): void {\n this.disconnectCaptionCompactObserver();\n if (!this.collapseLabel) {\n if (this.captionCompact) this.captionCompact = false;\n return;\n }\n this.captionCompactDisconnect = observeTableCaptionCompact(this.el, compact => {\n if (this.captionCompact !== compact) this.captionCompact = compact;\n });\n }\n\n private disconnectCaptionCompactObserver(): void {\n this.captionCompactDisconnect?.();\n this.captionCompactDisconnect = undefined;\n }\n\n render() {\n const choices = this.validOptions;\n const activeIndex = Math.max(\n 0,\n choices.findIndex(option => option.value === this.value)\n );\n const active = choices[activeIndex];\n const next = choices[(activeIndex + 1) % choices.length];\n const showIcon = this.variant !== 'label';\n const showLabel =\n this.variant !== 'icon' &&\n !(this.collapseLabel && this.captionCompact && this.variant === 'icon-label' && active?.icon);\n const accessibleName = active\n ? `${this.ariaLabel ? `${this.ariaLabel}: ` : ''}${active.label}, ${activeIndex + 1} of ${choices.length}. Next: ${next.label}`\n : undefined;\n\n return (\n <Host\n class={{\n [`ds-control--${this.size}`]: true,\n ...controlWidthClass(this.width),\n }}\n >\n {active && (\n <button\n type=\"button\"\n class={{\n trigger: true,\n 'ds-control-frame': true,\n 'ds-focus-ring-inset': true,\n 'ds-interaction-fill': true,\n 'ds-control-inactive': this.isInactive,\n 'trigger--bordered': this.hasBorder,\n }}\n aria-label={accessibleName}\n disabled={this.isInactive}\n onClick={this.advance}\n >\n <span class=\"trigger__content ds-interaction-fill__content\">\n {showIcon && active.icon && (\n <span class=\"trigger__icon ds-control-icon-box\" aria-hidden=\"true\">\n <ds-icon name={active.icon} size={this.size} color=\"inherit\" />\n </span>\n )}\n {showLabel && (\n <ds-text\n class=\"trigger__label ds-control-label-box\"\n as=\"span\"\n variant={CONTROL_TEXT_VARIANT[this.size]}\n color=\"inherit\"\n lineTruncation={1}\n >\n {active.label}\n </ds-text>\n )}\n </span>\n <span class=\"trigger__indicator ds-interaction-fill__content\" aria-hidden=\"true\">\n {choices.map((option, index) => (\n <span key={option.value} class=\"trigger__dot-position\">\n <span\n class={{\n trigger__dot: true,\n 'trigger__dot--active': index === activeIndex,\n }}\n />\n </span>\n ))}\n </span>\n </button>\n )}\n </Host>\n );\n }\n}\n",
348
+ "type": "registry:ui"
349
+ }
350
+ ]
351
+ }