@ds-mo/ui 12.9.0 → 13.0.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 (430) hide show
  1. package/README.md +1 -0
  2. package/dist/.package-ready.json +1 -0
  3. package/dist/agent-patterns.json +124 -135
  4. package/dist/agent.json +249 -1108
  5. package/dist/angular/ds-bar-nav.d.ts +1 -1
  6. package/dist/angular/ds-bar-nav.js +3 -3
  7. package/dist/angular/ds-button-filled.d.ts +1 -1
  8. package/dist/angular/ds-button-filled.js +3 -3
  9. package/dist/angular/ds-card-data-viz.d.ts +18 -0
  10. package/dist/angular/{ds-card-data-viz-donut.js → ds-card-data-viz.js} +12 -12
  11. package/dist/angular/ds-card-overview.d.ts +1 -1
  12. package/dist/angular/ds-card-overview.js +3 -3
  13. package/dist/angular/ds-chart-bar.d.ts +1 -1
  14. package/dist/angular/ds-chart-bar.js +3 -3
  15. package/dist/angular/ds-menu.d.ts +1 -7
  16. package/dist/angular/ds-menu.js +2 -5
  17. package/dist/angular/ds-mobile-header.d.ts +1 -1
  18. package/dist/angular/ds-mobile-header.js +3 -3
  19. package/dist/angular/ds-mobile-section-switcher.d.ts +1 -1
  20. package/dist/angular/ds-mobile-section-switcher.js +3 -3
  21. package/dist/angular/ds-panel-tools.d.ts +1 -1
  22. package/dist/angular/ds-panel-tools.js +3 -3
  23. package/dist/angular/ds-select.d.ts +5 -4
  24. package/dist/angular/ds-select.js +3 -3
  25. package/dist/angular/ds-shell-app.d.ts +90 -1
  26. package/dist/angular/ds-shell-app.js +44 -4
  27. package/dist/angular/ds-shell-tools.d.ts +1 -1
  28. package/dist/angular/ds-shell-tools.js +3 -3
  29. package/dist/angular/index.d.ts +1 -1
  30. package/dist/angular/index.js +1 -8
  31. package/dist/angular/proxies.d.ts +1 -8
  32. package/dist/angular/proxies.js +1 -8
  33. package/dist/components/ds-agent-activity.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-bar-nav.js +1 -1
  40. package/dist/components/ds-bar-nav.js.map +1 -1
  41. package/dist/components/ds-bar-title.js +1 -1
  42. package/dist/components/ds-bar-title.js.map +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-select-multi.d.ts → ds-card-data-viz.d.ts} +4 -4
  48. package/dist/components/ds-card-data-viz.js +2 -0
  49. package/dist/components/ds-card-data-viz.js.map +1 -0
  50. package/dist/components/ds-card-overview.js +1 -1
  51. package/dist/components/ds-card-overview.js.map +1 -1
  52. package/dist/components/ds-card-setting.js +1 -1
  53. package/dist/components/ds-chart-bar.js +1 -1
  54. package/dist/components/ds-chart-bar.js.map +1 -1
  55. package/dist/components/ds-chart-donut.js +1 -1
  56. package/dist/components/ds-chart-legend.js +1 -1
  57. package/dist/components/ds-chart-legend.js.map +1 -1
  58. package/dist/components/ds-chart-line.js +1 -1
  59. package/dist/components/ds-chart-line.js.map +1 -1
  60. package/dist/components/ds-checkbox.js +1 -1
  61. package/dist/components/ds-chip.js +1 -1
  62. package/dist/components/ds-code-block.js +1 -1
  63. package/dist/components/ds-conversation-list-item.js +1 -1
  64. package/dist/components/ds-conversation-list-item.js.map +1 -1
  65. package/dist/components/ds-conversation-list-section.js +1 -1
  66. package/dist/components/ds-conversation-list.js +1 -1
  67. package/dist/components/ds-divider.js +1 -1
  68. package/dist/components/ds-empty-state.js +1 -1
  69. package/dist/components/ds-field.js +1 -1
  70. package/dist/components/ds-input.js +1 -1
  71. package/dist/components/ds-input.js.map +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-bubble.js +1 -1
  75. package/dist/components/ds-message-composer.js +1 -1
  76. package/dist/components/ds-message-composer.js.map +1 -1
  77. package/dist/components/ds-message-scroller.js +1 -1
  78. package/dist/components/ds-message.js +1 -1
  79. package/dist/components/ds-mobile-bar-nav.js +1 -1
  80. package/dist/components/ds-mobile-bar-nav.js.map +1 -1
  81. package/dist/components/ds-mobile-header.js +1 -1
  82. package/dist/components/ds-mobile-section-switcher.js +1 -1
  83. package/dist/components/ds-mobile-sheet-nav.js +1 -1
  84. package/dist/components/ds-mobile-sheet-nav.js.map +1 -1
  85. package/dist/components/ds-modal.js +1 -1
  86. package/dist/components/ds-panel-nav.js +1 -1
  87. package/dist/components/ds-panel-nav.js.map +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-tools.js +1 -1
  92. package/dist/components/ds-radio.js +1 -1
  93. package/dist/components/ds-radio.js.map +1 -1
  94. package/dist/components/ds-scroll-overlay.js +1 -1
  95. package/dist/components/ds-select.js +1 -1
  96. package/dist/components/ds-select.js.map +1 -1
  97. package/dist/components/ds-shell-app.js +1 -1
  98. package/dist/components/ds-shell-app.js.map +1 -1
  99. package/dist/components/ds-shell-page.js +1 -1
  100. package/dist/components/ds-shell-page.js.map +1 -1
  101. package/dist/components/ds-shell-tools.js +1 -1
  102. package/dist/components/ds-shell-tools.js.map +1 -1
  103. package/dist/components/ds-skeleton.js +1 -1
  104. package/dist/components/ds-slider.js +1 -1
  105. package/dist/components/ds-slider.js.map +1 -1
  106. package/dist/components/ds-swatch-picker.js +1 -1
  107. package/dist/components/ds-switch.js +1 -1
  108. package/dist/components/ds-tab-group.js +1 -1
  109. package/dist/components/ds-tag.js +1 -1
  110. package/dist/components/ds-text.js +1 -1
  111. package/dist/components/ds-toast.js +1 -1
  112. package/dist/components/ds-tooltip-data-viz.js +1 -1
  113. package/dist/components/ds-tooltip.js +1 -1
  114. package/dist/components/ds-typing-indicator.js +1 -1
  115. package/dist/components/{p-CgEYdMee.js → p-6qXDqCj_.js} +2 -2
  116. package/dist/components/{p-Cr3tEx7o.js → p-Ay1AX7Ql.js} +2 -2
  117. package/dist/components/p-B-qDb_Zo.js +2 -0
  118. package/dist/components/p-B-qDb_Zo.js.map +1 -0
  119. package/dist/components/{p-BOCfICln.js → p-B1cbQ0SG.js} +2 -2
  120. package/dist/components/{p-BKOlvCGS.js → p-BUZXuod2.js} +2 -2
  121. package/dist/components/{p-DCvA3Dc9.js → p-BaUsq_VK.js} +2 -2
  122. package/dist/components/p-BbMJTilO.js +2 -0
  123. package/dist/components/p-BbMJTilO.js.map +1 -0
  124. package/dist/components/{p-BO5aqZcf.js → p-BcTYhmku.js} +2 -2
  125. package/dist/components/p-Bkv3UjZz.js +2 -0
  126. package/dist/components/p-Bkv3UjZz.js.map +1 -0
  127. package/dist/components/p-BnQXAbif.js +2 -0
  128. package/dist/components/p-BnQXAbif.js.map +1 -0
  129. package/dist/components/p-BnbbnuVC.js +2 -0
  130. package/dist/components/p-BnbbnuVC.js.map +1 -0
  131. package/dist/components/{p-BDKtu6Wb.js → p-BroVnDzE.js} +2 -2
  132. package/dist/components/{p-CIiBpjCn.js → p-BsoqsbBh.js} +2 -2
  133. package/dist/components/p-BwT6B5Fi.js +2 -0
  134. package/dist/components/p-BwT6B5Fi.js.map +1 -0
  135. package/dist/components/p-BybqPD8K.js +2 -0
  136. package/dist/components/p-BybqPD8K.js.map +1 -0
  137. package/dist/components/p-C-vRkDyn.js +2 -0
  138. package/dist/components/p-C-vRkDyn.js.map +1 -0
  139. package/dist/components/p-C3ArcO50.js +2 -0
  140. package/dist/components/p-C3ArcO50.js.map +1 -0
  141. package/dist/components/p-C4uYvyq6.js +2 -0
  142. package/dist/components/p-C4uYvyq6.js.map +1 -0
  143. package/dist/components/{p-C8HU4W8q.js → p-CBazaRlE.js} +2 -2
  144. package/dist/components/{p-BhV5e6vF.js → p-CHuh71-U.js} +2 -2
  145. package/dist/components/{p-CChcuL04.js → p-CMWata9g.js} +2 -2
  146. package/dist/components/p-CS6CHlHK.js +2 -0
  147. package/dist/components/p-CS6CHlHK.js.map +1 -0
  148. package/dist/components/p-CTTnM7cE.js +2 -0
  149. package/dist/components/p-CTTnM7cE.js.map +1 -0
  150. package/dist/components/{p-CCzG5xDD.js → p-CWoXKe_h.js} +2 -2
  151. package/dist/components/p-CWoXKe_h.js.map +1 -0
  152. package/dist/components/p-CwwuSGER.js +2 -0
  153. package/dist/components/p-CwwuSGER.js.map +1 -0
  154. package/dist/components/p-D09HINr_.js +2 -0
  155. package/dist/components/p-D09HINr_.js.map +1 -0
  156. package/dist/components/p-D2xWcVv6.js +2 -0
  157. package/dist/components/p-D2xWcVv6.js.map +1 -0
  158. package/dist/components/p-DAW6G8Sl.js +2 -0
  159. package/dist/components/p-DAW6G8Sl.js.map +1 -0
  160. package/dist/components/p-DEaszb15.js +2 -0
  161. package/dist/components/p-DEaszb15.js.map +1 -0
  162. package/dist/components/{p-BgGP65Nn.js → p-DOUk4KoT.js} +1 -1
  163. package/dist/components/p-DOUk4KoT.js.map +1 -0
  164. package/dist/components/p-DbQr7Kwr.js +2 -0
  165. package/dist/components/p-DbQr7Kwr.js.map +1 -0
  166. package/dist/components/p-DdvEZyX4.js +2 -0
  167. package/dist/components/p-DdvEZyX4.js.map +1 -0
  168. package/dist/components/{p-DRnIuCiT.js → p-DeQwkbT1.js} +2 -2
  169. package/dist/components/{p-Cuih680v.js → p-Df17mJqI.js} +2 -2
  170. package/dist/components/p-Dg1LBXJ2.js +2 -0
  171. package/dist/components/p-Dg1LBXJ2.js.map +1 -0
  172. package/dist/components/p-DsiCDzoF.js +2 -0
  173. package/dist/components/p-DsiCDzoF.js.map +1 -0
  174. package/dist/components/p-_DzUXA86.js +2 -0
  175. package/dist/components/p-_DzUXA86.js.map +1 -0
  176. package/dist/components/p-lyZNvRvO.js +2 -0
  177. package/dist/components/p-lyZNvRvO.js.map +1 -0
  178. package/dist/components/{p-YR1XeuZf.js → p-ohsLFap_.js} +2 -2
  179. package/dist/components/{p-DjbTFy2B.js → p-ymtdhOU5.js} +1 -1
  180. package/dist/components/p-ymtdhOU5.js.map +1 -0
  181. package/dist/components/p-z5RIrXuX.js +2 -0
  182. package/dist/components/p-z5RIrXuX.js.map +1 -0
  183. package/dist/docs/components.json +929 -2371
  184. package/dist/framework/angular.d.ts +0 -1
  185. package/dist/framework/angular.js +0 -1
  186. package/dist/lib/components/BarTitle/bar-title-types.d.ts +28 -0
  187. package/dist/lib/components/Breadcrumb/breadcrumb-types.d.ts +16 -0
  188. package/dist/lib/components/ButtonFilled/ButtonFilled.d.ts +83 -0
  189. package/dist/lib/components/MobileHeader/mobile-header-types.d.ts +4 -0
  190. package/dist/lib/components/PanelTools/panel-tools-types.d.ts +21 -7
  191. package/dist/lib/components/ShellApp/shell-app-types.d.ts +91 -0
  192. package/dist/lib/shell/index.d.ts +5 -13
  193. package/dist/lib/shell/index.js +87 -358
  194. package/dist/lib/shell/index.js.map +3 -3
  195. package/dist/lib/shell/shell-responsive.d.ts +2 -1
  196. package/dist/lib/utils/button-render.d.ts +17 -0
  197. package/dist/lib/utils/button-types.d.ts +10 -0
  198. package/dist/lib/utils/choice-list.d.ts +25 -0
  199. package/dist/lib/utils/control-press.d.ts +8 -0
  200. package/dist/lib/utils/form-association.d.ts +22 -0
  201. package/dist/lib/utils/index.d.ts +4 -0
  202. package/dist/lib/utils/index.js +63 -0
  203. package/dist/lib/utils/index.js.map +3 -3
  204. package/dist/lib/utils/required-validity.d.ts +1 -1
  205. package/dist/lib/utils/safe-url.d.ts +11 -0
  206. package/dist/mcp/cli.js +38 -10
  207. package/dist/mcp-data/registry/agent-source-list.json +1 -1
  208. package/dist/mcp-data/registry/attachment-list.json +1 -1
  209. package/dist/mcp-data/registry/bar-nav.json +3 -21
  210. package/dist/mcp-data/registry/breadcrumb.json +1 -1
  211. package/dist/mcp-data/registry/button-filled.json +4 -19
  212. package/dist/mcp-data/registry/button-unfilled.json +14 -11
  213. package/dist/mcp-data/registry/card-data-viz.json +241 -0
  214. package/dist/mcp-data/registry/card-overview.json +38 -10
  215. package/dist/mcp-data/registry/card-setting.json +2 -2
  216. package/dist/mcp-data/registry/chart-bar.json +66 -18
  217. package/dist/mcp-data/registry/chart-donut.json +5 -5
  218. package/dist/mcp-data/registry/chart-legend.json +7 -9
  219. package/dist/mcp-data/registry/chart-line.json +1 -2
  220. package/dist/mcp-data/registry/checkbox.json +2 -2
  221. package/dist/mcp-data/registry/conversation-list-item.json +1 -1
  222. package/dist/mcp-data/registry/field.json +2 -3
  223. package/dist/mcp-data/registry/input.json +1 -1
  224. package/dist/mcp-data/registry/markdown.json +1 -1
  225. package/dist/mcp-data/registry/menu.json +10 -21
  226. package/dist/mcp-data/registry/mobile-bar-nav.json +1 -1
  227. package/dist/mcp-data/registry/mobile-header.json +1 -37
  228. package/dist/mcp-data/registry/mobile-section-switcher.json +1 -19
  229. package/dist/mcp-data/registry/panel-nav.json +2 -2
  230. package/dist/mcp-data/registry/panel-tool-search.json +1 -1
  231. package/dist/mcp-data/registry/panel-tools.json +19 -55
  232. package/dist/mcp-data/registry/radio.json +1 -1
  233. package/dist/mcp-data/registry/registry.json +294 -1174
  234. package/dist/mcp-data/registry/select.json +59 -25
  235. package/dist/mcp-data/registry/shell-app.json +345 -20
  236. package/dist/mcp-data/registry/shell-page.json +1 -1
  237. package/dist/mcp-data/registry/shell-tools.json +12 -43
  238. package/dist/mcp-data/registry/slider.json +1 -1
  239. package/dist/mcp-data/registry/switch.json +1 -1
  240. package/dist/react/components.d.ts +1 -8
  241. package/dist/react/components.js +1 -8
  242. package/dist/react/ds-card-data-viz.d.ts +12 -0
  243. package/dist/react/ds-card-data-viz.js +12 -0
  244. package/dist/react/ds-menu.d.ts +1 -2
  245. package/dist/react/ds-menu.js +0 -1
  246. package/dist/react/ds-select.d.ts +2 -2
  247. package/dist/react/ds-shell-app.d.ts +24 -1
  248. package/dist/react/ds-shell-app.js +16 -1
  249. package/dist/types/components/AgentSourceList/AgentSourceList.d.ts +0 -1
  250. package/dist/types/components/BarNav/BarNav.d.ts +0 -2
  251. package/dist/types/components/BarNav/bar-nav-utils.d.ts +2 -4
  252. package/dist/types/components/ButtonFilled/ButtonFilled.d.ts +5 -11
  253. package/dist/types/components/ButtonUnfilled/ButtonUnfilled.d.ts +13 -10
  254. package/dist/types/components/CardDataViz/CardDataViz.d.ts +32 -0
  255. package/dist/types/components/CardDataViz/index.d.ts +2 -0
  256. package/dist/types/components/CardOverview/CardOverview.d.ts +17 -0
  257. package/dist/types/components/CardOverview/card-overview-controller.d.ts +16 -0
  258. package/dist/types/components/ChartBar/ChartBar.d.ts +12 -1
  259. package/dist/types/components/ChartBar/index.d.ts +2 -1
  260. package/dist/types/components/Menu/Menu.d.ts +0 -4
  261. package/dist/types/components/Menu/menu-sections.d.ts +4 -0
  262. package/dist/types/components/Menu/menu-types.d.ts +2 -11
  263. package/dist/types/components/MobileHeader/MobileHeader.d.ts +0 -5
  264. package/dist/types/components/MobileSectionSwitcher/MobileSectionSwitcher.d.ts +0 -2
  265. package/dist/types/components/PanelTools/PanelTools.d.ts +0 -4
  266. package/dist/types/components/PanelTools/index.d.ts +1 -1
  267. package/dist/types/components/PanelTools/panel-tools-types.d.ts +21 -7
  268. package/dist/types/components/PanelTools/panel-tools-utils.d.ts +1 -1
  269. package/dist/types/components/Select/Select.d.ts +12 -4
  270. package/dist/types/components/Select/index.d.ts +1 -1
  271. package/dist/types/components/ShellApp/ShellApp.d.ts +98 -0
  272. package/dist/types/components/ShellApp/shell-app-types.d.ts +92 -0
  273. package/dist/types/components/ShellPage/ShellPage.d.ts +5 -0
  274. package/dist/types/components/ShellTools/ShellTools.d.ts +2 -2
  275. package/dist/types/components.d.ts +210 -889
  276. package/dist/types/shell/index.d.ts +5 -13
  277. package/dist/types/shell/shell-responsive.d.ts +2 -1
  278. package/dist/types/utils/button-render.d.ts +18 -0
  279. package/dist/types/utils/button-story-foundation.d.ts +9 -0
  280. package/dist/types/utils/button-types.d.ts +11 -0
  281. package/dist/types/utils/form-association.d.ts +23 -0
  282. package/dist/types/utils/index.d.ts +4 -0
  283. package/dist/types/utils/required-validity.d.ts +1 -1
  284. package/dist/types/utils/safe-url.d.ts +12 -0
  285. package/dist/types/utils/select-controller.d.ts +1 -1
  286. package/package.json +16 -8
  287. package/dist/.build-stamp +0 -1
  288. package/dist/angular/ds-card-data-viz-bar.d.ts +0 -18
  289. package/dist/angular/ds-card-data-viz-bar.js +0 -42
  290. package/dist/angular/ds-card-data-viz-donut.d.ts +0 -18
  291. package/dist/angular/ds-card-data-viz-line.d.ts +0 -18
  292. package/dist/angular/ds-card-data-viz-line.js +0 -42
  293. package/dist/angular/ds-card-shell-data-viz.d.ts +0 -12
  294. package/dist/angular/ds-card-shell-data-viz.js +0 -38
  295. package/dist/angular/ds-chart-bar-stacked.d.ts +0 -12
  296. package/dist/angular/ds-chart-bar-stacked.js +0 -38
  297. package/dist/angular/ds-select-multi.d.ts +0 -28
  298. package/dist/angular/ds-select-multi.js +0 -49
  299. package/dist/angular/ds-shell-gradient-picker.d.ts +0 -16
  300. package/dist/angular/ds-shell-gradient-picker.js +0 -42
  301. package/dist/angular/ds-shell-gradient-swatch.d.ts +0 -16
  302. package/dist/angular/ds-shell-gradient-swatch.js +0 -42
  303. package/dist/components/ds-card-data-viz-bar.d.ts +0 -11
  304. package/dist/components/ds-card-data-viz-bar.js +0 -2
  305. package/dist/components/ds-card-data-viz-bar.js.map +0 -1
  306. package/dist/components/ds-card-data-viz-donut.d.ts +0 -11
  307. package/dist/components/ds-card-data-viz-donut.js +0 -2
  308. package/dist/components/ds-card-data-viz-donut.js.map +0 -1
  309. package/dist/components/ds-card-data-viz-line.d.ts +0 -11
  310. package/dist/components/ds-card-data-viz-line.js +0 -2
  311. package/dist/components/ds-card-data-viz-line.js.map +0 -1
  312. package/dist/components/ds-card-shell-data-viz.d.ts +0 -11
  313. package/dist/components/ds-card-shell-data-viz.js +0 -2
  314. package/dist/components/ds-card-shell-data-viz.js.map +0 -1
  315. package/dist/components/ds-chart-bar-stacked.d.ts +0 -11
  316. package/dist/components/ds-chart-bar-stacked.js +0 -2
  317. package/dist/components/ds-chart-bar-stacked.js.map +0 -1
  318. package/dist/components/ds-select-multi.js +0 -2
  319. package/dist/components/ds-select-multi.js.map +0 -1
  320. package/dist/components/ds-shell-gradient-picker.d.ts +0 -11
  321. package/dist/components/ds-shell-gradient-picker.js +0 -2
  322. package/dist/components/ds-shell-gradient-picker.js.map +0 -1
  323. package/dist/components/ds-shell-gradient-swatch.d.ts +0 -11
  324. package/dist/components/ds-shell-gradient-swatch.js +0 -2
  325. package/dist/components/ds-shell-gradient-swatch.js.map +0 -1
  326. package/dist/components/p-2foAUsDN.js +0 -2
  327. package/dist/components/p-2foAUsDN.js.map +0 -1
  328. package/dist/components/p-8GK7B7K4.js +0 -2
  329. package/dist/components/p-8GK7B7K4.js.map +0 -1
  330. package/dist/components/p-B5tMlca-.js +0 -2
  331. package/dist/components/p-B5tMlca-.js.map +0 -1
  332. package/dist/components/p-B88n0pO3.js +0 -2
  333. package/dist/components/p-B88n0pO3.js.map +0 -1
  334. package/dist/components/p-BBePKRHC.js +0 -2
  335. package/dist/components/p-BBePKRHC.js.map +0 -1
  336. package/dist/components/p-BOQnc-M4.js +0 -2
  337. package/dist/components/p-BOQnc-M4.js.map +0 -1
  338. package/dist/components/p-BgGP65Nn.js.map +0 -1
  339. package/dist/components/p-BrusnEYP.js +0 -2
  340. package/dist/components/p-BrusnEYP.js.map +0 -1
  341. package/dist/components/p-C61yJkfr.js +0 -2
  342. package/dist/components/p-C61yJkfr.js.map +0 -1
  343. package/dist/components/p-CCzG5xDD.js.map +0 -1
  344. package/dist/components/p-CGVXbXv9.js +0 -2
  345. package/dist/components/p-CGVXbXv9.js.map +0 -1
  346. package/dist/components/p-CH3w-P2H.js +0 -2
  347. package/dist/components/p-CH3w-P2H.js.map +0 -1
  348. package/dist/components/p-Cuqxh-Tq.js +0 -2
  349. package/dist/components/p-Cuqxh-Tq.js.map +0 -1
  350. package/dist/components/p-D1HFMTdC.js +0 -2
  351. package/dist/components/p-D1HFMTdC.js.map +0 -1
  352. package/dist/components/p-D2x17ei-.js +0 -2
  353. package/dist/components/p-D2x17ei-.js.map +0 -1
  354. package/dist/components/p-DLZm_-sU.js +0 -2
  355. package/dist/components/p-DLZm_-sU.js.map +0 -1
  356. package/dist/components/p-DjKkSqrG.js +0 -2
  357. package/dist/components/p-DjKkSqrG.js.map +0 -1
  358. package/dist/components/p-DjbTFy2B.js.map +0 -1
  359. package/dist/components/p-DlscFn2m.js +0 -2
  360. package/dist/components/p-DlscFn2m.js.map +0 -1
  361. package/dist/components/p-DxkEC0hR.js +0 -2
  362. package/dist/components/p-DxkEC0hR.js.map +0 -1
  363. package/dist/components/p-Re2kPrXm.js +0 -2
  364. package/dist/components/p-Re2kPrXm.js.map +0 -1
  365. package/dist/components/p-XMZCaXs7.js +0 -2
  366. package/dist/components/p-XMZCaXs7.js.map +0 -1
  367. package/dist/components/p-dyUp3Adm.js +0 -2
  368. package/dist/components/p-dyUp3Adm.js.map +0 -1
  369. package/dist/components/p-nkYN0Bub.js +0 -2
  370. package/dist/components/p-nkYN0Bub.js.map +0 -1
  371. package/dist/framework/select-multi-value-accessor.d.ts +0 -9
  372. package/dist/framework/select-multi-value-accessor.js +0 -40
  373. package/dist/lib/shell/badge-gradient-ring.d.ts +0 -27
  374. package/dist/lib/shell/chrome-transition.d.ts +0 -32
  375. package/dist/lib/shell/shell-chrome-metrics.d.ts +0 -11
  376. package/dist/lib/shell/shell-gradient.d.ts +0 -41
  377. package/dist/lib/shell/shell-view-transition.d.ts +0 -23
  378. package/dist/mcp-data/registry/card-data-viz-bar.json +0 -213
  379. package/dist/mcp-data/registry/card-data-viz-donut.json +0 -214
  380. package/dist/mcp-data/registry/card-data-viz-line.json +0 -207
  381. package/dist/mcp-data/registry/card-shell-data-viz.json +0 -180
  382. package/dist/mcp-data/registry/chart-bar-stacked.json +0 -230
  383. package/dist/mcp-data/registry/select-multi.json +0 -758
  384. package/dist/mcp-data/registry/shell-gradient-picker.json +0 -195
  385. package/dist/mcp-data/registry/shell-gradient-swatch.json +0 -215
  386. package/dist/react/ds-card-data-viz-bar.d.ts +0 -12
  387. package/dist/react/ds-card-data-viz-bar.js +0 -12
  388. package/dist/react/ds-card-data-viz-donut.d.ts +0 -12
  389. package/dist/react/ds-card-data-viz-donut.js +0 -12
  390. package/dist/react/ds-card-data-viz-line.d.ts +0 -12
  391. package/dist/react/ds-card-data-viz-line.js +0 -12
  392. package/dist/react/ds-card-shell-data-viz.d.ts +0 -9
  393. package/dist/react/ds-card-shell-data-viz.js +0 -12
  394. package/dist/react/ds-chart-bar-stacked.d.ts +0 -9
  395. package/dist/react/ds-chart-bar-stacked.js +0 -12
  396. package/dist/react/ds-select-multi.d.ts +0 -14
  397. package/dist/react/ds-select-multi.js +0 -16
  398. package/dist/react/ds-shell-gradient-picker.d.ts +0 -12
  399. package/dist/react/ds-shell-gradient-picker.js +0 -12
  400. package/dist/react/ds-shell-gradient-swatch.d.ts +0 -12
  401. package/dist/react/ds-shell-gradient-swatch.js +0 -12
  402. package/dist/types/components/CardDataVizBar/CardDataVizBar.d.ts +0 -24
  403. package/dist/types/components/CardDataVizBar/index.d.ts +0 -2
  404. package/dist/types/components/CardDataVizDonut/CardDataVizDonut.d.ts +0 -28
  405. package/dist/types/components/CardDataVizDonut/index.d.ts +0 -2
  406. package/dist/types/components/CardDataVizLine/CardDataVizLine.d.ts +0 -24
  407. package/dist/types/components/CardDataVizLine/index.d.ts +0 -2
  408. package/dist/types/components/CardShellDataViz/CardShellDataViz.d.ts +0 -13
  409. package/dist/types/components/CardShellDataViz/index.d.ts +0 -2
  410. package/dist/types/components/ChartBarStacked/ChartBarStacked.d.ts +0 -26
  411. package/dist/types/components/ChartBarStacked/index.d.ts +0 -3
  412. package/dist/types/components/SelectMulti/SelectMulti.d.ts +0 -121
  413. package/dist/types/components/SelectMulti/index.d.ts +0 -2
  414. package/dist/types/components/ShellGradientPicker/ShellGradientPicker.d.ts +0 -12
  415. package/dist/types/components/ShellGradientSwatch/ShellGradientSwatch.d.ts +0 -15
  416. package/dist/types/components/ShellGradientSwatch/shell-gradient-swatch-types.d.ts +0 -4
  417. /package/dist/components/{p-CgEYdMee.js.map → p-6qXDqCj_.js.map} +0 -0
  418. /package/dist/components/{p-Cr3tEx7o.js.map → p-Ay1AX7Ql.js.map} +0 -0
  419. /package/dist/components/{p-BOCfICln.js.map → p-B1cbQ0SG.js.map} +0 -0
  420. /package/dist/components/{p-BKOlvCGS.js.map → p-BUZXuod2.js.map} +0 -0
  421. /package/dist/components/{p-DCvA3Dc9.js.map → p-BaUsq_VK.js.map} +0 -0
  422. /package/dist/components/{p-BO5aqZcf.js.map → p-BcTYhmku.js.map} +0 -0
  423. /package/dist/components/{p-BDKtu6Wb.js.map → p-BroVnDzE.js.map} +0 -0
  424. /package/dist/components/{p-CIiBpjCn.js.map → p-BsoqsbBh.js.map} +0 -0
  425. /package/dist/components/{p-C8HU4W8q.js.map → p-CBazaRlE.js.map} +0 -0
  426. /package/dist/components/{p-BhV5e6vF.js.map → p-CHuh71-U.js.map} +0 -0
  427. /package/dist/components/{p-CChcuL04.js.map → p-CMWata9g.js.map} +0 -0
  428. /package/dist/components/{p-DRnIuCiT.js.map → p-DeQwkbT1.js.map} +0 -0
  429. /package/dist/components/{p-Cuih680v.js.map → p-Df17mJqI.js.map} +0 -0
  430. /package/dist/components/{p-YR1XeuZf.js.map → p-ohsLFap_.js.map} +0 -0
@@ -1,758 +0,0 @@
1
- {
2
- "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
- "name": "select-multi",
4
- "title": "SelectMulti",
5
- "description": "Form-associated multi-value select with a persistent trigger label, inline selected count, local search, rich flat options, grouped sections, loading, and clear-all behavior.",
6
- "type": "registry:ui",
7
- "meta": {
8
- "library": "@ds-mo/ui",
9
- "distribution": "npm",
10
- "storybook": "https://zainadeel.github.io/compomo/?path=/story/select-multi",
11
- "source": "src/wc/components/SelectMulti/SelectMulti.tsx",
12
- "intentStatus": "complete",
13
- "intent": {
14
- "audience": "general",
15
- "status": "stable",
16
- "summary": "Form-associated multi-value select with a persistent trigger label, inline selected count, local search, rich flat options, grouped sections, loading, and clear-all behavior.",
17
- "useWhen": [
18
- "The user may choose several independent values from one finite set.",
19
- "A compact trigger should summarize selection with the field label and a count.",
20
- "The option set benefits from local search, subtext, grouping, or disabled choices.",
21
- "The choice set has more than roughly 20 options, comes from a user-managed listing, or represents a large domain where search materially improves retrieval."
22
- ],
23
- "avoidWhen": [
24
- "Exactly one value may be selected.",
25
- "Selected values must remain individually removable as persistent tags outside the popup.",
26
- "The choices form a hierarchy with cascading parent selection.",
27
- "The customer task benefits more from keeping every choice and checkbox directly visible; choose between SelectMulti and a visible checkbox list from the use-case context rather than a fixed option-count threshold."
28
- ],
29
- "alternatives": [
30
- {
31
- "when": "Exactly one value may be selected.",
32
- "component": "component:ds-select",
33
- "reason": "Select owns scalar form value and single-select listbox behavior."
34
- },
35
- {
36
- "when": "The popup contains actions rather than values.",
37
- "component": "component:ds-menu",
38
- "reason": "Menu uses command semantics and closes according to action-menu expectations."
39
- }
40
- ],
41
- "commonlyComposedWith": [
42
- "component:ds-text",
43
- "component:ds-checkbox",
44
- "component:ds-empty-state",
45
- "component:ds-loader"
46
- ],
47
- "accessibility": [
48
- "In forms, provide a persistent visible external field label. In a compact filter bar, the trigger's visible persistent label and count may supply the accessible name.",
49
- "The popup is a listbox with aria-multiselectable and every option exposes its independent aria-selected state.",
50
- "Disabled options expose aria-disabled and are skipped by keyboard navigation and typeahead.",
51
- "Keyboard navigation keeps the aria-activedescendant option scrolled into the visible listbox viewport.",
52
- "Each row uses a presentation-only ds-checkbox indicator at the same density as the row; multi-select option rows never add a prefix icon alongside it, and the option remains the sole selection semantic and interaction target.",
53
- "The trigger keeps its field label visible and appends the current selected count; an explicit aria-label or aria-labelledby remains the authoritative accessible name when supplied.",
54
- "Use errorMessage with error so the trigger is described by the rendered alert."
55
- ],
56
- "states": [
57
- "Select and SelectMulti share popup positioning, dismissal, focus, typeahead, and listbox traversal while retaining their distinct scalar and array selection contracts.",
58
- "Every size applies one complete control-density recipe across trigger height, inline padding, icon zones, text-container inset, gap, and radius; error content follows the shared 4px field flow.",
59
- "Values is a controlled JavaScript array; dsChange emits a new array after each user toggle.",
60
- "Required SelectMulti controls begin without an automatic selection and require the user to make an explicit choice.",
61
- "Selecting an option keeps the popup open so additional values can be toggled.",
62
- "The trigger label stays left-aligned at every width; every option row uses the same leading Checkbox indicator at its density. The default control size is md in both forms and filter bars.",
63
- "The selected count always follows the persistent label as plain text separated by a centered dot, including for one selection, and counts every selected value even when search or grouping hides it. Never replace the count with selected option names.",
64
- "Create sections only for categories that are meaningful to customers, not merely to break a long list into arbitrary chunks.",
65
- "When any option supplies subtext, every row uses the same subtext structure and missing values render an em dash. Subtext should disambiguate or add decision-helpful information.",
66
- "Option labels stay on one line and truncate when constrained. Option subtext may wrap to at most two lines.",
67
- "The optional prefix icon and chevron always use the parent surface's secondary foreground color, including when selection promotes the label and count to primary.",
68
- "The shared popup search control follows the SelectMulti density, using the same text, icon, and internal spacing as a borderless trigger. Its container uses menu-item padding on every side and owns a 1px bottom divider that becomes a 1.5px bold-brand stroke while search has focus. Search placeholder text is secondary at rest and quaternary while focused because it becomes decorative once the editable field is active.",
69
- "When search contains text, the shared control shows a rounded sm icon-only ButtonUnfilled with the Cross icon and no border. It clears the local term, stays hidden for an empty term, and returns focus to search.",
70
- "The shared summary-and-clear footer mirrors the owning density: menu-item padding surrounds a borderless density row, and both texts use the same row and label insets as option text. The outer footer owns a 1px top divider.",
71
- "An empty filtered list composes the message-only body variant of EmptyState. Keep the default neutral no-results message unless localized product guidance makes the outcome clearer.",
72
- "Enable searchable for more than roughly 20 options, user-managed listings, large domains such as addresses, or sets users cannot efficiently scan. Local matching includes option labels, subtext, and section headings; the owner resolves remote data before assigning options.",
73
- "When allowClear is enabled, clear-all appears only after at least one value exists. Clearing is valid for optional and required fields; a required field becomes invalid until the user selects again.",
74
- "Clear-all emits an empty dsChange and dsClear while preserving useful popup or search focus.",
75
- "Loading keeps the trigger visible, marks the control busy, and makes selection interaction temporarily unavailable without presenting the control as inactive.",
76
- "SelectMulti has no maximum-selection behavior; every available non-inactive option may be selected.",
77
- "Validation timing belongs to the form owner and may be immediate or deferred until blur or submit; the component exposes validity and error presentation without imposing that policy.",
78
- "The error trigger uses a 1.5px bold-negative inset stroke so invalid state remains distinguishable from the normal 1px border without changing control geometry.",
79
- "An initially empty option set is not an expected SelectMulti use case. The no-results state describes a search with no matches, not a source with no choices.",
80
- "Native form submission emits one entry per selected value under the component name.",
81
- "Use options for a flat list or sections for grouped choices. Multi-select option contracts intentionally exclude icons because the leading checkbox owns that row zone; hierarchical parent selection is deferred."
82
- ],
83
- "responsiveBehavior": [
84
- "Use width fill for form fields and width hug for compact filter bars; the persistent trigger label avoids variable-width selected labels.",
85
- "The popup matches the trigger minimum width, may grow for content, and clamps to the viewport.",
86
- "Long option collections scroll inside the popup; virtualization and remote search are not part of this version."
87
- ],
88
- "frameworkCaveats": {
89
- "customElements": [
90
- "Assign values, options, and sections through JavaScript properties; array values cannot be represented safely as attributes."
91
- ],
92
- "react": [
93
- "Pass values, options, and sections as wrapper props and handle onDsChange, onDsClear, and onDsOpenChange."
94
- ],
95
- "angular": [
96
- "Import DsSelectMulti and SelectMultiValueAccessor when integrating with Angular Forms."
97
- ]
98
- },
99
- "references": [
100
- {
101
- "label": "Storybook examples",
102
- "path": "src/wc/components/SelectMulti/SelectMulti.stories.ts"
103
- },
104
- {
105
- "label": "Selection patterns",
106
- "path": "src/docs/SelectionPatterns.mdx"
107
- }
108
- ]
109
- },
110
- "api": {
111
- "props": {
112
- "activeFill": {
113
- "type": "boolean",
114
- "resolvedType": "boolean",
115
- "attribute": "active-fill",
116
- "default": "true",
117
- "required": false,
118
- "mutable": false,
119
- "description": "Show the selected interaction fill when at least one value exists."
120
- },
121
- "allowClear": {
122
- "type": "boolean",
123
- "resolvedType": "boolean",
124
- "attribute": "allow-clear",
125
- "default": "true",
126
- "required": false,
127
- "mutable": false,
128
- "description": "Show the clear-all footer action when values exist."
129
- },
130
- "ariaDescribedby": {
131
- "type": "string | undefined",
132
- "resolvedType": "string | undefined",
133
- "attribute": "aria-describedby",
134
- "required": false,
135
- "mutable": false,
136
- "description": "Additional IDs that describe the combobox."
137
- },
138
- "ariaLabel": {
139
- "type": "string | null",
140
- "resolvedType": "null | string",
141
- "attribute": "aria-label",
142
- "default": "null",
143
- "required": false,
144
- "mutable": false,
145
- "description": "Direct accessible name when no external label is available."
146
- },
147
- "ariaLabelledby": {
148
- "type": "string | undefined",
149
- "resolvedType": "string | undefined",
150
- "attribute": "aria-labelledby",
151
- "required": false,
152
- "mutable": false,
153
- "description": "IDs of elements that label the combobox."
154
- },
155
- "background": {
156
- "type": "SelectMultiBackground | undefined",
157
- "resolvedType": "\"always-dark\" | \"bold\" | \"faint\" | \"inverted\" | \"media\" | \"medium\" | \"strong\" | \"translucent\" | undefined",
158
- "attribute": "background",
159
- "required": false,
160
- "mutable": false,
161
- "description": "Actual parent surface context; omit on primary and secondary surfaces."
162
- },
163
- "clearLabel": {
164
- "type": "string",
165
- "resolvedType": "string",
166
- "attribute": "clear-label",
167
- "default": "'Clear'",
168
- "required": false,
169
- "mutable": false,
170
- "description": "Localized clear-all action label."
171
- },
172
- "disabled": {
173
- "type": "boolean",
174
- "resolvedType": "boolean",
175
- "attribute": "disabled",
176
- "default": "false",
177
- "required": false,
178
- "mutable": false,
179
- "description": "Native disabled state."
180
- },
181
- "error": {
182
- "type": "boolean",
183
- "resolvedType": "boolean",
184
- "attribute": "error",
185
- "default": "false",
186
- "required": false,
187
- "mutable": false,
188
- "description": "Show invalid visual state."
189
- },
190
- "errorMessage": {
191
- "type": "string | undefined",
192
- "resolvedType": "string | undefined",
193
- "attribute": "error-message",
194
- "required": false,
195
- "mutable": false,
196
- "description": "Error text rendered below the trigger when error is true."
197
- },
198
- "hasBorder": {
199
- "type": "boolean",
200
- "resolvedType": "boolean",
201
- "attribute": "has-border",
202
- "default": "true",
203
- "required": false,
204
- "mutable": false,
205
- "description": "Show the surface-aware inset border."
206
- },
207
- "icon": {
208
- "type": "string | undefined",
209
- "resolvedType": "string | undefined",
210
- "attribute": "icon",
211
- "required": false,
212
- "mutable": false,
213
- "description": "Optional trigger prefix icon name."
214
- },
215
- "inputId": {
216
- "type": "string | undefined",
217
- "resolvedType": "string | undefined",
218
- "attribute": "input-id",
219
- "required": false,
220
- "mutable": false,
221
- "description": "ID applied to the internal combobox trigger for external labels."
222
- },
223
- "isInactive": {
224
- "type": "boolean",
225
- "resolvedType": "boolean",
226
- "attribute": "is-inactive",
227
- "default": "false",
228
- "required": false,
229
- "mutable": false,
230
- "description": "Shared inactive treatment; removes interaction and form submission."
231
- },
232
- "isLoading": {
233
- "type": "boolean",
234
- "resolvedType": "boolean",
235
- "attribute": "is-loading",
236
- "default": "false",
237
- "required": false,
238
- "mutable": false,
239
- "description": "Replace the prefix with a loader and disable option interaction."
240
- },
241
- "loadingLabel": {
242
- "type": "string",
243
- "resolvedType": "string",
244
- "attribute": "loading-label",
245
- "default": "'Loading'",
246
- "required": false,
247
- "mutable": false,
248
- "description": "Accessible loading status label."
249
- },
250
- "name": {
251
- "type": "string | undefined",
252
- "resolvedType": "string | undefined",
253
- "attribute": "name",
254
- "required": false,
255
- "mutable": false,
256
- "description": "Native form field name used for each repeated selected-value entry."
257
- },
258
- "noResultsText": {
259
- "type": "string",
260
- "resolvedType": "string",
261
- "attribute": "no-results-text",
262
- "default": "'No results found'",
263
- "required": false,
264
- "mutable": false,
265
- "description": "Localized empty-filter result text."
266
- },
267
- "open": {
268
- "type": "boolean",
269
- "resolvedType": "boolean",
270
- "attribute": "open",
271
- "default": "false",
272
- "required": false,
273
- "mutable": true,
274
- "description": "Controlled popup visibility."
275
- },
276
- "options": {
277
- "type": "SelectMultiOption[]",
278
- "resolvedType": "SelectMultiOption[]",
279
- "default": "[]",
280
- "required": false,
281
- "mutable": false,
282
- "description": "Flat choices. Assign arrays through the JavaScript property."
283
- },
284
- "placeholder": {
285
- "type": "string",
286
- "resolvedType": "string",
287
- "attribute": "placeholder",
288
- "default": "'Select'",
289
- "required": false,
290
- "mutable": false,
291
- "description": "Persistent trigger label; selected option labels never replace it."
292
- },
293
- "required": {
294
- "type": "boolean",
295
- "resolvedType": "boolean",
296
- "attribute": "required",
297
- "default": "false",
298
- "required": false,
299
- "mutable": false,
300
- "description": "Require at least one valid selected value."
301
- },
302
- "requiredMessage": {
303
- "type": "string",
304
- "resolvedType": "string",
305
- "attribute": "required-message",
306
- "default": "'This field is required.'",
307
- "required": false,
308
- "mutable": false,
309
- "description": "Validation message used when required is missing."
310
- },
311
- "searchPlaceholder": {
312
- "type": "string",
313
- "resolvedType": "string",
314
- "attribute": "search-placeholder",
315
- "default": "'Search'",
316
- "required": false,
317
- "mutable": false,
318
- "description": "Localized search-field placeholder and accessible name."
319
- },
320
- "searchable": {
321
- "type": "boolean",
322
- "resolvedType": "boolean",
323
- "attribute": "searchable",
324
- "default": "false",
325
- "required": false,
326
- "mutable": false,
327
- "description": "Show immediate local filtering over option labels, subtext, and section headings."
328
- },
329
- "sections": {
330
- "type": "SelectMultiSection[]",
331
- "resolvedType": "SelectMultiSection[]",
332
- "default": "[]",
333
- "required": false,
334
- "mutable": false,
335
- "description": "Grouped choices; takes precedence over options. Assign through JavaScript."
336
- },
337
- "selectedLabel": {
338
- "type": "string",
339
- "resolvedType": "string",
340
- "attribute": "selected-label",
341
- "default": "'selected'",
342
- "required": false,
343
- "mutable": false,
344
- "description": "Localized noun displayed after the selected count."
345
- },
346
- "size": {
347
- "type": "SelectMultiSize",
348
- "resolvedType": "\"lg\" | \"md\" | \"sm\" | \"xs\"",
349
- "attribute": "size",
350
- "default": "'md'",
351
- "required": false,
352
- "mutable": false,
353
- "description": "Control density."
354
- },
355
- "values": {
356
- "type": "string[]",
357
- "resolvedType": "string[]",
358
- "default": "[]",
359
- "required": false,
360
- "mutable": true,
361
- "description": "Selected values. Assign arrays through the JavaScript property."
362
- },
363
- "width": {
364
- "type": "SelectMultiWidth",
365
- "resolvedType": "\"fill\" | \"hug\"",
366
- "attribute": "width",
367
- "default": "'hug'",
368
- "required": false,
369
- "mutable": false,
370
- "description": "Width fit — hug content (default) or fill the parent."
371
- }
372
- },
373
- "events": [
374
- {
375
- "name": "dsChange",
376
- "detail": "string[]",
377
- "bubbles": true,
378
- "cancelable": true,
379
- "composed": true,
380
- "description": "Emitted after user toggles or clearing with a new values array."
381
- },
382
- {
383
- "name": "dsClear",
384
- "detail": "void",
385
- "bubbles": true,
386
- "cancelable": true,
387
- "composed": true,
388
- "description": "Emitted after the footer clear-all action."
389
- },
390
- {
391
- "name": "dsOpenChange",
392
- "detail": "boolean",
393
- "bubbles": true,
394
- "cancelable": true,
395
- "composed": true,
396
- "description": "Emitted whenever popup visibility changes."
397
- }
398
- ],
399
- "methods": [
400
- {
401
- "name": "setFocus",
402
- "signature": "setFocus() => Promise<void>"
403
- }
404
- ],
405
- "slots": []
406
- },
407
- "props": {
408
- "activeFill": {
409
- "type": "boolean",
410
- "resolvedType": "boolean",
411
- "attribute": "active-fill",
412
- "default": "true",
413
- "required": false,
414
- "mutable": false,
415
- "description": "Show the selected interaction fill when at least one value exists."
416
- },
417
- "allowClear": {
418
- "type": "boolean",
419
- "resolvedType": "boolean",
420
- "attribute": "allow-clear",
421
- "default": "true",
422
- "required": false,
423
- "mutable": false,
424
- "description": "Show the clear-all footer action when values exist."
425
- },
426
- "ariaDescribedby": {
427
- "type": "string | undefined",
428
- "resolvedType": "string | undefined",
429
- "attribute": "aria-describedby",
430
- "required": false,
431
- "mutable": false,
432
- "description": "Additional IDs that describe the combobox."
433
- },
434
- "ariaLabel": {
435
- "type": "string | null",
436
- "resolvedType": "null | string",
437
- "attribute": "aria-label",
438
- "default": "null",
439
- "required": false,
440
- "mutable": false,
441
- "description": "Direct accessible name when no external label is available."
442
- },
443
- "ariaLabelledby": {
444
- "type": "string | undefined",
445
- "resolvedType": "string | undefined",
446
- "attribute": "aria-labelledby",
447
- "required": false,
448
- "mutable": false,
449
- "description": "IDs of elements that label the combobox."
450
- },
451
- "background": {
452
- "type": "SelectMultiBackground | undefined",
453
- "resolvedType": "\"always-dark\" | \"bold\" | \"faint\" | \"inverted\" | \"media\" | \"medium\" | \"strong\" | \"translucent\" | undefined",
454
- "attribute": "background",
455
- "required": false,
456
- "mutable": false,
457
- "description": "Actual parent surface context; omit on primary and secondary surfaces."
458
- },
459
- "clearLabel": {
460
- "type": "string",
461
- "resolvedType": "string",
462
- "attribute": "clear-label",
463
- "default": "'Clear'",
464
- "required": false,
465
- "mutable": false,
466
- "description": "Localized clear-all action label."
467
- },
468
- "disabled": {
469
- "type": "boolean",
470
- "resolvedType": "boolean",
471
- "attribute": "disabled",
472
- "default": "false",
473
- "required": false,
474
- "mutable": false,
475
- "description": "Native disabled state."
476
- },
477
- "error": {
478
- "type": "boolean",
479
- "resolvedType": "boolean",
480
- "attribute": "error",
481
- "default": "false",
482
- "required": false,
483
- "mutable": false,
484
- "description": "Show invalid visual state."
485
- },
486
- "errorMessage": {
487
- "type": "string | undefined",
488
- "resolvedType": "string | undefined",
489
- "attribute": "error-message",
490
- "required": false,
491
- "mutable": false,
492
- "description": "Error text rendered below the trigger when error is true."
493
- },
494
- "hasBorder": {
495
- "type": "boolean",
496
- "resolvedType": "boolean",
497
- "attribute": "has-border",
498
- "default": "true",
499
- "required": false,
500
- "mutable": false,
501
- "description": "Show the surface-aware inset border."
502
- },
503
- "icon": {
504
- "type": "string | undefined",
505
- "resolvedType": "string | undefined",
506
- "attribute": "icon",
507
- "required": false,
508
- "mutable": false,
509
- "description": "Optional trigger prefix icon name."
510
- },
511
- "inputId": {
512
- "type": "string | undefined",
513
- "resolvedType": "string | undefined",
514
- "attribute": "input-id",
515
- "required": false,
516
- "mutable": false,
517
- "description": "ID applied to the internal combobox trigger for external labels."
518
- },
519
- "isInactive": {
520
- "type": "boolean",
521
- "resolvedType": "boolean",
522
- "attribute": "is-inactive",
523
- "default": "false",
524
- "required": false,
525
- "mutable": false,
526
- "description": "Shared inactive treatment; removes interaction and form submission."
527
- },
528
- "isLoading": {
529
- "type": "boolean",
530
- "resolvedType": "boolean",
531
- "attribute": "is-loading",
532
- "default": "false",
533
- "required": false,
534
- "mutable": false,
535
- "description": "Replace the prefix with a loader and disable option interaction."
536
- },
537
- "loadingLabel": {
538
- "type": "string",
539
- "resolvedType": "string",
540
- "attribute": "loading-label",
541
- "default": "'Loading'",
542
- "required": false,
543
- "mutable": false,
544
- "description": "Accessible loading status label."
545
- },
546
- "name": {
547
- "type": "string | undefined",
548
- "resolvedType": "string | undefined",
549
- "attribute": "name",
550
- "required": false,
551
- "mutable": false,
552
- "description": "Native form field name used for each repeated selected-value entry."
553
- },
554
- "noResultsText": {
555
- "type": "string",
556
- "resolvedType": "string",
557
- "attribute": "no-results-text",
558
- "default": "'No results found'",
559
- "required": false,
560
- "mutable": false,
561
- "description": "Localized empty-filter result text."
562
- },
563
- "open": {
564
- "type": "boolean",
565
- "resolvedType": "boolean",
566
- "attribute": "open",
567
- "default": "false",
568
- "required": false,
569
- "mutable": true,
570
- "description": "Controlled popup visibility."
571
- },
572
- "options": {
573
- "type": "SelectMultiOption[]",
574
- "resolvedType": "SelectMultiOption[]",
575
- "default": "[]",
576
- "required": false,
577
- "mutable": false,
578
- "description": "Flat choices. Assign arrays through the JavaScript property."
579
- },
580
- "placeholder": {
581
- "type": "string",
582
- "resolvedType": "string",
583
- "attribute": "placeholder",
584
- "default": "'Select'",
585
- "required": false,
586
- "mutable": false,
587
- "description": "Persistent trigger label; selected option labels never replace it."
588
- },
589
- "required": {
590
- "type": "boolean",
591
- "resolvedType": "boolean",
592
- "attribute": "required",
593
- "default": "false",
594
- "required": false,
595
- "mutable": false,
596
- "description": "Require at least one valid selected value."
597
- },
598
- "requiredMessage": {
599
- "type": "string",
600
- "resolvedType": "string",
601
- "attribute": "required-message",
602
- "default": "'This field is required.'",
603
- "required": false,
604
- "mutable": false,
605
- "description": "Validation message used when required is missing."
606
- },
607
- "searchPlaceholder": {
608
- "type": "string",
609
- "resolvedType": "string",
610
- "attribute": "search-placeholder",
611
- "default": "'Search'",
612
- "required": false,
613
- "mutable": false,
614
- "description": "Localized search-field placeholder and accessible name."
615
- },
616
- "searchable": {
617
- "type": "boolean",
618
- "resolvedType": "boolean",
619
- "attribute": "searchable",
620
- "default": "false",
621
- "required": false,
622
- "mutable": false,
623
- "description": "Show immediate local filtering over option labels, subtext, and section headings."
624
- },
625
- "sections": {
626
- "type": "SelectMultiSection[]",
627
- "resolvedType": "SelectMultiSection[]",
628
- "default": "[]",
629
- "required": false,
630
- "mutable": false,
631
- "description": "Grouped choices; takes precedence over options. Assign through JavaScript."
632
- },
633
- "selectedLabel": {
634
- "type": "string",
635
- "resolvedType": "string",
636
- "attribute": "selected-label",
637
- "default": "'selected'",
638
- "required": false,
639
- "mutable": false,
640
- "description": "Localized noun displayed after the selected count."
641
- },
642
- "size": {
643
- "type": "SelectMultiSize",
644
- "resolvedType": "\"lg\" | \"md\" | \"sm\" | \"xs\"",
645
- "attribute": "size",
646
- "default": "'md'",
647
- "required": false,
648
- "mutable": false,
649
- "description": "Control density."
650
- },
651
- "values": {
652
- "type": "string[]",
653
- "resolvedType": "string[]",
654
- "default": "[]",
655
- "required": false,
656
- "mutable": true,
657
- "description": "Selected values. Assign arrays through the JavaScript property."
658
- },
659
- "width": {
660
- "type": "SelectMultiWidth",
661
- "resolvedType": "\"fill\" | \"hug\"",
662
- "attribute": "width",
663
- "default": "'hug'",
664
- "required": false,
665
- "mutable": false,
666
- "description": "Width fit — hug content (default) or fill the parent."
667
- }
668
- },
669
- "events": [
670
- {
671
- "name": "dsChange",
672
- "detail": "string[]",
673
- "bubbles": true,
674
- "cancelable": true,
675
- "composed": true,
676
- "description": "Emitted after user toggles or clearing with a new values array."
677
- },
678
- {
679
- "name": "dsClear",
680
- "detail": "void",
681
- "bubbles": true,
682
- "cancelable": true,
683
- "composed": true,
684
- "description": "Emitted after the footer clear-all action."
685
- },
686
- {
687
- "name": "dsOpenChange",
688
- "detail": "boolean",
689
- "bubbles": true,
690
- "cancelable": true,
691
- "composed": true,
692
- "description": "Emitted whenever popup visibility changes."
693
- }
694
- ],
695
- "methods": [
696
- {
697
- "name": "setFocus",
698
- "signature": "setFocus() => Promise<void>"
699
- }
700
- ],
701
- "slots": [],
702
- "exports": {
703
- "customElement": "ds-select-multi",
704
- "react": "DsSelectMulti",
705
- "angular": "DsSelectMulti"
706
- },
707
- "consumption": {
708
- "install": "npm install @ds-mo/ui @ds-mo/tokens @ds-mo/icons",
709
- "cssSetup": "import '@ds-mo/tokens';\nimport '@ds-mo/tokens/reset';\nimport '@ds-mo/tokens/globals';",
710
- "customElements": {
711
- "import": "import '@ds-mo/ui/dist/components/ds-select-multi.js';",
712
- "example": "<ds-select-multi></ds-select-multi>"
713
- },
714
- "react": {
715
- "import": "import { DsSelectMulti } from '@ds-mo/ui/react';",
716
- "example": "<DsSelectMulti />"
717
- },
718
- "angular": {
719
- "import": "import { DsSelectMulti } from '@ds-mo/ui/angular/ds-select-multi';",
720
- "example": "<ds-select-multi></ds-select-multi>"
721
- },
722
- "complexPropertyNote": "Assign these non-primitive values as JavaScript properties: options, sections, values.",
723
- "peerDependencies": {
724
- "required": [
725
- "@ds-mo/tokens ^5.0.0",
726
- "@ds-mo/icons ^6.4.0"
727
- ],
728
- "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
729
- }
730
- }
731
- },
732
- "dependencies": [
733
- "@ds-mo/ui",
734
- "@ds-mo/tokens",
735
- "@ds-mo/icons"
736
- ],
737
- "registryDependencies": [
738
- "button-unfilled",
739
- "checkbox",
740
- "empty-state",
741
- "icon",
742
- "loader",
743
- "text",
744
- "tooltip"
745
- ],
746
- "files": [
747
- {
748
- "path": "src/wc/components/SelectMulti/SelectMulti.css",
749
- "content": "@import '../Select/Select.css';\n",
750
- "type": "registry:ui"
751
- },
752
- {
753
- "path": "src/wc/components/SelectMulti/SelectMulti.tsx",
754
- "content": "import {\n AttachInternals,\n Component,\n Element,\n Event,\n EventEmitter,\n h,\n Host,\n Method,\n Prop,\n State,\n Watch,\n} from '@stencil/core';\nimport {\n controlWidthClass,\n CONTROL_SUPPORTING_TEXT_VARIANT,\n CONTROL_TEXT_VARIANT,\n DEFAULT_REQUIRED_MESSAGE,\n setRequiredValidity,\n type ControlWidth,\n} from '../../utils';\nimport { ChoiceFooter, ChoiceOptionRow, ChoiceSearch } from '../../utils/choice-list-parts';\nimport {\n choiceBackgroundClassMap,\n choiceListUsesSubtext,\n filterChoiceSections,\n flattenChoiceSections,\n resolveChoiceSections,\n} from '../../utils/choice-list';\nimport { SelectController } from '../../utils/select-controller';\nimport type { SelectBackground, SelectOption, SelectSection, SelectSize } from '../Select/Select';\n\nexport type SelectMultiOption = Omit<SelectOption, 'icon'>;\nexport type SelectMultiSection = Omit<SelectSection, 'options'> & {\n options: SelectMultiOption[];\n};\nexport type SelectMultiBackground = SelectBackground;\nexport type SelectMultiSize = SelectSize;\nexport type SelectMultiWidth = ControlWidth;\n\nconst ICON_SIZE: Record<SelectMultiSize, 'lg' | 'md' | 'sm' | 'xs'> = {\n lg: 'lg',\n md: 'md',\n sm: 'sm',\n xs: 'xs',\n};\n\nlet selectMultiId = 0;\n\n@Component({\n tag: 'ds-select-multi',\n styleUrl: 'SelectMulti.css',\n scoped: true,\n formAssociated: true,\n})\nexport class SelectMulti {\n @Element() el!: HTMLElement;\n @AttachInternals() internals!: ElementInternals;\n\n /** Flat choices. Assign arrays through the JavaScript property. */\n @Prop() options: SelectMultiOption[] = [];\n /** Grouped choices; takes precedence over options. Assign through JavaScript. */\n @Prop() sections: SelectMultiSection[] = [];\n /** Selected values. Assign arrays through the JavaScript property. */\n @Prop({ mutable: true }) values: string[] = [];\n /** Controlled popup visibility. */\n @Prop({ mutable: true, reflect: true }) open: boolean = false;\n /** Native form field name used for each repeated selected-value entry. */\n @Prop({ reflect: true }) name: string | undefined;\n /** Native disabled state. */\n @Prop({ reflect: true }) disabled: boolean = false;\n /** Require at least one valid selected value. */\n @Prop({ reflect: true }) required: boolean = false;\n /** Validation message used when required is missing. */\n @Prop() requiredMessage: string = DEFAULT_REQUIRED_MESSAGE;\n /** Persistent trigger label; selected option labels never replace it. */\n @Prop() placeholder: string = 'Select';\n /** Control density. */\n @Prop() size: SelectMultiSize = 'md';\n /** Width fit — hug content (default) or fill the parent. */\n @Prop() width: SelectMultiWidth = 'hug';\n /** Shared inactive treatment; removes interaction and form submission. */\n @Prop() isInactive: boolean = false;\n /** Replace the prefix with a loader and disable option interaction. */\n @Prop() isLoading: boolean = false;\n /** Show the selected interaction fill when at least one value exists. */\n @Prop() activeFill: boolean = true;\n /** Show the surface-aware inset border. */\n @Prop() hasBorder: boolean = true;\n /** Optional trigger prefix icon name. */\n @Prop() icon: string | undefined;\n /** Show the clear-all footer action when values exist. */\n @Prop() allowClear: boolean = true;\n /** Localized clear-all action label. */\n @Prop() clearLabel: string = 'Clear';\n /** Localized noun displayed after the selected count. */\n @Prop() selectedLabel: string = 'selected';\n /** Show immediate local filtering over option labels, subtext, and section headings. */\n @Prop() searchable: boolean = false;\n /** Localized search-field placeholder and accessible name. */\n @Prop() searchPlaceholder: string = 'Search';\n /** Localized empty-filter result text. */\n @Prop() noResultsText: string = 'No results found';\n /** Accessible loading status label. */\n @Prop() loadingLabel: string = 'Loading';\n /** Actual parent surface context; omit on primary and secondary surfaces. */\n @Prop() background: SelectMultiBackground | undefined;\n /** Show invalid visual state. */\n @Prop() error: boolean = false;\n /** Error text rendered below the trigger when error is true. */\n @Prop() errorMessage: string | undefined;\n /** ID applied to the internal combobox trigger for external labels. */\n @Prop() inputId: string | undefined;\n /** Direct accessible name when no external label is available. */\n @Prop({ attribute: 'aria-label' }) ariaLabel: string | null = null;\n /** IDs of elements that label the combobox. */\n @Prop({ attribute: 'aria-labelledby' }) ariaLabelledby: string | undefined;\n /** Additional IDs that describe the combobox. */\n @Prop({ attribute: 'aria-describedby' }) ariaDescribedby: string | undefined;\n\n /** Emitted after user toggles or clearing with a new values array. */\n @Event() dsChange!: EventEmitter<string[]>;\n /** Emitted after the footer clear-all action. */\n @Event() dsClear!: EventEmitter<void>;\n /** Emitted whenever popup visibility changes. */\n @Event() dsOpenChange!: EventEmitter<boolean>;\n\n @State() private activeIndex = -1;\n @State() private searchTerm = '';\n @State() private formDisabled = false;\n @State() private position = { x: 0, y: 0 };\n @State() private positionReady = false;\n @State() private focusRingVisible = false;\n\n private readonly generatedId = `ds-select-multi-${++selectMultiId}`;\n private readonly listboxId = `${this.generatedId}-listbox`;\n private readonly errorId = `${this.generatedId}-error`;\n private initialValues: string[] = [];\n private readonly controller = this.createController();\n\n private createController() {\n // eslint-disable-next-line @typescript-eslint/no-this-alias -- adapter getters preserve reactive component ownership without inheritance.\n const owner = this;\n return new SelectController<SelectMultiOption>({\n get host() {\n return owner.el;\n },\n generatedId: owner.generatedId,\n get options() {\n return owner.visibleOptions;\n },\n get searchable() {\n return owner.searchable;\n },\n get isLoading() {\n return owner.isLoading;\n },\n get isDisabled() {\n return owner.isDisabled;\n },\n get preferredIndex() {\n return -1;\n },\n get open() {\n return owner.open;\n },\n set open(value) {\n owner.open = value;\n },\n get activeIndex() {\n return owner.activeIndex;\n },\n set activeIndex(value) {\n owner.activeIndex = value;\n },\n get searchTerm() {\n return owner.searchTerm;\n },\n set searchTerm(value) {\n owner.searchTerm = value;\n },\n get focusRingVisible() {\n return owner.focusRingVisible;\n },\n set focusRingVisible(value) {\n owner.focusRingVisible = value;\n },\n get position() {\n return owner.position;\n },\n set position(value) {\n owner.position = value;\n },\n get positionReady() {\n return owner.positionReady;\n },\n set positionReady(value) {\n owner.positionReady = value;\n },\n selectOption: option => owner.toggleOption(option),\n });\n }\n\n componentWillLoad() {\n this.initialValues = [...this.values];\n this.syncFormValue();\n }\n\n componentDidLoad() {\n this.controller.connect();\n }\n\n disconnectedCallback() {\n this.controller.disconnect();\n }\n\n @Watch('values')\n @Watch('disabled')\n @Watch('isInactive')\n @Watch('required')\n @Watch('name')\n @Watch('options')\n @Watch('sections')\n syncFormValue() {\n const resolvedValues = this.resolvedValues;\n if (this.isDisabled || !this.name || resolvedValues.length === 0) {\n this.internals.setFormValue(null);\n } else {\n const data = new FormData();\n resolvedValues.forEach(value => data.append(this.name as string, value));\n this.internals.setFormValue(data, JSON.stringify(resolvedValues));\n }\n const missing = this.required && !this.isDisabled && resolvedValues.length === 0;\n setRequiredValidity(this.internals, missing, this.requiredMessage);\n this.controller.optionsChanged();\n }\n\n @Watch('isLoading')\n onLoadingChange() {\n this.controller.loadingChanged();\n }\n\n @Watch('open')\n onOpenChange(open: boolean) {\n this.dsOpenChange.emit(open);\n this.controller.openChanged(open);\n }\n\n @Watch('searchTerm')\n onSearchTermChange() {\n this.controller.searchChanged();\n }\n\n @Watch('activeIndex')\n onActiveIndexChange() {\n this.controller.activeIndexChanged();\n }\n\n formDisabledCallback(disabled: boolean) {\n this.formDisabled = disabled;\n this.syncFormValue();\n }\n\n formResetCallback() {\n this.values = [...this.initialValues];\n this.closePopup();\n }\n\n formStateRestoreCallback(state: string | File | FormData | null) {\n if (typeof state !== 'string') {\n this.values = [];\n return;\n }\n try {\n const restored = JSON.parse(state);\n this.values = Array.isArray(restored)\n ? restored.filter((value): value is string => typeof value === 'string')\n : [];\n } catch {\n this.values = [];\n }\n }\n\n @Method()\n async setFocus() {\n this.controller.setFocus();\n }\n\n private get isDisabled(): boolean {\n return this.disabled || this.isInactive || this.formDisabled;\n }\n\n private get allSections(): SelectMultiSection[] {\n return resolveChoiceSections(this.options, this.sections);\n }\n\n private get allOptions(): SelectMultiOption[] {\n return flattenChoiceSections(this.allSections);\n }\n\n private get visibleSections(): SelectMultiSection[] {\n return this.searchable\n ? filterChoiceSections(this.allSections, this.searchTerm)\n : this.allSections;\n }\n\n private get visibleOptions(): SelectMultiOption[] {\n return flattenChoiceSections(this.visibleSections);\n }\n\n private get resolvedValues(): string[] {\n const valid = new Set(this.allOptions.map(option => option.value));\n return [...new Set(this.values.filter(value => valid.has(value)))];\n }\n\n private get hasSelection(): boolean {\n return this.resolvedValues.length > 0;\n }\n\n private get activeOptionId(): string | undefined {\n return this.controller.activeOptionId;\n }\n\n private closePopup(restoreFocus = false) {\n this.controller.closePopup(restoreFocus);\n }\n\n private openPopup(focusVisible: boolean, edge?: 'first' | 'last') {\n this.controller.openPopup(focusVisible, edge);\n }\n\n private toggleOption(option: SelectMultiOption) {\n if (option.isInactive || this.isLoading) return;\n const current = this.resolvedValues;\n const next = current.includes(option.value)\n ? current.filter(value => value !== option.value)\n : [...current, option.value];\n this.values = next;\n this.dsChange.emit([...next]);\n }\n\n private clearSelection = (event: Event) => {\n event.preventDefault();\n event.stopPropagation();\n this.values = [];\n this.dsChange.emit([]);\n this.dsClear.emit();\n this.controller.focusSearchOrTrigger();\n };\n\n private readonly handleListKeyDown = this.controller.handleListKeyDown;\n private readonly handleTriggerKeyDown = this.controller.handleTriggerKeyDown;\n\n private renderOption(option: SelectMultiOption, index: number, usesSubtext: boolean) {\n const selected = this.values.includes(option.value);\n const active = this.activeIndex === index;\n return (\n <ChoiceOptionRow\n size={this.size}\n id={`${this.generatedId}-option-${index}`}\n option={option}\n selected={selected}\n active={active}\n focusRingVisible={this.focusRingVisible}\n usesSubtext={usesSubtext}\n leading={\n <span\n class=\"ds-choice-item__icon ds-control-icon-box ds-interaction-fill__content\"\n aria-hidden=\"true\"\n >\n <ds-checkbox\n class=\"select-option__checkbox\"\n label=\"\"\n size={this.size}\n checked={selected}\n presentation\n />\n </span>\n }\n onHover={() => {\n this.focusRingVisible = false;\n this.activeIndex = index;\n }}\n onSelect={() => this.toggleOption(option)}\n />\n );\n }\n\n render() {\n const inactive = this.isDisabled;\n const count = this.resolvedValues.length;\n const textVariant = CONTROL_TEXT_VARIANT[this.size];\n const iconSize = ICON_SIZE[this.size];\n const usesOptionSubtext = choiceListUsesSubtext(this.allOptions);\n const showError = this.error && Boolean(this.errorMessage);\n const describedBy =\n [this.ariaDescribedby, showError ? this.errorId : undefined].filter(Boolean).join(' ') ||\n undefined;\n const popupStyle = {\n position: 'fixed',\n left: '0',\n top: '0',\n transform: `translate(${Math.round(this.position.x)}px, ${Math.round(this.position.y)}px)`,\n zIndex: 'var(--dimension-z-index-floating)',\n visibility: this.positionReady ? 'visible' : 'hidden',\n };\n let flatIndex = 0;\n\n return (\n <Host\n class={{\n 'select-host': true,\n 'ds-field-stack': true,\n 'ds-control-inactive': inactive,\n [`ds-control--${this.size}`]: true,\n ...controlWidthClass(this.width),\n [`select-host--background-${this.background}`]: !!this.background,\n }}\n >\n <button\n ref={element => {\n this.controller.setTriggerElement((element as HTMLButtonElement) ?? null);\n }}\n id={this.inputId ?? this.generatedId}\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-interaction-fill--selected': !inactive && this.activeFill && this.hasSelection,\n 'trigger--bordered': this.hasBorder || this.error,\n 'trigger--has-value': this.hasSelection,\n 'wrapper--error': this.error,\n [`ds-control--${this.size}`]: true,\n ...choiceBackgroundClassMap(this.background),\n }}\n disabled={inactive}\n role=\"combobox\"\n aria-haspopup=\"listbox\"\n aria-expanded={String(this.open)}\n aria-controls={this.open ? this.listboxId : undefined}\n aria-activedescendant={this.open && !this.searchable ? this.activeOptionId : undefined}\n aria-label={this.ariaLabel}\n aria-labelledby={this.ariaLabelledby}\n aria-describedby={describedBy}\n aria-invalid={this.error ? 'true' : undefined}\n aria-required={this.required || undefined}\n aria-busy={this.isLoading ? 'true' : undefined}\n onClick={() => (this.open ? this.closePopup() : this.openPopup(false))}\n onKeyDown={this.handleTriggerKeyDown}\n >\n {(this.icon || this.isLoading) && (\n <span\n class=\"trigger__prefix ds-control-icon-box ds-interaction-fill__content\"\n aria-hidden=\"true\"\n >\n {this.isLoading ? (\n <ds-loader size={iconSize} color=\"inherit\" />\n ) : (\n <ds-icon name={this.icon} size={iconSize} color=\"inherit\" />\n )}\n </span>\n )}\n <ds-text\n class=\"trigger__label ds-control-label-box ds-interaction-fill__content\"\n as=\"span\"\n variant={textVariant}\n color=\"inherit\"\n lineTruncation={1}\n >\n {`${this.placeholder}${count > 0 ? ` · ${count}` : ''}`}\n </ds-text>\n <span\n class=\"trigger__chevron ds-control-icon-box ds-interaction-fill__content\"\n aria-hidden=\"true\"\n >\n <ds-icon name=\"ChevronDown\" size={iconSize} color=\"inherit\" />\n </span>\n </button>\n\n {this.open && (\n <div\n popover=\"manual\"\n ref={element => {\n this.controller.setPopupElement((element as HTMLDivElement) ?? null);\n }}\n class=\"select-popup ds-choice-popup\"\n style={popupStyle}\n >\n {this.searchable && (\n <ChoiceSearch\n size={this.size}\n value={this.searchTerm}\n placeholder={this.searchPlaceholder}\n controls={this.listboxId}\n activeDescendant={this.activeOptionId}\n inputRef={this.controller.setSearchElement}\n clearLabel={this.clearLabel}\n onValueChange={value => {\n this.searchTerm = value;\n }}\n onKeyDown={event => this.handleListKeyDown(event)}\n />\n )}\n <div\n id={this.listboxId}\n class=\"ds-choice-list\"\n role=\"listbox\"\n aria-multiselectable=\"true\"\n aria-label={this.ariaLabel ?? this.placeholder}\n aria-busy={this.isLoading ? 'true' : undefined}\n >\n {this.isLoading ? (\n <div\n class=\"ds-choice-loading\"\n role=\"option\"\n aria-selected=\"false\"\n aria-disabled=\"true\"\n aria-label={this.loadingLabel}\n aria-live=\"polite\"\n >\n <ds-loader size={this.size} color=\"inherit\" />\n </div>\n ) : this.visibleOptions.length === 0 ? (\n <div\n class=\"ds-choice-empty ds-empty-region\"\n role=\"option\"\n aria-selected=\"false\"\n aria-disabled=\"true\"\n aria-label={this.noResultsText}\n aria-live=\"polite\"\n >\n <ds-empty-state body={this.noResultsText} />\n </div>\n ) : (\n this.visibleSections.map(section => (\n <div\n class={{\n 'ds-choice-section': true,\n 'ds-chrome-column': true,\n 'ds-chrome-space--sm': true,\n 'ds-choice-section--divided': !!section.divider,\n }}\n role={section.header ? 'group' : undefined}\n aria-label={section.header}\n >\n {section.header && (\n <ds-text\n class={`ds-choice-section__header ds-control--${this.size}`}\n as=\"span\"\n variant={CONTROL_SUPPORTING_TEXT_VARIANT[this.size]}\n emphasis\n color=\"primary\"\n aria-hidden=\"true\"\n >\n {section.header}\n </ds-text>\n )}\n {section.options.map(option =>\n this.renderOption(option, flatIndex++, usesOptionSubtext)\n )}\n </div>\n ))\n )}\n </div>\n {this.allowClear && this.hasSelection && !this.isLoading && (\n <ChoiceFooter\n size={this.size}\n summary={`${count} ${this.selectedLabel}`}\n clearLabel={this.clearLabel}\n onClear={this.clearSelection}\n />\n )}\n </div>\n )}\n\n {showError && (\n <ds-text\n class=\"error-text\"\n as=\"div\"\n variant=\"text-body-small\"\n color=\"negative\"\n textId={this.errorId}\n role=\"alert\"\n >\n {this.errorMessage}\n </ds-text>\n )}\n </Host>\n );\n }\n}\n",
755
- "type": "registry:ui"
756
- }
757
- ]
758
- }